diff --git a/share/man/man9/domain.9 b/share/man/man9/domain.9 index 03e83edfc14b..867cfa104718 100644 --- a/share/man/man9/domain.9 +++ b/share/man/man9/domain.9 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 13, 2021 +.Dd December 27, 2021 .Dt DOMAIN 9 .Os .Sh NAME @@ -106,7 +106,6 @@ struct protosw { pr_ctlinput_t *pr_ctlinput; /* control input (from below) */ pr_ctloutput_t *pr_ctloutput; /* control output (from above) */ /* utility hooks */ - pr_init_t *pr_init; pr_fasttimo_t *pr_fasttimo; /* fast timeout (200ms) */ pr_slowtimo_t *pr_slowtimo; /* slow timeout (500ms) */ pr_drain_t *pr_drain; /* flush any excess space possible */ diff --git a/sys/dev/hyperv/hvsock/hv_sock.c b/sys/dev/hyperv/hvsock/hv_sock.c index 6d5ad4fc6609..b2a84befafa2 100644 --- a/sys/dev/hyperv/hvsock/hv_sock.c +++ b/sys/dev/hyperv/hvsock/hv_sock.c @@ -118,7 +118,6 @@ static struct protosw hv_socket_protosw[] = { .pr_domain = &hv_socket_domain, .pr_protocol = HYPERV_SOCK_PROTO_TRANS, .pr_flags = PR_CONNREQUIRED, - .pr_init = hvs_trans_init, .pr_usrreqs = &hvs_trans_usrreqs, }, }; @@ -336,12 +335,9 @@ hvs_dom_probe(void) return (0); } -void -hvs_trans_init(void) +static void +hvs_trans_init(void *arg __unused) { - /* Skip initialization of globals for non-default instances. */ - if (!IS_DEFAULT_VNET(curvnet)) - return; HVSOCK_DBG(HVSOCK_DBG_VERBOSE, "%s: HyperV Socket hvs_trans_init called\n", __func__); @@ -354,6 +350,8 @@ hvs_trans_init(void) LIST_INIT(&hvs_trans_bound_socks); LIST_INIT(&hvs_trans_connected_socks); } +SYSINIT(hvs_trans_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, + hvs_trans_init, NULL); /* * Called in two cases: diff --git a/sys/dev/hyperv/hvsock/hv_sock.h b/sys/dev/hyperv/hvsock/hv_sock.h index 877425968345..a1cfc31f6d74 100644 --- a/sys/dev/hyperv/hvsock/hv_sock.h +++ b/sys/dev/hyperv/hvsock/hv_sock.h @@ -96,7 +96,6 @@ struct hvs_pcb { ((struct socket *)((hvspcb)->so)) void hvs_addr_init(struct sockaddr_hvs *, const struct hyperv_guid *); -void hvs_trans_init(void); void hvs_trans_close(struct socket *); void hvs_trans_detach(struct socket *); void hvs_trans_abort(struct socket *); diff --git a/sys/kern/uipc_debug.c b/sys/kern/uipc_debug.c index 76620477fab5..86c3199a3c26 100644 --- a/sys/kern/uipc_debug.c +++ b/sys/kern/uipc_debug.c @@ -330,10 +330,7 @@ db_print_protosw(struct protosw *pr, const char *prname, int indent) db_printf("pr_input: %p ", pr->pr_input); db_printf("pr_output: %p ", pr->pr_output); db_printf("pr_ctlinput: %p\n", pr->pr_ctlinput); - - db_print_indent(indent); db_printf("pr_ctloutput: %p ", pr->pr_ctloutput); - db_printf("pr_init: %p\n", pr->pr_init); db_print_indent(indent); db_printf("pr_fasttimo: %p ", pr->pr_fasttimo); diff --git a/sys/kern/uipc_domain.c b/sys/kern/uipc_domain.c index 9092ff335eb0..200637e00ad8 100644 --- a/sys/kern/uipc_domain.c +++ b/sys/kern/uipc_domain.c @@ -169,8 +169,6 @@ protosw_init(struct protosw *pr) DEFAULT(pu->pru_sopoll, sopoll_generic); DEFAULT(pu->pru_ready, pru_ready_notsupp); #undef DEFAULT - if (pr->pr_init) - (*pr->pr_init)(); } /* @@ -365,7 +363,6 @@ pffindproto(int family, int protocol, int type) int pf_proto_register(int family, struct protosw *npr) { - VNET_ITERATOR_DECL(vnet_iter); struct domain *dp; struct protosw *pr, *fpr; @@ -425,15 +422,6 @@ pf_proto_register(int family, struct protosw *npr) /* Job is done, no more protection required. */ mtx_unlock(&dom_mtx); - /* Initialize and activate the protocol. */ - VNET_LIST_RLOCK(); - VNET_FOREACH(vnet_iter) { - CURVNET_SET_QUIET(vnet_iter); - protosw_init(fpr); - CURVNET_RESTORE(); - } - VNET_LIST_RUNLOCK(); - return (0); } @@ -498,7 +486,6 @@ pf_proto_unregister(int family, int protocol, int type) dpr->pr_output = NULL; dpr->pr_ctlinput = NULL; dpr->pr_ctloutput = NULL; - dpr->pr_init = NULL; dpr->pr_fasttimo = NULL; dpr->pr_slowtimo = NULL; dpr->pr_drain = NULL; diff --git a/sys/net/raw_cb.h b/sys/net/raw_cb.h index bd5e08fc3daa..3356a86d5464 100644 --- a/sys/net/raw_cb.h +++ b/sys/net/raw_cb.h @@ -66,7 +66,6 @@ extern struct mtx rawcb_mtx; * Generic protosw entries for raw socket protocols. */ pr_ctlinput_t raw_ctlinput; -pr_init_t raw_init; /* * Library routines for raw socket usrreq functions; will always be wrapped diff --git a/sys/net/raw_usrreq.c b/sys/net/raw_usrreq.c index 5d4e223e5a0a..f51334cf81fa 100644 --- a/sys/net/raw_usrreq.c +++ b/sys/net/raw_usrreq.c @@ -56,12 +56,13 @@ MTX_SYSINIT(rawcb_mtx, &rawcb_mtx, "rawcb", MTX_DEF); /* * Initialize raw connection block q. */ -void -raw_init(void) +static void +raw_init(void *arg __unused) { LIST_INIT(&V_rawcb_list); } +VNET_SYSINIT(raw_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, raw_init, NULL); /* * Raw protocol input routine. Find the socket associated with the packet(s) diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 6495a4102570..7c4ff01e5e73 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -2691,7 +2691,6 @@ static struct protosw routesw[] = { .pr_flags = PR_ATOMIC|PR_ADDR, .pr_output = route_output, .pr_ctlinput = raw_ctlinput, - .pr_init = raw_init, .pr_usrreqs = &route_usrreqs } }; diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h b/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h index 5a51452dc884..21ed3928b5ff 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h @@ -67,7 +67,6 @@ typedef struct ng_btsocket_hci_raw_pcb * ng_btsocket_hci_raw_pcb_p; #ifdef _KERNEL -void ng_btsocket_hci_raw_init (void); void ng_btsocket_hci_raw_abort (struct socket *); void ng_btsocket_hci_raw_close (struct socket *); int ng_btsocket_hci_raw_attach (struct socket *, int, struct thread *); diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h index 8ecb8821a275..34df9179c860 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h @@ -95,7 +95,6 @@ typedef struct ng_btsocket_l2cap_raw_pcb * ng_btsocket_l2cap_raw_pcb_p; #ifdef _KERNEL -void ng_btsocket_l2cap_raw_init (void); void ng_btsocket_l2cap_raw_abort (struct socket *); void ng_btsocket_l2cap_raw_close (struct socket *); int ng_btsocket_l2cap_raw_attach (struct socket *, int, struct thread *); @@ -191,7 +190,6 @@ typedef struct ng_btsocket_l2cap_pcb * ng_btsocket_l2cap_pcb_p; #ifdef _KERNEL -void ng_btsocket_l2cap_init (void); void ng_btsocket_l2cap_abort (struct socket *); void ng_btsocket_l2cap_close (struct socket *); int ng_btsocket_l2cap_accept (struct socket *, struct sockaddr **); diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h b/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h index 569a407ef629..179b6518eb33 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h @@ -315,7 +315,6 @@ typedef struct ng_btsocket_rfcomm_pcb * ng_btsocket_rfcomm_pcb_p; #ifdef _KERNEL -void ng_btsocket_rfcomm_init (void); void ng_btsocket_rfcomm_abort (struct socket *); void ng_btsocket_rfcomm_close (struct socket *); int ng_btsocket_rfcomm_accept (struct socket *, struct sockaddr **); diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_sco.h b/sys/netgraph/bluetooth/include/ng_btsocket_sco.h index 979ea408f292..001be86d0a5f 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_sco.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_sco.h @@ -105,7 +105,6 @@ typedef struct ng_btsocket_sco_pcb * ng_btsocket_sco_pcb_p; #ifdef _KERNEL -void ng_btsocket_sco_init (void); void ng_btsocket_sco_abort (struct socket *); void ng_btsocket_sco_close (struct socket *); int ng_btsocket_sco_accept (struct socket *, struct sockaddr **); diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket.c b/sys/netgraph/bluetooth/socket/ng_btsocket.c index fc54154f1274..93866ce79d6c 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket.c @@ -176,7 +176,6 @@ static struct protosw ng_btsocket_protosw[] = { .pr_protocol = BLUETOOTH_PROTO_HCI, .pr_flags = PR_ATOMIC|PR_ADDR, .pr_ctloutput = ng_btsocket_hci_raw_ctloutput, - .pr_init = ng_btsocket_hci_raw_init, .pr_usrreqs = &ng_btsocket_hci_raw_usrreqs, }, { @@ -184,7 +183,6 @@ static struct protosw ng_btsocket_protosw[] = { .pr_domain = &ng_btsocket_domain, .pr_protocol = BLUETOOTH_PROTO_L2CAP, .pr_flags = PR_ATOMIC|PR_ADDR, - .pr_init = ng_btsocket_l2cap_raw_init, .pr_usrreqs = &ng_btsocket_l2cap_raw_usrreqs, }, { @@ -193,7 +191,6 @@ static struct protosw ng_btsocket_protosw[] = { .pr_protocol = BLUETOOTH_PROTO_L2CAP, .pr_flags = PR_ATOMIC|PR_CONNREQUIRED, .pr_ctloutput = ng_btsocket_l2cap_ctloutput, - .pr_init = ng_btsocket_l2cap_init, .pr_usrreqs = &ng_btsocket_l2cap_usrreqs, }, { @@ -202,7 +199,6 @@ static struct protosw ng_btsocket_protosw[] = { .pr_protocol = BLUETOOTH_PROTO_RFCOMM, .pr_flags = PR_CONNREQUIRED, .pr_ctloutput = ng_btsocket_rfcomm_ctloutput, - .pr_init = ng_btsocket_rfcomm_init, .pr_usrreqs = &ng_btsocket_rfcomm_usrreqs, }, { @@ -211,7 +207,6 @@ static struct protosw ng_btsocket_protosw[] = { .pr_protocol = BLUETOOTH_PROTO_SCO, .pr_flags = PR_ATOMIC|PR_CONNREQUIRED, .pr_ctloutput = ng_btsocket_sco_ctloutput, - .pr_init = ng_btsocket_sco_init, .pr_usrreqs = &ng_btsocket_sco_usrreqs, }, }; diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c index c82515f82631..59bacf8c965b 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c @@ -728,16 +728,12 @@ NG_HCI_OCF(opcode) - 1)) * Initialize everything */ -void -ng_btsocket_hci_raw_init(void) +static void +ng_btsocket_hci_raw_init(void *arg __unused) { bitstr_t *f = NULL; int error = 0; - /* Skip initialization of globals for non-default instances. */ - if (!IS_DEFAULT_VNET(curvnet)) - return; - ng_btsocket_hci_raw_node = NULL; ng_btsocket_hci_raw_debug_level = NG_BTSOCKET_WARN_LEVEL; ng_btsocket_hci_raw_ioctl_timeout = 5; @@ -889,6 +885,8 @@ ng_btsocket_hci_raw_init(void) bit_set(f, NG_HCI_OCF_LE_READ_WHITE_LIST_SIZE - 1); } /* ng_btsocket_hci_raw_init */ +SYSINIT(ng_btsocket_hci_raw_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, + ng_btsocket_hci_raw_init, NULL); /* * Abort connection on socket diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c index 18d7a89b7a2f..34d1d69f408f 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c @@ -1887,15 +1887,11 @@ ng_btsocket_l2cap_rtclean(void *context, int pending) * Initialize everything */ -void -ng_btsocket_l2cap_init(void) +static void +ng_btsocket_l2cap_init(void *arg __unused) { int error = 0; - /* Skip initialization of globals for non-default instances. */ - if (!IS_DEFAULT_VNET(curvnet)) - return; - ng_btsocket_l2cap_node = NULL; ng_btsocket_l2cap_debug_level = NG_BTSOCKET_WARN_LEVEL; @@ -1950,6 +1946,8 @@ ng_btsocket_l2cap_init(void) TASK_INIT(&ng_btsocket_l2cap_rt_task, 0, ng_btsocket_l2cap_rtclean, NULL); } /* ng_btsocket_l2cap_init */ +SYSINIT(ng_btsocket_l2cap_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, + ng_btsocket_l2cap_init, NULL); /* * Abort connection on socket diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c index 5508ff7526d2..7674c23f25cc 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c @@ -513,15 +513,11 @@ ng_btsocket_l2cap_raw_rtclean(void *context, int pending) * Initialize everything */ -void -ng_btsocket_l2cap_raw_init(void) +static void +ng_btsocket_l2cap_raw_init(void *arg __unused) { int error = 0; - /* Skip initialization of globals for non-default instances. */ - if (!IS_DEFAULT_VNET(curvnet)) - return; - ng_btsocket_l2cap_raw_node = NULL; ng_btsocket_l2cap_raw_debug_level = NG_BTSOCKET_WARN_LEVEL; ng_btsocket_l2cap_raw_ioctl_timeout = 5; @@ -582,6 +578,8 @@ ng_btsocket_l2cap_raw_init(void) TASK_INIT(&ng_btsocket_l2cap_raw_rt_task, 0, ng_btsocket_l2cap_raw_rtclean, NULL); } /* ng_btsocket_l2cap_raw_init */ +SYSINIT(ng_btsocket_l2cap_raw_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, + ng_btsocket_l2cap_raw_init, NULL); /* * Abort connection on socket diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c index 5b7bbeb45407..d24e830becb1 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c @@ -328,14 +328,10 @@ ng_btsocket_rfcomm_check_fcs(u_int8_t *data, int type, u_int8_t fcs) * Initialize everything */ -void -ng_btsocket_rfcomm_init(void) +static void +ng_btsocket_rfcomm_init(void *arg __unused) { - /* Skip initialization of globals for non-default instances. */ - if (!IS_DEFAULT_VNET(curvnet)) - return; - ng_btsocket_rfcomm_debug_level = NG_BTSOCKET_WARN_LEVEL; ng_btsocket_rfcomm_timo = 60; @@ -353,6 +349,8 @@ ng_btsocket_rfcomm_init(void) mtx_init(&ng_btsocket_rfcomm_sockets_mtx, "btsocks_rfcomm_sockets_mtx", NULL, MTX_DEF); } /* ng_btsocket_rfcomm_init */ +SYSINIT(ng_btsocket_rfcomm_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, + ng_btsocket_rfcomm_init, NULL); /* * Abort connection on socket diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c b/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c index 068b1890f27f..92898dad3245 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c @@ -1098,15 +1098,11 @@ ng_btsocket_sco_rtclean(void *context, int pending) * Initialize everything */ -void -ng_btsocket_sco_init(void) +static void +ng_btsocket_sco_init(void *arg __unused) { int error = 0; - /* Skip initialization of globals for non-default instances. */ - if (!IS_DEFAULT_VNET(curvnet)) - return; - ng_btsocket_sco_node = NULL; ng_btsocket_sco_debug_level = NG_BTSOCKET_WARN_LEVEL; @@ -1160,6 +1156,8 @@ ng_btsocket_sco_init(void) TASK_INIT(&ng_btsocket_sco_rt_task, 0, ng_btsocket_sco_rtclean, NULL); } /* ng_btsocket_sco_init */ +SYSINIT(ng_btsocket_sco_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, + ng_btsocket_sco_init, NULL); /* * Abort connection on socket diff --git a/sys/netinet/in_proto.c b/sys/netinet/in_proto.c index 351c90699fc2..035051c6f5da 100644 --- a/sys/netinet/in_proto.c +++ b/sys/netinet/in_proto.c @@ -113,7 +113,6 @@ struct protosw inetsw[] = { .pr_domain = &inetdomain, .pr_protocol = IPPROTO_IP, .pr_flags = PR_CAPATTACH, - .pr_init = ip_init, .pr_slowtimo = ip_slowtimo, .pr_drain = ip_drain, .pr_usrreqs = &nousrreqs @@ -126,7 +125,6 @@ struct protosw inetsw[] = { .pr_input = udp_input, .pr_ctlinput = udp_ctlinput, .pr_ctloutput = udp_ctloutput, - .pr_init = udp_init, .pr_usrreqs = &udp_usrreqs }, { @@ -138,7 +136,6 @@ struct protosw inetsw[] = { .pr_input = tcp_input, .pr_ctlinput = tcp_ctlinput, .pr_ctloutput = tcp_ctloutput, - .pr_init = tcp_init, .pr_slowtimo = tcp_slowtimo, .pr_drain = tcp_drain, .pr_usrreqs = &tcp_usrreqs @@ -152,7 +149,6 @@ struct protosw inetsw[] = { .pr_input = sctp_input, .pr_ctlinput = sctp_ctlinput, .pr_ctloutput = sctp_ctloutput, - .pr_init = sctp_init, .pr_drain = sctp_drain, .pr_usrreqs = &sctp_usrreqs }, @@ -176,7 +172,6 @@ struct protosw inetsw[] = { .pr_input = udp_input, .pr_ctlinput = udplite_ctlinput, .pr_ctloutput = udp_ctloutput, - .pr_init = udplite_init, .pr_usrreqs = &udp_usrreqs }, { @@ -290,7 +285,6 @@ IPPROTOSPACER, .pr_flags = PR_ATOMIC|PR_ADDR, .pr_input = rip_input, .pr_ctloutput = rip_ctloutput, - .pr_init = rip_init, .pr_usrreqs = &rip_usrreqs }, }; diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c index cd0034008dc2..8f972f49b604 100644 --- a/sys/netinet/ip_divert.c +++ b/sys/netinet/ip_divert.c @@ -143,7 +143,7 @@ div_inpcb_init(void *mem, int size, int flags) } static void -div_init(void) +div_init(void *arg __unused) { /* @@ -153,6 +153,7 @@ div_init(void) */ in_pcbinfo_init(&V_divcbinfo, "div", 1, 1, "divcb", div_inpcb_init); } +VNET_SYSINIT(div_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, div_init, NULL); static void div_destroy(void *unused __unused) @@ -160,8 +161,7 @@ div_destroy(void *unused __unused) in_pcbinfo_destroy(&V_divcbinfo); } -VNET_SYSUNINIT(divert, SI_SUB_PROTO_DOMAININIT, SI_ORDER_ANY, - div_destroy, NULL); +VNET_SYSUNINIT(divert, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, div_destroy, NULL); /* * IPPROTO_DIVERT is not in the real IP protocol number space; this @@ -775,7 +775,6 @@ struct protosw div_protosw = { .pr_protocol = IPPROTO_DIVERT, .pr_flags = PR_ATOMIC|PR_ADDR, .pr_input = div_input, - .pr_init = div_init, .pr_usrreqs = &div_usrreqs }; diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c index c933a8044e06..8fd26e4ca861 100644 --- a/sys/netinet/ip_input.c +++ b/sys/netinet/ip_input.c @@ -301,12 +301,10 @@ SYSCTL_PROC(_net_inet_ip, IPCTL_INTRDQDROPS, intr_direct_queue_drops, * IP initialization: fill in IP protocol switch table. * All protocols not implemented in kernel go to raw IP protocol handler. */ -void -ip_init(void) +static void +ip_vnet_init(void *arg __unused) { struct pfil_head_args args; - struct protosw *pr; - int i; CK_STAILQ_INIT(&V_in_ifaddrhead); V_in_ifaddrhashtbl = hashinit(INADDR_NHASH, M_IFADDR, &V_in_ifaddrhmask); @@ -332,23 +330,27 @@ ip_init(void) printf("%s: WARNING: unable to register output helper hook\n", __func__); - /* Skip initialization of globals for non-default instances. */ #ifdef VIMAGE - if (!IS_DEFAULT_VNET(curvnet)) { - netisr_register_vnet(&ip_nh); + netisr_register_vnet(&ip_nh); #ifdef RSS - netisr_register_vnet(&ip_direct_nh); + netisr_register_vnet(&ip_direct_nh); #endif - return; - } #endif +} +VNET_SYSINIT(ip_vnet_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_FOURTH, + ip_vnet_init, NULL); + + +static void +ip_init(const void *unused __unused) +{ + struct protosw *pr; pr = pffindproto(PF_INET, IPPROTO_RAW, SOCK_RAW); - if (pr == NULL) - panic("ip_init: PF_INET not found"); + KASSERT(pr, ("%s: PF_INET not found", __func__)); /* Initialize the entire ip_protox[] array to IPPROTO_RAW. */ - for (i = 0; i < IPPROTO_MAX; i++) + for (int i = 0; i < IPPROTO_MAX; i++) ip_protox[i] = pr - inetsw; /* * Cycle through IP protocols and put them into the appropriate place @@ -368,6 +370,7 @@ ip_init(void) netisr_register(&ip_direct_nh); #endif } +SYSINIT(ip_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, ip_init, NULL); #ifdef VIMAGE static void diff --git a/sys/netinet/ip_var.h b/sys/netinet/ip_var.h index d5c68442a2b9..4eaaef5c6991 100644 --- a/sys/netinet/ip_var.h +++ b/sys/netinet/ip_var.h @@ -219,7 +219,6 @@ void ip_drain(void); int ip_fragment(struct ip *ip, struct mbuf **m_frag, int mtu, u_long if_hwassist_flags); void ip_forward(struct mbuf *m, int srcrt); -void ip_init(void); extern int (*ip_mforward)(struct ip *, struct ifnet *, struct mbuf *, struct ip_moptions *); @@ -236,7 +235,6 @@ void ip_slowtimo(void); void ip_fillid(struct ip *); int rip_ctloutput(struct socket *, struct sockopt *); void rip_ctlinput(int, struct sockaddr *, void *); -void rip_init(void); int rip_input(struct mbuf **, int *, int); int rip_output(struct mbuf *, struct socket *, ...); int ipip_input(struct mbuf **, int *, int); diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index de4e6e851c32..b7d338306b49 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -205,8 +205,8 @@ rip_inpcb_init(void *mem, int size, int flags) return (0); } -void -rip_init(void) +static void +rip_init(void *arg __unused) { in_pcbinfo_init(&V_ripcbinfo, "rip", INP_PCBHASH_RAW_SIZE, 1, "ripcb", @@ -214,6 +214,7 @@ rip_init(void) EVENTHANDLER_REGISTER(maxsockets_change, rip_zone_change, NULL, EVENTHANDLER_PRI_ANY); } +VNET_SYSINIT(rip_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, rip_init, NULL); #ifdef VIMAGE static void diff --git a/sys/netinet/sctp_module.c b/sys/netinet/sctp_module.c index 50b09eb6f930..70a9daeffc2a 100644 --- a/sys/netinet/sctp_module.c +++ b/sys/netinet/sctp_module.c @@ -91,7 +91,6 @@ struct protosw sctp6_stream_protosw = { .pr_input = sctp6_input, .pr_ctlinput = sctp6_ctlinput, .pr_ctloutput = sctp_ctloutput, - .pr_init = sctp_init, .pr_drain = sctp_drain, .pr_usrreqs = &sctp6_usrreqs, }; @@ -105,7 +104,6 @@ struct protosw sctp6_seqpacket_protosw = { .pr_ctlinput = sctp6_ctlinput, .pr_ctloutput = sctp_ctloutput, #ifndef INET /* Do not call initialization and drain routines twice. */ - .pr_init = sctp_init, .pr_drain = sctp_drain, #endif .pr_usrreqs = &sctp6_usrreqs, diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index e30d02dc9de1..9ac57155c3bb 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -58,8 +58,8 @@ __FBSDID("$FreeBSD$"); extern const struct sctp_cc_functions sctp_cc_functions[]; extern const struct sctp_ss_functions sctp_ss_functions[]; -void -sctp_init(void) +static void +sctp_init(void *arg __unused) { u_long sb_max_adj; @@ -91,6 +91,7 @@ sctp_init(void) SCTP_BASE_VAR(eh_tag) = EVENTHANDLER_REGISTER(rt_addrmsg, sctp_addr_change_event_handler, NULL, EVENTHANDLER_PRI_FIRST); } +VNET_SYSINIT(sctp_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, sctp_init, NULL); #ifdef VIMAGE static void diff --git a/sys/netinet/sctp_var.h b/sys/netinet/sctp_var.h index a18dbb5e66e2..b45c4ac410f9 100644 --- a/sys/netinet/sctp_var.h +++ b/sys/netinet/sctp_var.h @@ -330,7 +330,6 @@ int sctp_input(struct mbuf **, int *, int); #endif void sctp_pathmtu_adjustment(struct sctp_tcb *, uint32_t, bool); void sctp_drain(void); -void sctp_init(void); void sctp_notify(struct sctp_inpcb *, struct sctp_tcb *, struct sctp_nets *, uint8_t, uint8_t, uint16_t, uint32_t); diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index 041e639a447b..3a02988e5b6d 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -1422,13 +1422,9 @@ deregister_tcp_functions(struct tcp_function_block *blk, bool quiesce, return (0); } -void -tcp_init(void) +static void +tcp_vnet_init(void *arg __unused) { - const char *tcbhash_tuneable; - int hashsize; - - tcbhash_tuneable = "net.inet.tcp.tcbhashsize"; #ifdef TCP_HHOOK if (hhook_head_register(HHOOK_TYPE_TCP, HHOOK_TCP_EST_IN, @@ -1443,46 +1439,7 @@ tcp_init(void) printf("%s: WARNING: unable to initialise TCP stats\n", __func__); #endif - hashsize = TCBHASHSIZE; - TUNABLE_INT_FETCH(tcbhash_tuneable, &hashsize); - if (hashsize == 0) { - /* - * Auto tune the hash size based on maxsockets. - * A perfect hash would have a 1:1 mapping - * (hashsize = maxsockets) however it's been - * suggested that O(2) average is better. - */ - hashsize = maketcp_hashsize(maxsockets / 4); - /* - * Our historical default is 512, - * do not autotune lower than this. - */ - if (hashsize < 512) - hashsize = 512; - if (bootverbose && IS_DEFAULT_VNET(curvnet)) - printf("%s: %s auto tuned to %d\n", __func__, - tcbhash_tuneable, hashsize); - } - /* - * We require a hashsize to be a power of two. - * Previously if it was not a power of two we would just reset it - * back to 512, which could be a nasty surprise if you did not notice - * the error message. - * Instead what we do is clip it to the closest power of two lower - * than the specified hash value. - */ - if (!powerof2(hashsize)) { - int oldhashsize = hashsize; - - hashsize = maketcp_hashsize(hashsize); - /* prevent absurdly low value */ - if (hashsize < 16) - hashsize = 16; - printf("%s: WARNING: TCB hash size not a power of 2, " - "clipped from %d to %d.\n", __func__, oldhashsize, - hashsize); - } - in_pcbinfo_init(&V_tcbinfo, "tcp", hashsize, hashsize, + in_pcbinfo_init(&V_tcbinfo, "tcp", tcp_tcbhashsize, tcp_tcbhashsize, "tcp_inpcb", tcp_inpcb_init); /* @@ -1507,10 +1464,15 @@ tcp_init(void) VNET_PCPUSTAT_ALLOC(tcpstat, M_WAITOK); V_tcp_msl = TCPTV_MSL; +} +VNET_SYSINIT(tcp_vnet_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_FOURTH, + tcp_vnet_init, NULL); - /* Skip initialization of globals for non-default instances. */ - if (!IS_DEFAULT_VNET(curvnet)) - return; +static void +tcp_init(void *arg __unused) +{ + const char *tcbhash_tuneable; + int hashsize; tcp_reass_global_init(); @@ -1530,7 +1492,6 @@ tcp_init(void) tcp_persmax = TCPTV_PERSMAX; tcp_rexmit_slop = TCPTV_CPU_VAR; tcp_finwait2_timeout = TCPTV_FINWAIT2_TIMEOUT; - tcp_tcbhashsize = hashsize; /* Setup the tcp function block list */ TAILQ_INIT(&t_functions); @@ -1580,7 +1541,50 @@ tcp_init(void) #ifdef TCPPCAP tcp_pcap_init(); #endif + + hashsize = TCBHASHSIZE; + tcbhash_tuneable = "net.inet.tcp.tcbhashsize"; + TUNABLE_INT_FETCH(tcbhash_tuneable, &hashsize); + if (hashsize == 0) { + /* + * Auto tune the hash size based on maxsockets. + * A perfect hash would have a 1:1 mapping + * (hashsize = maxsockets) however it's been + * suggested that O(2) average is better. + */ + hashsize = maketcp_hashsize(maxsockets / 4); + /* + * Our historical default is 512, + * do not autotune lower than this. + */ + if (hashsize < 512) + hashsize = 512; + if (bootverbose) + printf("%s: %s auto tuned to %d\n", __func__, + tcbhash_tuneable, hashsize); + } + /* + * We require a hashsize to be a power of two. + * Previously if it was not a power of two we would just reset it + * back to 512, which could be a nasty surprise if you did not notice + * the error message. + * Instead what we do is clip it to the closest power of two lower + * than the specified hash value. + */ + if (!powerof2(hashsize)) { + int oldhashsize = hashsize; + + hashsize = maketcp_hashsize(hashsize); + /* prevent absurdly low value */ + if (hashsize < 16) + hashsize = 16; + printf("%s: WARNING: TCB hash size not a power of 2, " + "clipped from %d to %d.\n", __func__, oldhashsize, + hashsize); + } + tcp_tcbhashsize = hashsize; } +SYSINIT(tcp_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, tcp_init, NULL); #ifdef VIMAGE static void diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h index 7792e2162852..e9d021fb4684 100644 --- a/sys/netinet/tcp_var.h +++ b/sys/netinet/tcp_var.h @@ -1076,7 +1076,6 @@ void tcp_ctlinput(int, struct sockaddr *, void *); int tcp_ctloutput(struct socket *, struct sockopt *); void tcp_ctlinput_viaudp(int, struct sockaddr *, void *, void *); void tcp_drain(void); -void tcp_init(void); void tcp_fini(void *); char *tcp_log_addrs(struct in_conninfo *, struct tcphdr *, void *, const void *); diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 28a1b3e89a41..582486ffbc92 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -198,8 +198,8 @@ udplite_inpcb_init(void *mem, int size, int flags) return (0); } -void -udp_init(void) +static void +udp_init(void *arg __unused) { /* @@ -217,15 +217,12 @@ udp_init(void) uma_zone_set_warning(V_udpcb_zone, "kern.ipc.maxsockets limit reached"); EVENTHANDLER_REGISTER(maxsockets_change, udp_zone_change, NULL, EVENTHANDLER_PRI_ANY); -} - -void -udplite_init(void) -{ + /* Additional pcbinfo for UDP-Lite */ in_pcbinfo_init(&V_ulitecbinfo, "udplite", UDBHASHSIZE, UDBHASHSIZE, "udplite_inpcb", udplite_inpcb_init); } +VNET_SYSINIT(udp_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, udp_init, NULL); /* * Kernel module interface for updating udpstat. The argument is an index diff --git a/sys/netinet/udp_var.h b/sys/netinet/udp_var.h index 7e6260d20375..cd9c4fd47e4f 100644 --- a/sys/netinet/udp_var.h +++ b/sys/netinet/udp_var.h @@ -170,8 +170,6 @@ void udp_discardcb(struct udpcb *); void udp_ctlinput(int, struct sockaddr *, void *); void udplite_ctlinput(int, struct sockaddr *, void *); int udp_ctloutput(struct socket *, struct sockopt *); -void udp_init(void); -void udplite_init(void); int udp_input(struct mbuf **, int *, int); void udplite_input(struct mbuf *, int); struct inpcb *udp_notify(struct inpcb *inp, int errno); diff --git a/sys/netinet6/in6_proto.c b/sys/netinet6/in6_proto.c index 909564b8c7e5..44eb0fa4ee62 100644 --- a/sys/netinet6/in6_proto.c +++ b/sys/netinet6/in6_proto.c @@ -146,7 +146,6 @@ struct protosw inet6sw[] = { .pr_domain = &inet6domain, .pr_protocol = IPPROTO_IPV6, .pr_flags = PR_CAPATTACH, - .pr_init = ip6_init, .pr_slowtimo = frag6_slowtimo, .pr_drain = frag6_drain, .pr_usrreqs = &nousrreqs, @@ -159,9 +158,6 @@ struct protosw inet6sw[] = { .pr_input = udp6_input, .pr_ctlinput = udp6_ctlinput, .pr_ctloutput = ip6_ctloutput, -#ifndef INET /* Do not call initialization twice. */ - .pr_init = udp_init, -#endif .pr_usrreqs = &udp6_usrreqs, }, { @@ -174,7 +170,6 @@ struct protosw inet6sw[] = { .pr_ctlinput = tcp6_ctlinput, .pr_ctloutput = tcp_ctloutput, #ifndef INET /* don't call initialization, timeout, and drain routines twice */ - .pr_init = tcp_init, .pr_slowtimo = tcp_slowtimo, .pr_drain = tcp_drain, #endif @@ -191,7 +186,6 @@ struct protosw inet6sw[] = { .pr_ctloutput = sctp_ctloutput, #ifndef INET /* Do not call initialization and drain routines twice. */ .pr_drain = sctp_drain, - .pr_init = sctp_init, #endif .pr_usrreqs = &sctp6_usrreqs }, @@ -215,9 +209,6 @@ struct protosw inet6sw[] = { .pr_input = udp6_input, .pr_ctlinput = udplite6_ctlinput, .pr_ctloutput = udp_ctloutput, -#ifndef INET /* Do not call initialization twice. */ - .pr_init = udplite_init, -#endif .pr_usrreqs = &udp6_usrreqs, }, { @@ -229,9 +220,6 @@ struct protosw inet6sw[] = { .pr_output = rip6_output, .pr_ctlinput = rip6_ctlinput, .pr_ctloutput = rip6_ctloutput, -#ifndef INET /* Do not call initialization twice. */ - .pr_init = rip_init, -#endif .pr_usrreqs = &rip6_usrreqs }, { diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c index 2d4e63ca83b6..3a13d2a9dc74 100644 --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -216,12 +216,10 @@ static int ip6_hopopts_input(u_int32_t *, u_int32_t *, struct mbuf **, int *); * IP6 initialization: fill in IP6 protocol switch table. * All protocols not implemented in kernel go to raw IP6 protocol handler. */ -void -ip6_init(void) +static void +ip6_vnet_init(void *arg __unused) { struct pfil_head_args args; - struct protosw *pr; - int i; TUNABLE_INT_FETCH("net.inet6.ip6.auto_linklocal", &V_ip6_auto_linklocal); @@ -259,21 +257,25 @@ ip6_init(void) /* Skip global initialization stuff for non-default instances. */ #ifdef VIMAGE - if (!IS_DEFAULT_VNET(curvnet)) { - netisr_register_vnet(&ip6_nh); + netisr_register_vnet(&ip6_nh); #ifdef RSS - netisr_register_vnet(&ip6_direct_nh); + netisr_register_vnet(&ip6_direct_nh); #endif - return; - } #endif +} +VNET_SYSINIT(ip6_vnet_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_FOURTH, + ip6_vnet_init, NULL); + +static void +ip6_init(void *arg __unused) +{ + struct protosw *pr; pr = pffindproto(PF_INET6, IPPROTO_RAW, SOCK_RAW); - if (pr == NULL) - panic("ip6_init"); + KASSERT(pr, ("%s: PF_INET6 not found", __func__)); /* Initialize the entire ip6_protox[] array to IPPROTO_RAW. */ - for (i = 0; i < IPPROTO_MAX; i++) + for (int i = 0; i < IPPROTO_MAX; i++) ip6_protox[i] = pr - inet6sw; /* * Cycle through IP protocols and put them into the appropriate place @@ -293,6 +295,7 @@ ip6_init(void) netisr_register(&ip6_direct_nh); #endif } +SYSINIT(ip6_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, ip6_init, NULL); /* * The protocol to be inserted into ip6_protox[] must be already registered diff --git a/sys/netinet6/ip6_var.h b/sys/netinet6/ip6_var.h index de7a938a3289..76aa304288bf 100644 --- a/sys/netinet6/ip6_var.h +++ b/sys/netinet6/ip6_var.h @@ -347,7 +347,6 @@ struct inpcb; int icmp6_ctloutput(struct socket *, struct sockopt *sopt); struct in6_ifaddr; -void ip6_init(void); int ip6proto_register(short); int ip6proto_unregister(short); diff --git a/sys/netipsec/keysock.c b/sys/netipsec/keysock.c index aa893b131a57..83ed2bca2f47 100644 --- a/sys/netipsec/keysock.c +++ b/sys/netipsec/keysock.c @@ -448,7 +448,6 @@ struct protosw keysw[] = { .pr_flags = PR_ATOMIC|PR_ADDR, .pr_output = key_output, .pr_ctlinput = raw_ctlinput, - .pr_init = raw_init, .pr_usrreqs = &key_usrreqs } }; diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h index a929544501f4..dc550d42f1fd 100644 --- a/sys/sys/protosw.h +++ b/sys/sys/protosw.h @@ -52,7 +52,6 @@ struct sockopt; * Each protocol has a handle initializing one of these structures, * which is used for protocol-protocol and system-protocol communication. * - * A protocol is called through the pr_init entry before any other. * Thereafter it is called every 200ms through the pr_fasttimo entry and * every 500ms through the pr_slowtimo for timer based actions. * The system will call the pr_drain entry if it is low on space and @@ -73,7 +72,6 @@ typedef int pr_input_t (struct mbuf **, int*, int); typedef int pr_output_t (struct mbuf *, struct socket *, ...); typedef void pr_ctlinput_t (int, struct sockaddr *, void *); typedef int pr_ctloutput_t (struct socket *, struct sockopt *); -typedef void pr_init_t (void); typedef void pr_fasttimo_t (void); typedef void pr_slowtimo_t (void); typedef void pr_drain_t (void); @@ -89,7 +87,6 @@ struct protosw { pr_ctlinput_t *pr_ctlinput; /* control input (from below) */ pr_ctloutput_t *pr_ctloutput; /* control output (from above) */ /* utility hooks */ - pr_init_t *pr_init; pr_fasttimo_t *pr_fasttimo; /* fast timeout (200ms) */ pr_slowtimo_t *pr_slowtimo; /* slow timeout (500ms) */ pr_drain_t *pr_drain; /* flush any excess space possible */