2  * Copyright (c) 2000-2008 Apple Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  29  * Copyright (c) 1982, 1986, 1990, 1993 
  30  *      The Regents of the University of California.  All rights reserved. 
  32  * Redistribution and use in source and binary forms, with or without 
  33  * modification, are permitted provided that the following conditions 
  35  * 1. Redistributions of source code must retain the above copyright 
  36  *    notice, this list of conditions and the following disclaimer. 
  37  * 2. Redistributions in binary form must reproduce the above copyright 
  38  *    notice, this list of conditions and the following disclaimer in the 
  39  *    documentation and/or other materials provided with the distribution. 
  40  * 3. All advertising materials mentioning features or use of this software 
  41  *    must display the following acknowledgement: 
  42  *      This product includes software developed by the University of 
  43  *      California, Berkeley and its contributors. 
  44  * 4. Neither the name of the University nor the names of its contributors 
  45  *    may be used to endorse or promote products derived from this software 
  46  *    without specific prior written permission. 
  48  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
  49  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  50  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  51  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
  52  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  53  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
  54  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  56  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
  57  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  60  *      @(#)in_pcb.h    8.1 (Berkeley) 6/10/93 
  61  * $FreeBSD: src/sys/netinet/in_pcb.h,v 1.32.2.4 2001/08/13 16:26:17 ume Exp $ 
  64  * NOTICE: This file was modified by SPARTA, Inc. in 2007 to introduce 
  65  * support for mandatory and extensible security protections.  This notice 
  66  * is included in support of clause 2.2 (b) of the Apple Public License, 
  70 #ifndef _NETINET_IN_PCB_H_ 
  71 #define _NETINET_IN_PCB_H_ 
  72 #include <sys/appleapiopts.h> 
  74 #include <sys/types.h> 
  75 #include <sys/queue.h> 
  78 #include <kern/locks.h> 
  80 #endif /* KERNEL_PRIVATE */ 
  82 #include <netinet6/ipsec.h> /* for IPSEC */ 
  86 #define in6pcb          inpcb   /* for KAME src sync over BSD*'s */ 
  87 #define in6p_sp         inp_sp  /* for KAME src sync over BSD*'s */ 
  90  * Common structure pcb for internet protocol implementation. 
  91  * Here are stored pointers to local and foreign host table 
  92  * entries, local and foreign socket numbers, and pointers 
  93  * up (to a socket structure) and down (to a protocol-specific) 
  96 LIST_HEAD(inpcbhead
, inpcb
); 
  97 LIST_HEAD(inpcbporthead
, inpcbport
); 
  98 #endif /* KERNEL_PRIVATE */ 
  99 typedef u_quad_t        inp_gen_t
; 
 102  * PCB with AF_INET6 null bind'ed laddr can receive AF_INET input packet. 
 103  * So, AF_INET6 null laddr is also used as AF_INET null laddr, 
 104  * by utilize following structure. (At last, same as INRIA) 
 106 struct in_addr_4in6 
{ 
 107         u_int32_t       ia46_pad32
[3]; 
 108         struct  in_addr ia46_addr4
; 
 111 #ifdef KERNEL_PRIVATE 
 113  * NB: the zone allocator is type-stable EXCEPT FOR THE FIRST TWO LONGS 
 114  * of the structure.  Therefore, it is important that the members in 
 115  * that position not contain any information which is required to be 
 124         LIST_ENTRY(inpcb
) inp_hash
;     /* hash list */ 
 125         int             inp_wantcnt
;            /* pcb wanted count. protected by pcb list lock */ 
 126         int             inp_state
;              /* state of this pcb, in use, recycled, ready for recycling... */ 
 127         u_short inp_fport
;              /* foreign port */ 
 128         u_short inp_lport
;              /* local port */ 
 129         LIST_ENTRY(inpcb
) inp_list
;     /* list for all PCBs of this proto */ 
 130         caddr_t inp_ppcb
;               /* pointer to per-protocol pcb */ 
 131         struct  inpcbinfo 
*inp_pcbinfo
; /* PCB list info */ 
 132         struct  socket 
*inp_socket
;     /* back pointer to socket */ 
 133         u_char  nat_owner
;              /* Used to NAT TCP/UDP traffic */ 
 134         u_int32_t nat_cookie
;           /* Cookie stored and returned to NAT */ 
 135         LIST_ENTRY(inpcb
) inp_portlist
; /* list for this PCB's local port */ 
 136         struct  inpcbport 
*inp_phd
;     /* head of this list */ 
 137         inp_gen_t inp_gencnt
;           /* generation count of this instance */ 
 138         int     inp_flags
;              /* generic IP/datagram flags */ 
 141         u_char  inp_vflag
;      /* INP_IPV4 or INP_IPV6 */ 
 143         u_char inp_ip_ttl
;              /* time to live proto */ 
 144         u_char inp_ip_p
;                /* protocol proto */ 
 145         /* protocol dependent part */ 
 147                 /* foreign host table entry */ 
 148                 struct  in_addr_4in6 inp46_foreign
; 
 149                 struct  in6_addr inp6_foreign
; 
 152                 /* local host table entry */ 
 153                 struct  in_addr_4in6 inp46_local
; 
 154                 struct  in6_addr inp6_local
; 
 157                 /* placeholder for routing entry */ 
 158                 struct  route inp4_route
; 
 159                 struct  route_in6 inp6_route
; 
 162                 /* type of service proto */ 
 165                 struct mbuf 
*inp4_options
; 
 166                 /* IP multicast options */ 
 167                 struct ip_moptions 
*inp4_moptions
; 
 171                 struct mbuf 
*inp6_options
; 
 173                 u_int8_t        unused_uint8_1
; 
 174                 ushort  unused_uint16_1
; 
 175                 /* IP6 options for outgoing packets */ 
 176                 struct  ip6_pktopts 
*inp6_outputopts
; 
 177                 /* IP multicast options */ 
 178                 struct  ip6_moptions 
*inp6_moptions
; 
 179                 /* ICMPv6 code type filter */ 
 180                 struct  icmp6_filter 
*inp6_icmp6filt
; 
 181                 /* IPV6_CHECKSUM setsockopt */ 
 183                 u_short inp6_ifindex
; 
 187         int     hash_element
;           /* Array index of pcb's hash list    */ 
 188         caddr_t inp_saved_ppcb
;         /* place to save pointer while cached */ 
 189         struct inpcbpolicy 
*inp_sp
; 
 190 #ifdef _KERN_LOCKS_H_ 
 191         lck_mtx_t 
*inpcb_mtx
;   /* inpcb per-socket mutex */ 
 195         unsigned int inp_boundif
;       /* interface scope for INP_BOUND_IF */ 
 196         u_int32_t inp_reserved
[3];      /* reserved for future use */ 
 198         struct label 
*inp_label
;        /* MAC label */ 
 200 #if CONFIG_IP_EDGEHOLE 
 201         u_int32_t       inpcb_edgehole_flags
; 
 202         u_int32_t       inpcb_edgehole_mask
; 
 206 #endif /* KERNEL_PRIVATE */ 
 209  * The range of the generation count, as used in this implementation, 
 210  * is 9e19.  We would have to create 300 billion connections per 
 211  * second for this number to roll over in a year.  This seems sufficiently 
 212  * unlikely that we simply don't concern ourselves with that possibility. 
 216  * Interface exported to userland by various protocols which use 
 217  * inpcbs.  Hack alert -- only define if struct xsocket is in scope. 
 221  * This is a copy of the inpcb as it shipped in Panther. This structure 
 222  * is filled out in a copy function. This allows the inpcb to change 
 223  * without breaking userland tools. 
 225  * CAUTION: Many fields may not be filled out. Fewer may be filled out 
 226  * in the future. Code defensively. 
 231 #if defined(__LP64__) 
 232 struct _inpcb_list_entry 
{ 
 236 #define _INPCB_PTR(x)           u_int32_t 
 237 #define _INPCB_LIST_ENTRY(x)    struct _inpcb_list_entry 
 239 #define _INPCB_PTR(x)           x 
 240 #define _INPCB_LIST_ENTRY(x)    LIST_ENTRY(x)    
 243 #ifdef KERNEL_PRIVATE 
 244 struct inpcb_compat 
{ 
 255 #endif /* KERNEL_PRIVATE */ 
 256         _INPCB_LIST_ENTRY(inpcb
) inp_hash
;      /* hash list */ 
 257         struct  in_addr reserved1
;      /* APPLE reserved: inp_faddr defined in protcol indep. part */ 
 258         struct  in_addr reserved2
; /* APPLE reserved */ 
 259         u_short inp_fport
;              /* foreign port */ 
 260         u_short inp_lport
;              /* local port */ 
 261         _INPCB_LIST_ENTRY(inpcb
) inp_list
;      /* list for all PCBs of this proto */ 
 262         _INPCB_PTR(caddr_t
)     inp_ppcb
;       /* pointer to per-protocol pcb */ 
 263         _INPCB_PTR(struct inpcbinfo 
*)  inp_pcbinfo
;    /* PCB list info */ 
 264         _INPCB_PTR(void *)      inp_socket
;     /* back pointer to socket */ 
 265         u_char  nat_owner
;              /* Used to NAT TCP/UDP traffic */ 
 266         u_int32_t nat_cookie
;           /* Cookie stored and returned to NAT */ 
 267         _INPCB_LIST_ENTRY(inpcb
) inp_portlist
;  /* list for this PCB's local port */ 
 268         _INPCB_PTR(struct inpcbport 
*)  inp_phd
;                /* head of this list */ 
 269         inp_gen_t inp_gencnt
;           /* generation count of this instance */ 
 270         int     inp_flags
;              /* generic IP/datagram flags */ 
 275         u_char inp_ip_ttl
;              /* time to live proto */ 
 276         u_char inp_ip_p
;                /* protocol proto */ 
 277         /* protocol dependent part */ 
 279                 /* foreign host table entry */ 
 280                 struct  in_addr_4in6 inp46_foreign
; 
 281                 struct  in6_addr inp6_foreign
; 
 284                 /* local host table entry */ 
 285                 struct  in_addr_4in6 inp46_local
; 
 286                 struct  in6_addr inp6_local
; 
 289                 /* placeholder for routing entry */ 
 290                 u_char  inp4_route
[20]; 
 291                 u_char  inp6_route
[32]; 
 294                 /* type of service proto */ 
 297                 _INPCB_PTR(struct mbuf 
*) inp4_options
; 
 298                 /* IP multicast options */ 
 299                 _INPCB_PTR(struct ip_moptions 
*) inp4_moptions
; 
 304                 _INPCB_PTR(struct mbuf 
*)       inp6_options
; 
 306                 u_int8_t        unused_uint8_1
; 
 307                 ushort  unused_uint16_1
; 
 308                 /* IP6 options for outgoing packets */ 
 309                 _INPCB_PTR(struct ip6_pktopts 
*)        inp6_outputopts
; 
 310                 /* IP multicast options */ 
 311                 _INPCB_PTR(struct ip6_moptions 
*)       inp6_moptions
; 
 312                 /* ICMPv6 code type filter */ 
 313                 _INPCB_PTR(struct icmp6_filter 
*)       inp6_icmp6filt
; 
 314                 /* IPV6_CHECKSUM setsockopt */ 
 316                 u_short inp6_ifindex
; 
 320         int     hash_element
;           /* Array index of pcb's hash list    */ 
 321         _INPCB_PTR(caddr_t
)     inp_saved_ppcb
; /* place to save pointer while cached */ 
 322         _INPCB_PTR(struct inpcbpolicy 
*)        inp_sp
; 
 323         u_int32_t       reserved
[3];    /* For future use */ 
 327         u_int32_t       xi_len
;         /* length of this structure */ 
 328 #ifdef KERNEL_PRIVATE 
 329         struct  inpcb_compat xi_inp
; 
 333         struct  xsocket xi_socket
; 
 334         u_quad_t        xi_alignment_hack
; 
 338         u_int32_t xig_len
;      /* length of this structure */ 
 339         u_int   xig_count
;      /* number of PCBs at this time */ 
 340         inp_gen_t xig_gen
;      /* generation count at this time */ 
 341         so_gen_t xig_sogen
;     /* socket generation count at this time */ 
 347  * These defines are for use with the inpcb. 
 351 #define inp_faddr       inp_dependfaddr.inp46_foreign.ia46_addr4 
 352 #define inp_laddr       inp_dependladdr.inp46_local.ia46_addr4 
 353 #define inp_route       inp_dependroute.inp4_route 
 354 #define inp_ip_tos      inp_depend4.inp4_ip_tos 
 355 #define inp_options     inp_depend4.inp4_options 
 356 #define inp_moptions    inp_depend4.inp4_moptions 
 357 #define in6p_faddr      inp_dependfaddr.inp6_foreign 
 358 #define in6p_laddr      inp_dependladdr.inp6_local 
 359 #define in6p_route      inp_dependroute.inp6_route 
 360 #define in6p_ip6_hlim   inp_depend6.inp6_hlim 
 361 #define in6p_hops       inp_depend6.inp6_hops   /* default hop limit */ 
 362 #define in6p_ip6_nxt    inp_ip_p 
 363 #define in6p_flowinfo   inp_flow 
 364 #define in6p_vflag      inp_vflag 
 365 #define in6p_options    inp_depend6.inp6_options 
 366 #define in6p_outputopts inp_depend6.inp6_outputopts 
 367 #define in6p_moptions   inp_depend6.inp6_moptions 
 368 #define in6p_icmp6filt  inp_depend6.inp6_icmp6filt 
 369 #define in6p_cksum      inp_depend6.inp6_cksum 
 370 #define inp6_ifindex    inp_depend6.inp6_ifindex 
 371 #define in6p_flags      inp_flags  /* for KAME src sync over BSD*'s */ 
 372 #define in6p_socket     inp_socket  /* for KAME src sync over BSD*'s */ 
 373 #define in6p_lport      inp_lport  /* for KAME src sync over BSD*'s */ 
 374 #define in6p_fport      inp_fport  /* for KAME src sync over BSD*'s */ 
 375 #define in6p_ppcb       inp_ppcb  /* for KAME src sync over BSD*'s */ 
 376 #define in6p_state      inp_state 
 377 #define in6p_wantcnt    inp_wantcnt 
 379 #ifdef KERNEL_PRIVATE 
 381         LIST_ENTRY(inpcbport
) phd_hash
; 
 382         struct inpcbhead phd_pcblist
; 
 386 struct inpcbinfo 
{              /* XXX documentation, prefixes */ 
 387         struct  inpcbhead 
*hashbase
; 
 389         u_long  hashsize
; /* in elements */ 
 392         struct  inpcbporthead 
*porthashbase
; 
 394         struct  inpcbhead 
*listhead
; 
 398         void   *ipi_zone
; /* zone to allocate pcbs from */ 
 399         u_int   ipi_count
;      /* number of pcbs in this list */ 
 400         u_quad_t ipi_gencnt
;    /* current generation count */ 
 403         struct  socket nat_dummy_socket
; /* fake socket for NAT pcb backpointer */ 
 404         struct  inpcb 
*nat_dummy_pcb
;    /* fake pcb for finding NAT mutex */ 
 406 #ifdef _KERN_LOCKS_H_ 
 407         lck_attr_t              
*mtx_attr
;              /* mutex attributes */ 
 408         lck_grp_t                       
*mtx_grp
;                       /* mutex group definition */ 
 409         lck_grp_attr_t  
*mtx_grp_attr
;  /* mutex group attributes */ 
 410         lck_rw_t                        
*mtx
;                   /* global mutex for the pcblist*/ 
 412         void    *mtx_attr
;      /* mutex attributes */ 
 413         void    *mtx_grp
;       /* mutex group definition */ 
 414         void    *mtx_grp_attr
;  /* mutex group attributes */ 
 415         void    *mtx
;           /* global mutex for the pcblist*/ 
 420 #define INP_PCBHASH(faddr, lport, fport, mask) \ 
 421         (((faddr) ^ ((faddr) >> 16) ^ ntohs((lport) ^ (fport))) & (mask)) 
 422 #define INP_PCBPORTHASH(lport, mask) \ 
 423         (ntohs((lport)) & (mask)) 
 425 #endif /* KERNEL_PRIVATE */ 
 427 /* flags in inp_flags: */ 
 428 #define INP_RECVOPTS            0x01    /* receive incoming IP options */ 
 429 #define INP_RECVRETOPTS         0x02    /* receive IP options for reply */ 
 430 #define INP_RECVDSTADDR         0x04    /* receive IP dst address */ 
 431 #define INP_HDRINCL             0x08    /* user supplies entire IP header */ 
 432 #define INP_HIGHPORT            0x10    /* user wants "high" port binding */ 
 433 #define INP_LOWPORT             0x20    /* user wants "low" port binding */ 
 434 #define INP_ANONPORT            0x40    /* port chosen for user */ 
 435 #define INP_RECVIF              0x80    /* receive incoming interface */ 
 436 #define INP_MTUDISC             0x100   /* user can do MTU discovery */ 
 438 #define INP_STRIPHDR            0x200   /* Strip headers in raw_ip, for OT support */ 
 440 #define  INP_FAITH                      0x400   /* accept FAITH'ed connections */ 
 441 #define  INP_INADDR_ANY         0x800   /* local address wasn't specified */ 
 443 #define INP_RECVTTL             0x1000 
 444 #define INP_UDP_NOCKSUM         0x2000  /* Turn off outbound UDP checksum */ 
 445 #define INP_BOUND_IF            0x4000  /* bind socket to an ifindex */ 
 447 #define IN6P_IPV6_V6ONLY        0x008000 /* restrict AF_INET6 socket for v6 */ 
 449 #define IN6P_PKTINFO            0x010000 /* receive IP6 dst and I/F */ 
 450 #define IN6P_HOPLIMIT           0x020000 /* receive hoplimit */ 
 451 #define IN6P_HOPOPTS            0x040000 /* receive hop-by-hop options */ 
 452 #define IN6P_DSTOPTS            0x080000 /* receive dst options after rthdr */ 
 453 #define IN6P_RTHDR              0x100000 /* receive routing header */ 
 454 #define IN6P_RTHDRDSTOPTS       0x200000 /* receive dstoptions before rthdr */ 
 455 #define IN6P_AUTOFLOWLABEL      0x800000 /* attach flowlabel automatically */ 
 456 #define IN6P_BINDV6ONLY         0x10000000 /* do not grab IPv4 traffic */ 
 458 #ifdef KERNEL_PRIVATE 
 459 #define INP_CONTROLOPTS         (INP_RECVOPTS|INP_RECVRETOPTS|INP_RECVDSTADDR|\ 
 461                                  IN6P_PKTINFO|IN6P_HOPLIMIT|IN6P_HOPOPTS|\ 
 462                                  IN6P_DSTOPTS|IN6P_RTHDR|IN6P_RTHDRDSTOPTS|\ 
 463                                  IN6P_AUTOFLOWLABEL|INP_RECVTTL) 
 464 #define INP_UNMAPPABLEOPTS      (IN6P_HOPOPTS|IN6P_DSTOPTS|IN6P_RTHDR|\ 
 467  /* for KAME src sync over BSD*'s */ 
 468 #define IN6P_HIGHPORT           INP_HIGHPORT 
 469 #define IN6P_LOWPORT            INP_LOWPORT 
 470 #define IN6P_ANONPORT           INP_ANONPORT 
 471 #define IN6P_RECVIF             INP_RECVIF 
 472 #define IN6P_MTUDISC            INP_MTUDISC 
 473 #define IN6P_FAITH              INP_FAITH 
 474 #define IN6P_CONTROLOPTS INP_CONTROLOPTS 
 476          * socket AF version is {newer than,or include} 
 477          * actual datagram AF version 
 480 #define INPLOOKUP_WILDCARD      1 
 482 #define INPCB_ALL_OWNERS        0xff 
 483 #define INPCB_NO_OWNER          0x0 
 484 #define INPCB_OWNED_BY_X        0x80 
 485 #define INPCB_MAX_IDS           7 
 486 #endif /* __APPLE__ */ 
 488 #define sotoinpcb(so)   ((struct inpcb *)(so)->so_pcb) 
 489 #define sotoin6pcb(so)  sotoinpcb(so) /* for KAME src sync over BSD*'s */ 
 491 #define INP_SOCKAF(so) so->so_proto->pr_domain->dom_family 
 493 #define INP_CHECK_SOCKAF(so, af)        (INP_SOCKAF(so) == af) 
 496 extern int      ipport_lowfirstauto
; 
 497 extern int      ipport_lowlastauto
; 
 498 extern int      ipport_firstauto
; 
 499 extern int      ipport_lastauto
; 
 500 extern int      ipport_hifirstauto
; 
 501 extern int      ipport_hilastauto
; 
 503 #define INPCB_STATE_INUSE       0x1     /* freshly allocated PCB, it's in use */ 
 504 #define INPCB_STATE_CACHED      0x2     /* this pcb is sitting in a a cache */ 
 505 #define INPCB_STATE_DEAD        0x3     /* should treat as gone, will be garbage collected and freed */ 
 507 #define WNT_STOPUSING   0xffff  /* marked as ready to be garbaged collected, should be treated as not found */ 
 508 #define WNT_ACQUIRE     0x1             /* that pcb is being acquired, do not recycle this time */ 
 509 #define WNT_RELEASE     0x2             /* release acquired mode, can be garbage collected when wantcnt is null */ 
 512 void    in_pcbpurgeif0(struct inpcb 
*, struct ifnet 
*); 
 513 void    in_losing(struct inpcb 
*); 
 514 void    in_rtchange(struct inpcb 
*, int); 
 515 int     in_pcballoc(struct socket 
*, struct inpcbinfo 
*, struct proc 
*); 
 516 int     in_pcbbind(struct inpcb 
*, struct sockaddr 
*, struct proc 
*); 
 517 int     in_pcbconnect(struct inpcb 
*, struct sockaddr 
*, struct proc 
*); 
 518 void    in_pcbdetach(struct inpcb 
*); 
 519 void    in_pcbdispose (struct inpcb 
*); 
 520 void    in_pcbdisconnect(struct inpcb 
*); 
 521 int     in_pcbinshash(struct inpcb 
*, int); 
 522 int     in_pcbladdr(struct inpcb 
*, struct sockaddr 
*, struct sockaddr_in 
**); 
 524         in_pcblookup_local(struct inpcbinfo 
*, struct in_addr
, u_int
, int); 
 526         in_pcblookup_local_and_cleanup(struct inpcbinfo 
*, struct in_addr
, u_int
, int); 
 528         in_pcblookup_hash(struct inpcbinfo 
*, 
 529                                struct in_addr
, u_int
, struct in_addr
, u_int
, 
 530                                int, struct ifnet 
*); 
 531 void    in_pcbnotifyall(struct inpcbinfo 
*, struct in_addr
, 
 532             int, void (*)(struct inpcb 
*, int)); 
 533 void    in_pcbrehash(struct inpcb 
*); 
 534 int     in_setpeeraddr(struct socket 
*so
, struct sockaddr 
**nam
); 
 535 int     in_setsockaddr(struct socket 
*so
, struct sockaddr 
**nam
); 
 536 int     in_pcb_checkstate(struct inpcb 
*pcb
, int mode
, int locked
); 
 539 in_pcb_grab_port (struct inpcbinfo 
*pcbinfo
, 
 541                        struct in_addr   laddr
,  
 543                        struct in_addr   faddr
, 
 549 in_pcb_letgo_port(struct inpcbinfo 
*pcbinfo
,  
 550                        struct in_addr laddr
,  
 552                        struct in_addr faddr
, 
 553                        u_short fport
, u_char owner_id
); 
 556 in_pcb_get_owner(struct inpcbinfo 
*pcbinfo
,  
 557                       struct in_addr laddr
,  
 559                       struct in_addr faddr
, 
 563 void in_pcb_nat_init(struct inpcbinfo 
*pcbinfo
, int afamily
, int pfamily
, 
 567 in_pcb_new_share_client(struct inpcbinfo 
*pcbinfo
, u_char 
*owner_id
); 
 570 in_pcb_rem_share_client(struct inpcbinfo 
*pcbinfo
, u_char owner_id
); 
 572 void    in_pcbremlists(struct inpcb 
*inp
); 
 573 int     in_pcb_ckeckstate(struct inpcb 
*, int, int); 
 574 void    inpcb_to_compat(struct inpcb 
*inp
, struct inpcb_compat 
*inp_compat
); 
 577 #endif /* KERNEL_PRIVATE */ 
 579 #endif /* !_NETINET_IN_PCB_H_ */