Check length before decoding each label.
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:
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,
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;