Implement --snaplen
authorEmil Mikulic <emikulic@gmail.com>
Wed, 12 Aug 2009 12:24:29 +0000 (22:24 +1000)
committerEmil Mikulic <emikulic@gmail.com>
Mon, 17 Aug 2009 08:48:31 +0000 (18:48 +1000)
cap.c
darkstat.8
darkstat.c
decode.c
decode.h

diff --git a/cap.c b/cap.c
index f304ec9..4d3ba51 100644 (file)
--- a/cap.c
+++ b/cap.c
@@ -28,7 +28,7 @@
 #include <string.h>
 #include <unistd.h>
 
-extern int want_pppoe, want_macs, want_hexdump;
+extern int want_pppoe, want_macs, want_hexdump, want_snaplen;
 
 /* The cap process life-cycle:
  *
@@ -52,7 +52,7 @@ void
 cap_init(const char *device, const char *filter, int promisc)
 {
    char errbuf[PCAP_ERRBUF_SIZE], *tmp_device;
-   int linktype, caplen;
+   int linktype, snaplen;
 
    /* pcap doesn't like device being const */
    tmp_device = xstrdup(device);
@@ -69,7 +69,7 @@ cap_init(const char *device, const char *filter, int promisc)
    if (pcap == NULL)
       errx(1, "pcap_open_live(): %s", errbuf);
 
-   /* Work out the linktype and what caplen it needs. */
+   /* Work out the linktype and what snaplen we need. */
    linktype = pcap_datalink(pcap);
    verbosef("linktype is %d", linktype);
    if ((linktype == DLT_EN10MB) && want_macs)
@@ -79,20 +79,23 @@ cap_init(const char *device, const char *filter, int promisc)
       errx(1, "unknown linktype %d", linktype);
    if (linkhdr->handler == NULL)
       errx(1, "no handler for linktype %d", linktype);
-   caplen = getcaplen(linkhdr);
+   snaplen = getsnaplen(linkhdr);
    if (want_pppoe) {
-      caplen += PPPOE_HDR_LEN;
+      snaplen += PPPOE_HDR_LEN;
       if (linktype != DLT_EN10MB)
          errx(1, "can't do PPPoE decoding on a non-Ethernet linktype");
    }
-   verbosef("caplen is %d", caplen);
+   verbosef("calculated snaplen minimum %d", snaplen);
+   if (want_snaplen > -1)
+      snaplen = want_snaplen;
+   verbosef("using snaplen %d", snaplen);
 
-   /* Close and re-open pcap to use the new caplen. */
+   /* Close and re-open pcap to use the new snaplen. */
    pcap_close(pcap);
    errbuf[0] = '\0'; /* zero length string */
    pcap = pcap_open_live(
       tmp_device,
-      caplen,
+      snaplen,
       promisc,
       CAP_TIMEOUT,
       errbuf);
index 2a7c4b4..7391531 100644 (file)
@@ -16,6 +16,8 @@ darkstat \- network statistics gatherer
 ] [
 .BI \-r " file"
 ] [
+.BI \-\-snaplen " bytes"
+] [
 .BI \-\-pppoe
 ] [
 .BI \-\-verbose
@@ -91,6 +93,12 @@ and
 arguments are mutually exclusive.
 .\"
 .TP
+.BI \-\-snaplen " bytes"
+How many bytes to capture of the start of each packet.
+You should not need to specify this;
+\fIdarkstat\fR will calculate it automatically.
+.\"
+.TP
 .BI \-\-pppoe
 Don't use this.
 .RS
index 14f4568..ab3a68c 100644 (file)
@@ -69,6 +69,9 @@ static void cb_interface(const char *arg) { interface = arg; }
 const char *capfile = NULL;
 static void cb_capfile(const char *arg) { capfile = arg; }
 
+int want_snaplen = -1;
+static void cb_snaplen(const char *arg) { want_snaplen = parsenum(arg, 0); }
+
 int want_pppoe = 0;
 static void cb_pppoe(const char *arg _unused_) { want_pppoe = 1; }
 
@@ -185,6 +188,7 @@ struct cmdline_arg {
 static struct cmdline_arg cmdline_args[] = {
    {"-i",             "interface",       cb_interface,    0},
    {"-r",             "file",            cb_capfile,      0},
+   {"--snaplen",      "bytes",           cb_snaplen,      0},
    {"--pppoe",        NULL,              cb_pppoe,        0},
    {"--verbose",      NULL,              cb_verbose,      0},
    {"--no-daemon",    NULL,              cb_no_daemon,    0},
index 57e62c6..54ada43 100644 (file)
--- a/decode.c
+++ b/decode.c
@@ -107,11 +107,11 @@ getlinkhdr(int linktype)
 }
 
 /*
- * Returns the minimum caplen needed to decode everything up to the TCP/UDP
+ * Returns the minimum snaplen needed to decode everything up to the TCP/UDP
  * packet headers.  Argument lh is not allowed to be NULL.
  */
 int
-getcaplen(const linkhdr_t *lh)
+getsnaplen(const linkhdr_t *lh)
 {
    assert(lh != NULL);
    return (lh->hdrlen + IP_HDR_LEN + max(TCP_HDR_LEN, UDP_HDR_LEN));
index 31a9fa1..abc4715 100644 (file)
--- a/decode.h
+++ b/decode.h
@@ -31,7 +31,7 @@ typedef struct {
 } linkhdr_t;
 
 const linkhdr_t *getlinkhdr(int linktype);
-int getcaplen(const linkhdr_t *lh);
+int getsnaplen(const linkhdr_t *lh);
 char *ip_to_str(const in_addr_t ip);
 
 typedef struct {