typedef struct Enpkt Enpkt;typedef struct Arppkt Arppkt;typedef struct Ippkt Ippkt;typedef struct Ilpkt Ilpkt;typedef struct Udppkt Udppkt;typedef struct Icmppkt Icmppkt;typedef struct Ifc Ifc; enum{ Easize = 6, /* Ether address size */ Pasize = 4, /* IP protocol address size */}; enum{ Nqt= 8,}; typedefstruct Ilp{ Queue* reply; /* ethernet output */ uchar iphis[Pasize]; /* his ip address (index) */ uchar ipgate[Pasize]; /* his ip/gateway address */ Chan* chan; /* list of il channels */ int alloc; /* 1 means allocated */ int srcp; /* source port (index) */ int dstp; /* dest port (index) */ int state; /* connection state */ Lock; Msgbuf* unacked; Msgbuf* unackedtail; Msgbuf* outoforder; ulong next; /* id of next to send */ ulong recvd; /* last packet received */ ulong start; /* local start id */ ulong rstart; /* remote start id */ ulong acksent; /* Last packet acked */ Timet lastxmit; /* time of last xmit */ Timet lastrecv; /* time of last recv */ Timet timeout; /* time out counter */ Timet acktime; /* acknowledge timer */ Timet querytime; /* Query timer */ ulong delay; /* Average of the fixed rtt delay */ ulong rate; /* Average byte rate */ ulong mdev; /* Mean deviation of predicted to real rtt */ ulong maxrtt; /* largest rtt seen */ ulong rttack; /* The ack we are waiting for */ int rttlen; /* Length of rttack packet */ ulong rttstart; /* Time we issued rttack packet */ ulong unackedbytes; int rexmit; /* number of rexmits of *unacked */ ulong qt[Nqt+1]; /* state table for query messages */ int qtx; /* ... index into qt */ int window; /* maximum receive window */ Rendez syn; /* connect hang out */} Ilp; /* * Ethernet header */enum{ ETHERMINTU = 60, /* minimum transmit size */ ETHERMAXTU = 1514, /* maximum transmit size */ Arptype = 0x0806, Cectype = 0xbcbc, Iptype = 0x0800, Icmpproto = 1, Igmpproto = 2, Tcpproto = 6, Udpproto = 17, Ilproto = 40, Nqueue = 20, Nfrag = 6, /* max number of non-contig ip fragments */ Nrock = 20, /* number of partial ip assembly stations */ Nb = 211, /* number of arp hash buckets */ Ne = 10, /* number of entries in each arp hash bucket */ Ensize = 14, /* ether header size */ Ipsize = 20, /* ip header size -- doesnt include Ensize */ Arpsize = 28, /* arp header size -- doesnt include Ensize */ Ilsize = 18, /* il header size -- doesnt include Ipsize/Ensize */ Udpsize = 8, /* il header size -- doesnt include Ipsize/Ensize */ Udpphsize = 12, /* udp pseudo ip header size */ IP_VER = 0x40, /* Using IP version 4 */ IP_HLEN = Ipsize/4, /* Header length in longs */ IP_DF = 0x4000, /* Don't fragment */ IP_MF = 0x2000, /* More fragments */ Arprequest = 1, Arpreply, Ilfsport = 17008, Ilauthport = 17020, Ilfsout = 5000, SNTP = 123, SNTP_LOCAL = 6001,}; /* be very careful. the data may be longer for jumbo frames */struct Enpkt{ uchar d[Easize]; /* destination address */ uchar s[Easize]; /* source address */ uchar type[2]; /* packet type */ uchar data[ETHERMAXTU-(6+6+2)]; uchar crc[4];}; struct Arppkt{ uchar d[Easize]; /* ether header */ uchar s[Easize]; uchar type[2]; uchar hrd[2]; /* hardware type, must be ether==1 */ uchar pro[2]; /* protocol, must be ip */ uchar hln; /* hardware address len, must be Easize */ uchar pln; /* protocol address len, must be Pasize */ uchar op[2]; uchar sha[Easize]; uchar spa[Pasize]; uchar tha[Easize]; uchar tpa[Pasize];}; struct Ippkt{ uchar d[Easize]; /* ether header */ uchar s[Easize]; uchar type[2]; uchar vihl; /* Version and header length */ uchar tos; /* Type of service */ uchar length[2]; /* packet length */ uchar id[2]; /* Identification */ uchar frag[2]; /* Fragment information */ uchar ttl; /* Time to live */ uchar proto; /* Protocol */ uchar cksum[2]; /* Header checksum */ uchar src[Pasize]; /* Ip source */ uchar dst[Pasize]; /* Ip destination */}; struct Ilpkt{ uchar d[Easize]; /* ether header */ uchar s[Easize]; uchar type[2]; uchar vihl; /* ip header */ uchar tos; uchar length[2]; uchar id[2]; uchar frag[2]; uchar ttl; uchar proto; uchar cksum[2]; uchar src[Pasize]; uchar dst[Pasize]; uchar ilsum[2]; /* Checksum including header */ uchar illen[2]; /* Packet length */ uchar iltype; /* Packet type */ uchar ilspec; /* Special */ uchar ilsrc[2]; /* Src port */ uchar ildst[2]; /* Dst port */ uchar ilid[4]; /* Sequence id */ uchar ilack[4]; /* Acked sequence */}; struct Udppkt{ uchar d[Easize]; /* ether header */ uchar s[Easize]; uchar type[2]; uchar vihl; /* ip header */ uchar tos; uchar length[2]; uchar id[2]; uchar frag[2]; uchar ttl; uchar proto; uchar cksum[2]; uchar src[Pasize]; uchar dst[Pasize]; uchar udpsrc[2]; /* Src port */ uchar udpdst[2]; /* Dst port */ uchar udplen[2]; /* Packet length */ uchar udpsum[2]; /* Checksum including header */}; struct Icmppkt{ uchar d[Easize]; /* ether header */ uchar s[Easize]; uchar type[2]; uchar vihl; /* ip header */ uchar tos; uchar length[2]; uchar id[2]; uchar frag[2]; uchar ttl; uchar proto; uchar cksum[2]; uchar src[Pasize]; uchar dst[Pasize]; uchar icmptype; /* Src port */ uchar icmpcode; /* Dst port */ uchar icmpsum[2]; /* Checksum including header */ uchar icmpbody[10]; /* Depends on type */}; struct Ifc{ Lock; Queue* reply; Filter work; Filter rate; ulong rcverr; ulong txerr; ulong sumerr; ulong rxpkt; ulong txpkt; uchar ea[Easize]; /* my ether address */ uchar ipa[Pasize]; /* my ip address, pulled from netdb */ uchar netgate[Pasize]; /* my ip gateway, pulled from netdb */ ulong ipaddr; ulong mask; ulong cmask; int maxmtu; uchar flag; uchar idx; /* interface # */ Ifc *next; /* List of configured interfaces */}; Ifc* enets; /* List of configured interfaces */ void riprecv(Msgbuf*, Ifc*);void sntprecv(Msgbuf *mb, Ifc *ifc); void arpreceive(Enpkt*, int, Ifc*);void cecreceive(Enpkt*, int, Ifc*);void ipreceive(Enpkt*, int, Ifc*);void ilrecv(Msgbuf*, Ifc*);void udprecv(Msgbuf*, Ifc*);void icmprecv(Msgbuf*, Ifc*);void igmprecv(Msgbuf*, Ifc*);void tcprecv(Msgbuf*, Ifc*);void iprouteinit(void);long ipclassmask(uchar*);void iproute(uchar*, uchar*, uchar*); void getipa(Ifc*, int);int ipforme(uchar*, Ifc*);int ipcsum(uchar*); int ptclcsum(uchar*, int);void ipsend(Msgbuf*);void ipsend1(Msgbuf*, Ifc*, uchar*); uchar sntpip[Pasize]; /* ip address of sntp server */ enum{ Fcec = 1<<0, Faoe = 1<<1, Faoej = 1<<2,}; enum{ Msysip = 1<<0, Mdefmask = 1<<1, Mdefgwip = 1<<2, Mflag = 1<<3,}; typedef struct{ uchar sysip[Pasize]; /* my ip - from config block */ uchar defmask[Pasize]; /* ip mask - from config block */ uchar defgwip[Pasize]; /* gateway ip - from config block */ uchar flag; uchar modfl;} Ipcfg; Ipcfg ipaddr[10];
typedef struct Enpkt Enpkt;
typedef struct Arppkt Arppkt;
typedef struct Ippkt Ippkt;
typedef struct Ilpkt Ilpkt;
typedef struct Udppkt Udppkt;
typedef struct Icmppkt Icmppkt;
typedef struct Ifc Ifc;
enum
{
Easize = 6, /* Ether address size */
Pasize = 4, /* IP protocol address size */
};
enum
{
Nqt= 8,
};
typedef
struct Ilp
{
Queue* reply; /* ethernet output */
uchar iphis[Pasize]; /* his ip address (index) */
uchar ipgate[Pasize]; /* his ip/gateway address */
Chan* chan; /* list of il channels */
int alloc; /* 1 means allocated */
int srcp; /* source port (index) */
int dstp; /* dest port (index) */
int state; /* connection state */
Lock;
Msgbuf* unacked;
Msgbuf* unackedtail;
Msgbuf* outoforder;
ulong next; /* id of next to send */
ulong recvd; /* last packet received */
ulong start; /* local start id */
ulong rstart; /* remote start id */
ulong acksent; /* Last packet acked */
Timet lastxmit; /* time of last xmit */
Timet lastrecv; /* time of last recv */
Timet timeout; /* time out counter */
Timet acktime; /* acknowledge timer */
Timet querytime; /* Query timer */
ulong delay; /* Average of the fixed rtt delay */
ulong rate; /* Average byte rate */
ulong mdev; /* Mean deviation of predicted to real rtt */
ulong maxrtt; /* largest rtt seen */
ulong rttack; /* The ack we are waiting for */
int rttlen; /* Length of rttack packet */
ulong rttstart; /* Time we issued rttack packet */
ulong unackedbytes;
int rexmit; /* number of rexmits of *unacked */
ulong qt[Nqt+1]; /* state table for query messages */
int qtx; /* ... index into qt */
int window; /* maximum receive window */
Rendez syn; /* connect hang out */
} Ilp;
/*
* Ethernet header
*/
enum
{
ETHERMINTU = 60, /* minimum transmit size */
ETHERMAXTU = 1514, /* maximum transmit size */
Arptype = 0x0806,
Cectype = 0xbcbc,
Iptype = 0x0800,
Icmpproto = 1,
Igmpproto = 2,
Tcpproto = 6,
Udpproto = 17,
Ilproto = 40,
Nqueue = 20,
Nfrag = 6, /* max number of non-contig ip fragments */
Nrock = 20, /* number of partial ip assembly stations */
Nb = 211, /* number of arp hash buckets */
Ne = 10, /* number of entries in each arp hash bucket */
Ensize = 14, /* ether header size */
Ipsize = 20, /* ip header size -- doesnt include Ensize */
Arpsize = 28, /* arp header size -- doesnt include Ensize */
Ilsize = 18, /* il header size -- doesnt include Ipsize/Ensize */
Udpsize = 8, /* il header size -- doesnt include Ipsize/Ensize */
Udpphsize = 12, /* udp pseudo ip header size */
IP_VER = 0x40, /* Using IP version 4 */
IP_HLEN = Ipsize/4, /* Header length in longs */
IP_DF = 0x4000, /* Don't fragment */
IP_MF = 0x2000, /* More fragments */
Arprequest = 1,
Arpreply,
Ilfsport = 17008,
Ilauthport = 17020,
Ilfsout = 5000,
SNTP = 123,
SNTP_LOCAL = 6001,
};
/* be very careful. the data may be longer for jumbo frames */
struct Enpkt
{
uchar d[Easize]; /* destination address */
uchar s[Easize]; /* source address */
uchar type[2]; /* packet type */
uchar data[ETHERMAXTU-(6+6+2)];
uchar crc[4];
};
struct Arppkt
{
uchar d[Easize]; /* ether header */
uchar s[Easize];
uchar type[2];
uchar hrd[2]; /* hardware type, must be ether==1 */
uchar pro[2]; /* protocol, must be ip */
uchar hln; /* hardware address len, must be Easize */
uchar pln; /* protocol address len, must be Pasize */
uchar op[2];
uchar sha[Easize];
uchar spa[Pasize];
uchar tha[Easize];
uchar tpa[Pasize];
};
struct Ippkt
{
uchar d[Easize]; /* ether header */
uchar s[Easize];
uchar type[2];
uchar vihl; /* Version and header length */
uchar tos; /* Type of service */
uchar length[2]; /* packet length */
uchar id[2]; /* Identification */
uchar frag[2]; /* Fragment information */
uchar ttl; /* Time to live */
uchar proto; /* Protocol */
uchar cksum[2]; /* Header checksum */
uchar src[Pasize]; /* Ip source */
uchar dst[Pasize]; /* Ip destination */
};
struct Ilpkt
{
uchar d[Easize]; /* ether header */
uchar s[Easize];
uchar type[2];
uchar vihl; /* ip header */
uchar tos;
uchar length[2];
uchar id[2];
uchar frag[2];
uchar ttl;
uchar proto;
uchar cksum[2];
uchar src[Pasize];
uchar dst[Pasize];
uchar ilsum[2]; /* Checksum including header */
uchar illen[2]; /* Packet length */
uchar iltype; /* Packet type */
uchar ilspec; /* Special */
uchar ilsrc[2]; /* Src port */
uchar ildst[2]; /* Dst port */
uchar ilid[4]; /* Sequence id */
uchar ilack[4]; /* Acked sequence */
};
struct Udppkt
{
uchar d[Easize]; /* ether header */
uchar s[Easize];
uchar type[2];
uchar vihl; /* ip header */
uchar tos;
uchar length[2];
uchar id[2];
uchar frag[2];
uchar ttl;
uchar proto;
uchar cksum[2];
uchar src[Pasize];
uchar dst[Pasize];
uchar udpsrc[2]; /* Src port */
uchar udpdst[2]; /* Dst port */
uchar udplen[2]; /* Packet length */
uchar udpsum[2]; /* Checksum including header */
};
struct Icmppkt
{
uchar d[Easize]; /* ether header */
uchar s[Easize];
uchar type[2];
uchar vihl; /* ip header */
uchar tos;
uchar length[2];
uchar id[2];
uchar frag[2];
uchar ttl;
uchar proto;
uchar cksum[2];
uchar src[Pasize];
uchar dst[Pasize];
uchar icmptype; /* Src port */
uchar icmpcode; /* Dst port */
uchar icmpsum[2]; /* Checksum including header */
uchar icmpbody[10]; /* Depends on type */
};
struct Ifc
{
Lock;
Queue* reply;
Filter work;
Filter rate;
ulong rcverr;
ulong txerr;
ulong sumerr;
ulong rxpkt;
ulong txpkt;
uchar ea[Easize]; /* my ether address */
uchar ipa[Pasize]; /* my ip address, pulled from netdb */
uchar netgate[Pasize]; /* my ip gateway, pulled from netdb */
ulong ipaddr;
ulong mask;
ulong cmask;
int maxmtu;
uchar flag;
uchar idx; /* interface # */
Ifc *next; /* List of configured interfaces */
};
Ifc* enets; /* List of configured interfaces */
void riprecv(Msgbuf*, Ifc*);
void sntprecv(Msgbuf *mb, Ifc *ifc);
void arpreceive(Enpkt*, int, Ifc*);
void cecreceive(Enpkt*, int, Ifc*);
void ipreceive(Enpkt*, int, Ifc*);
void ilrecv(Msgbuf*, Ifc*);
void udprecv(Msgbuf*, Ifc*);
void icmprecv(Msgbuf*, Ifc*);
void igmprecv(Msgbuf*, Ifc*);
void tcprecv(Msgbuf*, Ifc*);
void iprouteinit(void);
long ipclassmask(uchar*);
void iproute(uchar*, uchar*, uchar*);
void getipa(Ifc*, int);
int ipforme(uchar*, Ifc*);
int ipcsum(uchar*);
int ptclcsum(uchar*, int);
void ipsend(Msgbuf*);
void ipsend1(Msgbuf*, Ifc*, uchar*);
uchar sntpip[Pasize]; /* ip address of sntp server */
enum{
Fcec = 1<<0,
Faoe = 1<<1,
Faoej = 1<<2,
};
enum{
Msysip = 1<<0,
Mdefmask = 1<<1,
Mdefgwip = 1<<2,
Mflag = 1<<3,
};
typedef struct{
uchar sysip[Pasize]; /* my ip - from config block */
uchar defmask[Pasize]; /* ip mask - from config block */
uchar defgwip[Pasize]; /* gateway ip - from config block */
uchar flag;
uchar modfl;
} Ipcfg;
Ipcfg ipaddr[10];