SCFree(p);
}
+/**
+ * \brief Finalize decoding of a packet
+ *
+ * This function needs to be call at the end of decode
+ * functions when decoding has been succesful.
+ *
+ */
+
+void PacketDecodeFinalize(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p)
+{
+
+ if (p->flags & PKT_IS_INVALID)
+ SCPerfCounterIncr(dtv->counter_invalid, tv->sc_perf_pca);
+
+#ifdef __SC_CUDA_SUPPORT__
+ if (dtv->cuda_vars.mpm_is_cuda)
+ CudaBufferPacket(&dtv->cuda_vars, p);
+#endif
+
+}
+
/**
* \brief Get a malloced packet.
*
#endif
dtv->counter_bytes = SCPerfTVRegisterCounter("decoder.bytes", tv,
SC_PERF_TYPE_UINT64, "NULL");
+
+ dtv->counter_invalid = SCPerfTVRegisterCounter("decoder.invalid", tv,
+ SC_PERF_TYPE_UINT64, "NULL");
#if 0
dtv->counter_bytes_per_sec = SCPerfTVRegisterIntervalCounter("decoder.bytes_per_sec",
tv, SC_PERF_TYPE_DOUBLE,
uint16_t counter_pkts;
uint16_t counter_pkts_per_sec;
uint16_t counter_bytes;
+ uint16_t counter_invalid;
uint16_t counter_bytes_per_sec;
uint16_t counter_mbit_per_sec;
uint16_t counter_ipv4;
void PacketDefragPktSetupParent(Packet *parent);
Packet *PacketGetFromQueueOrAlloc(void);
Packet *PacketGetFromAlloc(void);
+void PacketDecodeFinalize(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p);
void PacketFree(Packet *p);
void PacketFreeOrRelease(Packet *p);
int PacketCopyData(Packet *p, uint8_t *pktdata, int pktlen);
} \
} while(0)
+#define ENGINE_SET_INVALID_EVENT(p, e) do { \
+ p->flags |= PKT_IS_INVALID; \
+ ENGINE_SET_EVENT(p, e); \
+} while(0)
+
+
+
#define ENGINE_ISSET_EVENT(p, e) ({ \
int r = 0; \
uint8_t u; \
#define PKT_HOST_DST_LOOKED_UP (1<<18)
#define PKT_IS_FRAGMENT (1<<19) /**< Packet is a fragment */
+#define PKT_IS_INVALID (1<<20)
/** \brief return 1 if the packet is a pseudo packet */
#define PKT_IS_PSEUDOPKT(p) ((p)->flags & PKT_PSEUDO_STREAM_END)
break;
}
-#ifdef __SC_CUDA_SUPPORT__
- if (dtv->cuda_vars.mpm_is_cuda)
- CudaBufferPacket(&dtv->cuda_vars, p);
-#endif
+ PacketDecodeFinalize(tv, dtv, p);
SCReturnInt(TM_ECODE_OK);
}
break;
}
+ PacketDecodeFinalize(tv, dtv, p);
+
SCReturnInt(TM_ECODE_OK);
}
DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq);
+ PacketDecodeFinalize(tv, dtv, p);
+
SCReturnInt(TM_ECODE_OK);
}
SCReturnInt(TM_ECODE_FAILED);
}
+ PacketDecodeFinalize(tv, dtv, p);
+
SCReturnInt(TM_ECODE_OK);
}
/* call the decoder */
DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq);
-
+
+ PacketDecodeFinalize(tv, dtv, p);
+
SCReturnInt(TM_ECODE_OK);
}
p->datalink);
break;
}
+
+ PacketDecodeFinalize(tv, dtv, p);
+
SCReturnInt(TM_ECODE_OK);
}
SCLogDebug("packet unsupported by NFQ, first byte: %02x", *GET_PKT_DATA(p));
}
+ PacketDecodeFinalize(tv, dtv, p);
+
return TM_ECODE_OK;
}
BUG_ON(p->pkt_src != PKT_SRC_WIRE && p->pkt_src != PKT_SRC_FFR_V2);
#endif
-#ifdef __SC_CUDA_SUPPORT__
- if (dtv->cuda_vars.mpm_is_cuda)
- CudaBufferPacket(&dtv->cuda_vars, p);
-#endif
+ PacketDecodeFinalize(tv, dtv, p);
SCReturnInt(TM_ECODE_OK);
}
break;
}
-#ifdef __SC_CUDA_SUPPORT__
- if (dtv->cuda_vars.mpm_is_cuda)
- CudaBufferPacket(&dtv->cuda_vars, p);
-#endif
+ PacketDecodeFinalize(tv, dtv, p);
SCReturnInt(TM_ECODE_OK);
}
DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq);
-#ifdef __SC_CUDA_SUPPORT__
- if (dtv->cuda_vars.mpm_is_cuda)
- CudaBufferPacket(&dtv->cuda_vars, p);
-#endif
+ PacketDecodeFinalize(tv, dtv, p);
return TM_ECODE_OK;
}
#include "util-debug.h"
#include "util-error.h"
#include "util-profiling.h"
+#include "util-device.h"
static RingBuffer16 *ringbuffer = NULL;
/**