## diffname power/ipdat.h 1991/0424
## diff -e /dev/null /n/bootesdump/1991/0424/sys/src/9/power/ipdat.h
0a
typedef struct Ipconv Ipconv;
typedef struct Ipifc Ipifc;
typedef struct Fragq Fragq;
typedef struct Ipfrag Ipfrag;
typedef ulong Ipaddr;
typedef struct Arpcache Arpcache;
typedef ushort Port;
typedef struct Udphdr Udphdr;
typedef struct Etherhdr Etherhdr;
typedef struct Reseq Reseq;
typedef struct Tcp Tcp;
typedef struct Tcpctl Tcpctl;
typedef struct Tcphdr Tcphdr;
typedef struct Timer Timer;
struct Etherhdr {
#define ETHER_HDR 14
uchar d[6];
uchar s[6];
uchar type[2];
/* Now we have the ip fields */
#define ETHER_IPHDR 20
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[4]; /* Ip source */
uchar dst[4]; /* Ip destination */
};
/* Ethernet packet types */
#define ET_IP 0x0800
/* A userlevel data gram */
struct Udphdr {
#define UDP_EHSIZE 22
uchar d[6]; /* Ethernet destination */
uchar s[6]; /* Ethernet source */
uchar type[2]; /* Ethernet packet type */
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 */
/* Udp pseudo ip really starts here */
#define UDP_PHDRSIZE 12
#define UDP_HDRSIZE 20
uchar Unused;
uchar udpproto; /* Protocol */
uchar udpplen[2]; /* Header plus data length */
uchar udpsrc[4]; /* Ip source */
uchar udpdst[4]; /* Ip destination */
uchar udpsport[2]; /* Source port */
uchar udpdport[2]; /* Destination port */
uchar udplen[2]; /* data length */
uchar udpcksum[2]; /* Checksum */
};
#define TCP_PKT (TCP_EHSIZE+TCP_IPLEN+TCP_PHDRSIZE)
struct Tcphdr {
#define TCP_EHSIZE 14
uchar d[6]; /* Ethernet destination */
uchar s[6]; /* Ethernet source */
uchar type[2]; /* Ethernet packet type */
#define TCP_IPLEN 8
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 */
#define TCP_PHDRSIZE 12
uchar Unused;
uchar proto;
uchar tcplen[2];
uchar tcpsrc[4];
uchar tcpdst[4];
#define TCP_HDRSIZE 20
uchar tcpsport[2];
uchar tcpdport[2];
uchar tcpseq[4];
uchar tcpack[4];
uchar tcpflag[2];
uchar tcpwin[2];
uchar tcpcksum[2];
uchar tcpurg[2];
/* Options segment */
uchar tcpopt[2];
uchar tcpmss[2];
};
struct Timer {
Timer *next;
Timer *prev;
int state;
int start;
int count;
void (*func)(void*);
void *arg;
};
struct Tcpctl {
QLock;
uchar state; /* Connection state */
uchar type; /* Listening or active connection */
uchar code; /* Icmp code */
struct {
int una; /* Unacked data pointer */
int nxt; /* Next sequence expected */
int ptr; /* Data pointer */
ushort wnd; /* Tcp send window */
int up; /* Urgent data pointer */
int wl1;
int wl2;
} snd;
int iss;
ushort cwind;
ushort ssthresh;
int resent;
struct {
int nxt;
ushort wnd;
int up;
} rcv;
int irs;
ushort mss;
int rerecv;
ushort window;
int max_snd;
int last_ack;
char backoff;
char flags;
char tos;
Block *rcvq;
ushort rcvcnt;
Block *rcvoobq;
ushort rcvoobcnt;
Block *sndq; /* List of data going out */
ushort sndcnt; /* Amount of data in send queue */
Block *sndoobq; /* List of blocks going oob */
ushort sndoobcnt; /* Size of out of band queue */
ushort oobmark; /* Out of band sequence mark */
char oobflags; /* Out of band data flags */
Reseq *reseq; /* Resequencing queue */
Timer timer;
Timer acktimer; /* Acknoledge timer */
Timer rtt_timer; /* Round trip timer */
int rttseq; /* Round trip sequence */
int srtt; /* Shortened round trip */
int mdev; /* Mean deviation of round trip */
};
struct Tcp {
Port source;
Port dest;
int seq;
int ack;
char flags;
ushort wnd;
ushort up;
ushort mss;
};
struct Reseq {
Reseq *next;
Tcp seg;
Block *bp;
ushort length;
char tos;
};
/* An ip interface used for UDP/TCP/ARP/ICMP */
struct Ipconv {
QLock; /* Ref count lock */
int ref;
Qinfo *stproto; /* Stream protocol for this device */
Ipaddr dst; /* Destination from connect */
Port psrc; /* Source port */
Port pdst; /* Destination port */
uchar ptype; /* Source port type */
Ipifc *ipinterface; /* Ip protocol interface */
Queue *readq; /* Pointer to upstream read q */
QLock listenq; /* List of people waiting incoming cons */
Rendez listenr; /* Some where to sleep while waiting */
Ipconv *listen;
char err; /* Async protocol error */
int backlog; /* Maximum number of waiting connections */
int curlog; /* Number of waiting connections */
int contype;
Tcpctl tcpctl; /* Tcp control block */
};
#define MAX_TIME 100000000 /* Forever */
#define TCP_ACK 200 /* Timed ack sequence every 200ms */
#define URG 0x20
#define ACK 0x10
#define PSH 0x08
#define RST 0x04
#define SYN 0x02
#define FIN 0x01
#define EOL_KIND 0
#define NOOP_KIND 1
#define MSS_KIND 2
#define MSS_LENGTH 4
#define MSL2 10
#define MSPTICK 200
#define DEF_MSS 1024
#define DEF_RTT 1000
#define TCPOOB_HADDATA 1
#define TCPOOB_HAVEDATA 2
#define TCP_PASSIVE 0
#define TCP_ACTIVE 1
#define MAXBACKOFF 5
#define FORCE 1
#define CLONE 2
#define RETRAN 4
#define ACTIVE 8
#define SYNACK 16
#define AGAIN 8
#define DGAIN 4
#define TIMER_STOP 0
#define TIMER_RUN 1
#define TIMER_EXPIRE 2
#define set_timer(t,x) (((t)->start) = (x)/MSPTICK)
#define dur_timer(t) ((t)->start)
#define read_timer(t) ((t)->count)
#define run_timer(t) ((t)->state == TIMER_RUN)
enum {
CLOSED = 0,
LISTEN,
SYN_SENT,
SYN_RECEIVED,
ESTABLISHED,
FINWAIT1,
FINWAIT2,
CLOSE_WAIT,
CLOSING,
LAST_ACK,
TIME_WAIT
};
/*
* Ip interface structure. We have one for each active protocol driver
*/
struct Ipifc {
QLock;
int ref;
uchar protocol; /* Ip header protocol number */
char name[NAMELEN]; /* Protocol name */
void (*iprcv) (Ipconv *, Block *); /* Receive demultiplexor */
Ipconv *connections; /* Connection list */
int maxmtu; /* Maximum transfer unit */
int minmtu; /* Minumum tranfer unit */
int hsize; /* Media header size */
Lock;
};
struct Fragq {
QLock;
Block *blist;
Fragq *next;
Ipaddr src;
Ipaddr dst;
ushort id;
};
struct Ipfrag {
ushort foff;
ushort flen;
};
struct Arpcache {
uchar status; /* Entry status */
uchar type; /* Entry type */
Ipaddr ip; /* Host byte order */
uchar eip[4]; /* Network byte order */
uchar et[6]; /* Ethernet address for this ip */
int age; /* Entry timeout */
Arpcache *hash;
Arpcache **hashhd;
Arpcache *frwd;
Arpcache *prev;
};
#define ARP_FREE 0
#define ARP_OK 1
#define ARP_ASKED 2
#define ARP_TEMP 0
#define ARP_PERM 1
#define Arphashsize 32
#define ARPHASH(p) arphash[((p[2]^p[3])%Arphashsize)]
#define ARP_WAITMS 2500 /* Wait for arp replys */
#define IP_VER 0x40 /* Using IP version 4 */
#define IP_HLEN 0x05 /* Header length in characters */
#define IP_DF 0x4000 /* Don't fragment */
#define IP_MF 0x2000 /* More fragments */
#define ICMP_ECHOREPLY 0 /* Echo Reply */
#define ICMP_UNREACH 3 /* Destination Unreachable */
#define ICMP_SOURCEQUENCH 4 /* Source Quench */
#define ICMP_REDIRECT 5 /* Redirect */
#define ICMP_ECHO 8 /* Echo Request */
#define ICMP_TIMXCEED 11 /* Time-to-live Exceeded */
#define ICMP_PARAMPROB 12 /* Parameter Problem */
#define ICMP_TSTAMP 13 /* Timestamp */
#define ICMP_TSTAMPREPLY 14 /* Timestamp Reply */
#define ICMP_IREQ 15 /* Information Request */
#define ICMP_IREQREPLY 16 /* Information Reply */
/* Sizes */
#define IP_MAX 8192 /* Maximum Internet packet size */
#define UDP_MAX (IP_MAX-ETHER_IPHDR) /* Maximum UDP datagram size */
#define UDP_DATMAX (UDP_MAX-UDP_HDRSIZE) /* Maximum amount of udp data */
/* Protocol numbers */
#define IP_UDPPROTO 17
#define IP_TCPPROTO 6
/* Protocol port numbers */
#define PORTALLOC 5000 /* First automatic allocated port */
#define PRIVPORTALLOC 600 /* First priveleged port allocated */
#define PORTMAX 30000 /* Last port to allocte */
/* Stuff to go in funs.h someday */
Ipifc *newipifc(uchar, void (*)(Ipconv *, Block*), Ipconv *, int, int, int, char*);
void closeipifc(Ipifc*);
ushort ip_csum(uchar*);
int arp_lookup(uchar*, uchar*);
Ipaddr ipparse(char*);
void hnputs(uchar*, ushort);
void hnputl(uchar*, ulong);
ulong nhgetl(uchar*);
ushort nhgets(uchar*);
ushort ptcl_csum(Block*bp, int, int);
void ppkt(Block*);
void udprcvmsg(Ipconv *, Block*);
Block *btrim(Block*, int, int);
Block *ip_reassemble(int, Block*, Etherhdr*);
Ipconv *portused(Ipconv *, Port);
Port nextport(Ipconv *, Port);
void arp_enter(Arpentry*, int);
void arp_flush(void);
int arp_delete(char*);
void arplinkhead(Arpcache*);
Fragq *ipfragallo(void);
void ipfragfree(Fragq*);
void iproute(uchar*, uchar*);
void initfrag(int);
Block *copyb(Block*, int);
int ntohtcp(Tcp*, Block**);
void reset(Ipaddr, Ipaddr, char, ushort, Tcp*);
void proc_syn(Ipconv*, char, Tcp*);
void send_syn(Tcpctl*);
void tcp_output(Ipconv*);
int seq_within(int, int, int);
void update(Ipconv *, Tcp *);
int trim(Tcpctl *, Tcp *, Block **, ushort *);
void add_reseq(Tcpctl *, char, Tcp *, Block *, ushort);
void close_self(Ipconv *, int);
int seq_gt(int, int);
void appendb(Block **, Block *);
Ipconv *ip_conn(Ipconv *, Port, Port, Ipaddr dest, char proto);
void ipmkdir(Qinfo *, Dirtab *, Ipconv *);
int inb_window(Tcpctl *, int);
Block *htontcp(Tcp *, Block *, Tcphdr *);
void start_timer(Timer *);
void stop_timer(Timer *);
int copyupb(Block **, uchar *, int);
void init_tcpctl(Ipconv *);
void close_self(Ipconv *, int);
int iss(void);
int seq_within(int, int, int);
int seq_lt(int, int);
int seq_le(int, int);
int seq_gt(int, int);
int seq_ge(int, int);
void setstate(Ipconv *, char);
void tcpackproc(void*);
Block *htontcp(Tcp *, Block *, Tcphdr *);
int ntohtcp(Tcp *, Block **);
void extract_oob(Block **, Block **, Tcp *);
void get_reseq(Tcpctl *, char *, Tcp *, Block **, ushort *);
void state_upcall(Ipconv*, char oldstate, char newstate);
int backoff(int);
int dupb(Block **, Block *, int, int);
void tcp_input(Ipconv *, Block *);
void tcprcvwin(Ipconv *);
void open_tcp(Ipconv *, int, ushort, char);
void tcpflow(void*);
void tcp_timeout(void *);
void tcp_acktimer(void *);
Ipconv *ipclonecon(Chan *);
void iplisten(Chan *, Ipconv *, Ipconv *);
#define fmtaddr(xx) (xx>>24)&0xff,(xx>>16)&0xff,(xx>>8)&0xff,xx&0xff
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define BLKIP(xp) ((Etherhdr *)((xp)->rptr))
#define BLKFRAG(xp) ((Ipfrag *)((xp)->rptr))
#define PREC(x) ((x)>>5 & 7)
#define WORKBUF 64
extern Ipaddr Myip;
extern Ipaddr Mymask;
extern Ipaddr classmask[4];
extern Ipconv *ipconv[];
extern char *tcpstate[];
extern Rendez tcpflowr;
extern Qinfo tcpinfo;
extern Qinfo ipinfo;
extern Qinfo udpinfo;
.
## diffname power/ipdat.h 1993/0806 # deleted
## diff -e /n/bootesdump/1991/0424/sys/src/9/power/ipdat.h /n/fornaxdump/1993/0806/sys/src/brazil/power/ipdat.h
1,440d
|