38#include <sys/socket.h>
39#include <sys/protosw.h>
40#include <sys/domain.h>
41#include <sys/eventhandler.h>
44#include <sys/kernel.h>
47#include <sys/rmlock.h>
48#include <sys/socketvar.h>
51#include <machine/atomic.h>
84 LIST_HEAD_INITIALIZER(pffast_list);
86 LIST_HEAD_INITIALIZER(pfslow_list);
89int domain_init_status = 0;
90static struct mtx dom_mtx;
97struct pr_usrreqs nousrreqs = {
121 struct pr_usrreqs *pu;
124 KASSERT(pu != NULL, (
"%s: %ssw[%d] has no usrreqs!", __func__,
125 pr->pr_domain->dom_name,
126 (
int)(
pr -
pr->pr_domain->dom_protosw)));
138 if (pu->pru_attach != NULL) {
139 KASSERT(pu->pru_abort != NULL,
140 (
"protosw_init: %ssw[%d] pru_abort NULL",
141 pr->pr_domain->dom_name,
142 (
int)(
pr -
pr->pr_domain->dom_protosw)));
143 KASSERT(pu->pru_send != NULL,
144 (
"protosw_init: %ssw[%d] pru_send NULL",
145 pr->pr_domain->dom_name,
146 (
int)(
pr -
pr->pr_domain->dom_protosw)));
150#define DEFAULT(foo, bar) if ((foo) == NULL) (foo) = (bar)
186 MPASS(IS_DEFAULT_VNET(curvnet));
188 flags = atomic_load_acq_int(&dp->dom_flags);
189 if ((
flags & DOMF_SUPPORTED) == 0)
191 MPASS((
flags & DOMF_INITED) == 0);
193 for (
pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW;
pr++) {
196 if (
pr->pr_fasttimo != NULL)
197 LIST_INSERT_HEAD(&pffast_list,
pr, pr_fasttimos);
198 if (
pr->pr_slowtimo != NULL)
199 LIST_INSERT_HEAD(&pfslow_list,
pr, pr_slowtimos);
209 panic(
"%s: max_datalen < 1", __func__);
210 atomic_set_rel_int(&dp->dom_flags, DOMF_INITED);
224 if (dp->dom_probe != NULL && (*dp->dom_probe)() != 0)
226 atomic_set_rel_int(&dp->dom_flags, DOMF_SUPPORTED);
228 dp->dom_next = domains;
231 KASSERT(domain_init_status >= 1,
232 (
"attempt to domain_add(%s) before domaininit()",
235 if (domain_init_status < 1)
236 printf(
"WARNING: attempt to domain_add(%s) before "
237 "domaininit()\n", dp->dom_name);
239 mtx_unlock(&dom_mtx);
254 KASSERT(domain_init_status == 0, (
"domaininit called too late!"));
255 domain_init_status = 1;
256 mtx_unlock(&dom_mtx);
265 KASSERT(domain_init_status == 1, (
"domainfinalize called too late!"));
266 domain_init_status = 2;
267 mtx_unlock(&dom_mtx);
278 for (dp = domains; dp != NULL; dp = dp->dom_next)
279 if (dp->dom_family == family)
294 for (
pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW;
pr++)
295 if (
pr->pr_type &&
pr->pr_type ==
type)
305 struct protosw *maybe;
315 for (
pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW;
pr++) {
316 if ((
pr->pr_protocol == protocol) && (
pr->pr_type ==
type))
319 if (
type == SOCK_RAW &&
pr->pr_type == SOCK_RAW &&
320 pr->pr_protocol == 0 && maybe == NULL)
334 struct protosw *
pr, *fpr;
338 return (EPFNOSUPPORT);
339 if (npr->pr_type == 0)
341 if (npr->pr_protocol == 0)
342 return (EPROTONOSUPPORT);
343 if (npr->pr_usrreqs == NULL)
349 return (EPFNOSUPPORT);
362 for (
pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW;
pr++) {
363 if ((
pr->pr_type == npr->pr_type) &&
364 (
pr->pr_protocol == npr->pr_protocol)) {
365 mtx_unlock(&dom_mtx);
369 if ((fpr == NULL) && (
pr->pr_protocol == PROTO_SPACER))
375 mtx_unlock(&dom_mtx);
380 bcopy(npr, fpr,
sizeof(*fpr));
384 if (fpr->pr_fasttimo != NULL)
385 LIST_INSERT_HEAD(&pffast_list, fpr, pr_fasttimos);
386 if (fpr->pr_slowtimo != NULL)
387 LIST_INSERT_HEAD(&pfslow_list, fpr, pr_slowtimos);
391 mtx_unlock(&dom_mtx);
404 struct protosw *
pr, *dpr;
408 return (EPFNOSUPPORT);
410 return (EPROTONOSUPPORT);
417 return (EPFNOSUPPORT);
425 for (
pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW;
pr++) {
426 if ((
pr->pr_type ==
type) && (
pr->pr_protocol == protocol)) {
428 mtx_unlock(&dom_mtx);
437 mtx_unlock(&dom_mtx);
438 return (EPROTONOSUPPORT);
442 if (dpr->pr_fasttimo != NULL)
443 LIST_REMOVE(dpr, pr_fasttimos);
444 if (dpr->pr_slowtimo != NULL)
445 LIST_REMOVE(dpr, pr_slowtimos);
451 dpr->pr_protocol = PROTO_SPACER;
453 dpr->pr_input = NULL;
454 dpr->pr_output = NULL;
455 dpr->pr_ctlinput = NULL;
456 dpr->pr_ctloutput = NULL;
457 dpr->pr_fasttimo = NULL;
458 dpr->pr_slowtimo = NULL;
459 dpr->pr_drain = NULL;
460 dpr->pr_usrreqs = &nousrreqs;
463 mtx_unlock(&dom_mtx);
476 for (dp = domains; dp; dp = dp->dom_next)
477 for (
pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW;
pr++)
479 (*
pr->pr_ctlinput)(cmd, sa, (
void *)0);
485 struct rm_priotracker tracker;
486 struct epoch_tracker et;
491 LIST_FOREACH(
pr, &pfslow_list, pr_slowtimos) {
492 (*
pr->pr_slowtimo)();
502 struct rm_priotracker tracker;
503 struct epoch_tracker et;
508 LIST_FOREACH(
pr, &pffast_list, pr_fasttimos) {
509 (*
pr->pr_fasttimo)();
device_property_type_t type
MTX_SYSINIT(et_eventtimers_init, &et_eventtimers_mtx, "et_mtx", MTX_DEF)
static struct pollrec pr[POLL_LIST_LEN]
void panic(const char *fmt,...)
void callout_init(struct callout *c, int mpsafe)
struct iommu_domain ** domain
int printf(const char *fmt,...)
static struct callout pfslow_callout
SYSINIT(domain, SI_SUB_PROTO_DOMAININIT, SI_ORDER_ANY, domaininit, NULL)
static void domaininit(void *)
int pf_proto_register(int family, struct protosw *npr)
static void pr_usrreqs_init(struct protosw *pr)
struct protosw * pffindproto(int family, int protocol, int type)
void pfctlinput(int cmd, struct sockaddr *sa)
void domain_add(void *data)
static LIST_HEAD(protosw)
static void pffasttimo(void *)
static struct rmlock pftimo_lock
static void domainfinalize(void *)
static void pfslowtimo(void *)
#define DEFAULT(foo, bar)
RM_SYSINIT(pftimo_lock, &pftimo_lock, "pftimo")
void domain_init(void *arg)
static struct callout pffast_callout
int pf_proto_unregister(int family, int protocol, int type)
struct domain * pffinddomain(int family)
struct protosw * pffindtype(int family, int type)
int pru_bind_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td)
int sosend_generic(struct socket *so, struct sockaddr *addr, struct uio *uio, struct mbuf *top, struct mbuf *control, int flags, struct thread *td)
int pru_rcvoob_notsupp(struct socket *so, struct mbuf *m, int flags)
int pru_sopoll_notsupp(struct socket *so, int events, struct ucred *cred, struct thread *td)
int pru_listen_notsupp(struct socket *so, int backlog, struct thread *td)
int pru_peeraddr_notsupp(struct socket *so, struct sockaddr **nam)
int pru_shutdown_notsupp(struct socket *so)
int pru_attach_notsupp(struct socket *so, int proto, struct thread *td)
int pru_aio_queue_notsupp(struct socket *so, struct kaiocb *job)
int pru_rcvd_notsupp(struct socket *so, int flags)
int pru_accept_notsupp(struct socket *so, struct sockaddr **nam)
int pru_sense_null(struct socket *so, struct stat *sb)
int pru_sosend_notsupp(struct socket *so, struct sockaddr *addr, struct uio *uio, struct mbuf *top, struct mbuf *control, int flags, struct thread *td)
int pru_connect2_notsupp(struct socket *so1, struct socket *so2)
int pru_ready_notsupp(struct socket *so, struct mbuf *m, int count)
int pru_sockaddr_notsupp(struct socket *so, struct sockaddr **nam)
int pru_disconnect_notsupp(struct socket *so)
int pru_send_notsupp(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, struct mbuf *control, struct thread *td)
int pru_soreceive_notsupp(struct socket *so, struct sockaddr **paddr, struct uio *uio, struct mbuf **mp0, struct mbuf **controlp, int *flagsp)
int pru_control_notsupp(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td)
int sopoll_generic(struct socket *so, int events, struct ucred *active_cred, struct thread *td)
int pru_connectat_notsupp(int fd, struct socket *so, struct sockaddr *nam, struct thread *td)
int soreceive_generic(struct socket *so, struct sockaddr **psa, struct uio *uio, struct mbuf **mp0, struct mbuf **controlp, int *flagsp)
int pru_bindat_notsupp(int fd, struct socket *so, struct sockaddr *nam, struct thread *td)
int pru_connect_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td)