xref: /csrg-svn/sys/deprecated/bbnnet/ip.h (revision 25202)
1*25202Skarels #define RCSIPHDR "$Header: ip.h,v 1.4 85/07/31 09:31:22 walsh Exp $"
2*25202Skarels 
3*25202Skarels 
4*25202Skarels struct ip {                     /* ip leader */
5*25202Skarels 	u_char ip_hl:4,			/* header length */
6*25202Skarels #define IP_HLSHIFT 2
7*25202Skarels 		ip_v:4;			/* version */
8*25202Skarels 	u_char ip_tos;			/* type of service */
9*25202Skarels #define ip_mff ip_tos                   /* more fragments flag (input) */
10*25202Skarels 	u_short ip_len;			/* total length */
11*25202Skarels 	u_short ip_id;			/* identification */
12*25202Skarels 	u_short ip_off;			/* fragment offset field */
13*25202Skarels #define ip_df 0x4000                    /* dont fragment flag */
14*25202Skarels #define ip_mf 0x2000                    /* more fragments flag (output) */
15*25202Skarels #define IP_OFFSHIFT 3
16*25202Skarels 	u_char ip_ttl;			/* time to live */
17*25202Skarels 	u_char ip_p;			/* protocol */
18*25202Skarels 	u_short ip_sum;			/* checksum */
19*25202Skarels #define ip_end ip_sum                   /* fragment end */
20*25202Skarels 	union {
21*25202Skarels 		struct in_addr ip_s;     /* source address */
22*25202Skarels 		struct ip *ip_nxt;      /* ->next fragment */
23*25202Skarels 	} I_sun;
24*25202Skarels #define ip_src  I_sun.ip_s
25*25202Skarels #define ip_next I_sun.ip_nxt
26*25202Skarels 	union {
27*25202Skarels 		struct in_addr ip_d;     /* destination address */
28*25202Skarels 		struct ip *ip_prv;      /* ->prev fragment */
29*25202Skarels 	} I_dun;
30*25202Skarels #define ip_dst  I_dun.ip_d
31*25202Skarels #define ip_prev I_dun.ip_prv
32*25202Skarels };
33*25202Skarels 
34*25202Skarels /* ip options */
35*25202Skarels #define IP_OPT_COPY	0x80		/* option copy type flag */
36*25202Skarels #define IP_OPT_DEBUG	0x40		/* option debug class (2) */
37*25202Skarels 
38*25202Skarels #define IP_END_OPT	0		/* end of option list */
39*25202Skarels #define IP_NOP_OPT	1		/* nop option */
40*25202Skarels #define IP_SEC_OPT	(2+IP_OPT_COPY)	/* security option */
41*25202Skarels #define 	IP_SEC_OPTLEN	11		/* length */
42*25202Skarels #define		IP_SEC_OPTHDR	((IP_SEC_OPT<<8)|IP_SEC_OPTLEN)	/* opt/len */
43*25202Skarels #define	IP_LRTE_OPT	(3+IP_OPT_COPY)	/* loose source and record route */
44*25202Skarels #define	IP_TIME_OPT	(4+IP_OPT_DEBUG)/* timestamp */
45*25202Skarels #define IP_RRTE_OPT	7		/* record route */
46*25202Skarels #define IP_STRID_OPT	(8+IP_OPT_COPY)	/* stream ID */
47*25202Skarels #define		IP_STRID_OPTLEN	4		/* length */
48*25202Skarels #define		IP_STRID_OPTHDR	((IP_STRID_OPT<<8)|IP_STRID_OPTLEN) /* opt/len */
49*25202Skarels #define IP_SRTE_OPT	(9+IP_OPT_COPY)	/* strict source and record route */
50*25202Skarels 
51*25202Skarels struct ipq {                    /* ip reass.q header */
52*25202Skarels 	struct ip iqx;                  /* dummy ip element for top of list */
53*25202Skarels 	struct ipq *iq_next;            /* -> next chain on q */
54*25202Skarels 	struct ipq *iq_prev;            /* -> prev chain on q */
55*25202Skarels 	struct ip iqh;                  /* fragment header */
56*25202Skarels 	u_short iq_size		/* maximum fragment size */
57*25202Skarels };
58*25202Skarels 
59*25202Skarels #define IPVERSION 4             /* internet protocol version number */
60*25202Skarels #define IPMAX 576		/* maximum spec ip packet length */
61*25202Skarels #define MAXTTL 10		/* maximum time to live (seconds) */
62*25202Skarels 
63*25202Skarels /*
64*25202Skarels  * ip statistics structure
65*25202Skarels  */
66*25202Skarels 
67*25202Skarels struct ip_stat {
68*25202Skarels     struct in_stat ip_in;
69*25202Skarels #define ip_total	ip_in.in_total
70*25202Skarels #define ip_badsum	ip_in.in_badsum
71*25202Skarels #define ip_tooshort	ip_in.in_tooshort
72*25202Skarels #define ip_drops	ip_in.in_drops
73*25202Skarels 	int ip_forwarded;	/* #ip packets not addressed to us */
74*25202Skarels 	int ip_broadcast;	/* #broadcast packets received */
75*25202Skarels };
76*25202Skarels 
77*25202Skarels 
78*25202Skarels #ifdef KERNEL
79*25202Skarels 
80*25202Skarels extern struct ip_stat ipstat;
81*25202Skarels extern struct in_stat otherstat;
82*25202Skarels 
83*25202Skarels /*
84*25202Skarels  * Enqueue a fragment on the reassembly chain.
85*25202Skarels  * Can't use insque/remque since prev/next not at head of structure.
86*25202Skarels  */
87*25202Skarels #define ip_enq(p, prev)							\
88*25202Skarels {	register struct ip *PREV = prev;				\
89*25202Skarels 									\
90*25202Skarels 	p->ip_prev = PREV;						\
91*25202Skarels 	p->ip_next = PREV->ip_next;					\
92*25202Skarels 	PREV->ip_next->ip_prev = p;					\
93*25202Skarels 	PREV->ip_next = p;						\
94*25202Skarels }
95*25202Skarels 
96*25202Skarels /* Dequeue a fragment from reassembly chain.  */
97*25202Skarels #define ip_deq(p)							\
98*25202Skarels {									\
99*25202Skarels 	p->ip_prev->ip_next = p->ip_next;				\
100*25202Skarels 	p->ip_next->ip_prev = p->ip_prev;				\
101*25202Skarels }
102*25202Skarels #endif
103