123416Smckusick /* 229123Smckusick * Copyright (c) 1982, 1986 Regents of the University of California. 333187Sbostic * All rights reserved. 423416Smckusick * 544447Sbostic * %sccs.include.redist.c% 633187Sbostic * 7*56517Sbostic * @(#)uipc_domain.c 7.10 (Berkeley) 10/11/92 823416Smckusick */ 97425Sroot 10*56517Sbostic #include <sys/param.h> 11*56517Sbostic #include <sys/socket.h> 12*56517Sbostic #include <sys/protosw.h> 13*56517Sbostic #include <sys/domain.h> 14*56517Sbostic #include <sys/mbuf.h> 15*56517Sbostic #include <sys/time.h> 16*56517Sbostic #include <sys/kernel.h> 177425Sroot 189008Sroot #define ADDDOMAIN(x) { \ 1946970Sbostic extern struct domain __CONCAT(x,domain); \ 2046970Sbostic __CONCAT(x,domain.dom_next) = domains; \ 2146970Sbostic domains = &__CONCAT(x,domain); \ 229008Sroot } 239008Sroot 249008Sroot domaininit() 257500Sroot { 269161Ssam register struct domain *dp; 279161Ssam register struct protosw *pr; 287500Sroot 2946970Sbostic #undef unix 309161Ssam #ifndef lint 319008Sroot ADDDOMAIN(unix); 3237330Skarels ADDDOMAIN(route); 3325765Skarels #ifdef INET 349008Sroot ADDDOMAIN(inet); 359008Sroot #endif 3618816Ssklower #ifdef NS 3718816Ssklower ADDDOMAIN(ns); 3818816Ssklower #endif 3937330Skarels #ifdef ISO 4037330Skarels ADDDOMAIN(iso); 4137330Skarels #endif 4241997Smckusick #ifdef RMP 4341997Smckusick ADDDOMAIN(rmp); 4441997Smckusick #endif 4545665Ssklower #ifdef CCITT 4645665Ssklower ADDDOMAIN(ccitt); 4745665Ssklower #endif 4810025Ssam #include "imp.h" 4910025Ssam #if NIMP > 0 509008Sroot ADDDOMAIN(imp); 519008Sroot #endif 529161Ssam #endif 539008Sroot 5416993Skarels for (dp = domains; dp; dp = dp->dom_next) { 5516993Skarels if (dp->dom_init) 5616993Skarels (*dp->dom_init)(); 579008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 589008Sroot if (pr->pr_init) 599008Sroot (*pr->pr_init)(); 6016993Skarels } 6137330Skarels 6237330Skarels if (max_linkhdr < 16) /* XXX */ 6337330Skarels max_linkhdr = 16; 6437330Skarels max_hdr = max_linkhdr + max_protohdr; 6537330Skarels max_datalen = MHLEN - max_hdr; 669161Ssam pffasttimo(); 679161Ssam pfslowtimo(); 689008Sroot } 699008Sroot 709008Sroot struct protosw * 719008Sroot pffindtype(family, type) 729008Sroot int family, type; 739008Sroot { 749008Sroot register struct domain *dp; 759008Sroot register struct protosw *pr; 769008Sroot 779008Sroot for (dp = domains; dp; dp = dp->dom_next) 789008Sroot if (dp->dom_family == family) 799008Sroot goto found; 809008Sroot return (0); 819008Sroot found: 829008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 8311569Ssam if (pr->pr_type && pr->pr_type == type) 849008Sroot return (pr); 859008Sroot return (0); 869008Sroot } 879008Sroot 889008Sroot struct protosw * 8921766Skarels pffindproto(family, protocol, type) 9021766Skarels int family, protocol, type; 919008Sroot { 929008Sroot register struct domain *dp; 939008Sroot register struct protosw *pr; 9421766Skarels struct protosw *maybe = 0; 959008Sroot 969008Sroot if (family == 0) 979008Sroot return (0); 989008Sroot for (dp = domains; dp; dp = dp->dom_next) 999008Sroot if (dp->dom_family == family) 1009008Sroot goto found; 1019008Sroot return (0); 1029008Sroot found: 10321766Skarels for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { 10424519Skarels if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) 1059008Sroot return (pr); 10624519Skarels 10721766Skarels if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && 10821766Skarels pr->pr_protocol == 0 && maybe == (struct protosw *)0) 10921766Skarels maybe = pr; 11021766Skarels } 11121766Skarels return (maybe); 1129008Sroot } 1139008Sroot 11424767Skarels pfctlinput(cmd, sa) 1159008Sroot int cmd; 11624767Skarels struct sockaddr *sa; 1179008Sroot { 1189008Sroot register struct domain *dp; 1199008Sroot register struct protosw *pr; 1209008Sroot 1219008Sroot for (dp = domains; dp; dp = dp->dom_next) 1229008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1239008Sroot if (pr->pr_ctlinput) 12440668Skarels (*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0); 1259008Sroot } 1269008Sroot 1279008Sroot pfslowtimo() 1289008Sroot { 1299008Sroot register struct domain *dp; 1309008Sroot register struct protosw *pr; 1319008Sroot 1329008Sroot for (dp = domains; dp; dp = dp->dom_next) 1339008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1349008Sroot if (pr->pr_slowtimo) 1359008Sroot (*pr->pr_slowtimo)(); 1369161Ssam timeout(pfslowtimo, (caddr_t)0, hz/2); 1379008Sroot } 1389008Sroot 1399008Sroot pffasttimo() 1409008Sroot { 1419008Sroot register struct domain *dp; 1429008Sroot register struct protosw *pr; 1439008Sroot 1449008Sroot for (dp = domains; dp; dp = dp->dom_next) 1459008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1469008Sroot if (pr->pr_fasttimo) 1479008Sroot (*pr->pr_fasttimo)(); 1489161Ssam timeout(pffasttimo, (caddr_t)0, hz/5); 1499008Sroot } 150