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