The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netinet/in_pcb.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $OpenBSD: in_pcb.h,v 1.135 2022/10/03 16:43:52 bluhm Exp $      */
    2 /*      $NetBSD: in_pcb.h,v 1.14 1996/02/13 23:42:00 christos Exp $     */
    3 
    4 /*
    5  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
    6  * All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. Neither the name of the project nor the names of its contributors
   17  *    may be used to endorse or promote products derived from this software
   18  *    without specific prior written permission.
   19  *
   20  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
   21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
   24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   30  * SUCH DAMAGE.
   31  */
   32 
   33 /*
   34  * Copyright (c) 1982, 1986, 1990, 1993
   35  *      The Regents of the University of California.  All rights reserved.
   36  *
   37  * Redistribution and use in source and binary forms, with or without
   38  * modification, are permitted provided that the following conditions
   39  * are met:
   40  * 1. Redistributions of source code must retain the above copyright
   41  *    notice, this list of conditions and the following disclaimer.
   42  * 2. Redistributions in binary form must reproduce the above copyright
   43  *    notice, this list of conditions and the following disclaimer in the
   44  *    documentation and/or other materials provided with the distribution.
   45  * 3. Neither the name of the University nor the names of its contributors
   46  *    may be used to endorse or promote products derived from this software
   47  *    without specific prior written permission.
   48  *
   49  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   50  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   51  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   52  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   53  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   54  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   55  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   56  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   57  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   58  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   59  * SUCH DAMAGE.
   60  *
   61  *      @(#)in_pcb.h    8.1 (Berkeley) 6/10/93
   62  */
   63 
   64 #ifndef _NETINET_IN_PCB_H_
   65 #define _NETINET_IN_PCB_H_
   66 
   67 #include <sys/queue.h>
   68 #include <sys/mutex.h>
   69 #include <sys/rwlock.h>
   70 #include <sys/refcnt.h>
   71 #include <netinet/ip6.h>
   72 #include <netinet6/ip6_var.h>
   73 #include <netinet/icmp6.h>
   74 #include <netinet/ip_ipsp.h>
   75 
   76 #include <crypto/siphash.h>
   77 
   78 /*
   79  * Locks used to protect struct members in this file:
   80  *      I       immutable after creation
   81  *      N       net lock
   82  *      t       inpt_mtx                pcb table mutex
   83  *      y       inpt_notify             pcb table rwlock for notify
   84  *      p       inpcb_mtx               pcb mutex
   85  */
   86 
   87 struct pf_state_key;
   88 
   89 union inpaddru {
   90         struct in6_addr iau_addr6;
   91         struct {
   92                 uint8_t pad[12];
   93                 struct in_addr inaddr;  /* easier transition */
   94         } iau_a4u;
   95 };
   96 
   97 /*
   98  * Common structure pcb for internet protocol implementation.
   99  * Here are stored pointers to local and foreign host table
  100  * entries, local and foreign socket numbers, and pointers
  101  * up (to a socket structure) and down (to a protocol-specific)
  102  * control block.
  103  */
  104 struct inpcb {
  105         LIST_ENTRY(inpcb) inp_hash;             /* [t] local and foreign hash */
  106         LIST_ENTRY(inpcb) inp_lhash;            /* [t] local port hash */
  107         TAILQ_ENTRY(inpcb) inp_queue;           /* [t] inet PCB queue */
  108         SIMPLEQ_ENTRY(inpcb) inp_notify;        /* [y] notify or udp append */
  109         struct    inpcbtable *inp_table;        /* [I] inet queue/hash table */
  110         union     inpaddru inp_faddru;          /* Foreign address. */
  111         union     inpaddru inp_laddru;          /* Local address. */
  112 #define inp_faddr       inp_faddru.iau_a4u.inaddr
  113 #define inp_faddr6      inp_faddru.iau_addr6
  114 #define inp_laddr       inp_laddru.iau_a4u.inaddr
  115 #define inp_laddr6      inp_laddru.iau_addr6
  116         u_int16_t inp_fport;            /* foreign port */
  117         u_int16_t inp_lport;            /* local port */
  118         struct    socket *inp_socket;   /* back pointer to socket */
  119         caddr_t   inp_ppcb;             /* pointer to per-protocol pcb */
  120         union {                         /* Route (notice increased size). */
  121                 struct route ru_route;
  122                 struct route_in6 ru_route6;
  123         } inp_ru;
  124 #define inp_route       inp_ru.ru_route
  125 #define inp_route6      inp_ru.ru_route6
  126         struct    refcnt inp_refcnt;    /* refcount PCB, delay memory free */
  127         struct    mutex inp_mtx;        /* protect PCB and socket members */
  128         int       inp_flags;            /* generic IP/datagram flags */
  129         union {                         /* Header prototype. */
  130                 struct ip hu_ip;
  131                 struct ip6_hdr hu_ipv6;
  132         } inp_hu;
  133 #define inp_ip          inp_hu.hu_ip
  134 #define inp_ipv6        inp_hu.hu_ipv6
  135         struct    mbuf *inp_options;    /* IP options */
  136         struct ip6_pktopts *inp_outputopts6; /* IP6 options for outgoing packets */
  137         int inp_hops;
  138         union {
  139                 struct ip_moptions *mou_mo;    /* IPv4 multicast options */
  140                 struct ip6_moptions *mou_mo6; /* IPv6 multicast options */
  141         } inp_mou;
  142 #define inp_moptions inp_mou.mou_mo
  143 #define inp_moptions6 inp_mou.mou_mo6
  144         u_char    inp_seclevel[4];
  145 #define SL_AUTH           0             /* Authentication level */
  146 #define SL_ESP_TRANS      1             /* ESP transport level */
  147 #define SL_ESP_NETWORK    2             /* ESP network (encapsulation) level */
  148 #define SL_IPCOMP         3             /* Compression level */
  149         u_char  inp_ip_minttl;          /* minimum TTL or drop */
  150 #define inp_ip6_minhlim inp_ip_minttl   /* minimum Hop Limit or drop */
  151 #define inp_flowinfo    inp_hu.hu_ipv6.ip6_flow
  152 
  153         int     inp_cksum6;
  154 #ifndef _KERNEL
  155 #define inp_csumoffset  inp_cksum6
  156 #endif
  157         struct  icmp6_filter *inp_icmp6filt;
  158         struct  pf_state_key *inp_pf_sk;
  159         struct  mbuf *(*inp_upcall)(void *, struct mbuf *,
  160                     struct ip *, struct ip6_hdr *, void *, int);
  161         void    *inp_upcall_arg;
  162         u_int   inp_rtableid;
  163         int     inp_pipex;              /* pipex indication */
  164         uint16_t inp_flowid;
  165 };
  166 
  167 LIST_HEAD(inpcbhead, inpcb);
  168 
  169 struct inpcbtable {
  170         struct mutex inpt_mtx;                  /* protect queue and hash */
  171         struct rwlock inpt_notify;              /* protect inp_notify list */
  172         TAILQ_HEAD(inpthead, inpcb) inpt_queue; /* [t] inet PCB queue */
  173         struct  inpcbhead *inpt_hashtbl;        /* [t] local and foreign hash */
  174         struct  inpcbhead *inpt_lhashtbl;       /* [t] local port hash */
  175         SIPHASH_KEY inpt_key, inpt_lkey;        /* [t] secrets for hashes */
  176         u_long  inpt_mask, inpt_lmask;          /* [t] hash masks */
  177         int     inpt_count, inpt_size;          /* [t] queue count, hash size */
  178 };
  179 
  180 /* flags in inp_flags: */
  181 #define INP_RECVOPTS    0x001   /* receive incoming IP options */
  182 #define INP_RECVRETOPTS 0x002   /* receive IP options for reply */
  183 #define INP_RECVDSTADDR 0x004   /* receive IP dst address */
  184 
  185 #define INP_RXDSTOPTS   INP_RECVOPTS
  186 #define INP_RXHOPOPTS   INP_RECVRETOPTS
  187 #define INP_RXINFO      INP_RECVDSTADDR
  188 #define INP_RXSRCRT     0x010
  189 #define INP_HOPLIMIT    0x020
  190 
  191 #define INP_HDRINCL     0x008   /* user supplies entire IP header */
  192 #define INP_HIGHPORT    0x010   /* user wants "high" port binding */
  193 #define INP_LOWPORT     0x020   /* user wants "low" port binding */
  194 #define INP_RECVIF      0x080   /* receive incoming interface */
  195 #define INP_RECVTTL     0x040   /* receive incoming IP TTL */
  196 #define INP_RECVDSTPORT 0x200   /* receive IP dst addr before rdr */
  197 #define INP_RECVRTABLE  0x400   /* receive routing table */
  198 #define INP_IPSECFLOWINFO 0x800 /* receive IPsec flow info */
  199 
  200 #define INP_CONTROLOPTS (INP_RECVOPTS|INP_RECVRETOPTS|INP_RECVDSTADDR| \
  201             INP_RXSRCRT|INP_HOPLIMIT|INP_RECVIF|INP_RECVTTL|INP_RECVDSTPORT| \
  202             INP_RECVRTABLE)
  203 
  204 /*
  205  * These flags' values should be determined by either the transport
  206  * protocol at PRU_BIND, PRU_LISTEN, PRU_CONNECT, etc, or by in_pcb*().
  207  */
  208 #define INP_IPV6        0x100   /* sotopf(inp->inp_socket) == PF_INET6 */
  209 
  210 /*
  211  * Flags in inp_flags for IPV6
  212  */
  213 #define IN6P_HIGHPORT           INP_HIGHPORT    /* user wants "high" port */
  214 #define IN6P_LOWPORT            INP_LOWPORT     /* user wants "low" port */
  215 #define IN6P_RECVDSTPORT        INP_RECVDSTPORT /* receive IP dst addr before rdr */
  216 #define IN6P_PKTINFO            0x010000 /* receive IP6 dst and I/F */
  217 #define IN6P_HOPLIMIT           0x020000 /* receive hoplimit */
  218 #define IN6P_HOPOPTS            0x040000 /* receive hop-by-hop options */
  219 #define IN6P_DSTOPTS            0x080000 /* receive dst options after rthdr */
  220 #define IN6P_RTHDR              0x100000 /* receive routing header */
  221 #define IN6P_TCLASS             0x400000 /* receive traffic class value */
  222 #define IN6P_AUTOFLOWLABEL      0x800000 /* attach flowlabel automatically */
  223 
  224 #define IN6P_ANONPORT           0x4000000 /* port chosen for user */
  225 #define IN6P_RFC2292            0x40000000 /* used RFC2292 API on the socket */
  226 #define IN6P_MTU                0x80000000 /* receive path MTU */
  227 
  228 #define IN6P_MINMTU             0x20000000 /* use minimum MTU */
  229 
  230 #define IN6P_CONTROLOPTS        (IN6P_PKTINFO|IN6P_HOPLIMIT|IN6P_HOPOPTS|\
  231                                  IN6P_DSTOPTS|IN6P_RTHDR|\
  232                                  IN6P_TCLASS|IN6P_AUTOFLOWLABEL|IN6P_RFC2292|\
  233                                  IN6P_MTU|IN6P_RECVDSTPORT)
  234 
  235 #define INPLOOKUP_WILDCARD      1
  236 #define INPLOOKUP_SETLOCAL      2
  237 #define INPLOOKUP_IPV6          4
  238 
  239 #define sotoinpcb(so)   ((struct inpcb *)(so)->so_pcb)
  240 
  241 /* macros for handling bitmap of ports not to allocate dynamically */
  242 #define DP_MAPBITS      (sizeof(u_int32_t) * NBBY)
  243 #define DP_MAPSIZE      (howmany(65536, DP_MAPBITS))
  244 #define DP_SET(m, p)    ((m)[(p) / DP_MAPBITS] |= (1U << ((p) % DP_MAPBITS)))
  245 #define DP_CLR(m, p)    ((m)[(p) / DP_MAPBITS] &= ~(1U << ((p) % DP_MAPBITS)))
  246 #define DP_ISSET(m, p)  ((m)[(p) / DP_MAPBITS] & (1U << ((p) % DP_MAPBITS)))
  247 
  248 /* default values for baddynamicports [see ip_init()] */
  249 #define DEFBADDYNAMICPORTS_TCP  { \
  250         587, 749, 750, 751, 853, 871, 2049, \
  251         6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007, 6008, 6009, 6010, \
  252         0 }
  253 #define DEFBADDYNAMICPORTS_UDP  { 623, 664, 749, 750, 751, 2049, \
  254         3784, 3785, 7784, /* BFD/S-BFD ports */ \
  255          0 }
  256 
  257 #define DEFROOTONLYPORTS_TCP { \
  258         2049, \
  259         0 }
  260 #define DEFROOTONLYPORTS_UDP { \
  261         2049, \
  262         0 }
  263 
  264 struct baddynamicports {
  265         u_int32_t tcp[DP_MAPSIZE];
  266         u_int32_t udp[DP_MAPSIZE];
  267 };
  268 
  269 #ifdef _KERNEL
  270 
  271 extern struct inpcbtable rawcbtable, rawin6pcbtable;
  272 extern struct baddynamicports baddynamicports;
  273 extern struct baddynamicports rootonlyports;
  274 extern int in_pcbnotifymiss;
  275 
  276 #define sotopf(so)  (so->so_proto->pr_domain->dom_family)
  277 
  278 void     in_init(void);
  279 void     in_losing(struct inpcb *);
  280 int      in_pcballoc(struct socket *, struct inpcbtable *, int);
  281 int      in_pcbbind(struct inpcb *, struct mbuf *, struct proc *);
  282 int      in_pcbaddrisavail(struct inpcb *, struct sockaddr_in *, int,
  283             struct proc *);
  284 int      in_pcbconnect(struct inpcb *, struct mbuf *);
  285 void     in_pcbdetach(struct inpcb *);
  286 struct inpcb *
  287          in_pcbref(struct inpcb *);
  288 void     in_pcbunref(struct inpcb *);
  289 void     in_pcbdisconnect(struct inpcb *);
  290 struct inpcb *
  291          in_pcblookup(struct inpcbtable *, struct in_addr,
  292                                u_int, struct in_addr, u_int, u_int);
  293 struct inpcb *
  294          in_pcblookup_listen(struct inpcbtable *, struct in_addr, u_int,
  295             struct mbuf *, u_int);
  296 #ifdef INET6
  297 struct inpcbhead *
  298          in6_pcbhash(struct inpcbtable *, u_int, const struct in6_addr *,
  299             u_short, const struct in6_addr *, u_short);
  300 struct inpcb *
  301          in6_pcblookup(struct inpcbtable *, const struct in6_addr *,
  302                                u_int, const struct in6_addr *, u_int, u_int);
  303 struct inpcb *
  304          in6_pcblookup_listen(struct inpcbtable *, struct in6_addr *, u_int,
  305             struct mbuf *, u_int);
  306 int      in6_pcbaddrisavail(struct inpcb *, struct sockaddr_in6 *, int,
  307             struct proc *);
  308 int      in6_pcbconnect(struct inpcb *, struct mbuf *);
  309 void     in6_setsockaddr(struct inpcb *, struct mbuf *);
  310 void     in6_setpeeraddr(struct inpcb *, struct mbuf *);
  311 int      in6_sockaddr(struct socket *, struct mbuf *);
  312 int      in6_peeraddr(struct socket *, struct mbuf *);
  313 #endif /* INET6 */
  314 void     in_pcbinit(struct inpcbtable *, int);
  315 struct inpcb *
  316          in_pcblookup_local(struct inpcbtable *, void *, u_int, int, u_int);
  317 void     in_pcbnotifyall(struct inpcbtable *, struct sockaddr *,
  318             u_int, int, void (*)(struct inpcb *, int));
  319 void     in_pcbrehash(struct inpcb *);
  320 void     in_rtchange(struct inpcb *, int);
  321 void     in_setpeeraddr(struct inpcb *, struct mbuf *);
  322 void     in_setsockaddr(struct inpcb *, struct mbuf *);
  323 int      in_sockaddr(struct socket *, struct mbuf *);
  324 int      in_peeraddr(struct socket *, struct mbuf *);
  325 int      in_baddynamic(u_int16_t, u_int16_t);
  326 int      in_rootonly(u_int16_t, u_int16_t);
  327 int      in_pcbselsrc(struct in_addr *, struct sockaddr_in *, struct inpcb *);
  328 struct rtentry *
  329         in_pcbrtentry(struct inpcb *);
  330 
  331 /* INET6 stuff */
  332 void    in6_pcbnotify(struct inpcbtable *, struct sockaddr_in6 *,
  333         u_int, const struct sockaddr_in6 *, u_int, u_int, int, void *,
  334         void (*)(struct inpcb *, int));
  335 int     in6_selecthlim(struct inpcb *);
  336 int     in_pcbpickport(u_int16_t *, void *, int, struct inpcb *, struct proc *);
  337 #endif /* _KERNEL */
  338 #endif /* _NETINET_IN_PCB_H_ */

Cache object: 25f13f6b751ff5f7e8fd009906a5e2a6


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.