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