ip.h revision 5d8f37ad78fc66901af50c762029a501561f3b23
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 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "helper.h" 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef WORDS_BIGENDIAN 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef NTOHL 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define NTOHL(d) 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef NTOHS 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define NTOHS(d) 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef HTONL 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define HTONL(d) 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef HTONS 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define HTONS(d) 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef NTOHL 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define NTOHL(d) ((d) = ntohl((d))) 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef NTOHS 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define NTOHS(d) ((d) = ntohs((u_int16_t)(d))) 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef HTONL 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define HTONL(d) ((d) = htonl((d))) 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef HTONS 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define HTONS(d) ((d) = htons((u_int16_t)(d))) 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef u_int32_t n_long; /* long as received from the net */ 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Definitions for internet protocol version 4. 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Per RFC 791, September 1981. 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPVERSION 4 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Structure of an internet header, naked of options. 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ip { 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef WORDS_BIGENDIAN 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int ip_v:4; /* version */ 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int ip_hl:4; /* header length */ 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int ip_hl:4; /* header length */ 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int ip_v:4; /* version */ 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ip_tos; /* type of service */ 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ip_len; /* total length */ 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ip_id; /* identification */ 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ip_off; /* fragment offset field */ 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IP_DF 0x4000 /* don't fragment flag */ 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IP_MF 0x2000 /* more fragments flag */ 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ip_ttl; /* time to live */ 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ip_p; /* protocol */ 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ip_sum; /* checksum */ 955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ipaddr_t ip_src, ip_dst; /* source and dest address */ 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IP_MAXPACKET 65535 /* maximum packet size */ 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Definitions for IP type of service (ip_tos) 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPTOS_LOWDELAY 0x10 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPTOS_THROUGHPUT 0x08 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPTOS_RELIABILITY 0x04 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Definitions for options. 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_COPIED(o) ((o)&0x80) 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_CLASS(o) ((o)&0x60) 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_NUMBER(o) ((o)&0x1f) 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_CONTROL 0x00 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_RESERVED1 0x20 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_DEBMEAS 0x40 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_RESERVED2 0x60 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_EOL 0 /* end of option list */ 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_NOP 1 /* no operation */ 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_RR 7 /* record packet route */ 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_TS 68 /* timestamp */ 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_LSRR 131 /* loose source route */ 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SATID 136 /* satnet id */ 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SSRR 137 /* strict source route */ 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Offsets to fields in options other than EOL and NOP. 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_OPTVAL 0 /* option ID */ 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_OLEN 1 /* option length */ 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_OFFSET 2 /* offset within option */ 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_MINOFF 4 /* min value of above */ 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Time stamp option structure. 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ip_timestamp { 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ipt_code; /* IPOPT_TS */ 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ipt_len; /* size of structure (variable) */ 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ipt_ptr; /* index of current entry */ 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef WORDS_BIGENDIAN 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int ipt_oflw:4, /* overflow counter */ 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ipt_flg:4; /* flags, see below */ 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int ipt_flg:4, /* flags, see below */ 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ipt_oflw:4; /* overflow counter */ 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project union ipt_timestamp { 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n_long ipt_time[1]; 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct ipt_ta { 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ipaddr_t ipt_addr; 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n_long ipt_time; 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } ipt_ta[1]; 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } ipt_timestamp; 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* flag bits for ipt_flg */ 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_TS_TSONLY 0 /* timestamps only */ 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_TS_PRESPEC 3 /* specified modules only */ 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* bits for security (not byte swapped) */ 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_UNCLASS 0x0000 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_CONFID 0xf135 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_EFTO 0x789a 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_MMMM 0xbc4d 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_RESTR 0xaf13 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_SECRET 0xd788 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPOPT_SECUR_TOPSECRET 0x6bc5 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Internet implementation parameters. 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MAXTTL 255 /* maximum time to live (seconds) */ 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPDEFTTL 64 /* default ttl, from RFC 1340 */ 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPFRAGTTL 60 /* time to live for frags, slowhz */ 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IPTTLDEC 1 /* subtracted when forwarding */ 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IP_MSS 576 /* default maximum segment size */ 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if SIZEOF_CHAR_P == 4 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct mbuf_ptr { 1865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct mbuf *mptr; 1875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner uint32_t dummy; 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct mbuf_ptr { 1915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct mbuf *mptr; 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct qlink { 1955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void *next, *prev; 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Overlay for ip header used by other protocols (tcp, udp). 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ipovly { 2025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct mbuf_ptr ih_mbuf; /* backpointer to mbuf */ 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ih_x1; /* (unused) */ 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ih_pr; /* protocol */ 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ih_len; /* protocol length */ 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ipaddr_t ih_src; /* source internet address */ 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ipaddr_t ih_dst; /* destination internet address */ 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} __attribute__((packed)); 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Ip reassembly queue structure. Each fragment 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * being reassembled is attached to one of these structures. 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * They are timed out after ipq_ttl drops to 0, and may also 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * be reclaimed if memory becomes tight. 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * size 28 bytes 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ipq { 2185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct qlink frag_link; /* to ip headers of fragments */ 2195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct qlink ip_link; /* to other reass headers */ 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ipq_ttl; /* time for reass q to live */ 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int8_t ipq_p; /* protocol of this fragment */ 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int16_t ipq_id; /* sequence id for reassembly */ 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ipaddr_t ipq_src,ipq_dst; 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Ip header, when holding a fragment. 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 2295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Note: ipf_link must be at same offset as frag_link above 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ipasfrag { 2325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct qlink ipf_link; 2335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct ip ipf_ip; 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ipf_off ipf_ip.ip_off 2375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ipf_tos ipf_ip.ip_tos 2385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ipf_len ipf_ip.ip_len 2395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ipf_next ipf_link.next 2405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ipf_prev ipf_link.prev 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Structure stored in mbuf in inpcb.ip_options 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * and passed to ip_output when ip options are in use. 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The actual length of the options (including ipopt_dst) 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * is in m_len. 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MAX_IPOPTLEN 40 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ipoption { 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_int32_t ipopt_dst; /* first-hop dst if source routed */ 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int8_t ipopt_list[MAX_IPOPTLEN]; /* options proper */ 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef LOG_ENABLED 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Structure attached to inpcb.ip_moptions and 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * passed to ip_output when IP multicast options are in use. 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ipstat { 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_total; /* total packets received */ 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_badsum; /* checksum bad */ 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_tooshort; /* packet too short */ 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_toosmall; /* not enough data */ 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_badhlen; /* ip header length < data size */ 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_badlen; /* ip length < ip header length */ 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_fragments; /* fragments received */ 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_fragdropped; /* frags dropped (dups, out of space) */ 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_fragtimeout; /* fragments timed out */ 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_forward; /* packets forwarded */ 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_cantforward; /* packets rcvd for unreachable dest */ 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_redirectsent; /* packets forwarded on same net */ 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_noproto; /* unknown or unsupported protocol */ 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_delivered; /* datagrams delivered to upper level*/ 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_localout; /* total ip packets generated here */ 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_odropped; /* lost packets due to nobufs, etc. */ 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_reassembled; /* total packets reassembled ok */ 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_fragmented; /* datagrams successfully fragmented */ 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_ofragments; /* output fragments created */ 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_cantfrag; /* don't fragment flag was set, etc. */ 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_badoptions; /* error in option processing */ 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_noroute; /* packets discarded due to no route */ 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_badvers; /* ip version != 4 */ 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_rawout; /* total raw ip packets generated */ 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u_long ips_unaligned; /* times the ip packet was not aligned */ 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern struct ipstat ipstat; 2905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 2915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern struct ipq ipq; /* ip reass. queue */ 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern u_int16_t ip_id; /* ip packet ctr, for ids */ 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 296