Ignore IPv6 packets with extension headers.
authorEmil Mikulic <emikulic@gmail.com>
Sun, 1 Jul 2012 15:11:37 +0000 (01:11 +1000)
committerEmil Mikulic <emikulic@gmail.com>
Sun, 8 Jul 2012 07:55:59 +0000 (17:55 +1000)
Previously we would emit "unknown proto" warnings.

acct.c
decode.c

diff --git a/acct.c b/acct.c
index 653fbef..bfdf1a1 100644 (file)
--- a/acct.c
+++ b/acct.c
@@ -265,16 +265,12 @@ acct_for(const struct pktsummary * const sm)
       }
       break;
 
       }
       break;
 
-   case IPPROTO_ICMP:
-   case IPPROTO_ICMPV6:
-   case IPPROTO_AH:
-   case IPPROTO_ESP:
-   case IPPROTO_OSPF:
-      /* known protocol, don't complain about it */
+   case IPPROTO_INVALID:
+      /* proto decoding failed, don't complain in accounting */
       break;
 
    default:
       break;
 
    default:
-      verbosef("unknown IP proto (%04x)", sm->proto);
+      verbosef("acct_for: unknown IP protocol 0x%02x", sm->proto);
    }
 }
 
    }
 }
 
index d7d353f..0b54f4d 100644 (file)
--- a/decode.c
+++ b/decode.c
@@ -423,7 +423,22 @@ decode_ipv6(const u_char *pdata, const uint32_t len, struct pktsummary *sm)
    sm->dst.family = IPv6;
    memcpy(&sm->dst.ip.v6, &hdr->ip6_dst, sizeof(sm->dst.ip.v6));
 
    sm->dst.family = IPv6;
    memcpy(&sm->dst.ip.v6, &hdr->ip6_dst, sizeof(sm->dst.ip.v6));
 
-   decode_ip_payload(pdata + IPV6_HDR_LEN, len - IPV6_HDR_LEN, sm);
+   /* Ignore this packet if it uses extension headers. */
+   switch (sm->proto) {
+      case 0: /* Hop-by-Hop Options */
+      case IPPROTO_NONE:
+      case IPPROTO_DSTOPTS:
+      case IPPROTO_ROUTING:
+      case IPPROTO_FRAGMENT:
+      case IPPROTO_AH:
+      case IPPROTO_ESP:
+      case 135: /* Mobility */
+         sm->proto = IPPROTO_INVALID; /* don't do accounting! */
+         return;
+
+      default:
+         decode_ip_payload(pdata + IPV6_HDR_LEN, len - IPV6_HDR_LEN, sm);
+   }
 }
 
 static void
 }
 
 static void
@@ -458,11 +473,11 @@ decode_ip_payload(const u_char *pdata, const uint32_t len,
       }
 
       case IPPROTO_ICMP:
       }
 
       case IPPROTO_ICMP:
+      case IPPROTO_IGMP:
       case IPPROTO_ICMPV6:
       case IPPROTO_ICMPV6:
-      case IPPROTO_AH:
-      case IPPROTO_ESP:
       case IPPROTO_OSPF:
          /* known protocol, don't complain about it */
       case IPPROTO_OSPF:
          /* known protocol, don't complain about it */
+         sm->proto = IPPROTO_INVALID; /* also don't do accounting */
          break;
 
       default:
          break;
 
       default: