root/kern/uipc_domain.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. domaininit
  2. pffinddomain
  3. pffindtype
  4. pffindproto
  5. net_sysctl
  6. pfctlinput
  7. pfslowtimo
  8. pffasttimo

    1 /*      $OpenBSD: uipc_domain.c,v 1.26 2007/06/06 10:04:36 henning Exp $        */
    2 /*      $NetBSD: uipc_domain.c,v 1.14 1996/02/09 19:00:44 christos Exp $        */
    3 
    4 /*
    5  * Copyright (c) 1982, 1986, 1993
    6  *      The Regents of the University of California.  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 University 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 REGENTS 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 REGENTS 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  *      @(#)uipc_domain.c       8.2 (Berkeley) 10/18/93
   33  */
   34 
   35 #include <sys/param.h>
   36 #include <sys/socket.h>
   37 #include <sys/protosw.h>
   38 #include <sys/domain.h>
   39 #include <sys/mbuf.h>
   40 #include <sys/time.h>
   41 #include <sys/kernel.h>
   42 #include <sys/systm.h>
   43 #include <sys/proc.h>
   44 #include <uvm/uvm_extern.h>
   45 #include <sys/sysctl.h>
   46 #include <sys/timeout.h>
   47 
   48 #include "bluetooth.h"
   49 #include "bpfilter.h"
   50 
   51 struct  domain *domains;
   52 
   53 void            pffasttimo(void *);
   54 void            pfslowtimo(void *);
   55 struct domain * pffinddomain(int);
   56 
   57 #if defined (KEY) || defined (IPSEC) || defined (TCP_SIGNATURE)
   58 int pfkey_init(void);
   59 #endif /* KEY || IPSEC || TCP_SIGNATURE */
   60 
   61 #define ADDDOMAIN(x)    { \
   62         extern struct domain __CONCAT(x,domain); \
   63         __CONCAT(x,domain.dom_next) = domains; \
   64         domains = &__CONCAT(x,domain); \
   65 }
   66 
   67 void
   68 domaininit(void)
   69 {
   70         struct domain *dp;
   71         struct protosw *pr;
   72         static struct timeout pffast_timeout;
   73         static struct timeout pfslow_timeout;
   74 
   75 #undef unix
   76         /*
   77          * KAME NOTE: ADDDOMAIN(route) is moved to the last part so that
   78          * it will be initialized as the *first* element.  confusing!
   79          */
   80 #ifndef lint
   81         ADDDOMAIN(unix);
   82 #ifdef INET
   83         ADDDOMAIN(inet);
   84 #endif
   85 #ifdef INET6
   86         ADDDOMAIN(inet6);
   87 #endif /* INET6 */
   88 #if defined (KEY) || defined (IPSEC) || defined (TCP_SIGNATURE)
   89         pfkey_init();
   90 #endif /* KEY || IPSEC */
   91 #ifdef NETATALK
   92         ADDDOMAIN(atalk);
   93 #endif
   94 #ifdef NATM
   95         ADDDOMAIN(natm);
   96 #endif
   97 #ifdef IPSEC
   98 #ifdef __KAME__
   99         ADDDOMAIN(key);
  100 #endif
  101 #endif
  102 #if NBLUETOOTH > 0
  103         ADDDOMAIN(bt);
  104 #endif
  105         ADDDOMAIN(route);
  106 #endif
  107 
  108         for (dp = domains; dp; dp = dp->dom_next) {
  109                 if (dp->dom_init)
  110                         (*dp->dom_init)();
  111                 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  112                         if (pr->pr_init)
  113                                 (*pr->pr_init)();
  114         }
  115 
  116         if (max_linkhdr < 16)           /* XXX */
  117                 max_linkhdr = 16;
  118         max_hdr = max_linkhdr + max_protohdr;
  119         max_datalen = MHLEN - max_hdr;
  120         timeout_set(&pffast_timeout, pffasttimo, &pffast_timeout);
  121         timeout_set(&pfslow_timeout, pfslowtimo, &pfslow_timeout);
  122         timeout_add(&pffast_timeout, 1);
  123         timeout_add(&pfslow_timeout, 1);
  124 }
  125 
  126 struct domain *
  127 pffinddomain(int family)
  128 {
  129         struct domain *dp;
  130 
  131         for (dp = domains; dp != NULL; dp = dp->dom_next)
  132                 if (dp->dom_family == family)
  133                         return (dp);
  134         return (NULL);
  135 }
  136 
  137 struct protosw *
  138 pffindtype(int family, int type)
  139 {
  140         struct domain *dp;
  141         struct protosw *pr;
  142 
  143         dp = pffinddomain(family);
  144         if (dp == NULL)
  145                 return (NULL);
  146 
  147         for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  148                 if (pr->pr_type && pr->pr_type == type)
  149                         return (pr);
  150         return (NULL);
  151 }
  152 
  153 struct protosw *
  154 pffindproto(int family, int protocol, int type)
  155 {
  156         struct domain *dp;
  157         struct protosw *pr;
  158         struct protosw *maybe = NULL;
  159 
  160         if (family == 0)
  161                 return (NULL);
  162 
  163         dp = pffinddomain(family);
  164         if (dp == NULL)
  165                 return (NULL);
  166 
  167         for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
  168                 if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
  169                         return (pr);
  170 
  171                 if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
  172                     pr->pr_protocol == 0 && maybe == NULL)
  173                         maybe = pr;
  174         }
  175         return (maybe);
  176 }
  177 
  178 int
  179 net_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
  180     size_t newlen, struct proc *p)
  181 {
  182         struct domain *dp;
  183         struct protosw *pr;
  184         int family, protocol;
  185 
  186         /*
  187          * All sysctl names at this level are nonterminal.
  188          * Usually: next two components are protocol family and protocol
  189          *      number, then at least one addition component.
  190          */
  191         if (namelen < 2)
  192                 return (EISDIR);                /* overloaded */
  193         family = name[0];
  194 
  195         if (family == 0)
  196                 return (0);
  197 #if NBPFILTER > 0
  198         if (family == PF_BPF)
  199                 return (bpf_sysctl(name + 1, namelen - 1, oldp, oldlenp,
  200                     newp, newlen));
  201 #endif
  202         dp = pffinddomain(family);
  203         if (dp == NULL)
  204                 return (ENOPROTOOPT);
  205 
  206         if (namelen < 3)
  207                 return (EISDIR);                /* overloaded */
  208         protocol = name[1];
  209         for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  210                 if (pr->pr_protocol == protocol && pr->pr_sysctl)
  211                         return ((*pr->pr_sysctl)(name + 2, namelen - 2,
  212                             oldp, oldlenp, newp, newlen));
  213         return (ENOPROTOOPT);
  214 }
  215 
  216 void
  217 pfctlinput(int cmd, struct sockaddr *sa)
  218 {
  219         struct domain *dp;
  220         struct protosw *pr;
  221 
  222         for (dp = domains; dp; dp = dp->dom_next)
  223                 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  224                         if (pr->pr_ctlinput)
  225                                 (*pr->pr_ctlinput)(cmd, sa, NULL);
  226 }
  227 
  228 void
  229 pfslowtimo(void *arg)
  230 {
  231         struct timeout *to = (struct timeout *)arg;
  232         struct domain *dp;
  233         struct protosw *pr;
  234 
  235         for (dp = domains; dp; dp = dp->dom_next)
  236                 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  237                         if (pr->pr_slowtimo)
  238                                 (*pr->pr_slowtimo)();
  239         timeout_add(to, hz/2);
  240 }
  241 
  242 void
  243 pffasttimo(void *arg)
  244 {
  245         struct timeout *to = (struct timeout *)arg;
  246         struct domain *dp;
  247         struct protosw *pr;
  248 
  249         for (dp = domains; dp; dp = dp->dom_next)
  250                 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
  251                         if (pr->pr_fasttimo)
  252                                 (*pr->pr_fasttimo)();
  253         timeout_add(to, hz/5);
  254 }

/* [<][>][^][v][top][bottom][index][help] */