xref: /minix3/minix/usr.bin/trace/ioctl/net.c (revision ef8d499e2d2af900e9b2ab297171d7b088652482)
1521fa314SDavid van Moolenbroek 
2521fa314SDavid van Moolenbroek #include "inc.h"
3521fa314SDavid van Moolenbroek 
4521fa314SDavid van Moolenbroek #include <sys/ioctl.h>
5521fa314SDavid van Moolenbroek #include <sys/ucred.h>
6521fa314SDavid van Moolenbroek #include <net/gen/in.h>
7521fa314SDavid van Moolenbroek #include <net/gen/ether.h>
8521fa314SDavid van Moolenbroek #include <net/gen/eth_io.h>
9521fa314SDavid van Moolenbroek #include <net/gen/arp_io.h>
10521fa314SDavid van Moolenbroek #include <net/gen/ip_io.h>
11521fa314SDavid van Moolenbroek #include <net/gen/route.h>
12521fa314SDavid van Moolenbroek #include <net/gen/tcp.h>
13521fa314SDavid van Moolenbroek #include <net/gen/tcp_io.h>
14521fa314SDavid van Moolenbroek #include <net/gen/udp.h>
15521fa314SDavid van Moolenbroek #include <net/gen/udp_io.h>
16521fa314SDavid van Moolenbroek #include <net/gen/udp_io_hdr.h>
17521fa314SDavid van Moolenbroek #include <net/gen/psip_io.h>
18521fa314SDavid van Moolenbroek #include <arpa/inet.h>
19521fa314SDavid van Moolenbroek 
20*ef8d499eSDavid van Moolenbroek #include <net/route.h>
21*ef8d499eSDavid van Moolenbroek #include <netinet6/in6_var.h>
22*ef8d499eSDavid van Moolenbroek #include <netinet6/nd6.h>
23*ef8d499eSDavid van Moolenbroek #include <net80211/ieee80211_ioctl.h>
24*ef8d499eSDavid van Moolenbroek 
25521fa314SDavid van Moolenbroek const char *
net_ioctl_name(unsigned long req)26521fa314SDavid van Moolenbroek net_ioctl_name(unsigned long req)
27521fa314SDavid van Moolenbroek {
28521fa314SDavid van Moolenbroek 
29521fa314SDavid van Moolenbroek 	switch (req) {
30521fa314SDavid van Moolenbroek 	NAME(FIONREAD);
31*ef8d499eSDavid van Moolenbroek 	/* sys/sockio.h */
32*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSHIWAT);		/* TODO: print argument */
33*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGHIWAT);		/* TODO: print argument */
34*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSLOWAT);		/* TODO: print argument */
35*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGLOWAT);		/* TODO: print argument */
36*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSPGRP);		/* TODO: print argument */
37*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGPGRP);		/* TODO: print argument */
38*ef8d499eSDavid van Moolenbroek 	NAME(SIOCADDRT);		/* TODO: print argument */
39*ef8d499eSDavid van Moolenbroek 	NAME(SIOCDELRT);		/* TODO: print argument */
40*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFADDR);		/* TODO: print argument */
41*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFADDR);		/* TODO: print argument */
42*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFDSTADDR);		/* TODO: print argument */
43*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFDSTADDR);		/* TODO: print argument */
44*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFFLAGS);		/* TODO: print argument */
45*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFFLAGS);		/* TODO: print argument */
46*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFBRDADDR);		/* TODO: print argument */
47*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFBRDADDR);		/* TODO: print argument */
48*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFCONF);		/* TODO: print argument */
49*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFNETMASK);		/* TODO: print argument */
50*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFNETMASK);		/* TODO: print argument */
51*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFMETRIC);		/* TODO: print argument */
52*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFMETRIC);		/* TODO: print argument */
53*ef8d499eSDavid van Moolenbroek 	NAME(SIOCDIFADDR);		/* TODO: print argument */
54*ef8d499eSDavid van Moolenbroek 	NAME(SIOCAIFADDR);		/* TODO: print argument */
55*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFALIAS);		/* TODO: print argument */
56*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFAFLAG_IN);		/* TODO: print argument */
57*ef8d499eSDavid van Moolenbroek 	NAME(SIOCALIFADDR);		/* TODO: print argument */
58*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGLIFADDR);		/* TODO: print argument */
59*ef8d499eSDavid van Moolenbroek 	NAME(SIOCDLIFADDR);		/* TODO: print argument */
60*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFADDRPREF);		/* TODO: print argument */
61*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFADDRPREF);		/* TODO: print argument */
62*ef8d499eSDavid van Moolenbroek 	NAME(SIOCADDMULTI);		/* TODO: print argument */
63*ef8d499eSDavid van Moolenbroek 	NAME(SIOCDELMULTI);		/* TODO: print argument */
64*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFMEDIA);		/* TODO: print argument */
65*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFMEDIA);		/* TODO: print argument */
66*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFGENERIC);		/* TODO: print argument */
67*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFGENERIC);		/* TODO: print argument */
68*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFPHYADDR);		/* TODO: print argument */
69*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFPSRCADDR);		/* TODO: print argument */
70*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFPDSTADDR);		/* TODO: print argument */
71*ef8d499eSDavid van Moolenbroek 	NAME(SIOCDIFPHYADDR);		/* TODO: print argument */
72*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSLIFPHYADDR);		/* TODO: print argument */
73*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGLIFPHYADDR);		/* TODO: print argument */
74*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFMTU);		/* TODO: print argument */
75*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFMTU);		/* TODO: print argument */
76*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSDRVSPEC);		/* TODO: print argument */
77*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGDRVSPEC);		/* TODO: print argument */
78*ef8d499eSDavid van Moolenbroek 	NAME(SIOCIFCREATE);		/* TODO: print argument */
79*ef8d499eSDavid van Moolenbroek 	NAME(SIOCIFDESTROY);		/* TODO: print argument */
80*ef8d499eSDavid van Moolenbroek 	NAME(SIOCIFGCLONERS);		/* TODO: print argument */
81*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFDLT);		/* TODO: print argument */
82*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFCAP);		/* TODO: print argument */
83*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFCAP);		/* TODO: print argument */
84*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSVH);			/* TODO: print argument */
85*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGVH);			/* TODO: print argument */
86*ef8d499eSDavid van Moolenbroek 	NAME(SIOCINITIFADDR);		/* TODO: print argument */
87*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFDATA);		/* TODO: print argument */
88*ef8d499eSDavid van Moolenbroek 	NAME(SIOCZIFDATA);		/* TODO: print argument */
89*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGLINKSTR);		/* TODO: print argument */
90*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSLINKSTR);		/* TODO: print argument */
91*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGETHERCAP);		/* TODO: print argument */
92*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFINDEX);		/* TODO: print argument */
93*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSETPFSYNC);		/* TODO: print argument */
94*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGETPFSYNC);		/* TODO: print argument */
95*ef8d499eSDavid van Moolenbroek 	/* netinet6/in6_var.h */
96*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFADDR_IN6);		/* TODO: print argument */
97*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFADDR_IN6);		/* TODO: print argument */
98*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFDSTADDR_IN6);	/* TODO: print argument */
99*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFNETMASK_IN6);	/* TODO: print argument */
100*ef8d499eSDavid van Moolenbroek 	NAME(SIOCDIFADDR_IN6);		/* TODO: print argument */
101*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFPSRCADDR_IN6);	/* TODO: print argument */
102*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFPDSTADDR_IN6);	/* TODO: print argument */
103*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFAFLAG_IN6);		/* TODO: print argument */
104*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGDRLST_IN6);		/* TODO: print argument */
105*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSNDFLUSH_IN6);		/* TODO: print argument */
106*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGNBRINFO_IN6);		/* TODO: print argument */
107*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSRTRFLUSH_IN6);	/* TODO: print argument */
108*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFSTAT_IN6);		/* TODO: print argument */
109*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFSTAT_ICMP6);	/* TODO: print argument */
110*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSDEFIFACE_IN6);	/* TODO: print argument */
111*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGDEFIFACE_IN6);	/* TODO: print argument */
112*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFINFO_FLAGS);	/* TODO: print argument */
113*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFPREFIX_IN6);	/* TODO: print argument */
114*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFPREFIX_IN6);	/* TODO: print argument */
115*ef8d499eSDavid van Moolenbroek 	NAME(SIOCDIFPREFIX_IN6);	/* TODO: print argument */
116*ef8d499eSDavid van Moolenbroek 	NAME(SIOCAIFPREFIX_IN6);	/* TODO: print argument */
117*ef8d499eSDavid van Moolenbroek 	NAME(SIOCCIFPREFIX_IN6);	/* TODO: print argument */
118*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFALIFETIME_IN6);	/* TODO: print argument */
119*ef8d499eSDavid van Moolenbroek 	NAME(SIOCAIFADDR_IN6);		/* TODO: print argument */
120*ef8d499eSDavid van Moolenbroek 	NAME(SIOCGIFINFO_IN6);		/* TODO: print argument */
121*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFINFO_IN6);		/* TODO: print argument */
122*ef8d499eSDavid van Moolenbroek 	NAME(SIOCSIFPHYADDR_IN6);	/* TODO: print argument */
123*ef8d499eSDavid van Moolenbroek 	NAME(SIOCAADDRCTL_POLICY);	/* TODO: print argument */
124*ef8d499eSDavid van Moolenbroek 	NAME(SIOCDADDRCTL_POLICY);	/* TODO: print argument */
125*ef8d499eSDavid van Moolenbroek 	/* net80211/ieee80211_ioctl.h */
126*ef8d499eSDavid van Moolenbroek 	NAME(SIOCS80211NWID);		/* TODO: print argument */
127*ef8d499eSDavid van Moolenbroek 	NAME(SIOCG80211NWID);		/* TODO: print argument */
128*ef8d499eSDavid van Moolenbroek 	/* old MINIX inet ioctls */
129521fa314SDavid van Moolenbroek 	NAME(NWIOSETHOPT);	/* TODO: print argument */
130521fa314SDavid van Moolenbroek 	NAME(NWIOGETHOPT);	/* TODO: print argument */
131521fa314SDavid van Moolenbroek 	NAME(NWIOGETHSTAT);	/* TODO: print argument */
132521fa314SDavid van Moolenbroek 	NAME(NWIOARPGIP);	/* TODO: print argument */
133521fa314SDavid van Moolenbroek 	NAME(NWIOARPGNEXT);	/* TODO: print argument */
134521fa314SDavid van Moolenbroek 	NAME(NWIOARPSIP);	/* TODO: print argument */
135521fa314SDavid van Moolenbroek 	NAME(NWIOARPDIP);	/* TODO: print argument */
136521fa314SDavid van Moolenbroek 	NAME(NWIOSIPCONF2);	/* TODO: print argument */
137521fa314SDavid van Moolenbroek 	NAME(NWIOSIPCONF);	/* TODO: print argument */
138521fa314SDavid van Moolenbroek 	NAME(NWIOGIPCONF2);	/* TODO: print argument */
139521fa314SDavid van Moolenbroek 	NAME(NWIOGIPCONF);	/* TODO: print argument */
140521fa314SDavid van Moolenbroek 	NAME(NWIOSIPOPT);
141521fa314SDavid van Moolenbroek 	NAME(NWIOGIPOPT);
142521fa314SDavid van Moolenbroek 	NAME(NWIOGIPOROUTE);	/* TODO: print argument */
143521fa314SDavid van Moolenbroek 	NAME(NWIOSIPOROUTE);	/* TODO: print argument */
144521fa314SDavid van Moolenbroek 	NAME(NWIODIPOROUTE);	/* TODO: print argument */
145521fa314SDavid van Moolenbroek 	NAME(NWIOGIPIROUTE);	/* TODO: print argument */
146521fa314SDavid van Moolenbroek 	NAME(NWIOSIPIROUTE);	/* TODO: print argument */
147521fa314SDavid van Moolenbroek 	NAME(NWIODIPIROUTE);	/* TODO: print argument */
148521fa314SDavid van Moolenbroek 	NAME(NWIOSTCPCONF);
149521fa314SDavid van Moolenbroek 	NAME(NWIOGTCPCONF);
150521fa314SDavid van Moolenbroek 	NAME(NWIOTCPCONN);
151521fa314SDavid van Moolenbroek 	NAME(NWIOTCPLISTEN);
152521fa314SDavid van Moolenbroek 	NAME(NWIOTCPATTACH);	/* TODO: print argument */
153521fa314SDavid van Moolenbroek 	NAME(NWIOTCPSHUTDOWN);	/* no argument */
154521fa314SDavid van Moolenbroek 	NAME(NWIOSTCPOPT);
155521fa314SDavid van Moolenbroek 	NAME(NWIOGTCPOPT);
156521fa314SDavid van Moolenbroek 	NAME(NWIOTCPPUSH);	/* no argument */
157521fa314SDavid van Moolenbroek 	NAME(NWIOTCPLISTENQ);
158521fa314SDavid van Moolenbroek 	NAME(NWIOGTCPCOOKIE);
159521fa314SDavid van Moolenbroek 	NAME(NWIOTCPACCEPTTO);
160521fa314SDavid van Moolenbroek 	NAME(NWIOTCPGERROR);
161521fa314SDavid van Moolenbroek 	NAME(NWIOSUDPOPT);
162521fa314SDavid van Moolenbroek 	NAME(NWIOGUDPOPT);
163521fa314SDavid van Moolenbroek 	NAME(NWIOUDPPEEK);	/* TODO: print argument */
164521fa314SDavid van Moolenbroek 	NAME(NWIOSPSIPOPT);	/* TODO: print argument */
165521fa314SDavid van Moolenbroek 	NAME(NWIOGPSIPOPT);	/* TODO: print argument */
166521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSFADDR);
167521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSTADDR);
168521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSADDR);
169521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSADDR);
170521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSPADDR);
171521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSTYPE);
172521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSBLOG);
173521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSCONN);
174521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSSHUT);
175521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSPAIR);
176521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSACCEPT);
177521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSCTRL);
178521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSCTRL);
179521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSSOTYPE);
180521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSPEERCRED);
181521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSSNDBUF);
182521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSSNDBUF);
183521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSRCVBUF);
184521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSRCVBUF);
185521fa314SDavid van Moolenbroek 	}
186521fa314SDavid van Moolenbroek 
187521fa314SDavid van Moolenbroek 	return NULL;
188521fa314SDavid van Moolenbroek }
189521fa314SDavid van Moolenbroek 
190521fa314SDavid van Moolenbroek static const struct flags ipopt_flags[] = {
191521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWIO_NOFLAGS),
192521fa314SDavid van Moolenbroek 	FLAG_MASK(NWIO_ACC_MASK, NWIO_EXCL),
193521fa314SDavid van Moolenbroek 	FLAG_MASK(NWIO_ACC_MASK, NWIO_SHARED),
194521fa314SDavid van Moolenbroek 	FLAG_MASK(NWIO_ACC_MASK, NWIO_COPY),
195521fa314SDavid van Moolenbroek 	FLAG(NWIO_EN_LOC),
196521fa314SDavid van Moolenbroek 	FLAG(NWIO_DI_LOC),
197521fa314SDavid van Moolenbroek 	FLAG(NWIO_EN_BROAD),
198521fa314SDavid van Moolenbroek 	FLAG(NWIO_DI_BROAD),
199521fa314SDavid van Moolenbroek 	FLAG(NWIO_REMSPEC),
200521fa314SDavid van Moolenbroek 	FLAG(NWIO_REMANY),
201521fa314SDavid van Moolenbroek 	FLAG(NWIO_PROTOSPEC),
202521fa314SDavid van Moolenbroek 	FLAG(NWIO_PROTOANY),
203521fa314SDavid van Moolenbroek 	FLAG(NWIO_HDR_O_SPEC),
204521fa314SDavid van Moolenbroek 	FLAG(NWIO_HDR_O_ANY),
205521fa314SDavid van Moolenbroek 	FLAG(NWIO_RWDATONLY),
206521fa314SDavid van Moolenbroek 	FLAG(NWIO_RWDATALL),
207521fa314SDavid van Moolenbroek };
208521fa314SDavid van Moolenbroek 
209521fa314SDavid van Moolenbroek static void
put_ipaddr(struct trace_proc * proc,const char * name,ipaddr_t ipaddr)210521fa314SDavid van Moolenbroek put_ipaddr(struct trace_proc * proc, const char * name, ipaddr_t ipaddr)
211521fa314SDavid van Moolenbroek {
212521fa314SDavid van Moolenbroek 	struct in_addr in;
213521fa314SDavid van Moolenbroek 
214521fa314SDavid van Moolenbroek 	in.s_addr = ipaddr;
215521fa314SDavid van Moolenbroek 
216c38dbb97SDavid van Moolenbroek 	put_in_addr(proc, name, in);
217521fa314SDavid van Moolenbroek }
218521fa314SDavid van Moolenbroek 
219521fa314SDavid van Moolenbroek static void
put_ipproto(struct trace_proc * proc,const char * name,ipproto_t proto)220521fa314SDavid van Moolenbroek put_ipproto(struct trace_proc * proc, const char * name, ipproto_t proto)
221521fa314SDavid van Moolenbroek {
222521fa314SDavid van Moolenbroek 	const char *text = NULL;
223521fa314SDavid van Moolenbroek 
224521fa314SDavid van Moolenbroek 	if (!valuesonly) {
225521fa314SDavid van Moolenbroek 		switch (proto) {
226521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_ICMP);
227521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_TCP);
228521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_UDP);
229521fa314SDavid van Moolenbroek 		}
230521fa314SDavid van Moolenbroek 	}
231521fa314SDavid van Moolenbroek 
232521fa314SDavid van Moolenbroek 	if (text != NULL)
233521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
234521fa314SDavid van Moolenbroek 	else
235521fa314SDavid van Moolenbroek 		put_value(proc, name, "%u", proto);
236521fa314SDavid van Moolenbroek }
237521fa314SDavid van Moolenbroek 
238521fa314SDavid van Moolenbroek static const struct flags tcpconf_flags[] = {
239521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWTC_NOFLAGS),
240521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_EXCL),
241521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_SHARED),
242521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_COPY),
243521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_UNSET),
244521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_SET),
245521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_SEL),
246521fa314SDavid van Moolenbroek 	FLAG(NWTC_SET_RA),
247521fa314SDavid van Moolenbroek 	FLAG(NWTC_UNSET_RA),
248521fa314SDavid van Moolenbroek 	FLAG(NWTC_SET_RP),
249521fa314SDavid van Moolenbroek 	FLAG(NWTC_UNSET_RP),
250521fa314SDavid van Moolenbroek };
251521fa314SDavid van Moolenbroek 
252521fa314SDavid van Moolenbroek #define put_port(proc, name, port) \
253521fa314SDavid van Moolenbroek 	put_value(proc, name, "%u", ntohs(port))
254521fa314SDavid van Moolenbroek 
255521fa314SDavid van Moolenbroek static const struct flags tcpcl_flags[] = {
256521fa314SDavid van Moolenbroek 	FLAG_ZERO(TCF_DEFAULT),
257521fa314SDavid van Moolenbroek 	FLAG(TCF_ASYNCH),
258521fa314SDavid van Moolenbroek };
259521fa314SDavid van Moolenbroek 
260521fa314SDavid van Moolenbroek static const struct flags tcpopt_flags[] = {
261521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWTO_NOFLAG),
262521fa314SDavid van Moolenbroek 	FLAG(NWTO_SND_URG),
263521fa314SDavid van Moolenbroek 	FLAG(NWTO_SND_NOTURG),
264521fa314SDavid van Moolenbroek 	FLAG(NWTO_RCV_URG),
265521fa314SDavid van Moolenbroek 	FLAG(NWTO_RCV_NOTURG),
266521fa314SDavid van Moolenbroek 	FLAG(NWTO_BSD_URG),
267521fa314SDavid van Moolenbroek 	FLAG(NWTO_NOTBSD_URG),
268521fa314SDavid van Moolenbroek 	FLAG(NWTO_DEL_RST),
269521fa314SDavid van Moolenbroek 	FLAG(NWTO_BULK),
270521fa314SDavid van Moolenbroek 	FLAG(NWTO_NOBULK),
271521fa314SDavid van Moolenbroek };
272521fa314SDavid van Moolenbroek 
273521fa314SDavid van Moolenbroek static const struct flags udpopt_flags[] = {
274521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWUO_NOFLAGS),
275521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_EXCL),
276521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_SHARED),
277521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_COPY),
278521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_SET),
279521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_SEL),
280521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_ANY),
281521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_LOC),
282521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_LOC),
283521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_BROAD),
284521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_BROAD),
285521fa314SDavid van Moolenbroek 	FLAG(NWUO_RP_SET),
286521fa314SDavid van Moolenbroek 	FLAG(NWUO_RP_ANY),
287521fa314SDavid van Moolenbroek 	FLAG(NWUO_RA_SET),
288521fa314SDavid van Moolenbroek 	FLAG(NWUO_RA_ANY),
289521fa314SDavid van Moolenbroek 	FLAG(NWUO_RWDATONLY),
290521fa314SDavid van Moolenbroek 	FLAG(NWUO_RWDATALL),
291521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_IPOPT),
292521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_IPOPT),
293521fa314SDavid van Moolenbroek };
294521fa314SDavid van Moolenbroek 
295521fa314SDavid van Moolenbroek static void
put_struct_uucred(struct trace_proc * proc,const char * name,int flags,vir_bytes addr)29627852ebeSDavid van Moolenbroek put_struct_uucred(struct trace_proc * proc, const char * name, int flags,
29727852ebeSDavid van Moolenbroek 	vir_bytes addr)
29827852ebeSDavid van Moolenbroek {
29927852ebeSDavid van Moolenbroek 	struct uucred cred;
30027852ebeSDavid van Moolenbroek 
30127852ebeSDavid van Moolenbroek 	if (!put_open_struct(proc, name, flags, addr, &cred, sizeof(cred)))
30227852ebeSDavid van Moolenbroek 		return;
30327852ebeSDavid van Moolenbroek 
30427852ebeSDavid van Moolenbroek 	put_value(proc, "cr_uid", "%u", cred.cr_uid);
30527852ebeSDavid van Moolenbroek 	if (verbose > 0) {
30627852ebeSDavid van Moolenbroek 		put_value(proc, "cr_gid", "%u", cred.cr_gid);
30727852ebeSDavid van Moolenbroek 		if (verbose > 1)
30827852ebeSDavid van Moolenbroek 			put_value(proc, "cr_ngroups", "%d", cred.cr_ngroups);
30927852ebeSDavid van Moolenbroek 		put_groups(proc, "cr_groups", PF_LOCADDR,
31027852ebeSDavid van Moolenbroek 		    (vir_bytes)&cred.cr_groups, cred.cr_ngroups);
31127852ebeSDavid van Moolenbroek 	}
31227852ebeSDavid van Moolenbroek 
31327852ebeSDavid van Moolenbroek 	put_close_struct(proc, verbose > 0);
31427852ebeSDavid van Moolenbroek }
31527852ebeSDavid van Moolenbroek 
31627852ebeSDavid van Moolenbroek static void
put_msg_control(struct trace_proc * proc,struct msg_control * ptr)317521fa314SDavid van Moolenbroek put_msg_control(struct trace_proc * proc, struct msg_control * ptr)
318521fa314SDavid van Moolenbroek {
319521fa314SDavid van Moolenbroek 	struct msghdr msg;
320521fa314SDavid van Moolenbroek 	struct cmsghdr *cmsg;
321521fa314SDavid van Moolenbroek 	size_t len;
322b58e161cSDavid van Moolenbroek 	unsigned int i;
323521fa314SDavid van Moolenbroek 
324521fa314SDavid van Moolenbroek 	if (ptr->msg_controllen > sizeof(ptr->msg_control)) {
325521fa314SDavid van Moolenbroek 		put_field(proc, NULL, "..");
326521fa314SDavid van Moolenbroek 
327521fa314SDavid van Moolenbroek 		return;
328521fa314SDavid van Moolenbroek 	}
329521fa314SDavid van Moolenbroek 
330521fa314SDavid van Moolenbroek 	put_open(proc, NULL, PF_NONAME, "[", ", ");
331521fa314SDavid van Moolenbroek 
332521fa314SDavid van Moolenbroek 	memset(&msg, 0, sizeof(msg));
333521fa314SDavid van Moolenbroek 	msg.msg_control = ptr->msg_control;
334521fa314SDavid van Moolenbroek 	msg.msg_controllen = ptr->msg_controllen;
335521fa314SDavid van Moolenbroek 
336521fa314SDavid van Moolenbroek 	/*
337521fa314SDavid van Moolenbroek 	 * TODO: decide if we need a verbosity-based limit here.  The argument
338521fa314SDavid van Moolenbroek 	 * in favor of printing everything is that upon receipt, SCM_RIGHTS
339521fa314SDavid van Moolenbroek 	 * actually creates new file descriptors, which is pretty essential in
340521fa314SDavid van Moolenbroek 	 * terms of figuring out what is happening in a process.  In addition,
341521fa314SDavid van Moolenbroek 	 * these calls should be sufficiently rare that the lengthy output is
342521fa314SDavid van Moolenbroek 	 * not really disruptive for the general output flow.
343521fa314SDavid van Moolenbroek 	 */
344521fa314SDavid van Moolenbroek 	for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
345521fa314SDavid van Moolenbroek 	    cmsg = CMSG_NXTHDR(&msg, cmsg)) {
346521fa314SDavid van Moolenbroek 		put_open(proc, NULL, 0, "{", ", ");
347521fa314SDavid van Moolenbroek 
348521fa314SDavid van Moolenbroek 		if (verbose > 0)
349521fa314SDavid van Moolenbroek 			put_value(proc, "cmsg_len", "%u", cmsg->cmsg_len);
350521fa314SDavid van Moolenbroek 		if (!valuesonly && cmsg->cmsg_level == SOL_SOCKET)
351521fa314SDavid van Moolenbroek 			put_field(proc, "cmsg_level", "SOL_SOCKET");
352521fa314SDavid van Moolenbroek 		else
353521fa314SDavid van Moolenbroek 			put_value(proc, "cmsg_level", "%d", cmsg->cmsg_level);
354521fa314SDavid van Moolenbroek 		if (cmsg->cmsg_level == SOL_SOCKET)
355521fa314SDavid van Moolenbroek 			put_cmsg_type(proc, "cmsg_type", cmsg->cmsg_type);
356521fa314SDavid van Moolenbroek 
357521fa314SDavid van Moolenbroek 		len = cmsg->cmsg_len - CMSG_LEN(0);
358521fa314SDavid van Moolenbroek 
359521fa314SDavid van Moolenbroek 		/* Print the contents of the messages that we know. */
360521fa314SDavid van Moolenbroek 		if (cmsg->cmsg_level == SOL_SOCKET &&
361521fa314SDavid van Moolenbroek 		    cmsg->cmsg_type == SCM_RIGHTS) {
362521fa314SDavid van Moolenbroek 			put_open(proc, NULL, PF_NONAME, "[", ", ");
363521fa314SDavid van Moolenbroek 			for (i = 0; i < len / sizeof(int); i++)
364521fa314SDavid van Moolenbroek 				put_fd(proc, NULL,
365521fa314SDavid van Moolenbroek 				    ((int *)CMSG_DATA(cmsg))[i]);
366521fa314SDavid van Moolenbroek 			put_close(proc, "]");
367521fa314SDavid van Moolenbroek 		} else if (cmsg->cmsg_level == SOL_SOCKET &&
368521fa314SDavid van Moolenbroek 		    cmsg->cmsg_type == SCM_CREDS) {
369521fa314SDavid van Moolenbroek 			put_struct_uucred(proc, NULL, PF_LOCADDR,
370521fa314SDavid van Moolenbroek 			    (vir_bytes)CMSG_DATA(cmsg));
371521fa314SDavid van Moolenbroek 		} else if (len > 0)
372521fa314SDavid van Moolenbroek 			put_field(proc, NULL, "..");
373521fa314SDavid van Moolenbroek 
374521fa314SDavid van Moolenbroek 		put_close(proc, "}");
375521fa314SDavid van Moolenbroek 	}
376521fa314SDavid van Moolenbroek 
377521fa314SDavid van Moolenbroek 	put_close(proc, "]");
378521fa314SDavid van Moolenbroek }
379521fa314SDavid van Moolenbroek 
380521fa314SDavid van Moolenbroek int
net_ioctl_arg(struct trace_proc * proc,unsigned long req,void * ptr,int dir)381521fa314SDavid van Moolenbroek net_ioctl_arg(struct trace_proc * proc, unsigned long req, void * ptr, int dir)
382521fa314SDavid van Moolenbroek {
383521fa314SDavid van Moolenbroek 	const char *text;
384521fa314SDavid van Moolenbroek 	nwio_ipopt_t *ipopt;
385521fa314SDavid van Moolenbroek 	nwio_tcpconf_t *nwtc;
386521fa314SDavid van Moolenbroek 	nwio_tcpcl_t *nwtcl;
387521fa314SDavid van Moolenbroek 	nwio_tcpopt_t *nwto;
388521fa314SDavid van Moolenbroek 	tcp_cookie_t *cookie;
389521fa314SDavid van Moolenbroek 	nwio_udpopt_t *nwuo;
390521fa314SDavid van Moolenbroek 	struct sockaddr_un *sun;
391521fa314SDavid van Moolenbroek 	int i;
392521fa314SDavid van Moolenbroek 
393521fa314SDavid van Moolenbroek 	switch (req) {
394521fa314SDavid van Moolenbroek 	case FIONREAD:
395521fa314SDavid van Moolenbroek 		/*
396521fa314SDavid van Moolenbroek 		 * Arguably this does not belong here, but as of writing, the
397521fa314SDavid van Moolenbroek 		 * network services are the only ones actually implementing
398521fa314SDavid van Moolenbroek 		 * support for this IOCTL, and we don't have a more suitable
399521fa314SDavid van Moolenbroek 		 * place to put it either.
400521fa314SDavid van Moolenbroek 		 */
401521fa314SDavid van Moolenbroek 		if (ptr == NULL)
402521fa314SDavid van Moolenbroek 			return IF_IN;
403521fa314SDavid van Moolenbroek 
404521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
405521fa314SDavid van Moolenbroek 		return IF_ALL;
406521fa314SDavid van Moolenbroek 
407521fa314SDavid van Moolenbroek 	case NWIOSIPOPT:
408521fa314SDavid van Moolenbroek 	case NWIOGIPOPT:
409521fa314SDavid van Moolenbroek 		if ((ipopt = (nwio_ipopt_t *)ptr) == NULL)
410521fa314SDavid van Moolenbroek 			return dir;
411521fa314SDavid van Moolenbroek 
412521fa314SDavid van Moolenbroek 		put_flags(proc, "nwio_flags", ipopt_flags, COUNT(ipopt_flags),
413521fa314SDavid van Moolenbroek 		    "0x%x", ipopt->nwio_flags);
414521fa314SDavid van Moolenbroek 
415521fa314SDavid van Moolenbroek 		if (ipopt->nwio_flags & NWIO_REMSPEC)
416521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwio_rem", ipopt->nwio_rem);
417521fa314SDavid van Moolenbroek 		if (ipopt->nwio_flags & NWIO_PROTOSPEC)
418521fa314SDavid van Moolenbroek 			put_ipproto(proc, "nwio_proto", ipopt->nwio_proto);
419521fa314SDavid van Moolenbroek 
420521fa314SDavid van Moolenbroek 		return 0; /* TODO: the remaining fields */
421521fa314SDavid van Moolenbroek 
422521fa314SDavid van Moolenbroek 	case NWIOSTCPCONF:
423521fa314SDavid van Moolenbroek 	case NWIOGTCPCONF:
424521fa314SDavid van Moolenbroek 		if ((nwtc = (nwio_tcpconf_t *)ptr) == NULL)
425521fa314SDavid van Moolenbroek 			return dir;
426521fa314SDavid van Moolenbroek 
427521fa314SDavid van Moolenbroek 		put_flags(proc, "nwtc_flags", tcpconf_flags,
428521fa314SDavid van Moolenbroek 		    COUNT(tcpconf_flags), "0x%x", nwtc->nwtc_flags);
429521fa314SDavid van Moolenbroek 
430521fa314SDavid van Moolenbroek 		/* The local address cannot be set, just retrieved. */
431521fa314SDavid van Moolenbroek 		if (req == NWIOGTCPCONF)
432521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwtc_locaddr", nwtc->nwtc_locaddr);
433521fa314SDavid van Moolenbroek 
434521fa314SDavid van Moolenbroek 		if ((nwtc->nwtc_flags & NWTC_LOCPORT_MASK) == NWTC_LP_SET)
435521fa314SDavid van Moolenbroek 			put_port(proc, "nwtc_locport", nwtc->nwtc_locport);
436521fa314SDavid van Moolenbroek 
437521fa314SDavid van Moolenbroek 		if (nwtc->nwtc_flags & NWTC_SET_RA)
438521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwtc_remaddr", nwtc->nwtc_remaddr);
439521fa314SDavid van Moolenbroek 
440521fa314SDavid van Moolenbroek 		if (nwtc->nwtc_flags & NWTC_SET_RP)
441521fa314SDavid van Moolenbroek 			put_port(proc, "nwtc_remport", nwtc->nwtc_remport);
442521fa314SDavid van Moolenbroek 
443521fa314SDavid van Moolenbroek 		return IF_ALL;
444521fa314SDavid van Moolenbroek 
445521fa314SDavid van Moolenbroek 	case NWIOTCPCONN:
446521fa314SDavid van Moolenbroek 	case NWIOTCPLISTEN:
447521fa314SDavid van Moolenbroek 		if ((nwtcl = (nwio_tcpcl_t *)ptr) == NULL)
448521fa314SDavid van Moolenbroek 			return dir;
449521fa314SDavid van Moolenbroek 
450521fa314SDavid van Moolenbroek 		put_flags(proc, "nwtcl_flags", tcpcl_flags,
451521fa314SDavid van Moolenbroek 		    COUNT(tcpcl_flags), "0x%x", nwtcl->nwtcl_flags);
452521fa314SDavid van Moolenbroek 
453521fa314SDavid van Moolenbroek 		/* We pretend the unused nwtcl_ttl field does not exist. */
454521fa314SDavid van Moolenbroek 		return IF_ALL;
455521fa314SDavid van Moolenbroek 
456521fa314SDavid van Moolenbroek 	case NWIOSTCPOPT:
457521fa314SDavid van Moolenbroek 	case NWIOGTCPOPT:
458521fa314SDavid van Moolenbroek 		if ((nwto = (nwio_tcpopt_t *)ptr) == NULL)
459521fa314SDavid van Moolenbroek 			return dir;
460521fa314SDavid van Moolenbroek 
461521fa314SDavid van Moolenbroek 		put_flags(proc, "nwto_flags", tcpopt_flags,
462521fa314SDavid van Moolenbroek 		    COUNT(tcpopt_flags), "0x%x", nwto->nwto_flags);
463521fa314SDavid van Moolenbroek 		return IF_ALL;
464521fa314SDavid van Moolenbroek 
465521fa314SDavid van Moolenbroek 	case NWIOTCPLISTENQ:
466521fa314SDavid van Moolenbroek 	case NWIOSUDSBLOG:
467521fa314SDavid van Moolenbroek 		if (ptr == NULL)
468521fa314SDavid van Moolenbroek 			return IF_OUT;
469521fa314SDavid van Moolenbroek 
470521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
471521fa314SDavid van Moolenbroek 		return IF_ALL;
472521fa314SDavid van Moolenbroek 
473521fa314SDavid van Moolenbroek 	case NWIOGTCPCOOKIE:
474521fa314SDavid van Moolenbroek 	case NWIOTCPACCEPTTO:
475521fa314SDavid van Moolenbroek 		if ((cookie = (tcp_cookie_t *)ptr) == NULL)
476521fa314SDavid van Moolenbroek 			return dir;
477521fa314SDavid van Moolenbroek 
478521fa314SDavid van Moolenbroek 		put_value(proc, "tc_ref", "%"PRIu32, cookie->tc_ref);
479521fa314SDavid van Moolenbroek 		if (verbose > 0)
480521fa314SDavid van Moolenbroek 			put_buf(proc, "tc_secret", PF_LOCADDR,
481521fa314SDavid van Moolenbroek 			    (vir_bytes)&cookie->tc_secret,
482521fa314SDavid van Moolenbroek 			    sizeof(cookie->tc_secret));
483521fa314SDavid van Moolenbroek 		return (verbose > 0) ? IF_ALL : 0;
484521fa314SDavid van Moolenbroek 
485521fa314SDavid van Moolenbroek 	case NWIOTCPGERROR:
486521fa314SDavid van Moolenbroek 		if (ptr == NULL)
487521fa314SDavid van Moolenbroek 			return IF_IN;
488521fa314SDavid van Moolenbroek 
489521fa314SDavid van Moolenbroek 		i = *(int *)ptr;
490521fa314SDavid van Moolenbroek 		if (!valuesonly && (text = get_error_name(i)) != NULL)
491521fa314SDavid van Moolenbroek 			put_field(proc, NULL, text);
492521fa314SDavid van Moolenbroek 		else
493521fa314SDavid van Moolenbroek 			put_value(proc, NULL, "%d", i);
494521fa314SDavid van Moolenbroek 		return IF_ALL;
495521fa314SDavid van Moolenbroek 
496521fa314SDavid van Moolenbroek 	case NWIOSUDPOPT:
497521fa314SDavid van Moolenbroek 	case NWIOGUDPOPT:
498521fa314SDavid van Moolenbroek 		if ((nwuo = (nwio_udpopt_t *)ptr) == NULL)
499521fa314SDavid van Moolenbroek 			return dir;
500521fa314SDavid van Moolenbroek 
501521fa314SDavid van Moolenbroek 		put_flags(proc, "nwuo_flags", udpopt_flags,
502521fa314SDavid van Moolenbroek 		    COUNT(udpopt_flags), "0x%x", nwuo->nwuo_flags);
503521fa314SDavid van Moolenbroek 
504521fa314SDavid van Moolenbroek 		/* The local address cannot be set, just retrieved. */
505521fa314SDavid van Moolenbroek 		if (req == NWIOGUDPOPT)
506521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwuo_locaddr", nwuo->nwuo_locaddr);
507521fa314SDavid van Moolenbroek 
508521fa314SDavid van Moolenbroek 		if ((nwuo->nwuo_flags & NWUO_LOCPORT_MASK) == NWUO_LP_SET)
509521fa314SDavid van Moolenbroek 			put_port(proc, "nwuo_locport", nwuo->nwuo_locport);
510521fa314SDavid van Moolenbroek 
511521fa314SDavid van Moolenbroek 		if (nwuo->nwuo_flags & NWUO_RA_SET)
512521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwuo_remaddr", nwuo->nwuo_remaddr);
513521fa314SDavid van Moolenbroek 
514521fa314SDavid van Moolenbroek 		if (nwuo->nwuo_flags & NWUO_RP_SET)
515521fa314SDavid van Moolenbroek 			put_port(proc, "nwuo_remport", nwuo->nwuo_remport);
516521fa314SDavid van Moolenbroek 
517521fa314SDavid van Moolenbroek 		return IF_ALL;
518521fa314SDavid van Moolenbroek 
519521fa314SDavid van Moolenbroek 	case NWIOGUDSFADDR:
520521fa314SDavid van Moolenbroek 	case NWIOSUDSTADDR:
521521fa314SDavid van Moolenbroek 	case NWIOSUDSADDR:
522521fa314SDavid van Moolenbroek 	case NWIOGUDSADDR:
523521fa314SDavid van Moolenbroek 	case NWIOGUDSPADDR:
524521fa314SDavid van Moolenbroek 	case NWIOSUDSCONN:
525521fa314SDavid van Moolenbroek 	case NWIOSUDSACCEPT:
526521fa314SDavid van Moolenbroek 		if ((sun = (struct sockaddr_un *)ptr) == NULL)
527521fa314SDavid van Moolenbroek 			return dir;
528521fa314SDavid van Moolenbroek 
529c38dbb97SDavid van Moolenbroek 		put_socket_family(proc, "sun_family", sun->sun_family);
530521fa314SDavid van Moolenbroek 
531521fa314SDavid van Moolenbroek 		/* This could be extended to a generic sockaddr printer.. */
532521fa314SDavid van Moolenbroek 		if (sun->sun_family == AF_LOCAL) {
533521fa314SDavid van Moolenbroek 			put_buf(proc, "sun_path", PF_LOCADDR | PF_PATH,
534521fa314SDavid van Moolenbroek 			    (vir_bytes)&sun->sun_path, sizeof(sun->sun_path));
535521fa314SDavid van Moolenbroek 			return IF_ALL; /* skipping sun_len, it's unused */
536521fa314SDavid van Moolenbroek 		} else
537521fa314SDavid van Moolenbroek 			return 0;
538521fa314SDavid van Moolenbroek 
539521fa314SDavid van Moolenbroek 	case NWIOSUDSTYPE:
540521fa314SDavid van Moolenbroek 	case NWIOGUDSSOTYPE:
541521fa314SDavid van Moolenbroek 		if (ptr == NULL)
542521fa314SDavid van Moolenbroek 			return dir;
543521fa314SDavid van Moolenbroek 
544c38dbb97SDavid van Moolenbroek 		put_socket_type(proc, NULL, *(int *)ptr);
545521fa314SDavid van Moolenbroek 		return IF_ALL;
546521fa314SDavid van Moolenbroek 
547521fa314SDavid van Moolenbroek 	case NWIOSUDSSHUT:
548521fa314SDavid van Moolenbroek 		if (ptr == NULL)
549521fa314SDavid van Moolenbroek 			return IF_OUT;
550521fa314SDavid van Moolenbroek 
551521fa314SDavid van Moolenbroek 		put_shutdown_how(proc, NULL, *(int *)ptr);
552521fa314SDavid van Moolenbroek 		return IF_ALL;
553521fa314SDavid van Moolenbroek 
554521fa314SDavid van Moolenbroek 	case NWIOSUDSPAIR:
555521fa314SDavid van Moolenbroek 		if (ptr == NULL)
556521fa314SDavid van Moolenbroek 			return IF_OUT;
557521fa314SDavid van Moolenbroek 
558521fa314SDavid van Moolenbroek 		put_dev(proc, NULL, *(dev_t *)ptr);
559521fa314SDavid van Moolenbroek 		return IF_ALL;
560521fa314SDavid van Moolenbroek 
561521fa314SDavid van Moolenbroek 	case NWIOSUDSCTRL:
562521fa314SDavid van Moolenbroek 		if (ptr == NULL)
563521fa314SDavid van Moolenbroek 			return IF_OUT;
564521fa314SDavid van Moolenbroek 
565521fa314SDavid van Moolenbroek 		/* FALLTHROUGH */
566521fa314SDavid van Moolenbroek 	case NWIOGUDSCTRL:
567521fa314SDavid van Moolenbroek 		if (ptr == NULL)
568521fa314SDavid van Moolenbroek 			return IF_IN;
569521fa314SDavid van Moolenbroek 
570521fa314SDavid van Moolenbroek 		put_msg_control(proc, (struct msg_control *)ptr);
571521fa314SDavid van Moolenbroek 		return IF_ALL;
572521fa314SDavid van Moolenbroek 
573521fa314SDavid van Moolenbroek 	case NWIOGUDSPEERCRED:
574521fa314SDavid van Moolenbroek 		if (ptr == NULL)
575521fa314SDavid van Moolenbroek 			return IF_IN;
576521fa314SDavid van Moolenbroek 
577521fa314SDavid van Moolenbroek 		put_struct_uucred(proc, NULL, PF_LOCADDR, (vir_bytes)ptr);
578521fa314SDavid van Moolenbroek 		return IF_ALL;
579521fa314SDavid van Moolenbroek 
580521fa314SDavid van Moolenbroek 	case NWIOGUDSSNDBUF:
581521fa314SDavid van Moolenbroek 	case NWIOSUDSSNDBUF:
582521fa314SDavid van Moolenbroek 	case NWIOGUDSRCVBUF:
583521fa314SDavid van Moolenbroek 	case NWIOSUDSRCVBUF:
584521fa314SDavid van Moolenbroek 		if (ptr == NULL)
585521fa314SDavid van Moolenbroek 			return dir;
586521fa314SDavid van Moolenbroek 
587521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%zu", *(size_t *)ptr);
588521fa314SDavid van Moolenbroek 		return IF_ALL;
589521fa314SDavid van Moolenbroek 
590521fa314SDavid van Moolenbroek 	default:
591521fa314SDavid van Moolenbroek 		return 0;
592521fa314SDavid van Moolenbroek 	}
593521fa314SDavid van Moolenbroek }
594