Annotation of XNU/bsd/netinet/in_pcb.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  * Copyright (c) 1982, 1986, 1990, 1993
        !            24:  *     The Regents of the University of California.  All rights reserved.
        !            25:  *
        !            26:  * Redistribution and use in source and binary forms, with or without
        !            27:  * modification, are permitted provided that the following conditions
        !            28:  * are met:
        !            29:  * 1. Redistributions of source code must retain the above copyright
        !            30:  *    notice, this list of conditions and the following disclaimer.
        !            31:  * 2. Redistributions in binary form must reproduce the above copyright
        !            32:  *    notice, this list of conditions and the following disclaimer in the
        !            33:  *    documentation and/or other materials provided with the distribution.
        !            34:  * 3. All advertising materials mentioning features or use of this software
        !            35:  *    must display the following acknowledgement:
        !            36:  *     This product includes software developed by the University of
        !            37:  *     California, Berkeley and its contributors.
        !            38:  * 4. Neither the name of the University nor the names of its contributors
        !            39:  *    may be used to endorse or promote products derived from this software
        !            40:  *    without specific prior written permission.
        !            41:  *
        !            42:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            43:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            44:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            45:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            46:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            47:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            48:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            49:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            50:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            51:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            52:  * SUCH DAMAGE.
        !            53:  *
        !            54:  *     @(#)in_pcb.h    8.1 (Berkeley) 6/10/93
        !            55:  */
        !            56: 
        !            57: #ifndef _NETINET_IN_PCB_H_
        !            58: #define _NETINET_IN_PCB_H_
        !            59: 
        !            60: #include <sys/queue.h>
        !            61: 
        !            62: /*
        !            63:  * Common structure pcb for internet protocol implementation.
        !            64:  * Here are stored pointers to local and foreign host table
        !            65:  * entries, local and foreign socket numbers, and pointers
        !            66:  * up (to a socket structure) and down (to a protocol-specific)
        !            67:  * control block.
        !            68:  */
        !            69: LIST_HEAD(inpcbhead, inpcb);
        !            70: LIST_HEAD(inpcbporthead, inpcbport);
        !            71: typedef        u_quad_t        inp_gen_t;
        !            72: 
        !            73: /*
        !            74:  * NB: the zone allocator is type-stable EXCEPT FOR THE FIRST TWO LONGS
        !            75:  * of the structure.  Therefore, it is important that the members in
        !            76:  * that position not contain any information which is required to be
        !            77:  * stable.
        !            78:  */
        !            79: struct inpcb {
        !            80:        LIST_ENTRY(inpcb) inp_hash;     /* hash list */
        !            81:        struct  in_addr inp_faddr;      /* foreign host table entry */
        !            82:        struct  in_addr inp_laddr;      /* local host table entry */
        !            83:        u_short inp_fport;              /* foreign port */
        !            84:        u_short inp_lport;              /* local port */
        !            85:        LIST_ENTRY(inpcb) inp_list;     /* list for all PCBs of this proto */
        !            86:        caddr_t inp_ppcb;               /* pointer to per-protocol pcb */
        !            87:        struct  inpcbinfo *inp_pcbinfo; /* PCB list info */
        !            88:        struct  socket *inp_socket;     /* back pointer to socket */
        !            89:        struct  mbuf *inp_options;      /* IP options */
        !            90:        struct  route inp_route;        /* placeholder for routing entry */
        !            91:        int     inp_flags;              /* generic IP/datagram flags */
        !            92:        u_char  inp_ip_tos;             /* type of service proto */
        !            93:        u_char  inp_ip_ttl;             /* time to live proto */
        !            94:        u_char  inp_ip_p;               /* protocol proto */
        !            95:        u_char  nat_owner;              /* Used to NAT TCP/UDP traffic */
        !            96:        u_long  nat_cookie;             /* Cookie stored and returned to NAT */
        !            97:        struct  ip_moptions *inp_moptions; /* IP multicast options */
        !            98:        LIST_ENTRY(inpcb) inp_portlist; /* list for this PCB's local port */
        !            99:        struct  inpcbport *inp_phd;     /* head of this list */
        !           100:        inp_gen_t inp_gencnt;           /* generation count of this instance */
        !           101: };
        !           102: /*
        !           103:  * The range of the generation count, as used in this implementation,
        !           104:  * is 9e19.  We would have to create 300 billion connections per
        !           105:  * second for this number to roll over in a year.  This seems sufficiently
        !           106:  * unlikely that we simply don't concern ourselves with that possibility.
        !           107:  */
        !           108: 
        !           109: /*
        !           110:  * Interface exported to userland by various protocols which use
        !           111:  * inpcbs.  Hack alert -- only define if struct xsocket is in scope.
        !           112:  */
        !           113: #ifdef _SYS_SOCKETVAR_H_
        !           114: struct xinpcb {
        !           115:        size_t  xi_len;         /* length of this structure */
        !           116:        struct  inpcb xi_inp;
        !           117:        struct  xsocket xi_socket;
        !           118:        u_quad_t        xi_alignment_hack;
        !           119: };
        !           120: 
        !           121: struct xinpgen {
        !           122:        size_t  xig_len;        /* length of this structure */
        !           123:        u_int   xig_count;      /* number of PCBs at this time */
        !           124:        inp_gen_t xig_gen;      /* generation count at this time */
        !           125:        so_gen_t xig_sogen;     /* socket generation count at this time */
        !           126: };
        !           127: #endif /* _SYS_SOCKETVAR_H_ */
        !           128: 
        !           129: struct inpcbport {
        !           130:        LIST_ENTRY(inpcbport) phd_hash;
        !           131:        struct inpcbhead phd_pcblist;
        !           132:        u_short phd_port;
        !           133: };
        !           134: 
        !           135: struct inpcbinfo {             /* XXX documentation, prefixes */
        !           136:        struct  inpcbhead *hashbase;
        !           137:        u_long  hashmask;
        !           138:        struct  inpcbporthead *porthashbase;
        !           139:        u_long  porthashmask;
        !           140:        struct  inpcbhead *listhead;
        !           141:        u_short lastport;
        !           142:        u_short lastlow;
        !           143:        u_short lasthi;
        !           144:        void   *ipi_zone; /* zone to allocate pcbs from */
        !           145:        u_int   ipi_count;      /* number of pcbs in this list */
        !           146:        u_quad_t ipi_gencnt;    /* current generation count */
        !           147:         u_char   all_owners;
        !           148:         struct socket nat_dummy_socket;
        !           149:        struct inpcb *last_pcb;
        !           150:         caddr_t      dummy_cb;
        !           151: };
        !           152: 
        !           153: #define INP_PCBHASH(faddr, lport, fport, mask) \
        !           154:        (((faddr) ^ ((faddr) >> 16) ^ ntohs((lport) ^ (fport))) & (mask))
        !           155: #define INP_PCBPORTHASH(lport, mask) \
        !           156:        (ntohs((lport)) & (mask))
        !           157: 
        !           158: /* flags in inp_flags: */
        !           159: #define        INP_RECVOPTS            0x01    /* receive incoming IP options */
        !           160: #define        INP_RECVRETOPTS         0x02    /* receive IP options for reply */
        !           161: #define        INP_RECVDSTADDR         0x04    /* receive IP dst address */
        !           162: #define        INP_HDRINCL             0x08    /* user supplies entire IP header */
        !           163: #define        INP_HIGHPORT            0x10    /* user wants "high" port binding */
        !           164: #define        INP_LOWPORT             0x20    /* user wants "low" port binding */
        !           165: #define        INP_ANONPORT            0x40    /* port chosen for user */
        !           166: #define        INP_RECVIF              0x80    /* receive incoming interface */
        !           167: #define        INP_MTUDISC             0x100   /* user can do MTU discovery */
        !           168: #define        INP_CONTROLOPTS         (INP_RECVOPTS|INP_RECVRETOPTS|INP_RECVDSTADDR|\
        !           169:                                        INP_RECVIF)
        !           170: #define INP_STRIPHDR   0x200   /* drop receive of raw IP header */
        !           171: 
        !           172: #define        INPLOOKUP_WILDCARD      1
        !           173: #define INPCB_ALL_OWNERS       0xff
        !           174: #define INPCB_NO_OWNER         0x0
        !           175: #define INPCB_OWNED_BY_X       0x80
        !           176: #define INPCB_MAX_IDS          7
        !           177: 
        !           178: #define        sotoinpcb(so)   ((struct inpcb *)(so)->so_pcb)
        !           179: 
        !           180: #ifdef KERNEL
        !           181: void   in_losing __P((struct inpcb *));
        !           182: int    in_pcballoc __P((struct socket *, struct inpcbinfo *, struct proc *));
        !           183: int    in_pcbbind __P((struct inpcb *, struct sockaddr *, struct proc *));
        !           184: int    in_pcbconnect __P((struct inpcb *, struct sockaddr *, struct proc *));
        !           185: void   in_pcbdetach __P((struct inpcb *));
        !           186: void   in_pcbdisconnect __P((struct inpcb *));
        !           187: int    in_pcbinshash __P((struct inpcb *));
        !           188: int    in_pcbladdr __P((struct inpcb *, struct sockaddr *,
        !           189:            struct sockaddr_in **));
        !           190: struct inpcb *
        !           191:        in_pcblookup_local __P((struct inpcbinfo *,
        !           192:            struct in_addr, u_int, int));
        !           193: struct inpcb *
        !           194:        in_pcblookup_hash __P((struct inpcbinfo *,
        !           195:            struct in_addr, u_int, struct in_addr, u_int, int));
        !           196: void   in_pcbnotify __P((struct inpcbhead *, struct sockaddr *,
        !           197:            u_int, struct in_addr, u_int, int, void (*)(struct inpcb *, int)));
        !           198: void   in_pcbrehash __P((struct inpcb *));
        !           199: int    in_setpeeraddr __P((struct socket *so, struct sockaddr **nam));
        !           200: int    in_setsockaddr __P((struct socket *so, struct sockaddr **nam));
        !           201: 
        !           202: int    
        !           203: in_pcb_grab_port  __P((struct inpcbinfo *pcbinfo,
        !           204:                       u_short          options,
        !           205:                       struct in_addr   laddr, 
        !           206:                       u_short          *lport,  
        !           207:                       struct in_addr   faddr,
        !           208:                       u_short          fport,
        !           209:                       u_int            cookie, 
        !           210:                       u_char           owner_id));
        !           211: 
        !           212: int    
        !           213: in_pcb_letgo_port __P((struct inpcbinfo *pcbinfo, 
        !           214:                       struct in_addr laddr, 
        !           215:                       u_short lport,
        !           216:                       struct in_addr faddr,
        !           217:                       u_short fport, u_char owner_id));
        !           218: 
        !           219: u_char
        !           220: in_pcb_get_owner __P((struct inpcbinfo *pcbinfo, 
        !           221:                      struct in_addr laddr, 
        !           222:                      u_short lport, 
        !           223:                      struct in_addr faddr,
        !           224:                      u_short fport,
        !           225:                      u_int *cookie));
        !           226: 
        !           227: void in_pcb_nat_init(struct inpcbinfo *pcbinfo, int afamily, int pfamily,
        !           228:                     int protocol);
        !           229: 
        !           230: int
        !           231: in_pcb_new_share_client(struct inpcbinfo *pcbinfo, u_char *owner_id);
        !           232: 
        !           233: int
        !           234: in_pcb_rem_share_client(struct inpcbinfo *pcbinfo, u_char owner_id);
        !           235: 
        !           236: #endif /* KERNEL */
        !           237: 
        !           238: #endif /* !_NETINET_IN_PCB_H_ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.