xref: /minix3/minix/usr.bin/trace/ioctl/net.c (revision c38dbb97aaadcc2cdb083dcee9aaa15eee55e1fd)
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 
113*c38dbb97SDavid 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
193521fa314SDavid van Moolenbroek put_msg_control(struct trace_proc * proc, struct msg_control * ptr)
194521fa314SDavid van Moolenbroek {
195521fa314SDavid van Moolenbroek 	struct msghdr msg;
196521fa314SDavid van Moolenbroek 	struct cmsghdr *cmsg;
197521fa314SDavid van Moolenbroek 	size_t len;
198b58e161cSDavid van Moolenbroek 	unsigned int i;
199521fa314SDavid van Moolenbroek 
200521fa314SDavid van Moolenbroek 	if (ptr->msg_controllen > sizeof(ptr->msg_control)) {
201521fa314SDavid van Moolenbroek 		put_field(proc, NULL, "..");
202521fa314SDavid van Moolenbroek 
203521fa314SDavid van Moolenbroek 		return;
204521fa314SDavid van Moolenbroek 	}
205521fa314SDavid van Moolenbroek 
206521fa314SDavid van Moolenbroek 	put_open(proc, NULL, PF_NONAME, "[", ", ");
207521fa314SDavid van Moolenbroek 
208521fa314SDavid van Moolenbroek 	memset(&msg, 0, sizeof(msg));
209521fa314SDavid van Moolenbroek 	msg.msg_control = ptr->msg_control;
210521fa314SDavid van Moolenbroek 	msg.msg_controllen = ptr->msg_controllen;
211521fa314SDavid van Moolenbroek 
212521fa314SDavid van Moolenbroek 	/*
213521fa314SDavid van Moolenbroek 	 * TODO: decide if we need a verbosity-based limit here.  The argument
214521fa314SDavid van Moolenbroek 	 * in favor of printing everything is that upon receipt, SCM_RIGHTS
215521fa314SDavid van Moolenbroek 	 * actually creates new file descriptors, which is pretty essential in
216521fa314SDavid van Moolenbroek 	 * terms of figuring out what is happening in a process.  In addition,
217521fa314SDavid van Moolenbroek 	 * these calls should be sufficiently rare that the lengthy output is
218521fa314SDavid van Moolenbroek 	 * not really disruptive for the general output flow.
219521fa314SDavid van Moolenbroek 	 */
220521fa314SDavid van Moolenbroek 	for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
221521fa314SDavid van Moolenbroek 	    cmsg = CMSG_NXTHDR(&msg, cmsg)) {
222521fa314SDavid van Moolenbroek 		put_open(proc, NULL, 0, "{", ", ");
223521fa314SDavid van Moolenbroek 
224521fa314SDavid van Moolenbroek 		if (verbose > 0)
225521fa314SDavid van Moolenbroek 			put_value(proc, "cmsg_len", "%u", cmsg->cmsg_len);
226521fa314SDavid van Moolenbroek 		if (!valuesonly && cmsg->cmsg_level == SOL_SOCKET)
227521fa314SDavid van Moolenbroek 			put_field(proc, "cmsg_level", "SOL_SOCKET");
228521fa314SDavid van Moolenbroek 		else
229521fa314SDavid van Moolenbroek 			put_value(proc, "cmsg_level", "%d", cmsg->cmsg_level);
230521fa314SDavid van Moolenbroek 		if (cmsg->cmsg_level == SOL_SOCKET)
231521fa314SDavid van Moolenbroek 			put_cmsg_type(proc, "cmsg_type", cmsg->cmsg_type);
232521fa314SDavid van Moolenbroek 
233521fa314SDavid van Moolenbroek 		len = cmsg->cmsg_len - CMSG_LEN(0);
234521fa314SDavid van Moolenbroek 
235521fa314SDavid van Moolenbroek 		/* Print the contents of the messages that we know. */
236521fa314SDavid van Moolenbroek 		if (cmsg->cmsg_level == SOL_SOCKET &&
237521fa314SDavid van Moolenbroek 		    cmsg->cmsg_type == SCM_RIGHTS) {
238521fa314SDavid van Moolenbroek 			put_open(proc, NULL, PF_NONAME, "[", ", ");
239521fa314SDavid van Moolenbroek 			for (i = 0; i < len / sizeof(int); i++)
240521fa314SDavid van Moolenbroek 				put_fd(proc, NULL,
241521fa314SDavid van Moolenbroek 				    ((int *)CMSG_DATA(cmsg))[i]);
242521fa314SDavid van Moolenbroek 			put_close(proc, "]");
243521fa314SDavid van Moolenbroek 		} else if (cmsg->cmsg_level == SOL_SOCKET &&
244521fa314SDavid van Moolenbroek 		    cmsg->cmsg_type == SCM_CREDS) {
245521fa314SDavid van Moolenbroek 			put_struct_uucred(proc, NULL, PF_LOCADDR,
246521fa314SDavid van Moolenbroek 			    (vir_bytes)CMSG_DATA(cmsg));
247521fa314SDavid van Moolenbroek 		} else if (len > 0)
248521fa314SDavid van Moolenbroek 			put_field(proc, NULL, "..");
249521fa314SDavid van Moolenbroek 
250521fa314SDavid van Moolenbroek 		put_close(proc, "}");
251521fa314SDavid van Moolenbroek 	}
252521fa314SDavid van Moolenbroek 
253521fa314SDavid van Moolenbroek 	put_close(proc, "]");
254521fa314SDavid van Moolenbroek }
255521fa314SDavid van Moolenbroek 
256521fa314SDavid van Moolenbroek int
257521fa314SDavid van Moolenbroek net_ioctl_arg(struct trace_proc * proc, unsigned long req, void * ptr, int dir)
258521fa314SDavid van Moolenbroek {
259521fa314SDavid van Moolenbroek 	const char *text;
260521fa314SDavid van Moolenbroek 	nwio_ipopt_t *ipopt;
261521fa314SDavid van Moolenbroek 	nwio_tcpconf_t *nwtc;
262521fa314SDavid van Moolenbroek 	nwio_tcpcl_t *nwtcl;
263521fa314SDavid van Moolenbroek 	nwio_tcpopt_t *nwto;
264521fa314SDavid van Moolenbroek 	tcp_cookie_t *cookie;
265521fa314SDavid van Moolenbroek 	nwio_udpopt_t *nwuo;
266521fa314SDavid van Moolenbroek 	struct sockaddr_un *sun;
267521fa314SDavid van Moolenbroek 	int i;
268521fa314SDavid van Moolenbroek 
269521fa314SDavid van Moolenbroek 	switch (req) {
270521fa314SDavid van Moolenbroek 	case FIONREAD:
271521fa314SDavid van Moolenbroek 		/*
272521fa314SDavid van Moolenbroek 		 * Arguably this does not belong here, but as of writing, the
273521fa314SDavid van Moolenbroek 		 * network services are the only ones actually implementing
274521fa314SDavid van Moolenbroek 		 * support for this IOCTL, and we don't have a more suitable
275521fa314SDavid van Moolenbroek 		 * place to put it either.
276521fa314SDavid van Moolenbroek 		 */
277521fa314SDavid van Moolenbroek 		if (ptr == NULL)
278521fa314SDavid van Moolenbroek 			return IF_IN;
279521fa314SDavid van Moolenbroek 
280521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
281521fa314SDavid van Moolenbroek 		return IF_ALL;
282521fa314SDavid van Moolenbroek 
283521fa314SDavid van Moolenbroek 	case NWIOSIPOPT:
284521fa314SDavid van Moolenbroek 	case NWIOGIPOPT:
285521fa314SDavid van Moolenbroek 		if ((ipopt = (nwio_ipopt_t *)ptr) == NULL)
286521fa314SDavid van Moolenbroek 			return dir;
287521fa314SDavid van Moolenbroek 
288521fa314SDavid van Moolenbroek 		put_flags(proc, "nwio_flags", ipopt_flags, COUNT(ipopt_flags),
289521fa314SDavid van Moolenbroek 		    "0x%x", ipopt->nwio_flags);
290521fa314SDavid van Moolenbroek 
291521fa314SDavid van Moolenbroek 		if (ipopt->nwio_flags & NWIO_REMSPEC)
292521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwio_rem", ipopt->nwio_rem);
293521fa314SDavid van Moolenbroek 		if (ipopt->nwio_flags & NWIO_PROTOSPEC)
294521fa314SDavid van Moolenbroek 			put_ipproto(proc, "nwio_proto", ipopt->nwio_proto);
295521fa314SDavid van Moolenbroek 
296521fa314SDavid van Moolenbroek 		return 0; /* TODO: the remaining fields */
297521fa314SDavid van Moolenbroek 
298521fa314SDavid van Moolenbroek 	case NWIOSTCPCONF:
299521fa314SDavid van Moolenbroek 	case NWIOGTCPCONF:
300521fa314SDavid van Moolenbroek 		if ((nwtc = (nwio_tcpconf_t *)ptr) == NULL)
301521fa314SDavid van Moolenbroek 			return dir;
302521fa314SDavid van Moolenbroek 
303521fa314SDavid van Moolenbroek 		put_flags(proc, "nwtc_flags", tcpconf_flags,
304521fa314SDavid van Moolenbroek 		    COUNT(tcpconf_flags), "0x%x", nwtc->nwtc_flags);
305521fa314SDavid van Moolenbroek 
306521fa314SDavid van Moolenbroek 		/* The local address cannot be set, just retrieved. */
307521fa314SDavid van Moolenbroek 		if (req == NWIOGTCPCONF)
308521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwtc_locaddr", nwtc->nwtc_locaddr);
309521fa314SDavid van Moolenbroek 
310521fa314SDavid van Moolenbroek 		if ((nwtc->nwtc_flags & NWTC_LOCPORT_MASK) == NWTC_LP_SET)
311521fa314SDavid van Moolenbroek 			put_port(proc, "nwtc_locport", nwtc->nwtc_locport);
312521fa314SDavid van Moolenbroek 
313521fa314SDavid van Moolenbroek 		if (nwtc->nwtc_flags & NWTC_SET_RA)
314521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwtc_remaddr", nwtc->nwtc_remaddr);
315521fa314SDavid van Moolenbroek 
316521fa314SDavid van Moolenbroek 		if (nwtc->nwtc_flags & NWTC_SET_RP)
317521fa314SDavid van Moolenbroek 			put_port(proc, "nwtc_remport", nwtc->nwtc_remport);
318521fa314SDavid van Moolenbroek 
319521fa314SDavid van Moolenbroek 		return IF_ALL;
320521fa314SDavid van Moolenbroek 
321521fa314SDavid van Moolenbroek 	case NWIOTCPCONN:
322521fa314SDavid van Moolenbroek 	case NWIOTCPLISTEN:
323521fa314SDavid van Moolenbroek 		if ((nwtcl = (nwio_tcpcl_t *)ptr) == NULL)
324521fa314SDavid van Moolenbroek 			return dir;
325521fa314SDavid van Moolenbroek 
326521fa314SDavid van Moolenbroek 		put_flags(proc, "nwtcl_flags", tcpcl_flags,
327521fa314SDavid van Moolenbroek 		    COUNT(tcpcl_flags), "0x%x", nwtcl->nwtcl_flags);
328521fa314SDavid van Moolenbroek 
329521fa314SDavid van Moolenbroek 		/* We pretend the unused nwtcl_ttl field does not exist. */
330521fa314SDavid van Moolenbroek 		return IF_ALL;
331521fa314SDavid van Moolenbroek 
332521fa314SDavid van Moolenbroek 	case NWIOSTCPOPT:
333521fa314SDavid van Moolenbroek 	case NWIOGTCPOPT:
334521fa314SDavid van Moolenbroek 		if ((nwto = (nwio_tcpopt_t *)ptr) == NULL)
335521fa314SDavid van Moolenbroek 			return dir;
336521fa314SDavid van Moolenbroek 
337521fa314SDavid van Moolenbroek 		put_flags(proc, "nwto_flags", tcpopt_flags,
338521fa314SDavid van Moolenbroek 		    COUNT(tcpopt_flags), "0x%x", nwto->nwto_flags);
339521fa314SDavid van Moolenbroek 		return IF_ALL;
340521fa314SDavid van Moolenbroek 
341521fa314SDavid van Moolenbroek 	case NWIOTCPLISTENQ:
342521fa314SDavid van Moolenbroek 	case NWIOSUDSBLOG:
343521fa314SDavid van Moolenbroek 		if (ptr == NULL)
344521fa314SDavid van Moolenbroek 			return IF_OUT;
345521fa314SDavid van Moolenbroek 
346521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
347521fa314SDavid van Moolenbroek 		return IF_ALL;
348521fa314SDavid van Moolenbroek 
349521fa314SDavid van Moolenbroek 	case NWIOGTCPCOOKIE:
350521fa314SDavid van Moolenbroek 	case NWIOTCPACCEPTTO:
351521fa314SDavid van Moolenbroek 		if ((cookie = (tcp_cookie_t *)ptr) == NULL)
352521fa314SDavid van Moolenbroek 			return dir;
353521fa314SDavid van Moolenbroek 
354521fa314SDavid van Moolenbroek 		put_value(proc, "tc_ref", "%"PRIu32, cookie->tc_ref);
355521fa314SDavid van Moolenbroek 		if (verbose > 0)
356521fa314SDavid van Moolenbroek 			put_buf(proc, "tc_secret", PF_LOCADDR,
357521fa314SDavid van Moolenbroek 			    (vir_bytes)&cookie->tc_secret,
358521fa314SDavid van Moolenbroek 			    sizeof(cookie->tc_secret));
359521fa314SDavid van Moolenbroek 		return (verbose > 0) ? IF_ALL : 0;
360521fa314SDavid van Moolenbroek 
361521fa314SDavid van Moolenbroek 	case NWIOTCPGERROR:
362521fa314SDavid van Moolenbroek 		if (ptr == NULL)
363521fa314SDavid van Moolenbroek 			return IF_IN;
364521fa314SDavid van Moolenbroek 
365521fa314SDavid van Moolenbroek 		i = *(int *)ptr;
366521fa314SDavid van Moolenbroek 		if (!valuesonly && (text = get_error_name(i)) != NULL)
367521fa314SDavid van Moolenbroek 			put_field(proc, NULL, text);
368521fa314SDavid van Moolenbroek 		else
369521fa314SDavid van Moolenbroek 			put_value(proc, NULL, "%d", i);
370521fa314SDavid van Moolenbroek 		return IF_ALL;
371521fa314SDavid van Moolenbroek 
372521fa314SDavid van Moolenbroek 	case NWIOSUDPOPT:
373521fa314SDavid van Moolenbroek 	case NWIOGUDPOPT:
374521fa314SDavid van Moolenbroek 		if ((nwuo = (nwio_udpopt_t *)ptr) == NULL)
375521fa314SDavid van Moolenbroek 			return dir;
376521fa314SDavid van Moolenbroek 
377521fa314SDavid van Moolenbroek 		put_flags(proc, "nwuo_flags", udpopt_flags,
378521fa314SDavid van Moolenbroek 		    COUNT(udpopt_flags), "0x%x", nwuo->nwuo_flags);
379521fa314SDavid van Moolenbroek 
380521fa314SDavid van Moolenbroek 		/* The local address cannot be set, just retrieved. */
381521fa314SDavid van Moolenbroek 		if (req == NWIOGUDPOPT)
382521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwuo_locaddr", nwuo->nwuo_locaddr);
383521fa314SDavid van Moolenbroek 
384521fa314SDavid van Moolenbroek 		if ((nwuo->nwuo_flags & NWUO_LOCPORT_MASK) == NWUO_LP_SET)
385521fa314SDavid van Moolenbroek 			put_port(proc, "nwuo_locport", nwuo->nwuo_locport);
386521fa314SDavid van Moolenbroek 
387521fa314SDavid van Moolenbroek 		if (nwuo->nwuo_flags & NWUO_RA_SET)
388521fa314SDavid van Moolenbroek 			put_ipaddr(proc, "nwuo_remaddr", nwuo->nwuo_remaddr);
389521fa314SDavid van Moolenbroek 
390521fa314SDavid van Moolenbroek 		if (nwuo->nwuo_flags & NWUO_RP_SET)
391521fa314SDavid van Moolenbroek 			put_port(proc, "nwuo_remport", nwuo->nwuo_remport);
392521fa314SDavid van Moolenbroek 
393521fa314SDavid van Moolenbroek 		return IF_ALL;
394521fa314SDavid van Moolenbroek 
395521fa314SDavid van Moolenbroek 	case NWIOGUDSFADDR:
396521fa314SDavid van Moolenbroek 	case NWIOSUDSTADDR:
397521fa314SDavid van Moolenbroek 	case NWIOSUDSADDR:
398521fa314SDavid van Moolenbroek 	case NWIOGUDSADDR:
399521fa314SDavid van Moolenbroek 	case NWIOGUDSPADDR:
400521fa314SDavid van Moolenbroek 	case NWIOSUDSCONN:
401521fa314SDavid van Moolenbroek 	case NWIOSUDSACCEPT:
402521fa314SDavid van Moolenbroek 		if ((sun = (struct sockaddr_un *)ptr) == NULL)
403521fa314SDavid van Moolenbroek 			return dir;
404521fa314SDavid van Moolenbroek 
405*c38dbb97SDavid van Moolenbroek 		put_socket_family(proc, "sun_family", sun->sun_family);
406521fa314SDavid van Moolenbroek 
407521fa314SDavid van Moolenbroek 		/* This could be extended to a generic sockaddr printer.. */
408521fa314SDavid van Moolenbroek 		if (sun->sun_family == AF_LOCAL) {
409521fa314SDavid van Moolenbroek 			put_buf(proc, "sun_path", PF_LOCADDR | PF_PATH,
410521fa314SDavid van Moolenbroek 			    (vir_bytes)&sun->sun_path, sizeof(sun->sun_path));
411521fa314SDavid van Moolenbroek 			return IF_ALL; /* skipping sun_len, it's unused */
412521fa314SDavid van Moolenbroek 		} else
413521fa314SDavid van Moolenbroek 			return 0;
414521fa314SDavid van Moolenbroek 
415521fa314SDavid van Moolenbroek 	case NWIOSUDSTYPE:
416521fa314SDavid van Moolenbroek 	case NWIOGUDSSOTYPE:
417521fa314SDavid van Moolenbroek 		if (ptr == NULL)
418521fa314SDavid van Moolenbroek 			return dir;
419521fa314SDavid van Moolenbroek 
420*c38dbb97SDavid van Moolenbroek 		put_socket_type(proc, NULL, *(int *)ptr);
421521fa314SDavid van Moolenbroek 		return IF_ALL;
422521fa314SDavid van Moolenbroek 
423521fa314SDavid van Moolenbroek 	case NWIOSUDSSHUT:
424521fa314SDavid van Moolenbroek 		if (ptr == NULL)
425521fa314SDavid van Moolenbroek 			return IF_OUT;
426521fa314SDavid van Moolenbroek 
427521fa314SDavid van Moolenbroek 		put_shutdown_how(proc, NULL, *(int *)ptr);
428521fa314SDavid van Moolenbroek 		return IF_ALL;
429521fa314SDavid van Moolenbroek 
430521fa314SDavid van Moolenbroek 	case NWIOSUDSPAIR:
431521fa314SDavid van Moolenbroek 		if (ptr == NULL)
432521fa314SDavid van Moolenbroek 			return IF_OUT;
433521fa314SDavid van Moolenbroek 
434521fa314SDavid van Moolenbroek 		put_dev(proc, NULL, *(dev_t *)ptr);
435521fa314SDavid van Moolenbroek 		return IF_ALL;
436521fa314SDavid van Moolenbroek 
437521fa314SDavid van Moolenbroek 	case NWIOSUDSCTRL:
438521fa314SDavid van Moolenbroek 		if (ptr == NULL)
439521fa314SDavid van Moolenbroek 			return IF_OUT;
440521fa314SDavid van Moolenbroek 
441521fa314SDavid van Moolenbroek 		/* FALLTHROUGH */
442521fa314SDavid van Moolenbroek 	case NWIOGUDSCTRL:
443521fa314SDavid van Moolenbroek 		if (ptr == NULL)
444521fa314SDavid van Moolenbroek 			return IF_IN;
445521fa314SDavid van Moolenbroek 
446521fa314SDavid van Moolenbroek 		put_msg_control(proc, (struct msg_control *)ptr);
447521fa314SDavid van Moolenbroek 		return IF_ALL;
448521fa314SDavid van Moolenbroek 
449521fa314SDavid van Moolenbroek 	case NWIOGUDSPEERCRED:
450521fa314SDavid van Moolenbroek 		if (ptr == NULL)
451521fa314SDavid van Moolenbroek 			return IF_IN;
452521fa314SDavid van Moolenbroek 
453521fa314SDavid van Moolenbroek 		put_struct_uucred(proc, NULL, PF_LOCADDR, (vir_bytes)ptr);
454521fa314SDavid van Moolenbroek 		return IF_ALL;
455521fa314SDavid van Moolenbroek 
456521fa314SDavid van Moolenbroek 	case NWIOGUDSSNDBUF:
457521fa314SDavid van Moolenbroek 	case NWIOSUDSSNDBUF:
458521fa314SDavid van Moolenbroek 	case NWIOGUDSRCVBUF:
459521fa314SDavid van Moolenbroek 	case NWIOSUDSRCVBUF:
460521fa314SDavid van Moolenbroek 		if (ptr == NULL)
461521fa314SDavid van Moolenbroek 			return dir;
462521fa314SDavid van Moolenbroek 
463521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%zu", *(size_t *)ptr);
464521fa314SDavid van Moolenbroek 		return IF_ALL;
465521fa314SDavid van Moolenbroek 
466521fa314SDavid van Moolenbroek 	default:
467521fa314SDavid van Moolenbroek 		return 0;
468521fa314SDavid van Moolenbroek 	}
469521fa314SDavid van Moolenbroek }
470