]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
pf_ring: avoid to ask for extended header. 489/head
authorEric Leblond <eric@regit.org>
Thu, 1 Aug 2013 10:16:05 +0000 (12:16 +0200)
committerEric Leblond <eric@regit.org>
Thu, 1 Aug 2013 13:16:15 +0000 (15:16 +0200)
This patch update pf_ring capture to avoid to ask for extended
header. They are only needed when rxonly checksum checks is used
and this is only possible when interface is not a DNA interface.

src/source-pfring.c

index d26b0a4714aa8045dfae69b77eef8c166b6c4680..68abec6feda5105c50d785bcadf7c978be8d8972 100644 (file)
@@ -360,6 +360,7 @@ TmEcode ReceivePfringThreadInit(ThreadVars *tv, void *initdata, void **data) {
     int rc;
     u_int32_t version = 0;
     PfringIfaceConfig *pfconf = (PfringIfaceConfig *) initdata;
+    unsigned int opflag;
 
 
     if (pfconf == NULL)
@@ -383,9 +384,23 @@ TmEcode ReceivePfringThreadInit(ThreadVars *tv, void *initdata, void **data) {
         SCReturnInt(TM_ECODE_FAILED);
     }
 
+    ptv->checksum_mode = pfconf->checksum_mode;
+
+    opflag = PF_RING_REENTRANT | PF_RING_PROMISC;
+
+    if (ptv->checksum_mode == CHECKSUM_VALIDATION_RXONLY) {
+        if (strncmp(ptv->interface, "dna", 3) == 0) {
+            SCLogWarning(SC_ERR_INVALID_VALUE,
+                         "Can't use rxonly checksum-checks on DNA interface,"
+                         " resetting to auto");
+            ptv->checksum_mode = CHECKSUM_VALIDATION_AUTO;
+        } else {
+            opflag |= PF_RING_LONG_HEADER;
+        }
+    }
+
 #ifdef HAVE_PFRING_OPEN_NEW
-    ptv->pd = pfring_open(ptv->interface, (uint32_t)default_packet_size,
-                          PF_RING_REENTRANT | PF_RING_LONG_HEADER | PF_RING_PROMISC);
+    ptv->pd = pfring_open(ptv->interface, (uint32_t)default_packet_size, opflag);
 #else
     ptv->pd = pfring_open(ptv->interface, LIBPFRING_PROMISC, (uint32_t)default_packet_size, LIBPFRING_REENTRANT);
 #endif
@@ -399,8 +414,6 @@ TmEcode ReceivePfringThreadInit(ThreadVars *tv, void *initdata, void **data) {
         pfring_version(ptv->pd, &version);
     }
 
-    ptv->checksum_mode = pfconf->checksum_mode;
-
     /* We only set cluster info if the number of pfring threads is greater than 1 */
     ptv->threads = pfconf->threads;