xref: /minix3/minix/net/lwip/mibtree.c (revision ef8d499e2d2af900e9b2ab297171d7b088652482)
1*ef8d499eSDavid van Moolenbroek /* LWIP service - mibtree.c - sysctl support for */
2*ef8d499eSDavid van Moolenbroek /*
3*ef8d499eSDavid van Moolenbroek  * This file acts as a dispatcher for the net.inet, net.inet6, and minix.lwip
4*ef8d499eSDavid van Moolenbroek  * sysctl trees.  It does not cover the other net.* trees; these are taken care
5*ef8d499eSDavid van Moolenbroek  * of in other source files.
6*ef8d499eSDavid van Moolenbroek  */
7*ef8d499eSDavid van Moolenbroek 
8*ef8d499eSDavid van Moolenbroek #include "lwip.h"
9*ef8d499eSDavid van Moolenbroek 
10*ef8d499eSDavid van Moolenbroek #include <minix/sysctl.h>
11*ef8d499eSDavid van Moolenbroek 
12*ef8d499eSDavid van Moolenbroek #define MAX_PROTO	6	/* maximum # of INET protocols with subtrees */
13*ef8d499eSDavid van Moolenbroek 
14*ef8d499eSDavid van Moolenbroek static struct rmib_indir net_inet_indir[MAX_PROTO];
15*ef8d499eSDavid van Moolenbroek static unsigned int net_inet_indir_count = 0;
16*ef8d499eSDavid van Moolenbroek static struct rmib_node net_inet_node =
17*ef8d499eSDavid van Moolenbroek     RMIB_SNODE(RMIB_RO, net_inet_indir, "inet", "PF_INET related settings");
18*ef8d499eSDavid van Moolenbroek 
19*ef8d499eSDavid van Moolenbroek #ifdef INET6
20*ef8d499eSDavid van Moolenbroek static struct rmib_indir net_inet6_indir[MAX_PROTO];
21*ef8d499eSDavid van Moolenbroek static unsigned int net_inet6_indir_count = 0;
22*ef8d499eSDavid van Moolenbroek static struct rmib_node net_inet6_node =
23*ef8d499eSDavid van Moolenbroek     RMIB_SNODE(RMIB_RO, net_inet6_indir, "inet6", "PF_INET6 related settings");
24*ef8d499eSDavid van Moolenbroek #endif /* INET6 */
25*ef8d499eSDavid van Moolenbroek 
26*ef8d499eSDavid van Moolenbroek #define MAX_LWIP	4	/* maximum # of miscellaneous LWIP subtrees */
27*ef8d499eSDavid van Moolenbroek 
28*ef8d499eSDavid van Moolenbroek static struct rmib_indir minix_lwip_indir[MAX_LWIP];
29*ef8d499eSDavid van Moolenbroek static unsigned int minix_lwip_indir_count = 0;
30*ef8d499eSDavid van Moolenbroek static struct rmib_node minix_lwip_node =
31*ef8d499eSDavid van Moolenbroek     RMIB_SNODE(RMIB_RO, minix_lwip_indir, "lwip",
32*ef8d499eSDavid van Moolenbroek 	"LWIP service information and settings");
33*ef8d499eSDavid van Moolenbroek 
34*ef8d499eSDavid van Moolenbroek /*
35*ef8d499eSDavid van Moolenbroek  * Initialize the status module by registering the net.inet, net.inet6, and
36*ef8d499eSDavid van Moolenbroek  * minix.lwip trees with the MIB service.  Other modules must have added all
37*ef8d499eSDavid van Moolenbroek  * subtrees to those trees through mibtree_register_*() before this point.
38*ef8d499eSDavid van Moolenbroek  */
39*ef8d499eSDavid van Moolenbroek void
mibtree_init(void)40*ef8d499eSDavid van Moolenbroek mibtree_init(void)
41*ef8d499eSDavid van Moolenbroek {
42*ef8d499eSDavid van Moolenbroek 	const int inet_mib[] = { CTL_NET, PF_INET };
43*ef8d499eSDavid van Moolenbroek #ifdef INET6
44*ef8d499eSDavid van Moolenbroek 	const int inet6_mib[] = { CTL_NET, PF_INET6 };
45*ef8d499eSDavid van Moolenbroek #endif /* INET6 */
46*ef8d499eSDavid van Moolenbroek 	const int lwip_mib[] = { CTL_MINIX, MINIX_LWIP };
47*ef8d499eSDavid van Moolenbroek 	int r;
48*ef8d499eSDavid van Moolenbroek 
49*ef8d499eSDavid van Moolenbroek 	/*
50*ef8d499eSDavid van Moolenbroek 	 * Register the "net.inet", "net.inet6", and "minix.lwip" subtrees with
51*ef8d499eSDavid van Moolenbroek 	 * the MIB service.
52*ef8d499eSDavid van Moolenbroek 	 *
53*ef8d499eSDavid van Moolenbroek 	 * These calls only return local failures.  Remote failures (in the MIB
54*ef8d499eSDavid van Moolenbroek 	 * service) are silently ignored.  So, we can safely panic on failure.
55*ef8d499eSDavid van Moolenbroek 	 */
56*ef8d499eSDavid van Moolenbroek 	if ((r = rmib_register(inet_mib, __arraycount(inet_mib),
57*ef8d499eSDavid van Moolenbroek 	    &net_inet_node)) != OK)
58*ef8d499eSDavid van Moolenbroek 		panic("unable to register net.inet RMIB tree: %d", r);
59*ef8d499eSDavid van Moolenbroek 
60*ef8d499eSDavid van Moolenbroek #ifdef INET6
61*ef8d499eSDavid van Moolenbroek 	if ((r = rmib_register(inet6_mib, __arraycount(inet6_mib),
62*ef8d499eSDavid van Moolenbroek 	    &net_inet6_node)) != OK)
63*ef8d499eSDavid van Moolenbroek 		panic("unable to register net.inet6 RMIB tree: %d", r);
64*ef8d499eSDavid van Moolenbroek #endif /* INET6 */
65*ef8d499eSDavid van Moolenbroek 
66*ef8d499eSDavid van Moolenbroek 	if ((r = rmib_register(lwip_mib, __arraycount(lwip_mib),
67*ef8d499eSDavid van Moolenbroek 	    &minix_lwip_node)) != OK)
68*ef8d499eSDavid van Moolenbroek 		panic("unable to register minix.lwip RMIB tree: %d", r);
69*ef8d499eSDavid van Moolenbroek }
70*ef8d499eSDavid van Moolenbroek 
71*ef8d499eSDavid van Moolenbroek /*
72*ef8d499eSDavid van Moolenbroek  * Add a subtree to the local net.inet or net.inet6 tree.  This function must
73*ef8d499eSDavid van Moolenbroek  * only be called *before* mibtree_init(), as the latter will register the
74*ef8d499eSDavid van Moolenbroek  * final tree with the MIB service.
75*ef8d499eSDavid van Moolenbroek  */
76*ef8d499eSDavid van Moolenbroek void
mibtree_register_inet(int domain,int protocol,struct rmib_node * node)77*ef8d499eSDavid van Moolenbroek mibtree_register_inet(int domain, int protocol, struct rmib_node * node)
78*ef8d499eSDavid van Moolenbroek {
79*ef8d499eSDavid van Moolenbroek 	struct rmib_node *parent;
80*ef8d499eSDavid van Moolenbroek 	struct rmib_indir *indir;
81*ef8d499eSDavid van Moolenbroek 	unsigned int i, *count;
82*ef8d499eSDavid van Moolenbroek 
83*ef8d499eSDavid van Moolenbroek 	switch (domain) {
84*ef8d499eSDavid van Moolenbroek 	case PF_INET:
85*ef8d499eSDavid van Moolenbroek 		parent = &net_inet_node;
86*ef8d499eSDavid van Moolenbroek 		indir = net_inet_indir;
87*ef8d499eSDavid van Moolenbroek 		count = &net_inet_indir_count;
88*ef8d499eSDavid van Moolenbroek 		break;
89*ef8d499eSDavid van Moolenbroek 	case PF_INET6:
90*ef8d499eSDavid van Moolenbroek #ifdef INET6
91*ef8d499eSDavid van Moolenbroek 		parent = &net_inet6_node;
92*ef8d499eSDavid van Moolenbroek 		indir = net_inet6_indir;
93*ef8d499eSDavid van Moolenbroek 		count = &net_inet6_indir_count;
94*ef8d499eSDavid van Moolenbroek 		break;
95*ef8d499eSDavid van Moolenbroek #else /* !INET6 */
96*ef8d499eSDavid van Moolenbroek 		return;
97*ef8d499eSDavid van Moolenbroek #endif /* !INET6 */
98*ef8d499eSDavid van Moolenbroek 	default:
99*ef8d499eSDavid van Moolenbroek 		panic("invalid domain %d", domain);
100*ef8d499eSDavid van Moolenbroek 	}
101*ef8d499eSDavid van Moolenbroek 
102*ef8d499eSDavid van Moolenbroek 	assert(*count < MAX_PROTO);
103*ef8d499eSDavid van Moolenbroek 
104*ef8d499eSDavid van Moolenbroek 	/* Insertion sort. */
105*ef8d499eSDavid van Moolenbroek 	for (i = 0; i < *count; i++) {
106*ef8d499eSDavid van Moolenbroek 		assert(indir[i].rindir_id != (unsigned int)protocol);
107*ef8d499eSDavid van Moolenbroek 
108*ef8d499eSDavid van Moolenbroek 		if (indir[i].rindir_id > (unsigned int)protocol)
109*ef8d499eSDavid van Moolenbroek 			break;
110*ef8d499eSDavid van Moolenbroek 	}
111*ef8d499eSDavid van Moolenbroek 
112*ef8d499eSDavid van Moolenbroek 	if (i < *count)
113*ef8d499eSDavid van Moolenbroek 		memmove(&indir[i + 1], &indir[i],
114*ef8d499eSDavid van Moolenbroek 		    sizeof(indir[0]) * (*count - i));
115*ef8d499eSDavid van Moolenbroek 
116*ef8d499eSDavid van Moolenbroek 	indir[i].rindir_id = protocol;
117*ef8d499eSDavid van Moolenbroek 	indir[i].rindir_node = node;
118*ef8d499eSDavid van Moolenbroek 	parent->rnode_size = ++*count;
119*ef8d499eSDavid van Moolenbroek }
120*ef8d499eSDavid van Moolenbroek 
121*ef8d499eSDavid van Moolenbroek /*
122*ef8d499eSDavid van Moolenbroek  * Add a miscellaneous subtree to the local minix.lwip tree.  This function
123*ef8d499eSDavid van Moolenbroek  * must only be called *before* mibtree_init(), as the latter will register the
124*ef8d499eSDavid van Moolenbroek  * final tree with the MIB service.  Note that the given subtrees are numbered
125*ef8d499eSDavid van Moolenbroek  * arbitrarily.  We use sparse trees here only to avoid having to declare
126*ef8d499eSDavid van Moolenbroek  * external variables, which is a bit of a hack, but with the expected low
127*ef8d499eSDavid van Moolenbroek  * number of miscellaneous subtrees there will be no performance penalty.
128*ef8d499eSDavid van Moolenbroek  */
129*ef8d499eSDavid van Moolenbroek void
mibtree_register_lwip(struct rmib_node * node)130*ef8d499eSDavid van Moolenbroek mibtree_register_lwip(struct rmib_node * node)
131*ef8d499eSDavid van Moolenbroek {
132*ef8d499eSDavid van Moolenbroek 	unsigned int i;
133*ef8d499eSDavid van Moolenbroek 
134*ef8d499eSDavid van Moolenbroek 	i = minix_lwip_indir_count;
135*ef8d499eSDavid van Moolenbroek 
136*ef8d499eSDavid van Moolenbroek 	assert(i < __arraycount(minix_lwip_indir));
137*ef8d499eSDavid van Moolenbroek 
138*ef8d499eSDavid van Moolenbroek 	minix_lwip_indir[i].rindir_id = i;
139*ef8d499eSDavid van Moolenbroek 	minix_lwip_indir[i].rindir_node = node;
140*ef8d499eSDavid van Moolenbroek 	minix_lwip_node.rnode_size = ++minix_lwip_indir_count;
141*ef8d499eSDavid van Moolenbroek }
142