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/sys/socketvar.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 /*      $NetBSD: socketvar.h,v 1.165 2022/04/09 23:52:23 riastradh Exp $        */
    2 
    3 /*-
    4  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
    5  * All rights reserved.
    6  *
    7  * This code is derived from software contributed to The NetBSD Foundation
    8  * by Andrew Doran.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   29  * POSSIBILITY OF SUCH DAMAGE.
   30  */
   31 
   32 /*-
   33  * Copyright (c) 1982, 1986, 1990, 1993
   34  *      The Regents of the University of California.  All rights reserved.
   35  *
   36  * Redistribution and use in source and binary forms, with or without
   37  * modification, are permitted provided that the following conditions
   38  * are met:
   39  * 1. Redistributions of source code must retain the above copyright
   40  *    notice, this list of conditions and the following disclaimer.
   41  * 2. Redistributions in binary form must reproduce the above copyright
   42  *    notice, this list of conditions and the following disclaimer in the
   43  *    documentation and/or other materials provided with the distribution.
   44  * 3. 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.
   47  *
   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
   58  * SUCH DAMAGE.
   59  *
   60  *      @(#)socketvar.h 8.3 (Berkeley) 2/19/95
   61  */
   62 
   63 #ifndef _SYS_SOCKETVAR_H_
   64 #define _SYS_SOCKETVAR_H_
   65 
   66 #include <sys/select.h>
   67 #include <sys/selinfo.h>                /* for struct selinfo */
   68 #include <sys/queue.h>
   69 #include <sys/mutex.h>
   70 #include <sys/condvar.h>
   71 
   72 #if !defined(_KERNEL)
   73 struct uio;
   74 struct lwp;
   75 struct uidinfo;
   76 #else
   77 #include <sys/atomic.h>
   78 #include <sys/uidinfo.h>
   79 #endif
   80 
   81 TAILQ_HEAD(soqhead, socket);
   82 
   83 /*
   84  * Variables for socket buffering.
   85  */
   86 struct sockbuf {
   87         struct selinfo sb_sel;          /* process selecting read/write */
   88         struct mowner *sb_mowner;       /* who owns data for this sockbuf */
   89         struct socket *sb_so;           /* back pointer to socket */
   90         kcondvar_t sb_cv;               /* notifier */
   91         /* When re-zeroing this struct, we zero from sb_startzero to the end */
   92 #define sb_startzero    sb_cc
   93         u_long  sb_cc;                  /* actual chars in buffer */
   94         u_long  sb_hiwat;               /* max actual char count */
   95         u_long  sb_mbcnt;               /* chars of mbufs used */
   96         u_long  sb_mbmax;               /* max chars of mbufs to use */
   97         u_long  sb_lowat;               /* low water mark */
   98         struct mbuf *sb_mb;             /* the mbuf chain */
   99         struct mbuf *sb_mbtail;         /* the last mbuf in the chain */
  100         struct mbuf *sb_lastrecord;     /* first mbuf of last record in
  101                                            socket buffer */
  102         int     sb_flags;               /* flags, see below */
  103         int     sb_timeo;               /* timeout for read/write */
  104         u_long  sb_overflowed;          /* # of drops due to full buffer */
  105 };
  106 
  107 #ifndef SB_MAX
  108 #define SB_MAX          (256*1024)      /* default for max chars in sockbuf */
  109 #endif
  110 
  111 #define SB_LOCK         0x01            /* lock on data queue */
  112 #define SB_NOTIFY       0x04            /* someone is waiting for data/space */
  113 #define SB_ASYNC        0x10            /* ASYNC I/O, need signals */
  114 #define SB_UPCALL       0x20            /* someone wants an upcall */
  115 #define SB_NOINTR       0x40            /* operations not interruptible */
  116 #define SB_KNOTE        0x100           /* kernel note attached */
  117 #define SB_AUTOSIZE     0x800           /* automatically size socket buffer */
  118 
  119 /*
  120  * Kernel structure per socket.
  121  * Contains send and receive buffer queues,
  122  * handle on protocol and pointer to protocol
  123  * private data and error information.
  124  */
  125 struct so_accf {
  126         struct accept_filter    *so_accept_filter;
  127         void    *so_accept_filter_arg;  /* saved filter args */
  128         char    *so_accept_filter_str;  /* saved user args */
  129 };
  130 
  131 struct sockaddr;
  132 
  133 struct socket {
  134         kmutex_t * volatile so_lock;    /* pointer to lock on structure */
  135         kcondvar_t      so_cv;          /* notifier */
  136         short           so_type;        /* generic type, see socket.h */
  137         short           so_options;     /* from socket call, see socket.h */
  138         u_short         so_linger;      /* time to linger while closing */
  139         short           so_state;       /* internal state flags SS_*, below */
  140         int             so_unused;      /* used to be so_nbio */
  141         void            *so_pcb;        /* protocol control block */
  142         const struct protosw *so_proto; /* protocol handle */
  143 /*
  144  * Variables for connection queueing.
  145  * Socket where accepts occur is so_head in all subsidiary sockets.
  146  * If so_head is 0, socket is not related to an accept.
  147  * For head socket so_q0 queues partially completed connections,
  148  * while so_q is a queue of connections ready to be accepted.
  149  * If a connection is aborted and it has so_head set, then
  150  * it has to be pulled out of either so_q0 or so_q.
  151  * We allow connections to queue up based on current queue lengths
  152  * and limit on number of queued connections for this socket.
  153  */
  154         struct socket   *so_head;       /* back pointer to accept socket */
  155         struct soqhead  *so_onq;        /* queue (q or q0) that we're on */
  156         struct soqhead  so_q0;          /* queue of partial connections */
  157         struct soqhead  so_q;           /* queue of incoming connections */
  158         TAILQ_ENTRY(socket) so_qe;      /* our queue entry (q or q0) */
  159         short           so_q0len;       /* partials on so_q0 */
  160         short           so_qlen;        /* number of connections on so_q */
  161         short           so_qlimit;      /* max number queued connections */
  162         short           so_timeo;       /* connection timeout */
  163         u_short         so_error;       /* error affecting connection */
  164         u_short         so_rerror;      /* error affecting receiving */
  165         u_short         so_aborting;    /* references from soabort() */
  166         pid_t           so_pgid;        /* pgid for signals */
  167         u_long          so_oobmark;     /* chars to oob mark */
  168         struct sockbuf  so_snd;         /* send buffer */
  169         struct sockbuf  so_rcv;         /* receive buffer */
  170 
  171         void            *so_internal;   /* Space for svr4 stream data */
  172         void            (*so_upcall) (struct socket *, void *, int, int);
  173         void *          so_upcallarg;   /* Arg for above */
  174         int             (*so_send) (struct socket *, struct sockaddr *,
  175                                         struct uio *, struct mbuf *,
  176                                         struct mbuf *, int, struct lwp *);
  177         int             (*so_receive) (struct socket *,
  178                                         struct mbuf **,
  179                                         struct uio *, struct mbuf **,
  180                                         struct mbuf **, int *);
  181         struct mowner   *so_mowner;     /* who owns mbufs for this socket */
  182         struct uidinfo  *so_uidinfo;    /* who opened the socket */
  183         gid_t           so_egid;        /* creator effective gid */
  184         pid_t           so_cpid;        /* creator pid */
  185         struct so_accf  *so_accf;
  186         kauth_cred_t    so_cred;        /* socket credentials */
  187 };
  188 
  189 /*
  190  * Socket state bits.
  191  */
  192 #define SS_NOFDREF              0x001   /* no file table ref any more */
  193 #define SS_ISCONNECTED          0x002   /* socket connected to a peer */
  194 #define SS_ISCONNECTING         0x004   /* in process of connecting to peer */
  195 #define SS_ISDISCONNECTING      0x008   /* in process of disconnecting */
  196 #define SS_CANTSENDMORE         0x010   /* can't send more data to peer */
  197 #define SS_CANTRCVMORE          0x020   /* can't receive more data from peer */
  198 #define SS_RCVATMARK            0x040   /* at mark on input */
  199 #define SS_ISABORTING           0x080   /* aborting fd references - close() */
  200 #define SS_RESTARTSYS           0x100   /* restart blocked system calls */
  201 #define SS_POLLRDBAND           0x200   /* poll should return POLLRDBAND */
  202 #define SS_MORETOCOME           0x400   /*
  203                                          * hint from sosend to lower layer;
  204                                          * more data coming
  205                                          */
  206 #define SS_ISDISCONNECTED       0x800   /* socket disconnected from peer */
  207 #define SS_ISAPIPE              0x1000  /* socket is implementing a pipe */
  208 #define SS_NBIO                 0x2000  /* socket is in non blocking I/O */
  209 
  210 #ifdef _KERNEL
  211 
  212 struct accept_filter {
  213         char    accf_name[16];
  214         void    (*accf_callback)
  215                 (struct socket *, void *, int, int);
  216         void *  (*accf_create)
  217                 (struct socket *, char *);
  218         void    (*accf_destroy)
  219                 (struct socket *);
  220         LIST_ENTRY(accept_filter) accf_next;
  221         u_int   accf_refcnt;
  222 };
  223 
  224 struct sockopt {
  225         int             sopt_level;             /* option level */
  226         int             sopt_name;              /* option name */
  227         size_t          sopt_size;              /* data length */
  228         size_t          sopt_retsize;           /* returned data length */
  229         void *          sopt_data;              /* data pointer */
  230         uint8_t         sopt_buf[sizeof(int)];  /* internal storage */
  231 };
  232 
  233 #define SB_EMPTY_FIXUP(sb)                                              \
  234 do {                                                                    \
  235         KASSERT(solocked((sb)->sb_so));                                 \
  236         if ((sb)->sb_mb == NULL) {                                      \
  237                 (sb)->sb_mbtail = NULL;                                 \
  238                 (sb)->sb_lastrecord = NULL;                             \
  239         }                                                               \
  240 } while (/*CONSTCOND*/0)
  241 
  242 extern u_long           sb_max;
  243 extern int              somaxkva;
  244 extern int              sock_loan_thresh;
  245 extern kmutex_t         *softnet_lock;
  246 
  247 struct mbuf;
  248 struct lwp;
  249 struct msghdr;
  250 struct stat;
  251 struct knote;
  252 struct sockaddr_big;
  253 enum uio_seg;
  254 
  255 /* 0x400 is SO_OTIMESTAMP */
  256 #define SOOPT_TIMESTAMP(o)     ((o) & (SO_TIMESTAMP | 0x400))
  257 
  258 /*
  259  * File operations on sockets.
  260  */
  261 int     soo_read(file_t *, off_t *, struct uio *, kauth_cred_t, int);
  262 int     soo_write(file_t *, off_t *, struct uio *, kauth_cred_t, int);
  263 int     soo_fcntl(file_t *, u_int cmd, void *);
  264 int     soo_ioctl(file_t *, u_long cmd, void *);
  265 int     soo_poll(file_t *, int);
  266 int     soo_kqfilter(file_t *, struct knote *);
  267 int     soo_close(file_t *);
  268 int     soo_stat(file_t *, struct stat *);
  269 void    soo_restart(file_t *);
  270 void    sbappend(struct sockbuf *, struct mbuf *);
  271 void    sbappendstream(struct sockbuf *, struct mbuf *);
  272 int     sbappendaddr(struct sockbuf *, const struct sockaddr *, struct mbuf *,
  273             struct mbuf *);
  274 int     sbappendaddrchain(struct sockbuf *, const struct sockaddr *,
  275              struct mbuf *, int);
  276 int     sbappendcontrol(struct sockbuf *, struct mbuf *, struct mbuf *);
  277 void    sbappendrecord(struct sockbuf *, struct mbuf *);
  278 void    sbcheck(struct sockbuf *);
  279 void    sbcompress(struct sockbuf *, struct mbuf *, struct mbuf *);
  280 struct mbuf *
  281         sbcreatecontrol(void *, int, int, int);
  282 struct mbuf *
  283         sbcreatecontrol1(void **, int, int, int, int);
  284 struct mbuf **
  285         sbsavetimestamp(int, struct mbuf **);
  286 void    sbdrop(struct sockbuf *, int);
  287 void    sbdroprecord(struct sockbuf *);
  288 void    sbflush(struct sockbuf *);
  289 void    sbinsertoob(struct sockbuf *, struct mbuf *);
  290 void    sbrelease(struct sockbuf *, struct socket *);
  291 int     sbreserve(struct sockbuf *, u_long, struct socket *);
  292 int     sbwait(struct sockbuf *);
  293 int     sb_max_set(u_long);
  294 void    soinit(void);
  295 void    soinit1(void);
  296 void    soinit2(void);
  297 int     soabort(struct socket *);
  298 int     soaccept(struct socket *, struct sockaddr *);
  299 int     sofamily(const struct socket *);
  300 int     sobind(struct socket *, struct sockaddr *, struct lwp *);
  301 void    socantrcvmore(struct socket *);
  302 void    socantsendmore(struct socket *);
  303 void    soroverflow(struct socket *);
  304 int     soclose(struct socket *);
  305 int     soconnect(struct socket *, struct sockaddr *, struct lwp *);
  306 int     soconnect2(struct socket *, struct socket *);
  307 int     socreate(int, struct socket **, int, int, struct lwp *,
  308                  struct socket *);
  309 int     fsocreate(int, struct socket **, int, int, int *);
  310 int     sodisconnect(struct socket *);
  311 void    sofree(struct socket *);
  312 int     sogetopt(struct socket *, struct sockopt *);
  313 void    sohasoutofband(struct socket *);
  314 void    soisconnected(struct socket *);
  315 void    soisconnecting(struct socket *);
  316 void    soisdisconnected(struct socket *);
  317 void    soisdisconnecting(struct socket *);
  318 int     solisten(struct socket *, int, struct lwp *);
  319 struct socket *
  320         sonewconn(struct socket *, bool);
  321 void    soqinsque(struct socket *, struct socket *, int);
  322 bool    soqremque(struct socket *, int);
  323 int     soreceive(struct socket *, struct mbuf **, struct uio *,
  324             struct mbuf **, struct mbuf **, int *);
  325 int     soreserve(struct socket *, u_long, u_long);
  326 void    sorflush(struct socket *);
  327 int     sosend(struct socket *, struct sockaddr *, struct uio *,
  328             struct mbuf *, struct mbuf *, int, struct lwp *);
  329 int     sosetopt(struct socket *, struct sockopt *);
  330 int     so_setsockopt(struct lwp *, struct socket *, int, int, const void *, size_t);
  331 int     soshutdown(struct socket *, int);
  332 void    sorestart(struct socket *);
  333 void    sowakeup(struct socket *, struct sockbuf *, int);
  334 int     sockargs(struct mbuf **, const void *, size_t, enum uio_seg, int);
  335 int     sopoll(struct socket *, int);
  336 struct  socket *soget(bool);
  337 void    soput(struct socket *);
  338 bool    solocked(const struct socket *);
  339 bool    solocked2(const struct socket *, const struct socket *);
  340 int     sblock(struct sockbuf *, int);
  341 void    sbunlock(struct sockbuf *);
  342 int     sowait(struct socket *, bool, int);
  343 void    solockretry(struct socket *, kmutex_t *);
  344 void    sosetlock(struct socket *);
  345 void    solockreset(struct socket *, kmutex_t *);
  346 
  347 void    sockopt_init(struct sockopt *, int, int, size_t);
  348 void    sockopt_destroy(struct sockopt *);
  349 int     sockopt_set(struct sockopt *, const void *, size_t);
  350 int     sockopt_setint(struct sockopt *, int);
  351 int     sockopt_get(const struct sockopt *, void *, size_t);
  352 int     sockopt_getint(const struct sockopt *, int *);
  353 int     sockopt_setmbuf(struct sockopt *, struct mbuf *);
  354 struct mbuf *sockopt_getmbuf(const struct sockopt *);
  355 
  356 int     copyout_sockname(struct sockaddr *, unsigned int *, int, struct mbuf *);
  357 int     copyout_sockname_sb(struct sockaddr *, unsigned int *,
  358     int , struct sockaddr_big *);
  359 int     copyout_msg_control(struct lwp *, struct msghdr *, struct mbuf *);
  360 void    free_control_mbuf(struct lwp *, struct mbuf *, struct mbuf *);
  361 
  362 int     do_sys_getpeername(int, struct sockaddr *);
  363 int     do_sys_getsockname(int, struct sockaddr *);
  364 
  365 int     do_sys_sendmsg(struct lwp *, int, struct msghdr *, int, register_t *);
  366 int     do_sys_sendmsg_so(struct lwp *, int, struct socket *, file_t *,
  367             struct msghdr *, int, register_t *);
  368 
  369 int     do_sys_recvmsg(struct lwp *, int, struct msghdr *,
  370             struct mbuf **, struct mbuf **, register_t *);
  371 int     do_sys_recvmsg_so(struct lwp *, int, struct socket *,
  372             struct msghdr *mp, struct mbuf **, struct mbuf **, register_t *);
  373 
  374 int     do_sys_bind(struct lwp *, int, struct sockaddr *);
  375 int     do_sys_connect(struct lwp *, int, struct sockaddr *);
  376 int     do_sys_accept(struct lwp *, int, struct sockaddr *, register_t *,
  377             const sigset_t *, int, int);
  378 
  379 int     do_sys_peeloff(struct socket *, void *);
  380 /*
  381  * Inline functions for sockets and socket buffering.
  382  */
  383 
  384 #include <sys/protosw.h>
  385 #include <sys/mbuf.h>
  386 
  387 /*
  388  * Do we need to notify the other side when I/O is possible?
  389  */
  390 static __inline int
  391 sb_notify(struct sockbuf *sb)
  392 {
  393 
  394         KASSERT(solocked(sb->sb_so));
  395 
  396         return sb->sb_flags & (SB_NOTIFY | SB_ASYNC | SB_UPCALL | SB_KNOTE);
  397 }
  398 
  399 /*
  400  * How much space is there in a socket buffer (so->so_snd or so->so_rcv)?
  401  * Since the fields are unsigned, detect overflow and return 0.
  402  */
  403 static __inline u_long
  404 sbspace(const struct sockbuf *sb)
  405 {
  406 
  407         KASSERT(solocked(sb->sb_so));
  408         if (sb->sb_hiwat <= sb->sb_cc || sb->sb_mbmax <= sb->sb_mbcnt)
  409                 return 0;
  410         return lmin(sb->sb_hiwat - sb->sb_cc, sb->sb_mbmax - sb->sb_mbcnt);
  411 }
  412 
  413 static __inline u_long
  414 sbspace_oob(const struct sockbuf *sb)
  415 {
  416         u_long hiwat = sb->sb_hiwat;
  417 
  418         if (hiwat < ULONG_MAX - 1024)
  419                 hiwat += 1024;
  420 
  421         KASSERT(solocked(sb->sb_so));
  422 
  423         if (hiwat <= sb->sb_cc || sb->sb_mbmax <= sb->sb_mbcnt)
  424                 return 0;
  425         return lmin(hiwat - sb->sb_cc, sb->sb_mbmax - sb->sb_mbcnt);
  426 }
  427 
  428 /*
  429  * How much socket buffer space has been used?
  430  */
  431 static __inline u_long
  432 sbused(const struct sockbuf *sb)
  433 {
  434 
  435         KASSERT(solocked(sb->sb_so));
  436         return sb->sb_cc;
  437 }
  438 
  439 /* do we have to send all at once on a socket? */
  440 static __inline int
  441 sosendallatonce(const struct socket *so)
  442 {
  443 
  444         return so->so_proto->pr_flags & PR_ATOMIC;
  445 }
  446 
  447 /* can we read something from so? */
  448 static __inline int
  449 soreadable(const struct socket *so)
  450 {
  451 
  452         KASSERT(solocked(so));
  453 
  454         return so->so_rcv.sb_cc >= so->so_rcv.sb_lowat ||
  455             (so->so_state & SS_CANTRCVMORE) != 0 ||
  456             so->so_qlen != 0 || so->so_error != 0 || so->so_rerror != 0;
  457 }
  458 
  459 /* can we write something to so? */
  460 static __inline int
  461 sowritable(const struct socket *so)
  462 {
  463 
  464         KASSERT(solocked(so));
  465 
  466         return (sbspace(&so->so_snd) >= so->so_snd.sb_lowat &&
  467             ((so->so_state & SS_ISCONNECTED) != 0 ||
  468             (so->so_proto->pr_flags & PR_CONNREQUIRED) == 0)) ||
  469             (so->so_state & SS_CANTSENDMORE) != 0 ||
  470             so->so_error != 0;
  471 }
  472 
  473 /* adjust counters in sb reflecting allocation of m */
  474 static __inline void
  475 sballoc(struct sockbuf *sb, struct mbuf *m)
  476 {
  477 
  478         KASSERT(solocked(sb->sb_so));
  479 
  480         sb->sb_cc += m->m_len;
  481         sb->sb_mbcnt += MSIZE;
  482         if (m->m_flags & M_EXT)
  483                 sb->sb_mbcnt += m->m_ext.ext_size;
  484 }
  485 
  486 /* adjust counters in sb reflecting freeing of m */
  487 static __inline void
  488 sbfree(struct sockbuf *sb, struct mbuf *m)
  489 {
  490 
  491         KASSERT(solocked(sb->sb_so));
  492 
  493         sb->sb_cc -= m->m_len;
  494         sb->sb_mbcnt -= MSIZE;
  495         if (m->m_flags & M_EXT)
  496                 sb->sb_mbcnt -= m->m_ext.ext_size;
  497 }
  498 
  499 static __inline void
  500 sorwakeup(struct socket *so)
  501 {
  502 
  503         KASSERT(solocked(so));
  504 
  505         if (sb_notify(&so->so_rcv))
  506                 sowakeup(so, &so->so_rcv, POLL_IN);
  507 }
  508 
  509 static __inline void
  510 sowwakeup(struct socket *so)
  511 {
  512 
  513         KASSERT(solocked(so));
  514 
  515         if (sb_notify(&so->so_snd))
  516                 sowakeup(so, &so->so_snd, POLL_OUT);
  517 }
  518 
  519 static __inline void
  520 solock(struct socket *so)
  521 {
  522         kmutex_t *lock;
  523 
  524         lock = atomic_load_consume(&so->so_lock);
  525         mutex_enter(lock);
  526         if (__predict_false(lock != atomic_load_relaxed(&so->so_lock)))
  527                 solockretry(so, lock);
  528 }
  529 
  530 static __inline void
  531 sounlock(struct socket *so)
  532 {
  533 
  534         mutex_exit(so->so_lock);
  535 }
  536 
  537 #ifdef SOCKBUF_DEBUG
  538 /*
  539  * SBLASTRECORDCHK: check sb->sb_lastrecord is maintained correctly.
  540  * SBLASTMBUFCHK: check sb->sb_mbtail is maintained correctly.
  541  *
  542  * => panic if the socket buffer is inconsistent.
  543  * => 'where' is used for a panic message.
  544  */
  545 void    sblastrecordchk(struct sockbuf *, const char *);
  546 #define SBLASTRECORDCHK(sb, where)      sblastrecordchk((sb), (where))
  547 
  548 void    sblastmbufchk(struct sockbuf *, const char *);
  549 #define SBLASTMBUFCHK(sb, where)        sblastmbufchk((sb), (where))
  550 #define SBCHECK(sb)                     sbcheck(sb)
  551 #else
  552 #define SBLASTRECORDCHK(sb, where)      /* nothing */
  553 #define SBLASTMBUFCHK(sb, where)        /* nothing */
  554 #define SBCHECK(sb)                     /* nothing */
  555 #endif /* SOCKBUF_DEBUG */
  556 
  557 /* sosend loan */
  558 vaddr_t sokvaalloc(vaddr_t, vsize_t, struct socket *);
  559 void    sokvafree(vaddr_t, vsize_t);
  560 void    soloanfree(struct mbuf *, void *, size_t, void *);
  561 
  562 /*
  563  * Values for socket-buffer-append priority argument to sbappendaddrchain().
  564  * The following flags are reserved for future implementation:
  565  *
  566  *  SB_PRIO_NONE:  honour normal socket-buffer limits.
  567  *
  568  *  SB_PRIO_ONESHOT_OVERFLOW:  if the socket has any space,
  569  *      deliver the entire chain. Intended for large requests
  570  *      that should be delivered in their entirety, or not at all.
  571  *
  572  * SB_PRIO_OVERDRAFT:  allow a small (2*MLEN) overflow, over and
  573  *      aboce normal socket limits. Intended messages indicating
  574  *      buffer overflow in earlier normal/lower-priority messages .
  575  *
  576  * SB_PRIO_BESTEFFORT: Ignore  limits entirely.  Intended only for
  577  *      kernel-generated messages to specially-marked scokets which
  578  *      require "reliable" delivery, nd where the source socket/protocol
  579  *      message generator enforce some hard limit (but possibly well
  580  *      above kern.sbmax). It is entirely up to the in-kernel source to
  581  *      avoid complete mbuf exhaustion or DoS scenarios.
  582  */
  583 #define SB_PRIO_NONE            0
  584 #define SB_PRIO_ONESHOT_OVERFLOW 1
  585 #define SB_PRIO_OVERDRAFT       2
  586 #define SB_PRIO_BESTEFFORT      3
  587 
  588 /*
  589  * Accept filter functions (duh).
  590  */
  591 int     accept_filt_getopt(struct socket *, struct sockopt *);
  592 int     accept_filt_setopt(struct socket *, const struct sockopt *);
  593 int     accept_filt_clear(struct socket *);
  594 int     accept_filt_add(struct accept_filter *);
  595 int     accept_filt_del(struct accept_filter *);
  596 struct  accept_filter *accept_filt_get(char *);
  597 #ifdef ACCEPT_FILTER_MOD
  598 #ifdef SYSCTL_DECL
  599 SYSCTL_DECL(_net_inet_accf);
  600 #endif
  601 void    accept_filter_init(void);
  602 #endif
  603 #ifdef DDB
  604 int sofindproc(struct socket *so, int all, void (*pr)(const char *, ...));
  605 void socket_print(const char *modif, void (*pr)(const char *, ...));
  606 #endif
  607 
  608 #endif /* _KERNEL */
  609 
  610 #endif /* !_SYS_SOCKETVAR_H_ */

Cache object: 3343f4be1b5f2671e7b50abb700198f0


[ 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.