xref: /minix3/minix/usr.bin/trace/ioctl/net.c (revision 27852ebe53d5bf221cf5058cb7e858fa8fa8895e)
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 	in.s_addr = ipaddr;
112521fa314SDavid van Moolenbroek 
113c38dbb97SDavid van Moolenbroek 	put_in_addr(proc, name, in);
114521fa314SDavid van Moolenbroek }
115521fa314SDavid van Moolenbroek 
116521fa314SDavid van Moolenbroek static void
117521fa314SDavid van Moolenbroek put_ipproto(struct trace_proc * proc, const char * name, ipproto_t proto)
118521fa314SDavid van Moolenbroek {
119521fa314SDavid van Moolenbroek 	const char *text = NULL;
120521fa314SDavid van Moolenbroek 
121521fa314SDavid van Moolenbroek 	if (!valuesonly) {
122521fa314SDavid van Moolenbroek 		switch (proto) {
123521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_ICMP);
124521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_TCP);
125521fa314SDavid van Moolenbroek 		TEXT(IPPROTO_UDP);
126521fa314SDavid van Moolenbroek 		}
127521fa314SDavid van Moolenbroek 	}
128521fa314SDavid van Moolenbroek 
129521fa314SDavid van Moolenbroek 	if (text != NULL)
130521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
131521fa314SDavid van Moolenbroek 	else
132521fa314SDavid van Moolenbroek 		put_value(proc, name, "%u", proto);
133521fa314SDavid van Moolenbroek }
134521fa314SDavid van Moolenbroek 
135521fa314SDavid van Moolenbroek static const struct flags tcpconf_flags[] = {
136521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWTC_NOFLAGS),
137521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_EXCL),
138521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_SHARED),
139521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_ACC_MASK, NWTC_COPY),
140521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_UNSET),
141521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_SET),
142521fa314SDavid van Moolenbroek 	FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_SEL),
143521fa314SDavid van Moolenbroek 	FLAG(NWTC_SET_RA),
144521fa314SDavid van Moolenbroek 	FLAG(NWTC_UNSET_RA),
145521fa314SDavid van Moolenbroek 	FLAG(NWTC_SET_RP),
146521fa314SDavid van Moolenbroek 	FLAG(NWTC_UNSET_RP),
147521fa314SDavid van Moolenbroek };
148521fa314SDavid van Moolenbroek 
149521fa314SDavid van Moolenbroek #define put_port(proc, name, port) \
150521fa314SDavid van Moolenbroek 	put_value(proc, name, "%u", ntohs(port))
151521fa314SDavid van Moolenbroek 
152521fa314SDavid van Moolenbroek static const struct flags tcpcl_flags[] = {
153521fa314SDavid van Moolenbroek 	FLAG_ZERO(TCF_DEFAULT),
154521fa314SDavid van Moolenbroek 	FLAG(TCF_ASYNCH),
155521fa314SDavid van Moolenbroek };
156521fa314SDavid van Moolenbroek 
157521fa314SDavid van Moolenbroek static const struct flags tcpopt_flags[] = {
158521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWTO_NOFLAG),
159521fa314SDavid van Moolenbroek 	FLAG(NWTO_SND_URG),
160521fa314SDavid van Moolenbroek 	FLAG(NWTO_SND_NOTURG),
161521fa314SDavid van Moolenbroek 	FLAG(NWTO_RCV_URG),
162521fa314SDavid van Moolenbroek 	FLAG(NWTO_RCV_NOTURG),
163521fa314SDavid van Moolenbroek 	FLAG(NWTO_BSD_URG),
164521fa314SDavid van Moolenbroek 	FLAG(NWTO_NOTBSD_URG),
165521fa314SDavid van Moolenbroek 	FLAG(NWTO_DEL_RST),
166521fa314SDavid van Moolenbroek 	FLAG(NWTO_BULK),
167521fa314SDavid van Moolenbroek 	FLAG(NWTO_NOBULK),
168521fa314SDavid van Moolenbroek };
169521fa314SDavid van Moolenbroek 
170521fa314SDavid van Moolenbroek static const struct flags udpopt_flags[] = {
171521fa314SDavid van Moolenbroek 	FLAG_ZERO(NWUO_NOFLAGS),
172521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_EXCL),
173521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_SHARED),
174521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_ACC_MASK, NWUO_COPY),
175521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_SET),
176521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_SEL),
177521fa314SDavid van Moolenbroek 	FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_ANY),
178521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_LOC),
179521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_LOC),
180521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_BROAD),
181521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_BROAD),
182521fa314SDavid van Moolenbroek 	FLAG(NWUO_RP_SET),
183521fa314SDavid van Moolenbroek 	FLAG(NWUO_RP_ANY),
184521fa314SDavid van Moolenbroek 	FLAG(NWUO_RA_SET),
185521fa314SDavid van Moolenbroek 	FLAG(NWUO_RA_ANY),
186521fa314SDavid van Moolenbroek 	FLAG(NWUO_RWDATONLY),
187521fa314SDavid van Moolenbroek 	FLAG(NWUO_RWDATALL),
188521fa314SDavid van Moolenbroek 	FLAG(NWUO_EN_IPOPT),
189521fa314SDavid van Moolenbroek 	FLAG(NWUO_DI_IPOPT),
190521fa314SDavid van Moolenbroek };
191521fa314SDavid van Moolenbroek 
192521fa314SDavid van Moolenbroek static void
193*27852ebeSDavid van Moolenbroek put_struct_uucred(struct trace_proc * proc, const char * name, int flags,
194*27852ebeSDavid van Moolenbroek 	vir_bytes addr)
195*27852ebeSDavid van Moolenbroek {
196*27852ebeSDavid van Moolenbroek 	struct uucred cred;
197*27852ebeSDavid van Moolenbroek 
198*27852ebeSDavid van Moolenbroek 	if (!put_open_struct(proc, name, flags, addr, &cred, sizeof(cred)))
199*27852ebeSDavid van Moolenbroek 		return;
200*27852ebeSDavid van Moolenbroek 
201*27852ebeSDavid van Moolenbroek 	put_value(proc, "cr_uid", "%u", cred.cr_uid);
202*27852ebeSDavid van Moolenbroek 	if (verbose > 0) {
203*27852ebeSDavid van Moolenbroek 		put_value(proc, "cr_gid", "%u", cred.cr_gid);
204*27852ebeSDavid van Moolenbroek 		if (verbose > 1)
205*27852ebeSDavid van Moolenbroek 			put_value(proc, "cr_ngroups", "%d", cred.cr_ngroups);
206*27852ebeSDavid van Moolenbroek 		put_groups(proc, "cr_groups", PF_LOCADDR,
207*27852ebeSDavid van Moolenbroek 		    (vir_bytes)&cred.cr_groups, cred.cr_ngroups);
208*27852ebeSDavid van Moolenbroek 	}
209*27852ebeSDavid van Moolenbroek 
210*27852ebeSDavid van Moolenbroek 	put_close_struct(proc, verbose > 0);
211*27852ebeSDavid van Moolenbroek }
212*27852ebeSDavid van Moolenbroek 
213*27852ebeSDavid van Moolenbroek static void
214521fa314SDavid van Moolenbroek put_msg_control(struct trace_proc * proc, struct msg_control * ptr)
215521fa314SDavid van Moolenbroek {
216521fa314SDavid van Moolenbroek 	struct msghdr msg;
217521fa314SDavid van Moolenbroek 	struct cmsghdr *cmsg;
218521fa314SDavid van Moolenbroek 	size_t len;
219b58e161cSDavid van Moolenbroek 	unsigned int i;
220521fa314SDavid van Moolenbroek 
221521fa314SDavid van Moolenbroek 	if (ptr->msg_controllen > sizeof(ptr->msg_control)) {
222521fa314SDavid van Moolenbroek 		put_field(proc, NULL, "..");
223521fa314SDavid van Moolenbroek 
224521fa314SDavid van Moolenbroek 		return;
225521fa314SDavid van Moolenbroek 	}
226521fa314SDavid van Moolenbroek 
227521fa314SDavid van Moolenbroek 	put_open(proc, NULL, PF_NONAME, "[", ", ");
228521fa314SDavid van Moolenbroek 
229521fa314SDavid van Moolenbroek 	memset(&msg, 0, sizeof(msg));
230521fa314SDavid van Moolenbroek 	msg.msg_control = ptr->msg_control;
231521fa314SDavid van Moolenbroek 	msg.msg_controllen = ptr->msg_controllen;
232521fa314SDavid van Moolenbroek 
233521fa314SDavid van Moolenbroek 	/*
234521fa314SDavid van Moolenbroek 	 * TODO: decide if we need a verbosity-based limit here.  The argument
235521fa314SDavid van Moolenbroek 	 * in favor of printing everything is that upon receipt, SCM_RIGHTS
236521fa314SDavid van Moolenbroek 	 * actually creates new file descriptors, which is pretty essential in
237521fa314SDavid van Moolenbroek 	 * terms of figuring out what is happening in a process.  In addition,
238521fa314SDavid van Moolenbroek 	 * these calls should be sufficiently rare that the lengthy output is
239521fa314SDavid van Moolenbroek 	 * not really disruptive for the general output flow.
240521fa314SDavid van Moolenbroek 	 */
241521fa314SDavid van Moolenbroek 	for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
242521fa314SDavid van Moolenbroek 	    cmsg = CMSG_NXTHDR(&msg, cmsg)) {
243521fa314SDavid van Moolenbroek 		put_open(proc, NULL, 0, "{", ", ");
244521fa314SDavid van Moolenbroek 
245521fa314SDavid van Moolenbroek 		if (verbose > 0)
246521fa314SDavid van Moolenbroek 			put_value(proc, "cmsg_len", "%u", cmsg->cmsg_len);
247521fa314SDavid van Moolenbroek 		if (!valuesonly && cmsg->cmsg_level == SOL_SOCKET)
248521fa314SDavid van Moolenbroek 			put_field(proc, "cmsg_level", "SOL_SOCKET");
249521fa314SDavid van Moolenbroek 		else
250521fa314SDavid van Moolenbroek 			put_value(proc, "cmsg_level", "%d", cmsg->cmsg_level);
251521fa314SDavid van Moolenbroek 		if (cmsg->cmsg_level == SOL_SOCKET)
252521fa314SDavid van Moolenbroek 			put_cmsg_type(proc, "cmsg_type", cmsg->cmsg_type);
253521fa314SDavid van Moolenbroek 
254521fa314SDavid van Moolenbroek 		len = cmsg->cmsg_len - CMSG_LEN(0);
255521fa314SDavid van Moolenbroek 
256521fa314SDavid van Moolenbroek 		/* Print the contents of the messages that we know. */
257521fa314SDavid van Moolenbroek 		if (cmsg->cmsg_level == SOL_SOCKET &&
258521fa314SDavid van Moolenbroek 		    cmsg->cmsg_type == SCM_RIGHTS) {
259521fa314SDavid van Moolenbroek 			put_open(proc, NULL, PF_NONAME, "[", ", ");
260521fa314SDavid van Moolenbroek 			for (i = 0; i < len / sizeof(int); i++)
261521fa314SDavid van Moolenbroek 				put_fd(proc, NULL,
262521fa314SDavid van Moolenbroek 				    ((int *)CMSG_DATA(cmsg))[i]);
263521fa314SDavid van Moolenbroek 			put_close(proc, "]");
264521fa314SDavid van Moolenbroek 		} else if (cmsg->cmsg_level == SOL_SOCKET &&
265521fa314SDavid van Moolenbroek 		    cmsg->cmsg_type == SCM_CREDS) {
266521fa314SDavid van Moolenbroek 			put_struct_uucred(proc, NULL, PF_LOCADDR,
267521fa314SDavid van Moolenbroek 			    (vir_bytes)CMSG_DATA(cmsg));
268521fa314SDavid van Moolenbroek 		} else if (len > 0)
269521fa314SDavid van Moolenbroek 			put_field(proc, NULL, "..");
270521fa314SDavid van Moolenbroek 
271521fa314SDavid van Moolenbroek 		put_close(proc, "}");
272521fa314SDavid van Moolenbroek 	}
273521fa314SDavid van Moolenbroek 
274521fa314SDavid van Moolenbroek 	put_close(proc, "]");
275521fa314SDavid van Moolenbroek }
276521fa314SDavid van Moolenbroek 
277521fa314SDavid van Moolenbroek int
278521fa314SDavid van Moolenbroek net_ioctl_arg(struct trace_proc * proc, unsigned long req, void * ptr, int dir)
279521fa314SDavid van Moolenbroek {
280521fa314SDavid van Moolenbroek 	const char *text;
281521fa314SDavid van Moolenbroek 	nwio_ipopt_t *ipopt;
282521fa314SDavid van Moolenbroek 	nwio_tcpconf_t *nwtc;
283521fa314SDavid van Moolenbroek 	nwio_tcpcl_t *nwtcl;
284521fa314SDavid van Moolenbroek 	nwio_tcpopt_t *nwto;
285521fa314SDavid van Moolenbroek 	tcp_cookie_t *cookie;
286521fa314SDavid van Moolenbroek 	nwio_udpopt_t *nwuo;
287521fa314SDavid van Moolenbroek 	struct sockaddr_un *sun;
288521fa314SDavid van Moolenbroek 	int i;
289521fa314SDavid van Moolenbroek 
290521fa314SDavid van Moolenbroek 	switch (req) {
291521fa314SDavid van Moolenbroek 	case FIONREAD:
292521fa314SDavid van Moolenbroek 		/*
293521fa314SDavid van Moolenbroek 		 * Arguably this does not belong here, but as of writing, the
294521fa314SDavid van Moolenbroek 		 * network services are the only ones actually implementing
295521fa314SDavid van Moolenbroek 		 * support for this IOCTL, and we don't have a more suitable
296521fa314SDavid van Moolenbroek 		 * place to put it either.
297521fa314SDavid van Moolenbroek 		 */
298521fa314SDavid van Moolenbroek 		if (ptr == NULL)
299521fa314SDavid van Moolenbroek 			return IF_IN;
300521fa314SDavid van Moolenbroek 
301521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
302521fa314SDavid van Moolenbroek 		return IF_ALL;
303521fa314SDavid van Moolenbroek 
304521fa314SDavid van Moolenbroek 	case NWIOSIPOPT:
305521fa314SDavid van Moolenbroek 	case NWIOGIPOPT:
306521fa314SDavid van Moolenbroek 		if ((ipopt = (nwio_ipopt_t *)ptr) == NULL)
307521fa314SDavid van Moolenbroek 			return dir;
308521fa314SDavid van Moolenbroek 
309521fa314SDavid van Moolenbroek 		put_flags(proc, "nwio_flags", ipopt_flags, COUNT(ipopt_flags),
310521fa314SDavid van Moolenbroek 		    "0x%x", ipopt->nwio_flags);
311521fa314SDavid van Moolenbroek 
312521fa314SDavid van Moolenbroek 		if (ipopt->nwio_flags & NWIO_REMSPEC)
313521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwio_rem", ipopt->nwio_rem);
314521fa314SDavid van Moolenbroek 		if (ipopt->nwio_flags & NWIO_PROTOSPEC)
315521fa314SDavid van Moolenbroek 			put_ipproto(proc, "nwio_proto", ipopt->nwio_proto);
316521fa314SDavid van Moolenbroek 
317521fa314SDavid van Moolenbroek 		return 0; /* TODO: the remaining fields */
318521fa314SDavid van Moolenbroek 
319521fa314SDavid van Moolenbroek 	case NWIOSTCPCONF:
320521fa314SDavid van Moolenbroek 	case NWIOGTCPCONF:
321521fa314SDavid van Moolenbroek 		if ((nwtc = (nwio_tcpconf_t *)ptr) == NULL)
322521fa314SDavid van Moolenbroek 			return dir;
323521fa314SDavid van Moolenbroek 
324521fa314SDavid van Moolenbroek 		put_flags(proc, "nwtc_flags", tcpconf_flags,
325521fa314SDavid van Moolenbroek 		    COUNT(tcpconf_flags), "0x%x", nwtc->nwtc_flags);
326521fa314SDavid van Moolenbroek 
327521fa314SDavid van Moolenbroek 		/* The local address cannot be set, just retrieved. */
328521fa314SDavid van Moolenbroek 		if (req == NWIOGTCPCONF)
329521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwtc_locaddr", nwtc->nwtc_locaddr);
330521fa314SDavid van Moolenbroek 
331521fa314SDavid van Moolenbroek 		if ((nwtc->nwtc_flags & NWTC_LOCPORT_MASK) == NWTC_LP_SET)
332521fa314SDavid van Moolenbroek 			put_port(proc, "nwtc_locport", nwtc->nwtc_locport);
333521fa314SDavid van Moolenbroek 
334521fa314SDavid van Moolenbroek 		if (nwtc->nwtc_flags & NWTC_SET_RA)
335521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwtc_remaddr", nwtc->nwtc_remaddr);
336521fa314SDavid van Moolenbroek 
337521fa314SDavid van Moolenbroek 		if (nwtc->nwtc_flags & NWTC_SET_RP)
338521fa314SDavid van Moolenbroek 			put_port(proc, "nwtc_remport", nwtc->nwtc_remport);
339521fa314SDavid van Moolenbroek 
340521fa314SDavid van Moolenbroek 		return IF_ALL;
341521fa314SDavid van Moolenbroek 
342521fa314SDavid van Moolenbroek 	case NWIOTCPCONN:
343521fa314SDavid van Moolenbroek 	case NWIOTCPLISTEN:
344521fa314SDavid van Moolenbroek 		if ((nwtcl = (nwio_tcpcl_t *)ptr) == NULL)
345521fa314SDavid van Moolenbroek 			return dir;
346521fa314SDavid van Moolenbroek 
347521fa314SDavid van Moolenbroek 		put_flags(proc, "nwtcl_flags", tcpcl_flags,
348521fa314SDavid van Moolenbroek 		    COUNT(tcpcl_flags), "0x%x", nwtcl->nwtcl_flags);
349521fa314SDavid van Moolenbroek 
350521fa314SDavid van Moolenbroek 		/* We pretend the unused nwtcl_ttl field does not exist. */
351521fa314SDavid van Moolenbroek 		return IF_ALL;
352521fa314SDavid van Moolenbroek 
353521fa314SDavid van Moolenbroek 	case NWIOSTCPOPT:
354521fa314SDavid van Moolenbroek 	case NWIOGTCPOPT:
355521fa314SDavid van Moolenbroek 		if ((nwto = (nwio_tcpopt_t *)ptr) == NULL)
356521fa314SDavid van Moolenbroek 			return dir;
357521fa314SDavid van Moolenbroek 
358521fa314SDavid van Moolenbroek 		put_flags(proc, "nwto_flags", tcpopt_flags,
359521fa314SDavid van Moolenbroek 		    COUNT(tcpopt_flags), "0x%x", nwto->nwto_flags);
360521fa314SDavid van Moolenbroek 		return IF_ALL;
361521fa314SDavid van Moolenbroek 
362521fa314SDavid van Moolenbroek 	case NWIOTCPLISTENQ:
363521fa314SDavid van Moolenbroek 	case NWIOSUDSBLOG:
364521fa314SDavid van Moolenbroek 		if (ptr == NULL)
365521fa314SDavid van Moolenbroek 			return IF_OUT;
366521fa314SDavid van Moolenbroek 
367521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
368521fa314SDavid van Moolenbroek 		return IF_ALL;
369521fa314SDavid van Moolenbroek 
370521fa314SDavid van Moolenbroek 	case NWIOGTCPCOOKIE:
371521fa314SDavid van Moolenbroek 	case NWIOTCPACCEPTTO:
372521fa314SDavid van Moolenbroek 		if ((cookie = (tcp_cookie_t *)ptr) == NULL)
373521fa314SDavid van Moolenbroek 			return dir;
374521fa314SDavid van Moolenbroek 
375521fa314SDavid van Moolenbroek 		put_value(proc, "tc_ref", "%"PRIu32, cookie->tc_ref);
376521fa314SDavid van Moolenbroek 		if (verbose > 0)
377521fa314SDavid van Moolenbroek 			put_buf(proc, "tc_secret", PF_LOCADDR,
378521fa314SDavid van Moolenbroek 			    (vir_bytes)&cookie->tc_secret,
379521fa314SDavid van Moolenbroek 			    sizeof(cookie->tc_secret));
380521fa314SDavid van Moolenbroek 		return (verbose > 0) ? IF_ALL : 0;
381521fa314SDavid van Moolenbroek 
382521fa314SDavid van Moolenbroek 	case NWIOTCPGERROR:
383521fa314SDavid van Moolenbroek 		if (ptr == NULL)
384521fa314SDavid van Moolenbroek 			return IF_IN;
385521fa314SDavid van Moolenbroek 
386521fa314SDavid van Moolenbroek 		i = *(int *)ptr;
387521fa314SDavid van Moolenbroek 		if (!valuesonly && (text = get_error_name(i)) != NULL)
388521fa314SDavid van Moolenbroek 			put_field(proc, NULL, text);
389521fa314SDavid van Moolenbroek 		else
390521fa314SDavid van Moolenbroek 			put_value(proc, NULL, "%d", i);
391521fa314SDavid van Moolenbroek 		return IF_ALL;
392521fa314SDavid van Moolenbroek 
393521fa314SDavid van Moolenbroek 	case NWIOSUDPOPT:
394521fa314SDavid van Moolenbroek 	case NWIOGUDPOPT:
395521fa314SDavid van Moolenbroek 		if ((nwuo = (nwio_udpopt_t *)ptr) == NULL)
396521fa314SDavid van Moolenbroek 			return dir;
397521fa314SDavid van Moolenbroek 
398521fa314SDavid van Moolenbroek 		put_flags(proc, "nwuo_flags", udpopt_flags,
399521fa314SDavid van Moolenbroek 		    COUNT(udpopt_flags), "0x%x", nwuo->nwuo_flags);
400521fa314SDavid van Moolenbroek 
401521fa314SDavid van Moolenbroek 		/* The local address cannot be set, just retrieved. */
402521fa314SDavid van Moolenbroek 		if (req == NWIOGUDPOPT)
403521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwuo_locaddr", nwuo->nwuo_locaddr);
404521fa314SDavid van Moolenbroek 
405521fa314SDavid van Moolenbroek 		if ((nwuo->nwuo_flags & NWUO_LOCPORT_MASK) == NWUO_LP_SET)
406521fa314SDavid van Moolenbroek 			put_port(proc, "nwuo_locport", nwuo->nwuo_locport);
407521fa314SDavid van Moolenbroek 
408521fa314SDavid van Moolenbroek 		if (nwuo->nwuo_flags & NWUO_RA_SET)
409521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwuo_remaddr", nwuo->nwuo_remaddr);
410521fa314SDavid van Moolenbroek 
411521fa314SDavid van Moolenbroek 		if (nwuo->nwuo_flags & NWUO_RP_SET)
412521fa314SDavid van Moolenbroek 			put_port(proc, "nwuo_remport", nwuo->nwuo_remport);
413521fa314SDavid van Moolenbroek 
414521fa314SDavid van Moolenbroek 		return IF_ALL;
415521fa314SDavid van Moolenbroek 
416521fa314SDavid van Moolenbroek 	case NWIOGUDSFADDR:
417521fa314SDavid van Moolenbroek 	case NWIOSUDSTADDR:
418521fa314SDavid van Moolenbroek 	case NWIOSUDSADDR:
419521fa314SDavid van Moolenbroek 	case NWIOGUDSADDR:
420521fa314SDavid van Moolenbroek 	case NWIOGUDSPADDR:
421521fa314SDavid van Moolenbroek 	case NWIOSUDSCONN:
422521fa314SDavid van Moolenbroek 	case NWIOSUDSACCEPT:
423521fa314SDavid van Moolenbroek 		if ((sun = (struct sockaddr_un *)ptr) == NULL)
424521fa314SDavid van Moolenbroek 			return dir;
425521fa314SDavid van Moolenbroek 
426c38dbb97SDavid van Moolenbroek 		put_socket_family(proc, "sun_family", sun->sun_family);
427521fa314SDavid van Moolenbroek 
428521fa314SDavid van Moolenbroek 		/* This could be extended to a generic sockaddr printer.. */
429521fa314SDavid van Moolenbroek 		if (sun->sun_family == AF_LOCAL) {
430521fa314SDavid van Moolenbroek 			put_buf(proc, "sun_path", PF_LOCADDR | PF_PATH,
431521fa314SDavid van Moolenbroek 			    (vir_bytes)&sun->sun_path, sizeof(sun->sun_path));
432521fa314SDavid van Moolenbroek 			return IF_ALL; /* skipping sun_len, it's unused */
433521fa314SDavid van Moolenbroek 		} else
434521fa314SDavid van Moolenbroek 			return 0;
435521fa314SDavid van Moolenbroek 
436521fa314SDavid van Moolenbroek 	case NWIOSUDSTYPE:
437521fa314SDavid van Moolenbroek 	case NWIOGUDSSOTYPE:
438521fa314SDavid van Moolenbroek 		if (ptr == NULL)
439521fa314SDavid van Moolenbroek 			return dir;
440521fa314SDavid van Moolenbroek 
441c38dbb97SDavid van Moolenbroek 		put_socket_type(proc, NULL, *(int *)ptr);
442521fa314SDavid van Moolenbroek 		return IF_ALL;
443521fa314SDavid van Moolenbroek 
444521fa314SDavid van Moolenbroek 	case NWIOSUDSSHUT:
445521fa314SDavid van Moolenbroek 		if (ptr == NULL)
446521fa314SDavid van Moolenbroek 			return IF_OUT;
447521fa314SDavid van Moolenbroek 
448521fa314SDavid van Moolenbroek 		put_shutdown_how(proc, NULL, *(int *)ptr);
449521fa314SDavid van Moolenbroek 		return IF_ALL;
450521fa314SDavid van Moolenbroek 
451521fa314SDavid van Moolenbroek 	case NWIOSUDSPAIR:
452521fa314SDavid van Moolenbroek 		if (ptr == NULL)
453521fa314SDavid van Moolenbroek 			return IF_OUT;
454521fa314SDavid van Moolenbroek 
455521fa314SDavid van Moolenbroek 		put_dev(proc, NULL, *(dev_t *)ptr);
456521fa314SDavid van Moolenbroek 		return IF_ALL;
457521fa314SDavid van Moolenbroek 
458521fa314SDavid van Moolenbroek 	case NWIOSUDSCTRL:
459521fa314SDavid van Moolenbroek 		if (ptr == NULL)
460521fa314SDavid van Moolenbroek 			return IF_OUT;
461521fa314SDavid van Moolenbroek 
462521fa314SDavid van Moolenbroek 		/* FALLTHROUGH */
463521fa314SDavid van Moolenbroek 	case NWIOGUDSCTRL:
464521fa314SDavid van Moolenbroek 		if (ptr == NULL)
465521fa314SDavid van Moolenbroek 			return IF_IN;
466521fa314SDavid van Moolenbroek 
467521fa314SDavid van Moolenbroek 		put_msg_control(proc, (struct msg_control *)ptr);
468521fa314SDavid van Moolenbroek 		return IF_ALL;
469521fa314SDavid van Moolenbroek 
470521fa314SDavid van Moolenbroek 	case NWIOGUDSPEERCRED:
471521fa314SDavid van Moolenbroek 		if (ptr == NULL)
472521fa314SDavid van Moolenbroek 			return IF_IN;
473521fa314SDavid van Moolenbroek 
474521fa314SDavid van Moolenbroek 		put_struct_uucred(proc, NULL, PF_LOCADDR, (vir_bytes)ptr);
475521fa314SDavid van Moolenbroek 		return IF_ALL;
476521fa314SDavid van Moolenbroek 
477521fa314SDavid van Moolenbroek 	case NWIOGUDSSNDBUF:
478521fa314SDavid van Moolenbroek 	case NWIOSUDSSNDBUF:
479521fa314SDavid van Moolenbroek 	case NWIOGUDSRCVBUF:
480521fa314SDavid van Moolenbroek 	case NWIOSUDSRCVBUF:
481521fa314SDavid van Moolenbroek 		if (ptr == NULL)
482521fa314SDavid van Moolenbroek 			return dir;
483521fa314SDavid van Moolenbroek 
484521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%zu", *(size_t *)ptr);
485521fa314SDavid van Moolenbroek 		return IF_ALL;
486521fa314SDavid van Moolenbroek 
487521fa314SDavid van Moolenbroek 	default:
488521fa314SDavid van Moolenbroek 		return 0;
489521fa314SDavid van Moolenbroek 	}
490521fa314SDavid van Moolenbroek }
491