16b463eedSChristian S.J. Peron /*- 26b463eedSChristian S.J. Peron * Copyright (c) 2005 Christian S.J. Peron 36b463eedSChristian S.J. Peron * All rights reserved. 46b463eedSChristian S.J. Peron * 56b463eedSChristian S.J. Peron * Redistribution and use in source and binary forms, with or without 66b463eedSChristian S.J. Peron * modification, are permitted provided that the following conditions 76b463eedSChristian S.J. Peron * are met: 86b463eedSChristian S.J. Peron * 1. Redistributions of source code must retain the above copyright 96b463eedSChristian S.J. Peron * notice, this list of conditions and the following disclaimer. 106b463eedSChristian S.J. Peron * 2. Redistributions in binary form must reproduce the above copyright 116b463eedSChristian S.J. Peron * notice, this list of conditions and the following disclaimer in the 126b463eedSChristian S.J. Peron * documentation and/or other materials provided with the distribution. 136b463eedSChristian S.J. Peron * 146b463eedSChristian S.J. Peron * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 156b463eedSChristian S.J. Peron * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 166b463eedSChristian S.J. Peron * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 176b463eedSChristian S.J. Peron * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 186b463eedSChristian S.J. Peron * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 196b463eedSChristian S.J. Peron * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 206b463eedSChristian S.J. Peron * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 216b463eedSChristian S.J. Peron * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 226b463eedSChristian S.J. Peron * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 236b463eedSChristian S.J. Peron * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 246b463eedSChristian S.J. Peron * SUCH DAMAGE. 256b463eedSChristian S.J. Peron * 266b463eedSChristian S.J. Peron * $FreeBSD$ 276b463eedSChristian S.J. Peron */ 286b463eedSChristian S.J. Peron #include <sys/types.h> 296b463eedSChristian S.J. Peron #include <sys/protosw.h> 306b463eedSChristian S.J. Peron #include <sys/socket.h> 316b463eedSChristian S.J. Peron #include <sys/sysctl.h> 326b463eedSChristian S.J. Peron #include <sys/param.h> 336b463eedSChristian S.J. Peron #include <sys/user.h> 346b463eedSChristian S.J. Peron 356b463eedSChristian S.J. Peron #include <net/if.h> 366b463eedSChristian S.J. Peron #include <net/if_var.h> 376b463eedSChristian S.J. Peron #include <net/bpfdesc.h> 386b463eedSChristian S.J. Peron #include <arpa/inet.h> 396b463eedSChristian S.J. Peron 406b463eedSChristian S.J. Peron #include <err.h> 416b463eedSChristian S.J. Peron #include <errno.h> 426b463eedSChristian S.J. Peron #include <stdio.h> 436b463eedSChristian S.J. Peron #include <stdlib.h> 446b463eedSChristian S.J. Peron #include <string.h> 456b463eedSChristian S.J. Peron #include <unistd.h> 466b463eedSChristian S.J. Peron 476b463eedSChristian S.J. Peron #include "netstat.h" 486b463eedSChristian S.J. Peron 496b463eedSChristian S.J. Peron /* print bpf stats */ 506b463eedSChristian S.J. Peron 516b463eedSChristian S.J. Peron static char * 526b463eedSChristian S.J. Peron bpf_pidname(pid_t pid) 536b463eedSChristian S.J. Peron { 546b463eedSChristian S.J. Peron struct kinfo_proc newkp; 556b463eedSChristian S.J. Peron int error, mib[4]; 566b463eedSChristian S.J. Peron size_t size; 576b463eedSChristian S.J. Peron 586b463eedSChristian S.J. Peron mib[0] = CTL_KERN; 596b463eedSChristian S.J. Peron mib[1] = KERN_PROC; 606b463eedSChristian S.J. Peron mib[2] = KERN_PROC_PID; 616b463eedSChristian S.J. Peron mib[3] = pid; 626b463eedSChristian S.J. Peron size = sizeof(newkp); 636b463eedSChristian S.J. Peron error = sysctl(mib, 4, &newkp, &size, NULL, 0); 646b463eedSChristian S.J. Peron if (error < 0) 656b463eedSChristian S.J. Peron return (strdup("??????")); 666b463eedSChristian S.J. Peron return (strdup(newkp.ki_comm)); 676b463eedSChristian S.J. Peron } 686b463eedSChristian S.J. Peron 696b463eedSChristian S.J. Peron static void 706b463eedSChristian S.J. Peron bpf_flags(struct xbpf_d *bd, char *flagbuf) 716b463eedSChristian S.J. Peron { 726b463eedSChristian S.J. Peron 736b463eedSChristian S.J. Peron *flagbuf++ = bd->bd_promisc ? 'p' : '-'; 746b463eedSChristian S.J. Peron *flagbuf++ = bd->bd_immediate ? 'i' : '-'; 756b463eedSChristian S.J. Peron *flagbuf++ = bd->bd_hdrcmplt ? '-' : 'f'; 766b463eedSChristian S.J. Peron *flagbuf++ = bd->bd_seesent ? 's' : '.'; 776b463eedSChristian S.J. Peron *flagbuf++ = bd->bd_async ? 'a' : '-'; 786b463eedSChristian S.J. Peron *flagbuf++ = bd->bd_locked ? 'l' : '-'; 796b463eedSChristian S.J. Peron *flagbuf++ = '\0'; 806b463eedSChristian S.J. Peron } 816b463eedSChristian S.J. Peron 826b463eedSChristian S.J. Peron void 836b463eedSChristian S.J. Peron bpf_stats(char *interface) 846b463eedSChristian S.J. Peron { 856b463eedSChristian S.J. Peron struct xbpf_d *d, *bd; 866b463eedSChristian S.J. Peron char *pname, flagbuf[12]; 876b463eedSChristian S.J. Peron size_t size; 886b463eedSChristian S.J. Peron 896b463eedSChristian S.J. Peron if (sysctlbyname("net.bpf.stats", NULL, &size, 906b463eedSChristian S.J. Peron NULL, 0) < 0) { 916b463eedSChristian S.J. Peron warn("net.bpf.stats"); 926b463eedSChristian S.J. Peron return; 936b463eedSChristian S.J. Peron } 9415f3d81fSChristian S.J. Peron if (size == 0) 9515f3d81fSChristian S.J. Peron return; 966b463eedSChristian S.J. Peron bd = malloc(size); 976b463eedSChristian S.J. Peron if (bd == NULL) { 986b463eedSChristian S.J. Peron warn("malloc failed"); 996b463eedSChristian S.J. Peron return; 1006b463eedSChristian S.J. Peron } 1016b463eedSChristian S.J. Peron if (sysctlbyname("net.bpf.stats", bd, &size, 1026b463eedSChristian S.J. Peron NULL, 0) < 0) { 1036b463eedSChristian S.J. Peron warn("net.bpf.stats"); 1046b463eedSChristian S.J. Peron free(bd); 1056b463eedSChristian S.J. Peron return; 1066b463eedSChristian S.J. Peron } 1076b463eedSChristian S.J. Peron printf("%5s %6s %6s %9s %9s %9s %5s %5s %s\n", 1086b463eedSChristian S.J. Peron "Pid", "Netif", "Flags", "Recv", "Drop", "Match", "Sblen", 1096b463eedSChristian S.J. Peron "Hblen", "Command"); 1106b463eedSChristian S.J. Peron for (d = &bd[0]; d < &bd[size / sizeof(*d)]; d++) { 1116b463eedSChristian S.J. Peron if (interface && strcmp(interface, d->bd_ifname) != 0) 1126b463eedSChristian S.J. Peron continue; 1136b463eedSChristian S.J. Peron bpf_flags(d, flagbuf); 1146b463eedSChristian S.J. Peron pname = bpf_pidname(d->bd_pid); 1156b463eedSChristian S.J. Peron printf("%5d %6s %6s %9lu %9lu %9lu %5d %5d %s\n", 1166b463eedSChristian S.J. Peron d->bd_pid, d->bd_ifname, flagbuf, 1176b463eedSChristian S.J. Peron d->bd_rcount, d->bd_dcount, d->bd_fcount, 1186b463eedSChristian S.J. Peron d->bd_slen, d->bd_hlen, pname); 1196b463eedSChristian S.J. Peron free(pname); 1206b463eedSChristian S.J. Peron } 12148d91509SChristian S.J. Peron free(bd); 1226b463eedSChristian S.J. Peron } 123