Files
gottfriedleibniz d79382bbfe Run codespell on README, build, and source files. (#824)
* 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
2026-04-10 11:01:50 -07:00

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_