18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 1982, 1986, 1993 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The Regents of the University of California. All rights reserved. 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Redistribution and use in source and binary forms, with or without 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * modification, are permitted provided that the following conditions 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * are met: 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * documentation and/or other materials provided with the distribution. 135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 3. Neither the name of the University nor the names of its contributors 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * may be used to endorse or promote products derived from this software 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * without specific prior written permission. 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * SUCH DAMAGE. 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @(#)ip.h 8.1 (Berkeley) 6/10/93 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * ip.h,v 1.3 1994/08/21 05:27:30 paul Exp 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _IP_H_ 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _IP_H_ 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3620894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#ifdef HOST_WORDS_BIGENDIAN 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef NTOHL 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define NTOHL(d) 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef NTOHS 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define NTOHS(d) 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef HTONL 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define HTONL(d) 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef HTONS 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define HTONS(d) 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef NTOHL 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define NTOHL(d) ((d) = ntohl((d))) 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef NTOHS 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define NTOHS(d) ((d) = ntohs((u_int16_t)(d))) 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef HTONL 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define HTONL(d) ((d) = htonl((d))) 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef HTONS 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define HTONS(d) ((d) = htons((u_int16_t)(d))) 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef u_int32_t n_long; /* long as received from the net */ 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Definitions for internet protocol version 4. 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Per RFC 791, September 1981. 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPVERSION 4 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Structure of an internet header, naked of options. 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ip { 7620894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#ifdef HOST_WORDS_BIGENDIAN 775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner u_int ip_v:4, /* version */ 785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ip_hl:4; /* header length */ 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner u_int ip_hl:4, /* header length */ 815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ip_v:4; /* version */ 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner u_int8_t ip_tos; /* type of service */ 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ip_len; /* total length */ 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ip_id; /* identification */ 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ip_off; /* fragment offset field */ 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IP_DF 0x4000 /* don't fragment flag */ 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IP_MF 0x2000 /* more fragments flag */ 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ip_ttl; /* time to live */ 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ip_p; /* protocol */ 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ip_sum; /* checksum */ 935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct in_addr ip_src,ip_dst; /* source and dest address */ 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IP_MAXPACKET 65535 /* maximum packet size */ 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Definitions for IP type of service (ip_tos) 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPTOS_LOWDELAY 0x10 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPTOS_THROUGHPUT 0x08 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPTOS_RELIABILITY 0x04 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Definitions for options. 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_COPIED(o) ((o)&0x80) 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_CLASS(o) ((o)&0x60) 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_NUMBER(o) ((o)&0x1f) 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_CONTROL 0x00 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_RESERVED1 0x20 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_DEBMEAS 0x40 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_RESERVED2 0x60 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_EOL 0 /* end of option list */ 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_NOP 1 /* no operation */ 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_RR 7 /* record packet route */ 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_TS 68 /* timestamp */ 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_LSRR 131 /* loose source route */ 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SATID 136 /* satnet id */ 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SSRR 137 /* strict source route */ 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Offsets to fields in options other than EOL and NOP. 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_OPTVAL 0 /* option ID */ 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_OLEN 1 /* option length */ 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_OFFSET 2 /* offset within option */ 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_MINOFF 4 /* min value of above */ 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Time stamp option structure. 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ip_timestamp { 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ipt_code; /* IPOPT_TS */ 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ipt_len; /* size of structure (variable) */ 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ipt_ptr; /* index of current entry */ 14220894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#ifdef HOST_WORDS_BIGENDIAN 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int ipt_oflw:4, /* overflow counter */ 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ipt_flg:4; /* flags, see below */ 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int ipt_flg:4, /* flags, see below */ 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ipt_oflw:4; /* overflow counter */ 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project union ipt_timestamp { 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n_long ipt_time[1]; 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct ipt_ta { 1525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct in_addr ipt_addr; 1535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner n_long ipt_time; 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } ipt_ta[1]; 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } ipt_timestamp; 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* flag bits for ipt_flg */ 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_TS_TSONLY 0 /* timestamps only */ 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_TS_PRESPEC 3 /* specified modules only */ 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* bits for security (not byte swapped) */ 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_UNCLASS 0x0000 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_CONFID 0xf135 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_EFTO 0x789a 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_MMMM 0xbc4d 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_RESTR 0xaf13 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_SECRET 0xd788 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_TOPSECRET 0x6bc5 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Internet implementation parameters. 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MAXTTL 255 /* maximum time to live (seconds) */ 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPDEFTTL 64 /* default ttl, from RFC 1340 */ 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPFRAGTTL 60 /* time to live for frags, slowhz */ 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPTTLDEC 1 /* subtracted when forwarding */ 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IP_MSS 576 /* default maximum segment size */ 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if SIZEOF_CHAR_P == 4 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct mbuf_ptr { 1845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct mbuf *mptr; 1855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner uint32_t dummy; 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct mbuf_ptr { 1895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct mbuf *mptr; 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct qlink { 1935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void *next, *prev; 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Overlay for ip header used by other protocols (tcp, udp). 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ipovly { 2005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct mbuf_ptr ih_mbuf; /* backpointer to mbuf */ 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ih_x1; /* (unused) */ 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ih_pr; /* protocol */ 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ih_len; /* protocol length */ 2045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct in_addr ih_src; /* source internet address */ 2055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct in_addr ih_dst; /* destination internet address */ 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} __attribute__((packed)); 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Ip reassembly queue structure. Each fragment 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * being reassembled is attached to one of these structures. 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * They are timed out after ipq_ttl drops to 0, and may also 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * be reclaimed if memory becomes tight. 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * size 28 bytes 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ipq { 2165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct qlink frag_link; /* to ip headers of fragments */ 2175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct qlink ip_link; /* to other reass headers */ 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ipq_ttl; /* time for reass q to live */ 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ipq_p; /* protocol of this fragment */ 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ipq_id; /* sequence id for reassembly */ 2215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct in_addr ipq_src,ipq_dst; 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Ip header, when holding a fragment. 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 2275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Note: ipf_link must be at same offset as frag_link above 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ipasfrag { 2305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct qlink ipf_link; 2315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct ip ipf_ip; 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ipf_off ipf_ip.ip_off 2355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ipf_tos ipf_ip.ip_tos 2365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ipf_len ipf_ip.ip_len 2375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ipf_next ipf_link.next 2385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ipf_prev ipf_link.prev 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Structure stored in mbuf in inpcb.ip_options 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * and passed to ip_output when ip options are in use. 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The actual length of the options (including ipopt_dst) 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * is in m_len. 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MAX_IPOPTLEN 40 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ipoption { 2495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct in_addr ipopt_dst; /* first-hop dst if source routed */ 2505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int8_t ipopt_list[MAX_IPOPTLEN]; /* options proper */ 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef LOG_ENABLED 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Structure attached to inpcb.ip_moptions and 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * passed to ip_output when IP multicast options are in use. 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ipstat { 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_total; /* total packets received */ 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_badsum; /* checksum bad */ 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_tooshort; /* packet too short */ 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_toosmall; /* not enough data */ 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_badhlen; /* ip header length < data size */ 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_badlen; /* ip length < ip header length */ 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_fragments; /* fragments received */ 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_fragdropped; /* frags dropped (dups, out of space) */ 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_fragtimeout; /* fragments timed out */ 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_forward; /* packets forwarded */ 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_cantforward; /* packets rcvd for unreachable dest */ 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_redirectsent; /* packets forwarded on same net */ 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_noproto; /* unknown or unsupported protocol */ 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_delivered; /* datagrams delivered to upper level*/ 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_localout; /* total ip packets generated here */ 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_odropped; /* lost packets due to nobufs, etc. */ 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_reassembled; /* total packets reassembled ok */ 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_fragmented; /* datagrams successfully fragmented */ 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_ofragments; /* output fragments created */ 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_cantfrag; /* don't fragment flag was set, etc. */ 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_badoptions; /* error in option processing */ 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_noroute; /* packets discarded due to no route */ 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_badvers; /* ip version != 4 */ 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_rawout; /* total raw ip packets generated */ 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_unaligned; /* times the ip packet was not aligned */ 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern struct ipstat ipstat; 2885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 2895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern struct ipq ipq; /* ip reass. queue */ 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern u_int16_t ip_id; /* ip packet ctr, for ids */ 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 294