123416Smckusick /* 229123Smckusick * Copyright (c) 1982, 1986 Regents of the University of California. 333187Sbostic * All rights reserved. 423416Smckusick * 544447Sbostic * %sccs.include.redist.c% 633187Sbostic * 7*45665Ssklower * @(#)uipc_domain.c 7.8 (Berkeley) 11/29/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 44*45665Ssklower #ifdef CCITT 45*45665Ssklower ADDDOMAIN(ccitt); 46*45665Ssklower #endif 4710025Ssam #include "imp.h" 4810025Ssam #if NIMP > 0 499008Sroot ADDDOMAIN(imp); 509008Sroot #endif 519161Ssam #endif 529008Sroot 5316993Skarels for (dp = domains; dp; dp = dp->dom_next) { 5416993Skarels if (dp->dom_init) 5516993Skarels (*dp->dom_init)(); 569008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 579008Sroot if (pr->pr_init) 589008Sroot (*pr->pr_init)(); 5916993Skarels } 6037330Skarels 6137330Skarels if (max_linkhdr < 16) /* XXX */ 6237330Skarels max_linkhdr = 16; 6337330Skarels max_hdr = max_linkhdr + max_protohdr; 6437330Skarels max_datalen = MHLEN - max_hdr; 659161Ssam pffasttimo(); 669161Ssam pfslowtimo(); 679008Sroot } 689008Sroot 699008Sroot struct protosw * 709008Sroot pffindtype(family, type) 719008Sroot int family, type; 729008Sroot { 739008Sroot register struct domain *dp; 749008Sroot register struct protosw *pr; 759008Sroot 769008Sroot for (dp = domains; dp; dp = dp->dom_next) 779008Sroot if (dp->dom_family == family) 789008Sroot goto found; 799008Sroot return (0); 809008Sroot found: 819008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 8211569Ssam if (pr->pr_type && pr->pr_type == type) 839008Sroot return (pr); 849008Sroot return (0); 859008Sroot } 869008Sroot 879008Sroot struct protosw * 8821766Skarels pffindproto(family, protocol, type) 8921766Skarels int family, protocol, type; 909008Sroot { 919008Sroot register struct domain *dp; 929008Sroot register struct protosw *pr; 9321766Skarels struct protosw *maybe = 0; 949008Sroot 959008Sroot if (family == 0) 969008Sroot return (0); 979008Sroot for (dp = domains; dp; dp = dp->dom_next) 989008Sroot if (dp->dom_family == family) 999008Sroot goto found; 1009008Sroot return (0); 1019008Sroot found: 10221766Skarels for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { 10324519Skarels if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) 1049008Sroot return (pr); 10524519Skarels 10621766Skarels if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && 10721766Skarels pr->pr_protocol == 0 && maybe == (struct protosw *)0) 10821766Skarels maybe = pr; 10921766Skarels } 11021766Skarels return (maybe); 1119008Sroot } 1129008Sroot 11324767Skarels pfctlinput(cmd, sa) 1149008Sroot int cmd; 11524767Skarels struct sockaddr *sa; 1169008Sroot { 1179008Sroot register struct domain *dp; 1189008Sroot register struct protosw *pr; 1199008Sroot 1209008Sroot for (dp = domains; dp; dp = dp->dom_next) 1219008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1229008Sroot if (pr->pr_ctlinput) 12340668Skarels (*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0); 1249008Sroot } 1259008Sroot 1269008Sroot pfslowtimo() 1279008Sroot { 1289008Sroot register struct domain *dp; 1299008Sroot register struct protosw *pr; 1309008Sroot 1319008Sroot for (dp = domains; dp; dp = dp->dom_next) 1329008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1339008Sroot if (pr->pr_slowtimo) 1349008Sroot (*pr->pr_slowtimo)(); 1359161Ssam timeout(pfslowtimo, (caddr_t)0, hz/2); 1369008Sroot } 1379008Sroot 1389008Sroot pffasttimo() 1399008Sroot { 1409008Sroot register struct domain *dp; 1419008Sroot register struct protosw *pr; 1429008Sroot 1439008Sroot for (dp = domains; dp; dp = dp->dom_next) 1449008Sroot for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 1459008Sroot if (pr->pr_fasttimo) 1469008Sroot (*pr->pr_fasttimo)(); 1479161Ssam timeout(pffasttimo, (caddr_t)0, hz/5); 1489008Sroot } 149