mirror of
https://github.com/SDL-Hercules-390/hyperion.git
synced 2026-07-26 02:29:51 +02:00
d79382bbfe
* chore: run codespell on source/header files Fixes most reported typos discovered by codespell (while trying to be unopinionated about American vs. British English). * chore: run codespell on build/readme files
206 lines
7.9 KiB
C
206 lines
7.9 KiB
C
/* NETSUPP.H (C) Copyright "Fish" (David B. Trout), 2017 */
|
|
/* Networking Support Functions */
|
|
/* */
|
|
/* Released under "The Q Public License Version 1" */
|
|
/* (http://www.hercules-390.org/herclic.html) as modifications to */
|
|
/* Hercules. */
|
|
|
|
#ifndef _NETSUPP_H_
|
|
#define _NETSUPP_H_
|
|
|
|
#include "hercules.h"
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* MACTAB structure */
|
|
/*-------------------------------------------------------------------*/
|
|
struct MACTAB
|
|
{
|
|
#ifndef IFHWADDRLEN
|
|
#define IFHWADDRLEN 6 /* Mac OSX is missing this */
|
|
#endif
|
|
BYTE inuse; /* In use flag: 0=free, 1=in use */
|
|
BYTE flags; /* Optional user-provided flags */
|
|
BYTE mac[ IFHWADDRLEN ]; /* HW MAC address */
|
|
};
|
|
|
|
typedef struct MACTAB MACTAB, *PMACTAB;
|
|
|
|
#define MACTABMAX 32 /* Maximum MACTAB entries */
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* MACTAB functions */
|
|
/*-------------------------------------------------------------------*/
|
|
/* */
|
|
/* MACTabAdd: add a new MAC to the table. */
|
|
/* MACTabRem: remove an old MAC from the table. */
|
|
/* IsMACTab: check if MAC is already in table. */
|
|
/* */
|
|
/* All functions return >= 0 if successful, < 0 upon failure. */
|
|
/* IsMACTab returns the table entry number if found else -ENOENT. */
|
|
/* */
|
|
/*-------------------------------------------------------------------*/
|
|
extern int MACTabAdd ( MACTAB* tab, const BYTE* mac, const BYTE flags );
|
|
extern int MACTabRem ( MACTAB* tab, const BYTE* mac );
|
|
extern int IsMACTab ( const MACTAB* tab, const BYTE* mac );
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* Ethernet header */
|
|
/*-------------------------------------------------------------------*/
|
|
struct eth_hdr
|
|
{
|
|
U8 ether_dhost[6]; // dst MAC
|
|
U8 ether_shost[6]; // src MAC
|
|
U16 ether_type; // frame type
|
|
};
|
|
|
|
typedef struct eth_hdr eth_hdr;
|
|
#define eth_hdr_size sizeof( eth_hdr )
|
|
#define ETHERTYPE_IP 0x0800 // IP ether_type
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* IP header */
|
|
/*-------------------------------------------------------------------*/
|
|
struct ip_hdr
|
|
{
|
|
#ifdef WORDS_BIGENDIAN
|
|
U8 ip_v:4, // IP version (4)
|
|
ip_hl:4; // hdr len
|
|
#else
|
|
U8 ip_hl:4, // hdr len
|
|
ip_v:4; // IP version (4)
|
|
#endif
|
|
|
|
#define IPVERSION 4
|
|
|
|
BYTE ip_tos; // Type of service
|
|
S16 ip_len; // Packet length
|
|
U16 ip_id; // Identification
|
|
S16 ip_off; // Fragment offset
|
|
BYTE ip_ttl; // Time to Live
|
|
|
|
#define MAXTTL 255
|
|
|
|
BYTE ip_p; // Protocol
|
|
U16 ip_sum; // Checksum
|
|
U32 ip_src; // src addr
|
|
U32 ip_dst; // dst addr
|
|
};
|
|
|
|
typedef struct ip_hdr ip_hdr;
|
|
#define ip_hdr_size sizeof( ip_hdr )
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* TCP header */
|
|
/*-------------------------------------------------------------------*/
|
|
struct tcp_hdr
|
|
{
|
|
U16 th_sport; // src port
|
|
U16 th_dport; // dst port
|
|
U32 th_seq; // seq num
|
|
U32 th_ack; // ack num
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
BYTE th_off:4; // payload offset
|
|
BYTE th_x2:4; // (unused)
|
|
#else
|
|
BYTE th_x2:4; // (unused)
|
|
BYTE th_off:4; // payload offset
|
|
#endif
|
|
BYTE th_flags;
|
|
|
|
#define TH_FIN 0x01
|
|
#define TH_SYN 0x02
|
|
#define TH_RST 0x04
|
|
#define TH_PUSH 0x08
|
|
#define TH_ACK 0x10
|
|
#define TH_URG 0x20
|
|
|
|
U16 th_win; // window size
|
|
U16 th_sum; // checksum
|
|
U16 th_urp; // urgent ptr
|
|
};
|
|
|
|
typedef struct tcp_hdr tcp_hdr;
|
|
#define tcp_hdr_size sizeof( tcp_hdr )
|
|
|
|
#define TCPOPT_EOL 0
|
|
#define TCPOPT_NOP 1
|
|
#define TCPOPT_MAXSEG 2
|
|
#define TCPOLEN_MAXSEG 4
|
|
#define TCPOPT_WINDOW 3
|
|
#define TCPOLEN_WINDOW 3
|
|
#define TCPOPT_SACK_PERMITTED 4 /* Experimental */
|
|
#define TCPOLEN_SACK_PERMITTED 2
|
|
#define TCPOPT_SACK 5 /* Experimental */
|
|
#define TCPOPT_TIMESTAMP 8
|
|
#define TCPOLEN_TIMESTAMP 10
|
|
#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */
|
|
|
|
#define TCPOPT_TSTAMP_HDR \
|
|
(TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP)
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* UDP header */
|
|
/*-------------------------------------------------------------------*/
|
|
struct udp_hdr
|
|
{
|
|
U16 uh_sport; // src port
|
|
U16 uh_dport; // dst port
|
|
S16 uh_ulen; // packet len
|
|
U16 uh_sum; // checksum
|
|
};
|
|
|
|
typedef struct udp_hdr udp_hdr;
|
|
#define udp_hdr_size sizeof( udp_hdr )
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* ICMP header */
|
|
/*-------------------------------------------------------------------*/
|
|
struct icmp_hdr
|
|
{
|
|
BYTE icmp_type; // ICMP Frame type
|
|
BYTE icmp_code; // ICMP Frame code
|
|
U16 icmp_sum; // ICMP checksum
|
|
};
|
|
|
|
typedef struct icmp_hdr icmp_hdr;
|
|
#define icmp_hdr_size sizeof( icmp_hdr )
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* TCP/UDP "Pseudo Header" */
|
|
/*-------------------------------------------------------------------*/
|
|
|
|
struct pseudo_hdr
|
|
{
|
|
U32 ph_ip_src; // src IP addr from IP hdr
|
|
U32 ph_ip_dst; // dst IP addr from IP hdr
|
|
U8 ph_zero; // reserved/not used;
|
|
// must be binary zero
|
|
U8 ph_ip_p; // protocol from IP hdr
|
|
U16 ph_ulen; // data len UDP: from hdr
|
|
// TCP: calculated
|
|
};
|
|
|
|
typedef struct pseudo_hdr pseudo_hdr;
|
|
#define pseudo_hdr_size sizeof( pseudo_hdr )
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* Checksum Offloading functions */
|
|
/*-------------------------------------------------------------------*/
|
|
|
|
extern void EtherIpv4CkSumOffload( BYTE* pFrame, size_t nBytes );
|
|
|
|
extern U16 CheckSum ( const BYTE* pBuffer, S32 nBytes );
|
|
extern U16 InetCheckSum ( const BYTE* pBuffer, S32 nBytes );
|
|
extern U16 PseudoHdrCheckSum ( ip_hdr* pIP );
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* Timed read from tuntap device */
|
|
/*-------------------------------------------------------------------*/
|
|
|
|
#define DEF_NET_READ_TIMEOUT_SECS (5)
|
|
|
|
extern int read_tuntap( int fd, BYTE* buffer, size_t nBuffLen, int secs );
|
|
|
|
#endif // _NETSUPP_H_
|