32 #include <sys/cdefs.h>
35 #include <sys/param.h>
36 #include <sys/socket.h>
37 #include <sys/protosw.h>
38 #include <sys/domain.h>
39 #include <sys/eventhandler.h>
41 #include <sys/kernel.h>
43 #include <sys/mutex.h>
44 #include <sys/socketvar.h>
45 #include <sys/systm.h>
109 struct pr_usrreqs *pu;
112 KASSERT(pu != NULL, (
"protosw_init: %ssw[%d] has no usrreqs!",
113 pr->pr_domain->dom_name,
114 (
int)(pr - pr->pr_domain->dom_protosw)));
126 if (pu->pru_attach != NULL) {
127 KASSERT(pu->pru_abort != NULL,
128 (
"protosw_init: %ssw[%d] pru_abort NULL",
129 pr->pr_domain->dom_name,
130 (
int)(pr - pr->pr_domain->dom_protosw)));
131 KASSERT(pu->pru_send != NULL,
132 (
"protosw_init: %ssw[%d] pru_send NULL",
133 pr->pr_domain->dom_name,
134 (
int)(pr - pr->pr_domain->dom_protosw)));
138 #define DEFAULT(foo, bar) if ((foo) == NULL) (foo) = (bar)
168 struct domain *dp = arg;
173 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
181 panic(
"%s: max_datalen < 1", __func__);
186 vnet_domain_init(
void *arg)
194 vnet_domain_uninit(
void *arg)
196 struct domain *dp = arg;
199 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
203 (*dp->dom_destroy)();
217 dp = (
struct domain *)data;
223 (
"attempt to domain_add(%s) before domaininit()",
227 printf(
"WARNING: attempt to domain_add(%s) before "
228 "domaininit()\n", dp->dom_name);
232 (
"attempt to domain_add(%s) after domainfinalize()",
236 printf(
"WARNING: attempt to domain_add(%s) after "
237 "domainfinalize()\n", dp->dom_name);
279 for (dp =
domains; dp; dp = dp->dom_next)
280 if (dp->dom_family == family)
284 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
285 if (pr->pr_type && pr->pr_type == type)
295 struct protosw *maybe = 0;
299 for (dp =
domains; dp; dp = dp->dom_next)
300 if (dp->dom_family == family)
304 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
305 if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
308 if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
309 pr->pr_protocol == 0 && maybe == (
struct protosw *)0)
322 VNET_ITERATOR_DECL(vnet_iter);
324 struct protosw *
pr, *fpr;
328 return (EPFNOSUPPORT);
329 if (npr->pr_type == 0)
331 if (npr->pr_protocol == 0)
332 return (EPROTONOSUPPORT);
333 if (npr->pr_usrreqs == NULL)
337 for (dp =
domains; dp; dp = dp->dom_next)
338 if (dp->dom_family == family)
340 return (EPFNOSUPPORT);
354 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
355 if ((pr->pr_type == npr->pr_type) &&
356 (pr->pr_protocol == npr->pr_protocol)) {
361 if ((fpr == NULL) && (pr->pr_protocol == PROTO_SPACER))
372 bcopy(npr, fpr,
sizeof(*fpr));
379 VNET_FOREACH(vnet_iter) {
380 CURVNET_SET_QUIET(vnet_iter);
397 struct protosw *
pr, *dpr;
401 return (EPFNOSUPPORT);
403 return (EPROTONOSUPPORT);
408 for (dp =
domains; dp; dp = dp->dom_next)
409 if (dp->dom_family == family)
411 return (EPFNOSUPPORT);
420 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
421 if ((pr->pr_type == type) && (pr->pr_protocol == protocol)) {
433 return (EPROTONOSUPPORT);
439 dpr->pr_protocol = PROTO_SPACER;
441 dpr->pr_input = NULL;
442 dpr->pr_output = NULL;
443 dpr->pr_ctlinput = NULL;
444 dpr->pr_ctloutput = NULL;
446 dpr->pr_fasttimo = NULL;
447 dpr->pr_slowtimo = NULL;
448 dpr->pr_drain = NULL;
463 for (dp =
domains; dp; dp = dp->dom_next)
464 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
466 (*pr->pr_ctlinput)(cmd, sa, (
void *)0);
477 for (dp =
domains; dp; dp = dp->dom_next) {
483 if (dp->dom_family != sa->sa_family)
486 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
488 (*pr->pr_ctlinput)(cmd, sa, ctlparam);
498 for (dp =
domains; dp; dp = dp->dom_next)
499 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
501 (*pr->pr_slowtimo)();
511 for (dp =
domains; dp; dp = dp->dom_next)
512 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
514 (*pr->pr_fasttimo)();
int pf_proto_unregister(int family, int protocol, int type)
int pru_rcvd_notsupp(struct socket *so, int flags)
int pru_sosend_notsupp(struct socket *so, struct sockaddr *addr, struct uio *uio, struct mbuf *top, struct mbuf *control, int flags, struct thread *td)
MTX_SYSINIT(domain,&dom_mtx,"domain list", MTX_DEF)
int pf_proto_register(int family, struct protosw *npr)
int soreceive_generic(struct socket *so, struct sockaddr **psa, struct uio *uio, struct mbuf **mp0, struct mbuf **controlp, int *flagsp)
void panic(const char *fmt,...)
int pru_sense_null(struct socket *so, struct stat *sb)
int pru_listen_notsupp(struct socket *so, int backlog, struct thread *td)
int pru_peeraddr_notsupp(struct socket *so, struct sockaddr **nam)
int pru_disconnect_notsupp(struct socket *so)
static void domaininit(void *)
SYSINIT(domain, SI_SUB_PROTO_DOMAININIT, SI_ORDER_ANY, domaininit, NULL)
void pfctlinput2(int cmd, struct sockaddr *sa, void *ctlparam)
static void pfslowtimo(void *)
int pru_soreceive_notsupp(struct socket *so, struct sockaddr **paddr, struct uio *uio, struct mbuf **mp0, struct mbuf **controlp, int *flagsp)
static struct callout pffast_callout
struct pr_usrreqs nousrreqs
static void domainfinalize(void *)
struct protosw * pffindproto(int family, int protocol, int type)
void domain_init(void *arg)
static struct callout pfslow_callout
int pru_connect_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td)
int pru_connect2_notsupp(struct socket *so1, struct socket *so2)
#define DEFAULT(foo, bar)
int pru_attach_notsupp(struct socket *so, int proto, struct thread *td)
int pru_send_notsupp(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, struct mbuf *control, struct thread *td)
struct protosw * pffindtype(int family, int type)
int printf(const char *fmt,...)
int pru_sopoll_notsupp(struct socket *so, int events, struct ucred *cred, struct thread *td)
void callout_init(struct callout *c, int mpsafe)
int pru_shutdown_notsupp(struct socket *so)
void pfctlinput(int cmd, struct sockaddr *sa)
int sopoll_generic(struct socket *so, int events, struct ucred *active_cred, struct thread *td)
int pru_accept_notsupp(struct socket *so, struct sockaddr **nam)
int pru_control_notsupp(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td)
int pru_bind_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td)
static struct mtx dom_mtx
int pru_sockaddr_notsupp(struct socket *so, struct sockaddr **nam)
static void pffasttimo(void *)
int sosend_generic(struct socket *so, struct sockaddr *addr, struct uio *uio, struct mbuf *top, struct mbuf *control, int flags, struct thread *td)
void domain_add(void *data)
static struct pollrec pr[POLL_LIST_LEN]
int pru_rcvoob_notsupp(struct socket *so, struct mbuf *m, int flags)
static void protosw_init(struct protosw *pr)