123416Smckusick /* 229123Smckusick * Copyright (c) 1982, 1986 Regents of the University of California. 333187Sbostic * All rights reserved. 423416Smckusick * 5*44447Sbostic * %sccs.include.redist.c% 633187Sbostic * 7*44447Sbostic * @(#)uipc_domain.c 7.7 (Berkeley) 06/28/90 823416Smckusick */ 97425Sroot 1017102Sbloom #include "param.h" 1117102Sbloom #include "socket.h" 1217102Sbloom #include "protosw.h" 1317102Sbloom #include "domain.h" 1437330Skarels #include "mbuf.h" 1517102Sbloom #include "time.h" 1617102Sbloom #include "kernel.h" 177425Sroot 189008Sroot #define ADDDOMAIN(x) { \ 199008Sroot extern struct domain x/**/domain; \ 209008Sroot x/**/domain.dom_next = domains; \ 219008Sroot domains = &x/**/domain; \ 229008Sroot } 239008Sroot 249008Sroot domaininit() 257500Sroot { 269161Ssam register struct domain *dp; 279161Ssam register struct protosw *pr; 287500Sroot 299161Ssam #ifndef lint 309008Sroot ADDDOMAIN(unix); 3137330Skarels ADDDOMAIN(route); 3225765Skarels #ifdef INET 339008Sroot ADDDOMAIN(inet); 349008Sroot #endif 3518816Ssklower #ifdef NS 3618816Ssklower ADDDOMAIN(ns); 3718816Ssklower #endif 3837330Skarels #ifdef ISO 3937330Skarels ADDDOMAIN(iso); 4037330Skarels #endif 4141997Smckusick #ifdef RMP 4241997Smckusick ADDDOMAIN(rmp); 4341997Smckusick #endif 4410025Ssam #include "imp.h" 4510025Ssam #if NIMP > 0 469008Sroot ADDDOMAIN(imp); 479008Sroot #endif 489161Ssam #endif 499008Sroot 5016993Skarels for (dp = domains; dp; dp = dp->dom_next) { 5116993Skarels if (dp->dom_init) 5216993Skarels (*dp->dom_init)(); 539008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 549008Sroot if (pr->pr_init) 559008Sroot (*pr->pr_init)(); 5616993Skarels } 5737330Skarels 5837330Skarels if (max_linkhdr < 16) /* XXX */ 5937330Skarels max_linkhdr = 16; 6037330Skarels max_hdr = max_linkhdr + max_protohdr; 6137330Skarels max_datalen = MHLEN - max_hdr; 629161Ssam pffasttimo(); 639161Ssam pfslowtimo(); 649008Sroot } 659008Sroot 669008Sroot struct protosw * 679008Sroot pffindtype(family, type) 689008Sroot int family, type; 699008Sroot { 709008Sroot register struct domain *dp; 719008Sroot register struct protosw *pr; 729008Sroot 739008Sroot for (dp = domains; dp; dp = dp->dom_next) 749008Sroot if (dp->dom_family == family) 759008Sroot goto found; 769008Sroot return (0); 779008Sroot found: 789008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 7911569Ssam if (pr->pr_type && pr->pr_type == type) 809008Sroot return (pr); 819008Sroot return (0); 829008Sroot } 839008Sroot 849008Sroot struct protosw * 8521766Skarels pffindproto(family, protocol, type) 8621766Skarels int family, protocol, type; 879008Sroot { 889008Sroot register struct domain *dp; 899008Sroot register struct protosw *pr; 9021766Skarels struct protosw *maybe = 0; 919008Sroot 929008Sroot if (family == 0) 939008Sroot return (0); 949008Sroot for (dp = domains; dp; dp = dp->dom_next) 959008Sroot if (dp->dom_family == family) 969008Sroot goto found; 979008Sroot return (0); 989008Sroot found: 9921766Skarels for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { 10024519Skarels if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) 1019008Sroot return (pr); 10224519Skarels 10321766Skarels if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && 10421766Skarels pr->pr_protocol == 0 && maybe == (struct protosw *)0) 10521766Skarels maybe = pr; 10621766Skarels } 10721766Skarels return (maybe); 1089008Sroot } 1099008Sroot 11024767Skarels pfctlinput(cmd, sa) 1119008Sroot int cmd; 11224767Skarels struct sockaddr *sa; 1139008Sroot { 1149008Sroot register struct domain *dp; 1159008Sroot register struct protosw *pr; 1169008Sroot 1179008Sroot for (dp = domains; dp; dp = dp->dom_next) 1189008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1199008Sroot if (pr->pr_ctlinput) 12040668Skarels (*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0); 1219008Sroot } 1229008Sroot 1239008Sroot pfslowtimo() 1249008Sroot { 1259008Sroot register struct domain *dp; 1269008Sroot register struct protosw *pr; 1279008Sroot 1289008Sroot for (dp = domains; dp; dp = dp->dom_next) 1299008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1309008Sroot if (pr->pr_slowtimo) 1319008Sroot (*pr->pr_slowtimo)(); 1329161Ssam timeout(pfslowtimo, (caddr_t)0, hz/2); 1339008Sroot } 1349008Sroot 1359008Sroot pffasttimo() 1369008Sroot { 1379008Sroot register struct domain *dp; 1389008Sroot register struct protosw *pr; 1399008Sroot 1409008Sroot for (dp = domains; dp; dp = dp->dom_next) 1419008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1429008Sroot if (pr->pr_fasttimo) 1439008Sroot (*pr->pr_fasttimo)(); 1449161Ssam timeout(pffasttimo, (caddr_t)0, hz/5); 1459008Sroot } 146