|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986, 1993 ! 3: * The Regents of the University of California. All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. All advertising materials mentioning features or use of this software ! 14: * must display the following acknowledgement: ! 15: * This product includes software developed by the University of ! 16: * California, Berkeley and its contributors. ! 17: * 4. Neither the name of the University nor the names of its contributors ! 18: * may be used to endorse or promote products derived from this software ! 19: * without specific prior written permission. ! 20: * ! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 31: * SUCH DAMAGE. ! 32: * ! 33: * @(#)ip.h 8.1 (Berkeley) 6/10/93 ! 34: * ip.h,v 1.3 1994/08/21 05:27:30 paul Exp ! 35: */ ! 36: ! 37: #ifndef _IP_H_ ! 38: #define _IP_H_ ! 39: ! 40: #ifdef WORDS_BIGENDIAN ! 41: # ifndef NTOHL ! 42: # define NTOHL(d) ! 43: # endif ! 44: # ifndef NTOHS ! 45: # define NTOHS(d) ! 46: # endif ! 47: # ifndef HTONL ! 48: # define HTONL(d) ! 49: # endif ! 50: # ifndef HTONS ! 51: # define HTONS(d) ! 52: # endif ! 53: #else ! 54: # ifndef NTOHL ! 55: # define NTOHL(d) ((d) = ntohl((d))) ! 56: # endif ! 57: # ifndef NTOHS ! 58: # define NTOHS(d) ((d) = ntohs((u_int16_t)(d))) ! 59: # endif ! 60: # ifndef HTONL ! 61: # define HTONL(d) ((d) = htonl((d))) ! 62: # endif ! 63: # ifndef HTONS ! 64: # define HTONS(d) ((d) = htons((u_int16_t)(d))) ! 65: # endif ! 66: #endif ! 67: ! 68: typedef u_int32_t n_long; /* long as received from the net */ ! 69: ! 70: /* ! 71: * Definitions for internet protocol version 4. ! 72: * Per RFC 791, September 1981. ! 73: */ ! 74: #define IPVERSION 4 ! 75: ! 76: /* ! 77: * Structure of an internet header, naked of options. ! 78: * ! 79: * We declare ip_len and ip_off to be short, rather than u_short ! 80: * pragmatically since otherwise unsigned comparisons can result ! 81: * against negative integers quite easily, and fail in subtle ways. ! 82: */ ! 83: struct ip { ! 84: #ifdef WORDS_BIGENDIAN ! 85: u_int ip_v:4, /* version */ ! 86: ip_hl:4; /* header length */ ! 87: #else ! 88: u_int ip_hl:4, /* header length */ ! 89: ip_v:4; /* version */ ! 90: #endif ! 91: u_int8_t ip_tos; /* type of service */ ! 92: int16_t ip_len; /* total length */ ! 93: u_int16_t ip_id; /* identification */ ! 94: int16_t ip_off; /* fragment offset field */ ! 95: #define IP_DF 0x4000 /* don't fragment flag */ ! 96: #define IP_MF 0x2000 /* more fragments flag */ ! 97: #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ ! 98: u_int8_t ip_ttl; /* time to live */ ! 99: u_int8_t ip_p; /* protocol */ ! 100: u_int16_t ip_sum; /* checksum */ ! 101: struct in_addr ip_src,ip_dst; /* source and dest address */ ! 102: }; ! 103: ! 104: #define IP_MAXPACKET 65535 /* maximum packet size */ ! 105: ! 106: /* ! 107: * Definitions for IP type of service (ip_tos) ! 108: */ ! 109: #define IPTOS_LOWDELAY 0x10 ! 110: #define IPTOS_THROUGHPUT 0x08 ! 111: #define IPTOS_RELIABILITY 0x04 ! 112: ! 113: /* ! 114: * Definitions for options. ! 115: */ ! 116: #define IPOPT_COPIED(o) ((o)&0x80) ! 117: #define IPOPT_CLASS(o) ((o)&0x60) ! 118: #define IPOPT_NUMBER(o) ((o)&0x1f) ! 119: ! 120: #define IPOPT_CONTROL 0x00 ! 121: #define IPOPT_RESERVED1 0x20 ! 122: #define IPOPT_DEBMEAS 0x40 ! 123: #define IPOPT_RESERVED2 0x60 ! 124: ! 125: #define IPOPT_EOL 0 /* end of option list */ ! 126: #define IPOPT_NOP 1 /* no operation */ ! 127: ! 128: #define IPOPT_RR 7 /* record packet route */ ! 129: #define IPOPT_TS 68 /* timestamp */ ! 130: #define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ ! 131: #define IPOPT_LSRR 131 /* loose source route */ ! 132: #define IPOPT_SATID 136 /* satnet id */ ! 133: #define IPOPT_SSRR 137 /* strict source route */ ! 134: ! 135: /* ! 136: * Offsets to fields in options other than EOL and NOP. ! 137: */ ! 138: #define IPOPT_OPTVAL 0 /* option ID */ ! 139: #define IPOPT_OLEN 1 /* option length */ ! 140: #define IPOPT_OFFSET 2 /* offset within option */ ! 141: #define IPOPT_MINOFF 4 /* min value of above */ ! 142: ! 143: /* ! 144: * Time stamp option structure. ! 145: */ ! 146: struct ip_timestamp { ! 147: u_int8_t ipt_code; /* IPOPT_TS */ ! 148: u_int8_t ipt_len; /* size of structure (variable) */ ! 149: u_int8_t ipt_ptr; /* index of current entry */ ! 150: #ifdef WORDS_BIGENDIAN ! 151: u_int ipt_oflw:4, /* overflow counter */ ! 152: ipt_flg:4; /* flags, see below */ ! 153: #else ! 154: u_int ipt_flg:4, /* flags, see below */ ! 155: ipt_oflw:4; /* overflow counter */ ! 156: #endif ! 157: union ipt_timestamp { ! 158: n_long ipt_time[1]; ! 159: struct ipt_ta { ! 160: struct in_addr ipt_addr; ! 161: n_long ipt_time; ! 162: } ipt_ta[1]; ! 163: } ipt_timestamp; ! 164: }; ! 165: ! 166: /* flag bits for ipt_flg */ ! 167: #define IPOPT_TS_TSONLY 0 /* timestamps only */ ! 168: #define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ ! 169: #define IPOPT_TS_PRESPEC 3 /* specified modules only */ ! 170: ! 171: /* bits for security (not byte swapped) */ ! 172: #define IPOPT_SECUR_UNCLASS 0x0000 ! 173: #define IPOPT_SECUR_CONFID 0xf135 ! 174: #define IPOPT_SECUR_EFTO 0x789a ! 175: #define IPOPT_SECUR_MMMM 0xbc4d ! 176: #define IPOPT_SECUR_RESTR 0xaf13 ! 177: #define IPOPT_SECUR_SECRET 0xd788 ! 178: #define IPOPT_SECUR_TOPSECRET 0x6bc5 ! 179: ! 180: /* ! 181: * Internet implementation parameters. ! 182: */ ! 183: #define MAXTTL 255 /* maximum time to live (seconds) */ ! 184: #define IPDEFTTL 64 /* default ttl, from RFC 1340 */ ! 185: #define IPFRAGTTL 60 /* time to live for frags, slowhz */ ! 186: #define IPTTLDEC 1 /* subtracted when forwarding */ ! 187: ! 188: #define IP_MSS 576 /* default maximum segment size */ ! 189: ! 190: #ifdef HAVE_SYS_TYPES32_H /* Overcome some Solaris 2.x junk */ ! 191: #include <sys/types32.h> ! 192: #else ! 193: #if SIZEOF_CHAR_P == 4 ! 194: typedef caddr_t caddr32_t; ! 195: #else ! 196: typedef u_int32_t caddr32_t; ! 197: #endif ! 198: #endif ! 199: ! 200: #if SIZEOF_CHAR_P == 4 ! 201: typedef struct ipq *ipqp_32; ! 202: typedef struct ipasfrag *ipasfragp_32; ! 203: #else ! 204: typedef caddr32_t ipqp_32; ! 205: typedef caddr32_t ipasfragp_32; ! 206: #endif ! 207: ! 208: /* ! 209: * Overlay for ip header used by other protocols (tcp, udp). ! 210: */ ! 211: struct ipovly { ! 212: caddr32_t ih_next, ih_prev; /* for protocol sequence q's */ ! 213: u_int8_t ih_x1; /* (unused) */ ! 214: u_int8_t ih_pr; /* protocol */ ! 215: int16_t ih_len; /* protocol length */ ! 216: struct in_addr ih_src; /* source internet address */ ! 217: struct in_addr ih_dst; /* destination internet address */ ! 218: }; ! 219: ! 220: /* ! 221: * Ip reassembly queue structure. Each fragment ! 222: * being reassembled is attached to one of these structures. ! 223: * They are timed out after ipq_ttl drops to 0, and may also ! 224: * be reclaimed if memory becomes tight. ! 225: * size 28 bytes ! 226: */ ! 227: struct ipq { ! 228: ipqp_32 next,prev; /* to other reass headers */ ! 229: u_int8_t ipq_ttl; /* time for reass q to live */ ! 230: u_int8_t ipq_p; /* protocol of this fragment */ ! 231: u_int16_t ipq_id; /* sequence id for reassembly */ ! 232: ipasfragp_32 ipq_next,ipq_prev; ! 233: /* to ip headers of fragments */ ! 234: struct in_addr ipq_src,ipq_dst; ! 235: }; ! 236: ! 237: /* ! 238: * Ip header, when holding a fragment. ! 239: * ! 240: * Note: ipf_next must be at same offset as ipq_next above ! 241: */ ! 242: struct ipasfrag { ! 243: #ifdef WORDS_BIGENDIAN ! 244: u_int ip_v:4, ! 245: ip_hl:4; ! 246: #else ! 247: u_int ip_hl:4, ! 248: ip_v:4; ! 249: #endif ! 250: /* BUG : u_int changed to u_int8_t. ! 251: * sizeof(u_int)==4 on linux 2.0 ! 252: */ ! 253: u_int8_t ipf_mff; /* XXX overlays ip_tos: use low bit ! 254: * to avoid destroying tos (PPPDTRuu); ! 255: * copied from (ip_off&IP_MF) */ ! 256: int16_t ip_len; ! 257: u_int16_t ip_id; ! 258: int16_t ip_off; ! 259: u_int8_t ip_ttl; ! 260: u_int8_t ip_p; ! 261: u_int16_t ip_sum; ! 262: ipasfragp_32 ipf_next; /* next fragment */ ! 263: ipasfragp_32 ipf_prev; /* previous fragment */ ! 264: }; ! 265: ! 266: /* ! 267: * Structure stored in mbuf in inpcb.ip_options ! 268: * and passed to ip_output when ip options are in use. ! 269: * The actual length of the options (including ipopt_dst) ! 270: * is in m_len. ! 271: */ ! 272: #define MAX_IPOPTLEN 40 ! 273: ! 274: struct ipoption { ! 275: struct in_addr ipopt_dst; /* first-hop dst if source routed */ ! 276: int8_t ipopt_list[MAX_IPOPTLEN]; /* options proper */ ! 277: }; ! 278: ! 279: /* ! 280: * Structure attached to inpcb.ip_moptions and ! 281: * passed to ip_output when IP multicast options are in use. ! 282: */ ! 283: ! 284: struct ipstat { ! 285: u_long ips_total; /* total packets received */ ! 286: u_long ips_badsum; /* checksum bad */ ! 287: u_long ips_tooshort; /* packet too short */ ! 288: u_long ips_toosmall; /* not enough data */ ! 289: u_long ips_badhlen; /* ip header length < data size */ ! 290: u_long ips_badlen; /* ip length < ip header length */ ! 291: u_long ips_fragments; /* fragments received */ ! 292: u_long ips_fragdropped; /* frags dropped (dups, out of space) */ ! 293: u_long ips_fragtimeout; /* fragments timed out */ ! 294: u_long ips_forward; /* packets forwarded */ ! 295: u_long ips_cantforward; /* packets rcvd for unreachable dest */ ! 296: u_long ips_redirectsent; /* packets forwarded on same net */ ! 297: u_long ips_noproto; /* unknown or unsupported protocol */ ! 298: u_long ips_delivered; /* datagrams delivered to upper level*/ ! 299: u_long ips_localout; /* total ip packets generated here */ ! 300: u_long ips_odropped; /* lost packets due to nobufs, etc. */ ! 301: u_long ips_reassembled; /* total packets reassembled ok */ ! 302: u_long ips_fragmented; /* datagrams successfully fragmented */ ! 303: u_long ips_ofragments; /* output fragments created */ ! 304: u_long ips_cantfrag; /* don't fragment flag was set, etc. */ ! 305: u_long ips_badoptions; /* error in option processing */ ! 306: u_long ips_noroute; /* packets discarded due to no route */ ! 307: u_long ips_badvers; /* ip version != 4 */ ! 308: u_long ips_rawout; /* total raw ip packets generated */ ! 309: u_long ips_unaligned; /* times the ip packet was not aligned */ ! 310: }; ! 311: ! 312: extern struct ipstat ipstat; ! 313: extern struct ipq ipq; /* ip reass. queue */ ! 314: extern u_int16_t ip_id; /* ip packet ctr, for ids */ ! 315: extern int ip_defttl; /* default IP ttl */ ! 316: ! 317: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.