24#ifndef SURICATA_DECODE_H
25#define SURICATA_DECODE_H
99#define SignatureMask uint8_t
102struct DetectionEngineThreadCtx_;
122#define addr_data32 address.address_un_data32
123#define addr_data16 address.address_un_data16
124#define addr_data8 address.address_un_data8
125#define addr_in6addr address.address_un_in6
127#define COPY_ADDRESS(a, b) do { \
128 (b)->family = (a)->family; \
129 (b)->addr_data32[0] = (a)->addr_data32[0]; \
130 (b)->addr_data32[1] = (a)->addr_data32[1]; \
131 (b)->addr_data32[2] = (a)->addr_data32[2]; \
132 (b)->addr_data32[3] = (a)->addr_data32[3]; \
140#define SET_IPV4_SRC_ADDR(ip4h, a) \
142 (a)->family = AF_INET; \
143 (a)->addr_data32[0] = (uint32_t)(ip4h)->s_ip_src.s_addr; \
144 (a)->addr_data32[1] = 0; \
145 (a)->addr_data32[2] = 0; \
146 (a)->addr_data32[3] = 0; \
149#define SET_IPV4_DST_ADDR(ip4h, a) \
151 (a)->family = AF_INET; \
152 (a)->addr_data32[0] = (uint32_t)(ip4h)->s_ip_dst.s_addr; \
153 (a)->addr_data32[1] = 0; \
154 (a)->addr_data32[2] = 0; \
155 (a)->addr_data32[3] = 0; \
159#define SET_IPV6_SRC_ADDR(ip6h, a) \
161 (a)->family = AF_INET6; \
162 (a)->addr_data32[0] = (ip6h)->s_ip6_src[0]; \
163 (a)->addr_data32[1] = (ip6h)->s_ip6_src[1]; \
164 (a)->addr_data32[2] = (ip6h)->s_ip6_src[2]; \
165 (a)->addr_data32[3] = (ip6h)->s_ip6_src[3]; \
168#define SET_IPV6_DST_ADDR(ip6h, a) \
170 (a)->family = AF_INET6; \
171 (a)->addr_data32[0] = (ip6h)->s_ip6_dst[0]; \
172 (a)->addr_data32[1] = (ip6h)->s_ip6_dst[1]; \
173 (a)->addr_data32[2] = (ip6h)->s_ip6_dst[2]; \
174 (a)->addr_data32[3] = (ip6h)->s_ip6_dst[3]; \
179#define SET_TCP_SRC_PORT(pkt, prt) do { \
180 SET_PORT(TCP_GET_SRC_PORT((pkt)), *(prt)); \
183#define SET_TCP_DST_PORT(pkt, prt) do { \
184 SET_PORT(TCP_GET_DST_PORT((pkt)), *(prt)); \
189#define SET_UDP_SRC_PORT(pkt, prt) do { \
190 SET_PORT(UDP_GET_SRC_PORT((pkt)), *(prt)); \
192#define SET_UDP_DST_PORT(pkt, prt) do { \
193 SET_PORT(UDP_GET_DST_PORT((pkt)), *(prt)); \
196#define GET_IPV4_SRC_ADDR_U32(p) ((p)->src.addr_data32[0])
197#define GET_IPV4_DST_ADDR_U32(p) ((p)->dst.addr_data32[0])
198#define GET_IPV4_SRC_ADDR_PTR(p) ((p)->src.addr_data32)
199#define GET_IPV4_DST_ADDR_PTR(p) ((p)->dst.addr_data32)
201#define GET_IPV6_SRC_IN6ADDR(p) ((p)->src.addr_in6addr)
202#define GET_IPV6_DST_IN6ADDR(p) ((p)->dst.addr_in6addr)
203#define GET_IPV6_SRC_ADDR(p) ((p)->src.addr_data32)
204#define GET_IPV6_DST_ADDR(p) ((p)->dst.addr_data32)
205#define GET_TCP_SRC_PORT(p) ((p)->sp)
206#define GET_TCP_DST_PORT(p) ((p)->dp)
208#define GET_PKT_LEN(p) (p)->pktlen
209#define GET_PKT_DATA(p) (((p)->ext_pkt == NULL) ? GET_PKT_DIRECT_DATA(p) : (p)->ext_pkt)
210#define GET_PKT_DIRECT_DATA(p) (p)->pkt_data
211#define GET_PKT_DIRECT_MAX_SIZE(p) (default_packet_size)
213#define SET_PKT_LEN(p, len) do { \
214 (p)->pktlen = (len); \
219#define SET_PORT(v, p) ((p) = (v))
220#define COPY_PORT(a,b) ((b) = (a))
222#define CMP_ADDR(a1, a2) \
223 (((a1)->addr_data32[3] == (a2)->addr_data32[3] && \
224 (a1)->addr_data32[2] == (a2)->addr_data32[2] && \
225 (a1)->addr_data32[1] == (a2)->addr_data32[1] && \
226 (a1)->addr_data32[0] == (a2)->addr_data32[0]))
227#define CMP_PORT(p1, p2) \
232#define IP_GET_RAW_VER(pkt) ((((pkt)[0] & 0xf0) >> 4))
234#define PKT_IS_TCP(p) (((p)->tcph != NULL))
235#define PKT_IS_UDP(p) (((p)->udph != NULL))
236#define PKT_IS_ICMPV4(p) (((p)->icmpv4h != NULL))
237#define PKT_IS_ICMPV6(p) (((p)->icmpv6h != NULL))
238#define PKT_IS_TOSERVER(p) (((p)->flowflags & FLOW_PKT_TOSERVER))
239#define PKT_IS_TOCLIENT(p) (((p)->flowflags & FLOW_PKT_TOCLIENT))
266#define PACKET_ALERT_FLAG_APPLY_ACTION_TO_FLOW BIT_U8(0)
268#define PACKET_ALERT_FLAG_STATE_MATCH BIT_U8(1)
270#define PACKET_ALERT_FLAG_STREAM_MATCH BIT_U8(2)
272#define PACKET_ALERT_FLAG_TX BIT_U8(3)
274#define PACKET_ALERT_FLAG_RATE_FILTER_MODIFIED BIT_U8(4)
276#define PACKET_ALERT_FLAG_FRAME BIT_U8(5)
278#define PACKET_ALERT_FLAG_TX_GUESSED BIT_U8(6)
280#define PACKET_ALERT_FLAG_APPLY_ACTION_TO_PACKET BIT_U8(7)
284#define PACKET_ALERT_MAX 15
303#define PACKET_ENGINE_EVENT_MAX 15
328#ifdef PROFILE_LOCKING
575 WinDivertPacketVars windivert_v;
692static inline bool PacketIsIPv4(
const Packet *p);
693static inline bool PacketIsIPv6(
const Packet *p);
696#define DEFAULT_MTU 1500
697#define MINIMUM_MTU 68
699#define DEFAULT_PACKET_SIZE (DEFAULT_MTU + ETHERNET_HEADER_LEN)
701#define MAX_PAYLOAD_SIZE (IPV6_HEADER_LEN + 65536 + 28)
703#define SIZE_OF_PACKET (default_packet_size + sizeof(Packet))
705static inline bool PacketIsIPv4(
const Packet *p)
716static inline IPV4Hdr *PacketSetIPV4(
Packet *p,
const uint8_t *buf)
725static inline uint8_t PacketGetIPProto(
const Packet *p)
730 if (PacketIsIPv4(p)) {
731 const IPV4Hdr *hdr = PacketGetIPv4(p);
733 }
else if (PacketIsIPv6(p)) {
739static inline uint8_t PacketGetIPv4IPProto(
const Packet *p)
741 if (PacketGetIPv4(p)) {
742 const IPV4Hdr *hdr = PacketGetIPv4(p);
754static inline IPV6Hdr *PacketSetIPV6(
Packet *p,
const uint8_t *buf)
762static inline bool PacketIsIPv6(
const Packet *p)
767static inline void PacketClearL2(
Packet *p)
769 memset(&p->
l2, 0,
sizeof(p->
l2));
773static inline EthernetHdr *PacketSetEthernet(
Packet *p,
const uint8_t *buf)
781static inline const EthernetHdr *PacketGetEthernet(
const Packet *p)
787static inline bool PacketIsEthernet(
const Packet *p)
792static inline void PacketClearL3(
Packet *p)
794 memset(&p->
l3, 0,
sizeof(p->
l3));
797static inline void PacketClearL4(
Packet *p)
799 memset(&p->
l4, 0,
sizeof(p->
l4));
802static inline TCPHdr *PacketSetTCP(
Packet *p,
const uint8_t *buf)
810static inline const TCPHdr *PacketGetTCP(
const Packet *p)
816static inline bool PacketIsTCP(
const Packet *p)
821static inline UDPHdr *PacketSetUDP(
Packet *p,
const uint8_t *buf)
829static inline const UDPHdr *PacketGetUDP(
const Packet *p)
835static inline bool PacketIsUDP(
const Packet *p)
854static inline bool PacketIsICMPv4(
const Packet *p)
859static inline const IPV4Hdr *PacketGetICMPv4EmbIPv4(
const Packet *p)
861 const uint8_t *start = (
const uint8_t *)PacketGetICMPv4(p);
880static inline bool PacketIsICMPv6(
const Packet *p)
885static inline SCTPHdr *PacketSetSCTP(
Packet *p,
const uint8_t *buf)
893static inline const SCTPHdr *PacketGetSCTP(
const Packet *p)
899static inline bool PacketIsSCTP(
const Packet *p)
904static inline GREHdr *PacketSetGRE(
Packet *p,
const uint8_t *buf)
912static inline const GREHdr *PacketGetGRE(
const Packet *p)
918static inline bool PacketIsGRE(
const Packet *p)
923static inline ESPHdr *PacketSetESP(
Packet *p,
const uint8_t *buf)
931static inline const ESPHdr *PacketGetESP(
const Packet *p)
937static inline bool PacketIsESP(
const Packet *p)
942static inline const ARPHdr *PacketGetARP(
const Packet *p)
948static inline ARPHdr *PacketSetARP(
Packet *p,
const uint8_t *buf)
956static inline bool PacketIsARP(
const Packet *p)
1063#define PACKET_CLEAR_L4VARS(p) do { \
1064 memset(&(p)->l4vars, 0x00, sizeof((p)->l4vars)); \
1068#define PACKET_FREE_EXTDATA(p) do { \
1069 if ((p)->ext_pkt) { \
1070 if (!((p)->flags & PKT_ZERO_COPY)) { \
1071 SCFree((p)->ext_pkt); \
1073 (p)->ext_pkt = NULL; \
1077#define TUNNEL_INCR_PKT_RTV_NOLOCK(p) do { \
1078 ((p)->root ? (p)->root->tunnel_rtv_cnt++ : (p)->tunnel_rtv_cnt++); \
1081static inline void TUNNEL_INCR_PKT_TPR(
Packet *p)
1089#define TUNNEL_PKT_RTV(p) ((p)->root ? (p)->root->tunnel_rtv_cnt : (p)->tunnel_rtv_cnt)
1090#define TUNNEL_PKT_TPR(p) ((p)->root ? (p)->root->tunnel_tpr_cnt : (p)->tunnel_tpr_cnt)
1092static inline bool PacketTunnelIsVerdicted(
const Packet *p)
1096static inline void PacketTunnelSetVerdicted(
Packet *p)
1174 uint16_t hdrextlen, uint16_t plen,
1175 uint16_t prev_hdrextlen);
1181 const uint8_t *pkt, uint32_t
len);
1186#define ENGINE_SET_EVENT(p, e) do { \
1187 SCLogDebug("p %p event %d", (p), e); \
1188 if ((p)->events.cnt < PACKET_ENGINE_EVENT_MAX) { \
1189 (p)->events.events[(p)->events.cnt] = e; \
1190 (p)->events.cnt++; \
1194#define ENGINE_SET_INVALID_EVENT(p, e) do { \
1195 p->flags |= PKT_IS_INVALID; \
1196 ENGINE_SET_EVENT(p, e); \
1199#define ENGINE_ISSET_EVENT(p, e) ({ \
1202 for (u = 0; u < (p)->events.cnt; u++) { \
1203 if ((p)->events.events[u] == (e)) { \
1212#define IPPROTO_IPIP 4
1220#define IPPROTO_DCCP 33
1228#define IPPROTO_SCTP 132
1232#define IPPROTO_MH 135
1237#define IPPROTO_HIP 139
1240#ifndef IPPROTO_SHIM6
1241#define IPPROTO_SHIM6 140
1247#define PKT_NOPACKET_INSPECTION BIT_U32(0)
1249#define PKT_PPP_VJ_UCOMP BIT_U32(1)
1252#define PKT_NOPAYLOAD_INSPECTION BIT_U32(2)
1255#define PKT_ALERT_CTX_USED BIT_U32(3)
1258#define PKT_HAS_TAG BIT_U32(4)
1260#define PKT_STREAM_ADD BIT_U32(5)
1262#define PKT_STREAM_EST BIT_U32(6)
1266#define PKT_HAS_FLOW BIT_U32(8)
1268#define PKT_PSEUDO_STREAM_END BIT_U32(9)
1271#define PKT_STREAM_MODIFIED BIT_U32(10)
1277#define PKT_STREAM_NOPCAPLOG BIT_U32(12)
1282#define PKT_IGNORE_CHECKSUM BIT_U32(15)
1284#define PKT_ZERO_COPY BIT_U32(16)
1286#define PKT_HOST_SRC_LOOKED_UP BIT_U32(17)
1287#define PKT_HOST_DST_LOOKED_UP BIT_U32(18)
1290#define PKT_IS_FRAGMENT BIT_U32(19)
1291#define PKT_IS_INVALID BIT_U32(20)
1292#define PKT_PROFILE BIT_U32(21)
1296#define PKT_WANTS_FLOW BIT_U32(22)
1299#define PKT_PROTO_DETECT_TS_DONE BIT_U32(23)
1300#define PKT_PROTO_DETECT_TC_DONE BIT_U32(24)
1302#define PKT_REBUILT_FRAGMENT \
1305#define PKT_DETECT_HAS_STREAMDATA \
1308#define PKT_PSEUDO_DETECTLOG_FLUSH BIT_U32(27)
1312#define PKT_STREAM_NO_EVENTS BIT_U32(28)
1315#define PKT_FIRST_ALERTS BIT_U32(29)
1316#define PKT_FIRST_TAG BIT_U32(30)
1318#define PKT_PSEUDO_LOG_FLUSH BIT_U32(31)
1321#define PKT_IS_PSEUDOPKT(p) \
1322 ((p)->flags & (PKT_PSEUDO_STREAM_END|PKT_PSEUDO_DETECTLOG_FLUSH))
1323#define PKT_IS_FLUSHPKT(p) ((p)->flags & (PKT_PSEUDO_LOG_FLUSH))
1325#define PKT_SET_SRC(p, src_val) ((p)->pkt_src = src_val)
1327#define PKT_DEFAULT_MAX_DECODED_LAYERS 16
1330static inline bool PacketIncreaseCheckLayers(
Packet *p)
1344static inline void DecodeSetNoPayloadInspectionFlag(
Packet *p)
1353static inline void DecodeSetNoPacketInspectionFlag(
Packet *p)
1358static inline bool PacketIsTunnelRoot(
const Packet *p)
1363static inline bool PacketIsTunnelChild(
const Packet *p)
1368static inline bool PacketIsTunnel(
const Packet *p)
1373static inline bool PacketIsNotTunnel(
const Packet *p)
1378static inline bool VerdictTunnelPacketInternal(
const Packet *p)
1381 SCLogDebug(
"tunnel: outstanding %u", outstanding);
1384 if (PacketIsTunnelRoot(p) && !PacketTunnelIsVerdicted(p) && !outstanding) {
1388 }
else if (PacketIsTunnelChild(p) && outstanding == 1 && p->
root &&
1389 PacketTunnelIsVerdicted(p->
root)) {
1408static inline bool VerdictTunnelPacket(
Packet *p)
1413 verdict = VerdictTunnelPacketInternal(p);
1419 const int datalink,
Packet *p,
const uint8_t *data,
const uint32_t
len)
1447 "%" PRId32
" not yet supported",
1456 const uint16_t
proto,
Packet *p,
const uint8_t *data,
const uint32_t
len)
1460 uint16_t ip_len = (
len < USHRT_MAX) ? (uint16_t)
len : (uint16_t)USHRT_MAX;
1465 uint16_t ip_len = (
len < USHRT_MAX) ? (uint16_t)
len : (uint16_t)USHRT_MAX;
void StatsIncr(ThreadVars *tv, uint16_t id)
Increments the local counter.
#define ETHERNET_TYPE_ARP
#define ETHERNET_TYPE_8021QINQ
#define ETHERNET_DCE_HEADER_LEN
#define ETHERNET_TYPE_DCE
#define ETHERNET_TYPE_IPV6
#define ETHERNET_TYPE_VNTAG
#define ETHERNET_TYPE_8021AD
#define ETHERNET_TYPE_PPPOE_SESS
#define ETHERNET_TYPE_NSH
#define ETHERNET_TYPE_PPPOE_DISC
#define ETHERNET_TYPE_8021AH
@ GENERIC_TOO_MANY_LAYERS
@ ETHERNET_UNKNOWN_ETHERTYPE
@ VLAN_HEADER_TOO_MANY_LAYERS
#define IPV4_GET_RAW_IPPROTO(ip4h)
#define IPV6_GET_L4PROTO(p)
#define ETHERNET_TYPE_MPLS_MULTICAST
#define ETHERNET_TYPE_MPLS_UNICAST
#define VLAN_MAX_LAYER_IDX
#define ETHERNET_TYPE_VLAN
@ CHECKSUM_VALIDATION_AUTO
@ CHECKSUM_VALIDATION_RXONLY
@ CHECKSUM_VALIDATION_OFFLOAD
@ CHECKSUM_VALIDATION_ENABLE
@ CHECKSUM_VALIDATION_KERNEL
@ CHECKSUM_VALIDATION_DISABLE
@ PKT_DROP_REASON_STREAM_ERROR
@ PKT_DROP_REASON_STREAM_MEMCAP
@ PKT_DROP_REASON_DEFRAG_MEMCAP
@ PKT_DROP_REASON_FLOW_DROP
@ PKT_DROP_REASON_STREAM_URG
@ PKT_DROP_REASON_APPLAYER_MEMCAP
@ PKT_DROP_REASON_STREAM_REASSEMBLY
@ PKT_DROP_REASON_STREAM_PRE_HOOK
@ PKT_DROP_REASON_DEFAULT_PACKET_POLICY
@ PKT_DROP_REASON_DECODE_ERROR
@ PKT_DROP_REASON_APPLAYER_ERROR
@ PKT_DROP_REASON_STREAM_MIDSTREAM
@ PKT_DROP_REASON_DEFAULT_APP_POLICY
@ PKT_DROP_REASON_FLOW_MEMCAP
@ PKT_DROP_REASON_INNER_PACKET
@ PKT_DROP_REASON_FLOW_PRE_HOOK
@ PKT_DROP_REASON_NFQ_ERROR
@ PKT_DROP_REASON_DEFRAG_ERROR
@ PKT_DROP_REASON_NOT_SET
@ PKT_DROP_REASON_RULES_THRESHOLD
int DecodeUDP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t)
int DecodeSCTP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t)
struct PacketEngineEvents_ PacketEngineEvents
#define PKT_NOPACKET_INSPECTION
#define TUNNEL_PKT_RTV(p)
int DecodeGRE(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
Function to decode GRE packets.
#define PKT_NOPAYLOAD_INSPECTION
int DecodeESP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t)
Function to decode IPSEC-ESP packets.
struct PktProfilingLoggerData_ PktProfilingLoggerData
int DecodeTEMPLATE(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
Function to decode TEMPLATE packets.
int DecodeERSPAN(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
ERSPAN Type II.
struct PktProfilingDetectData_ PktProfilingDetectData
int DecodeIPV6(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t)
#define TUNNEL_PKT_TPR(p)
int DecodeSll2(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
int DecodeMPLS(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
int(* DecoderFunc)(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len)
@ DECODE_TUNNEL_IPV6_TEREDO
struct PktProfilingData_ PktProfilingData
int DecodePPPOESession(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
Main decoding function for PPPOE Session packets.
int DecodeNull(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
int DecodeSll(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
#define ENGINE_SET_INVALID_EVENT(p, e)
struct PacketAlert_ PacketAlert
struct PktProfilingTmmData_ PktProfilingTmmData
Per TMM stats storage.
int DecodeIPV4(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t)
int DecodeEthernet(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
struct DecodeThreadVars_ DecodeThreadVars
Structure to hold thread specific data for all decode modules.
int DecodePPP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
#define PACKET_ENGINE_EVENT_MAX
int DecodeVXLAN(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
int DecodeERSPANTypeI(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
ERSPAN Type I.
int DecodeGeneve(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
int DecodeARP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
void DecodeIPV6FragHeader(Packet *p, const uint8_t *pkt, uint16_t hdrextlen, uint16_t plen, uint16_t prev_hdrextlen)
int DecodeICMPV4(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
Main ICMPv4 decoding function.
int DecodeTCP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t)
int DecodeICMPV6(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
Decode ICMPV6 packets and fill the Packet with the decoded info.
int DecodeCHDLC(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
int DecodeVLAN(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
struct PacketAlerts_ PacketAlerts
int DecodeIEEE8021ah(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
struct PktProfilingAppData_ PktProfilingAppData
#define ENGINE_SET_EVENT(p, e)
int DecodeNSH(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
Function to decode NSH packets.
@ PKT_SRC_STREAM_TCP_DETECTLOG_FLUSH
@ PKT_SRC_CAPTURE_TIMEOUT
@ PKT_SRC_DETECT_RELOAD_FLUSH
struct PktProfiling_ PktProfiling
Per pkt stats storage.
int DecodeVNTag(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
int DecodePPPOEDiscovery(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
Main decoding function for PPPOE Discovery packets.
int DecodeRaw(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t)
@ PROFILE_FLOWWORKER_SIZE
void PacketUpdateEngineEventCounters(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p)
void CaptureStatsUpdate(ThreadVars *tv, const Packet *p)
Packet * PacketGetFromQueueOrAlloc(void)
Get a packet. We try to get a packet from the packetpool first, but if that is empty we alloc a packe...
void PacketDefragPktSetupParent(Packet *parent)
inform defrag "parent" that a pseudo packet is now associated to it.
void PacketSwap(Packet *p)
switch direction of a packet
void DecodeRegisterPerfCounters(DecodeThreadVars *, ThreadVars *)
PacketAlert * PacketAlertCreate(void)
Initialize PacketAlerts with dynamic alerts array size.
uint16_t packet_alert_max
void PacketDecodeFinalize(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p)
Finalize decoding of a packet.
const char * PacketDropReasonToString(enum PacketDropReason r)
DecodeThreadVars * DecodeThreadVarsAlloc(ThreadVars *)
Alloc and setup DecodeThreadVars.
void DecodeThreadVarsFree(ThreadVars *, DecodeThreadVars *)
int PacketCopyDataOffset(Packet *p, uint32_t offset, const uint8_t *data, uint32_t datalen)
Copy data to Packet payload at given offset.
Packet * PacketGetFromAlloc(void)
Get a malloced packet.
void AddressDebugPrint(Address *)
Debug print function for printing addresses.
int PacketCallocExtPkt(Packet *p, int datalen)
int PacketCopyData(Packet *p, const uint8_t *pktdata, uint32_t pktlen)
Copy data to Packet payload and set packet length.
void DecodeUpdatePacketCounters(ThreadVars *tv, const DecodeThreadVars *dtv, const Packet *p)
uint32_t default_packet_size
int PacketSetData(Packet *p, const uint8_t *pktdata, uint32_t pktlen)
Set data for Packet and set length when zero copy is used.
const char * PktSrcToString(enum PktSrcEnum pkt_src)
uint8_t decoder_max_layers
Packet * PacketTunnelPktSetup(ThreadVars *tv, DecodeThreadVars *dtv, Packet *parent, const uint8_t *pkt, uint32_t len, enum DecodeTunnelProto proto)
Setup a pseudo packet (tunnel)
void DecodeUnregisterCounters(void)
void PacketAlertRecycle(PacketAlert *pa_array, uint16_t cnt)
void CaptureStatsSetup(ThreadVars *tv)
Packet * PacketDefragPktSetup(Packet *parent, const uint8_t *pkt, uint32_t len, uint8_t proto)
Setup a pseudo packet (reassembled frags)
void PacketFreeOrRelease(Packet *p)
Return a packet to where it was allocated.
void PacketFree(Packet *p)
Return a malloced packet.
void DecodeGlobalConfig(void)
void PacketAlertFree(PacketAlert *pa)
void PacketBypassCallback(Packet *p)
void PacketAlertGetMaxConfig(void)
per packet AF_PACKET vars
uint32_t address_un_data32[4]
uint8_t address_un_data8[16]
struct in6_addr address_un_in6
union Address_::@30 address
uint16_t address_un_data16[8]
Data structure to store app layer decoder events.
This is for the app layer in general and it contains per thread context relevant to both the alpd and...
Structure to hold thread specific data for all decode modules.
uint16_t counter_defrag_max_hit
uint16_t counter_defrag_ipv4_reassembled
uint16_t counter_flow_icmp4
uint16_t counter_flow_active
uint16_t counter_flow_get_used
uint16_t counter_defrag_tracker_soft_reuse
uint16_t counter_flow_tcp_reuse
uint16_t counter_vlan_qinqinq
AppLayerThreadCtx * app_tctx
uint16_t counter_ieee8021ah
uint16_t counter_defrag_ipv6_fragments
uint16_t counter_avg_pkt_size
void * output_flow_thread_data
uint16_t counter_flow_elephant
uint16_t counter_flow_get_used_eval
uint16_t counter_defrag_tracker_timeout
uint16_t counter_flow_spare_sync_incomplete
uint16_t counter_engine_events[DECODE_EVENT_MAX]
uint16_t counter_flow_get_used_eval_reject
uint16_t counter_flow_spare_sync
uint16_t counter_max_pkt_size
uint16_t counter_max_mac_addrs_dst
uint16_t counter_ipv4inipv6
uint16_t counter_flow_total
uint16_t counter_flow_udp
uint16_t counter_tcp_synack
uint16_t counter_vlan_qinq
uint16_t counter_flow_get_used_eval_busy
uint16_t counter_defrag_ipv6_reassembled
uint16_t counter_flow_spare_sync_avg
uint16_t counter_ipv4inipv4
uint16_t counter_flow_memcap
uint16_t counter_flow_tcp
ExceptionPolicyCounters counter_defrag_memcap_eps
uint16_t counter_defrag_ipv4_fragments
uint16_t counter_max_mac_addrs_src
uint16_t counter_flow_get_used_failed
uint16_t counter_flow_icmp6
uint16_t counter_ethertype_unknown
ExceptionPolicyCounters counter_flow_memcap_eps
uint16_t counter_flow_spare_sync_empty
uint16_t counter_tcp_active_sessions
uint16_t counter_ipv6inipv4
uint16_t counter_defrag_no_frags
uint16_t counter_defrag_tracker_hard_reuse
uint16_t counter_ipv6inipv6
get the highest proto/next header field we know
const struct Signature_ * s
struct PacketContextData * json_info
struct PacketContextData * next
uint8_t events[PACKET_ENGINE_EVENT_MAX]
union PacketL2::L2Hdrs hdrs
struct PacketL3::@31::@32 ip6
union PacketL3::Hdrs hdrs
union PacketL4::L4Vars vars
union PacketL4::L4Hdrs hdrs
simple fifo queue for packets with mutex and cond Calling the mutex or triggering the cond is respons...
struct Packet_::@33::@40 icmp_s
uint8_t nb_decoded_layers
uint8_t app_update_direction
struct Packet_::@35::@41 icmp_d
enum PacketTunnelType ttype
AppLayerDecoderEvents * app_layer_events
struct Packet_::@39 persistent
PacketEngineEvents events
uint16_t vlan_id[VLAN_MAX_LAYERS]
struct LiveDevice_ * livedev
void(* ReleasePacket)(struct Packet_ *)
int(* BypassPacketsFlow)(struct Packet_ *)
PktProfilingData flowworker[PROFILE_FLOWWORKER_SIZE]
PktProfilingTmmData tmm[TMM_SIZE]
PktProfilingAppData app[]
PktProfilingLoggerData logger[LOGGER_SIZE]
PktProfilingDetectData detect[PROF_DETECT_SIZE]
Per thread variable structure.
thread_local uint64_t rww_lock_cnt
thread_local uint64_t mutex_lock_cnt
thread_local uint64_t spin_lock_wait_ticks
thread_local uint64_t rwr_lock_wait_ticks
thread_local uint64_t rwr_lock_cnt
thread_local uint64_t rww_lock_wait_ticks
thread_local uint64_t mutex_lock_wait_ticks
thread_local uint64_t spin_lock_cnt
thread_local uint64_t rwr_lock_contention
thread_local uint64_t mutex_lock_contention
thread_local uint64_t rww_lock_contention
thread_local uint64_t spin_lock_contention
#define LINKTYPE_ETHERNET
#define LINKTYPE_GRE_OVER_IP
#define LINKTYPE_CISCO_HDLC
#define LINKTYPE_LINUX_SLL
#define LINKTYPE_LINUX_SLL2
#define SCLogError(...)
Macro used to log ERROR messages.
#define DEBUG_VALIDATE_BUG_ON(exp)