diff --git a/src/decode.c b/src/decode.c index c79beda318..e12d3dca5d 100644 --- a/src/decode.c +++ b/src/decode.c @@ -87,13 +87,24 @@ void DecodeRegisterPerfCounters(DecodeThreadVars *dtv, ThreadVars *tv) dtv->counter_max_pkt_size = SCPerfTVRegisterMaxCounter("decoder.max_pkt_size", tv, SC_PERF_TYPE_UINT64, "NULL"); - dtv->counter_defrag_fragments = SCPerfTVRegisterCounter("defrag.fragments", - tv, SC_PERF_TYPE_UINT64, "NULL"); - dtv->counter_defrag_reassembled = - SCPerfTVRegisterCounter("defrag.reassembled", tv, SC_PERF_TYPE_UINT64, - "NULL"); - dtv->counter_defrag_timeouts = SCPerfTVRegisterCounter("defrag.timeouts", - tv, SC_PERF_TYPE_UINT64, "NULL"); + dtv->counter_defrag_ipv4_fragments = + SCPerfTVRegisterCounter("defrag.ipv4.fragments", tv, + SC_PERF_TYPE_UINT64, "NULL"); + dtv->counter_defrag_ipv4_reassembled = + SCPerfTVRegisterCounter("defrag.ipv4.reassembled", tv, + SC_PERF_TYPE_UINT64, "NULL"); + dtv->counter_defrag_ipv4_timeouts = + SCPerfTVRegisterCounter("defrag.ipv4.timeouts", tv, + SC_PERF_TYPE_UINT64, "NULL"); + dtv->counter_defrag_ipv6_fragments = + SCPerfTVRegisterCounter("defrag.ipv6.fragments", tv, + SC_PERF_TYPE_UINT64, "NULL"); + dtv->counter_defrag_ipv6_reassembled = + SCPerfTVRegisterCounter("defrag.ipv6.reassembled", tv, + SC_PERF_TYPE_UINT64, "NULL"); + dtv->counter_defrag_ipv6_timeouts = + SCPerfTVRegisterCounter("defrag.ipv6.timeouts", tv, + SC_PERF_TYPE_UINT64, "NULL"); tv->sc_perf_pca = SCPerfGetAllCountersArray(&tv->sc_perf_pctx); SCPerfAddToClubbedTMTable(tv->name, &tv->sc_perf_pctx); diff --git a/src/decode.h b/src/decode.h index bd5f840b30..d6fe753410 100644 --- a/src/decode.h +++ b/src/decode.h @@ -353,9 +353,12 @@ typedef struct DecodeThreadVars_ uint16_t counter_max_pkt_size; /** frag stats - defrag runs in the context of the decoder. */ - uint16_t counter_defrag_fragments; - uint16_t counter_defrag_reassembled; - uint16_t counter_defrag_timeouts; + uint16_t counter_defrag_ipv4_fragments; + uint16_t counter_defrag_ipv4_reassembled; + uint16_t counter_defrag_ipv4_timeouts; + uint16_t counter_defrag_ipv6_fragments; + uint16_t counter_defrag_ipv6_reassembled; + uint16_t counter_defrag_ipv6_timeouts; } DecodeThreadVars; /* clear key vars so we don't need to call the expensive diff --git a/src/defrag.c b/src/defrag.c index 741a304c19..38ac1c6049 100644 --- a/src/defrag.c +++ b/src/defrag.c @@ -921,13 +921,20 @@ insert: } if (tracker->seen_last) { - if (tracker->af == AF_INET) + if (tracker->af == AF_INET) { r = Defrag4Reassemble(tv, dc, tracker, p); - else if (tracker->af == AF_INET6) + if (r != NULL && tv != NULL && dtv != NULL) { + SCPerfCounterIncr(dtv->counter_defrag_ipv4_reassembled, + tv->sc_perf_pca); + } + } + else if (tracker->af == AF_INET6) { r = Defrag6Reassemble(tv, dc, tracker, p); - } - if (r != NULL && tv != NULL && dtv != NULL) { - SCPerfCounterIncr(dtv->counter_defrag_reassembled, tv->sc_perf_pca); + if (r != NULL && tv != NULL && dtv != NULL) { + SCPerfCounterIncr(dtv->counter_defrag_ipv6_reassembled, + tv->sc_perf_pca); + } + } } done: @@ -964,8 +971,14 @@ DefragTimeoutTracker(ThreadVars *tv, DecodeThreadVars *dtv, DefragContext *dc, DefragTrackerReset(tracker); PoolReturn(dc->tracker_pool, tracker); if (tv != NULL && dtv != NULL) { - SCPerfCounterIncr(dtv->counter_defrag_timeouts, - tv->sc_perf_pca); + if (tracker->af == AF_INET) { + SCPerfCounterIncr(dtv->counter_defrag_ipv4_timeouts, + tv->sc_perf_pca); + } + else if (tracker->af == AF_INET6) { + SCPerfCounterIncr(dtv->counter_defrag_ipv6_timeouts, + tv->sc_perf_pca); + } } return; } @@ -1068,7 +1081,14 @@ Defrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragContext *dc, Packet *p) } if (tv != NULL && dtv != NULL) { - SCPerfCounterIncr(dtv->counter_defrag_fragments, tv->sc_perf_pca); + if (af == AF_INET) { + SCPerfCounterIncr(dtv->counter_defrag_ipv4_fragments, + tv->sc_perf_pca); + } + else if (af == AF_INET6) { + SCPerfCounterIncr(dtv->counter_defrag_ipv6_fragments, + tv->sc_perf_pca); + } } /* Create a lookup key. */