1*521fa314SDavid van Moolenbroek 2*521fa314SDavid van Moolenbroek #include "inc.h" 3*521fa314SDavid van Moolenbroek 4*521fa314SDavid van Moolenbroek #include <sys/ioctl.h> 5*521fa314SDavid van Moolenbroek #include <sys/ucred.h> 6*521fa314SDavid van Moolenbroek #include <net/gen/in.h> 7*521fa314SDavid van Moolenbroek #include <net/gen/ether.h> 8*521fa314SDavid van Moolenbroek #include <net/gen/eth_io.h> 9*521fa314SDavid van Moolenbroek #include <net/gen/arp_io.h> 10*521fa314SDavid van Moolenbroek #include <net/gen/ip_io.h> 11*521fa314SDavid van Moolenbroek #include <net/gen/route.h> 12*521fa314SDavid van Moolenbroek #include <net/gen/tcp.h> 13*521fa314SDavid van Moolenbroek #include <net/gen/tcp_io.h> 14*521fa314SDavid van Moolenbroek #include <net/gen/udp.h> 15*521fa314SDavid van Moolenbroek #include <net/gen/udp_io.h> 16*521fa314SDavid van Moolenbroek #include <net/gen/udp_io_hdr.h> 17*521fa314SDavid van Moolenbroek #include <net/gen/psip_io.h> 18*521fa314SDavid van Moolenbroek #include <arpa/inet.h> 19*521fa314SDavid van Moolenbroek 20*521fa314SDavid van Moolenbroek const char * 21*521fa314SDavid van Moolenbroek net_ioctl_name(unsigned long req) 22*521fa314SDavid van Moolenbroek { 23*521fa314SDavid van Moolenbroek 24*521fa314SDavid van Moolenbroek switch (req) { 25*521fa314SDavid van Moolenbroek NAME(FIONREAD); 26*521fa314SDavid van Moolenbroek NAME(NWIOSETHOPT); /* TODO: print argument */ 27*521fa314SDavid van Moolenbroek NAME(NWIOGETHOPT); /* TODO: print argument */ 28*521fa314SDavid van Moolenbroek NAME(NWIOGETHSTAT); /* TODO: print argument */ 29*521fa314SDavid van Moolenbroek NAME(NWIOARPGIP); /* TODO: print argument */ 30*521fa314SDavid van Moolenbroek NAME(NWIOARPGNEXT); /* TODO: print argument */ 31*521fa314SDavid van Moolenbroek NAME(NWIOARPSIP); /* TODO: print argument */ 32*521fa314SDavid van Moolenbroek NAME(NWIOARPDIP); /* TODO: print argument */ 33*521fa314SDavid van Moolenbroek NAME(NWIOSIPCONF2); /* TODO: print argument */ 34*521fa314SDavid van Moolenbroek NAME(NWIOSIPCONF); /* TODO: print argument */ 35*521fa314SDavid van Moolenbroek NAME(NWIOGIPCONF2); /* TODO: print argument */ 36*521fa314SDavid van Moolenbroek NAME(NWIOGIPCONF); /* TODO: print argument */ 37*521fa314SDavid van Moolenbroek NAME(NWIOSIPOPT); 38*521fa314SDavid van Moolenbroek NAME(NWIOGIPOPT); 39*521fa314SDavid van Moolenbroek NAME(NWIOGIPOROUTE); /* TODO: print argument */ 40*521fa314SDavid van Moolenbroek NAME(NWIOSIPOROUTE); /* TODO: print argument */ 41*521fa314SDavid van Moolenbroek NAME(NWIODIPOROUTE); /* TODO: print argument */ 42*521fa314SDavid van Moolenbroek NAME(NWIOGIPIROUTE); /* TODO: print argument */ 43*521fa314SDavid van Moolenbroek NAME(NWIOSIPIROUTE); /* TODO: print argument */ 44*521fa314SDavid van Moolenbroek NAME(NWIODIPIROUTE); /* TODO: print argument */ 45*521fa314SDavid van Moolenbroek NAME(NWIOSTCPCONF); 46*521fa314SDavid van Moolenbroek NAME(NWIOGTCPCONF); 47*521fa314SDavid van Moolenbroek NAME(NWIOTCPCONN); 48*521fa314SDavid van Moolenbroek NAME(NWIOTCPLISTEN); 49*521fa314SDavid van Moolenbroek NAME(NWIOTCPATTACH); /* TODO: print argument */ 50*521fa314SDavid van Moolenbroek NAME(NWIOTCPSHUTDOWN); /* no argument */ 51*521fa314SDavid van Moolenbroek NAME(NWIOSTCPOPT); 52*521fa314SDavid van Moolenbroek NAME(NWIOGTCPOPT); 53*521fa314SDavid van Moolenbroek NAME(NWIOTCPPUSH); /* no argument */ 54*521fa314SDavid van Moolenbroek NAME(NWIOTCPLISTENQ); 55*521fa314SDavid van Moolenbroek NAME(NWIOGTCPCOOKIE); 56*521fa314SDavid van Moolenbroek NAME(NWIOTCPACCEPTTO); 57*521fa314SDavid van Moolenbroek NAME(NWIOTCPGERROR); 58*521fa314SDavid van Moolenbroek NAME(NWIOSUDPOPT); 59*521fa314SDavid van Moolenbroek NAME(NWIOGUDPOPT); 60*521fa314SDavid van Moolenbroek NAME(NWIOUDPPEEK); /* TODO: print argument */ 61*521fa314SDavid van Moolenbroek NAME(NWIOSPSIPOPT); /* TODO: print argument */ 62*521fa314SDavid van Moolenbroek NAME(NWIOGPSIPOPT); /* TODO: print argument */ 63*521fa314SDavid van Moolenbroek NAME(NWIOGUDSFADDR); 64*521fa314SDavid van Moolenbroek NAME(NWIOSUDSTADDR); 65*521fa314SDavid van Moolenbroek NAME(NWIOSUDSADDR); 66*521fa314SDavid van Moolenbroek NAME(NWIOGUDSADDR); 67*521fa314SDavid van Moolenbroek NAME(NWIOGUDSPADDR); 68*521fa314SDavid van Moolenbroek NAME(NWIOSUDSTYPE); 69*521fa314SDavid van Moolenbroek NAME(NWIOSUDSBLOG); 70*521fa314SDavid van Moolenbroek NAME(NWIOSUDSCONN); 71*521fa314SDavid van Moolenbroek NAME(NWIOSUDSSHUT); 72*521fa314SDavid van Moolenbroek NAME(NWIOSUDSPAIR); 73*521fa314SDavid van Moolenbroek NAME(NWIOSUDSACCEPT); 74*521fa314SDavid van Moolenbroek NAME(NWIOSUDSCTRL); 75*521fa314SDavid van Moolenbroek NAME(NWIOGUDSCTRL); 76*521fa314SDavid van Moolenbroek NAME(NWIOGUDSSOTYPE); 77*521fa314SDavid van Moolenbroek NAME(NWIOGUDSPEERCRED); 78*521fa314SDavid van Moolenbroek NAME(NWIOGUDSSNDBUF); 79*521fa314SDavid van Moolenbroek NAME(NWIOSUDSSNDBUF); 80*521fa314SDavid van Moolenbroek NAME(NWIOGUDSRCVBUF); 81*521fa314SDavid van Moolenbroek NAME(NWIOSUDSRCVBUF); 82*521fa314SDavid van Moolenbroek } 83*521fa314SDavid van Moolenbroek 84*521fa314SDavid van Moolenbroek return NULL; 85*521fa314SDavid van Moolenbroek } 86*521fa314SDavid van Moolenbroek 87*521fa314SDavid van Moolenbroek static const struct flags ipopt_flags[] = { 88*521fa314SDavid van Moolenbroek FLAG_ZERO(NWIO_NOFLAGS), 89*521fa314SDavid van Moolenbroek FLAG_MASK(NWIO_ACC_MASK, NWIO_EXCL), 90*521fa314SDavid van Moolenbroek FLAG_MASK(NWIO_ACC_MASK, NWIO_SHARED), 91*521fa314SDavid van Moolenbroek FLAG_MASK(NWIO_ACC_MASK, NWIO_COPY), 92*521fa314SDavid van Moolenbroek FLAG(NWIO_EN_LOC), 93*521fa314SDavid van Moolenbroek FLAG(NWIO_DI_LOC), 94*521fa314SDavid van Moolenbroek FLAG(NWIO_EN_BROAD), 95*521fa314SDavid van Moolenbroek FLAG(NWIO_DI_BROAD), 96*521fa314SDavid van Moolenbroek FLAG(NWIO_REMSPEC), 97*521fa314SDavid van Moolenbroek FLAG(NWIO_REMANY), 98*521fa314SDavid van Moolenbroek FLAG(NWIO_PROTOSPEC), 99*521fa314SDavid van Moolenbroek FLAG(NWIO_PROTOANY), 100*521fa314SDavid van Moolenbroek FLAG(NWIO_HDR_O_SPEC), 101*521fa314SDavid van Moolenbroek FLAG(NWIO_HDR_O_ANY), 102*521fa314SDavid van Moolenbroek FLAG(NWIO_RWDATONLY), 103*521fa314SDavid van Moolenbroek FLAG(NWIO_RWDATALL), 104*521fa314SDavid van Moolenbroek }; 105*521fa314SDavid van Moolenbroek 106*521fa314SDavid van Moolenbroek static void 107*521fa314SDavid van Moolenbroek put_ipaddr(struct trace_proc * proc, const char * name, ipaddr_t ipaddr) 108*521fa314SDavid van Moolenbroek { 109*521fa314SDavid van Moolenbroek struct in_addr in; 110*521fa314SDavid van Moolenbroek 111*521fa314SDavid van Moolenbroek if (!valuesonly) { 112*521fa314SDavid van Moolenbroek in.s_addr = ipaddr; 113*521fa314SDavid van Moolenbroek 114*521fa314SDavid van Moolenbroek /* Is this an acceptable encapsulation? */ 115*521fa314SDavid van Moolenbroek put_value(proc, name, "[%s]", inet_ntoa(in)); 116*521fa314SDavid van Moolenbroek } else 117*521fa314SDavid van Moolenbroek put_value(proc, name, "0x%08x", ntohl(ipaddr)); 118*521fa314SDavid van Moolenbroek } 119*521fa314SDavid van Moolenbroek 120*521fa314SDavid van Moolenbroek static void 121*521fa314SDavid van Moolenbroek put_ipproto(struct trace_proc * proc, const char * name, ipproto_t proto) 122*521fa314SDavid van Moolenbroek { 123*521fa314SDavid van Moolenbroek const char *text = NULL; 124*521fa314SDavid van Moolenbroek 125*521fa314SDavid van Moolenbroek if (!valuesonly) { 126*521fa314SDavid van Moolenbroek switch (proto) { 127*521fa314SDavid van Moolenbroek TEXT(IPPROTO_ICMP); 128*521fa314SDavid van Moolenbroek TEXT(IPPROTO_TCP); 129*521fa314SDavid van Moolenbroek TEXT(IPPROTO_UDP); 130*521fa314SDavid van Moolenbroek } 131*521fa314SDavid van Moolenbroek } 132*521fa314SDavid van Moolenbroek 133*521fa314SDavid van Moolenbroek if (text != NULL) 134*521fa314SDavid van Moolenbroek put_field(proc, name, text); 135*521fa314SDavid van Moolenbroek else 136*521fa314SDavid van Moolenbroek put_value(proc, name, "%u", proto); 137*521fa314SDavid van Moolenbroek } 138*521fa314SDavid van Moolenbroek 139*521fa314SDavid van Moolenbroek static const struct flags tcpconf_flags[] = { 140*521fa314SDavid van Moolenbroek FLAG_ZERO(NWTC_NOFLAGS), 141*521fa314SDavid van Moolenbroek FLAG_MASK(NWTC_ACC_MASK, NWTC_EXCL), 142*521fa314SDavid van Moolenbroek FLAG_MASK(NWTC_ACC_MASK, NWTC_SHARED), 143*521fa314SDavid van Moolenbroek FLAG_MASK(NWTC_ACC_MASK, NWTC_COPY), 144*521fa314SDavid van Moolenbroek FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_UNSET), 145*521fa314SDavid van Moolenbroek FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_SET), 146*521fa314SDavid van Moolenbroek FLAG_MASK(NWTC_LOCPORT_MASK, NWTC_LP_SEL), 147*521fa314SDavid van Moolenbroek FLAG(NWTC_SET_RA), 148*521fa314SDavid van Moolenbroek FLAG(NWTC_UNSET_RA), 149*521fa314SDavid van Moolenbroek FLAG(NWTC_SET_RP), 150*521fa314SDavid van Moolenbroek FLAG(NWTC_UNSET_RP), 151*521fa314SDavid van Moolenbroek }; 152*521fa314SDavid van Moolenbroek 153*521fa314SDavid van Moolenbroek #define put_port(proc, name, port) \ 154*521fa314SDavid van Moolenbroek put_value(proc, name, "%u", ntohs(port)) 155*521fa314SDavid van Moolenbroek 156*521fa314SDavid van Moolenbroek static const struct flags tcpcl_flags[] = { 157*521fa314SDavid van Moolenbroek FLAG_ZERO(TCF_DEFAULT), 158*521fa314SDavid van Moolenbroek FLAG(TCF_ASYNCH), 159*521fa314SDavid van Moolenbroek }; 160*521fa314SDavid van Moolenbroek 161*521fa314SDavid van Moolenbroek static const struct flags tcpopt_flags[] = { 162*521fa314SDavid van Moolenbroek FLAG_ZERO(NWTO_NOFLAG), 163*521fa314SDavid van Moolenbroek FLAG(NWTO_SND_URG), 164*521fa314SDavid van Moolenbroek FLAG(NWTO_SND_NOTURG), 165*521fa314SDavid van Moolenbroek FLAG(NWTO_RCV_URG), 166*521fa314SDavid van Moolenbroek FLAG(NWTO_RCV_NOTURG), 167*521fa314SDavid van Moolenbroek FLAG(NWTO_BSD_URG), 168*521fa314SDavid van Moolenbroek FLAG(NWTO_NOTBSD_URG), 169*521fa314SDavid van Moolenbroek FLAG(NWTO_DEL_RST), 170*521fa314SDavid van Moolenbroek FLAG(NWTO_BULK), 171*521fa314SDavid van Moolenbroek FLAG(NWTO_NOBULK), 172*521fa314SDavid van Moolenbroek }; 173*521fa314SDavid van Moolenbroek 174*521fa314SDavid van Moolenbroek static const struct flags udpopt_flags[] = { 175*521fa314SDavid van Moolenbroek FLAG_ZERO(NWUO_NOFLAGS), 176*521fa314SDavid van Moolenbroek FLAG_MASK(NWUO_ACC_MASK, NWUO_EXCL), 177*521fa314SDavid van Moolenbroek FLAG_MASK(NWUO_ACC_MASK, NWUO_SHARED), 178*521fa314SDavid van Moolenbroek FLAG_MASK(NWUO_ACC_MASK, NWUO_COPY), 179*521fa314SDavid van Moolenbroek FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_SET), 180*521fa314SDavid van Moolenbroek FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_SEL), 181*521fa314SDavid van Moolenbroek FLAG_MASK(NWUO_LOCPORT_MASK, NWUO_LP_ANY), 182*521fa314SDavid van Moolenbroek FLAG(NWUO_EN_LOC), 183*521fa314SDavid van Moolenbroek FLAG(NWUO_DI_LOC), 184*521fa314SDavid van Moolenbroek FLAG(NWUO_EN_BROAD), 185*521fa314SDavid van Moolenbroek FLAG(NWUO_DI_BROAD), 186*521fa314SDavid van Moolenbroek FLAG(NWUO_RP_SET), 187*521fa314SDavid van Moolenbroek FLAG(NWUO_RP_ANY), 188*521fa314SDavid van Moolenbroek FLAG(NWUO_RA_SET), 189*521fa314SDavid van Moolenbroek FLAG(NWUO_RA_ANY), 190*521fa314SDavid van Moolenbroek FLAG(NWUO_RWDATONLY), 191*521fa314SDavid van Moolenbroek FLAG(NWUO_RWDATALL), 192*521fa314SDavid van Moolenbroek FLAG(NWUO_EN_IPOPT), 193*521fa314SDavid van Moolenbroek FLAG(NWUO_DI_IPOPT), 194*521fa314SDavid van Moolenbroek }; 195*521fa314SDavid van Moolenbroek 196*521fa314SDavid van Moolenbroek static void 197*521fa314SDavid van Moolenbroek put_family(struct trace_proc * proc, const char * name, int family) 198*521fa314SDavid van Moolenbroek { 199*521fa314SDavid van Moolenbroek const char *text = NULL; 200*521fa314SDavid van Moolenbroek 201*521fa314SDavid van Moolenbroek if (!valuesonly) { 202*521fa314SDavid van Moolenbroek /* TODO: add all the other protocols */ 203*521fa314SDavid van Moolenbroek switch (family) { 204*521fa314SDavid van Moolenbroek TEXT(AF_UNSPEC); 205*521fa314SDavid van Moolenbroek TEXT(AF_LOCAL); 206*521fa314SDavid van Moolenbroek TEXT(AF_INET); 207*521fa314SDavid van Moolenbroek TEXT(AF_INET6); 208*521fa314SDavid van Moolenbroek } 209*521fa314SDavid van Moolenbroek } 210*521fa314SDavid van Moolenbroek 211*521fa314SDavid van Moolenbroek if (text != NULL) 212*521fa314SDavid van Moolenbroek put_field(proc, name, text); 213*521fa314SDavid van Moolenbroek else 214*521fa314SDavid van Moolenbroek put_value(proc, name, "%d", family); 215*521fa314SDavid van Moolenbroek } 216*521fa314SDavid van Moolenbroek 217*521fa314SDavid van Moolenbroek static const struct flags sock_type[] = { 218*521fa314SDavid van Moolenbroek FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_STREAM), 219*521fa314SDavid van Moolenbroek FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_DGRAM), 220*521fa314SDavid van Moolenbroek FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_RAW), 221*521fa314SDavid van Moolenbroek FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_RDM), 222*521fa314SDavid van Moolenbroek FLAG_MASK(~SOCK_FLAGS_MASK, SOCK_SEQPACKET), 223*521fa314SDavid van Moolenbroek FLAG(SOCK_CLOEXEC), 224*521fa314SDavid van Moolenbroek FLAG(SOCK_NONBLOCK), 225*521fa314SDavid van Moolenbroek FLAG(SOCK_NOSIGPIPE), 226*521fa314SDavid van Moolenbroek }; 227*521fa314SDavid van Moolenbroek 228*521fa314SDavid van Moolenbroek static void 229*521fa314SDavid van Moolenbroek put_shutdown_how(struct trace_proc * proc, const char * name, int how) 230*521fa314SDavid van Moolenbroek { 231*521fa314SDavid van Moolenbroek const char *text = NULL; 232*521fa314SDavid van Moolenbroek 233*521fa314SDavid van Moolenbroek if (!valuesonly) { 234*521fa314SDavid van Moolenbroek switch (how) { 235*521fa314SDavid van Moolenbroek TEXT(SHUT_RD); 236*521fa314SDavid van Moolenbroek TEXT(SHUT_WR); 237*521fa314SDavid van Moolenbroek TEXT(SHUT_RDWR); 238*521fa314SDavid van Moolenbroek } 239*521fa314SDavid van Moolenbroek } 240*521fa314SDavid van Moolenbroek 241*521fa314SDavid van Moolenbroek if (text != NULL) 242*521fa314SDavid van Moolenbroek put_field(proc, name, text); 243*521fa314SDavid van Moolenbroek else 244*521fa314SDavid van Moolenbroek put_value(proc, name, "%d", how); 245*521fa314SDavid van Moolenbroek } 246*521fa314SDavid van Moolenbroek 247*521fa314SDavid van Moolenbroek static void 248*521fa314SDavid van Moolenbroek put_struct_uucred(struct trace_proc * proc, const char * name, int flags, 249*521fa314SDavid van Moolenbroek vir_bytes addr) 250*521fa314SDavid van Moolenbroek { 251*521fa314SDavid van Moolenbroek struct uucred cred; 252*521fa314SDavid van Moolenbroek 253*521fa314SDavid van Moolenbroek if (!put_open_struct(proc, name, flags, addr, &cred, sizeof(cred))) 254*521fa314SDavid van Moolenbroek return; 255*521fa314SDavid van Moolenbroek 256*521fa314SDavid van Moolenbroek put_value(proc, "cr_uid", "%u", cred.cr_uid); 257*521fa314SDavid van Moolenbroek if (verbose > 0) { 258*521fa314SDavid van Moolenbroek put_value(proc, "cr_gid", "%u", cred.cr_gid); 259*521fa314SDavid van Moolenbroek if (verbose > 1) 260*521fa314SDavid van Moolenbroek put_value(proc, "cr_ngroups", "%d", cred.cr_ngroups); 261*521fa314SDavid van Moolenbroek put_groups(proc, "cr_groups", PF_LOCADDR, 262*521fa314SDavid van Moolenbroek (vir_bytes)&cred.cr_groups, cred.cr_ngroups); 263*521fa314SDavid van Moolenbroek } 264*521fa314SDavid van Moolenbroek 265*521fa314SDavid van Moolenbroek put_close_struct(proc, verbose > 0); 266*521fa314SDavid van Moolenbroek } 267*521fa314SDavid van Moolenbroek 268*521fa314SDavid van Moolenbroek static void 269*521fa314SDavid van Moolenbroek put_cmsg_type(struct trace_proc * proc, const char * name, int type) 270*521fa314SDavid van Moolenbroek { 271*521fa314SDavid van Moolenbroek const char *text = NULL; 272*521fa314SDavid van Moolenbroek 273*521fa314SDavid van Moolenbroek if (!valuesonly) { 274*521fa314SDavid van Moolenbroek switch (type) { 275*521fa314SDavid van Moolenbroek TEXT(SCM_RIGHTS); 276*521fa314SDavid van Moolenbroek TEXT(SCM_CREDS); 277*521fa314SDavid van Moolenbroek TEXT(SCM_TIMESTAMP); 278*521fa314SDavid van Moolenbroek } 279*521fa314SDavid van Moolenbroek } 280*521fa314SDavid van Moolenbroek 281*521fa314SDavid van Moolenbroek if (text != NULL) 282*521fa314SDavid van Moolenbroek put_field(proc, name, text); 283*521fa314SDavid van Moolenbroek else 284*521fa314SDavid van Moolenbroek put_value(proc, name, "%d", type); 285*521fa314SDavid van Moolenbroek } 286*521fa314SDavid van Moolenbroek 287*521fa314SDavid van Moolenbroek static void 288*521fa314SDavid van Moolenbroek put_msg_control(struct trace_proc * proc, struct msg_control * ptr) 289*521fa314SDavid van Moolenbroek { 290*521fa314SDavid van Moolenbroek struct msghdr msg; 291*521fa314SDavid van Moolenbroek struct cmsghdr *cmsg; 292*521fa314SDavid van Moolenbroek size_t len; 293*521fa314SDavid van Moolenbroek int i; 294*521fa314SDavid van Moolenbroek 295*521fa314SDavid van Moolenbroek if (ptr->msg_controllen > sizeof(ptr->msg_control)) { 296*521fa314SDavid van Moolenbroek put_field(proc, NULL, ".."); 297*521fa314SDavid van Moolenbroek 298*521fa314SDavid van Moolenbroek return; 299*521fa314SDavid van Moolenbroek } 300*521fa314SDavid van Moolenbroek 301*521fa314SDavid van Moolenbroek put_open(proc, NULL, PF_NONAME, "[", ", "); 302*521fa314SDavid van Moolenbroek 303*521fa314SDavid van Moolenbroek memset(&msg, 0, sizeof(msg)); 304*521fa314SDavid van Moolenbroek msg.msg_control = ptr->msg_control; 305*521fa314SDavid van Moolenbroek msg.msg_controllen = ptr->msg_controllen; 306*521fa314SDavid van Moolenbroek 307*521fa314SDavid van Moolenbroek /* 308*521fa314SDavid van Moolenbroek * TODO: decide if we need a verbosity-based limit here. The argument 309*521fa314SDavid van Moolenbroek * in favor of printing everything is that upon receipt, SCM_RIGHTS 310*521fa314SDavid van Moolenbroek * actually creates new file descriptors, which is pretty essential in 311*521fa314SDavid van Moolenbroek * terms of figuring out what is happening in a process. In addition, 312*521fa314SDavid van Moolenbroek * these calls should be sufficiently rare that the lengthy output is 313*521fa314SDavid van Moolenbroek * not really disruptive for the general output flow. 314*521fa314SDavid van Moolenbroek */ 315*521fa314SDavid van Moolenbroek for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; 316*521fa314SDavid van Moolenbroek cmsg = CMSG_NXTHDR(&msg, cmsg)) { 317*521fa314SDavid van Moolenbroek put_open(proc, NULL, 0, "{", ", "); 318*521fa314SDavid van Moolenbroek 319*521fa314SDavid van Moolenbroek if (verbose > 0) 320*521fa314SDavid van Moolenbroek put_value(proc, "cmsg_len", "%u", cmsg->cmsg_len); 321*521fa314SDavid van Moolenbroek if (!valuesonly && cmsg->cmsg_level == SOL_SOCKET) 322*521fa314SDavid van Moolenbroek put_field(proc, "cmsg_level", "SOL_SOCKET"); 323*521fa314SDavid van Moolenbroek else 324*521fa314SDavid van Moolenbroek put_value(proc, "cmsg_level", "%d", cmsg->cmsg_level); 325*521fa314SDavid van Moolenbroek if (cmsg->cmsg_level == SOL_SOCKET) 326*521fa314SDavid van Moolenbroek put_cmsg_type(proc, "cmsg_type", cmsg->cmsg_type); 327*521fa314SDavid van Moolenbroek 328*521fa314SDavid van Moolenbroek len = cmsg->cmsg_len - CMSG_LEN(0); 329*521fa314SDavid van Moolenbroek 330*521fa314SDavid van Moolenbroek /* Print the contents of the messages that we know. */ 331*521fa314SDavid van Moolenbroek if (cmsg->cmsg_level == SOL_SOCKET && 332*521fa314SDavid van Moolenbroek cmsg->cmsg_type == SCM_RIGHTS) { 333*521fa314SDavid van Moolenbroek put_open(proc, NULL, PF_NONAME, "[", ", "); 334*521fa314SDavid van Moolenbroek for (i = 0; i < len / sizeof(int); i++) 335*521fa314SDavid van Moolenbroek put_fd(proc, NULL, 336*521fa314SDavid van Moolenbroek ((int *)CMSG_DATA(cmsg))[i]); 337*521fa314SDavid van Moolenbroek put_close(proc, "]"); 338*521fa314SDavid van Moolenbroek } else if (cmsg->cmsg_level == SOL_SOCKET && 339*521fa314SDavid van Moolenbroek cmsg->cmsg_type == SCM_CREDS) { 340*521fa314SDavid van Moolenbroek put_struct_uucred(proc, NULL, PF_LOCADDR, 341*521fa314SDavid van Moolenbroek (vir_bytes)CMSG_DATA(cmsg)); 342*521fa314SDavid van Moolenbroek } else if (len > 0) 343*521fa314SDavid van Moolenbroek put_field(proc, NULL, ".."); 344*521fa314SDavid van Moolenbroek 345*521fa314SDavid van Moolenbroek put_close(proc, "}"); 346*521fa314SDavid van Moolenbroek } 347*521fa314SDavid van Moolenbroek 348*521fa314SDavid van Moolenbroek put_close(proc, "]"); 349*521fa314SDavid van Moolenbroek } 350*521fa314SDavid van Moolenbroek 351*521fa314SDavid van Moolenbroek int 352*521fa314SDavid van Moolenbroek net_ioctl_arg(struct trace_proc * proc, unsigned long req, void * ptr, int dir) 353*521fa314SDavid van Moolenbroek { 354*521fa314SDavid van Moolenbroek const char *text; 355*521fa314SDavid van Moolenbroek nwio_ipopt_t *ipopt; 356*521fa314SDavid van Moolenbroek nwio_tcpconf_t *nwtc; 357*521fa314SDavid van Moolenbroek nwio_tcpcl_t *nwtcl; 358*521fa314SDavid van Moolenbroek nwio_tcpopt_t *nwto; 359*521fa314SDavid van Moolenbroek tcp_cookie_t *cookie; 360*521fa314SDavid van Moolenbroek nwio_udpopt_t *nwuo; 361*521fa314SDavid van Moolenbroek struct sockaddr_un *sun; 362*521fa314SDavid van Moolenbroek int i; 363*521fa314SDavid van Moolenbroek 364*521fa314SDavid van Moolenbroek switch (req) { 365*521fa314SDavid van Moolenbroek case FIONREAD: 366*521fa314SDavid van Moolenbroek /* 367*521fa314SDavid van Moolenbroek * Arguably this does not belong here, but as of writing, the 368*521fa314SDavid van Moolenbroek * network services are the only ones actually implementing 369*521fa314SDavid van Moolenbroek * support for this IOCTL, and we don't have a more suitable 370*521fa314SDavid van Moolenbroek * place to put it either. 371*521fa314SDavid van Moolenbroek */ 372*521fa314SDavid van Moolenbroek if (ptr == NULL) 373*521fa314SDavid van Moolenbroek return IF_IN; 374*521fa314SDavid van Moolenbroek 375*521fa314SDavid van Moolenbroek put_value(proc, NULL, "%d", *(int *)ptr); 376*521fa314SDavid van Moolenbroek return IF_ALL; 377*521fa314SDavid van Moolenbroek 378*521fa314SDavid van Moolenbroek case NWIOSIPOPT: 379*521fa314SDavid van Moolenbroek case NWIOGIPOPT: 380*521fa314SDavid van Moolenbroek if ((ipopt = (nwio_ipopt_t *)ptr) == NULL) 381*521fa314SDavid van Moolenbroek return dir; 382*521fa314SDavid van Moolenbroek 383*521fa314SDavid van Moolenbroek put_flags(proc, "nwio_flags", ipopt_flags, COUNT(ipopt_flags), 384*521fa314SDavid van Moolenbroek "0x%x", ipopt->nwio_flags); 385*521fa314SDavid van Moolenbroek 386*521fa314SDavid van Moolenbroek if (ipopt->nwio_flags & NWIO_REMSPEC) 387*521fa314SDavid van Moolenbroek put_ipaddr(proc, "nwio_rem", ipopt->nwio_rem); 388*521fa314SDavid van Moolenbroek if (ipopt->nwio_flags & NWIO_PROTOSPEC) 389*521fa314SDavid van Moolenbroek put_ipproto(proc, "nwio_proto", ipopt->nwio_proto); 390*521fa314SDavid van Moolenbroek 391*521fa314SDavid van Moolenbroek return 0; /* TODO: the remaining fields */ 392*521fa314SDavid van Moolenbroek 393*521fa314SDavid van Moolenbroek case NWIOSTCPCONF: 394*521fa314SDavid van Moolenbroek case NWIOGTCPCONF: 395*521fa314SDavid van Moolenbroek if ((nwtc = (nwio_tcpconf_t *)ptr) == NULL) 396*521fa314SDavid van Moolenbroek return dir; 397*521fa314SDavid van Moolenbroek 398*521fa314SDavid van Moolenbroek put_flags(proc, "nwtc_flags", tcpconf_flags, 399*521fa314SDavid van Moolenbroek COUNT(tcpconf_flags), "0x%x", nwtc->nwtc_flags); 400*521fa314SDavid van Moolenbroek 401*521fa314SDavid van Moolenbroek /* The local address cannot be set, just retrieved. */ 402*521fa314SDavid van Moolenbroek if (req == NWIOGTCPCONF) 403*521fa314SDavid van Moolenbroek put_ipaddr(proc, "nwtc_locaddr", nwtc->nwtc_locaddr); 404*521fa314SDavid van Moolenbroek 405*521fa314SDavid van Moolenbroek if ((nwtc->nwtc_flags & NWTC_LOCPORT_MASK) == NWTC_LP_SET) 406*521fa314SDavid van Moolenbroek put_port(proc, "nwtc_locport", nwtc->nwtc_locport); 407*521fa314SDavid van Moolenbroek 408*521fa314SDavid van Moolenbroek if (nwtc->nwtc_flags & NWTC_SET_RA) 409*521fa314SDavid van Moolenbroek put_ipaddr(proc, "nwtc_remaddr", nwtc->nwtc_remaddr); 410*521fa314SDavid van Moolenbroek 411*521fa314SDavid van Moolenbroek if (nwtc->nwtc_flags & NWTC_SET_RP) 412*521fa314SDavid van Moolenbroek put_port(proc, "nwtc_remport", nwtc->nwtc_remport); 413*521fa314SDavid van Moolenbroek 414*521fa314SDavid van Moolenbroek return IF_ALL; 415*521fa314SDavid van Moolenbroek 416*521fa314SDavid van Moolenbroek case NWIOTCPCONN: 417*521fa314SDavid van Moolenbroek case NWIOTCPLISTEN: 418*521fa314SDavid van Moolenbroek if ((nwtcl = (nwio_tcpcl_t *)ptr) == NULL) 419*521fa314SDavid van Moolenbroek return dir; 420*521fa314SDavid van Moolenbroek 421*521fa314SDavid van Moolenbroek put_flags(proc, "nwtcl_flags", tcpcl_flags, 422*521fa314SDavid van Moolenbroek COUNT(tcpcl_flags), "0x%x", nwtcl->nwtcl_flags); 423*521fa314SDavid van Moolenbroek 424*521fa314SDavid van Moolenbroek /* We pretend the unused nwtcl_ttl field does not exist. */ 425*521fa314SDavid van Moolenbroek return IF_ALL; 426*521fa314SDavid van Moolenbroek 427*521fa314SDavid van Moolenbroek case NWIOSTCPOPT: 428*521fa314SDavid van Moolenbroek case NWIOGTCPOPT: 429*521fa314SDavid van Moolenbroek if ((nwto = (nwio_tcpopt_t *)ptr) == NULL) 430*521fa314SDavid van Moolenbroek return dir; 431*521fa314SDavid van Moolenbroek 432*521fa314SDavid van Moolenbroek put_flags(proc, "nwto_flags", tcpopt_flags, 433*521fa314SDavid van Moolenbroek COUNT(tcpopt_flags), "0x%x", nwto->nwto_flags); 434*521fa314SDavid van Moolenbroek return IF_ALL; 435*521fa314SDavid van Moolenbroek 436*521fa314SDavid van Moolenbroek case NWIOTCPLISTENQ: 437*521fa314SDavid van Moolenbroek case NWIOSUDSBLOG: 438*521fa314SDavid van Moolenbroek if (ptr == NULL) 439*521fa314SDavid van Moolenbroek return IF_OUT; 440*521fa314SDavid van Moolenbroek 441*521fa314SDavid van Moolenbroek put_value(proc, NULL, "%d", *(int *)ptr); 442*521fa314SDavid van Moolenbroek return IF_ALL; 443*521fa314SDavid van Moolenbroek 444*521fa314SDavid van Moolenbroek case NWIOGTCPCOOKIE: 445*521fa314SDavid van Moolenbroek case NWIOTCPACCEPTTO: 446*521fa314SDavid van Moolenbroek if ((cookie = (tcp_cookie_t *)ptr) == NULL) 447*521fa314SDavid van Moolenbroek return dir; 448*521fa314SDavid van Moolenbroek 449*521fa314SDavid van Moolenbroek put_value(proc, "tc_ref", "%"PRIu32, cookie->tc_ref); 450*521fa314SDavid van Moolenbroek if (verbose > 0) 451*521fa314SDavid van Moolenbroek put_buf(proc, "tc_secret", PF_LOCADDR, 452*521fa314SDavid van Moolenbroek (vir_bytes)&cookie->tc_secret, 453*521fa314SDavid van Moolenbroek sizeof(cookie->tc_secret)); 454*521fa314SDavid van Moolenbroek return (verbose > 0) ? IF_ALL : 0; 455*521fa314SDavid van Moolenbroek 456*521fa314SDavid van Moolenbroek case NWIOTCPGERROR: 457*521fa314SDavid van Moolenbroek if (ptr == NULL) 458*521fa314SDavid van Moolenbroek return IF_IN; 459*521fa314SDavid van Moolenbroek 460*521fa314SDavid van Moolenbroek i = *(int *)ptr; 461*521fa314SDavid van Moolenbroek if (!valuesonly && (text = get_error_name(i)) != NULL) 462*521fa314SDavid van Moolenbroek put_field(proc, NULL, text); 463*521fa314SDavid van Moolenbroek else 464*521fa314SDavid van Moolenbroek put_value(proc, NULL, "%d", i); 465*521fa314SDavid van Moolenbroek return IF_ALL; 466*521fa314SDavid van Moolenbroek 467*521fa314SDavid van Moolenbroek case NWIOSUDPOPT: 468*521fa314SDavid van Moolenbroek case NWIOGUDPOPT: 469*521fa314SDavid van Moolenbroek if ((nwuo = (nwio_udpopt_t *)ptr) == NULL) 470*521fa314SDavid van Moolenbroek return dir; 471*521fa314SDavid van Moolenbroek 472*521fa314SDavid van Moolenbroek put_flags(proc, "nwuo_flags", udpopt_flags, 473*521fa314SDavid van Moolenbroek COUNT(udpopt_flags), "0x%x", nwuo->nwuo_flags); 474*521fa314SDavid van Moolenbroek 475*521fa314SDavid van Moolenbroek /* The local address cannot be set, just retrieved. */ 476*521fa314SDavid van Moolenbroek if (req == NWIOGUDPOPT) 477*521fa314SDavid van Moolenbroek put_ipaddr(proc, "nwuo_locaddr", nwuo->nwuo_locaddr); 478*521fa314SDavid van Moolenbroek 479*521fa314SDavid van Moolenbroek if ((nwuo->nwuo_flags & NWUO_LOCPORT_MASK) == NWUO_LP_SET) 480*521fa314SDavid van Moolenbroek put_port(proc, "nwuo_locport", nwuo->nwuo_locport); 481*521fa314SDavid van Moolenbroek 482*521fa314SDavid van Moolenbroek if (nwuo->nwuo_flags & NWUO_RA_SET) 483*521fa314SDavid van Moolenbroek put_ipaddr(proc, "nwuo_remaddr", nwuo->nwuo_remaddr); 484*521fa314SDavid van Moolenbroek 485*521fa314SDavid van Moolenbroek if (nwuo->nwuo_flags & NWUO_RP_SET) 486*521fa314SDavid van Moolenbroek put_port(proc, "nwuo_remport", nwuo->nwuo_remport); 487*521fa314SDavid van Moolenbroek 488*521fa314SDavid van Moolenbroek return IF_ALL; 489*521fa314SDavid van Moolenbroek 490*521fa314SDavid van Moolenbroek case NWIOGUDSFADDR: 491*521fa314SDavid van Moolenbroek case NWIOSUDSTADDR: 492*521fa314SDavid van Moolenbroek case NWIOSUDSADDR: 493*521fa314SDavid van Moolenbroek case NWIOGUDSADDR: 494*521fa314SDavid van Moolenbroek case NWIOGUDSPADDR: 495*521fa314SDavid van Moolenbroek case NWIOSUDSCONN: 496*521fa314SDavid van Moolenbroek case NWIOSUDSACCEPT: 497*521fa314SDavid van Moolenbroek if ((sun = (struct sockaddr_un *)ptr) == NULL) 498*521fa314SDavid van Moolenbroek return dir; 499*521fa314SDavid van Moolenbroek 500*521fa314SDavid van Moolenbroek put_family(proc, "sun_family", sun->sun_family); 501*521fa314SDavid van Moolenbroek 502*521fa314SDavid van Moolenbroek /* This could be extended to a generic sockaddr printer.. */ 503*521fa314SDavid van Moolenbroek if (sun->sun_family == AF_LOCAL) { 504*521fa314SDavid van Moolenbroek put_buf(proc, "sun_path", PF_LOCADDR | PF_PATH, 505*521fa314SDavid van Moolenbroek (vir_bytes)&sun->sun_path, sizeof(sun->sun_path)); 506*521fa314SDavid van Moolenbroek return IF_ALL; /* skipping sun_len, it's unused */ 507*521fa314SDavid van Moolenbroek } else 508*521fa314SDavid van Moolenbroek return 0; 509*521fa314SDavid van Moolenbroek 510*521fa314SDavid van Moolenbroek case NWIOSUDSTYPE: 511*521fa314SDavid van Moolenbroek case NWIOGUDSSOTYPE: 512*521fa314SDavid van Moolenbroek if (ptr == NULL) 513*521fa314SDavid van Moolenbroek return dir; 514*521fa314SDavid van Moolenbroek 515*521fa314SDavid van Moolenbroek put_flags(proc, NULL, sock_type, COUNT(sock_type), "0x%x", 516*521fa314SDavid van Moolenbroek *(int *)ptr); 517*521fa314SDavid van Moolenbroek return IF_ALL; 518*521fa314SDavid van Moolenbroek 519*521fa314SDavid van Moolenbroek case NWIOSUDSSHUT: 520*521fa314SDavid van Moolenbroek if (ptr == NULL) 521*521fa314SDavid van Moolenbroek return IF_OUT; 522*521fa314SDavid van Moolenbroek 523*521fa314SDavid van Moolenbroek put_shutdown_how(proc, NULL, *(int *)ptr); 524*521fa314SDavid van Moolenbroek return IF_ALL; 525*521fa314SDavid van Moolenbroek 526*521fa314SDavid van Moolenbroek case NWIOSUDSPAIR: 527*521fa314SDavid van Moolenbroek if (ptr == NULL) 528*521fa314SDavid van Moolenbroek return IF_OUT; 529*521fa314SDavid van Moolenbroek 530*521fa314SDavid van Moolenbroek put_dev(proc, NULL, *(dev_t *)ptr); 531*521fa314SDavid van Moolenbroek return IF_ALL; 532*521fa314SDavid van Moolenbroek 533*521fa314SDavid van Moolenbroek case NWIOSUDSCTRL: 534*521fa314SDavid van Moolenbroek if (ptr == NULL) 535*521fa314SDavid van Moolenbroek return IF_OUT; 536*521fa314SDavid van Moolenbroek 537*521fa314SDavid van Moolenbroek /* FALLTHROUGH */ 538*521fa314SDavid van Moolenbroek case NWIOGUDSCTRL: 539*521fa314SDavid van Moolenbroek if (ptr == NULL) 540*521fa314SDavid van Moolenbroek return IF_IN; 541*521fa314SDavid van Moolenbroek 542*521fa314SDavid van Moolenbroek put_msg_control(proc, (struct msg_control *)ptr); 543*521fa314SDavid van Moolenbroek return IF_ALL; 544*521fa314SDavid van Moolenbroek 545*521fa314SDavid van Moolenbroek case NWIOGUDSPEERCRED: 546*521fa314SDavid van Moolenbroek if (ptr == NULL) 547*521fa314SDavid van Moolenbroek return IF_IN; 548*521fa314SDavid van Moolenbroek 549*521fa314SDavid van Moolenbroek put_struct_uucred(proc, NULL, PF_LOCADDR, (vir_bytes)ptr); 550*521fa314SDavid van Moolenbroek return IF_ALL; 551*521fa314SDavid van Moolenbroek 552*521fa314SDavid van Moolenbroek case NWIOGUDSSNDBUF: 553*521fa314SDavid van Moolenbroek case NWIOSUDSSNDBUF: 554*521fa314SDavid van Moolenbroek case NWIOGUDSRCVBUF: 555*521fa314SDavid van Moolenbroek case NWIOSUDSRCVBUF: 556*521fa314SDavid van Moolenbroek if (ptr == NULL) 557*521fa314SDavid van Moolenbroek return dir; 558*521fa314SDavid van Moolenbroek 559*521fa314SDavid van Moolenbroek put_value(proc, NULL, "%zu", *(size_t *)ptr); 560*521fa314SDavid van Moolenbroek return IF_ALL; 561*521fa314SDavid van Moolenbroek 562*521fa314SDavid van Moolenbroek default: 563*521fa314SDavid van Moolenbroek return 0; 564*521fa314SDavid van Moolenbroek } 565*521fa314SDavid van Moolenbroek } 566