bug fixes for LEASES from Rick Macklem
[unix-history] / usr / src / sys / kern / uipc_domain.c
index ffca28c..5f679c3 100644 (file)
@@ -1,45 +1,70 @@
-/*     uipc_domain.c   5.5     82/11/02        */
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
+ *
+ *     @(#)uipc_domain.c       7.16 (Berkeley) %G%
+ */
 
 
-#include "../h/param.h"
-#include "../h/socket.h"
-#include "../h/protosw.h"
-#include "../h/domain.h"
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/protosw.h>
+#include <sys/domain.h>
+#include <sys/mbuf.h>
+#include <sys/time.h>
+#include <sys/kernel.h>
+#include <sys/proc.h>
+#include <vm/vm.h>
+#include <sys/sysctl.h>
 
 #define        ADDDOMAIN(x)    { \
 
 #define        ADDDOMAIN(x)    { \
-       extern struct domain x/**/domain; \
-       x/**/domain.dom_next = domains; \
-       domains = &x/**/domain; \
+       extern struct domain __CONCAT(x,domain); \
+       __CONCAT(x,domain.dom_next) = domains; \
+       domains = &__CONCAT(x,domain); \
 }
 
 domaininit()
 {
 }
 
 domaininit()
 {
+       register struct domain *dp;
+       register struct protosw *pr;
 
 
+#undef unix
+#ifndef lint
        ADDDOMAIN(unix);
        ADDDOMAIN(unix);
+       ADDDOMAIN(route);
 #ifdef INET
        ADDDOMAIN(inet);
 #endif
 #ifdef INET
        ADDDOMAIN(inet);
 #endif
-#ifdef PUP
-       ADDDOMAIN(pup);
+#ifdef NS
+       ADDDOMAIN(ns);
+#endif
+#ifdef ISO
+       ADDDOMAIN(iso);
 #endif
 #endif
-#ifdef IMP
+#ifdef CCITT
+       ADDDOMAIN(ccitt);
+#endif
+#include "imp.h"
+#if NIMP > 0
        ADDDOMAIN(imp);
 #endif
        ADDDOMAIN(imp);
 #endif
-       pfinit();
-}
-
-/*
- * Operations applying to the sets of protocols
- * defined by the available communications domains.
- */
-pfinit()
-{
-       register struct domain *dp;
-       register struct protosw *pr;
+#endif
 
 
-       for (dp = domains; dp; dp = dp->dom_next)
+       for (dp = domains; dp; dp = dp->dom_next) {
+               if (dp->dom_init)
+                       (*dp->dom_init)();
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_init)
                                (*pr->pr_init)();
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_init)
                                (*pr->pr_init)();
+       }
+
+if (max_linkhdr < 16)          /* XXX */
+max_linkhdr = 16;
+       max_hdr = max_linkhdr + max_protohdr;
+       max_datalen = MHLEN - max_hdr;
+       pffasttimo();
+       pfslowtimo();
 }
 
 struct protosw *
 }
 
 struct protosw *
@@ -55,17 +80,18 @@ pffindtype(family, type)
        return (0);
 found:
        for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
        return (0);
 found:
        for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
-               if (pr->pr_type == type)
+               if (pr->pr_type && pr->pr_type == type)
                        return (pr);
        return (0);
 }
 
 struct protosw *
                        return (pr);
        return (0);
 }
 
 struct protosw *
-pffindproto(family, protocol)
-       int family, protocol;
+pffindproto(family, protocol, type)
+       int family, protocol, type;
 {
        register struct domain *dp;
        register struct protosw *pr;
 {
        register struct domain *dp;
        register struct protosw *pr;
+       struct protosw *maybe = 0;
 
        if (family == 0)
                return (0);
 
        if (family == 0)
                return (0);
@@ -74,15 +100,57 @@ pffindproto(family, protocol)
                        goto found;
        return (0);
 found:
                        goto found;
        return (0);
 found:
-       for (pr = dp->dom_protosw; pr <= dp->dom_protoswNPROTOSW; pr++)
-               if (pr->pr_protocol == protocol)
+       for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
+               if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
                        return (pr);
                        return (pr);
-       return (0);
+
+               if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
+                   pr->pr_protocol == 0 && maybe == (struct protosw *)0)
+                       maybe = pr;
+       }
+       return (maybe);
+}
+
+net_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p)
+       int *name;
+       u_int namelen;
+       void *oldp;
+       size_t *oldlenp;
+       void *newp;
+       size_t newlen;
+       struct proc *p;
+{
+       register struct domain *dp;
+       register struct protosw *pr;
+       int family, protocol;
+
+       /*
+        * All sysctl names at this level are nonterminal;
+        * next two components are protocol family and protocol number,
+        * then at least one addition component.
+        */
+       if (namelen < 3)
+               return (EISDIR);                /* overloaded */
+       family = name[0];
+       protocol = name[1];
+
+       if (family == 0)
+               return (0);
+       for (dp = domains; dp; dp = dp->dom_next)
+               if (dp->dom_family == family)
+                       goto found;
+       return (ENOPROTOOPT);
+found:
+       for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
+               if (pr->pr_protocol == protocol && pr->pr_sysctl)
+                       return ((*pr->pr_sysctl)(name + 2, namelen - 2,
+                           oldp, oldlenp, newp, newlen));
+       return (ENOPROTOOPT);
 }
 
 }
 
-pfctlinput(cmd, arg)
+pfctlinput(cmd, sa)
        int cmd;
        int cmd;
-       caddr_t arg;
+       struct sockaddr *sa;
 {
        register struct domain *dp;
        register struct protosw *pr;
 {
        register struct domain *dp;
        register struct protosw *pr;
@@ -90,7 +158,7 @@ pfctlinput(cmd, arg)
        for (dp = domains; dp; dp = dp->dom_next)
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_ctlinput)
        for (dp = domains; dp; dp = dp->dom_next)
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_ctlinput)
-                               (*pr->pr_ctlinput)(cmd, arg);
+                               (*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0);
 }
 
 pfslowtimo()
 }
 
 pfslowtimo()
@@ -102,6 +170,7 @@ pfslowtimo()
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_slowtimo)
                                (*pr->pr_slowtimo)();
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_slowtimo)
                                (*pr->pr_slowtimo)();
+       timeout(pfslowtimo, (caddr_t)0, hz/2);
 }
 
 pffasttimo()
 }
 
 pffasttimo()
@@ -113,4 +182,5 @@ pffasttimo()
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_fasttimo)
                                (*pr->pr_fasttimo)();
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_fasttimo)
                                (*pr->pr_fasttimo)();
+       timeout(pffasttimo, (caddr_t)0, hz/5);
 }
 }