123416Smckusick /* 229123Smckusick * Copyright (c) 1982, 1986 Regents of the University of California. 333187Sbostic * All rights reserved. 423416Smckusick * 544447Sbostic * %sccs.include.redist.c% 633187Sbostic * 7*46970Sbostic * @(#)uipc_domain.c 7.9 (Berkeley) 03/04/91 823416Smckusick */ 97425Sroot 10*46970Sbostic #include <sys/cdefs.h> 1117102Sbloom #include "param.h" 1217102Sbloom #include "socket.h" 1317102Sbloom #include "protosw.h" 1417102Sbloom #include "domain.h" 1537330Skarels #include "mbuf.h" 1617102Sbloom #include "time.h" 1717102Sbloom #include "kernel.h" 187425Sroot 199008Sroot #define ADDDOMAIN(x) { \ 20*46970Sbostic extern struct domain __CONCAT(x,domain); \ 21*46970Sbostic __CONCAT(x,domain.dom_next) = domains; \ 22*46970Sbostic domains = &__CONCAT(x,domain); \ 239008Sroot } 249008Sroot 259008Sroot domaininit() 267500Sroot { 279161Ssam register struct domain *dp; 289161Ssam register struct protosw *pr; 297500Sroot 30*46970Sbostic #undef unix 319161Ssam #ifndef lint 329008Sroot ADDDOMAIN(unix); 3337330Skarels ADDDOMAIN(route); 3425765Skarels #ifdef INET 359008Sroot ADDDOMAIN(inet); 369008Sroot #endif 3718816Ssklower #ifdef NS 3818816Ssklower ADDDOMAIN(ns); 3918816Ssklower #endif 4037330Skarels #ifdef ISO 4137330Skarels ADDDOMAIN(iso); 4237330Skarels #endif 4341997Smckusick #ifdef RMP 4441997Smckusick ADDDOMAIN(rmp); 4541997Smckusick #endif 4645665Ssklower #ifdef CCITT 4745665Ssklower ADDDOMAIN(ccitt); 4845665Ssklower #endif 4910025Ssam #include "imp.h" 5010025Ssam #if NIMP > 0 519008Sroot ADDDOMAIN(imp); 529008Sroot #endif 539161Ssam #endif 549008Sroot 5516993Skarels for (dp = domains; dp; dp = dp->dom_next) { 5616993Skarels if (dp->dom_init) 5716993Skarels (*dp->dom_init)(); 589008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 599008Sroot if (pr->pr_init) 609008Sroot (*pr->pr_init)(); 6116993Skarels } 6237330Skarels 6337330Skarels if (max_linkhdr < 16) /* XXX */ 6437330Skarels max_linkhdr = 16; 6537330Skarels max_hdr = max_linkhdr + max_protohdr; 6637330Skarels max_datalen = MHLEN - max_hdr; 679161Ssam pffasttimo(); 689161Ssam pfslowtimo(); 699008Sroot } 709008Sroot 719008Sroot struct protosw * 729008Sroot pffindtype(family, type) 739008Sroot int family, type; 749008Sroot { 759008Sroot register struct domain *dp; 769008Sroot register struct protosw *pr; 779008Sroot 789008Sroot for (dp = domains; dp; dp = dp->dom_next) 799008Sroot if (dp->dom_family == family) 809008Sroot goto found; 819008Sroot return (0); 829008Sroot found: 839008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 8411569Ssam if (pr->pr_type && pr->pr_type == type) 859008Sroot return (pr); 869008Sroot return (0); 879008Sroot } 889008Sroot 899008Sroot struct protosw * 9021766Skarels pffindproto(family, protocol, type) 9121766Skarels int family, protocol, type; 929008Sroot { 939008Sroot register struct domain *dp; 949008Sroot register struct protosw *pr; 9521766Skarels struct protosw *maybe = 0; 969008Sroot 979008Sroot if (family == 0) 989008Sroot return (0); 999008Sroot for (dp = domains; dp; dp = dp->dom_next) 1009008Sroot if (dp->dom_family == family) 1019008Sroot goto found; 1029008Sroot return (0); 1039008Sroot found: 10421766Skarels for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { 10524519Skarels if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) 1069008Sroot return (pr); 10724519Skarels 10821766Skarels if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && 10921766Skarels pr->pr_protocol == 0 && maybe == (struct protosw *)0) 11021766Skarels maybe = pr; 11121766Skarels } 11221766Skarels return (maybe); 1139008Sroot } 1149008Sroot 11524767Skarels pfctlinput(cmd, sa) 1169008Sroot int cmd; 11724767Skarels struct sockaddr *sa; 1189008Sroot { 1199008Sroot register struct domain *dp; 1209008Sroot register struct protosw *pr; 1219008Sroot 1229008Sroot for (dp = domains; dp; dp = dp->dom_next) 1239008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1249008Sroot if (pr->pr_ctlinput) 12540668Skarels (*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0); 1269008Sroot } 1279008Sroot 1289008Sroot pfslowtimo() 1299008Sroot { 1309008Sroot register struct domain *dp; 1319008Sroot register struct protosw *pr; 1329008Sroot 1339008Sroot for (dp = domains; dp; dp = dp->dom_next) 1349008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1359008Sroot if (pr->pr_slowtimo) 1369008Sroot (*pr->pr_slowtimo)(); 1379161Ssam timeout(pfslowtimo, (caddr_t)0, hz/2); 1389008Sroot } 1399008Sroot 1409008Sroot pffasttimo() 1419008Sroot { 1429008Sroot register struct domain *dp; 1439008Sroot register struct protosw *pr; 1449008Sroot 1459008Sroot for (dp = domains; dp; dp = dp->dom_next) 1469008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1479008Sroot if (pr->pr_fasttimo) 1489008Sroot (*pr->pr_fasttimo)(); 1499161Ssam timeout(pffasttimo, (caddr_t)0, hz/5); 1509008Sroot } 151