1 /* ip.h 1.5 81/10/29 */ 2 3 /* 4 * Definitions for internet protocol version 4. 5 * Per RFC 791, September 1981. 6 */ 7 #define IPVERSION 4 8 9 /* 10 * Structure of an internet header, naked of options. 11 * 12 * SHOULD MAKE A VERSION OF THIS FOR KERNEL SO USER 13 * VERSION CAN BE union FREE AND INITIALIZABLE. 14 */ 15 struct ip { 16 u_char ip_hl:4, /* header length */ 17 ip_v:4; /* version */ 18 u_char ip_tos; /* type of service */ 19 /* we copy the IP_MF to ip_tos on input */ 20 #define ip_mff ip_tos /* more fragments flag */ 21 /* by rights, ip_len should be a u_short, but this makes operations */ 22 /* on it very dangerous as comparisons become unsigned and comparing */ 23 /* against negative numbers then fails... we don't expect any > 32767 */ 24 /* byte packets, so pragmatically delcare it to be a short */ 25 short ip_len; /* total length */ 26 u_short ip_id; /* identification */ 27 /* ip_off should also, by rights, be u_short, ala ip_len */ 28 short ip_off; /* fragment offset field */ 29 #define IP_DF 0x4000 /* dont fragment flag */ 30 #define IP_MF 0x2000 /* more fragments flag */ 31 u_char ip_ttl; /* time to live */ 32 u_char ip_p; /* protocol */ 33 u_short ip_sum; /* checksum */ 34 union { 35 struct socket ip_s; /* source address */ 36 struct ip *ip_nxt; /* next fragment */ 37 } I_sun; 38 #define ip_src I_sun.ip_s 39 #define ip_next I_sun.ip_nxt 40 union { 41 struct socket ip_d; /* destination address */ 42 struct ip *ip_prv; /* prev fragment */ 43 } I_dun; 44 #define ip_dst I_dun.ip_d 45 #define ip_prev I_dun.ip_prv 46 }; 47 48 /* 49 * Definitions for options. 50 */ 51 #define IPOPT_COPIED(o) ((o)&0x80) 52 #define IPOPT_CLASS(o) ((o)&0x40) 53 #define IPOPT_NUMBER(o) ((o)&0x3f) 54 55 #define IPOPT_CONTROL 0x00 56 #define IPOPT_RESERVED1 0x10 57 #define IPOPT_DEBMEAS 0x20 58 #define IPOPT_RESERVED2 0x30 59 60 #define IPOPT_EOL 0 /* end of option list */ 61 #define IPOPT_NOP 1 /* no operation */ 62 63 #define IPOPT_RR 7 /* record packet route */ 64 #define IPOPT_TS 68 /* timestamp */ 65 #define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ 66 #define IPOPT_LSRR 131 /* loose source route */ 67 #define IPOPT_SATID 136 /* satnet id */ 68 #define IPOPT_SSRR 137 /* strict source route */ 69 70 /* 71 * Time stamp option structure. 72 */ 73 struct ip_timestamp { 74 u_char ipt_code; /* IPOPT_TS */ 75 u_char ipt_len; /* size of structure (variable) */ 76 u_char ipt_ptr; /* index of current entry */ 77 u_char ipt_flg:4, /* flags, see below */ 78 ipt_oflw:4; /* overflow counter */ 79 union { 80 n_long ipt_time[1]; 81 struct ipt_ta { 82 struct socket ipt_addr; 83 n_long ipt_time; 84 } ipt_ta[1]; 85 } 86 }; 87 88 /* flag bits for ipt_flg */ 89 #define IPOPT_TS_TSONLY 0 /* timestamps only */ 90 #define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ 91 #define IPOPT_TS_PRESPEC 2 /* specified modules only */ 92 93 /* bits for security (not byte swapped) */ 94 #define IPOPT_SECUR_UNCLASS 0x0000 95 #define IPOPT_SECUR_CONFID 0xf135 96 #define IPOPT_SECUR_EFTO 0x789a 97 #define IPOPT_SECUR_MMMM 0xbc4d 98 #define IPOPT_SECUR_RESTR 0xaf13 99 #define IPOPT_SECUR_SECRET 0xd788 100 #define IPOPT_SECUR_TOPSECRET 0x6bc5 101 102 /* 103 * Ip reassembly queue structure. Each fragment 104 * being reassambled is attached to one of these structures. 105 * They are timed out after ipq_ttl drops to 0, and may also 106 * be reclaimed if memory becomes tight. 107 */ 108 struct ipq { 109 struct ipq *next,*prev; /* to other reass headers */ 110 u_char ipq_ttl; /* time for reass q to live */ 111 u_char ipq_p; /* protocol of this fragment */ 112 u_short ipq_id; /* sequence id for reassembly */ 113 struct ip *ipq_next,*ipq_prev; /* to ip headers of fragments */ 114 struct socket ipq_src,ipq_dst; 115 }; 116 117 /* 118 * Internet implementation parameters. 119 */ 120 #define MAXTTL 255 /* maximum time to live (seconds) */ 121 #define IPFRAGTTL 15 /* time to live for frag chains */ 122 123 #ifdef KERNEL 124 struct ipq ipq; /* ip reass. queue */ 125 struct ipq *ip_freef(); 126 u_short ip_id; /* ip packet ctr, for ids */ 127 #endif 128