X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/04ac1ad81ad8d732aa44c2b0cd0047bef3148adc..2ff0b8da01aa37a372bb87ca0946d744e844a617:/usr/src/sys/kern/uipc_domain.c diff --git a/usr/src/sys/kern/uipc_domain.c b/usr/src/sys/kern/uipc_domain.c index ea0694ccc2..460a9011f7 100644 --- a/usr/src/sys/kern/uipc_domain.c +++ b/usr/src/sys/kern/uipc_domain.c @@ -1,11 +1,29 @@ -/* uipc_domain.c 5.8 83/02/10 */ +/* + * Copyright (c) 1982, 1986 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * @(#)uipc_domain.c 7.4 (Berkeley) %G% + */ -#include "../h/param.h" -#include "../h/socket.h" -#include "../h/protosw.h" -#include "../h/domain.h" -#include "../h/time.h" -#include "../h/kernel.h" +#include "param.h" +#include "socket.h" +#include "protosw.h" +#include "domain.h" +#include "mbuf.h" +#include "time.h" +#include "kernel.h" #define ADDDOMAIN(x) { \ extern struct domain x/**/domain; \ @@ -20,11 +38,15 @@ domaininit() #ifndef lint ADDDOMAIN(unix); + ADDDOMAIN(route); #ifdef INET ADDDOMAIN(inet); #endif -#ifdef PUP - ADDDOMAIN(pup); +#ifdef NS + ADDDOMAIN(ns); +#endif +#ifdef ISO + ADDDOMAIN(iso); #endif #include "imp.h" #if NIMP > 0 @@ -32,10 +54,18 @@ domaininit() #endif #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)(); + } + +if (max_linkhdr < 16) /* XXX */ +max_linkhdr = 16; + max_hdr = max_linkhdr + max_protohdr; + max_datalen = MHLEN - max_hdr; pffasttimo(); pfslowtimo(); } @@ -53,17 +83,18 @@ pffindtype(family, type) 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 * -pffindproto(family, protocol) - int family, protocol; +pffindproto(family, protocol, type) + int family, protocol, type; { register struct domain *dp; register struct protosw *pr; + struct protosw *maybe = 0; if (family == 0) return (0); @@ -72,15 +103,20 @@ pffindproto(family, protocol) 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 (0); + + if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && + pr->pr_protocol == 0 && maybe == (struct protosw *)0) + maybe = pr; + } + return (maybe); } -pfctlinput(cmd, arg) +pfctlinput(cmd, sa) int cmd; - caddr_t arg; + struct sockaddr *sa; { register struct domain *dp; register struct protosw *pr; @@ -88,7 +124,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) - (*pr->pr_ctlinput)(cmd, arg); + (*pr->pr_ctlinput)(cmd, sa); } pfslowtimo()