xref: /minix3/minix/usr.bin/trace/ioctl/net.c (revision 521fa314e2aaec3c192c15f2aaa4c677a544e62a)
1*521fa314SDavid van Moolenbroek 
2*521fa314SDavid van Moolenbroek #include "inc.h"
3*521fa314SDavid van Moolenbroek 
4*521fa314SDavid van Moolenbroek #include <sys/ioctl.h>
5*521fa314SDavid van Moolenbroek #include <sys/ucred.h>
6*521fa314SDavid van Moolenbroek #include <net/gen/in.h>
7*521fa314SDavid van Moolenbroek #include <net/gen/ether.h>
8*521fa314SDavid van Moolenbroek #include <net/gen/eth_io.h>
9*521fa314SDavid van Moolenbroek #include <net/gen/arp_io.h>
10*521fa314SDavid van Moolenbroek #include <net/gen/ip_io.h>
11*521fa314SDavid van Moolenbroek #include <net/gen/route.h>
12*521fa314SDavid van Moolenbroek #include <net/gen/tcp.h>
13*521fa314SDavid van Moolenbroek #include <net/gen/tcp_io.h>
14*521fa314SDavid van Moolenbroek #include <net/gen/udp.h>
15*521fa314SDavid van Moolenbroek #include <net/gen/udp_io.h>
16*521fa314SDavid van Moolenbroek #include <net/gen/udp_io_hdr.h>
17*521fa314SDavid van Moolenbroek #include <net/gen/psip_io.h>
18*521fa314SDavid van Moolenbroek #include <arpa/inet.h>
19*521fa314SDavid van Moolenbroek 
20*521fa314SDavid van Moolenbroek const char *
21*521fa314SDavid van Moolenbroek net_ioctl_name(unsigned long req)
22*521fa314SDavid van Moolenbroek {
23*521fa314SDavid van Moolenbroek 
24*521fa314SDavid van Moolenbroek 	switch (req) {
25*521fa314SDavid van Moolenbroek 	NAME(FIONREAD);
26*521fa314SDavid van Moolenbroek 	NAME(NWIOSETHOPT);	/* TODO: print argument */
27*521fa314SDavid van Moolenbroek 	NAME(NWIOGETHOPT);	/* TODO: print argument */
28*521fa314SDavid van Moolenbroek 	NAME(NWIOGETHSTAT);	/* TODO: print argument */
29*521fa314SDavid van Moolenbroek 	NAME(NWIOARPGIP);	/* TODO: print argument */
30*521fa314SDavid van Moolenbroek 	NAME(NWIOARPGNEXT);	/* TODO: print argument */
31*521fa314SDavid van Moolenbroek 	NAME(NWIOARPSIP);	/* TODO: print argument */
32*521fa314SDavid van Moolenbroek 	NAME(NWIOARPDIP);	/* TODO: print argument */
33*521fa314SDavid van Moolenbroek 	NAME(NWIOSIPCONF2);	/* TODO: print argument */
34*521fa314SDavid van Moolenbroek 	NAME(NWIOSIPCONF);	/* TODO: print argument */
35*521fa314SDavid van Moolenbroek 	NAME(NWIOGIPCONF2);	/* TODO: print argument */
36*521fa314SDavid van Moolenbroek 	NAME(NWIOGIPCONF);	/* TODO: print argument */
37*521fa314SDavid van Moolenbroek 	NAME(NWIOSIPOPT);
38*521fa314SDavid van Moolenbroek 	NAME(NWIOGIPOPT);
39*521fa314SDavid van Moolenbroek 	NAME(NWIOGIPOROUTE);	/* TODO: print argument */
40*521fa314SDavid van Moolenbroek 	NAME(NWIOSIPOROUTE);	/* TODO: print argument */
41*521fa314SDavid van Moolenbroek 	NAME(NWIODIPOROUTE);	/* TODO: print argument */
42*521fa314SDavid van Moolenbroek 	NAME(NWIOGIPIROUTE);	/* TODO: print argument */
43*521fa314SDavid van Moolenbroek 	NAME(NWIOSIPIROUTE);	/* TODO: print argument */
44*521fa314SDavid van Moolenbroek 	NAME(NWIODIPIROUTE);	/* TODO: print argument */
45*521fa314SDavid van Moolenbroek 	NAME(NWIOSTCPCONF);
46*521fa314SDavid van Moolenbroek 	NAME(NWIOGTCPCONF);
47*521fa314SDavid van Moolenbroek 	NAME(NWIOTCPCONN);
48*521fa314SDavid van Moolenbroek 	NAME(NWIOTCPLISTEN);
49*521fa314SDavid van Moolenbroek 	NAME(NWIOTCPATTACH);	/* TODO: print argument */
50*521fa314SDavid van Moolenbroek 	NAME(NWIOTCPSHUTDOWN);	/* no argument */
51*521fa314SDavid van Moolenbroek 	NAME(NWIOSTCPOPT);
52*521fa314SDavid van Moolenbroek 	NAME(NWIOGTCPOPT);
53*521fa314SDavid van Moolenbroek 	NAME(NWIOTCPPUSH);	/* no argument */
54*521fa314SDavid van Moolenbroek 	NAME(NWIOTCPLISTENQ);
55*521fa314SDavid van Moolenbroek 	NAME(NWIOGTCPCOOKIE);
56*521fa314SDavid van Moolenbroek 	NAME(NWIOTCPACCEPTTO);
57*521fa314SDavid van Moolenbroek 	NAME(NWIOTCPGERROR);
58*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDPOPT);
59*521fa314SDavid van Moolenbroek 	NAME(NWIOGUDPOPT);
60*521fa314SDavid van Moolenbroek 	NAME(NWIOUDPPEEK);	/* TODO: print argument */
61*521fa314SDavid van Moolenbroek 	NAME(NWIOSPSIPOPT);	/* TODO: print argument */
62*521fa314SDavid van Moolenbroek 	NAME(NWIOGPSIPOPT);	/* TODO: print argument */
63*521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSFADDR);
64*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSTADDR);
65*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSADDR);
66*521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSADDR);
67*521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSPADDR);
68*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSTYPE);
69*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSBLOG);
70*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSCONN);
71*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSSHUT);
72*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSPAIR);
73*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSACCEPT);
74*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSCTRL);
75*521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSCTRL);
76*521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSSOTYPE);
77*521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSPEERCRED);
78*521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSSNDBUF);
79*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSSNDBUF);
80*521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSRCVBUF);
81*521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSRCVBUF);
82*521fa314SDavid van Moolenbroek 	}
83*521fa314SDavid van Moolenbroek 
84*521fa314SDavid van Moolenbroek 	return NULL;
85*521fa314SDavid van Moolenbroek }
86*521fa314SDavid van Moolenbroek 
87*521fa314SDavid van Moolenbroek static const struct flags ipopt_flags[] = {
88*521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWIO_NOFLAGS),
89*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWIO_ACC_MASK, NWIO_EXCL),
90*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWIO_ACC_MASK, NWIO_SHARED),
91*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWIO_ACC_MASK, NWIO_COPY),
92*521fa314SDavid van Moolenbroek 	FLAG(NWIO_EN_LOC),
93*521fa314SDavid van Moolenbroek 	FLAG(NWIO_DI_LOC),
94*521fa314SDavid van Moolenbroek 	FLAG(NWIO_EN_BROAD),
95*521fa314SDavid van Moolenbroek 	FLAG(NWIO_DI_BROAD),
96*521fa314SDavid van Moolenbroek 	FLAG(NWIO_REMSPEC),
97*521fa314SDavid van Moolenbroek 	FLAG(NWIO_REMANY),
98*521fa314SDavid van Moolenbroek 	FLAG(NWIO_PROTOSPEC),
99*521fa314SDavid van Moolenbroek 	FLAG(NWIO_PROTOANY),
100*521fa314SDavid van Moolenbroek 	FLAG(NWIO_HDR_O_SPEC),
101*521fa314SDavid van Moolenbroek 	FLAG(NWIO_HDR_O_ANY),
102*521fa314SDavid van Moolenbroek 	FLAG(NWIO_RWDATONLY),
103*521fa314SDavid van Moolenbroek 	FLAG(NWIO_RWDATALL),
104*521fa314SDavid van Moolenbroek };
105*521fa314SDavid van Moolenbroek 
106*521fa314SDavid van Moolenbroek static void
107*521fa314SDavid van Moolenbroek put_ipaddr(struct trace_proc * proc, const char * name, ipaddr_t ipaddr)
108*521fa314SDavid van Moolenbroek {
109*521fa314SDavid van Moolenbroek 	struct in_addr in;
110*521fa314SDavid van Moolenbroek 
111*521fa314SDavid van Moolenbroek 	if (!valuesonly) {
112*521fa314SDavid van Moolenbroek 		in.s_addr = ipaddr;
113*521fa314SDavid van Moolenbroek 
114*521fa314SDavid van Moolenbroek 		/* Is this an acceptable encapsulation? */
115*521fa314SDavid van Moolenbroek 		put_value(proc, name, "[%s]", inet_ntoa(in));
116*521fa314SDavid van Moolenbroek 	} else
117*521fa314SDavid van Moolenbroek 		put_value(proc, name, "0x%08x", ntohl(ipaddr));
118*521fa314SDavid van Moolenbroek }
119*521fa314SDavid van Moolenbroek 
120*521fa314SDavid van Moolenbroek static void
121*521fa314SDavid van Moolenbroek put_ipproto(struct trace_proc * proc, const char * name, ipproto_t proto)
122*521fa314SDavid van Moolenbroek {
123*521fa314SDavid van Moolenbroek 	const char *text = NULL;
124*521fa314SDavid van Moolenbroek 
125*521fa314SDavid van Moolenbroek 	if (!valuesonly) {
126*521fa314SDavid van Moolenbroek 		switch (proto) {
127*521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_ICMP);
128*521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_TCP);
129*521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_UDP);
130*521fa314SDavid van Moolenbroek 		}
131*521fa314SDavid van Moolenbroek 	}
132*521fa314SDavid van Moolenbroek 
133*521fa314SDavid van Moolenbroek 	if (text != NULL)
134*521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
135*521fa314SDavid van Moolenbroek 	else
136*521fa314SDavid van Moolenbroek 		put_value(proc, name, "%u", proto);
137*521fa314SDavid van Moolenbroek }
138*521fa314SDavid van Moolenbroek 
139*521fa314SDavid van Moolenbroek static const struct flags tcpconf_flags[] = {
140*521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWTC_NOFLAGS),
141*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_EXCL),
142*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_SHARED),
143*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_COPY),
144*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_UNSET),
145*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_SET),
146*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_SEL),
147*521fa314SDavid van Moolenbroek 	FLAG(NWTC_SET_RA),
148*521fa314SDavid van Moolenbroek 	FLAG(NWTC_UNSET_RA),
149*521fa314SDavid van Moolenbroek 	FLAG(NWTC_SET_RP),
150*521fa314SDavid van Moolenbroek 	FLAG(NWTC_UNSET_RP),
151*521fa314SDavid van Moolenbroek };
152*521fa314SDavid van Moolenbroek 
153*521fa314SDavid van Moolenbroek #define put_port(proc, name, port) \
154*521fa314SDavid van Moolenbroek 	put_value(proc, name, "%u", ntohs(port))
155*521fa314SDavid van Moolenbroek 
156*521fa314SDavid van Moolenbroek static const struct flags tcpcl_flags[] = {
157*521fa314SDavid van Moolenbroek 	FLAG_ZERO(TCF_DEFAULT),
158*521fa314SDavid van Moolenbroek 	FLAG(TCF_ASYNCH),
159*521fa314SDavid van Moolenbroek };
160*521fa314SDavid van Moolenbroek 
161*521fa314SDavid van Moolenbroek static const struct flags tcpopt_flags[] = {
162*521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWTO_NOFLAG),
163*521fa314SDavid van Moolenbroek 	FLAG(NWTO_SND_URG),
164*521fa314SDavid van Moolenbroek 	FLAG(NWTO_SND_NOTURG),
165*521fa314SDavid van Moolenbroek 	FLAG(NWTO_RCV_URG),
166*521fa314SDavid van Moolenbroek 	FLAG(NWTO_RCV_NOTURG),
167*521fa314SDavid van Moolenbroek 	FLAG(NWTO_BSD_URG),
168*521fa314SDavid van Moolenbroek 	FLAG(NWTO_NOTBSD_URG),
169*521fa314SDavid van Moolenbroek 	FLAG(NWTO_DEL_RST),
170*521fa314SDavid van Moolenbroek 	FLAG(NWTO_BULK),
171*521fa314SDavid van Moolenbroek 	FLAG(NWTO_NOBULK),
172*521fa314SDavid van Moolenbroek };
173*521fa314SDavid van Moolenbroek 
174*521fa314SDavid van Moolenbroek static const struct flags udpopt_flags[] = {
175*521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWUO_NOFLAGS),
176*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_EXCL),
177*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_SHARED),
178*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_COPY),
179*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_SET),
180*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_SEL),
181*521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_ANY),
182*521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_LOC),
183*521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_LOC),
184*521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_BROAD),
185*521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_BROAD),
186*521fa314SDavid van Moolenbroek 	FLAG(NWUO_RP_SET),
187*521fa314SDavid van Moolenbroek 	FLAG(NWUO_RP_ANY),
188*521fa314SDavid van Moolenbroek 	FLAG(NWUO_RA_SET),
189*521fa314SDavid van Moolenbroek 	FLAG(NWUO_RA_ANY),
190*521fa314SDavid van Moolenbroek 	FLAG(NWUO_RWDATONLY),
191*521fa314SDavid van Moolenbroek 	FLAG(NWUO_RWDATALL),
192*521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_IPOPT),
193*521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_IPOPT),
194*521fa314SDavid van Moolenbroek };
195*521fa314SDavid van Moolenbroek 
196*521fa314SDavid van Moolenbroek static void
197*521fa314SDavid van Moolenbroek put_family(struct trace_proc * proc, const char * name, int family)
198*521fa314SDavid van Moolenbroek {
199*521fa314SDavid van Moolenbroek 	const char *text = NULL;
200*521fa314SDavid van Moolenbroek 
201*521fa314SDavid van Moolenbroek 	if (!valuesonly) {
202*521fa314SDavid van Moolenbroek 		/* TODO: add all the other protocols */
203*521fa314SDavid van Moolenbroek 		switch (family) {
204*521fa314SDavid van Moolenbroek 		TEXT(AF_UNSPEC);
205*521fa314SDavid van Moolenbroek 		TEXT(AF_LOCAL);
206*521fa314SDavid van Moolenbroek 		TEXT(AF_INET);
207*521fa314SDavid van Moolenbroek 		TEXT(AF_INET6);
208*521fa314SDavid van Moolenbroek 		}
209*521fa314SDavid van Moolenbroek 	}
210*521fa314SDavid van Moolenbroek 
211*521fa314SDavid van Moolenbroek 	if (text != NULL)
212*521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
213*521fa314SDavid van Moolenbroek 	else
214*521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", family);
215*521fa314SDavid van Moolenbroek }
216*521fa314SDavid van Moolenbroek 
217*521fa314SDavid van Moolenbroek static const struct flags sock_type[] = {
218*521fa314SDavid van Moolenbroek 	FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_STREAM),
219*521fa314SDavid van Moolenbroek 	FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_DGRAM),
220*521fa314SDavid van Moolenbroek 	FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_RAW),
221*521fa314SDavid van Moolenbroek 	FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_RDM),
222*521fa314SDavid van Moolenbroek 	FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_SEQPACKET),
223*521fa314SDavid van Moolenbroek 	FLAG(SOCK_CLOEXEC),
224*521fa314SDavid van Moolenbroek 	FLAG(SOCK_NONBLOCK),
225*521fa314SDavid van Moolenbroek 	FLAG(SOCK_NOSIGPIPE),
226*521fa314SDavid van Moolenbroek };
227*521fa314SDavid van Moolenbroek 
228*521fa314SDavid van Moolenbroek static void
229*521fa314SDavid van Moolenbroek put_shutdown_how(struct trace_proc * proc, const char * name, int how)
230*521fa314SDavid van Moolenbroek {
231*521fa314SDavid van Moolenbroek 	const char *text = NULL;
232*521fa314SDavid van Moolenbroek 
233*521fa314SDavid van Moolenbroek 	if (!valuesonly) {
234*521fa314SDavid van Moolenbroek 		switch (how) {
235*521fa314SDavid van Moolenbroek 		TEXT(SHUT_RD);
236*521fa314SDavid van Moolenbroek 		TEXT(SHUT_WR);
237*521fa314SDavid van Moolenbroek 		TEXT(SHUT_RDWR);
238*521fa314SDavid van Moolenbroek 		}
239*521fa314SDavid van Moolenbroek 	}
240*521fa314SDavid van Moolenbroek 
241*521fa314SDavid van Moolenbroek 	if (text != NULL)
242*521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
243*521fa314SDavid van Moolenbroek 	else
244*521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", how);
245*521fa314SDavid van Moolenbroek }
246*521fa314SDavid van Moolenbroek 
247*521fa314SDavid van Moolenbroek static void
248*521fa314SDavid van Moolenbroek put_struct_uucred(struct trace_proc * proc, const char * name, int flags,
249*521fa314SDavid van Moolenbroek 	vir_bytes addr)
250*521fa314SDavid van Moolenbroek {
251*521fa314SDavid van Moolenbroek 	struct uucred cred;
252*521fa314SDavid van Moolenbroek 
253*521fa314SDavid van Moolenbroek 	if (!put_open_struct(proc, name, flags, addr, &cred, sizeof(cred)))
254*521fa314SDavid van Moolenbroek 		return;
255*521fa314SDavid van Moolenbroek 
256*521fa314SDavid van Moolenbroek 	put_value(proc, "cr_uid", "%u", cred.cr_uid);
257*521fa314SDavid van Moolenbroek 	if (verbose > 0) {
258*521fa314SDavid van Moolenbroek 		put_value(proc, "cr_gid", "%u", cred.cr_gid);
259*521fa314SDavid van Moolenbroek 		if (verbose > 1)
260*521fa314SDavid van Moolenbroek 			put_value(proc, "cr_ngroups", "%d", cred.cr_ngroups);
261*521fa314SDavid van Moolenbroek 		put_groups(proc, "cr_groups", PF_LOCADDR,
262*521fa314SDavid van Moolenbroek 		    (vir_bytes)&cred.cr_groups, cred.cr_ngroups);
263*521fa314SDavid van Moolenbroek 	}
264*521fa314SDavid van Moolenbroek 
265*521fa314SDavid van Moolenbroek 	put_close_struct(proc, verbose > 0);
266*521fa314SDavid van Moolenbroek }
267*521fa314SDavid van Moolenbroek 
268*521fa314SDavid van Moolenbroek static void
269*521fa314SDavid van Moolenbroek put_cmsg_type(struct trace_proc * proc, const char * name, int type)
270*521fa314SDavid van Moolenbroek {
271*521fa314SDavid van Moolenbroek 	const char *text = NULL;
272*521fa314SDavid van Moolenbroek 
273*521fa314SDavid van Moolenbroek 	if (!valuesonly) {
274*521fa314SDavid van Moolenbroek 		switch (type) {
275*521fa314SDavid van Moolenbroek 		TEXT(SCM_RIGHTS);
276*521fa314SDavid van Moolenbroek 		TEXT(SCM_CREDS);
277*521fa314SDavid van Moolenbroek 		TEXT(SCM_TIMESTAMP);
278*521fa314SDavid van Moolenbroek 		}
279*521fa314SDavid van Moolenbroek 	}
280*521fa314SDavid van Moolenbroek 
281*521fa314SDavid van Moolenbroek 	if (text != NULL)
282*521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
283*521fa314SDavid van Moolenbroek 	else
284*521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", type);
285*521fa314SDavid van Moolenbroek }
286*521fa314SDavid van Moolenbroek 
287*521fa314SDavid van Moolenbroek static void
288*521fa314SDavid van Moolenbroek put_msg_control(struct trace_proc * proc, struct msg_control * ptr)
289*521fa314SDavid van Moolenbroek {
290*521fa314SDavid van Moolenbroek 	struct msghdr msg;
291*521fa314SDavid van Moolenbroek 	struct cmsghdr *cmsg;
292*521fa314SDavid van Moolenbroek 	size_t len;
293*521fa314SDavid van Moolenbroek 	int i;
294*521fa314SDavid van Moolenbroek 
295*521fa314SDavid van Moolenbroek 	if (ptr->msg_controllen > sizeof(ptr->msg_control)) {
296*521fa314SDavid van Moolenbroek 		put_field(proc, NULL, "..");
297*521fa314SDavid van Moolenbroek 
298*521fa314SDavid van Moolenbroek 		return;
299*521fa314SDavid van Moolenbroek 	}
300*521fa314SDavid van Moolenbroek 
301*521fa314SDavid van Moolenbroek 	put_open(proc, NULL, PF_NONAME, "[", ", ");
302*521fa314SDavid van Moolenbroek 
303*521fa314SDavid van Moolenbroek 	memset(&msg, 0, sizeof(msg));
304*521fa314SDavid van Moolenbroek 	msg.msg_control = ptr->msg_control;
305*521fa314SDavid van Moolenbroek 	msg.msg_controllen = ptr->msg_controllen;
306*521fa314SDavid van Moolenbroek 
307*521fa314SDavid van Moolenbroek 	/*
308*521fa314SDavid van Moolenbroek 	 * TODO: decide if we need a verbosity-based limit here.  The argument
309*521fa314SDavid van Moolenbroek 	 * in favor of printing everything is that upon receipt, SCM_RIGHTS
310*521fa314SDavid van Moolenbroek 	 * actually creates new file descriptors, which is pretty essential in
311*521fa314SDavid van Moolenbroek 	 * terms of figuring out what is happening in a process.  In addition,
312*521fa314SDavid van Moolenbroek 	 * these calls should be sufficiently rare that the lengthy output is
313*521fa314SDavid van Moolenbroek 	 * not really disruptive for the general output flow.
314*521fa314SDavid van Moolenbroek 	 */
315*521fa314SDavid van Moolenbroek 	for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
316*521fa314SDavid van Moolenbroek 	    cmsg = CMSG_NXTHDR(&msg, cmsg)) {
317*521fa314SDavid van Moolenbroek 		put_open(proc, NULL, 0, "{", ", ");
318*521fa314SDavid van Moolenbroek 
319*521fa314SDavid van Moolenbroek 		if (verbose > 0)
320*521fa314SDavid van Moolenbroek 			put_value(proc, "cmsg_len", "%u", cmsg->cmsg_len);
321*521fa314SDavid van Moolenbroek 		if (!valuesonly && cmsg->cmsg_level == SOL_SOCKET)
322*521fa314SDavid van Moolenbroek 			put_field(proc, "cmsg_level", "SOL_SOCKET");
323*521fa314SDavid van Moolenbroek 		else
324*521fa314SDavid van Moolenbroek 			put_value(proc, "cmsg_level", "%d", cmsg->cmsg_level);
325*521fa314SDavid van Moolenbroek 		if (cmsg->cmsg_level == SOL_SOCKET)
326*521fa314SDavid van Moolenbroek 			put_cmsg_type(proc, "cmsg_type", cmsg->cmsg_type);
327*521fa314SDavid van Moolenbroek 
328*521fa314SDavid van Moolenbroek 		len = cmsg->cmsg_len - CMSG_LEN(0);
329*521fa314SDavid van Moolenbroek 
330*521fa314SDavid van Moolenbroek 		/* Print the contents of the messages that we know. */
331*521fa314SDavid van Moolenbroek 		if (cmsg->cmsg_level == SOL_SOCKET &&
332*521fa314SDavid van Moolenbroek 		    cmsg->cmsg_type == SCM_RIGHTS) {
333*521fa314SDavid van Moolenbroek 			put_open(proc, NULL, PF_NONAME, "[", ", ");
334*521fa314SDavid van Moolenbroek 			for (i = 0; i < len / sizeof(int); i++)
335*521fa314SDavid van Moolenbroek 				put_fd(proc, NULL,
336*521fa314SDavid van Moolenbroek 				    ((int *)CMSG_DATA(cmsg))[i]);
337*521fa314SDavid van Moolenbroek 			put_close(proc, "]");
338*521fa314SDavid van Moolenbroek 		} else if (cmsg->cmsg_level == SOL_SOCKET &&
339*521fa314SDavid van Moolenbroek 		    cmsg->cmsg_type == SCM_CREDS) {
340*521fa314SDavid van Moolenbroek 			put_struct_uucred(proc, NULL, PF_LOCADDR,
341*521fa314SDavid van Moolenbroek 			    (vir_bytes)CMSG_DATA(cmsg));
342*521fa314SDavid van Moolenbroek 		} else if (len > 0)
343*521fa314SDavid van Moolenbroek 			put_field(proc, NULL, "..");
344*521fa314SDavid van Moolenbroek 
345*521fa314SDavid van Moolenbroek 		put_close(proc, "}");
346*521fa314SDavid van Moolenbroek 	}
347*521fa314SDavid van Moolenbroek 
348*521fa314SDavid van Moolenbroek 	put_close(proc, "]");
349*521fa314SDavid van Moolenbroek }
350*521fa314SDavid van Moolenbroek 
351*521fa314SDavid van Moolenbroek int
352*521fa314SDavid van Moolenbroek net_ioctl_arg(struct trace_proc * proc, unsigned long req, void * ptr, int dir)
353*521fa314SDavid van Moolenbroek {
354*521fa314SDavid van Moolenbroek 	const char *text;
355*521fa314SDavid van Moolenbroek 	nwio_ipopt_t *ipopt;
356*521fa314SDavid van Moolenbroek 	nwio_tcpconf_t *nwtc;
357*521fa314SDavid van Moolenbroek 	nwio_tcpcl_t *nwtcl;
358*521fa314SDavid van Moolenbroek 	nwio_tcpopt_t *nwto;
359*521fa314SDavid van Moolenbroek 	tcp_cookie_t *cookie;
360*521fa314SDavid van Moolenbroek 	nwio_udpopt_t *nwuo;
361*521fa314SDavid van Moolenbroek 	struct sockaddr_un *sun;
362*521fa314SDavid van Moolenbroek 	int i;
363*521fa314SDavid van Moolenbroek 
364*521fa314SDavid van Moolenbroek 	switch (req) {
365*521fa314SDavid van Moolenbroek 	case FIONREAD:
366*521fa314SDavid van Moolenbroek 		/*
367*521fa314SDavid van Moolenbroek 		 * Arguably this does not belong here, but as of writing, the
368*521fa314SDavid van Moolenbroek 		 * network services are the only ones actually implementing
369*521fa314SDavid van Moolenbroek 		 * support for this IOCTL, and we don't have a more suitable
370*521fa314SDavid van Moolenbroek 		 * place to put it either.
371*521fa314SDavid van Moolenbroek 		 */
372*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
373*521fa314SDavid van Moolenbroek 			return IF_IN;
374*521fa314SDavid van Moolenbroek 
375*521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
376*521fa314SDavid van Moolenbroek 		return IF_ALL;
377*521fa314SDavid van Moolenbroek 
378*521fa314SDavid van Moolenbroek 	case NWIOSIPOPT:
379*521fa314SDavid van Moolenbroek 	case NWIOGIPOPT:
380*521fa314SDavid van Moolenbroek 		if ((ipopt = (nwio_ipopt_t *)ptr) == NULL)
381*521fa314SDavid van Moolenbroek 			return dir;
382*521fa314SDavid van Moolenbroek 
383*521fa314SDavid van Moolenbroek 		put_flags(proc, "nwio_flags", ipopt_flags, COUNT(ipopt_flags),
384*521fa314SDavid van Moolenbroek 		    "0x%x", ipopt->nwio_flags);
385*521fa314SDavid van Moolenbroek 
386*521fa314SDavid van Moolenbroek 		if (ipopt->nwio_flags & NWIO_REMSPEC)
387*521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwio_rem", ipopt->nwio_rem);
388*521fa314SDavid van Moolenbroek 		if (ipopt->nwio_flags & NWIO_PROTOSPEC)
389*521fa314SDavid van Moolenbroek 			put_ipproto(proc, "nwio_proto", ipopt->nwio_proto);
390*521fa314SDavid van Moolenbroek 
391*521fa314SDavid van Moolenbroek 		return 0; /* TODO: the remaining fields */
392*521fa314SDavid van Moolenbroek 
393*521fa314SDavid van Moolenbroek 	case NWIOSTCPCONF:
394*521fa314SDavid van Moolenbroek 	case NWIOGTCPCONF:
395*521fa314SDavid van Moolenbroek 		if ((nwtc = (nwio_tcpconf_t *)ptr) == NULL)
396*521fa314SDavid van Moolenbroek 			return dir;
397*521fa314SDavid van Moolenbroek 
398*521fa314SDavid van Moolenbroek 		put_flags(proc, "nwtc_flags", tcpconf_flags,
399*521fa314SDavid van Moolenbroek 		    COUNT(tcpconf_flags), "0x%x", nwtc->nwtc_flags);
400*521fa314SDavid van Moolenbroek 
401*521fa314SDavid van Moolenbroek 		/* The local address cannot be set, just retrieved. */
402*521fa314SDavid van Moolenbroek 		if (req == NWIOGTCPCONF)
403*521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwtc_locaddr", nwtc->nwtc_locaddr);
404*521fa314SDavid van Moolenbroek 
405*521fa314SDavid van Moolenbroek 		if ((nwtc->nwtc_flags & NWTC_LOCPORT_MASK) == NWTC_LP_SET)
406*521fa314SDavid van Moolenbroek 			put_port(proc, "nwtc_locport", nwtc->nwtc_locport);
407*521fa314SDavid van Moolenbroek 
408*521fa314SDavid van Moolenbroek 		if (nwtc->nwtc_flags & NWTC_SET_RA)
409*521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwtc_remaddr", nwtc->nwtc_remaddr);
410*521fa314SDavid van Moolenbroek 
411*521fa314SDavid van Moolenbroek 		if (nwtc->nwtc_flags & NWTC_SET_RP)
412*521fa314SDavid van Moolenbroek 			put_port(proc, "nwtc_remport", nwtc->nwtc_remport);
413*521fa314SDavid van Moolenbroek 
414*521fa314SDavid van Moolenbroek 		return IF_ALL;
415*521fa314SDavid van Moolenbroek 
416*521fa314SDavid van Moolenbroek 	case NWIOTCPCONN:
417*521fa314SDavid van Moolenbroek 	case NWIOTCPLISTEN:
418*521fa314SDavid van Moolenbroek 		if ((nwtcl = (nwio_tcpcl_t *)ptr) == NULL)
419*521fa314SDavid van Moolenbroek 			return dir;
420*521fa314SDavid van Moolenbroek 
421*521fa314SDavid van Moolenbroek 		put_flags(proc, "nwtcl_flags", tcpcl_flags,
422*521fa314SDavid van Moolenbroek 		    COUNT(tcpcl_flags), "0x%x", nwtcl->nwtcl_flags);
423*521fa314SDavid van Moolenbroek 
424*521fa314SDavid van Moolenbroek 		/* We pretend the unused nwtcl_ttl field does not exist. */
425*521fa314SDavid van Moolenbroek 		return IF_ALL;
426*521fa314SDavid van Moolenbroek 
427*521fa314SDavid van Moolenbroek 	case NWIOSTCPOPT:
428*521fa314SDavid van Moolenbroek 	case NWIOGTCPOPT:
429*521fa314SDavid van Moolenbroek 		if ((nwto = (nwio_tcpopt_t *)ptr) == NULL)
430*521fa314SDavid van Moolenbroek 			return dir;
431*521fa314SDavid van Moolenbroek 
432*521fa314SDavid van Moolenbroek 		put_flags(proc, "nwto_flags", tcpopt_flags,
433*521fa314SDavid van Moolenbroek 		    COUNT(tcpopt_flags), "0x%x", nwto->nwto_flags);
434*521fa314SDavid van Moolenbroek 		return IF_ALL;
435*521fa314SDavid van Moolenbroek 
436*521fa314SDavid van Moolenbroek 	case NWIOTCPLISTENQ:
437*521fa314SDavid van Moolenbroek 	case NWIOSUDSBLOG:
438*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
439*521fa314SDavid van Moolenbroek 			return IF_OUT;
440*521fa314SDavid van Moolenbroek 
441*521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
442*521fa314SDavid van Moolenbroek 		return IF_ALL;
443*521fa314SDavid van Moolenbroek 
444*521fa314SDavid van Moolenbroek 	case NWIOGTCPCOOKIE:
445*521fa314SDavid van Moolenbroek 	case NWIOTCPACCEPTTO:
446*521fa314SDavid van Moolenbroek 		if ((cookie = (tcp_cookie_t *)ptr) == NULL)
447*521fa314SDavid van Moolenbroek 			return dir;
448*521fa314SDavid van Moolenbroek 
449*521fa314SDavid van Moolenbroek 		put_value(proc, "tc_ref", "%"PRIu32, cookie->tc_ref);
450*521fa314SDavid van Moolenbroek 		if (verbose > 0)
451*521fa314SDavid van Moolenbroek 			put_buf(proc, "tc_secret", PF_LOCADDR,
452*521fa314SDavid van Moolenbroek 			    (vir_bytes)&cookie->tc_secret,
453*521fa314SDavid van Moolenbroek 			    sizeof(cookie->tc_secret));
454*521fa314SDavid van Moolenbroek 		return (verbose > 0) ? IF_ALL : 0;
455*521fa314SDavid van Moolenbroek 
456*521fa314SDavid van Moolenbroek 	case NWIOTCPGERROR:
457*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
458*521fa314SDavid van Moolenbroek 			return IF_IN;
459*521fa314SDavid van Moolenbroek 
460*521fa314SDavid van Moolenbroek 		i = *(int *)ptr;
461*521fa314SDavid van Moolenbroek 		if (!valuesonly && (text = get_error_name(i)) != NULL)
462*521fa314SDavid van Moolenbroek 			put_field(proc, NULL, text);
463*521fa314SDavid van Moolenbroek 		else
464*521fa314SDavid van Moolenbroek 			put_value(proc, NULL, "%d", i);
465*521fa314SDavid van Moolenbroek 		return IF_ALL;
466*521fa314SDavid van Moolenbroek 
467*521fa314SDavid van Moolenbroek 	case NWIOSUDPOPT:
468*521fa314SDavid van Moolenbroek 	case NWIOGUDPOPT:
469*521fa314SDavid van Moolenbroek 		if ((nwuo = (nwio_udpopt_t *)ptr) == NULL)
470*521fa314SDavid van Moolenbroek 			return dir;
471*521fa314SDavid van Moolenbroek 
472*521fa314SDavid van Moolenbroek 		put_flags(proc, "nwuo_flags", udpopt_flags,
473*521fa314SDavid van Moolenbroek 		    COUNT(udpopt_flags), "0x%x", nwuo->nwuo_flags);
474*521fa314SDavid van Moolenbroek 
475*521fa314SDavid van Moolenbroek 		/* The local address cannot be set, just retrieved. */
476*521fa314SDavid van Moolenbroek 		if (req == NWIOGUDPOPT)
477*521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwuo_locaddr", nwuo->nwuo_locaddr);
478*521fa314SDavid van Moolenbroek 
479*521fa314SDavid van Moolenbroek 		if ((nwuo->nwuo_flags & NWUO_LOCPORT_MASK) == NWUO_LP_SET)
480*521fa314SDavid van Moolenbroek 			put_port(proc, "nwuo_locport", nwuo->nwuo_locport);
481*521fa314SDavid van Moolenbroek 
482*521fa314SDavid van Moolenbroek 		if (nwuo->nwuo_flags & NWUO_RA_SET)
483*521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwuo_remaddr", nwuo->nwuo_remaddr);
484*521fa314SDavid van Moolenbroek 
485*521fa314SDavid van Moolenbroek 		if (nwuo->nwuo_flags & NWUO_RP_SET)
486*521fa314SDavid van Moolenbroek 			put_port(proc, "nwuo_remport", nwuo->nwuo_remport);
487*521fa314SDavid van Moolenbroek 
488*521fa314SDavid van Moolenbroek 		return IF_ALL;
489*521fa314SDavid van Moolenbroek 
490*521fa314SDavid van Moolenbroek 	case NWIOGUDSFADDR:
491*521fa314SDavid van Moolenbroek 	case NWIOSUDSTADDR:
492*521fa314SDavid van Moolenbroek 	case NWIOSUDSADDR:
493*521fa314SDavid van Moolenbroek 	case NWIOGUDSADDR:
494*521fa314SDavid van Moolenbroek 	case NWIOGUDSPADDR:
495*521fa314SDavid van Moolenbroek 	case NWIOSUDSCONN:
496*521fa314SDavid van Moolenbroek 	case NWIOSUDSACCEPT:
497*521fa314SDavid van Moolenbroek 		if ((sun = (struct sockaddr_un *)ptr) == NULL)
498*521fa314SDavid van Moolenbroek 			return dir;
499*521fa314SDavid van Moolenbroek 
500*521fa314SDavid van Moolenbroek 		put_family(proc, "sun_family", sun->sun_family);
501*521fa314SDavid van Moolenbroek 
502*521fa314SDavid van Moolenbroek 		/* This could be extended to a generic sockaddr printer.. */
503*521fa314SDavid van Moolenbroek 		if (sun->sun_family == AF_LOCAL) {
504*521fa314SDavid van Moolenbroek 			put_buf(proc, "sun_path", PF_LOCADDR | PF_PATH,
505*521fa314SDavid van Moolenbroek 			    (vir_bytes)&sun->sun_path, sizeof(sun->sun_path));
506*521fa314SDavid van Moolenbroek 			return IF_ALL; /* skipping sun_len, it's unused */
507*521fa314SDavid van Moolenbroek 		} else
508*521fa314SDavid van Moolenbroek 			return 0;
509*521fa314SDavid van Moolenbroek 
510*521fa314SDavid van Moolenbroek 	case NWIOSUDSTYPE:
511*521fa314SDavid van Moolenbroek 	case NWIOGUDSSOTYPE:
512*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
513*521fa314SDavid van Moolenbroek 			return dir;
514*521fa314SDavid van Moolenbroek 
515*521fa314SDavid van Moolenbroek 		put_flags(proc, NULL, sock_type, COUNT(sock_type), "0x%x",
516*521fa314SDavid van Moolenbroek 		    *(int *)ptr);
517*521fa314SDavid van Moolenbroek 		return IF_ALL;
518*521fa314SDavid van Moolenbroek 
519*521fa314SDavid van Moolenbroek 	case NWIOSUDSSHUT:
520*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
521*521fa314SDavid van Moolenbroek 			return IF_OUT;
522*521fa314SDavid van Moolenbroek 
523*521fa314SDavid van Moolenbroek 		put_shutdown_how(proc, NULL, *(int *)ptr);
524*521fa314SDavid van Moolenbroek 		return IF_ALL;
525*521fa314SDavid van Moolenbroek 
526*521fa314SDavid van Moolenbroek 	case NWIOSUDSPAIR:
527*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
528*521fa314SDavid van Moolenbroek 			return IF_OUT;
529*521fa314SDavid van Moolenbroek 
530*521fa314SDavid van Moolenbroek 		put_dev(proc, NULL, *(dev_t *)ptr);
531*521fa314SDavid van Moolenbroek 		return IF_ALL;
532*521fa314SDavid van Moolenbroek 
533*521fa314SDavid van Moolenbroek 	case NWIOSUDSCTRL:
534*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
535*521fa314SDavid van Moolenbroek 			return IF_OUT;
536*521fa314SDavid van Moolenbroek 
537*521fa314SDavid van Moolenbroek 		/* FALLTHROUGH */
538*521fa314SDavid van Moolenbroek 	case NWIOGUDSCTRL:
539*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
540*521fa314SDavid van Moolenbroek 			return IF_IN;
541*521fa314SDavid van Moolenbroek 
542*521fa314SDavid van Moolenbroek 		put_msg_control(proc, (struct msg_control *)ptr);
543*521fa314SDavid van Moolenbroek 		return IF_ALL;
544*521fa314SDavid van Moolenbroek 
545*521fa314SDavid van Moolenbroek 	case NWIOGUDSPEERCRED:
546*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
547*521fa314SDavid van Moolenbroek 			return IF_IN;
548*521fa314SDavid van Moolenbroek 
549*521fa314SDavid van Moolenbroek 		put_struct_uucred(proc, NULL, PF_LOCADDR, (vir_bytes)ptr);
550*521fa314SDavid van Moolenbroek 		return IF_ALL;
551*521fa314SDavid van Moolenbroek 
552*521fa314SDavid van Moolenbroek 	case NWIOGUDSSNDBUF:
553*521fa314SDavid van Moolenbroek 	case NWIOSUDSSNDBUF:
554*521fa314SDavid van Moolenbroek 	case NWIOGUDSRCVBUF:
555*521fa314SDavid van Moolenbroek 	case NWIOSUDSRCVBUF:
556*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
557*521fa314SDavid van Moolenbroek 			return dir;
558*521fa314SDavid van Moolenbroek 
559*521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%zu", *(size_t *)ptr);
560*521fa314SDavid van Moolenbroek 		return IF_ALL;
561*521fa314SDavid van Moolenbroek 
562*521fa314SDavid van Moolenbroek 	default:
563*521fa314SDavid van Moolenbroek 		return 0;
564*521fa314SDavid van Moolenbroek 	}
565*521fa314SDavid van Moolenbroek }
566