From: Jason Ish Date: Thu, 17 Jul 2014 16:21:32 +0000 (-0600) Subject: Add MPLS counter. X-Git-Tag: suricata-2.1beta2~73 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3e3ab2dc9fc802957c33e3bee5c59faaca6154e6;p=thirdparty%2Fsuricata.git Add MPLS counter. Check length before decoding each label. --- diff --git a/src/decode-mpls.c b/src/decode-mpls.c index f8f6993d7c..6e1da668f7 100644 --- a/src/decode-mpls.c +++ b/src/decode-mpls.c @@ -34,19 +34,22 @@ int DecodeMPLS(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq) { - if (len < MPLS_HEADER_LEN) { - return TM_ECODE_FAILED; - } - uint32_t shim; + uint8_t ip_ver; + + SCPerfCounterIncr(dtv->counter_mpls, tv->sc_perf_pca); + do { + if (len < MPLS_HEADER_LEN) { + return TM_ECODE_FAILED; + } shim = *(uint32_t *)pkt; pkt += MPLS_HEADER_LEN; len -= MPLS_HEADER_LEN; } while (MPLS_BOTTOM(shim) == 0); /* Best guess at inner packet. */ - uint8_t ip_ver = pkt[0] >> 4; + ip_ver = pkt[0] >> 4; switch (ip_ver) { case MPLS_PROTO_IPV4: diff --git a/src/decode.c b/src/decode.c index ae2041bc71..8ad78bcf32 100644 --- a/src/decode.c +++ b/src/decode.c @@ -400,6 +400,8 @@ void DecodeRegisterPerfCounters(DecodeThreadVars *dtv, ThreadVars *tv) SC_PERF_TYPE_UINT64, "NULL"); dtv->counter_ipv6inipv6 = SCPerfTVRegisterCounter("decoder.ipv6_in_ipv6", tv, SC_PERF_TYPE_UINT64, "NULL"); + dtv->counter_mpls = SCPerfTVRegisterCounter("decoder.mpls", tv, + SC_PERF_TYPE_UINT64, "NULL"); dtv->counter_avg_pkt_size = SCPerfTVRegisterAvgCounter("decoder.avg_pkt_size", tv, SC_PERF_TYPE_UINT64, "NULL"); dtv->counter_max_pkt_size = SCPerfTVRegisterMaxCounter("decoder.max_pkt_size", tv, diff --git a/src/decode.h b/src/decode.h index ce2f42d314..98839be6bc 100644 --- a/src/decode.h +++ b/src/decode.h @@ -597,6 +597,7 @@ typedef struct DecodeThreadVars_ uint16_t counter_vlan_qinq; uint16_t counter_pppoe; uint16_t counter_teredo; + uint16_t counter_mpls; uint16_t counter_ipv4inipv6; uint16_t counter_ipv6inipv6; uint16_t counter_avg_pkt_size;