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