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/kern/uipc_domain.c

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 /*
    2  * Copyright (c) 1982, 1986, 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  * 3. All advertising materials mentioning features or use of this software
   14  *    must display the following acknowledgement:
   15  *      This product includes software developed by the University of
   16  *      California, Berkeley and its contributors.
   17  * 4. Neither the name of the University nor the names of its contributors
   18  *    may be used to endorse or promote products derived from this software
   19  *    without specific prior written permission.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   31  * SUCH DAMAGE.
   32  *
   33  *      @(#)uipc_domain.c       8.2 (Berkeley) 10/18/93
   34  * $FreeBSD: src/sys/kern/uipc_domain.c,v 1.14.2.1 1999/09/05 08:15:31 peter Exp $
   35  */
   36 
   37 #include <sys/param.h>
   38 #include <sys/socket.h>
   39 #include <sys/protosw.h>
   40 #include <sys/domain.h>
   41 #include <sys/mbuf.h>
   42 #include <sys/kernel.h>
   43 #include <sys/systm.h>
   44 
   45 /*
   46  * System initialization
   47  *
   48  * Note: domain initialization wants to take place on a per domain basis
   49  * as a result of traversing a linker set.  Most likely, each domain
   50  * want to call a registration function rather than being handled here
   51  * in domaininit().  Probably this will look like:
   52  *
   53  * SYSINIT(unique, SI_SUB_PROTO_DOMAI, SI_ORDER_ANY, domain_add, xxx)
   54  *
   55  * Where 'xxx' is replaced by the address of a parameter struct to be
   56  * passed to the doamin_add() function.
   57  */
   58 
   59 static int      x_save_spl;                     /* used by kludge*/
   60 static void kludge_splimp __P((void *));
   61 static void kludge_splx __P((void *));
   62 static void domaininit __P((void *));
   63 SYSINIT(splimp, SI_SUB_PROTO_BEGIN, SI_ORDER_FIRST, kludge_splimp, &x_save_spl)
   64 SYSINIT(domain, SI_SUB_PROTO_DOMAIN, SI_ORDER_FIRST, domaininit, NULL)
   65 SYSINIT(splx, SI_SUB_PROTO_END, SI_ORDER_FIRST, kludge_splx, &x_save_spl)
   66 
   67 static void     pffasttimo __P((void *));
   68 static void     pfslowtimo __P((void *));
   69 
   70 struct domain *domains;
   71 
   72 #define ADDDOMAIN(x)    { \
   73         __CONCAT(x,domain.dom_next) = domains; \
   74         domains = &__CONCAT(x,domain); \
   75 }
   76 
   77 extern struct linker_set domain_set;
   78 
   79 /* ARGSUSED*/
   80 static void
   81 domaininit(dummy)
   82         void *dummy;
   83 {
   84         register struct domain *dp, **dpp;
   85         register struct protosw *pr;
   86 
   87         /*
   88          * NB - local domain is always present.
   89          */
   90         ADDDOMAIN(local);
   91 
   92         for (dpp = (struct domain **)domain_set.ls_items; *dpp; dpp++) {
   93                 (**dpp).dom_next = domains;
   94                 domains = *dpp;
   95         }
   96 
   97 /* - not in our sources
   98 #ifdef ISDN
   99         ADDDOMAIN(isdn);
  100 #endif
  101 */
  102 
  103         for (dp = domains; dp; dp = dp->dom_next) {
  104                 if (dp->dom_init)
  105                         (*dp->dom_init)();
  106                 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++){
  107 #ifdef PRU_OLDSTYLE
  108                         /* See comments in uipc_socket2.c. */
  109                         if (pr->pr_usrreqs == 0 && pr->pr_ousrreq)
  110                                 pr->pr_usrreqs = &pru_oldstyle;
  111 #endif
  112                         if (pr->pr_init)
  113                                 (*pr->pr_init)();
  114                 }
  115         }
  116 
  117         if (max_linkhdr < 16)           /* XXX */
  118                 max_linkhdr = 16;
  119         max_hdr = max_linkhdr + max_protohdr;
  120         max_datalen = MHLEN - max_hdr;
  121         timeout(pffasttimo, (void *)0, 1);
  122         timeout(pfslowtimo, (void *)0, 1);
  123 }
  124 
  125 
  126 /*
  127  * The following two operations are kludge code.  Most likely, they should
  128  * be done as a "domainpreinit()" for the first function and then rolled
  129  * in as the last act of "domaininit()" for the second.
  130  *
  131  * In point of fact, it is questionable why other initialization prior
  132  * to this does not also take place at splimp by default.
  133  */
  134 static void
  135 kludge_splimp(udata)
  136         void *udata;
  137 {
  138         int     *savesplp = udata;
  139 
  140         *savesplp = splimp();
  141 }
  142 
  143 static void
  144 kludge_splx(udata)
  145         void *udata;
  146 {
  147         int     *savesplp = udata;
  148 
  149         splx( *savesplp);
  150 }
  151 
  152 
  153 
  154 struct protosw *
  155 pffindtype(int family, int type)
  156 {
  157         register struct domain *dp;
  158         register struct protosw *pr;
  159 
  160         for (dp = domains; dp; dp = dp->dom_next)
  161                 if (dp->dom_family == family)
  162                         goto found;
  163         return (0);
  164 found:
  165         for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  166                 if (pr->pr_type && pr->pr_type == type)
  167                         return (pr);
  168         return (0);
  169 }
  170 
  171 struct protosw *
  172 pffindproto(int family, int protocol, int type)
  173 {
  174         register struct domain *dp;
  175         register struct protosw *pr;
  176         struct protosw *maybe = 0;
  177 
  178         if (family == 0)
  179                 return (0);
  180         for (dp = domains; dp; dp = dp->dom_next)
  181                 if (dp->dom_family == family)
  182                         goto found;
  183         return (0);
  184 found:
  185         for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
  186                 if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
  187                         return (pr);
  188 
  189                 if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
  190                     pr->pr_protocol == 0 && maybe == (struct protosw *)0)
  191                         maybe = pr;
  192         }
  193         return (maybe);
  194 }
  195 
  196 void
  197 pfctlinput(cmd, sa)
  198         int cmd;
  199         struct sockaddr *sa;
  200 {
  201         register struct domain *dp;
  202         register struct protosw *pr;
  203 
  204         for (dp = domains; dp; dp = dp->dom_next)
  205                 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  206                         if (pr->pr_ctlinput)
  207                                 (*pr->pr_ctlinput)(cmd, sa, (void *)0);
  208 }
  209 
  210 static void
  211 pfslowtimo(arg)
  212         void *arg;
  213 {
  214         register struct domain *dp;
  215         register struct protosw *pr;
  216 
  217         for (dp = domains; dp; dp = dp->dom_next)
  218                 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  219                         if (pr->pr_slowtimo)
  220                                 (*pr->pr_slowtimo)();
  221         timeout(pfslowtimo, (void *)0, hz/2);
  222 }
  223 
  224 static void
  225 pffasttimo(arg)
  226         void *arg;
  227 {
  228         register struct domain *dp;
  229         register struct protosw *pr;
  230 
  231         for (dp = domains; dp; dp = dp->dom_next)
  232                 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  233                         if (pr->pr_fasttimo)
  234                                 (*pr->pr_fasttimo)();
  235         timeout(pffasttimo, (void *)0, hz/5);
  236 }

Cache object: a86733848418cfea7d6d969a4d2d422d


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