Annotation of embedaddon/pimd/include/freebsd/netinet/in.h, revision 1.1.1.1

1.1       misho       1: /*-
                      2:  * Copyright (c) 1982, 1986, 1990, 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:  * 4. Neither the name of the University nor the names of its contributors
                     14:  *    may be used to endorse or promote products derived from this software
                     15:  *    without specific prior written permission.
                     16:  *
                     17:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     18:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     19:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     20:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     21:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     22:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     23:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     24:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     25:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     26:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     27:  * SUCH DAMAGE.
                     28:  *
                     29:  *     @(#)in.h        8.3 (Berkeley) 1/3/94
                     30:  * $FreeBSD: src/sys/netinet/in.h,v 1.116 2010/08/19 11:31:03 anchie Exp $
                     31:  */
                     32: 
                     33: #ifndef _NETINET_IN_H_
                     34: #define        _NETINET_IN_H_
                     35: 
                     36: #include <sys/cdefs.h>
                     37: #include <sys/_types.h>
                     38: #include <machine/endian.h>
                     39: 
                     40: /* Protocols common to RFC 1700, POSIX, and X/Open. */
                     41: #define        IPPROTO_IP              0               /* dummy for IP */
                     42: #define        IPPROTO_ICMP            1               /* control message protocol */
                     43: #define        IPPROTO_TCP             6               /* tcp */
                     44: #define        IPPROTO_UDP             17              /* user datagram protocol */
                     45: 
                     46: #define        INADDR_ANY              (u_int32_t)0x00000000
                     47: #define        INADDR_BROADCAST        (u_int32_t)0xffffffff   /* must be masked */
                     48: 
                     49: #ifndef _UINT8_T_DECLARED
                     50: typedef        __uint8_t               uint8_t;
                     51: #define        _UINT8_T_DECLARED
                     52: #endif
                     53: 
                     54: #ifndef _UINT16_T_DECLARED
                     55: typedef        __uint16_t              uint16_t;
                     56: #define        _UINT16_T_DECLARED
                     57: #endif
                     58: 
                     59: #ifndef _UINT32_T_DECLARED
                     60: typedef        __uint32_t              uint32_t;
                     61: #define        _UINT32_T_DECLARED
                     62: #endif
                     63: 
                     64: #ifndef _IN_ADDR_T_DECLARED
                     65: typedef        uint32_t                in_addr_t;
                     66: #define        _IN_ADDR_T_DECLARED
                     67: #endif
                     68: 
                     69: #ifndef _IN_PORT_T_DECLARED
                     70: typedef        uint16_t                in_port_t;
                     71: #define        _IN_PORT_T_DECLARED
                     72: #endif
                     73: 
                     74: #ifndef _SA_FAMILY_T_DECLARED
                     75: typedef        __sa_family_t           sa_family_t;
                     76: #define        _SA_FAMILY_T_DECLARED
                     77: #endif
                     78: 
                     79: /* Internet address (a structure for historical reasons). */
                     80: #ifndef        _STRUCT_IN_ADDR_DECLARED
                     81: struct in_addr {
                     82:        in_addr_t s_addr;
                     83: };
                     84: #define        _STRUCT_IN_ADDR_DECLARED
                     85: #endif
                     86: 
                     87: #ifndef        _SOCKLEN_T_DECLARED
                     88: typedef        __socklen_t     socklen_t;
                     89: #define        _SOCKLEN_T_DECLARED
                     90: #endif
                     91: 
                     92: #include <sys/_sockaddr_storage.h>
                     93: 
                     94: /* Socket address, internet style. */
                     95: struct sockaddr_in {
                     96:        uint8_t sin_len;
                     97:        sa_family_t     sin_family;
                     98:        in_port_t       sin_port;
                     99:        struct  in_addr sin_addr;
                    100:        char    sin_zero[8];
                    101: };
                    102: 
                    103: #if !defined(_KERNEL) && __BSD_VISIBLE
                    104: 
                    105: #ifndef _BYTEORDER_PROTOTYPED
                    106: #define        _BYTEORDER_PROTOTYPED
                    107: __BEGIN_DECLS
                    108: uint32_t       htonl(uint32_t);
                    109: uint16_t       htons(uint16_t);
                    110: uint32_t       ntohl(uint32_t);
                    111: uint16_t       ntohs(uint16_t);
                    112: __END_DECLS
                    113: #endif
                    114: 
                    115: #ifndef _BYTEORDER_FUNC_DEFINED
                    116: #define        _BYTEORDER_FUNC_DEFINED
                    117: #define        htonl(x)        __htonl(x)
                    118: #define        htons(x)        __htons(x)
                    119: #define        ntohl(x)        __ntohl(x)
                    120: #define        ntohs(x)        __ntohs(x)
                    121: #endif
                    122: 
                    123: #endif /* !_KERNEL && __BSD_VISIBLE */
                    124: 
                    125: #if __POSIX_VISIBLE >= 200112
                    126: #define        IPPROTO_RAW             255             /* raw IP packet */
                    127: #define        INET_ADDRSTRLEN         16
                    128: #endif
                    129: 
                    130: #if __BSD_VISIBLE
                    131: /*
                    132:  * Constants and structures defined by the internet system,
                    133:  * Per RFC 790, September 1981, and numerous additions.
                    134:  */
                    135: 
                    136: /*
                    137:  * Protocols (RFC 1700)
                    138:  */
                    139: #define        IPPROTO_HOPOPTS         0               /* IP6 hop-by-hop options */
                    140: #define        IPPROTO_IGMP            2               /* group mgmt protocol */
                    141: #define        IPPROTO_GGP             3               /* gateway^2 (deprecated) */
                    142: #define        IPPROTO_IPV4            4               /* IPv4 encapsulation */
                    143: #define        IPPROTO_IPIP            IPPROTO_IPV4    /* for compatibility */
                    144: #define        IPPROTO_ST              7               /* Stream protocol II */
                    145: #define        IPPROTO_EGP             8               /* exterior gateway protocol */
                    146: #define        IPPROTO_PIGP            9               /* private interior gateway */
                    147: #define        IPPROTO_RCCMON          10              /* BBN RCC Monitoring */
                    148: #define        IPPROTO_NVPII           11              /* network voice protocol*/
                    149: #define        IPPROTO_PUP             12              /* pup */
                    150: #define        IPPROTO_ARGUS           13              /* Argus */
                    151: #define        IPPROTO_EMCON           14              /* EMCON */
                    152: #define        IPPROTO_XNET            15              /* Cross Net Debugger */
                    153: #define        IPPROTO_CHAOS           16              /* Chaos*/
                    154: #define        IPPROTO_MUX             18              /* Multiplexing */
                    155: #define        IPPROTO_MEAS            19              /* DCN Measurement Subsystems */
                    156: #define        IPPROTO_HMP             20              /* Host Monitoring */
                    157: #define        IPPROTO_PRM             21              /* Packet Radio Measurement */
                    158: #define        IPPROTO_IDP             22              /* xns idp */
                    159: #define        IPPROTO_TRUNK1          23              /* Trunk-1 */
                    160: #define        IPPROTO_TRUNK2          24              /* Trunk-2 */
                    161: #define        IPPROTO_LEAF1           25              /* Leaf-1 */
                    162: #define        IPPROTO_LEAF2           26              /* Leaf-2 */
                    163: #define        IPPROTO_RDP             27              /* Reliable Data */
                    164: #define        IPPROTO_IRTP            28              /* Reliable Transaction */
                    165: #define        IPPROTO_TP              29              /* tp-4 w/ class negotiation */
                    166: #define        IPPROTO_BLT             30              /* Bulk Data Transfer */
                    167: #define        IPPROTO_NSP             31              /* Network Services */
                    168: #define        IPPROTO_INP             32              /* Merit Internodal */
                    169: #define        IPPROTO_SEP             33              /* Sequential Exchange */
                    170: #define        IPPROTO_3PC             34              /* Third Party Connect */
                    171: #define        IPPROTO_IDPR            35              /* InterDomain Policy Routing */
                    172: #define        IPPROTO_XTP             36              /* XTP */
                    173: #define        IPPROTO_DDP             37              /* Datagram Delivery */
                    174: #define        IPPROTO_CMTP            38              /* Control Message Transport */
                    175: #define        IPPROTO_TPXX            39              /* TP++ Transport */
                    176: #define        IPPROTO_IL              40              /* IL transport protocol */
                    177: #define        IPPROTO_IPV6            41              /* IP6 header */
                    178: #define        IPPROTO_SDRP            42              /* Source Demand Routing */
                    179: #define        IPPROTO_ROUTING         43              /* IP6 routing header */
                    180: #define        IPPROTO_FRAGMENT        44              /* IP6 fragmentation header */
                    181: #define        IPPROTO_IDRP            45              /* InterDomain Routing*/
                    182: #define        IPPROTO_RSVP            46              /* resource reservation */
                    183: #define        IPPROTO_GRE             47              /* General Routing Encap. */
                    184: #define        IPPROTO_MHRP            48              /* Mobile Host Routing */
                    185: #define        IPPROTO_BHA             49              /* BHA */
                    186: #define        IPPROTO_ESP             50              /* IP6 Encap Sec. Payload */
                    187: #define        IPPROTO_AH              51              /* IP6 Auth Header */
                    188: #define        IPPROTO_INLSP           52              /* Integ. Net Layer Security */
                    189: #define        IPPROTO_SWIPE           53              /* IP with encryption */
                    190: #define        IPPROTO_NHRP            54              /* Next Hop Resolution */
                    191: #define        IPPROTO_MOBILE          55              /* IP Mobility */
                    192: #define        IPPROTO_TLSP            56              /* Transport Layer Security */
                    193: #define        IPPROTO_SKIP            57              /* SKIP */
                    194: #define        IPPROTO_ICMPV6          58              /* ICMP6 */
                    195: #define        IPPROTO_NONE            59              /* IP6 no next header */
                    196: #define        IPPROTO_DSTOPTS         60              /* IP6 destination option */
                    197: #define        IPPROTO_AHIP            61              /* any host internal protocol */
                    198: #define        IPPROTO_CFTP            62              /* CFTP */
                    199: #define        IPPROTO_HELLO           63              /* "hello" routing protocol */
                    200: #define        IPPROTO_SATEXPAK        64              /* SATNET/Backroom EXPAK */
                    201: #define        IPPROTO_KRYPTOLAN       65              /* Kryptolan */
                    202: #define        IPPROTO_RVD             66              /* Remote Virtual Disk */
                    203: #define        IPPROTO_IPPC            67              /* Pluribus Packet Core */
                    204: #define        IPPROTO_ADFS            68              /* Any distributed FS */
                    205: #define        IPPROTO_SATMON          69              /* Satnet Monitoring */
                    206: #define        IPPROTO_VISA            70              /* VISA Protocol */
                    207: #define        IPPROTO_IPCV            71              /* Packet Core Utility */
                    208: #define        IPPROTO_CPNX            72              /* Comp. Prot. Net. Executive */
                    209: #define        IPPROTO_CPHB            73              /* Comp. Prot. HeartBeat */
                    210: #define        IPPROTO_WSN             74              /* Wang Span Network */
                    211: #define        IPPROTO_PVP             75              /* Packet Video Protocol */
                    212: #define        IPPROTO_BRSATMON        76              /* BackRoom SATNET Monitoring */
                    213: #define        IPPROTO_ND              77              /* Sun net disk proto (temp.) */
                    214: #define        IPPROTO_WBMON           78              /* WIDEBAND Monitoring */
                    215: #define        IPPROTO_WBEXPAK         79              /* WIDEBAND EXPAK */
                    216: #define        IPPROTO_EON             80              /* ISO cnlp */
                    217: #define        IPPROTO_VMTP            81              /* VMTP */
                    218: #define        IPPROTO_SVMTP           82              /* Secure VMTP */
                    219: #define        IPPROTO_VINES           83              /* Banyon VINES */
                    220: #define        IPPROTO_TTP             84              /* TTP */
                    221: #define        IPPROTO_IGP             85              /* NSFNET-IGP */
                    222: #define        IPPROTO_DGP             86              /* dissimilar gateway prot. */
                    223: #define        IPPROTO_TCF             87              /* TCF */
                    224: #define        IPPROTO_IGRP            88              /* Cisco/GXS IGRP */
                    225: #define        IPPROTO_OSPFIGP         89              /* OSPFIGP */
                    226: #define        IPPROTO_SRPC            90              /* Strite RPC protocol */
                    227: #define        IPPROTO_LARP            91              /* Locus Address Resoloution */
                    228: #define        IPPROTO_MTP             92              /* Multicast Transport */
                    229: #define        IPPROTO_AX25            93              /* AX.25 Frames */
                    230: #define        IPPROTO_IPEIP           94              /* IP encapsulated in IP */
                    231: #define        IPPROTO_MICP            95              /* Mobile Int.ing control */
                    232: #define        IPPROTO_SCCSP           96              /* Semaphore Comm. security */
                    233: #define        IPPROTO_ETHERIP         97              /* Ethernet IP encapsulation */
                    234: #define        IPPROTO_ENCAP           98              /* encapsulation header */
                    235: #define        IPPROTO_APES            99              /* any private encr. scheme */
                    236: #define        IPPROTO_GMTP            100             /* GMTP*/
                    237: #define        IPPROTO_IPCOMP          108             /* payload compression (IPComp) */
                    238: #define        IPPROTO_SCTP            132             /* SCTP */
                    239: #define        IPPROTO_MH              135             /* IPv6 Mobility Header */
                    240: /* 101-254: Partly Unassigned */
                    241: #define        IPPROTO_PIM             103             /* Protocol Independent Mcast */
                    242: #define        IPPROTO_CARP            112             /* CARP */
                    243: #define        IPPROTO_PGM             113             /* PGM */
                    244: #define        IPPROTO_PFSYNC          240             /* PFSYNC */
                    245: /* 255: Reserved */
                    246: /* BSD Private, local use, namespace incursion, no longer used */
                    247: #define        IPPROTO_OLD_DIVERT      254             /* OLD divert pseudo-proto */
                    248: #define        IPPROTO_MAX             256
                    249: 
                    250: /* last return value of *_input(), meaning "all job for this pkt is done".  */
                    251: #define        IPPROTO_DONE            257
                    252: 
                    253: /* Only used internally, so can be outside the range of valid IP protocols. */
                    254: #define        IPPROTO_DIVERT          258             /* divert pseudo-protocol */
                    255: #define        IPPROTO_SEND            259             /* SeND pseudo-protocol */
                    256: 
                    257: /*
                    258:  * Defined to avoid confusion.  The master value is defined by
                    259:  * PROTO_SPACER in sys/protosw.h.
                    260:  */
                    261: #define        IPPROTO_SPACER          32767           /* spacer for loadable protos */
                    262: 
                    263: /*
                    264:  * Local port number conventions:
                    265:  *
                    266:  * When a user does a bind(2) or connect(2) with a port number of zero,
                    267:  * a non-conflicting local port address is chosen.
                    268:  * The default range is IPPORT_HIFIRSTAUTO through
                    269:  * IPPORT_HILASTAUTO, although that is settable by sysctl.
                    270:  *
                    271:  * A user may set the IPPROTO_IP option IP_PORTRANGE to change this
                    272:  * default assignment range.
                    273:  *
                    274:  * The value IP_PORTRANGE_DEFAULT causes the default behavior.
                    275:  *
                    276:  * The value IP_PORTRANGE_HIGH changes the range of candidate port numbers
                    277:  * into the "high" range.  These are reserved for client outbound connections
                    278:  * which do not want to be filtered by any firewalls.
                    279:  *
                    280:  * The value IP_PORTRANGE_LOW changes the range to the "low" are
                    281:  * that is (by convention) restricted to privileged processes.  This
                    282:  * convention is based on "vouchsafe" principles only.  It is only secure
                    283:  * if you trust the remote host to restrict these ports.
                    284:  *
                    285:  * The default range of ports and the high range can be changed by
                    286:  * sysctl(3).  (net.inet.ip.port{hi,low}{first,last}_auto)
                    287:  *
                    288:  * Changing those values has bad security implications if you are
                    289:  * using a stateless firewall that is allowing packets outside of that
                    290:  * range in order to allow transparent outgoing connections.
                    291:  *
                    292:  * Such a firewall configuration will generally depend on the use of these
                    293:  * default values.  If you change them, you may find your Security
                    294:  * Administrator looking for you with a heavy object.
                    295:  *
                    296:  * For a slightly more orthodox text view on this:
                    297:  *
                    298:  *            ftp://ftp.isi.edu/in-notes/iana/assignments/port-numbers
                    299:  *
                    300:  *    port numbers are divided into three ranges:
                    301:  *
                    302:  *                0 -  1023 Well Known Ports
                    303:  *             1024 - 49151 Registered Ports
                    304:  *            49152 - 65535 Dynamic and/or Private Ports
                    305:  *
                    306:  */
                    307: 
                    308: /*
                    309:  * Ports < IPPORT_RESERVED are reserved for
                    310:  * privileged processes (e.g. root).         (IP_PORTRANGE_LOW)
                    311:  */
                    312: #define        IPPORT_RESERVED         1024
                    313: 
                    314: /*
                    315:  * Default local port range, used by IP_PORTRANGE_DEFAULT
                    316:  */
                    317: #define IPPORT_EPHEMERALFIRST  10000
                    318: #define IPPORT_EPHEMERALLAST   65535 
                    319:  
                    320: /*
                    321:  * Dynamic port range, used by IP_PORTRANGE_HIGH.
                    322:  */
                    323: #define        IPPORT_HIFIRSTAUTO      49152
                    324: #define        IPPORT_HILASTAUTO       65535
                    325: 
                    326: /*
                    327:  * Scanning for a free reserved port return a value below IPPORT_RESERVED,
                    328:  * but higher than IPPORT_RESERVEDSTART.  Traditionally the start value was
                    329:  * 512, but that conflicts with some well-known-services that firewalls may
                    330:  * have a fit if we use.
                    331:  */
                    332: #define        IPPORT_RESERVEDSTART    600
                    333: 
                    334: #define        IPPORT_MAX              65535
                    335: 
                    336: /*
                    337:  * Definitions of bits in internet address integers.
                    338:  * On subnets, the decomposition of addresses to host and net parts
                    339:  * is done according to subnet mask, not the masks here.
                    340:  */
                    341: #define        IN_CLASSA(i)            (((u_int32_t)(i) & 0x80000000) == 0)
                    342: #define        IN_CLASSA_NET           0xff000000
                    343: #define        IN_CLASSA_NSHIFT        24
                    344: #define        IN_CLASSA_HOST          0x00ffffff
                    345: #define        IN_CLASSA_MAX           128
                    346: 
                    347: #define        IN_CLASSB(i)            (((u_int32_t)(i) & 0xc0000000) == 0x80000000)
                    348: #define        IN_CLASSB_NET           0xffff0000
                    349: #define        IN_CLASSB_NSHIFT        16
                    350: #define        IN_CLASSB_HOST          0x0000ffff
                    351: #define        IN_CLASSB_MAX           65536
                    352: 
                    353: #define        IN_CLASSC(i)            (((u_int32_t)(i) & 0xe0000000) == 0xc0000000)
                    354: #define        IN_CLASSC_NET           0xffffff00
                    355: #define        IN_CLASSC_NSHIFT        8
                    356: #define        IN_CLASSC_HOST          0x000000ff
                    357: 
                    358: #define        IN_CLASSD(i)            (((u_int32_t)(i) & 0xf0000000) == 0xe0000000)
                    359: #define        IN_CLASSD_NET           0xf0000000      /* These ones aren't really */
                    360: #define        IN_CLASSD_NSHIFT        28              /* net and host fields, but */
                    361: #define        IN_CLASSD_HOST          0x0fffffff      /* routing needn't know.    */
                    362: #define        IN_MULTICAST(i)         IN_CLASSD(i)
                    363: 
                    364: #define        IN_EXPERIMENTAL(i)      (((u_int32_t)(i) & 0xf0000000) == 0xf0000000)
                    365: #define        IN_BADCLASS(i)          (((u_int32_t)(i) & 0xf0000000) == 0xf0000000)
                    366: 
                    367: #define IN_LINKLOCAL(i)                (((u_int32_t)(i) & 0xffff0000) == 0xa9fe0000)
                    368: #define IN_LOOPBACK(i)         (((u_int32_t)(i) & 0xff000000) == 0x7f000000)
                    369: #define IN_ZERONET(i)          (((u_int32_t)(i) & 0xff000000) == 0)
                    370: 
                    371: #define        IN_PRIVATE(i)   ((((u_int32_t)(i) & 0xff000000) == 0x0a000000) || \
                    372:                         (((u_int32_t)(i) & 0xfff00000) == 0xac100000) || \
                    373:                         (((u_int32_t)(i) & 0xffff0000) == 0xc0a80000))
                    374: 
                    375: #define        IN_LOCAL_GROUP(i)       (((u_int32_t)(i) & 0xffffff00) == 0xe0000000)
                    376:  
                    377: #define        IN_ANY_LOCAL(i)         (IN_LINKLOCAL(i) || IN_LOCAL_GROUP(i))
                    378: 
                    379: #define        INADDR_LOOPBACK         (u_int32_t)0x7f000001
                    380: #ifndef _KERNEL
                    381: #define        INADDR_NONE             0xffffffff              /* -1 return */
                    382: #endif
                    383: 
                    384: #define        INADDR_UNSPEC_GROUP     (u_int32_t)0xe0000000   /* 224.0.0.0 */
                    385: #define        INADDR_ALLHOSTS_GROUP   (u_int32_t)0xe0000001   /* 224.0.0.1 */
                    386: #define        INADDR_ALLRTRS_GROUP    (u_int32_t)0xe0000002   /* 224.0.0.2 */
                    387: #define        INADDR_ALLRPTS_GROUP    (u_int32_t)0xe0000016   /* 224.0.0.22, IGMPv3 */
                    388: #define        INADDR_CARP_GROUP       (u_int32_t)0xe0000012   /* 224.0.0.18 */
                    389: #define        INADDR_PFSYNC_GROUP     (u_int32_t)0xe00000f0   /* 224.0.0.240 */
                    390: #define        INADDR_ALLMDNS_GROUP    (u_int32_t)0xe00000fb   /* 224.0.0.251 */
                    391: #define        INADDR_MAX_LOCAL_GROUP  (u_int32_t)0xe00000ff   /* 224.0.0.255 */
                    392: 
                    393: #define        IN_LOOPBACKNET          127                     /* official! */
                    394: 
                    395: /*
                    396:  * Options for use with [gs]etsockopt at the IP level.
                    397:  * First word of comment is data type; bool is stored in int.
                    398:  */
                    399: #define        IP_OPTIONS              1    /* buf/ip_opts; set/get IP options */
                    400: #define        IP_HDRINCL              2    /* int; header is included with data */
                    401: #define        IP_TOS                  3    /* int; IP type of service and preced. */
                    402: #define        IP_TTL                  4    /* int; IP time to live */
                    403: #define        IP_RECVOPTS             5    /* bool; receive all IP opts w/dgram */
                    404: #define        IP_RECVRETOPTS          6    /* bool; receive IP opts for response */
                    405: #define        IP_RECVDSTADDR          7    /* bool; receive IP dst addr w/dgram */
                    406: #define        IP_SENDSRCADDR          IP_RECVDSTADDR /* cmsg_type to set src addr */
                    407: #define        IP_RETOPTS              8    /* ip_opts; set/get IP options */
                    408: #define        IP_MULTICAST_IF         9    /* struct in_addr *or* struct ip_mreqn;
                    409:                                      * set/get IP multicast i/f  */
                    410: #define        IP_MULTICAST_TTL        10   /* u_char; set/get IP multicast ttl */
                    411: #define        IP_MULTICAST_LOOP       11   /* u_char; set/get IP multicast loopback */
                    412: #define        IP_ADD_MEMBERSHIP       12   /* ip_mreq; add an IP group membership */
                    413: #define        IP_DROP_MEMBERSHIP      13   /* ip_mreq; drop an IP group membership */
                    414: #define        IP_MULTICAST_VIF        14   /* set/get IP mcast virt. iface */
                    415: #define        IP_RSVP_ON              15   /* enable RSVP in kernel */
                    416: #define        IP_RSVP_OFF             16   /* disable RSVP in kernel */
                    417: #define        IP_RSVP_VIF_ON          17   /* set RSVP per-vif socket */
                    418: #define        IP_RSVP_VIF_OFF         18   /* unset RSVP per-vif socket */
                    419: #define        IP_PORTRANGE            19   /* int; range to choose for unspec port */
                    420: #define        IP_RECVIF               20   /* bool; receive reception if w/dgram */
                    421: /* for IPSEC */
                    422: #define        IP_IPSEC_POLICY         21   /* int; set/get security policy */
                    423: #define        IP_FAITH                22   /* bool; accept FAITH'ed connections */
                    424: 
                    425: #define        IP_ONESBCAST            23   /* bool: send all-ones broadcast */
                    426: #define        IP_BINDANY              24   /* bool: allow bind to any address */
                    427: 
                    428: /*
                    429:  * Options for controlling the firewall and dummynet.
                    430:  * Historical options (from 40 to 64) will eventually be
                    431:  * replaced by only two options, IP_FW3 and IP_DUMMYNET3.
                    432:  */
                    433: #define        IP_FW_TABLE_ADD         40   /* add entry */
                    434: #define        IP_FW_TABLE_DEL         41   /* delete entry */
                    435: #define        IP_FW_TABLE_FLUSH       42   /* flush table */
                    436: #define        IP_FW_TABLE_GETSIZE     43   /* get table size */
                    437: #define        IP_FW_TABLE_LIST        44   /* list table contents */
                    438: 
                    439: #define        IP_FW3                  48   /* generic ipfw v.3 sockopts */
                    440: #define        IP_DUMMYNET3            49   /* generic dummynet v.3 sockopts */
                    441: 
                    442: #define        IP_FW_ADD               50   /* add a firewall rule to chain */
                    443: #define        IP_FW_DEL               51   /* delete a firewall rule from chain */
                    444: #define        IP_FW_FLUSH             52   /* flush firewall rule chain */
                    445: #define        IP_FW_ZERO              53   /* clear single/all firewall counter(s) */
                    446: #define        IP_FW_GET               54   /* get entire firewall rule chain */
                    447: #define        IP_FW_RESETLOG          55   /* reset logging counters */
                    448: 
                    449: #define IP_FW_NAT_CFG           56   /* add/config a nat rule */
                    450: #define IP_FW_NAT_DEL           57   /* delete a nat rule */
                    451: #define IP_FW_NAT_GET_CONFIG    58   /* get configuration of a nat rule */
                    452: #define IP_FW_NAT_GET_LOG       59   /* get log of a nat rule */
                    453: 
                    454: #define        IP_DUMMYNET_CONFIGURE   60   /* add/configure a dummynet pipe */
                    455: #define        IP_DUMMYNET_DEL         61   /* delete a dummynet pipe from chain */
                    456: #define        IP_DUMMYNET_FLUSH       62   /* flush dummynet */
                    457: #define        IP_DUMMYNET_GET         64   /* get entire dummynet pipes */
                    458: 
                    459: #define        IP_RECVTTL              65   /* bool; receive IP TTL w/dgram */
                    460: #define        IP_MINTTL               66   /* minimum TTL for packet or drop */
                    461: #define        IP_DONTFRAG             67   /* don't fragment packet */
                    462: 
                    463: /* IPv4 Source Filter Multicast API [RFC3678] */
                    464: #define        IP_ADD_SOURCE_MEMBERSHIP        70   /* join a source-specific group */
                    465: #define        IP_DROP_SOURCE_MEMBERSHIP       71   /* drop a single source */
                    466: #define        IP_BLOCK_SOURCE                 72   /* block a source */
                    467: #define        IP_UNBLOCK_SOURCE               73   /* unblock a source */
                    468: 
                    469: /* The following option is private; do not use it from user applications. */
                    470: #define        IP_MSFILTER                     74   /* set/get filter list */
                    471: 
                    472: /* Protocol Independent Multicast API [RFC3678] */
                    473: #define        MCAST_JOIN_GROUP                80   /* join an any-source group */
                    474: #define        MCAST_LEAVE_GROUP               81   /* leave all sources for group */
                    475: #define        MCAST_JOIN_SOURCE_GROUP         82   /* join a source-specific group */
                    476: #define        MCAST_LEAVE_SOURCE_GROUP        83   /* leave a single source */
                    477: #define        MCAST_BLOCK_SOURCE              84   /* block a source */
                    478: #define        MCAST_UNBLOCK_SOURCE            85   /* unblock a source */
                    479: 
                    480: /*
                    481:  * Defaults and limits for options
                    482:  */
                    483: #define        IP_DEFAULT_MULTICAST_TTL  1     /* normally limit m'casts to 1 hop  */
                    484: #define        IP_DEFAULT_MULTICAST_LOOP 1     /* normally hear sends if a member  */
                    485: 
                    486: /*
                    487:  * The imo_membership vector for each socket is now dynamically allocated at
                    488:  * run-time, bounded by USHRT_MAX, and is reallocated when needed, sized
                    489:  * according to a power-of-two increment.
                    490:  */
                    491: #define        IP_MIN_MEMBERSHIPS      31
                    492: #define        IP_MAX_MEMBERSHIPS      4095
                    493: #define        IP_MAX_SOURCE_FILTER    1024    /* XXX to be unused */
                    494: 
                    495: /*
                    496:  * Default resource limits for IPv4 multicast source filtering.
                    497:  * These may be modified by sysctl.
                    498:  */
                    499: #define        IP_MAX_GROUP_SRC_FILTER         512     /* sources per group */
                    500: #define        IP_MAX_SOCK_SRC_FILTER          128     /* sources per socket/group */
                    501: #define        IP_MAX_SOCK_MUTE_FILTER         128     /* XXX no longer used */
                    502: 
                    503: /*
                    504:  * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP.
                    505:  */
                    506: struct ip_mreq {
                    507:        struct  in_addr imr_multiaddr;  /* IP multicast address of group */
                    508:        struct  in_addr imr_interface;  /* local IP address of interface */
                    509: };
                    510: 
                    511: /*
                    512:  * Modified argument structure for IP_MULTICAST_IF, obtained from Linux.
                    513:  * This is used to specify an interface index for multicast sends, as
                    514:  * the IPv4 legacy APIs do not support this (unless IP_SENDIF is available).
                    515:  */
                    516: struct ip_mreqn {
                    517:        struct  in_addr imr_multiaddr;  /* IP multicast address of group */
                    518:        struct  in_addr imr_address;    /* local IP address of interface */
                    519:        int             imr_ifindex;    /* Interface index; cast to uint32_t */
                    520: };
                    521: 
                    522: /*
                    523:  * Argument structure for IPv4 Multicast Source Filter APIs. [RFC3678]
                    524:  */
                    525: struct ip_mreq_source {
                    526:        struct  in_addr imr_multiaddr;  /* IP multicast address of group */
                    527:        struct  in_addr imr_sourceaddr; /* IP address of source */
                    528:        struct  in_addr imr_interface;  /* local IP address of interface */
                    529: };
                    530: 
                    531: /*
                    532:  * Argument structures for Protocol-Independent Multicast Source
                    533:  * Filter APIs. [RFC3678]
                    534:  */
                    535: struct group_req {
                    536:        uint32_t                gr_interface;   /* interface index */
                    537:        struct sockaddr_storage gr_group;       /* group address */
                    538: };
                    539: 
                    540: struct group_source_req {
                    541:        uint32_t                gsr_interface;  /* interface index */
                    542:        struct sockaddr_storage gsr_group;      /* group address */
                    543:        struct sockaddr_storage gsr_source;     /* source address */
                    544: };
                    545: 
                    546: #ifndef __MSFILTERREQ_DEFINED
                    547: #define __MSFILTERREQ_DEFINED
                    548: /*
                    549:  * The following structure is private; do not use it from user applications.
                    550:  * It is used to communicate IP_MSFILTER/IPV6_MSFILTER information between
                    551:  * the RFC 3678 libc functions and the kernel.
                    552:  */
                    553: struct __msfilterreq {
                    554:        uint32_t                 msfr_ifindex;  /* interface index */
                    555:        uint32_t                 msfr_fmode;    /* filter mode for group */
                    556:        uint32_t                 msfr_nsrcs;    /* # of sources in msfr_srcs */
                    557:        struct sockaddr_storage  msfr_group;    /* group address */
                    558:        struct sockaddr_storage *msfr_srcs;     /* pointer to the first member
                    559:                                                 * of a contiguous array of
                    560:                                                 * sources to filter in full.
                    561:                                                 */
                    562: };
                    563: #endif
                    564: 
                    565: struct sockaddr;
                    566: 
                    567: /*
                    568:  * Advanced (Full-state) APIs [RFC3678]
                    569:  * The RFC specifies uint_t for the 6th argument to [sg]etsourcefilter().
                    570:  * We use uint32_t here to be consistent.
                    571:  */
                    572: int    setipv4sourcefilter(int, struct in_addr, struct in_addr, uint32_t,
                    573:            uint32_t, struct in_addr *);
                    574: int    getipv4sourcefilter(int, struct in_addr, struct in_addr, uint32_t *,
                    575:            uint32_t *, struct in_addr *);
                    576: int    setsourcefilter(int, uint32_t, struct sockaddr *, socklen_t,
                    577:            uint32_t, uint32_t, struct sockaddr_storage *);
                    578: int    getsourcefilter(int, uint32_t, struct sockaddr *, socklen_t,
                    579:            uint32_t *, uint32_t *, struct sockaddr_storage *);
                    580: 
                    581: /*
                    582:  * Filter modes; also used to represent per-socket filter mode internally.
                    583:  */
                    584: #define        MCAST_UNDEFINED 0       /* fmode: not yet defined */
                    585: #define        MCAST_INCLUDE   1       /* fmode: include these source(s) */
                    586: #define        MCAST_EXCLUDE   2       /* fmode: exclude these source(s) */
                    587: 
                    588: /*
                    589:  * Argument for IP_PORTRANGE:
                    590:  * - which range to search when port is unspecified at bind() or connect()
                    591:  */
                    592: #define        IP_PORTRANGE_DEFAULT    0       /* default range */
                    593: #define        IP_PORTRANGE_HIGH       1       /* "high" - request firewall bypass */
                    594: #define        IP_PORTRANGE_LOW        2       /* "low" - vouchsafe security */
                    595: 
                    596: /*
                    597:  * Definitions for inet sysctl operations.
                    598:  *
                    599:  * Third level is protocol number.
                    600:  * Fourth level is desired variable within that protocol.
                    601:  */
                    602: #define        IPPROTO_MAXID   (IPPROTO_AH + 1)        /* don't list to IPPROTO_MAX */
                    603: 
                    604: #define        CTL_IPPROTO_NAMES { \
                    605:        { "ip", CTLTYPE_NODE }, \
                    606:        { "icmp", CTLTYPE_NODE }, \
                    607:        { "igmp", CTLTYPE_NODE }, \
                    608:        { "ggp", CTLTYPE_NODE }, \
                    609:        { 0, 0 }, \
                    610:        { 0, 0 }, \
                    611:        { "tcp", CTLTYPE_NODE }, \
                    612:        { 0, 0 }, \
                    613:        { "egp", CTLTYPE_NODE }, \
                    614:        { 0, 0 }, \
                    615:        { 0, 0 }, \
                    616:        { 0, 0 }, \
                    617:        { "pup", CTLTYPE_NODE }, \
                    618:        { 0, 0 }, \
                    619:        { 0, 0 }, \
                    620:        { 0, 0 }, \
                    621:        { 0, 0 }, \
                    622:        { "udp", CTLTYPE_NODE }, \
                    623:        { 0, 0 }, \
                    624:        { 0, 0 }, \
                    625:        { 0, 0 }, \
                    626:        { 0, 0 }, \
                    627:        { "idp", CTLTYPE_NODE }, \
                    628:        { 0, 0 }, \
                    629:        { 0, 0 }, \
                    630:        { 0, 0 }, \
                    631:        { 0, 0 }, \
                    632:        { 0, 0 }, \
                    633:        { 0, 0 }, \
                    634:        { 0, 0 }, \
                    635:        { 0, 0 }, \
                    636:        { 0, 0 }, \
                    637:        { 0, 0 }, \
                    638:        { 0, 0 }, \
                    639:        { 0, 0 }, \
                    640:        { 0, 0 }, \
                    641:        { 0, 0 }, \
                    642:        { 0, 0 }, \
                    643:        { 0, 0 }, \
                    644:        { 0, 0 }, \
                    645:        { 0, 0 }, \
                    646:        { 0, 0 }, \
                    647:        { 0, 0 }, \
                    648:        { 0, 0 }, \
                    649:        { 0, 0 }, \
                    650:        { 0, 0 }, \
                    651:        { 0, 0 }, \
                    652:        { 0, 0 }, \
                    653:        { 0, 0 }, \
                    654:        { 0, 0 }, \
                    655:        { 0, 0 }, \
                    656:        { "ipsec", CTLTYPE_NODE }, \
                    657:        { 0, 0 }, \
                    658:        { 0, 0 }, \
                    659:        { 0, 0 }, \
                    660:        { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
                    661:        { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
                    662:        { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
                    663:        { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
                    664:        { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
                    665:        { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
                    666:        { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
                    667:        { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
                    668:        { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
                    669:        { 0, 0 }, \
                    670:        { 0, 0 }, \
                    671:        { 0, 0 }, \
                    672:        { "pim", CTLTYPE_NODE }, \
                    673: }
                    674: 
                    675: /*
                    676:  * Names for IP sysctl objects
                    677:  */
                    678: #define        IPCTL_FORWARDING        1       /* act as router */
                    679: #define        IPCTL_SENDREDIRECTS     2       /* may send redirects when forwarding */
                    680: #define        IPCTL_DEFTTL            3       /* default TTL */
                    681: #ifdef notyet
                    682: #define        IPCTL_DEFMTU            4       /* default MTU */
                    683: #endif
                    684: #define        IPCTL_RTEXPIRE          5       /* cloned route expiration time */
                    685: #define        IPCTL_RTMINEXPIRE       6       /* min value for expiration time */
                    686: #define        IPCTL_RTMAXCACHE        7       /* trigger level for dynamic expire */
                    687: #define        IPCTL_SOURCEROUTE       8       /* may perform source routes */
                    688: #define        IPCTL_DIRECTEDBROADCAST 9       /* may re-broadcast received packets */
                    689: #define        IPCTL_INTRQMAXLEN       10      /* max length of netisr queue */
                    690: #define        IPCTL_INTRQDROPS        11      /* number of netisr q drops */
                    691: #define        IPCTL_STATS             12      /* ipstat structure */
                    692: #define        IPCTL_ACCEPTSOURCEROUTE 13      /* may accept source routed packets */
                    693: #define        IPCTL_FASTFORWARDING    14      /* use fast IP forwarding code */
                    694: #define        IPCTL_KEEPFAITH         15      /* FAITH IPv4->IPv6 translater ctl */
                    695: #define        IPCTL_GIF_TTL           16      /* default TTL for gif encap packet */
                    696: #define        IPCTL_MAXID             17
                    697: 
                    698: #define        IPCTL_NAMES { \
                    699:        { 0, 0 }, \
                    700:        { "forwarding", CTLTYPE_INT }, \
                    701:        { "redirect", CTLTYPE_INT }, \
                    702:        { "ttl", CTLTYPE_INT }, \
                    703:        { "mtu", CTLTYPE_INT }, \
                    704:        { "rtexpire", CTLTYPE_INT }, \
                    705:        { "rtminexpire", CTLTYPE_INT }, \
                    706:        { "rtmaxcache", CTLTYPE_INT }, \
                    707:        { "sourceroute", CTLTYPE_INT }, \
                    708:        { "directed-broadcast", CTLTYPE_INT }, \
                    709:        { "intr-queue-maxlen", CTLTYPE_INT }, \
                    710:        { "intr-queue-drops", CTLTYPE_INT }, \
                    711:        { "stats", CTLTYPE_STRUCT }, \
                    712:        { "accept_sourceroute", CTLTYPE_INT }, \
                    713:        { "fastforwarding", CTLTYPE_INT }, \
                    714: }
                    715: 
                    716: #endif /* __BSD_VISIBLE */
                    717: 
                    718: #ifdef _KERNEL
                    719: 
                    720: struct ifnet; struct mbuf;     /* forward declarations for Standard C */
                    721: 
                    722: int     in_broadcast(struct in_addr, struct ifnet *);
                    723: int     in_canforward(struct in_addr);
                    724: int     in_localaddr(struct in_addr);
                    725: int     in_localip(struct in_addr);
                    726: int     inet_aton(const char *, struct in_addr *); /* in libkern */
                    727: char   *inet_ntoa(struct in_addr); /* in libkern */
                    728: char   *inet_ntoa_r(struct in_addr ina, char *buf); /* in libkern */
                    729: void    in_ifdetach(struct ifnet *);
                    730: 
                    731: #define        in_hosteq(s, t) ((s).s_addr == (t).s_addr)
                    732: #define        in_nullhost(x)  ((x).s_addr == INADDR_ANY)
                    733: #define        in_allhosts(x)  ((x).s_addr == htonl(INADDR_ALLHOSTS_GROUP))
                    734: 
                    735: #define        satosin(sa)     ((struct sockaddr_in *)(sa))
                    736: #define        sintosa(sin)    ((struct sockaddr *)(sin))
                    737: #define        ifatoia(ifa)    ((struct in_ifaddr *)(ifa))
                    738: 
                    739: /*
                    740:  * Historically, BSD keeps ip_len and ip_off in host format
                    741:  * when doing layer 3 processing, and this often requires
                    742:  * to translate the format back and forth.
                    743:  * To make the process explicit, we define a couple of macros
                    744:  * that also take into account the fact that at some point
                    745:  * we may want to keep those fields always in net format.
                    746:  */
                    747: 
                    748: #if (BYTE_ORDER == BIG_ENDIAN) || defined(HAVE_NET_IPLEN)
                    749: #define SET_NET_IPLEN(p)       do {} while (0)
                    750: #define SET_HOST_IPLEN(p)      do {} while (0)
                    751: #else
                    752: #define SET_NET_IPLEN(p)       do {            \
                    753:        struct ip *h_ip = (p);                  \
                    754:        h_ip->ip_len = htons(h_ip->ip_len);     \
                    755:        h_ip->ip_off = htons(h_ip->ip_off);     \
                    756:        } while (0)
                    757: 
                    758: #define SET_HOST_IPLEN(p)      do {            \
                    759:        struct ip *h_ip = (p);                  \
                    760:        h_ip->ip_len = ntohs(h_ip->ip_len);     \
                    761:        h_ip->ip_off = ntohs(h_ip->ip_off);     \
                    762:        } while (0)
                    763: #endif /* !HAVE_NET_IPLEN */
                    764: 
                    765: #endif /* _KERNEL */
                    766: 
                    767: /* INET6 stuff */
                    768: #if __POSIX_VISIBLE >= 200112
                    769: #define        __KAME_NETINET_IN_H_INCLUDED_
                    770: #include <netinet6/in6.h>
                    771: #undef __KAME_NETINET_IN_H_INCLUDED_
                    772: #endif
                    773: 
                    774: #endif /* !_NETINET_IN_H_*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>