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