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