xref: /minix3/minix/usr.bin/trace/ioctl/net.c (revision b58e161ccb9bcc2008a44da1b8ee01a0a6f2990e)
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 
20521fa314SDavid van Moolenbroek const char *
21521fa314SDavid van Moolenbroek net_ioctl_name(unsigned long req)
22521fa314SDavid van Moolenbroek {
23521fa314SDavid van Moolenbroek 
24521fa314SDavid van Moolenbroek 	switch (req) {
25521fa314SDavid van Moolenbroek 	NAME(FIONREAD);
26521fa314SDavid van Moolenbroek 	NAME(NWIOSETHOPT);	/* TODO: print argument */
27521fa314SDavid van Moolenbroek 	NAME(NWIOGETHOPT);	/* TODO: print argument */
28521fa314SDavid van Moolenbroek 	NAME(NWIOGETHSTAT);	/* TODO: print argument */
29521fa314SDavid van Moolenbroek 	NAME(NWIOARPGIP);	/* TODO: print argument */
30521fa314SDavid van Moolenbroek 	NAME(NWIOARPGNEXT);	/* TODO: print argument */
31521fa314SDavid van Moolenbroek 	NAME(NWIOARPSIP);	/* TODO: print argument */
32521fa314SDavid van Moolenbroek 	NAME(NWIOARPDIP);	/* TODO: print argument */
33521fa314SDavid van Moolenbroek 	NAME(NWIOSIPCONF2);	/* TODO: print argument */
34521fa314SDavid van Moolenbroek 	NAME(NWIOSIPCONF);	/* TODO: print argument */
35521fa314SDavid van Moolenbroek 	NAME(NWIOGIPCONF2);	/* TODO: print argument */
36521fa314SDavid van Moolenbroek 	NAME(NWIOGIPCONF);	/* TODO: print argument */
37521fa314SDavid van Moolenbroek 	NAME(NWIOSIPOPT);
38521fa314SDavid van Moolenbroek 	NAME(NWIOGIPOPT);
39521fa314SDavid van Moolenbroek 	NAME(NWIOGIPOROUTE);	/* TODO: print argument */
40521fa314SDavid van Moolenbroek 	NAME(NWIOSIPOROUTE);	/* TODO: print argument */
41521fa314SDavid van Moolenbroek 	NAME(NWIODIPOROUTE);	/* TODO: print argument */
42521fa314SDavid van Moolenbroek 	NAME(NWIOGIPIROUTE);	/* TODO: print argument */
43521fa314SDavid van Moolenbroek 	NAME(NWIOSIPIROUTE);	/* TODO: print argument */
44521fa314SDavid van Moolenbroek 	NAME(NWIODIPIROUTE);	/* TODO: print argument */
45521fa314SDavid van Moolenbroek 	NAME(NWIOSTCPCONF);
46521fa314SDavid van Moolenbroek 	NAME(NWIOGTCPCONF);
47521fa314SDavid van Moolenbroek 	NAME(NWIOTCPCONN);
48521fa314SDavid van Moolenbroek 	NAME(NWIOTCPLISTEN);
49521fa314SDavid van Moolenbroek 	NAME(NWIOTCPATTACH);	/* TODO: print argument */
50521fa314SDavid van Moolenbroek 	NAME(NWIOTCPSHUTDOWN);	/* no argument */
51521fa314SDavid van Moolenbroek 	NAME(NWIOSTCPOPT);
52521fa314SDavid van Moolenbroek 	NAME(NWIOGTCPOPT);
53521fa314SDavid van Moolenbroek 	NAME(NWIOTCPPUSH);	/* no argument */
54521fa314SDavid van Moolenbroek 	NAME(NWIOTCPLISTENQ);
55521fa314SDavid van Moolenbroek 	NAME(NWIOGTCPCOOKIE);
56521fa314SDavid van Moolenbroek 	NAME(NWIOTCPACCEPTTO);
57521fa314SDavid van Moolenbroek 	NAME(NWIOTCPGERROR);
58521fa314SDavid van Moolenbroek 	NAME(NWIOSUDPOPT);
59521fa314SDavid van Moolenbroek 	NAME(NWIOGUDPOPT);
60521fa314SDavid van Moolenbroek 	NAME(NWIOUDPPEEK);	/* TODO: print argument */
61521fa314SDavid van Moolenbroek 	NAME(NWIOSPSIPOPT);	/* TODO: print argument */
62521fa314SDavid van Moolenbroek 	NAME(NWIOGPSIPOPT);	/* TODO: print argument */
63521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSFADDR);
64521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSTADDR);
65521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSADDR);
66521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSADDR);
67521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSPADDR);
68521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSTYPE);
69521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSBLOG);
70521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSCONN);
71521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSSHUT);
72521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSPAIR);
73521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSACCEPT);
74521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSCTRL);
75521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSCTRL);
76521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSSOTYPE);
77521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSPEERCRED);
78521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSSNDBUF);
79521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSSNDBUF);
80521fa314SDavid van Moolenbroek 	NAME(NWIOGUDSRCVBUF);
81521fa314SDavid van Moolenbroek 	NAME(NWIOSUDSRCVBUF);
82521fa314SDavid van Moolenbroek 	}
83521fa314SDavid van Moolenbroek 
84521fa314SDavid van Moolenbroek 	return NULL;
85521fa314SDavid van Moolenbroek }
86521fa314SDavid van Moolenbroek 
87521fa314SDavid van Moolenbroek static const struct flags ipopt_flags[] = {
88521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWIO_NOFLAGS),
89521fa314SDavid van Moolenbroek 	FLAG_MASK(NWIO_ACC_MASK, NWIO_EXCL),
90521fa314SDavid van Moolenbroek 	FLAG_MASK(NWIO_ACC_MASK, NWIO_SHARED),
91521fa314SDavid van Moolenbroek 	FLAG_MASK(NWIO_ACC_MASK, NWIO_COPY),
92521fa314SDavid van Moolenbroek 	FLAG(NWIO_EN_LOC),
93521fa314SDavid van Moolenbroek 	FLAG(NWIO_DI_LOC),
94521fa314SDavid van Moolenbroek 	FLAG(NWIO_EN_BROAD),
95521fa314SDavid van Moolenbroek 	FLAG(NWIO_DI_BROAD),
96521fa314SDavid van Moolenbroek 	FLAG(NWIO_REMSPEC),
97521fa314SDavid van Moolenbroek 	FLAG(NWIO_REMANY),
98521fa314SDavid van Moolenbroek 	FLAG(NWIO_PROTOSPEC),
99521fa314SDavid van Moolenbroek 	FLAG(NWIO_PROTOANY),
100521fa314SDavid van Moolenbroek 	FLAG(NWIO_HDR_O_SPEC),
101521fa314SDavid van Moolenbroek 	FLAG(NWIO_HDR_O_ANY),
102521fa314SDavid van Moolenbroek 	FLAG(NWIO_RWDATONLY),
103521fa314SDavid van Moolenbroek 	FLAG(NWIO_RWDATALL),
104521fa314SDavid van Moolenbroek };
105521fa314SDavid van Moolenbroek 
106521fa314SDavid van Moolenbroek static void
107521fa314SDavid van Moolenbroek put_ipaddr(struct trace_proc * proc, const char * name, ipaddr_t ipaddr)
108521fa314SDavid van Moolenbroek {
109521fa314SDavid van Moolenbroek 	struct in_addr in;
110521fa314SDavid van Moolenbroek 
111521fa314SDavid van Moolenbroek 	if (!valuesonly) {
112521fa314SDavid van Moolenbroek 		in.s_addr = ipaddr;
113521fa314SDavid van Moolenbroek 
114521fa314SDavid van Moolenbroek 		/* Is this an acceptable encapsulation? */
115521fa314SDavid van Moolenbroek 		put_value(proc, name, "[%s]", inet_ntoa(in));
116521fa314SDavid van Moolenbroek 	} else
117521fa314SDavid van Moolenbroek 		put_value(proc, name, "0x%08x", ntohl(ipaddr));
118521fa314SDavid van Moolenbroek }
119521fa314SDavid van Moolenbroek 
120521fa314SDavid van Moolenbroek static void
121521fa314SDavid van Moolenbroek put_ipproto(struct trace_proc * proc, const char * name, ipproto_t proto)
122521fa314SDavid van Moolenbroek {
123521fa314SDavid van Moolenbroek 	const char *text = NULL;
124521fa314SDavid van Moolenbroek 
125521fa314SDavid van Moolenbroek 	if (!valuesonly) {
126521fa314SDavid van Moolenbroek 		switch (proto) {
127521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_ICMP);
128521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_TCP);
129521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_UDP);
130521fa314SDavid van Moolenbroek 		}
131521fa314SDavid van Moolenbroek 	}
132521fa314SDavid van Moolenbroek 
133521fa314SDavid van Moolenbroek 	if (text != NULL)
134521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
135521fa314SDavid van Moolenbroek 	else
136521fa314SDavid van Moolenbroek 		put_value(proc, name, "%u", proto);
137521fa314SDavid van Moolenbroek }
138521fa314SDavid van Moolenbroek 
139521fa314SDavid van Moolenbroek static const struct flags tcpconf_flags[] = {
140521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWTC_NOFLAGS),
141521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_EXCL),
142521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_SHARED),
143521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_COPY),
144521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_UNSET),
145521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_SET),
146521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_SEL),
147521fa314SDavid van Moolenbroek 	FLAG(NWTC_SET_RA),
148521fa314SDavid van Moolenbroek 	FLAG(NWTC_UNSET_RA),
149521fa314SDavid van Moolenbroek 	FLAG(NWTC_SET_RP),
150521fa314SDavid van Moolenbroek 	FLAG(NWTC_UNSET_RP),
151521fa314SDavid van Moolenbroek };
152521fa314SDavid van Moolenbroek 
153521fa314SDavid van Moolenbroek #define put_port(proc, name, port) \
154521fa314SDavid van Moolenbroek 	put_value(proc, name, "%u", ntohs(port))
155521fa314SDavid van Moolenbroek 
156521fa314SDavid van Moolenbroek static const struct flags tcpcl_flags[] = {
157521fa314SDavid van Moolenbroek 	FLAG_ZERO(TCF_DEFAULT),
158521fa314SDavid van Moolenbroek 	FLAG(TCF_ASYNCH),
159521fa314SDavid van Moolenbroek };
160521fa314SDavid van Moolenbroek 
161521fa314SDavid van Moolenbroek static const struct flags tcpopt_flags[] = {
162521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWTO_NOFLAG),
163521fa314SDavid van Moolenbroek 	FLAG(NWTO_SND_URG),
164521fa314SDavid van Moolenbroek 	FLAG(NWTO_SND_NOTURG),
165521fa314SDavid van Moolenbroek 	FLAG(NWTO_RCV_URG),
166521fa314SDavid van Moolenbroek 	FLAG(NWTO_RCV_NOTURG),
167521fa314SDavid van Moolenbroek 	FLAG(NWTO_BSD_URG),
168521fa314SDavid van Moolenbroek 	FLAG(NWTO_NOTBSD_URG),
169521fa314SDavid van Moolenbroek 	FLAG(NWTO_DEL_RST),
170521fa314SDavid van Moolenbroek 	FLAG(NWTO_BULK),
171521fa314SDavid van Moolenbroek 	FLAG(NWTO_NOBULK),
172521fa314SDavid van Moolenbroek };
173521fa314SDavid van Moolenbroek 
174521fa314SDavid van Moolenbroek static const struct flags udpopt_flags[] = {
175521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWUO_NOFLAGS),
176521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_EXCL),
177521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_SHARED),
178521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_COPY),
179521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_SET),
180521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_SEL),
181521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_ANY),
182521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_LOC),
183521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_LOC),
184521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_BROAD),
185521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_BROAD),
186521fa314SDavid van Moolenbroek 	FLAG(NWUO_RP_SET),
187521fa314SDavid van Moolenbroek 	FLAG(NWUO_RP_ANY),
188521fa314SDavid van Moolenbroek 	FLAG(NWUO_RA_SET),
189521fa314SDavid van Moolenbroek 	FLAG(NWUO_RA_ANY),
190521fa314SDavid van Moolenbroek 	FLAG(NWUO_RWDATONLY),
191521fa314SDavid van Moolenbroek 	FLAG(NWUO_RWDATALL),
192521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_IPOPT),
193521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_IPOPT),
194521fa314SDavid van Moolenbroek };
195521fa314SDavid van Moolenbroek 
196521fa314SDavid van Moolenbroek static void
197521fa314SDavid van Moolenbroek put_family(struct trace_proc * proc, const char * name, int family)
198521fa314SDavid van Moolenbroek {
199521fa314SDavid van Moolenbroek 	const char *text = NULL;
200521fa314SDavid van Moolenbroek 
201521fa314SDavid van Moolenbroek 	if (!valuesonly) {
202521fa314SDavid van Moolenbroek 		/* TODO: add all the other protocols */
203521fa314SDavid van Moolenbroek 		switch (family) {
204521fa314SDavid van Moolenbroek 		TEXT(AF_UNSPEC);
205521fa314SDavid van Moolenbroek 		TEXT(AF_LOCAL);
206521fa314SDavid van Moolenbroek 		TEXT(AF_INET);
207521fa314SDavid van Moolenbroek 		TEXT(AF_INET6);
208521fa314SDavid van Moolenbroek 		}
209521fa314SDavid van Moolenbroek 	}
210521fa314SDavid van Moolenbroek 
211521fa314SDavid van Moolenbroek 	if (text != NULL)
212521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
213521fa314SDavid van Moolenbroek 	else
214521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", family);
215521fa314SDavid van Moolenbroek }
216521fa314SDavid van Moolenbroek 
217521fa314SDavid van Moolenbroek static const struct flags sock_type[] = {
218521fa314SDavid van Moolenbroek 	FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_STREAM),
219521fa314SDavid van Moolenbroek 	FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_DGRAM),
220521fa314SDavid van Moolenbroek 	FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_RAW),
221521fa314SDavid van Moolenbroek 	FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_RDM),
222521fa314SDavid van Moolenbroek 	FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_SEQPACKET),
223521fa314SDavid van Moolenbroek 	FLAG(SOCK_CLOEXEC),
224521fa314SDavid van Moolenbroek 	FLAG(SOCK_NONBLOCK),
225521fa314SDavid van Moolenbroek 	FLAG(SOCK_NOSIGPIPE),
226521fa314SDavid van Moolenbroek };
227521fa314SDavid van Moolenbroek 
228521fa314SDavid van Moolenbroek static void
229521fa314SDavid van Moolenbroek put_shutdown_how(struct trace_proc * proc, const char * name, int how)
230521fa314SDavid van Moolenbroek {
231521fa314SDavid van Moolenbroek 	const char *text = NULL;
232521fa314SDavid van Moolenbroek 
233521fa314SDavid van Moolenbroek 	if (!valuesonly) {
234521fa314SDavid van Moolenbroek 		switch (how) {
235521fa314SDavid van Moolenbroek 		TEXT(SHUT_RD);
236521fa314SDavid van Moolenbroek 		TEXT(SHUT_WR);
237521fa314SDavid van Moolenbroek 		TEXT(SHUT_RDWR);
238521fa314SDavid van Moolenbroek 		}
239521fa314SDavid van Moolenbroek 	}
240521fa314SDavid van Moolenbroek 
241521fa314SDavid van Moolenbroek 	if (text != NULL)
242521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
243521fa314SDavid van Moolenbroek 	else
244521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", how);
245521fa314SDavid van Moolenbroek }
246521fa314SDavid van Moolenbroek 
247521fa314SDavid van Moolenbroek static void
248521fa314SDavid van Moolenbroek put_struct_uucred(struct trace_proc * proc, const char * name, int flags,
249521fa314SDavid van Moolenbroek 	vir_bytes addr)
250521fa314SDavid van Moolenbroek {
251521fa314SDavid van Moolenbroek 	struct uucred cred;
252521fa314SDavid van Moolenbroek 
253521fa314SDavid van Moolenbroek 	if (!put_open_struct(proc, name, flags, addr, &cred, sizeof(cred)))
254521fa314SDavid van Moolenbroek 		return;
255521fa314SDavid van Moolenbroek 
256521fa314SDavid van Moolenbroek 	put_value(proc, "cr_uid", "%u", cred.cr_uid);
257521fa314SDavid van Moolenbroek 	if (verbose > 0) {
258521fa314SDavid van Moolenbroek 		put_value(proc, "cr_gid", "%u", cred.cr_gid);
259521fa314SDavid van Moolenbroek 		if (verbose > 1)
260521fa314SDavid van Moolenbroek 			put_value(proc, "cr_ngroups", "%d", cred.cr_ngroups);
261521fa314SDavid van Moolenbroek 		put_groups(proc, "cr_groups", PF_LOCADDR,
262521fa314SDavid van Moolenbroek 		    (vir_bytes)&cred.cr_groups, cred.cr_ngroups);
263521fa314SDavid van Moolenbroek 	}
264521fa314SDavid van Moolenbroek 
265521fa314SDavid van Moolenbroek 	put_close_struct(proc, verbose > 0);
266521fa314SDavid van Moolenbroek }
267521fa314SDavid van Moolenbroek 
268521fa314SDavid van Moolenbroek static void
269521fa314SDavid van Moolenbroek put_cmsg_type(struct trace_proc * proc, const char * name, int type)
270521fa314SDavid van Moolenbroek {
271521fa314SDavid van Moolenbroek 	const char *text = NULL;
272521fa314SDavid van Moolenbroek 
273521fa314SDavid van Moolenbroek 	if (!valuesonly) {
274521fa314SDavid van Moolenbroek 		switch (type) {
275521fa314SDavid van Moolenbroek 		TEXT(SCM_RIGHTS);
276521fa314SDavid van Moolenbroek 		TEXT(SCM_CREDS);
277521fa314SDavid van Moolenbroek 		TEXT(SCM_TIMESTAMP);
278521fa314SDavid van Moolenbroek 		}
279521fa314SDavid van Moolenbroek 	}
280521fa314SDavid van Moolenbroek 
281521fa314SDavid van Moolenbroek 	if (text != NULL)
282521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
283521fa314SDavid van Moolenbroek 	else
284521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", type);
285521fa314SDavid van Moolenbroek }
286521fa314SDavid van Moolenbroek 
287521fa314SDavid van Moolenbroek static void
288521fa314SDavid van Moolenbroek put_msg_control(struct trace_proc * proc, struct msg_control * ptr)
289521fa314SDavid van Moolenbroek {
290521fa314SDavid van Moolenbroek 	struct msghdr msg;
291521fa314SDavid van Moolenbroek 	struct cmsghdr *cmsg;
292521fa314SDavid van Moolenbroek 	size_t len;
293*b58e161cSDavid van Moolenbroek 	unsigned int i;
294521fa314SDavid van Moolenbroek 
295521fa314SDavid van Moolenbroek 	if (ptr->msg_controllen > sizeof(ptr->msg_control)) {
296521fa314SDavid van Moolenbroek 		put_field(proc, NULL, "..");
297521fa314SDavid van Moolenbroek 
298521fa314SDavid van Moolenbroek 		return;
299521fa314SDavid van Moolenbroek 	}
300521fa314SDavid van Moolenbroek 
301521fa314SDavid van Moolenbroek 	put_open(proc, NULL, PF_NONAME, "[", ", ");
302521fa314SDavid van Moolenbroek 
303521fa314SDavid van Moolenbroek 	memset(&msg, 0, sizeof(msg));
304521fa314SDavid van Moolenbroek 	msg.msg_control = ptr->msg_control;
305521fa314SDavid van Moolenbroek 	msg.msg_controllen = ptr->msg_controllen;
306521fa314SDavid van Moolenbroek 
307521fa314SDavid van Moolenbroek 	/*
308521fa314SDavid van Moolenbroek 	 * TODO: decide if we need a verbosity-based limit here.  The argument
309521fa314SDavid van Moolenbroek 	 * in favor of printing everything is that upon receipt, SCM_RIGHTS
310521fa314SDavid van Moolenbroek 	 * actually creates new file descriptors, which is pretty essential in
311521fa314SDavid van Moolenbroek 	 * terms of figuring out what is happening in a process.  In addition,
312521fa314SDavid van Moolenbroek 	 * these calls should be sufficiently rare that the lengthy output is
313521fa314SDavid van Moolenbroek 	 * not really disruptive for the general output flow.
314521fa314SDavid van Moolenbroek 	 */
315521fa314SDavid van Moolenbroek 	for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
316521fa314SDavid van Moolenbroek 	    cmsg = CMSG_NXTHDR(&msg, cmsg)) {
317521fa314SDavid van Moolenbroek 		put_open(proc, NULL, 0, "{", ", ");
318521fa314SDavid van Moolenbroek 
319521fa314SDavid van Moolenbroek 		if (verbose > 0)
320521fa314SDavid van Moolenbroek 			put_value(proc, "cmsg_len", "%u", cmsg->cmsg_len);
321521fa314SDavid van Moolenbroek 		if (!valuesonly && cmsg->cmsg_level == SOL_SOCKET)
322521fa314SDavid van Moolenbroek 			put_field(proc, "cmsg_level", "SOL_SOCKET");
323521fa314SDavid van Moolenbroek 		else
324521fa314SDavid van Moolenbroek 			put_value(proc, "cmsg_level", "%d", cmsg->cmsg_level);
325521fa314SDavid van Moolenbroek 		if (cmsg->cmsg_level == SOL_SOCKET)
326521fa314SDavid van Moolenbroek 			put_cmsg_type(proc, "cmsg_type", cmsg->cmsg_type);
327521fa314SDavid van Moolenbroek 
328521fa314SDavid van Moolenbroek 		len = cmsg->cmsg_len - CMSG_LEN(0);
329521fa314SDavid van Moolenbroek 
330521fa314SDavid van Moolenbroek 		/* Print the contents of the messages that we know. */
331521fa314SDavid van Moolenbroek 		if (cmsg->cmsg_level == SOL_SOCKET &&
332521fa314SDavid van Moolenbroek 		    cmsg->cmsg_type == SCM_RIGHTS) {
333521fa314SDavid van Moolenbroek 			put_open(proc, NULL, PF_NONAME, "[", ", ");
334521fa314SDavid van Moolenbroek 			for (i = 0; i < len / sizeof(int); i++)
335521fa314SDavid van Moolenbroek 				put_fd(proc, NULL,
336521fa314SDavid van Moolenbroek 				    ((int *)CMSG_DATA(cmsg))[i]);
337521fa314SDavid van Moolenbroek 			put_close(proc, "]");
338521fa314SDavid van Moolenbroek 		} else if (cmsg->cmsg_level == SOL_SOCKET &&
339521fa314SDavid van Moolenbroek 		    cmsg->cmsg_type == SCM_CREDS) {
340521fa314SDavid van Moolenbroek 			put_struct_uucred(proc, NULL, PF_LOCADDR,
341521fa314SDavid van Moolenbroek 			    (vir_bytes)CMSG_DATA(cmsg));
342521fa314SDavid van Moolenbroek 		} else if (len > 0)
343521fa314SDavid van Moolenbroek 			put_field(proc, NULL, "..");
344521fa314SDavid van Moolenbroek 
345521fa314SDavid van Moolenbroek 		put_close(proc, "}");
346521fa314SDavid van Moolenbroek 	}
347521fa314SDavid van Moolenbroek 
348521fa314SDavid van Moolenbroek 	put_close(proc, "]");
349521fa314SDavid van Moolenbroek }
350521fa314SDavid van Moolenbroek 
351521fa314SDavid van Moolenbroek int
352521fa314SDavid van Moolenbroek net_ioctl_arg(struct trace_proc * proc, unsigned long req, void * ptr, int dir)
353521fa314SDavid van Moolenbroek {
354521fa314SDavid van Moolenbroek 	const char *text;
355521fa314SDavid van Moolenbroek 	nwio_ipopt_t *ipopt;
356521fa314SDavid van Moolenbroek 	nwio_tcpconf_t *nwtc;
357521fa314SDavid van Moolenbroek 	nwio_tcpcl_t *nwtcl;
358521fa314SDavid van Moolenbroek 	nwio_tcpopt_t *nwto;
359521fa314SDavid van Moolenbroek 	tcp_cookie_t *cookie;
360521fa314SDavid van Moolenbroek 	nwio_udpopt_t *nwuo;
361521fa314SDavid van Moolenbroek 	struct sockaddr_un *sun;
362521fa314SDavid van Moolenbroek 	int i;
363521fa314SDavid van Moolenbroek 
364521fa314SDavid van Moolenbroek 	switch (req) {
365521fa314SDavid van Moolenbroek 	case FIONREAD:
366521fa314SDavid van Moolenbroek 		/*
367521fa314SDavid van Moolenbroek 		 * Arguably this does not belong here, but as of writing, the
368521fa314SDavid van Moolenbroek 		 * network services are the only ones actually implementing
369521fa314SDavid van Moolenbroek 		 * support for this IOCTL, and we don't have a more suitable
370521fa314SDavid van Moolenbroek 		 * place to put it either.
371521fa314SDavid van Moolenbroek 		 */
372521fa314SDavid van Moolenbroek 		if (ptr == NULL)
373521fa314SDavid van Moolenbroek 			return IF_IN;
374521fa314SDavid van Moolenbroek 
375521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
376521fa314SDavid van Moolenbroek 		return IF_ALL;
377521fa314SDavid van Moolenbroek 
378521fa314SDavid van Moolenbroek 	case NWIOSIPOPT:
379521fa314SDavid van Moolenbroek 	case NWIOGIPOPT:
380521fa314SDavid van Moolenbroek 		if ((ipopt = (nwio_ipopt_t *)ptr) == NULL)
381521fa314SDavid van Moolenbroek 			return dir;
382521fa314SDavid van Moolenbroek 
383521fa314SDavid van Moolenbroek 		put_flags(proc, "nwio_flags", ipopt_flags, COUNT(ipopt_flags),
384521fa314SDavid van Moolenbroek 		    "0x%x", ipopt->nwio_flags);
385521fa314SDavid van Moolenbroek 
386521fa314SDavid van Moolenbroek 		if (ipopt->nwio_flags & NWIO_REMSPEC)
387521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwio_rem", ipopt->nwio_rem);
388521fa314SDavid van Moolenbroek 		if (ipopt->nwio_flags & NWIO_PROTOSPEC)
389521fa314SDavid van Moolenbroek 			put_ipproto(proc, "nwio_proto", ipopt->nwio_proto);
390521fa314SDavid van Moolenbroek 
391521fa314SDavid van Moolenbroek 		return 0; /* TODO: the remaining fields */
392521fa314SDavid van Moolenbroek 
393521fa314SDavid van Moolenbroek 	case NWIOSTCPCONF:
394521fa314SDavid van Moolenbroek 	case NWIOGTCPCONF:
395521fa314SDavid van Moolenbroek 		if ((nwtc = (nwio_tcpconf_t *)ptr) == NULL)
396521fa314SDavid van Moolenbroek 			return dir;
397521fa314SDavid van Moolenbroek 
398521fa314SDavid van Moolenbroek 		put_flags(proc, "nwtc_flags", tcpconf_flags,
399521fa314SDavid van Moolenbroek 		    COUNT(tcpconf_flags), "0x%x", nwtc->nwtc_flags);
400521fa314SDavid van Moolenbroek 
401521fa314SDavid van Moolenbroek 		/* The local address cannot be set, just retrieved. */
402521fa314SDavid van Moolenbroek 		if (req == NWIOGTCPCONF)
403521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwtc_locaddr", nwtc->nwtc_locaddr);
404521fa314SDavid van Moolenbroek 
405521fa314SDavid van Moolenbroek 		if ((nwtc->nwtc_flags & NWTC_LOCPORT_MASK) == NWTC_LP_SET)
406521fa314SDavid van Moolenbroek 			put_port(proc, "nwtc_locport", nwtc->nwtc_locport);
407521fa314SDavid van Moolenbroek 
408521fa314SDavid van Moolenbroek 		if (nwtc->nwtc_flags & NWTC_SET_RA)
409521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwtc_remaddr", nwtc->nwtc_remaddr);
410521fa314SDavid van Moolenbroek 
411521fa314SDavid van Moolenbroek 		if (nwtc->nwtc_flags & NWTC_SET_RP)
412521fa314SDavid van Moolenbroek 			put_port(proc, "nwtc_remport", nwtc->nwtc_remport);
413521fa314SDavid van Moolenbroek 
414521fa314SDavid van Moolenbroek 		return IF_ALL;
415521fa314SDavid van Moolenbroek 
416521fa314SDavid van Moolenbroek 	case NWIOTCPCONN:
417521fa314SDavid van Moolenbroek 	case NWIOTCPLISTEN:
418521fa314SDavid van Moolenbroek 		if ((nwtcl = (nwio_tcpcl_t *)ptr) == NULL)
419521fa314SDavid van Moolenbroek 			return dir;
420521fa314SDavid van Moolenbroek 
421521fa314SDavid van Moolenbroek 		put_flags(proc, "nwtcl_flags", tcpcl_flags,
422521fa314SDavid van Moolenbroek 		    COUNT(tcpcl_flags), "0x%x", nwtcl->nwtcl_flags);
423521fa314SDavid van Moolenbroek 
424521fa314SDavid van Moolenbroek 		/* We pretend the unused nwtcl_ttl field does not exist. */
425521fa314SDavid van Moolenbroek 		return IF_ALL;
426521fa314SDavid van Moolenbroek 
427521fa314SDavid van Moolenbroek 	case NWIOSTCPOPT:
428521fa314SDavid van Moolenbroek 	case NWIOGTCPOPT:
429521fa314SDavid van Moolenbroek 		if ((nwto = (nwio_tcpopt_t *)ptr) == NULL)
430521fa314SDavid van Moolenbroek 			return dir;
431521fa314SDavid van Moolenbroek 
432521fa314SDavid van Moolenbroek 		put_flags(proc, "nwto_flags", tcpopt_flags,
433521fa314SDavid van Moolenbroek 		    COUNT(tcpopt_flags), "0x%x", nwto->nwto_flags);
434521fa314SDavid van Moolenbroek 		return IF_ALL;
435521fa314SDavid van Moolenbroek 
436521fa314SDavid van Moolenbroek 	case NWIOTCPLISTENQ:
437521fa314SDavid van Moolenbroek 	case NWIOSUDSBLOG:
438521fa314SDavid van Moolenbroek 		if (ptr == NULL)
439521fa314SDavid van Moolenbroek 			return IF_OUT;
440521fa314SDavid van Moolenbroek 
441521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
442521fa314SDavid van Moolenbroek 		return IF_ALL;
443521fa314SDavid van Moolenbroek 
444521fa314SDavid van Moolenbroek 	case NWIOGTCPCOOKIE:
445521fa314SDavid van Moolenbroek 	case NWIOTCPACCEPTTO:
446521fa314SDavid van Moolenbroek 		if ((cookie = (tcp_cookie_t *)ptr) == NULL)
447521fa314SDavid van Moolenbroek 			return dir;
448521fa314SDavid van Moolenbroek 
449521fa314SDavid van Moolenbroek 		put_value(proc, "tc_ref", "%"PRIu32, cookie->tc_ref);
450521fa314SDavid van Moolenbroek 		if (verbose > 0)
451521fa314SDavid van Moolenbroek 			put_buf(proc, "tc_secret", PF_LOCADDR,
452521fa314SDavid van Moolenbroek 			    (vir_bytes)&cookie->tc_secret,
453521fa314SDavid van Moolenbroek 			    sizeof(cookie->tc_secret));
454521fa314SDavid van Moolenbroek 		return (verbose > 0) ? IF_ALL : 0;
455521fa314SDavid van Moolenbroek 
456521fa314SDavid van Moolenbroek 	case NWIOTCPGERROR:
457521fa314SDavid van Moolenbroek 		if (ptr == NULL)
458521fa314SDavid van Moolenbroek 			return IF_IN;
459521fa314SDavid van Moolenbroek 
460521fa314SDavid van Moolenbroek 		i = *(int *)ptr;
461521fa314SDavid van Moolenbroek 		if (!valuesonly && (text = get_error_name(i)) != NULL)
462521fa314SDavid van Moolenbroek 			put_field(proc, NULL, text);
463521fa314SDavid van Moolenbroek 		else
464521fa314SDavid van Moolenbroek 			put_value(proc, NULL, "%d", i);
465521fa314SDavid van Moolenbroek 		return IF_ALL;
466521fa314SDavid van Moolenbroek 
467521fa314SDavid van Moolenbroek 	case NWIOSUDPOPT:
468521fa314SDavid van Moolenbroek 	case NWIOGUDPOPT:
469521fa314SDavid van Moolenbroek 		if ((nwuo = (nwio_udpopt_t *)ptr) == NULL)
470521fa314SDavid van Moolenbroek 			return dir;
471521fa314SDavid van Moolenbroek 
472521fa314SDavid van Moolenbroek 		put_flags(proc, "nwuo_flags", udpopt_flags,
473521fa314SDavid van Moolenbroek 		    COUNT(udpopt_flags), "0x%x", nwuo->nwuo_flags);
474521fa314SDavid van Moolenbroek 
475521fa314SDavid van Moolenbroek 		/* The local address cannot be set, just retrieved. */
476521fa314SDavid van Moolenbroek 		if (req == NWIOGUDPOPT)
477521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwuo_locaddr", nwuo->nwuo_locaddr);
478521fa314SDavid van Moolenbroek 
479521fa314SDavid van Moolenbroek 		if ((nwuo->nwuo_flags & NWUO_LOCPORT_MASK) == NWUO_LP_SET)
480521fa314SDavid van Moolenbroek 			put_port(proc, "nwuo_locport", nwuo->nwuo_locport);
481521fa314SDavid van Moolenbroek 
482521fa314SDavid van Moolenbroek 		if (nwuo->nwuo_flags & NWUO_RA_SET)
483521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwuo_remaddr", nwuo->nwuo_remaddr);
484521fa314SDavid van Moolenbroek 
485521fa314SDavid van Moolenbroek 		if (nwuo->nwuo_flags & NWUO_RP_SET)
486521fa314SDavid van Moolenbroek 			put_port(proc, "nwuo_remport", nwuo->nwuo_remport);
487521fa314SDavid van Moolenbroek 
488521fa314SDavid van Moolenbroek 		return IF_ALL;
489521fa314SDavid van Moolenbroek 
490521fa314SDavid van Moolenbroek 	case NWIOGUDSFADDR:
491521fa314SDavid van Moolenbroek 	case NWIOSUDSTADDR:
492521fa314SDavid van Moolenbroek 	case NWIOSUDSADDR:
493521fa314SDavid van Moolenbroek 	case NWIOGUDSADDR:
494521fa314SDavid van Moolenbroek 	case NWIOGUDSPADDR:
495521fa314SDavid van Moolenbroek 	case NWIOSUDSCONN:
496521fa314SDavid van Moolenbroek 	case NWIOSUDSACCEPT:
497521fa314SDavid van Moolenbroek 		if ((sun = (struct sockaddr_un *)ptr) == NULL)
498521fa314SDavid van Moolenbroek 			return dir;
499521fa314SDavid van Moolenbroek 
500521fa314SDavid van Moolenbroek 		put_family(proc, "sun_family", sun->sun_family);
501521fa314SDavid van Moolenbroek 
502521fa314SDavid van Moolenbroek 		/* This could be extended to a generic sockaddr printer.. */
503521fa314SDavid van Moolenbroek 		if (sun->sun_family == AF_LOCAL) {
504521fa314SDavid van Moolenbroek 			put_buf(proc, "sun_path", PF_LOCADDR | PF_PATH,
505521fa314SDavid van Moolenbroek 			    (vir_bytes)&sun->sun_path, sizeof(sun->sun_path));
506521fa314SDavid van Moolenbroek 			return IF_ALL; /* skipping sun_len, it's unused */
507521fa314SDavid van Moolenbroek 		} else
508521fa314SDavid van Moolenbroek 			return 0;
509521fa314SDavid van Moolenbroek 
510521fa314SDavid van Moolenbroek 	case NWIOSUDSTYPE:
511521fa314SDavid van Moolenbroek 	case NWIOGUDSSOTYPE:
512521fa314SDavid van Moolenbroek 		if (ptr == NULL)
513521fa314SDavid van Moolenbroek 			return dir;
514521fa314SDavid van Moolenbroek 
515521fa314SDavid van Moolenbroek 		put_flags(proc, NULL, sock_type, COUNT(sock_type), "0x%x",
516521fa314SDavid van Moolenbroek 		    *(int *)ptr);
517521fa314SDavid van Moolenbroek 		return IF_ALL;
518521fa314SDavid van Moolenbroek 
519521fa314SDavid van Moolenbroek 	case NWIOSUDSSHUT:
520521fa314SDavid van Moolenbroek 		if (ptr == NULL)
521521fa314SDavid van Moolenbroek 			return IF_OUT;
522521fa314SDavid van Moolenbroek 
523521fa314SDavid van Moolenbroek 		put_shutdown_how(proc, NULL, *(int *)ptr);
524521fa314SDavid van Moolenbroek 		return IF_ALL;
525521fa314SDavid van Moolenbroek 
526521fa314SDavid van Moolenbroek 	case NWIOSUDSPAIR:
527521fa314SDavid van Moolenbroek 		if (ptr == NULL)
528521fa314SDavid van Moolenbroek 			return IF_OUT;
529521fa314SDavid van Moolenbroek 
530521fa314SDavid van Moolenbroek 		put_dev(proc, NULL, *(dev_t *)ptr);
531521fa314SDavid van Moolenbroek 		return IF_ALL;
532521fa314SDavid van Moolenbroek 
533521fa314SDavid van Moolenbroek 	case NWIOSUDSCTRL:
534521fa314SDavid van Moolenbroek 		if (ptr == NULL)
535521fa314SDavid van Moolenbroek 			return IF_OUT;
536521fa314SDavid van Moolenbroek 
537521fa314SDavid van Moolenbroek 		/* FALLTHROUGH */
538521fa314SDavid van Moolenbroek 	case NWIOGUDSCTRL:
539521fa314SDavid van Moolenbroek 		if (ptr == NULL)
540521fa314SDavid van Moolenbroek 			return IF_IN;
541521fa314SDavid van Moolenbroek 
542521fa314SDavid van Moolenbroek 		put_msg_control(proc, (struct msg_control *)ptr);
543521fa314SDavid van Moolenbroek 		return IF_ALL;
544521fa314SDavid van Moolenbroek 
545521fa314SDavid van Moolenbroek 	case NWIOGUDSPEERCRED:
546521fa314SDavid van Moolenbroek 		if (ptr == NULL)
547521fa314SDavid van Moolenbroek 			return IF_IN;
548521fa314SDavid van Moolenbroek 
549521fa314SDavid van Moolenbroek 		put_struct_uucred(proc, NULL, PF_LOCADDR, (vir_bytes)ptr);
550521fa314SDavid van Moolenbroek 		return IF_ALL;
551521fa314SDavid van Moolenbroek 
552521fa314SDavid van Moolenbroek 	case NWIOGUDSSNDBUF:
553521fa314SDavid van Moolenbroek 	case NWIOSUDSSNDBUF:
554521fa314SDavid van Moolenbroek 	case NWIOGUDSRCVBUF:
555521fa314SDavid van Moolenbroek 	case NWIOSUDSRCVBUF:
556521fa314SDavid van Moolenbroek 		if (ptr == NULL)
557521fa314SDavid van Moolenbroek 			return dir;
558521fa314SDavid van Moolenbroek 
559521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%zu", *(size_t *)ptr);
560521fa314SDavid van Moolenbroek 		return IF_ALL;
561521fa314SDavid van Moolenbroek 
562521fa314SDavid van Moolenbroek 	default:
563521fa314SDavid van Moolenbroek 		return 0;
564521fa314SDavid van Moolenbroek 	}
565521fa314SDavid van Moolenbroek }
566