From: Victor Julien Date: Tue, 12 Nov 2019 21:34:51 +0000 (+0100) Subject: threading: change local packet queue logic X-Git-Tag: suricata-6.0.0-beta1~785 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f8aed4ce2dd8ef141f5dd2ae64c9faccf8f0ca2e;p=thirdparty%2Fsuricata.git threading: change local packet queue logic Previously each 'TmSlot' had it's own packet queue that was passed to the registered SlotFunc as an argument. This was used mostly for tunnel packets by the decoders and by defrag. This patch removes that in favor of a single queue in the ThreadVars: decode_pq. This is the non-locked version of the queue as this is only a temporary store for handling packets within a thread. This patch removes the PacketQueue pointer argument from the API. The new queue can be accessed directly through the ThreadVars pointer. --- diff --git a/src/alert-unified2-alert.c b/src/alert-unified2-alert.c index fd23ed1bd0..e2c81d775f 100644 --- a/src/alert-unified2-alert.c +++ b/src/alert-unified2-alert.c @@ -1505,7 +1505,6 @@ static int Unified2Test01(void) { ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; void *data = NULL; OutputInitResult oc; LogFileCtx *lf; @@ -1530,7 +1529,6 @@ static int Unified2Test01(void) memset(&dtv, 0, sizeof(DecodeThreadVars)); memset(&tv, 0, sizeof(ThreadVars)); - memset(&pq, 0, sizeof(PacketQueue)); memset(&s, 0, sizeof(Signature)); p->alerts.cnt++; @@ -1542,8 +1540,7 @@ static int Unified2Test01(void) FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&tv, &dtv, p, raw_ipv4_tcp, sizeof(raw_ipv4_tcp), &pq); - + DecodeEthernet(&tv, &dtv, p, raw_ipv4_tcp, sizeof(raw_ipv4_tcp)); oc = Unified2AlertInitCtx(NULL); if (oc.ctx == NULL) { @@ -1594,7 +1591,6 @@ static int Unified2Test02(void) { ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; void *data = NULL; OutputInitResult oc; LogFileCtx *lf; @@ -1621,7 +1617,6 @@ static int Unified2Test02(void) memset(&dtv, 0, sizeof(DecodeThreadVars)); memset(&tv, 0, sizeof(ThreadVars)); - memset(&pq, 0, sizeof(PacketQueue)); memset(&s, 0, sizeof(Signature)); p->alerts.cnt++; @@ -1633,7 +1628,7 @@ static int Unified2Test02(void) FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&tv, &dtv, p, raw_ipv6_tcp, sizeof(raw_ipv6_tcp), &pq); + DecodeEthernet(&tv, &dtv, p, raw_ipv6_tcp, sizeof(raw_ipv6_tcp)); oc = Unified2AlertInitCtx(NULL); if (oc.ctx == NULL) { @@ -1685,7 +1680,6 @@ static int Unified2Test03(void) { ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; void *data = NULL; OutputInitResult oc; LogFileCtx *lf; @@ -1718,7 +1712,6 @@ static int Unified2Test03(void) memset(&dtv, 0, sizeof(DecodeThreadVars)); memset(&tv, 0, sizeof(ThreadVars)); - memset(&pq, 0, sizeof(PacketQueue)); memset(&s, 0, sizeof(Signature)); p->alerts.cnt++; @@ -1730,7 +1723,7 @@ static int Unified2Test03(void) FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&tv, &dtv, p, raw_gre, sizeof(raw_gre), &pq); + DecodeEthernet(&tv, &dtv, p, raw_gre, sizeof(raw_gre)); oc = Unified2AlertInitCtx(NULL); if (oc.ctx == NULL) { @@ -1758,11 +1751,11 @@ static int Unified2Test03(void) Unified2AlertDeInitCtx(oc.ctx); - pkt = PacketDequeue(&pq); + pkt = PacketDequeueNoLock(&tv.decode_pq); while (pkt != NULL) { PACKET_RECYCLE(pkt); SCFree(pkt); - pkt = PacketDequeue(&pq); + pkt = PacketDequeueNoLock(&tv.decode_pq); } PACKET_RECYCLE(p); @@ -1771,11 +1764,11 @@ static int Unified2Test03(void) return 1; end: - pkt = PacketDequeue(&pq); + pkt = PacketDequeueNoLock(&tv.decode_pq); while (pkt != NULL) { PACKET_RECYCLE(pkt); SCFree(pkt); - pkt = PacketDequeue(&pq); + pkt = PacketDequeueNoLock(&tv.decode_pq); } PACKET_RECYCLE(p); SCFree(p); @@ -1794,7 +1787,6 @@ static int Unified2Test04(void) { ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; void *data = NULL; OutputInitResult oc; LogFileCtx *lf; @@ -1815,7 +1807,6 @@ static int Unified2Test04(void) memset(&dtv, 0, sizeof(DecodeThreadVars)); memset(&tv, 0, sizeof(ThreadVars)); - memset(&pq, 0, sizeof(PacketQueue)); memset(&s, 0, sizeof(Signature)); p->alerts.cnt++; @@ -1827,7 +1818,7 @@ static int Unified2Test04(void) FlowInitConfig(FLOW_QUIET); - DecodePPP(&tv, &dtv, p, raw_ppp, sizeof(raw_ppp), &pq); + DecodePPP(&tv, &dtv, p, raw_ppp, sizeof(raw_ppp)); oc = Unified2AlertInitCtx(NULL); if (oc.ctx == NULL) { @@ -1878,7 +1869,6 @@ static int Unified2Test05(void) { ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; void *data = NULL; OutputInitResult oc; LogFileCtx *lf; @@ -1903,7 +1893,6 @@ static int Unified2Test05(void) memset(&dtv, 0, sizeof(DecodeThreadVars)); memset(&tv, 0, sizeof(ThreadVars)); - memset(&pq, 0, sizeof(PacketQueue)); memset(&s, 0, sizeof(Signature)); p->alerts.cnt++; @@ -1915,7 +1904,7 @@ static int Unified2Test05(void) FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&tv, &dtv, p, raw_ipv4_tcp, sizeof(raw_ipv4_tcp), &pq); + DecodeEthernet(&tv, &dtv, p, raw_ipv4_tcp, sizeof(raw_ipv4_tcp)); p->action = ACTION_DROP; diff --git a/src/decode-afl.c b/src/decode-afl.c index 878a497f2d..974ebd61a3 100644 --- a/src/decode-afl.c +++ b/src/decode-afl.c @@ -39,14 +39,14 @@ #ifdef AFLFUZZ_DECODER int AFLDecodeIPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { - return DecodeIPV4(tv, dtv, p, pkt, (uint16_t)len, pq); + return DecodeIPV4(tv, dtv, p, pkt, (uint16_t)len); } int AFLDecodeIPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { - return DecodeIPV6(tv, dtv, p, pkt, (uint16_t)len, pq); + return DecodeIPV6(tv, dtv, p, pkt, (uint16_t)len); } /* stateful processing of data as packets. Because AFL in case of a @@ -99,9 +99,9 @@ int DecoderParseDataFromFile(char *filename, DecoderFunc Decoder) Packet *p = PacketGetFromAlloc(); if (p != NULL) { PacketSetData(p, buffer, size); - (void) Decoder (&tv, dtv, p, buffer, size, &pq); + (void) Decoder (&tv, dtv, p, buffer, size); while (1) { - Packet *extra_p = PacketDequeue(&pq); + Packet *extra_p = PacketDequeueNoLock(&tv.decode_pq); if (unlikely(extra_p == NULL)) break; PacketFree(extra_p); @@ -161,9 +161,9 @@ int DecoderParseDataFromFileSerie(char *fileprefix, DecoderFunc Decoder) Packet *p = PacketGetFromAlloc(); if (p != NULL) { PacketSetData(p, buffer, size); - (void) Decoder (&tv, dtv, p, buffer, size, &pq); + (void) Decoder (&tv, dtv, p, buffer, size); while (1) { - Packet *extra_p = PacketDequeue(&pq); + Packet *extra_p = PacketDequeueNoLock(&tv.decode_pq); if (unlikely(extra_p == NULL)) break; PacketFree(extra_p); diff --git a/src/decode-erspan.c b/src/decode-erspan.c index d95c93b504..41b37d3c6f 100644 --- a/src/decode-erspan.c +++ b/src/decode-erspan.c @@ -43,7 +43,7 @@ * \brief Function to decode ERSPAN packets */ -int DecodeERSPAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len, PacketQueue *pq) +int DecodeERSPAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len) { StatsIncr(tv, dtv->counter_erspan); @@ -73,7 +73,7 @@ int DecodeERSPAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t p->vlan_idx++; } - return DecodeEthernet(tv, dtv, p, pkt + sizeof(ErspanHdr), len - sizeof(ErspanHdr), pq); + return DecodeEthernet(tv, dtv, p, pkt + sizeof(ErspanHdr), len - sizeof(ErspanHdr)); } /** diff --git a/src/decode-ethernet.c b/src/decode-ethernet.c index ff5daead51..911538ceb4 100644 --- a/src/decode-ethernet.c +++ b/src/decode-ethernet.c @@ -39,7 +39,7 @@ #include "util-debug.h" int DecodeEthernet(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { StatsIncr(tv, dtv->counter_eth); @@ -62,39 +62,39 @@ int DecodeEthernet(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, case ETHERNET_TYPE_IP: //printf("DecodeEthernet ip4\n"); DecodeIPV4(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, - len - ETHERNET_HEADER_LEN, pq); + len - ETHERNET_HEADER_LEN); break; case ETHERNET_TYPE_IPV6: //printf("DecodeEthernet ip6\n"); DecodeIPV6(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, - len - ETHERNET_HEADER_LEN, pq); + len - ETHERNET_HEADER_LEN); break; case ETHERNET_TYPE_PPPOE_SESS: //printf("DecodeEthernet PPPOE Session\n"); DecodePPPOESession(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, - len - ETHERNET_HEADER_LEN, pq); + len - ETHERNET_HEADER_LEN); break; case ETHERNET_TYPE_PPPOE_DISC: //printf("DecodeEthernet PPPOE Discovery\n"); DecodePPPOEDiscovery(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, - len - ETHERNET_HEADER_LEN, pq); + len - ETHERNET_HEADER_LEN); break; case ETHERNET_TYPE_VLAN: case ETHERNET_TYPE_8021QINQ: DecodeVLAN(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, - len - ETHERNET_HEADER_LEN, pq); + len - ETHERNET_HEADER_LEN); break; case ETHERNET_TYPE_MPLS_UNICAST: case ETHERNET_TYPE_MPLS_MULTICAST: DecodeMPLS(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, - len - ETHERNET_HEADER_LEN, pq); + len - ETHERNET_HEADER_LEN); break; case ETHERNET_TYPE_DCE: if (unlikely(len < ETHERNET_DCE_HEADER_LEN)) { ENGINE_SET_INVALID_EVENT(p, DCE_PKT_TOO_SMALL); } else { DecodeEthernet(tv, dtv, p, pkt + ETHERNET_DCE_HEADER_LEN, - len - ETHERNET_DCE_HEADER_LEN, pq); + len - ETHERNET_DCE_HEADER_LEN); } break; default: @@ -141,7 +141,7 @@ static int DecodeEthernetTest01 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); - DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth), NULL); + DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth)); SCFree(p); return 1; @@ -166,7 +166,7 @@ static int DecodeEthernetTestDceTooSmall(void) memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); - DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth), NULL); + DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth)); FAIL_IF_NOT(ENGINE_ISSET_EVENT(p, DCE_PKT_TOO_SMALL)); @@ -202,7 +202,7 @@ static int DecodeEthernetTestDceNextTooSmall(void) memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); - DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth), NULL); + DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth)); FAIL_IF_NOT(ENGINE_ISSET_EVENT(p, ETHERNET_PKT_TOO_SMALL)); diff --git a/src/decode-gre.c b/src/decode-gre.c index 969a888243..384a02c498 100644 --- a/src/decode-gre.c +++ b/src/decode-gre.c @@ -43,7 +43,7 @@ * \brief Function to decode GRE packets */ -int DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len, PacketQueue *pq) +int DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len) { uint32_t header_len = GRE_HDR_LEN; GRESreHdr *gsre = NULL; @@ -198,82 +198,70 @@ int DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *p switch (GRE_GET_PROTO(p->greh)) { case ETHERNET_TYPE_IP: - { - if (pq != NULL) { - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, - len - header_len, DECODE_TUNNEL_IPV4, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); - PacketEnqueue(pq,tp); - } - } - break; + { + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, + len - header_len, DECODE_TUNNEL_IPV4); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); + PacketEnqueueNoLock(&tv->decode_pq,tp); } + break; + } case GRE_PROTO_PPP: - { - if (pq != NULL) { - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, - len - header_len, DECODE_TUNNEL_PPP, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); - PacketEnqueue(pq,tp); - } - } - break; + { + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, + len - header_len, DECODE_TUNNEL_PPP); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); + PacketEnqueueNoLock(&tv->decode_pq,tp); } + break; + } case ETHERNET_TYPE_IPV6: - { - if (pq != NULL) { - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, - len - header_len, DECODE_TUNNEL_IPV6, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); - PacketEnqueue(pq,tp); - } - } - break; + { + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, + len - header_len, DECODE_TUNNEL_IPV6); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); + PacketEnqueueNoLock(&tv->decode_pq,tp); } + break; + } case ETHERNET_TYPE_VLAN: - { - if (pq != NULL) { - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, - len - header_len, DECODE_TUNNEL_VLAN, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); - PacketEnqueue(pq,tp); - } - } - break; + { + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, + len - header_len, DECODE_TUNNEL_VLAN); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); + PacketEnqueueNoLock(&tv->decode_pq,tp); } + break; + } case ETHERNET_TYPE_ERSPAN: { - if (pq != NULL) { - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, - len - header_len, DECODE_TUNNEL_ERSPAN, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); - PacketEnqueue(pq,tp); - } + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, + len - header_len, DECODE_TUNNEL_ERSPAN); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); + PacketEnqueueNoLock(&tv->decode_pq,tp); } break; } case ETHERNET_TYPE_BRIDGE: - { - if (pq != NULL) { - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, - len - header_len, DECODE_TUNNEL_ETHERNET, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); - PacketEnqueue(pq,tp); - } - } - break; + { + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len, + len - header_len, DECODE_TUNNEL_ETHERNET); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE); + PacketEnqueueNoLock(&tv->decode_pq,tp); } + break; + } default: return TM_ECODE_OK; @@ -289,7 +277,6 @@ int DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *p static int DecodeGREtest01 (void) { - uint8_t raw_gre[] = { 0x00 ,0x6e ,0x62 }; Packet *p = PacketGetFromAlloc(); if (unlikely(p == NULL)) @@ -300,7 +287,7 @@ static int DecodeGREtest01 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - DecodeGRE(&tv, &dtv, p, raw_gre, sizeof(raw_gre), NULL); + DecodeGRE(&tv, &dtv, p, raw_gre, sizeof(raw_gre)); if(ENGINE_ISSET_EVENT(p,GRE_PKT_TOO_SMALL)) { SCFree(p); @@ -341,7 +328,7 @@ static int DecodeGREtest02 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - DecodeGRE(&tv, &dtv, p, raw_gre, sizeof(raw_gre), NULL); + DecodeGRE(&tv, &dtv, p, raw_gre, sizeof(raw_gre)); if(ENGINE_ISSET_EVENT(p,GRE_WRONG_VERSION)) { SCFree(p); @@ -383,7 +370,7 @@ static int DecodeGREtest03 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - DecodeGRE(&tv, &dtv, p, raw_gre, sizeof(raw_gre), NULL); + DecodeGRE(&tv, &dtv, p, raw_gre, sizeof(raw_gre)); if(p->greh == NULL) { SCFree(p); diff --git a/src/decode-icmpv4.c b/src/decode-icmpv4.c index 3019ded415..e8748cac6f 100644 --- a/src/decode-icmpv4.c +++ b/src/decode-icmpv4.c @@ -152,7 +152,7 @@ static int DecodePartialIPV4(Packet* p, uint8_t* partial_packet, uint16_t len) /** DecodeICMPV4 * \brief Main ICMPv4 decoding function */ -int DecodeICMPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len, PacketQueue *pq) +int DecodeICMPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len) { StatsIncr(tv, dtv->counter_icmpv4); @@ -378,7 +378,7 @@ static int DecodeICMPV4test01(void) ip4h.s_ip_dst.s_addr = p->dst.addr_data32[0]; p->ip4h = &ip4h; - DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4), NULL); + DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4)); if (NULL!=p->icmpv4h) { if (p->icmpv4h->type==8 && p->icmpv4h->code==0) { @@ -429,7 +429,7 @@ static int DecodeICMPV4test02(void) ip4h.s_ip_dst.s_addr = p->dst.addr_data32[0]; p->ip4h = &ip4h; - DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4), NULL); + DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4)); if (NULL!=p->icmpv4h) { if (p->icmpv4h->type==0 && p->icmpv4h->code==0) { @@ -478,7 +478,7 @@ static int DecodeICMPV4test03(void) ip4h.s_ip_dst.s_addr = p->dst.addr_data32[0]; p->ip4h = &ip4h; - DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4), NULL); + DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4)); if (NULL == p->icmpv4h) { printf("NULL == p->icmpv4h: "); @@ -558,7 +558,7 @@ static int DecodeICMPV4test04(void) ip4h.s_ip_dst.s_addr = p->dst.addr_data32[0]; p->ip4h = &ip4h; - DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4), NULL); + DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4)); if (NULL == p->icmpv4h) { goto end; @@ -628,7 +628,7 @@ static int DecodeICMPV4test05(void) ip4h.s_ip_dst.s_addr = p->dst.addr_data32[0]; p->ip4h = &ip4h; - DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4), NULL); + DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4)); if (NULL == p->icmpv4h) { goto end; @@ -735,7 +735,7 @@ static int ICMPV4InvalidType07(void) ip4h.s_ip_dst.s_addr = p->dst.addr_data32[0]; p->ip4h = &ip4h; - DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4), NULL); + DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4)); if(ENGINE_ISSET_EVENT(p,ICMPV4_UNKNOWN_TYPE)) { ret = 1; @@ -779,7 +779,7 @@ static int DecodeICMPV4test08(void) ip4h.s_ip_dst.s_addr = p->dst.addr_data32[0]; p->ip4h = &ip4h; - DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4), NULL); + DecodeICMPV4(&tv, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4)); if (NULL!=p->icmpv4h) { if (p->icmpv4h->type==8 && p->icmpv4h->code==0) { diff --git a/src/decode-icmpv6.c b/src/decode-icmpv6.c index 8809fce5ea..db810bd375 100644 --- a/src/decode-icmpv6.c +++ b/src/decode-icmpv6.c @@ -182,12 +182,11 @@ int ICMPv6GetCounterpart(uint8_t type) * \param p Pointer to the packet we are filling * \param pkt Pointer to the raw packet buffer * \param len the len of the rest of the packet not processed yet - * \param pq the packet queue were this packet go * * \retval void No return value */ int DecodeICMPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { int full_hdr = 0; StatsIncr(tv, dtv->counter_icmpv6); @@ -625,7 +624,7 @@ static int ICMPV6ParamProbTest01(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(p->icmpv6h == NULL); @@ -681,7 +680,7 @@ static int ICMPV6PktTooBigTest01(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(p->icmpv6h == NULL); @@ -740,7 +739,7 @@ static int ICMPV6TimeExceedTest01(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF_NULL(p->icmpv6h); @@ -799,7 +798,7 @@ static int ICMPV6DestUnreachTest01(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF_NULL(p->icmpv6h); @@ -846,7 +845,7 @@ static int ICMPV6EchoReqTest01(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF_NULL(p->icmpv6h); @@ -892,7 +891,7 @@ static int ICMPV6EchoRepTest01(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF_NULL(p->icmpv6h); @@ -945,7 +944,7 @@ static int ICMPV6ParamProbTest02(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF_NULL(p->icmpv6h); FAIL_IF(ICMPV6_GET_TYPE(p) != 4 || ICMPV6_GET_CODE(p) != 0); @@ -988,7 +987,7 @@ static int ICMPV6PktTooBigTest02(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF_NULL(p->icmpv6h); FAIL_IF(!ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1027,7 +1026,7 @@ static int ICMPV6TimeExceedTest02(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(!ENGINE_ISSET_EVENT(p, ICMPV6_PKT_TOO_SMALL)); @@ -1068,7 +1067,7 @@ static int ICMPV6DestUnreachTest02(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(!ENGINE_ISSET_EVENT(p, ICMPV6_IPV6_TRUNC_PKT)); @@ -1105,7 +1104,7 @@ static int ICMPV6EchoReqTest02(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(!ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1142,7 +1141,7 @@ static int ICMPV6EchoRepTest02(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(!ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1182,7 +1181,7 @@ static int ICMPV6PayloadTest01(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF_NULL(p->payload); FAIL_IF(p->payload_len != 37); @@ -1216,7 +1215,7 @@ static int ICMPV6RouterSolicitTestKnownCode(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1249,7 +1248,7 @@ static int ICMPV6RouterSolicitTestUnknownCode(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(!ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1282,7 +1281,7 @@ static int ICMPV6RouterAdvertTestKnownCode(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1315,7 +1314,7 @@ static int ICMPV6RouterAdvertTestUnknownCode(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(!ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1348,7 +1347,7 @@ static int ICMPV6NeighbourSolicitTestKnownCode(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1381,7 +1380,7 @@ static int ICMPV6NeighbourSolicitTestUnknownCode(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(!ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1414,7 +1413,7 @@ static int ICMPV6NeighbourAdvertTestKnownCode(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1447,7 +1446,7 @@ static int ICMPV6NeighbourAdvertTestUnknownCode(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(!ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1480,7 +1479,7 @@ static int ICMPV6RedirectTestKnownCode(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1513,7 +1512,7 @@ static int ICMPV6RedirectTestUnknownCode(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6, sizeof(raw_ipv6)); FAIL_IF(!ENGINE_ISSET_EVENT(p, ICMPV6_UNKNOWN_CODE)); @@ -1563,7 +1562,7 @@ static int ICMPV6CalculateValidChecksumWithFCS(void) memset(&ip6h, 0, sizeof(IPV6Hdr)); FlowInitConfig(FLOW_QUIET); - DecodeIPV6(&tv, &dtv, p, raw_ipv6 + 14, sizeof(raw_ipv6) - 14, NULL); + DecodeIPV6(&tv, &dtv, p, raw_ipv6 + 14, sizeof(raw_ipv6) - 14); FAIL_IF_NULL(p->icmpv6h); uint16_t icmpv6_len = IPV6_GET_RAW_PLEN(p->ip6h) - diff --git a/src/decode-ipv4.c b/src/decode-ipv4.c index 47c0e31e7c..6c2998cc6d 100644 --- a/src/decode-ipv4.c +++ b/src/decode-ipv4.c @@ -515,7 +515,7 @@ static int DecodeIPV4Packet(Packet *p, const uint8_t *pkt, uint16_t len) } int DecodeIPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint16_t len, PacketQueue *pq) + const uint8_t *pkt, uint16_t len) { StatsIncr(tv, dtv->counter_ipv4); @@ -531,9 +531,9 @@ int DecodeIPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, /* If a fragment, pass off for re-assembly. */ if (unlikely(IPV4_GET_IPOFFSET(p) > 0 || IPV4_GET_MF(p) == 1)) { - Packet *rp = Defrag(tv, dtv, p, pq); + Packet *rp = Defrag(tv, dtv, p); if (rp != NULL) { - PacketEnqueue(pq, rp); + PacketEnqueueNoLock(&tv->decode_pq, rp); } p->flags |= PKT_IS_FRAGMENT; return TM_ECODE_OK; @@ -557,44 +557,42 @@ int DecodeIPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, switch (IPV4_GET_IPPROTO(p)) { case IPPROTO_TCP: DecodeTCP(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p), pq); + IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); break; case IPPROTO_UDP: DecodeUDP(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p), pq); + IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); break; case IPPROTO_ICMP: DecodeICMPV4(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p), pq); + IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); break; case IPPROTO_GRE: DecodeGRE(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p), pq); + IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); break; case IPPROTO_SCTP: DecodeSCTP(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p), pq); + IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); break; case IPPROTO_IPV6: { - if (pq != NULL) { - /* spawn off tunnel packet */ - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p), - DECODE_TUNNEL_IPV6, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_IPV4); - PacketEnqueue(pq,tp); - } - FlowSetupPacket(p); + /* spawn off tunnel packet */ + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + IPV4_GET_HLEN(p), + IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p), + DECODE_TUNNEL_IPV6); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_IPV4); + PacketEnqueueNoLock(&tv->decode_pq,tp); } + FlowSetupPacket(p); break; } case IPPROTO_IP: /* check PPP VJ uncompressed packets and decode tcp dummy */ if(p->ppph != NULL && SCNtohs(p->ppph->protocol) == PPP_VJ_UCOMP) { DecodeTCP(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p), pq); + IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); } break; case IPPROTO_ICMPV6: @@ -1247,19 +1245,17 @@ static int DecodeIPV4DefragTest01(void) return 0; ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; int result = 1; memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - memset(&pq, 0, sizeof(PacketQueue)); FlowInitConfig(FLOW_QUIET); DefragInit(); PacketCopyData(p, pkt1, sizeof(pkt1)); DecodeIPV4(&tv, &dtv, p, GET_PKT_DATA(p) + ETHERNET_HEADER_LEN, - GET_PKT_LEN(p) - ETHERNET_HEADER_LEN, &pq); + GET_PKT_LEN(p) - ETHERNET_HEADER_LEN); if (p->tcph != NULL) { printf("tcp header should be NULL for ip fragment, but it isn't\n"); result = 0; @@ -1269,7 +1265,7 @@ static int DecodeIPV4DefragTest01(void) PacketCopyData(p, pkt2, sizeof(pkt2)); DecodeIPV4(&tv, &dtv, p, GET_PKT_DATA(p) + ETHERNET_HEADER_LEN, - GET_PKT_LEN(p) - ETHERNET_HEADER_LEN, &pq); + GET_PKT_LEN(p) - ETHERNET_HEADER_LEN); if (p->tcph != NULL) { printf("tcp header should be NULL for ip fragment, but it isn't\n"); result = 0; @@ -1279,13 +1275,13 @@ static int DecodeIPV4DefragTest01(void) PacketCopyData(p, pkt3, sizeof(pkt3)); DecodeIPV4(&tv, &dtv, p, GET_PKT_DATA(p) + ETHERNET_HEADER_LEN, - GET_PKT_LEN(p) - ETHERNET_HEADER_LEN, &pq); + GET_PKT_LEN(p) - ETHERNET_HEADER_LEN); if (p->tcph != NULL) { printf("tcp header should be NULL for ip fragment, but it isn't\n"); result = 0; goto end; } - Packet *tp = PacketDequeue(&pq); + Packet *tp = PacketDequeueNoLock(&tv.decode_pq); if (tp == NULL) { printf("Failed to get defragged pseudo packet\n"); result = 0; @@ -1384,19 +1380,17 @@ static int DecodeIPV4DefragTest02(void) return 0; ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; int result = 0; memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - memset(&pq, 0, sizeof(PacketQueue)); FlowInitConfig(FLOW_QUIET); DefragInit(); PacketCopyData(p, pkt1, sizeof(pkt1)); DecodeIPV4(&tv, &dtv, p, GET_PKT_DATA(p) + ETHERNET_HEADER_LEN, - GET_PKT_LEN(p) - ETHERNET_HEADER_LEN, &pq); + GET_PKT_LEN(p) - ETHERNET_HEADER_LEN); if (p->tcph != NULL) { printf("tcp header should be NULL for ip fragment, but it isn't\n"); goto end; @@ -1405,7 +1399,7 @@ static int DecodeIPV4DefragTest02(void) PacketCopyData(p, pkt2, sizeof(pkt2)); DecodeIPV4(&tv, &dtv, p, GET_PKT_DATA(p) + ETHERNET_HEADER_LEN, - GET_PKT_LEN(p) - ETHERNET_HEADER_LEN, &pq); + GET_PKT_LEN(p) - ETHERNET_HEADER_LEN); if (p->tcph != NULL) { printf("tcp header should be NULL for ip fragment, but it isn't\n"); goto end; @@ -1415,12 +1409,12 @@ static int DecodeIPV4DefragTest02(void) p->recursion_level = 3; PacketCopyData(p, pkt3, sizeof(pkt3)); DecodeIPV4(&tv, &dtv, p, GET_PKT_DATA(p) + ETHERNET_HEADER_LEN, - GET_PKT_LEN(p) - ETHERNET_HEADER_LEN, &pq); + GET_PKT_LEN(p) - ETHERNET_HEADER_LEN); if (p->tcph != NULL) { printf("tcp header should be NULL for ip fragment, but it isn't\n"); goto end; } - Packet *tp = PacketDequeue(&pq); + Packet *tp = PacketDequeueNoLock(&tv.decode_pq); if (tp == NULL) { printf("Failed to get defragged pseudo packet\n"); goto end; @@ -1511,19 +1505,17 @@ static int DecodeIPV4DefragTest03(void) return 0; ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; int result = 1; memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - memset(&pq, 0, sizeof(PacketQueue)); FlowInitConfig(FLOW_QUIET); DefragInit(); PacketCopyData(p, pkt, sizeof(pkt)); DecodeIPV4(&tv, &dtv, p, GET_PKT_DATA(p) + ETHERNET_HEADER_LEN, - GET_PKT_LEN(p) - ETHERNET_HEADER_LEN, &pq); + GET_PKT_LEN(p) - ETHERNET_HEADER_LEN); if (p->tcph == NULL) { printf("tcp header shouldn't be NULL, but it is\n"); result = 0; @@ -1538,7 +1530,7 @@ static int DecodeIPV4DefragTest03(void) PacketCopyData(p, pkt1, sizeof(pkt1)); DecodeIPV4(&tv, &dtv, p, GET_PKT_DATA(p) + ETHERNET_HEADER_LEN, - GET_PKT_LEN(p) - ETHERNET_HEADER_LEN, &pq); + GET_PKT_LEN(p) - ETHERNET_HEADER_LEN); if (p->tcph != NULL) { printf("tcp header should be NULL for ip fragment, but it isn't\n"); result = 0; @@ -1548,7 +1540,7 @@ static int DecodeIPV4DefragTest03(void) PacketCopyData(p, pkt2, sizeof(pkt2)); DecodeIPV4(&tv, &dtv, p, GET_PKT_DATA(p) + ETHERNET_HEADER_LEN, - GET_PKT_LEN(p) - ETHERNET_HEADER_LEN, &pq); + GET_PKT_LEN(p) - ETHERNET_HEADER_LEN); if (p->tcph != NULL) { printf("tcp header should be NULL for ip fragment, but it isn't\n"); result = 0; @@ -1558,14 +1550,14 @@ static int DecodeIPV4DefragTest03(void) PacketCopyData(p, pkt3, sizeof(pkt3)); DecodeIPV4(&tv, &dtv, p, GET_PKT_DATA(p) + ETHERNET_HEADER_LEN, - GET_PKT_LEN(p) - ETHERNET_HEADER_LEN, &pq); + GET_PKT_LEN(p) - ETHERNET_HEADER_LEN); if (p->tcph != NULL) { printf("tcp header should be NULL for ip fragment, but it isn't\n"); result = 0; goto end; } - Packet *tp = PacketDequeue(&pq); + Packet *tp = PacketDequeueNoLock(&tv.decode_pq); if (tp == NULL) { printf("Failed to get defragged pseudo packet\n"); result = 0; @@ -1639,7 +1631,7 @@ static int DecodeEthernetTestIPv4Opt(void) memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); - DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth), NULL); + DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth)); SCFree(p); DefragDestroy(); diff --git a/src/decode-ipv6.c b/src/decode-ipv6.c index 430712ca9a..f57b1d34e1 100644 --- a/src/decode-ipv6.c +++ b/src/decode-ipv6.c @@ -48,7 +48,7 @@ * \brief Function to decode IPv4 in IPv6 packets * */ -static void DecodeIPv4inIPv6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint16_t plen, PacketQueue *pq) +static void DecodeIPv4inIPv6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint16_t plen) { if (unlikely(plen < IPV4_HEADER_LEN)) { @@ -56,15 +56,12 @@ static void DecodeIPv4inIPv6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, c return; } if (IP_GET_RAW_VER(pkt) == 4) { - if (pq != NULL) { - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt, plen, DECODE_TUNNEL_IPV4, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_IPV6); - /* add the tp to the packet queue. */ - PacketEnqueue(pq,tp); - StatsIncr(tv, dtv->counter_ipv4inipv6); - return; - } + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt, plen, DECODE_TUNNEL_IPV4); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_IPV6); + PacketEnqueueNoLock(&tv->decode_pq,tp); + StatsIncr(tv, dtv->counter_ipv4inipv6); + return; } } else { ENGINE_SET_EVENT(p, IPV4_IN_IPV6_WRONG_IP_VER); @@ -77,7 +74,7 @@ static void DecodeIPv4inIPv6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, c * */ static int DecodeIP6inIP6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint16_t plen, PacketQueue *pq) + const uint8_t *pkt, uint16_t plen) { if (unlikely(plen < IPV6_HEADER_LEN)) { @@ -85,13 +82,11 @@ static int DecodeIP6inIP6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, return TM_ECODE_FAILED; } if (IP_GET_RAW_VER(pkt) == 6) { - if (unlikely(pq != NULL)) { - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt, plen, DECODE_TUNNEL_IPV6, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_IPV6); - PacketEnqueue(pq,tp); - StatsIncr(tv, dtv->counter_ipv6inipv6); - } + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt, plen, DECODE_TUNNEL_IPV6); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_IPV6); + PacketEnqueueNoLock(&tv->decode_pq,tp); + StatsIncr(tv, dtv->counter_ipv6inipv6); } } else { ENGINE_SET_EVENT(p, IPV6_IN_IPV6_WRONG_IP_VER); @@ -144,7 +139,7 @@ void DecodeIPV6FragHeader(Packet *p, const uint8_t *pkt, static void DecodeIPV6ExtHdrs(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint16_t len, PacketQueue *pq) + const uint8_t *pkt, uint16_t len) { SCEnter(); @@ -180,22 +175,22 @@ DecodeIPV6ExtHdrs(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, { case IPPROTO_TCP: IPV6_SET_L4PROTO(p,nh); - DecodeTCP(tv, dtv, p, pkt, plen, pq); + DecodeTCP(tv, dtv, p, pkt, plen); SCReturn; case IPPROTO_UDP: IPV6_SET_L4PROTO(p,nh); - DecodeUDP(tv, dtv, p, pkt, plen, pq); + DecodeUDP(tv, dtv, p, pkt, plen); SCReturn; case IPPROTO_ICMPV6: IPV6_SET_L4PROTO(p,nh); - DecodeICMPV6(tv, dtv, p, pkt, plen, pq); + DecodeICMPV6(tv, dtv, p, pkt, plen); SCReturn; case IPPROTO_SCTP: IPV6_SET_L4PROTO(p,nh); - DecodeSCTP(tv, dtv, p, pkt, plen, pq); + DecodeSCTP(tv, dtv, p, pkt, plen); SCReturn; case IPPROTO_ROUTING: @@ -524,7 +519,7 @@ DecodeIPV6ExtHdrs(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, } case IPPROTO_IPIP: IPV6_SET_L4PROTO(p,nh); - DecodeIPv4inIPv6(tv, dtv, p, pkt, plen, pq); + DecodeIPv4inIPv6(tv, dtv, p, pkt, plen); SCReturn; /* none, last header */ case IPPROTO_NONE: @@ -582,7 +577,7 @@ static int DecodeIPV6Packet (ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, c return 0; } -int DecodeIPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint16_t len, PacketQueue *pq) +int DecodeIPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint16_t len) { StatsIncr(tv, dtv->counter_ipv6); @@ -609,29 +604,29 @@ int DecodeIPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t * switch(IPV6_GET_NH(p)) { case IPPROTO_TCP: IPV6_SET_L4PROTO (p, IPPROTO_TCP); - DecodeTCP(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p), pq); + DecodeTCP(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); return TM_ECODE_OK; case IPPROTO_UDP: IPV6_SET_L4PROTO (p, IPPROTO_UDP); - DecodeUDP(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p), pq); + DecodeUDP(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); return TM_ECODE_OK; case IPPROTO_ICMPV6: IPV6_SET_L4PROTO (p, IPPROTO_ICMPV6); - DecodeICMPV6(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p), pq); + DecodeICMPV6(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); return TM_ECODE_OK; case IPPROTO_SCTP: IPV6_SET_L4PROTO (p, IPPROTO_SCTP); - DecodeSCTP(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p), pq); + DecodeSCTP(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); return TM_ECODE_OK; case IPPROTO_IPIP: IPV6_SET_L4PROTO(p, IPPROTO_IPIP); - DecodeIPv4inIPv6(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p), pq); + DecodeIPv4inIPv6(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); return TM_ECODE_OK; case IPPROTO_IPV6: - DecodeIP6inIP6(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p), pq); + DecodeIP6inIP6(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); return TM_ECODE_OK; case IPPROTO_GRE: - DecodeGRE(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p), pq); + DecodeGRE(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); break; case IPPROTO_FRAGMENT: case IPPROTO_HOPOPTS: @@ -643,7 +638,7 @@ int DecodeIPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t * case IPPROTO_MH: case IPPROTO_HIP: case IPPROTO_SHIM6: - DecodeIPV6ExtHdrs(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p), pq); + DecodeIPV6ExtHdrs(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); break; case IPPROTO_ICMP: ENGINE_SET_EVENT(p,IPV6_WITH_ICMPV4); @@ -657,9 +652,9 @@ int DecodeIPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t * /* Pass to defragger if a fragment. */ if (IPV6_EXTHDR_ISSET_FH(p)) { - Packet *rp = Defrag(tv, dtv, p, pq); + Packet *rp = Defrag(tv, dtv, p); if (rp != NULL) { - PacketEnqueue(pq,rp); + PacketEnqueueNoLock(&tv->decode_pq,rp); } } @@ -788,33 +783,31 @@ static int DecodeIPV6FragTest01 (void) ThreadVars tv; DecodeThreadVars dtv; int result = 0; - PacketQueue pq; FlowInitConfig(FLOW_QUIET); DefragInit(); - memset(&pq, 0, sizeof(PacketQueue)); memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); PacketCopyData(p1, raw_frag1, sizeof(raw_frag1)); PacketCopyData(p2, raw_frag2, sizeof(raw_frag2)); - DecodeIPV6(&tv, &dtv, p1, GET_PKT_DATA(p1), GET_PKT_LEN(p1), &pq); + DecodeIPV6(&tv, &dtv, p1, GET_PKT_DATA(p1), GET_PKT_LEN(p1)); if (!(IPV6_EXTHDR_ISSET_FH(p1))) { printf("ipv6 frag header not detected: "); goto end; } - DecodeIPV6(&tv, &dtv, p2, GET_PKT_DATA(p2), GET_PKT_LEN(p2), &pq); + DecodeIPV6(&tv, &dtv, p2, GET_PKT_DATA(p2), GET_PKT_LEN(p2)); if (!(IPV6_EXTHDR_ISSET_FH(p2))) { printf("ipv6 frag header not detected: "); goto end; } - if (pq.len != 1) { + if (tv.decode_pq.len != 1) { printf("no reassembled packet: "); goto end; } @@ -825,11 +818,11 @@ end: PACKET_RECYCLE(p2); SCFree(p1); SCFree(p2); - pkt = PacketDequeue(&pq); + pkt = PacketDequeueNoLock(&tv.decode_pq); while (pkt != NULL) { PACKET_RECYCLE(pkt); SCFree(pkt); - pkt = PacketDequeue(&pq); + pkt = PacketDequeueNoLock(&tv.decode_pq); } DefragDestroy(); FlowShutdown(); @@ -857,17 +850,15 @@ static int DecodeIPV6RouteTest01 (void) FAIL_IF(unlikely(p1 == NULL)); ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; FlowInitConfig(FLOW_QUIET); - memset(&pq, 0, sizeof(PacketQueue)); memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); PacketCopyData(p1, raw_pkt1, sizeof(raw_pkt1)); - DecodeIPV6(&tv, &dtv, p1, GET_PKT_DATA(p1), GET_PKT_LEN(p1), &pq); + DecodeIPV6(&tv, &dtv, p1, GET_PKT_DATA(p1), GET_PKT_LEN(p1)); FAIL_IF (!(IPV6_EXTHDR_ISSET_RH(p1))); FAIL_IF (p1->ip6eh.rh_type != 0); @@ -894,17 +885,15 @@ static int DecodeIPV6HopTest01 (void) FAIL_IF(unlikely(p1 == NULL)); ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; FlowInitConfig(FLOW_QUIET); - memset(&pq, 0, sizeof(PacketQueue)); memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); PacketCopyData(p1, raw_pkt1, sizeof(raw_pkt1)); - DecodeIPV6(&tv, &dtv, p1, GET_PKT_DATA(p1), GET_PKT_LEN(p1), &pq); + DecodeIPV6(&tv, &dtv, p1, GET_PKT_DATA(p1), GET_PKT_LEN(p1)); FAIL_IF (!(ENGINE_ISSET_EVENT(p1, IPV6_HOPOPTS_UNKNOWN_OPT))); diff --git a/src/decode-mpls.c b/src/decode-mpls.c index de23b8dc71..e64df63b7f 100644 --- a/src/decode-mpls.c +++ b/src/decode-mpls.c @@ -45,7 +45,7 @@ #define MPLS_PROTO_IPV6 6 int DecodeMPLS(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { uint32_t shim; int label; @@ -68,7 +68,7 @@ int DecodeMPLS(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, if (len > USHRT_MAX) { return TM_ECODE_FAILED; } - return DecodeIPV4(tv, dtv, p, pkt, len, pq); + return DecodeIPV4(tv, dtv, p, pkt, len); } else if (label == MPLS_LABEL_ROUTER_ALERT) { /* Not valid at the bottom of the stack. */ @@ -78,7 +78,7 @@ int DecodeMPLS(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, if (len > USHRT_MAX) { return TM_ECODE_FAILED; } - return DecodeIPV6(tv, dtv, p, pkt, len, pq); + return DecodeIPV6(tv, dtv, p, pkt, len); } else if (label == MPLS_LABEL_NULL) { /* Shouldn't appear on the wire. */ @@ -105,17 +105,16 @@ int DecodeMPLS(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, if (len > USHRT_MAX) { return TM_ECODE_FAILED; } - DecodeIPV4(tv, dtv, p, pkt, len, pq); + DecodeIPV4(tv, dtv, p, pkt, len); break; case MPLS_PROTO_IPV6: if (len > USHRT_MAX) { return TM_ECODE_FAILED; } - DecodeIPV6(tv, dtv, p, pkt, len, pq); + DecodeIPV6(tv, dtv, p, pkt, len); break; case MPLS_PROTO_ETHERNET_PW: - DecodeEthernet(tv, dtv, p, pkt + MPLS_PW_LEN, len - MPLS_PW_LEN, - pq); + DecodeEthernet(tv, dtv, p, pkt + MPLS_PW_LEN, len - MPLS_PW_LEN); break; default: ENGINE_SET_INVALID_EVENT(p, MPLS_UNKNOWN_PAYLOAD_TYPE); @@ -151,7 +150,7 @@ static int DecodeMPLSTestHeaderTooSmall(void) memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); - DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt), NULL); + DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt)); if (!ENGINE_ISSET_EVENT(p, MPLS_HEADER_TOO_SMALL)) { ret = 0; @@ -172,28 +171,28 @@ static int DecodeMPLSTestPacketTooSmall(void) Packet *p0 = SCCalloc(1, SIZE_OF_PACKET); memset(p0, 0, SIZE_OF_PACKET); uint8_t pkt0[] = { 0x00, 0x01, 0x51, 0xff }; - DecodeMPLS(&tv, &dtv, p0, pkt0, sizeof(pkt0), NULL); + DecodeMPLS(&tv, &dtv, p0, pkt0, sizeof(pkt0)); FAIL_IF_NOT(ENGINE_ISSET_EVENT(p0, MPLS_PKT_TOO_SMALL)); SCFree(p0); Packet *p1 = SCCalloc(1, SIZE_OF_PACKET); FAIL_IF_NULL(p1); uint8_t pkt1[] = { 0x00, 0x01, 0x51, 0xff, 0x45 }; - DecodeMPLS(&tv, &dtv, p1, pkt1, sizeof(pkt1), NULL); + DecodeMPLS(&tv, &dtv, p1, pkt1, sizeof(pkt1)); FAIL_IF_NOT(ENGINE_ISSET_EVENT(p1, MPLS_PKT_TOO_SMALL)); SCFree(p1); Packet *p2 = SCCalloc(1, SIZE_OF_PACKET); FAIL_IF_NULL(p2); uint8_t pkt2[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01 }; - DecodeMPLS(&tv, &dtv, p2, pkt2, sizeof(pkt2), NULL); + DecodeMPLS(&tv, &dtv, p2, pkt2, sizeof(pkt2)); FAIL_IF_NOT(ENGINE_ISSET_EVENT(p2, MPLS_PKT_TOO_SMALL)); SCFree(p2); Packet *p3 = SCCalloc(1, SIZE_OF_PACKET); FAIL_IF_NULL(p3); uint8_t pkt3[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01, 0x02 }; - DecodeMPLS(&tv, &dtv, p3, pkt3, sizeof(pkt3), NULL); + DecodeMPLS(&tv, &dtv, p3, pkt3, sizeof(pkt3)); FAIL_IF_NOT(ENGINE_ISSET_EVENT(p3, MPLS_PKT_TOO_SMALL)); SCFree(p3); @@ -202,7 +201,7 @@ static int DecodeMPLSTestPacketTooSmall(void) Packet *p4 = SCCalloc(1, SIZE_OF_PACKET); FAIL_IF_NULL(p4); uint8_t pkt4[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01, 0x02, 0x03 }; - DecodeMPLS(&tv, &dtv, p4, pkt4, sizeof(pkt4), NULL); + DecodeMPLS(&tv, &dtv, p4, pkt4, sizeof(pkt4)); FAIL_IF(ENGINE_ISSET_EVENT(p4, MPLS_PKT_TOO_SMALL)); SCFree(p4); @@ -239,7 +238,7 @@ static int DecodeMPLSTestBadLabelRouterAlert(void) memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); - DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt), NULL); + DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt)); if (!ENGINE_ISSET_EVENT(p, MPLS_BAD_LABEL_ROUTER_ALERT)) { ret = 0; @@ -279,7 +278,7 @@ static int DecodeMPLSTestBadLabelImplicitNull(void) memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); - DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt), NULL); + DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt)); if (!ENGINE_ISSET_EVENT(p, MPLS_BAD_LABEL_IMPLICIT_NULL)) { ret = 0; @@ -319,7 +318,7 @@ static int DecodeMPLSTestBadLabelReserved(void) memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); - DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt), NULL); + DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt)); if (!ENGINE_ISSET_EVENT(p, MPLS_BAD_LABEL_RESERVED)) { ret = 0; @@ -363,7 +362,7 @@ static int DecodeMPLSTestUnknownPayloadType(void) memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); - DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt), NULL); + DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt)); if (!ENGINE_ISSET_EVENT(p, MPLS_UNKNOWN_PAYLOAD_TYPE)) { ret = 0; diff --git a/src/decode-null.c b/src/decode-null.c index b42f50a53c..4712f1a643 100644 --- a/src/decode-null.c +++ b/src/decode-null.c @@ -46,7 +46,7 @@ #define HDR_SIZE 4 int DecodeNull(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { StatsIncr(tv, dtv->counter_null); @@ -63,11 +63,11 @@ int DecodeNull(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, switch(type) { case AF_INET: SCLogDebug("IPV4 Packet"); - DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p)+HDR_SIZE, GET_PKT_LEN(p)-HDR_SIZE, pq); + DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p)+HDR_SIZE, GET_PKT_LEN(p)-HDR_SIZE); break; case AF_INET6: SCLogDebug("IPV6 Packet"); - DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p)+HDR_SIZE, GET_PKT_LEN(p)-HDR_SIZE, pq); + DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p)+HDR_SIZE, GET_PKT_LEN(p)-HDR_SIZE); break; default: SCLogDebug("Unknown Null packet type version %" PRIu32 "", type); diff --git a/src/decode-ppp.c b/src/decode-ppp.c index bc12904d8a..7a865c5d48 100644 --- a/src/decode-ppp.c +++ b/src/decode-ppp.c @@ -41,7 +41,7 @@ #include "util-debug.h" int DecodePPP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { StatsIncr(tv, dtv->counter_ppp); @@ -71,7 +71,7 @@ int DecodePPP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, } if (likely(IPV4_GET_RAW_VER((IPV4Hdr *)(pkt + PPP_HEADER_LEN)) == 4)) { - return DecodeIPV4(tv, dtv, p, pkt + PPP_HEADER_LEN, len - PPP_HEADER_LEN, pq); + return DecodeIPV4(tv, dtv, p, pkt + PPP_HEADER_LEN, len - PPP_HEADER_LEN); } else return TM_ECODE_FAILED; break; @@ -86,7 +86,7 @@ int DecodePPP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, return TM_ECODE_FAILED; } - return DecodeIPV4(tv, dtv, p, pkt + PPP_HEADER_LEN, len - PPP_HEADER_LEN, pq); + return DecodeIPV4(tv, dtv, p, pkt + PPP_HEADER_LEN, len - PPP_HEADER_LEN); /* PPP IPv6 was not tested */ case PPP_IPV6: @@ -99,7 +99,7 @@ int DecodePPP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, return TM_ECODE_FAILED; } - return DecodeIPV6(tv, dtv, p, pkt + PPP_HEADER_LEN, len - PPP_HEADER_LEN, pq); + return DecodeIPV6(tv, dtv, p, pkt + PPP_HEADER_LEN, len - PPP_HEADER_LEN); case PPP_VJ_COMP: case PPP_IPX: @@ -159,7 +159,7 @@ static int DecodePPPtest01 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - DecodePPP(&tv, &dtv, p, raw_ppp, sizeof(raw_ppp), NULL); + DecodePPP(&tv, &dtv, p, raw_ppp, sizeof(raw_ppp)); /* Function my returns here with expected value */ @@ -192,7 +192,7 @@ static int DecodePPPtest02 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - DecodePPP(&tv, &dtv, p, raw_ppp, sizeof(raw_ppp), NULL); + DecodePPP(&tv, &dtv, p, raw_ppp, sizeof(raw_ppp)); /* Function must returns here */ @@ -229,7 +229,7 @@ static int DecodePPPtest03 (void) FlowInitConfig(FLOW_QUIET); - DecodePPP(&tv, &dtv, p, raw_ppp, sizeof(raw_ppp), NULL); + DecodePPP(&tv, &dtv, p, raw_ppp, sizeof(raw_ppp)); FlowShutdown(); @@ -287,7 +287,7 @@ static int DecodePPPtest04 (void) FlowInitConfig(FLOW_QUIET); - DecodePPP(&tv, &dtv, p, raw_ppp, sizeof(raw_ppp), NULL); + DecodePPP(&tv, &dtv, p, raw_ppp, sizeof(raw_ppp)); FlowShutdown(); diff --git a/src/decode-pppoe.c b/src/decode-pppoe.c index 8887a30dba..eef6629949 100644 --- a/src/decode-pppoe.c +++ b/src/decode-pppoe.c @@ -48,7 +48,7 @@ * \brief Main decoding function for PPPOE Discovery packets */ int DecodePPPOEDiscovery(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { StatsIncr(tv, dtv->counter_pppoe); @@ -128,7 +128,7 @@ int DecodePPPOEDiscovery(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, * \brief Main decoding function for PPPOE Session packets */ int DecodePPPOESession(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { StatsIncr(tv, dtv->counter_pppoe); @@ -193,7 +193,7 @@ int DecodePPPOESession(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, } if(IPV4_GET_RAW_VER((IPV4Hdr *)(pkt + PPPOE_SESSION_HEADER_LEN)) == 4) { - DecodeIPV4(tv, dtv, p, pkt + PPPOE_SESSION_HEADER_LEN, len - PPPOE_SESSION_HEADER_LEN, pq ); + DecodeIPV4(tv, dtv, p, pkt + PPPOE_SESSION_HEADER_LEN, len - PPPOE_SESSION_HEADER_LEN); } break; @@ -206,7 +206,7 @@ int DecodePPPOESession(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, return TM_ECODE_FAILED; } - DecodeIPV4(tv, dtv, p, pkt + PPPOE_SESSION_HEADER_LEN, len - PPPOE_SESSION_HEADER_LEN, pq ); + DecodeIPV4(tv, dtv, p, pkt + PPPOE_SESSION_HEADER_LEN, len - PPPOE_SESSION_HEADER_LEN); break; /* PPP IPv6 was not tested */ @@ -219,7 +219,7 @@ int DecodePPPOESession(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, return TM_ECODE_FAILED; } - DecodeIPV6(tv, dtv, p, pkt + PPPOE_SESSION_HEADER_LEN, len - PPPOE_SESSION_HEADER_LEN, pq ); + DecodeIPV6(tv, dtv, p, pkt + PPPOE_SESSION_HEADER_LEN, len - PPPOE_SESSION_HEADER_LEN); break; default: @@ -249,7 +249,7 @@ static int DecodePPPOEtest01 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe), NULL); + DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe)); if (ENGINE_ISSET_EVENT(p,PPPOE_PKT_TOO_SMALL)) { SCFree(p); @@ -290,7 +290,7 @@ static int DecodePPPOEtest02 (void) FlowInitConfig(FLOW_QUIET); - DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe), NULL); + DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe)); if(ENGINE_ISSET_EVENT(p,PPPOE_PKT_TOO_SMALL)) { goto end; @@ -335,7 +335,7 @@ static int DecodePPPOEtest03 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe), NULL); + DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe)); if (p->pppoedh == NULL) { SCFree(p); return 0; @@ -367,7 +367,7 @@ static int DecodePPPOEtest04 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe), NULL); + DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe)); if(ENGINE_ISSET_EVENT(p,PPPOE_WRONG_CODE)) { SCFree(p); @@ -402,7 +402,7 @@ static int DecodePPPOEtest05 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe), NULL); + DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe)); if(ENGINE_ISSET_EVENT(p,PPPOE_MALFORMED_TAGS)) { SCFree(p); diff --git a/src/decode-raw.c b/src/decode-raw.c index c8061e291f..1b9f9eb2b6 100644 --- a/src/decode-raw.c +++ b/src/decode-raw.c @@ -44,7 +44,7 @@ int DecodeRaw(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { StatsIncr(tv, dtv->counter_raw); @@ -61,13 +61,13 @@ int DecodeRaw(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, return TM_ECODE_FAILED; } SCLogDebug("IPV4 Packet"); - DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); } else if (IP_GET_RAW_VER(pkt) == 6) { if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) { return TM_ECODE_FAILED; } SCLogDebug("IPV6 Packet"); - DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); } else { SCLogDebug("Unknown ip version %d", IP_GET_RAW_VER(pkt)); ENGINE_SET_EVENT(p,IPRAW_INVALID_IPV); @@ -114,7 +114,7 @@ static int DecodeRawTest01 (void) FlowInitConfig(FLOW_QUIET); - DecodeRaw(&tv, &dtv, p, raw_ip, GET_PKT_LEN(p), NULL); + DecodeRaw(&tv, &dtv, p, raw_ip, GET_PKT_LEN(p)); if (p->ip6h == NULL) { printf("expected a valid ipv6 header but it was NULL: "); FlowShutdown(); @@ -160,7 +160,7 @@ static int DecodeRawTest02 (void) FlowInitConfig(FLOW_QUIET); - DecodeRaw(&tv, &dtv, p, raw_ip, GET_PKT_LEN(p), NULL); + DecodeRaw(&tv, &dtv, p, raw_ip, GET_PKT_LEN(p)); if (p->ip4h == NULL) { printf("expected a valid ipv4 header but it was NULL: "); PACKET_RECYCLE(p); @@ -208,7 +208,7 @@ static int DecodeRawTest03 (void) FlowInitConfig(FLOW_QUIET); - DecodeRaw(&tv, &dtv, p, raw_ip, GET_PKT_LEN(p), NULL); + DecodeRaw(&tv, &dtv, p, raw_ip, GET_PKT_LEN(p)); if (!ENGINE_ISSET_EVENT(p,IPRAW_INVALID_IPV)) { printf("expected IPRAW_INVALID_IPV to be set but it wasn't: "); FlowShutdown(); diff --git a/src/decode-sctp.c b/src/decode-sctp.c index ba2697b417..6de50d41b0 100644 --- a/src/decode-sctp.c +++ b/src/decode-sctp.c @@ -60,7 +60,7 @@ static int DecodeSCTPPacket(ThreadVars *tv, Packet *p, const uint8_t *pkt, uint1 } int DecodeSCTP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint16_t len, PacketQueue *pq) + const uint8_t *pkt, uint16_t len) { StatsIncr(tv, dtv->counter_sctp); diff --git a/src/decode-sll.c b/src/decode-sll.c index 41051fe4fd..6585608aaa 100644 --- a/src/decode-sll.c +++ b/src/decode-sll.c @@ -37,7 +37,7 @@ #include "util-debug.h" int DecodeSll(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { StatsIncr(tv, dtv->counter_sll); @@ -58,18 +58,18 @@ int DecodeSll(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, return TM_ECODE_FAILED; } DecodeIPV4(tv, dtv, p, pkt + SLL_HEADER_LEN, - len - SLL_HEADER_LEN, pq); + len - SLL_HEADER_LEN); break; case ETHERNET_TYPE_IPV6: if (unlikely(len > SLL_HEADER_LEN + USHRT_MAX)) { return TM_ECODE_FAILED; } DecodeIPV6(tv, dtv, p, pkt + SLL_HEADER_LEN, - len - SLL_HEADER_LEN, pq); + len - SLL_HEADER_LEN); break; case ETHERNET_TYPE_VLAN: DecodeVLAN(tv, dtv, p, pkt + SLL_HEADER_LEN, - len - SLL_HEADER_LEN, pq); + len - SLL_HEADER_LEN); break; default: SCLogDebug("p %p pkt %p sll type %04x not supported", p, diff --git a/src/decode-tcp.c b/src/decode-tcp.c index e3824d3351..b4aeb0e4bf 100644 --- a/src/decode-tcp.c +++ b/src/decode-tcp.c @@ -232,7 +232,7 @@ static int DecodeTCPPacket(ThreadVars *tv, Packet *p, const uint8_t *pkt, uint16 } int DecodeTCP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint16_t len, PacketQueue *pq) + const uint8_t *pkt, uint16_t len) { StatsIncr(tv, dtv->counter_tcp); @@ -372,7 +372,7 @@ static int TCPGetWscaleTest01(void) FlowInitConfig(FLOW_QUIET); - DecodeTCP(&tv, &dtv, p, raw_tcp, sizeof(raw_tcp), NULL); + DecodeTCP(&tv, &dtv, p, raw_tcp, sizeof(raw_tcp)); if (p->tcph == NULL) { printf("tcp packet decode failed: "); @@ -418,7 +418,7 @@ static int TCPGetWscaleTest02(void) p->ip4h = &ip4h; FlowInitConfig(FLOW_QUIET); - DecodeTCP(&tv, &dtv, p, raw_tcp, sizeof(raw_tcp), NULL); + DecodeTCP(&tv, &dtv, p, raw_tcp, sizeof(raw_tcp)); if (p->tcph == NULL) { printf("tcp packet decode failed: "); @@ -463,7 +463,7 @@ static int TCPGetWscaleTest03(void) p->ip4h = &ip4h; FlowInitConfig(FLOW_QUIET); - DecodeTCP(&tv, &dtv, p, raw_tcp, sizeof(raw_tcp), NULL); + DecodeTCP(&tv, &dtv, p, raw_tcp, sizeof(raw_tcp)); if (p->tcph == NULL) { printf("tcp packet decode failed: "); @@ -512,7 +512,7 @@ static int TCPGetSackTest01(void) p->ip4h = &ip4h; FlowInitConfig(FLOW_QUIET); - DecodeTCP(&tv, &dtv, p, raw_tcp, sizeof(raw_tcp), NULL); + DecodeTCP(&tv, &dtv, p, raw_tcp, sizeof(raw_tcp)); if (p->tcph == NULL) { printf("tcp packet decode failed: "); diff --git a/src/decode-template.c b/src/decode-template.c index f233106695..f47c736929 100644 --- a/src/decode-template.c +++ b/src/decode-template.c @@ -47,7 +47,7 @@ */ int DecodeTEMPLATE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { /* TODO add counter for your type of packet to DecodeThreadVars, * and register it in DecodeRegisterPerfCounters */ @@ -82,7 +82,7 @@ int DecodeTEMPLATE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, */ /* invoke the next decoder on the remainder of the data */ - return DecodeUDP(tv, dtv, p, (uint8_t *)pkt + hdr_len, len - hdr_len, pq); + return DecodeUDP(tv, dtv, p, (uint8_t *)pkt + hdr_len, len - hdr_len); } else { //ENGINE_SET_EVENT(p,TEMPLATE_UNSUPPORTED_PROTOCOL); return TM_ECODE_FAILED; diff --git a/src/decode-teredo.c b/src/decode-teredo.c index cb9602c85e..93e9711c51 100644 --- a/src/decode-teredo.c +++ b/src/decode-teredo.c @@ -61,7 +61,7 @@ void DecodeTeredoConfig(void) * \retval TM_ECODE_FAILED if packet is not a Teredo packet, TM_ECODE_OK if it is */ int DecodeTeredo(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint16_t len, PacketQueue *pq) + const uint8_t *pkt, uint16_t len) { if (!g_teredo_enabled) return TM_ECODE_FAILED; @@ -120,18 +120,16 @@ int DecodeTeredo(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, if (len == IPV6_HEADER_LEN + IPV6_GET_RAW_PLEN(thdr) + (start - pkt)) { - if (pq != NULL) { - int blen = len - (start - pkt); - /* spawn off tunnel packet */ - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, start, blen, - DECODE_TUNNEL_IPV6_TEREDO, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_TEREDO); - /* add the tp to the packet queue. */ - PacketEnqueue(pq,tp); - StatsIncr(tv, dtv->counter_teredo); - return TM_ECODE_OK; - } + int blen = len - (start - pkt); + /* spawn off tunnel packet */ + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, start, blen, + DECODE_TUNNEL_IPV6_TEREDO); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_TEREDO); + /* add the tp to the packet queue. */ + PacketEnqueueNoLock(&tv->decode_pq,tp); + StatsIncr(tv, dtv->counter_teredo); + return TM_ECODE_OK; } } return TM_ECODE_FAILED; diff --git a/src/decode-teredo.h b/src/decode-teredo.h index 10e596d5cd..1c414f19bf 100644 --- a/src/decode-teredo.h +++ b/src/decode-teredo.h @@ -19,7 +19,7 @@ #define __DECODE_TEREDO_H__ int DecodeTeredo(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint16_t len, PacketQueue *pq); + const uint8_t *pkt, uint16_t len); void DecodeTeredoConfig(void); #endif diff --git a/src/decode-udp.c b/src/decode-udp.c index 551f8298f5..225a15daa7 100644 --- a/src/decode-udp.c +++ b/src/decode-udp.c @@ -72,7 +72,7 @@ static int DecodeUDPPacket(ThreadVars *t, Packet *p, const uint8_t *pkt, uint16_ } int DecodeUDP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint16_t len, PacketQueue *pq) + const uint8_t *pkt, uint16_t len) { StatsIncr(tv, dtv->counter_udp); @@ -84,7 +84,7 @@ int DecodeUDP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, SCLogDebug("UDP sp: %" PRIu32 " -> dp: %" PRIu32 " - HLEN: %" PRIu32 " LEN: %" PRIu32 "", UDP_GET_SRC_PORT(p), UDP_GET_DST_PORT(p), UDP_HEADER_LEN, p->payload_len); - if (unlikely(DecodeTeredo(tv, dtv, p, p->payload, p->payload_len, pq) == TM_ECODE_OK)) { + if (unlikely(DecodeTeredo(tv, dtv, p, p->payload, p->payload_len) == TM_ECODE_OK)) { /* Here we have a Teredo packet and don't need to handle app * layer */ FlowSetupPacket(p); @@ -93,7 +93,7 @@ int DecodeUDP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, /* Handle VXLAN if configured */ if (DecodeVXLANEnabledForPort(p->sp, p->dp) && - unlikely(DecodeVXLAN(tv, dtv, p, p->payload, p->payload_len, pq) == TM_ECODE_OK)) { + unlikely(DecodeVXLAN(tv, dtv, p, p->payload, p->payload_len) == TM_ECODE_OK)) { /* Here we have a VXLAN packet and don't need to handle app * layer */ FlowSetupPacket(p); diff --git a/src/decode-vlan.c b/src/decode-vlan.c index 979014bc9b..49f228a8ab 100644 --- a/src/decode-vlan.c +++ b/src/decode-vlan.c @@ -45,7 +45,7 @@ #include "host.h" static int DecodeIEEE8021ah(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint16_t len, PacketQueue *pq); + const uint8_t *pkt, uint16_t len); /** * \internal @@ -60,7 +60,7 @@ static int DecodeIEEE8021ah(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, * */ int DecodeVLAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { uint32_t proto; @@ -97,22 +97,22 @@ int DecodeVLAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, } DecodeIPV4(tv, dtv, p, pkt + VLAN_HEADER_LEN, - len - VLAN_HEADER_LEN, pq); + len - VLAN_HEADER_LEN); break; case ETHERNET_TYPE_IPV6: if (unlikely(len > VLAN_HEADER_LEN + USHRT_MAX)) { return TM_ECODE_FAILED; } DecodeIPV6(tv, dtv, p, pkt + VLAN_HEADER_LEN, - len - VLAN_HEADER_LEN, pq); + len - VLAN_HEADER_LEN); break; case ETHERNET_TYPE_PPPOE_SESS: DecodePPPOESession(tv, dtv, p, pkt + VLAN_HEADER_LEN, - len - VLAN_HEADER_LEN, pq); + len - VLAN_HEADER_LEN); break; case ETHERNET_TYPE_PPPOE_DISC: DecodePPPOEDiscovery(tv, dtv, p, pkt + VLAN_HEADER_LEN, - len - VLAN_HEADER_LEN, pq); + len - VLAN_HEADER_LEN); break; case ETHERNET_TYPE_VLAN: case ETHERNET_TYPE_8021AD: @@ -121,19 +121,19 @@ int DecodeVLAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, return TM_ECODE_OK; } else { DecodeVLAN(tv, dtv, p, pkt + VLAN_HEADER_LEN, - len - VLAN_HEADER_LEN, pq); + len - VLAN_HEADER_LEN); } break; case ETHERNET_TYPE_8021AH: DecodeIEEE8021ah(tv, dtv, p, pkt + VLAN_HEADER_LEN, - len - VLAN_HEADER_LEN, pq); + len - VLAN_HEADER_LEN); break; case ETHERNET_TYPE_ARP: break; case ETHERNET_TYPE_MPLS_UNICAST: case ETHERNET_TYPE_MPLS_MULTICAST: DecodeMPLS(tv, dtv, p, pkt + VLAN_HEADER_LEN, - len - VLAN_HEADER_LEN, pq); + len - VLAN_HEADER_LEN); break; default: SCLogDebug("unknown VLAN type: %" PRIx32 "", proto); @@ -164,7 +164,7 @@ typedef struct IEEE8021ahHdr_ { #define IEEE8021AH_HEADER_LEN sizeof(IEEE8021ahHdr) static int DecodeIEEE8021ah(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint16_t len, PacketQueue *pq) + const uint8_t *pkt, uint16_t len) { StatsIncr(tv, dtv->counter_ieee8021ah); @@ -180,7 +180,7 @@ static int DecodeIEEE8021ah(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, case ETHERNET_TYPE_VLAN: case ETHERNET_TYPE_8021QINQ: { DecodeVLAN(tv, dtv, p, pkt + IEEE8021AH_HEADER_LEN, - len - IEEE8021AH_HEADER_LEN, pq); + len - IEEE8021AH_HEADER_LEN); break; } } @@ -210,7 +210,7 @@ static int DecodeVLANtest01 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - DecodeVLAN(&tv, &dtv, p, raw_vlan, sizeof(raw_vlan), NULL); + DecodeVLAN(&tv, &dtv, p, raw_vlan, sizeof(raw_vlan)); if(ENGINE_ISSET_EVENT(p,VLAN_HEADER_TOO_SMALL)) { SCFree(p); @@ -246,7 +246,7 @@ static int DecodeVLANtest02 (void) memset(&tv, 0, sizeof(ThreadVars)); memset(&dtv, 0, sizeof(DecodeThreadVars)); - DecodeVLAN(&tv, &dtv, p, raw_vlan, sizeof(raw_vlan), NULL); + DecodeVLAN(&tv, &dtv, p, raw_vlan, sizeof(raw_vlan)); if(ENGINE_ISSET_EVENT(p,VLAN_UNKNOWN_TYPE)) { @@ -285,7 +285,7 @@ static int DecodeVLANtest03 (void) FlowInitConfig(FLOW_QUIET); - DecodeVLAN(&tv, &dtv, p, raw_vlan, sizeof(raw_vlan), NULL); + DecodeVLAN(&tv, &dtv, p, raw_vlan, sizeof(raw_vlan)); if(p->vlan_id[0] == 0) { diff --git a/src/decode-vxlan.c b/src/decode-vxlan.c index 746d9b9792..ac4c51c085 100644 --- a/src/decode-vxlan.c +++ b/src/decode-vxlan.c @@ -117,7 +117,7 @@ typedef struct VXLANHeader_ { * \param len length in bytes of pkt */ int DecodeVXLAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq) + const uint8_t *pkt, uint32_t len) { if (unlikely(!g_vxlan_enabled)) return TM_ECODE_FAILED; @@ -147,28 +147,26 @@ int DecodeVXLAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, case ETHERNET_TYPE_ARP: SCLogDebug("VXLAN found ARP"); break; - case ETHERNET_TYPE_IP: + case ETHERNET_TYPE_IP: { SCLogDebug("VXLAN found IPv4"); - if (pq != NULL) { - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + VXLAN_HEADER_LEN + ETHERNET_HEADER_LEN, - len - (VXLAN_HEADER_LEN + ETHERNET_HEADER_LEN), DECODE_TUNNEL_IPV4, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_VXLAN); - PacketEnqueue(pq, tp); - } + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + VXLAN_HEADER_LEN + ETHERNET_HEADER_LEN, + len - (VXLAN_HEADER_LEN + ETHERNET_HEADER_LEN), DECODE_TUNNEL_IPV4); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_VXLAN); + PacketEnqueueNoLock(&tv->decode_pq, tp); } break; - case ETHERNET_TYPE_IPV6: + } + case ETHERNET_TYPE_IPV6: { SCLogDebug("VXLAN found IPv6"); - if (pq != NULL) { - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + VXLAN_HEADER_LEN + ETHERNET_HEADER_LEN, - len - (VXLAN_HEADER_LEN + ETHERNET_HEADER_LEN), DECODE_TUNNEL_IPV6, pq); - if (tp != NULL) { - PKT_SET_SRC(tp, PKT_SRC_DECODER_VXLAN); - PacketEnqueue(pq, tp); - } + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + VXLAN_HEADER_LEN + ETHERNET_HEADER_LEN, + len - (VXLAN_HEADER_LEN + ETHERNET_HEADER_LEN), DECODE_TUNNEL_IPV6); + if (tp != NULL) { + PKT_SET_SRC(tp, PKT_SRC_DECODER_VXLAN); + PacketEnqueueNoLock(&tv->decode_pq, tp); } break; + } default: SCLogDebug("VXLAN found no known Ethertype - only checks for IPv4, IPv6, ARP"); /* ENGINE_SET_INVALID_EVENT(p, VXLAN_UNKNOWN_PAYLOAD_TYPE);*/ @@ -200,21 +198,19 @@ static int DecodeVXLANtest01 (void) FAIL_IF_NULL(p); ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; DecodeVXLANConfigPorts("4789"); - memset(&pq, 0, sizeof(PacketQueue)); memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); memset(&dtv, 0, sizeof(DecodeThreadVars)); FlowInitConfig(FLOW_QUIET); - DecodeUDP(&tv, &dtv, p, raw_vxlan, sizeof(raw_vxlan), &pq); + DecodeUDP(&tv, &dtv, p, raw_vxlan, sizeof(raw_vxlan)); FAIL_IF(p->udph == NULL); - FAIL_IF(pq.top == NULL); - Packet *tp = PacketDequeue(&pq); + FAIL_IF(tv.decode_pq.top == NULL); + Packet *tp = PacketDequeueNoLock(&tv.decode_pq); FAIL_IF(tp->udph == NULL); FAIL_IF_NOT(tp->sp == 53); @@ -243,20 +239,18 @@ static int DecodeVXLANtest02 (void) FAIL_IF_NULL(p); ThreadVars tv; DecodeThreadVars dtv; - PacketQueue pq; DecodeVXLANConfigPorts("1"); - memset(&pq, 0, sizeof(PacketQueue)); memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); memset(&dtv, 0, sizeof(DecodeThreadVars)); FlowInitConfig(FLOW_QUIET); - DecodeUDP(&tv, &dtv, p, raw_vxlan, sizeof(raw_vxlan), &pq); + DecodeUDP(&tv, &dtv, p, raw_vxlan, sizeof(raw_vxlan)); FAIL_IF(p->udph == NULL); - FAIL_IF(pq.top != NULL); + FAIL_IF(tv.decode_pq.top != NULL); DecodeVXLANConfigPorts("4789"); /* reset */ FlowShutdown(); diff --git a/src/decode.c b/src/decode.c index 9d8aace0a7..6d7439f516 100644 --- a/src/decode.c +++ b/src/decode.c @@ -73,22 +73,22 @@ const char *stats_decoder_events_prefix; extern bool stats_stream_events; int DecodeTunnel(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq, enum DecodeTunnelProto proto) + const uint8_t *pkt, uint32_t len, enum DecodeTunnelProto proto) { switch (proto) { case DECODE_TUNNEL_PPP: - return DecodePPP(tv, dtv, p, pkt, len, pq); + return DecodePPP(tv, dtv, p, pkt, len); case DECODE_TUNNEL_IPV4: - return DecodeIPV4(tv, dtv, p, pkt, len, pq); + return DecodeIPV4(tv, dtv, p, pkt, len); case DECODE_TUNNEL_IPV6: case DECODE_TUNNEL_IPV6_TEREDO: - return DecodeIPV6(tv, dtv, p, pkt, len, pq); + return DecodeIPV6(tv, dtv, p, pkt, len); case DECODE_TUNNEL_VLAN: - return DecodeVLAN(tv, dtv, p, pkt, len, pq); + return DecodeVLAN(tv, dtv, p, pkt, len); case DECODE_TUNNEL_ETHERNET: - return DecodeEthernet(tv, dtv, p, pkt, len, pq); + return DecodeEthernet(tv, dtv, p, pkt, len); case DECODE_TUNNEL_ERSPAN: - return DecodeERSPAN(tv, dtv, p, pkt, len, pq); + return DecodeERSPAN(tv, dtv, p, pkt, len); default: SCLogDebug("FIXME: DecodeTunnel: protocol %" PRIu32 " not supported.", proto); break; @@ -273,8 +273,7 @@ inline int PacketCopyData(Packet *p, const uint8_t *pktdata, uint32_t pktlen) * \retval p the pseudo packet or NULL if out of memory */ Packet *PacketTunnelPktSetup(ThreadVars *tv, DecodeThreadVars *dtv, Packet *parent, - const uint8_t *pkt, uint32_t len, enum DecodeTunnelProto proto, - PacketQueue *pq) + const uint8_t *pkt, uint32_t len, enum DecodeTunnelProto proto) { int ret; @@ -304,7 +303,7 @@ Packet *PacketTunnelPktSetup(ThreadVars *tv, DecodeThreadVars *dtv, Packet *pare SET_TUNNEL_PKT(p); ret = DecodeTunnel(tv, dtv, p, GET_PKT_DATA(p), - GET_PKT_LEN(p), pq, proto); + GET_PKT_LEN(p), proto); if (unlikely(ret != TM_ECODE_OK) || (proto == DECODE_TUNNEL_IPV6_TEREDO && (p->flags & PKT_IS_INVALID))) diff --git a/src/decode.h b/src/decode.h index a15c193c86..338173df23 100644 --- a/src/decode.h +++ b/src/decode.h @@ -618,37 +618,6 @@ extern int g_default_mtu; uint32_t default_packet_size; #define SIZE_OF_PACKET (default_packet_size + sizeof(Packet)) -/** \brief simple fifo queue for packets - * - * \note PacketQueueNoLock and PacketQueue need to keep identical - * layouts except for the mutex_q and cond_q fields. - */ -typedef struct PacketQueueNoLock_ { - Packet *top; - Packet *bot; - uint32_t len; -#ifdef DBG_PERF - uint32_t dbg_maxlen; -#endif /* DBG_PERF */ -} PacketQueueNoLock; - -/** \brief simple fifo queue for packets with mutex and cond - * Calling the mutex or triggering the cond is responsibility of the caller - * - * \note PacketQueueNoLock and PacketQueue need to keep identical - * layouts except for the mutex_q and cond_q fields. - */ -typedef struct PacketQueue_ { - Packet *top; - Packet *bot; - uint32_t len; -#ifdef DBG_PERF - uint32_t dbg_maxlen; -#endif /* DBG_PERF */ - SCMutex mutex_q; - SCCondT cond_q; -} PacketQueue; - /** \brief Structure to hold thread specific data for all decode modules */ typedef struct DecodeThreadVars_ { @@ -918,7 +887,7 @@ enum DecodeTunnelProto { }; Packet *PacketTunnelPktSetup(ThreadVars *tv, DecodeThreadVars *dtv, Packet *parent, - const uint8_t *pkt, uint32_t len, enum DecodeTunnelProto proto, PacketQueue *pq); + const uint8_t *pkt, uint32_t len, enum DecodeTunnelProto proto); Packet *PacketDefragPktSetup(Packet *parent, const uint8_t *pkt, uint32_t len, uint8_t proto); void PacketDefragPktSetupParent(Packet *parent); void DecodeRegisterPerfCounters(DecodeThreadVars *, ThreadVars *); @@ -943,27 +912,27 @@ void DecodeUpdatePacketCounters(ThreadVars *tv, const DecodeThreadVars *dtv, const Packet *p); /* decoder functions */ -int DecodeEthernet(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodeSll(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodePPP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodePPPOESession(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodePPPOEDiscovery(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodeTunnel(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *, enum DecodeTunnelProto) __attribute__ ((warn_unused_result)); -int DecodeNull(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodeRaw(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodeIPV4(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t, PacketQueue *); -int DecodeIPV6(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t, PacketQueue *); -int DecodeICMPV4(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodeICMPV6(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodeTCP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t, PacketQueue *); -int DecodeUDP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t, PacketQueue *); -int DecodeSCTP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t, PacketQueue *); -int DecodeGRE(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodeVLAN(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodeVXLAN(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodeMPLS(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodeERSPAN(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); -int DecodeTEMPLATE(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *); +int DecodeEthernet(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodeSll(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodePPP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodePPPOESession(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodePPPOEDiscovery(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodeTunnel(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, enum DecodeTunnelProto) __attribute__ ((warn_unused_result)); +int DecodeNull(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodeRaw(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodeIPV4(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t); +int DecodeIPV6(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t); +int DecodeICMPV4(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodeICMPV6(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodeTCP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t); +int DecodeUDP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t); +int DecodeSCTP(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t); +int DecodeGRE(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodeVLAN(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodeVXLAN(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodeMPLS(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodeERSPAN(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); +int DecodeTEMPLATE(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t); #ifdef UNITTESTS void DecodeIPV6FragHeader(Packet *p, const uint8_t *pkt, @@ -974,12 +943,12 @@ void DecodeIPV6FragHeader(Packet *p, const uint8_t *pkt, void AddressDebugPrint(Address *); typedef int (*DecoderFunc)(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq); + const uint8_t *pkt, uint32_t len); #ifdef AFLFUZZ_DECODER int AFLDecodeIPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq); + const uint8_t *pkt, uint32_t len); int AFLDecodeIPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, - const uint8_t *pkt, uint32_t len, PacketQueue *pq); + const uint8_t *pkt, uint32_t len); int DecoderParseDataFromFile(char *filename, DecoderFunc Decoder); int DecoderParseDataFromFileSerie(char *fileprefix, DecoderFunc Decoder); #endif diff --git a/src/defrag.c b/src/defrag.c index d388438385..fa66ff611e 100644 --- a/src/defrag.c +++ b/src/defrag.c @@ -532,7 +532,7 @@ int DefragRbFragCompare(struct Frag_ *a, struct Frag_ *b) { * \todo Allocate packet buffers from a pool. */ static Packet * -DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, Packet *p, PacketQueue *pq) +DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, Packet *p) { Packet *r = NULL; int ltrim = 0; @@ -887,8 +887,8 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, r = Defrag4Reassemble(tv, tracker, p); if (r != NULL && tv != NULL && dtv != NULL) { StatsIncr(tv, dtv->counter_defrag_ipv4_reassembled); - if (pq && DecodeIPV4(tv, dtv, r, (void *)r->ip4h, - IPV4_GET_IPLEN(r), pq) != TM_ECODE_OK) { + if (DecodeIPV4(tv, dtv, r, (void *)r->ip4h, + IPV4_GET_IPLEN(r)) != TM_ECODE_OK) { UNSET_TUNNEL_PKT(r); r->root = NULL; @@ -903,9 +903,9 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, r = Defrag6Reassemble(tv, tracker, p); if (r != NULL && tv != NULL && dtv != NULL) { StatsIncr(tv, dtv->counter_defrag_ipv6_reassembled); - if (pq && DecodeIPV6(tv, dtv, r, (uint8_t *)r->ip6h, - IPV6_GET_PLEN(r) + IPV6_HEADER_LEN, - pq) != TM_ECODE_OK) { + if (DecodeIPV6(tv, dtv, r, (uint8_t *)r->ip6h, + IPV6_GET_PLEN(r) + IPV6_HEADER_LEN) + != TM_ECODE_OK) { UNSET_TUNNEL_PKT(r); r->root = NULL; @@ -1019,7 +1019,7 @@ DefragGetTracker(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p) * NULL is returned. */ Packet * -Defrag(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, PacketQueue *pq) +Defrag(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p) { uint16_t frag_offset; uint8_t more_frags; @@ -1058,7 +1058,7 @@ Defrag(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, PacketQueue *pq) if (tracker == NULL) return NULL; - Packet *rp = DefragInsertFrag(tv, dtv, tracker, p, pq); + Packet *rp = DefragInsertFrag(tv, dtv, tracker, p); DefragTrackerRelease(tracker); return rp; @@ -1263,10 +1263,10 @@ static int DefragInOrderSimpleTest(void) p3 = BuildTestPacket(IPPROTO_ICMP, id, 2, 0, 'C', 3); FAIL_IF_NULL(p3); - FAIL_IF(Defrag(NULL, NULL, p1, NULL) != NULL); - FAIL_IF(Defrag(NULL, NULL, p2, NULL) != NULL); + FAIL_IF(Defrag(NULL, NULL, p1) != NULL); + FAIL_IF(Defrag(NULL, NULL, p2) != NULL); - reassembled = Defrag(NULL, NULL, p3, NULL); + reassembled = Defrag(NULL, NULL, p3); FAIL_IF_NULL(reassembled); FAIL_IF(IPV4_GET_HLEN(reassembled) != 20); @@ -1315,10 +1315,10 @@ static int DefragReverseSimpleTest(void) p3 = BuildTestPacket(IPPROTO_ICMP, id, 2, 0, 'C', 3); FAIL_IF_NULL(p3); - FAIL_IF(Defrag(NULL, NULL, p3, NULL) != NULL); - FAIL_IF(Defrag(NULL, NULL, p2, NULL) != NULL); + FAIL_IF(Defrag(NULL, NULL, p3) != NULL); + FAIL_IF(Defrag(NULL, NULL, p2) != NULL); - reassembled = Defrag(NULL, NULL, p1, NULL); + reassembled = Defrag(NULL, NULL, p1); FAIL_IF_NULL(reassembled); FAIL_IF(IPV4_GET_HLEN(reassembled) != 20); @@ -1368,9 +1368,9 @@ static int IPV6DefragInOrderSimpleTest(void) p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6, id, 2, 0, 'C', 3); FAIL_IF_NULL(p3); - FAIL_IF(Defrag(NULL, NULL, p1, NULL) != NULL); - FAIL_IF(Defrag(NULL, NULL, p2, NULL) != NULL); - reassembled = Defrag(NULL, NULL, p3, NULL); + FAIL_IF(Defrag(NULL, NULL, p1) != NULL); + FAIL_IF(Defrag(NULL, NULL, p2) != NULL); + reassembled = Defrag(NULL, NULL, p3); FAIL_IF_NULL(reassembled); FAIL_IF(IPV6_GET_PLEN(reassembled) != 19); @@ -1419,9 +1419,9 @@ static int IPV6DefragReverseSimpleTest(void) p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6, id, 2, 0, 'C', 3); FAIL_IF_NULL(p3); - FAIL_IF(Defrag(NULL, NULL, p3, NULL) != NULL); - FAIL_IF(Defrag(NULL, NULL, p2, NULL) != NULL); - reassembled = Defrag(NULL, NULL, p1, NULL); + FAIL_IF(Defrag(NULL, NULL, p3) != NULL); + FAIL_IF(Defrag(NULL, NULL, p2) != NULL); + reassembled = Defrag(NULL, NULL, p1); FAIL_IF_NULL(reassembled); /* 40 bytes in we should find 8 bytes of A. */ @@ -1527,13 +1527,13 @@ static int DefragDoSturgesNovakTest(int policy, u_char *expected, /* Send all but the last. */ for (i = 0; i < 9; i++) { - Packet *tp = Defrag(NULL, NULL, packets[i], NULL); + Packet *tp = Defrag(NULL, NULL, packets[i]); FAIL_IF_NOT_NULL(tp); FAIL_IF(ENGINE_ISSET_EVENT(packets[i], IPV4_FRAG_OVERLAP)); } int overlap = 0; for (; i < 16; i++) { - Packet *tp = Defrag(NULL, NULL, packets[i], NULL); + Packet *tp = Defrag(NULL, NULL, packets[i]); FAIL_IF_NOT_NULL(tp); if (ENGINE_ISSET_EVENT(packets[i], IPV4_FRAG_OVERLAP)) { overlap++; @@ -1542,7 +1542,7 @@ static int DefragDoSturgesNovakTest(int policy, u_char *expected, FAIL_IF_NOT(overlap); /* And now the last one. */ - Packet *reassembled = Defrag(NULL, NULL, packets[16], NULL); + Packet *reassembled = Defrag(NULL, NULL, packets[16]); FAIL_IF_NULL(reassembled); FAIL_IF(IPV4_GET_HLEN(reassembled) != 20); @@ -1639,13 +1639,13 @@ static int IPV6DefragDoSturgesNovakTest(int policy, u_char *expected, /* Send all but the last. */ for (i = 0; i < 9; i++) { - Packet *tp = Defrag(NULL, NULL, packets[i], NULL); + Packet *tp = Defrag(NULL, NULL, packets[i]); FAIL_IF_NOT_NULL(tp); FAIL_IF(ENGINE_ISSET_EVENT(packets[i], IPV6_FRAG_OVERLAP)); } int overlap = 0; for (; i < 16; i++) { - Packet *tp = Defrag(NULL, NULL, packets[i], NULL); + Packet *tp = Defrag(NULL, NULL, packets[i]); FAIL_IF_NOT_NULL(tp); if (ENGINE_ISSET_EVENT(packets[i], IPV6_FRAG_OVERLAP)) { overlap++; @@ -1654,7 +1654,7 @@ static int IPV6DefragDoSturgesNovakTest(int policy, u_char *expected, FAIL_IF_NOT(overlap); /* And now the last one. */ - Packet *reassembled = Defrag(NULL, NULL, packets[16], NULL); + Packet *reassembled = Defrag(NULL, NULL, packets[16]); FAIL_IF_NULL(reassembled); FAIL_IF(memcmp(GET_PKT_DATA(reassembled) + 40, expected, expected_len) != 0); @@ -2107,7 +2107,7 @@ static int DefragTimeoutTest(void) Packet *p = BuildTestPacket(IPPROTO_ICMP,i, 0, 1, 'A' + i, 16); FAIL_IF_NULL(p); - Packet *tp = Defrag(NULL, NULL, p, NULL); + Packet *tp = Defrag(NULL, NULL, p); SCFree(p); FAIL_IF_NOT_NULL(tp); } @@ -2118,7 +2118,7 @@ static int DefragTimeoutTest(void) FAIL_IF_NULL(p); p->ts.tv_sec += (defrag_context->timeout + 1); - Packet *tp = Defrag(NULL, NULL, p, NULL); + Packet *tp = Defrag(NULL, NULL, p); FAIL_IF_NOT_NULL(tp); DefragTracker *tracker = DefragLookupTrackerFromHash(p); @@ -2154,7 +2154,7 @@ static int DefragIPv4NoDataTest(void) FAIL_IF_NULL(p); /* We do not expect a packet returned. */ - FAIL_IF(Defrag(NULL, NULL, p, NULL) != NULL); + FAIL_IF(Defrag(NULL, NULL, p) != NULL); /* The fragment should have been ignored so no fragments should * have been allocated from the pool. */ @@ -2183,7 +2183,7 @@ static int DefragIPv4TooLargeTest(void) FAIL_IF_NULL(p); /* We do not expect a packet returned. */ - FAIL_IF(Defrag(NULL, NULL, p, NULL) != NULL); + FAIL_IF(Defrag(NULL, NULL, p) != NULL); /* We do expect an event. */ FAIL_IF_NOT(ENGINE_ISSET_EVENT(p, IPV4_FRAG_PKT_TOO_LARGE)); @@ -2216,15 +2216,15 @@ static int DefragVlanTest(void) FAIL_IF_NULL(p2); /* With no VLAN IDs set, packets should re-assemble. */ - FAIL_IF((r = Defrag(NULL, NULL, p1, NULL)) != NULL); - FAIL_IF((r = Defrag(NULL, NULL, p2, NULL)) == NULL); + FAIL_IF((r = Defrag(NULL, NULL, p1)) != NULL); + FAIL_IF((r = Defrag(NULL, NULL, p2)) == NULL); SCFree(r); /* With mismatched VLANs, packets should not re-assemble. */ p1->vlan_id[0] = 1; p2->vlan_id[0] = 2; - FAIL_IF((r = Defrag(NULL, NULL, p1, NULL)) != NULL); - FAIL_IF((r = Defrag(NULL, NULL, p2, NULL)) != NULL); + FAIL_IF((r = Defrag(NULL, NULL, p1)) != NULL); + FAIL_IF((r = Defrag(NULL, NULL, p2)) != NULL); SCFree(p1); SCFree(p2); @@ -2248,8 +2248,8 @@ static int DefragVlanQinQTest(void) FAIL_IF_NULL(p2); /* With no VLAN IDs set, packets should re-assemble. */ - FAIL_IF((r = Defrag(NULL, NULL, p1, NULL)) != NULL); - FAIL_IF((r = Defrag(NULL, NULL, p2, NULL)) == NULL); + FAIL_IF((r = Defrag(NULL, NULL, p1)) != NULL); + FAIL_IF((r = Defrag(NULL, NULL, p2)) == NULL); SCFree(r); /* With mismatched VLANs, packets should not re-assemble. */ @@ -2257,8 +2257,8 @@ static int DefragVlanQinQTest(void) p2->vlan_id[0] = 1; p1->vlan_id[1] = 1; p2->vlan_id[1] = 2; - FAIL_IF((r = Defrag(NULL, NULL, p1, NULL)) != NULL); - FAIL_IF((r = Defrag(NULL, NULL, p2, NULL)) != NULL); + FAIL_IF((r = Defrag(NULL, NULL, p1)) != NULL); + FAIL_IF((r = Defrag(NULL, NULL, p2)) != NULL); SCFree(p1); SCFree(p2); @@ -2329,14 +2329,14 @@ static int DefragMfIpv4Test(void) Packet *p3 = BuildTestPacket(IPPROTO_ICMP, ip_id, 1, 0, 'B', 8); FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL); - p = Defrag(NULL, NULL, p1, NULL); + p = Defrag(NULL, NULL, p1); FAIL_IF_NOT_NULL(p); - p = Defrag(NULL, NULL, p2, NULL); + p = Defrag(NULL, NULL, p2); FAIL_IF_NOT_NULL(p); /* This should return a packet as MF=0. */ - p = Defrag(NULL, NULL, p3, NULL); + p = Defrag(NULL, NULL, p3); FAIL_IF_NULL(p); /* Expected IP length is 20 + 8 + 8 = 36 as only 2 of the @@ -2372,14 +2372,14 @@ static int DefragMfIpv6Test(void) Packet *p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6, ip_id, 1, 0, 'B', 8); FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL); - p = Defrag(NULL, NULL, p1, NULL); + p = Defrag(NULL, NULL, p1); FAIL_IF_NOT_NULL(p); - p = Defrag(NULL, NULL, p2, NULL); + p = Defrag(NULL, NULL, p2); FAIL_IF_NOT_NULL(p); /* This should return a packet as MF=0. */ - p = Defrag(NULL, NULL, p3, NULL); + p = Defrag(NULL, NULL, p3); FAIL_IF_NULL(p); /* For IPv6 the expected length is just the length of the payload @@ -2412,9 +2412,9 @@ static int DefragTestBadProto(void) p3 = BuildTestPacket(IPPROTO_ICMP, id, 2, 0, 'C', 3); FAIL_IF_NULL(p3); - FAIL_IF_NOT_NULL(Defrag(NULL, NULL, p1, NULL)); - FAIL_IF_NOT_NULL(Defrag(NULL, NULL, p2, NULL)); - FAIL_IF_NOT_NULL(Defrag(NULL, NULL, p3, NULL)); + FAIL_IF_NOT_NULL(Defrag(NULL, NULL, p1)); + FAIL_IF_NOT_NULL(Defrag(NULL, NULL, p2)); + FAIL_IF_NOT_NULL(Defrag(NULL, NULL, p3)); SCFree(p1); SCFree(p2); @@ -2456,16 +2456,16 @@ static int DefragTestJeremyLinux(void) packets[2] = BuildTestPacket(IPPROTO_ICMP, id, 24 >> 3, 1, 'C', 48); packets[3] = BuildTestPacket(IPPROTO_ICMP, id, 88 >> 3, 0, 'D', 14); - Packet *r = Defrag(NULL, NULL, packets[0], NULL); + Packet *r = Defrag(NULL, NULL, packets[0]); FAIL_IF_NOT_NULL(r); - r = Defrag(NULL, NULL, packets[1], NULL); + r = Defrag(NULL, NULL, packets[1]); FAIL_IF_NOT_NULL(r); - r = Defrag(NULL, NULL, packets[2], NULL); + r = Defrag(NULL, NULL, packets[2]); FAIL_IF_NOT_NULL(r); - r = Defrag(NULL, NULL, packets[3], NULL); + r = Defrag(NULL, NULL, packets[3]); FAIL_IF_NULL(r); FAIL_IF(memcmp(expected, GET_PKT_DATA(r) + 20, sizeof(expected)) != 0); diff --git a/src/defrag.h b/src/defrag.h index e8869b95de..771616e4dd 100644 --- a/src/defrag.h +++ b/src/defrag.h @@ -127,7 +127,7 @@ void DefragReload(void); /**< use only in unittests */ uint8_t DefragGetOsPolicy(Packet *); void DefragTrackerFreeFrags(DefragTracker *); -Packet *Defrag(ThreadVars *, DecodeThreadVars *, Packet *, PacketQueue *); +Packet *Defrag(ThreadVars *, DecodeThreadVars *, Packet *); void DefragRegisterTests(void); #endif /* __DEFRAG_H__ */ diff --git a/src/detect-content.c b/src/detect-content.c index 79cff1dfa9..aea8776b63 100644 --- a/src/detect-content.c +++ b/src/detect-content.c @@ -987,7 +987,7 @@ static int DetectContentLongPatternMatchTest(uint8_t *raw_eth_pkt, uint16_t pkts memset(&th_v, 0, sizeof(th_v)); FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&th_v, &dtv, p, raw_eth_pkt, pktsize, NULL); + DecodeEthernet(&th_v, &dtv, p, raw_eth_pkt, pktsize); DetectEngineCtx *de_ctx = DetectEngineCtxInit(); if (de_ctx == NULL) { diff --git a/src/detect-csum.c b/src/detect-csum.c index 5e36f54ce5..95e40df00b 100644 --- a/src/detect-csum.c +++ b/src/detect-csum.c @@ -1038,7 +1038,7 @@ static int DetectCsumICMPV6Test01(void) FAIL_IF_NULL(s); SigGroupBuild(de_ctx); - DecodeEthernet(&tv, &dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), NULL); + DecodeEthernet(&tv, &dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); DetectEngineThreadCtxInit(&tv, (void *)de_ctx, (void *)&det_ctx); diff --git a/src/detect-dsize.c b/src/detect-dsize.c index c92adfc7ad..7f6deb2166 100644 --- a/src/detect-dsize.c +++ b/src/detect-dsize.c @@ -907,7 +907,7 @@ static int DetectDsizeIcmpv6Test01 (void) p->dst.family = AF_INET6; p->ip6h = &ip6h; - DecodeIPV6(&tv, &dtv, p, raw_icmpv6, sizeof(raw_icmpv6), NULL); + DecodeIPV6(&tv, &dtv, p, raw_icmpv6, sizeof(raw_icmpv6)); DetectEngineCtx *de_ctx = DetectEngineCtxInit(); if (de_ctx == NULL) { diff --git a/src/detect-fragbits.c b/src/detect-fragbits.c index 06e5efc375..6b600d412b 100644 --- a/src/detect-fragbits.c +++ b/src/detect-fragbits.c @@ -484,7 +484,7 @@ static int FragBitsTestParse03 (void) FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth), NULL); + DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth)); de = DetectFragBitsParse("D"); @@ -571,7 +571,7 @@ static int FragBitsTestParse04 (void) FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth), NULL); + DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth)); de = DetectFragBitsParse("!D"); diff --git a/src/detect-icmp-id.c b/src/detect-icmp-id.c index 7faaa8d2e4..da9cb3016a 100644 --- a/src/detect-icmp-id.c +++ b/src/detect-icmp-id.c @@ -498,7 +498,7 @@ static int DetectIcmpIdMatchTest02 (void) ip4h.s_ip_dst.s_addr = p->dst.addr_data32[0]; p->ip4h = &ip4h; - DecodeICMPV4(&th_v, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4), NULL); + DecodeICMPV4(&th_v, &dtv, p, raw_icmpv4, sizeof(raw_icmpv4)); DetectEngineCtx *de_ctx = DetectEngineCtxInit(); if (de_ctx == NULL) { diff --git a/src/detect-ipproto.c b/src/detect-ipproto.c index f641f4520d..4c23e6ec48 100644 --- a/src/detect-ipproto.c +++ b/src/detect-ipproto.c @@ -1927,7 +1927,7 @@ static int DetectIPProtoTestSig2(void) memset(&th_v, 0, sizeof(th_v)); FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&th_v, &dtv, p, raw_eth, sizeof(raw_eth), NULL); + DecodeEthernet(&th_v, &dtv, p, raw_eth, sizeof(raw_eth)); DetectEngineCtx *de_ctx = DetectEngineCtxInit(); if (de_ctx == NULL) { @@ -2012,7 +2012,7 @@ static int DetectIPProtoTestSig3(void) memset(&th_v, 0, sizeof(th_v)); FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&th_v, &dtv, p, raw_eth, sizeof(raw_eth), NULL); + DecodeEthernet(&th_v, &dtv, p, raw_eth, sizeof(raw_eth)); DetectEngineCtx *de_ctx = DetectEngineCtxInit(); if (de_ctx == NULL) { diff --git a/src/detect-parse.c b/src/detect-parse.c index 544b204ac2..f73ba76cec 100644 --- a/src/detect-parse.c +++ b/src/detect-parse.c @@ -3574,7 +3574,7 @@ static int SigTestBidirec04 (void) memset(p, 0, SIZE_OF_PACKET); FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&th_v, &dtv, p, rawpkt1_ether, sizeof(rawpkt1_ether), NULL); + DecodeEthernet(&th_v, &dtv, p, rawpkt1_ether, sizeof(rawpkt1_ether)); DetectEngineThreadCtxInit(&th_v, (void *)de_ctx, (void *)&det_ctx); /* At this point we have a list of 4 signatures. The last one diff --git a/src/detect-replace.c b/src/detect-replace.c index d348a4b996..bb09221830 100644 --- a/src/detect-replace.c +++ b/src/detect-replace.c @@ -270,7 +270,7 @@ int DetectReplaceLongPatternMatchTest(uint8_t *raw_eth_pkt, uint16_t pktsize, dtv.app_tctx = AppLayerGetCtxThread(&th_v); FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&th_v, &dtv, p, GET_PKT_DATA(p), pktsize, NULL); + DecodeEthernet(&th_v, &dtv, p, GET_PKT_DATA(p), pktsize); DetectEngineCtx *de_ctx = DetectEngineCtxInit(); if (de_ctx == NULL) { diff --git a/src/flow-worker.c b/src/flow-worker.c index 3373aa3724..d857532507 100644 --- a/src/flow-worker.c +++ b/src/flow-worker.c @@ -189,7 +189,7 @@ static void FlowPruneFiles(Packet *p) } } -static TmEcode FlowWorker(ThreadVars *tv, Packet *p, void *data, PacketQueue *preq) +static TmEcode FlowWorker(ThreadVars *tv, Packet *p, void *data) { FlowWorkerThreadData *fw = data; void *detect_thread = SC_ATOMIC_GET(fw->detect_thread); @@ -266,7 +266,7 @@ static TmEcode FlowWorker(ThreadVars *tv, Packet *p, void *data, PacketQueue *pr /* put these packets in the preq queue so that they are * by the other thread modules before packet 'p'. */ - PacketEnqueue(preq, x); + PacketEnqueueNoLock(&tv->decode_pq, x); } /* handle the app layer part of the UDP packet payload */ diff --git a/src/packet-queue.h b/src/packet-queue.h index 77a0d87ef2..8d11f4a3f4 100644 --- a/src/packet-queue.h +++ b/src/packet-queue.h @@ -24,14 +24,44 @@ #ifndef __PACKET_QUEUE_H__ #define __PACKET_QUEUE_H__ -#include "threads.h" +/** \brief simple fifo queue for packets + * + * \note PacketQueueNoLock and PacketQueue need to keep identical + * layouts except for the mutex_q and cond_q fields. + */ +typedef struct PacketQueueNoLock_ { + struct Packet_ *top; + struct Packet_ *bot; + uint32_t len; +#ifdef DBG_PERF + uint32_t dbg_maxlen; +#endif /* DBG_PERF */ +} PacketQueueNoLock; + +/** \brief simple fifo queue for packets with mutex and cond + * Calling the mutex or triggering the cond is responsibility of the caller + * + * \note PacketQueueNoLock and PacketQueue need to keep identical + * layouts except for the mutex_q and cond_q fields. + */ +typedef struct PacketQueue_ { + struct Packet_ *top; + struct Packet_ *bot; + uint32_t len; +#ifdef DBG_PERF + uint32_t dbg_maxlen; +#endif /* DBG_PERF */ + SCMutex mutex_q; + SCCondT cond_q; +} PacketQueue; + #include "decode.h" -void PacketEnqueueNoLock(PacketQueueNoLock *qnl, Packet *p); -void PacketEnqueue (PacketQueue *, Packet *); +void PacketEnqueueNoLock(PacketQueueNoLock *qnl, struct Packet_ *p); +void PacketEnqueue (PacketQueue *, struct Packet_ *); -Packet *PacketDequeueNoLock (PacketQueueNoLock *qnl); -Packet *PacketDequeue (PacketQueue *); +struct Packet_ *PacketDequeueNoLock (PacketQueueNoLock *qnl); +struct Packet_ *PacketDequeue (PacketQueue *); #endif /* __PACKET_QUEUE_H__ */ diff --git a/src/respond-reject.c b/src/respond-reject.c index 9fb5795959..84fcd0203a 100644 --- a/src/respond-reject.c +++ b/src/respond-reject.c @@ -45,7 +45,7 @@ int RejectSendIPv4TCP(ThreadVars *, Packet *, void *); int RejectSendIPv4ICMP(ThreadVars *, Packet *, void *); int RejectSendIPv6TCP(ThreadVars *, Packet *, void *); int RejectSendIPv6ICMP(ThreadVars *, Packet *, void *); -static TmEcode RespondRejectFunc(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq); +static TmEcode RespondRejectFunc(ThreadVars *tv, Packet *p, void *data); void TmModuleRespondRejectRegister (void) { @@ -57,7 +57,7 @@ void TmModuleRespondRejectRegister (void) tmm_modules[TMM_RESPONDREJECT].cap_flags = 0; /* libnet is not compat with caps */ } -static TmEcode RespondRejectFunc(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +static TmEcode RespondRejectFunc(ThreadVars *tv, Packet *p, void *data) { int ret = 0; diff --git a/src/source-af-packet.c b/src/source-af-packet.c index c2a55099d2..f327261597 100644 --- a/src/source-af-packet.c +++ b/src/source-af-packet.c @@ -310,7 +310,7 @@ static TmEcode ReceiveAFPLoop(ThreadVars *tv, void *data, void *slot); static TmEcode DecodeAFPThreadInit(ThreadVars *, const void *, void **); static TmEcode DecodeAFPThreadDeinit(ThreadVars *tv, void *data); -static TmEcode DecodeAFP(ThreadVars *, Packet *, void *, PacketQueue *); +static TmEcode DecodeAFP(ThreadVars *, Packet *, void *); static TmEcode AFPSetBPFFilter(AFPThreadVars *ptv); static int AFPGetIfnumByDev(int fd, const char *ifname, int verbose); @@ -2875,15 +2875,14 @@ TmEcode ReceiveAFPThreadDeinit(ThreadVars *tv, void *data) /** * \brief This function passes off to link type decoders. * - * DecodeAFP reads packets from the PacketQueue and passes + * DecodeAFP decodes packets from AF_PACKET and passes * them off to the proper link type decoder. * * \param t pointer to ThreadVars * \param p pointer to the current packet * \param data pointer that gets cast into AFPThreadVars for ptv - * \param pq pointer to the current PacketQueue */ -TmEcode DecodeAFP(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +TmEcode DecodeAFP(ThreadVars *tv, Packet *p, void *data) { SCEnter(); DecodeThreadVars *dtv = (DecodeThreadVars *)data; @@ -2904,20 +2903,20 @@ TmEcode DecodeAFP(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) /* call the decoder */ switch (p->datalink) { case LINKTYPE_ETHERNET: - DecodeEthernet(tv, dtv, p,GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeEthernet(tv, dtv, p,GET_PKT_DATA(p), GET_PKT_LEN(p)); break; case LINKTYPE_LINUX_SLL: - DecodeSll(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeSll(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); break; case LINKTYPE_PPP: - DecodePPP(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodePPP(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); break; case LINKTYPE_RAW: case LINKTYPE_GRE_OVER_IP: - DecodeRaw(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeRaw(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); break; case LINKTYPE_NULL: - DecodeNull(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeNull(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); break; default: SCLogError(SC_ERR_DATALINK_UNIMPLEMENTED, "Error: datalink type %" PRId32 " not yet supported in module DecodeAFP", p->datalink); diff --git a/src/source-erf-dag.c b/src/source-erf-dag.c index c7788e7af4..554de64e1e 100644 --- a/src/source-erf-dag.c +++ b/src/source-erf-dag.c @@ -124,8 +124,7 @@ void ReceiveErfDagThreadExitStats(ThreadVars *, void *); TmEcode ReceiveErfDagThreadDeinit(ThreadVars *, void *); TmEcode DecodeErfDagThreadInit(ThreadVars *, void *, void **); TmEcode DecodeErfDagThreadDeinit(ThreadVars *tv, void *data); -TmEcode DecodeErfDag(ThreadVars *, Packet *, void *, PacketQueue *, - PacketQueue *); +TmEcode DecodeErfDag(ThreadVars *, Packet *, void *); void ReceiveErfDagCloseStream(int dagfd, int stream); /** @@ -600,16 +599,15 @@ ReceiveErfDagCloseStream(int dagfd, int stream) /** * \brief This function passes off to link type decoders. * - * DecodeErfDag reads packets from the PacketQueue and passes + * DecodeErfDag decodes packets from DAG and passes * them off to the proper link type decoder. * * \param t pointer to ThreadVars * \param p pointer to the current packet * \param data pointer that gets cast into PcapThreadVars for ptv - * \param pq pointer to the current PacketQueue */ TmEcode -DecodeErfDag(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +DecodeErfDag(ThreadVars *tv, Packet *p, void *data) { SCEnter(); DecodeThreadVars *dtv = (DecodeThreadVars *)data; @@ -625,7 +623,7 @@ DecodeErfDag(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) /* call the decoder */ switch(p->datalink) { case LINKTYPE_ETHERNET: - DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); break; default: SCLogError(SC_ERR_DATALINK_UNIMPLEMENTED, diff --git a/src/source-erf-file.c b/src/source-erf-file.c index 85dd452b44..bab7b2652f 100644 --- a/src/source-erf-file.c +++ b/src/source-erf-file.c @@ -70,7 +70,7 @@ TmEcode ReceiveErfFileThreadDeinit(ThreadVars *, void *); static TmEcode DecodeErfFileThreadInit(ThreadVars *, const void *, void **); static TmEcode DecodeErfFileThreadDeinit(ThreadVars *tv, void *data); -static TmEcode DecodeErfFile(ThreadVars *, Packet *, void *, PacketQueue *); +static TmEcode DecodeErfFile(ThreadVars *, Packet *, void *); /** * \brief Register the ERF file receiver (reader) module. @@ -275,7 +275,7 @@ TmEcode DecodeErfFileThreadDeinit(ThreadVars *tv, void *data) * off to the ethernet decoder. */ TmEcode -DecodeErfFile(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +DecodeErfFile(ThreadVars *tv, Packet *p, void *data) { SCEnter(); DecodeThreadVars *dtv = (DecodeThreadVars *)data; @@ -288,7 +288,7 @@ DecodeErfFile(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) /* Update counters. */ DecodeUpdatePacketCounters(tv, dtv, p); - DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); PacketDecodeFinalize(tv, dtv, p); diff --git a/src/source-ipfw.c b/src/source-ipfw.c index 478256f145..6110e5e0e0 100644 --- a/src/source-ipfw.c +++ b/src/source-ipfw.c @@ -131,20 +131,20 @@ static SCMutex ipfw_init_lock; /* IPFW Prototypes */ static void *IPFWGetQueue(int number); static TmEcode ReceiveIPFWThreadInit(ThreadVars *, const void *, void **); -static TmEcode ReceiveIPFW(ThreadVars *, Packet *, void *, PacketQueue *); +static TmEcode ReceiveIPFW(ThreadVars *, Packet *, void *); static TmEcode ReceiveIPFWLoop(ThreadVars *tv, void *data, void *slot); static void ReceiveIPFWThreadExitStats(ThreadVars *, void *); static TmEcode ReceiveIPFWThreadDeinit(ThreadVars *, void *); static TmEcode IPFWSetVerdict(ThreadVars *, IPFWThreadVars *, Packet *); -static TmEcode VerdictIPFW(ThreadVars *, Packet *, void *, PacketQueue *); +static TmEcode VerdictIPFW(ThreadVars *, Packet *, void *); static TmEcode VerdictIPFWThreadInit(ThreadVars *, const void *, void **); static void VerdictIPFWThreadExitStats(ThreadVars *, void *); static TmEcode VerdictIPFWThreadDeinit(ThreadVars *, void *); static TmEcode DecodeIPFWThreadInit(ThreadVars *, const void *, void **); static TmEcode DecodeIPFWThreadDeinit(ThreadVars *tv, void *data); -static TmEcode DecodeIPFW(ThreadVars *, Packet *, void *, PacketQueue *); +static TmEcode DecodeIPFW(ThreadVars *, Packet *, void *); /** * \brief Registration Function for RecieveIPFW. @@ -430,15 +430,14 @@ TmEcode ReceiveIPFWThreadDeinit(ThreadVars *tv, void *data) * \brief This function passes off to link type decoders. * \todo Unit tests are needed for this module. * - * DecodeIPFW reads packets from the PacketQueue and passes + * DecodeIPFW decodes packets from IPFW and passes * them off to the proper link type decoder. * * \param tv pointer to ThreadVars * \param p pointer to the current packet * \param data pointer that gets cast into IPFWThreadVars for ptv - * \param pq pointer to the PacketQueue */ -TmEcode DecodeIPFW(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +TmEcode DecodeIPFW(ThreadVars *tv, Packet *p, void *data) { IPV4Hdr *ip4h = (IPV4Hdr *)GET_PKT_DATA(p); IPV6Hdr *ip6h = (IPV6Hdr *)GET_PKT_DATA(p); @@ -460,14 +459,14 @@ TmEcode DecodeIPFW(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) return TM_ECODE_FAILED; } SCLogDebug("DecodeIPFW ip4 processing"); - DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); } else if(IPV6_GET_RAW_VER(ip6h) == 6) { if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) { return TM_ECODE_FAILED; } SCLogDebug("DecodeIPFW ip6 processing"); - DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); } else { /* We don't support anything besides IP packets for now, bridged packets? */ @@ -610,9 +609,8 @@ TmEcode IPFWSetVerdict(ThreadVars *tv, IPFWThreadVars *ptv, Packet *p) * \param tv pointer to ThreadVars * \param p pointer to the Packet * \param data pointer that gets cast into IPFWThreadVars for ptv - * \param pq pointer for the Packet Queue access (Not used) */ -TmEcode VerdictIPFW(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +TmEcode VerdictIPFW(ThreadVars *tv, Packet *p, void *data) { IPFWThreadVars *ptv = (IPFWThreadVars *)data; TmEcode retval = TM_ECODE_OK; diff --git a/src/source-napatech.c b/src/source-napatech.c index 15ea3cf5ae..3bb23c69e4 100644 --- a/src/source-napatech.c +++ b/src/source-napatech.c @@ -97,7 +97,7 @@ TmEcode NapatechPacketLoopZC(ThreadVars *tv, void *data, void *slot); TmEcode NapatechDecodeThreadInit(ThreadVars *, const void *, void **); TmEcode NapatechDecodeThreadDeinit(ThreadVars *tv, void *data); -TmEcode NapatechDecode(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *); +TmEcode NapatechDecode(ThreadVars *, Packet *, void *); /* These are used as the threads are exiting to get a comprehensive count of * all the packets received and dropped. @@ -533,15 +533,14 @@ TmEcode NapatechStreamThreadDeinit(ThreadVars *tv, void *data) /** * \brief This function passes off to link type decoders. * - * NapatechDecode reads packets from the PacketQueue and passes + * NapatechDecode decodes packets from Napatech and passes * them off to the proper link type decoder. * * \param t pointer to ThreadVars * \param p pointer to the current packet * \param data pointer that gets cast into PcapThreadVars for ptv - * \param pq pointer to the current PacketQueue */ -TmEcode NapatechDecode(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +TmEcode NapatechDecode(ThreadVars *tv, Packet *p, void *data) { SCEnter(); @@ -557,7 +556,7 @@ TmEcode NapatechDecode(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) switch (p->datalink) { case LINKTYPE_ETHERNET: - DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); break; default: SCLogError(SC_ERR_DATALINK_UNIMPLEMENTED, diff --git a/src/source-netmap.c b/src/source-netmap.c index 1fa6bdba68..9258fdb707 100644 --- a/src/source-netmap.c +++ b/src/source-netmap.c @@ -735,15 +735,11 @@ static TmEcode DecodeNetmapThreadInit(ThreadVars *tv, const void *initdata, void /** * \brief This function passes off to link type decoders. * - * DecodeNetmap reads packets from the PacketQueue and passes - * them off to the proper link type decoder. - * * \param t pointer to ThreadVars * \param p pointer to the current packet * \param data pointer that gets cast into NetmapThreadVars for ntv - * \param pq pointer to the current PacketQueue */ -static TmEcode DecodeNetmap(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +static TmEcode DecodeNetmap(ThreadVars *tv, Packet *p, void *data) { SCEnter(); @@ -757,7 +753,7 @@ static TmEcode DecodeNetmap(ThreadVars *tv, Packet *p, void *data, PacketQueue * /* update counters */ DecodeUpdatePacketCounters(tv, dtv, p); - DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); PacketDecodeFinalize(tv, dtv, p); diff --git a/src/source-nflog.c b/src/source-nflog.c index a954634755..10f3b826b1 100644 --- a/src/source-nflog.c +++ b/src/source-nflog.c @@ -75,7 +75,7 @@ void ReceiveNFLOGThreadExitStats(ThreadVars *, void *); TmEcode DecodeNFLOGThreadInit(ThreadVars *, const void *, void **); TmEcode DecodeNFLOGThreadDeinit(ThreadVars *tv, void *data); -TmEcode DecodeNFLOG(ThreadVars *, Packet *, void *, PacketQueue *); +TmEcode DecodeNFLOG(ThreadVars *, Packet *, void *); static int runmode_workers; @@ -496,11 +496,10 @@ void ReceiveNFLOGThreadExitStats(ThreadVars *tv, void *data) * \param tv pointer to ThreadVars * \param p pointer to the current packet * \param data pointer that gets cast into NFLOGThreadVars for ptv - * \param pq pointer to the current PacketQueue * * \retval TM_ECODE_OK is always returned */ -TmEcode DecodeNFLOG(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +TmEcode DecodeNFLOG(ThreadVars *tv, Packet *p, void *data) { SCEnter(); IPV4Hdr *ip4h = (IPV4Hdr *)GET_PKT_DATA(p); @@ -514,13 +513,13 @@ TmEcode DecodeNFLOG(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) return TM_ECODE_FAILED; } SCLogDebug("IPv4 packet"); - DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); } else if(IPV6_GET_RAW_VER(ip6h) == 6) { if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) { return TM_ECODE_FAILED; } SCLogDebug("IPv6 packet"); - DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); } else { SCLogDebug("packet unsupported by NFLOG, first byte: %02x", *GET_PKT_DATA(p)); } diff --git a/src/source-nfq.c b/src/source-nfq.c index a083197a83..a783e03303 100644 --- a/src/source-nfq.c +++ b/src/source-nfq.c @@ -137,11 +137,11 @@ static TmEcode ReceiveNFQThreadInit(ThreadVars *, const void *, void **); static TmEcode ReceiveNFQThreadDeinit(ThreadVars *, void *); static void ReceiveNFQThreadExitStats(ThreadVars *, void *); -static TmEcode VerdictNFQ(ThreadVars *, Packet *, void *, PacketQueue *); +static TmEcode VerdictNFQ(ThreadVars *, Packet *, void *); static TmEcode VerdictNFQThreadInit(ThreadVars *, const void *, void **); static TmEcode VerdictNFQThreadDeinit(ThreadVars *, void *); -static TmEcode DecodeNFQ(ThreadVars *, Packet *, void *, PacketQueue *); +static TmEcode DecodeNFQ(ThreadVars *, Packet *, void *); static TmEcode DecodeNFQThreadInit(ThreadVars *, const void *, void **); static TmEcode DecodeNFQThreadDeinit(ThreadVars *tv, void *data); @@ -1193,7 +1193,7 @@ TmEcode NFQSetVerdict(Packet *p) /** * \brief NFQ verdict module packet entry function */ -TmEcode VerdictNFQ(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +TmEcode VerdictNFQ(ThreadVars *tv, Packet *p, void *data) { NFQThreadVars *ntv = (NFQThreadVars *)data; /* update counters */ @@ -1224,7 +1224,7 @@ TmEcode VerdictNFQ(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) /** * \brief Decode a packet coming from NFQ */ -TmEcode DecodeNFQ(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +TmEcode DecodeNFQ(ThreadVars *tv, Packet *p, void *data) { IPV4Hdr *ip4h = (IPV4Hdr *)GET_PKT_DATA(p); @@ -1243,13 +1243,13 @@ TmEcode DecodeNFQ(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) return TM_ECODE_FAILED; } SCLogDebug("IPv4 packet"); - DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); } else if (IPV6_GET_RAW_VER(ip6h) == 6) { if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) { return TM_ECODE_FAILED; } SCLogDebug("IPv6 packet"); - DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); } else { SCLogDebug("packet unsupported by NFQ, first byte: %02x", *GET_PKT_DATA(p)); } diff --git a/src/source-pcap-file.c b/src/source-pcap-file.c index 425032b846..63fe5b4760 100644 --- a/src/source-pcap-file.c +++ b/src/source-pcap-file.c @@ -58,7 +58,7 @@ static TmEcode ReceivePcapFileThreadInit(ThreadVars *, const void *, void **); static void ReceivePcapFileThreadExitStats(ThreadVars *, void *); static TmEcode ReceivePcapFileThreadDeinit(ThreadVars *, void *); -static TmEcode DecodePcapFile(ThreadVars *, Packet *, void *, PacketQueue *); +static TmEcode DecodePcapFile(ThreadVars *, Packet *, void *); static TmEcode DecodePcapFileThreadInit(ThreadVars *, const void *, void **); static TmEcode DecodePcapFileThreadDeinit(ThreadVars *tv, void *data); @@ -389,7 +389,7 @@ TmEcode ReceivePcapFileThreadDeinit(ThreadVars *tv, void *data) static double prev_signaled_ts = 0; -static TmEcode DecodePcapFile(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +static TmEcode DecodePcapFile(ThreadVars *tv, Packet *p, void *data) { SCEnter(); DecodeThreadVars *dtv = (DecodeThreadVars *)data; @@ -412,7 +412,7 @@ static TmEcode DecodePcapFile(ThreadVars *tv, Packet *p, void *data, PacketQueue if(ValidateLinkType(p->datalink, &decoder) == TM_ECODE_OK) { /* call the decoder */ - decoder(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + decoder(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); #ifdef DEBUG BUG_ON(p->pkt_src != PKT_SRC_WIRE && p->pkt_src != PKT_SRC_FFR); diff --git a/src/source-pcap.c b/src/source-pcap.c index f49ff0a49c..0870ec62fe 100644 --- a/src/source-pcap.c +++ b/src/source-pcap.c @@ -97,7 +97,7 @@ static TmEcode ReceivePcapBreakLoop(ThreadVars *tv, void *data); static TmEcode DecodePcapThreadInit(ThreadVars *, const void *, void **); static TmEcode DecodePcapThreadDeinit(ThreadVars *tv, void *data); -static TmEcode DecodePcap(ThreadVars *, Packet *, void *, PacketQueue *); +static TmEcode DecodePcap(ThreadVars *, Packet *, void *); /** protect pcap_compile and pcap_setfilter, as they are not thread safe: * http://seclists.org/tcpdump/2009/q1/62 */ @@ -533,15 +533,14 @@ static void ReceivePcapThreadExitStats(ThreadVars *tv, void *data) /** * \brief This function passes off to link type decoders. * - * DecodePcap reads packets from the PacketQueue and passes + * DecodePcap decodes packets from libpcap and passes * them off to the proper link type decoder. * * \param t pointer to ThreadVars * \param p pointer to the current packet * \param data pointer that gets cast into PcapThreadVars for ptv - * \param pq pointer to the current PacketQueue */ -static TmEcode DecodePcap(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +static TmEcode DecodePcap(ThreadVars *tv, Packet *p, void *data) { SCEnter(); DecodeThreadVars *dtv = (DecodeThreadVars *)data; @@ -557,20 +556,20 @@ static TmEcode DecodePcap(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq /* call the decoder */ switch(p->datalink) { case LINKTYPE_LINUX_SLL: - DecodeSll(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeSll(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); break; case LINKTYPE_ETHERNET: - DecodeEthernet(tv, dtv, p,GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeEthernet(tv, dtv, p,GET_PKT_DATA(p), GET_PKT_LEN(p)); break; case LINKTYPE_PPP: - DecodePPP(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodePPP(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); break; case LINKTYPE_RAW: case LINKTYPE_GRE_OVER_IP: - DecodeRaw(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeRaw(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); break; case LINKTYPE_NULL: - DecodeNull(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeNull(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); break; default: SCLogError(SC_ERR_DATALINK_UNIMPLEMENTED, "Error: datalink " diff --git a/src/source-pfring.c b/src/source-pfring.c index 0dafecb776..a07ab14c19 100644 --- a/src/source-pfring.c +++ b/src/source-pfring.c @@ -53,7 +53,7 @@ void ReceivePfringThreadExitStats(ThreadVars *, void *); TmEcode ReceivePfringThreadDeinit(ThreadVars *, void *); TmEcode DecodePfringThreadInit(ThreadVars *, const void *, void **); -TmEcode DecodePfring(ThreadVars *, Packet *, void *, PacketQueue *); +TmEcode DecodePfring(ThreadVars *, Packet *, void *); TmEcode DecodePfringThreadDeinit(ThreadVars *tv, void *data); extern int max_pending_packets; @@ -705,13 +705,12 @@ TmEcode ReceivePfringThreadDeinit(ThreadVars *tv, void *data) /** * \brief This function passes off to link type decoders. * - * DecodePfring reads packets from the PacketQueue. Inside of libpcap version of + * DecodePfring decodes raw packets from PF_RING. Inside of libpcap version of * PF_RING all packets are marked as a link type of ethernet so that is what we do here. * * \param tv pointer to ThreadVars * \param p pointer to the current packet * \param data pointer that gets cast into PfringThreadVars for ptv - * \param pq pointer to the current PacketQueue * * \todo Verify that PF_RING only deals with ethernet traffic * @@ -719,7 +718,7 @@ TmEcode ReceivePfringThreadDeinit(ThreadVars *tv, void *data) * * \retval TM_ECODE_OK is always returned */ -TmEcode DecodePfring(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +TmEcode DecodePfring(ThreadVars *tv, Packet *p, void *data) { DecodeThreadVars *dtv = (DecodeThreadVars *)data; @@ -736,7 +735,7 @@ TmEcode DecodePfring(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) StatsIncr(tv, dtv->counter_vlan); } - DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeEthernet(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); PacketDecodeFinalize(tv, dtv, p); diff --git a/src/source-windivert.c b/src/source-windivert.c index 8d7e59cdf8..bcf37c6054 100644 --- a/src/source-windivert.c +++ b/src/source-windivert.c @@ -347,12 +347,12 @@ TmEcode ReceiveWinDivertThreadDeinit(ThreadVars *, void *); void ReceiveWinDivertThreadExitStats(ThreadVars *, void *); /* Verdict functions */ -TmEcode VerdictWinDivert(ThreadVars *, Packet *, void *, PacketQueue *); +TmEcode VerdictWinDivert(ThreadVars *, Packet *, void *); TmEcode VerdictWinDivertThreadInit(ThreadVars *, const void *, void **); TmEcode VerdictWinDivertThreadDeinit(ThreadVars *, void *); /* Decode functions */ -TmEcode DecodeWinDivert(ThreadVars *, Packet *, void *, PacketQueue *); +TmEcode DecodeWinDivert(ThreadVars *, Packet *, void *); TmEcode DecodeWinDivertThreadInit(ThreadVars *, const void *, void **); TmEcode DecodeWinDivertThreadDeinit(ThreadVars *, void *); @@ -731,7 +731,7 @@ void ReceiveWinDivertThreadExitStats(ThreadVars *tv, void *data) /** * \brief WinDivert verdict module packet entry function */ -TmEcode VerdictWinDivert(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq); +TmEcode VerdictWinDivert(ThreadVars *tv, Packet *p, void *data) { SCEnter(); @@ -855,7 +855,7 @@ TmEcode VerdictWinDivertThreadDeinit(ThreadVars *tv, void *data) * to differentiate the two, so instead we must check the version and go * from there. */ -TmEcode DecodeWinDivert(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) +TmEcode DecodeWinDivert(ThreadVars *tv, Packet *p, void *data) { SCEnter(); @@ -874,10 +874,10 @@ TmEcode DecodeWinDivert(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) if (IPV4_GET_RAW_VER(ip4h) == 4) { SCLogDebug("IPv4 packet"); - DecodeIPV4(tv, d_tv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeIPV4(tv, d_tv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); } else if (IPV6_GET_RAW_VER(ip6h) == 6) { SCLogDebug("IPv6 packet"); - DecodeIPV6(tv, d_tv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq); + DecodeIPV6(tv, d_tv, p, GET_PKT_DATA(p), GET_PKT_LEN(p)); } else { SCLogDebug("packet unsupported by WinDivert, first byte: %02x", *GET_PKT_DATA(p)); diff --git a/src/tests/detect.c b/src/tests/detect.c index c11aaf2b9e..34b18cd828 100644 --- a/src/tests/detect.c +++ b/src/tests/detect.c @@ -3415,7 +3415,7 @@ static int SigTest36ContentAndIsdataatKeywords01 (void) memset(&th_v, 0, sizeof(th_v)); FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&th_v, &dtv, p, raw_eth, sizeof(raw_eth), NULL); + DecodeEthernet(&th_v, &dtv, p, raw_eth, sizeof(raw_eth)); DetectEngineCtx *de_ctx = DetectEngineCtxInit(); @@ -3534,7 +3534,7 @@ static int SigTest37ContentAndIsdataatKeywords02 (void) memset(&th_v, 0, sizeof(th_v)); FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&th_v, &dtv, p, raw_eth, sizeof(raw_eth), NULL); + DecodeEthernet(&th_v, &dtv, p, raw_eth, sizeof(raw_eth)); DetectEngineCtx *de_ctx = DetectEngineCtxInit(); @@ -4280,7 +4280,7 @@ static int SigTestWithin01 (void) if (unlikely(p1 == NULL)) return 0; memset(p1, 0, SIZE_OF_PACKET); - DecodeEthernet(&th_v, &dtv, p1, rawpkt1, sizeof(rawpkt1), NULL); + DecodeEthernet(&th_v, &dtv, p1, rawpkt1, sizeof(rawpkt1)); SigMatchSignatures(&th_v, de_ctx, det_ctx, p1); if (!(PacketAlertCheck(p1, 556))) { printf("failed to match on packet 1: "); @@ -4292,7 +4292,7 @@ static int SigTestWithin01 (void) if (unlikely(p2 == NULL)) return 0; memset(p2, 0, SIZE_OF_PACKET); - DecodeEthernet(&th_v, &dtv, p2, rawpkt2, sizeof(rawpkt2), NULL); + DecodeEthernet(&th_v, &dtv, p2, rawpkt2, sizeof(rawpkt2)); SigMatchSignatures(&th_v, de_ctx, det_ctx, p2); if (!(PacketAlertCheck(p2, 556))) { printf("failed to match on packet 2: "); @@ -4304,7 +4304,7 @@ static int SigTestWithin01 (void) if (unlikely(p3 == NULL)) return 0; memset(p3, 0, SIZE_OF_PACKET); - DecodeEthernet(&th_v, &dtv, p3, rawpkt3, sizeof(rawpkt3), NULL); + DecodeEthernet(&th_v, &dtv, p3, rawpkt3, sizeof(rawpkt3)); SigMatchSignatures(&th_v, de_ctx, det_ctx, p3); if (!(PacketAlertCheck(p3, 556))) { printf("failed to match on packet 3: "); @@ -4316,7 +4316,7 @@ static int SigTestWithin01 (void) if (unlikely(p4 == NULL)) return 0; memset(p4, 0, SIZE_OF_PACKET); - DecodeEthernet(&th_v, &dtv, p4, rawpkt4, sizeof(rawpkt4), NULL); + DecodeEthernet(&th_v, &dtv, p4, rawpkt4, sizeof(rawpkt4)); SigMatchSignatures(&th_v, de_ctx, det_ctx, p4); if (!(PacketAlertCheck(p4, 556))) { printf("failed to match on packet 4: "); diff --git a/src/threadvars.h b/src/threadvars.h index a424aaa65f..3c18f64e5d 100644 --- a/src/threadvars.h +++ b/src/threadvars.h @@ -28,6 +28,7 @@ #include "tm-queues.h" #include "counters.h" #include "threads.h" +#include "packet-queue.h" struct TmSlot_; @@ -104,6 +105,10 @@ typedef struct ThreadVars_ { void *outctx; void (*tmqh_out)(struct ThreadVars_ *, struct Packet_ *); + /** queue for decoders to temporarily store extra packets they + * generate. */ + PacketQueueNoLock decode_pq; + /** Stream packet queue for flow time out injection. Either a pointer to the * workers input queue or to stream_pq_local */ struct PacketQueue_ *stream_pq; diff --git a/src/tm-modules.h b/src/tm-modules.h index 072900857b..2e896db2ab 100644 --- a/src/tm-modules.h +++ b/src/tm-modules.h @@ -49,7 +49,7 @@ typedef struct TmModule_ { TmEcode (*ThreadDeinit)(ThreadVars *, void *); /** the packet processing function */ - TmEcode (*Func)(ThreadVars *, Packet *, void *, PacketQueue *); + TmEcode (*Func)(ThreadVars *, Packet *, void *); TmEcode (*PktAcqLoop)(ThreadVars *, void *, void *); diff --git a/src/tm-threads.c b/src/tm-threads.c index d1654f0dbe..d7904fe5fd 100644 --- a/src/tm-threads.c +++ b/src/tm-threads.c @@ -114,8 +114,7 @@ TmEcode TmThreadsSlotVarRun(ThreadVars *tv, Packet *p, TmSlot *slot) { for (TmSlot *s = slot; s != NULL; s = s->slot_next) { PACKET_PROFILING_TMM_START(p, s->tm_id); - TmEcode r = s->SlotFunc(tv, p, SC_ATOMIC_GET(s->slot_data), - &s->slot_pre_pq); + TmEcode r = s->SlotFunc(tv, p, SC_ATOMIC_GET(s->slot_data)); PACKET_PROFILING_TMM_END(p, s->tm_id); /* handle error */ @@ -126,8 +125,8 @@ TmEcode TmThreadsSlotVarRun(ThreadVars *tv, Packet *p, TmSlot *slot) } /* handle new packets */ - while (s->slot_pre_pq.top != NULL) { - Packet *extra_p = PacketDequeue(&s->slot_pre_pq); + while (tv->decode_pq.top != NULL) { + Packet *extra_p = PacketDequeueNoLock(&tv->decode_pq); if (unlikely(extra_p == NULL)) continue; @@ -146,23 +145,6 @@ TmEcode TmThreadsSlotVarRun(ThreadVars *tv, Packet *p, TmSlot *slot) return TM_ECODE_OK; } -/** \internal - * \brief check 'slot' pre_pq and thread cleanup - * and dump detailed info about the state of the packets - * and threads if in a unexpected state. - */ -static void CheckSlot(const TmSlot *slot) -{ - if (slot->slot_pre_pq.len) { - for (Packet *xp = slot->slot_pre_pq.top; xp != NULL; xp = xp->next) { - SCLogNotice("pre_pq: slot tm_id %u pre_pq.len %u packet src %s", - slot->tm_id, slot->slot_pre_pq.len, PktSrcToString(xp->pkt_src)); - } - TmThreadDumpThreads(); - abort(); - } -} - #ifndef AFLFUZZ_PCAP_RUNMODE /** \internal @@ -288,8 +270,6 @@ static void *TmThreadsSlotPktAcqLoop(void *td) } (void)SC_ATOMIC_SET(slot->slot_data, slot_data); } - memset(&slot->slot_pre_pq, 0, sizeof(PacketQueue)); - SCMutexInit(&slot->slot_pre_pq.mutex_q, NULL); /* if the flowworker module is the first, get the threads input queue */ if (slot == (TmSlot *)tv->tm_slots && (slot->tm_id == TMM_FLOWWORKER)) { @@ -356,7 +336,6 @@ static void *TmThreadsSlotPktAcqLoop(void *td) goto error; } } - CheckSlot(slot); } tv->stream_pq = NULL; @@ -416,8 +395,6 @@ static void *TmThreadsSlotPktAcqLoopAFL(void *td) } (void)SC_ATOMIC_SET(slot->slot_data, slot_data); } - memset(&slot->slot_pre_pq, 0, sizeof(PacketQueue)); - SCMutexInit(&slot->slot_pre_pq.mutex_q, NULL); /* if the flowworker module is the first, get the threads input queue */ if (slot == (TmSlot *)tv->tm_slots && (slot->tm_id == TMM_FLOWWORKER)) { @@ -476,8 +453,6 @@ static void *TmThreadsSlotPktAcqLoopAFL(void *td) goto error; } } - - CheckSlot(slot); } tv->stream_pq = NULL; @@ -529,8 +504,6 @@ static void *TmThreadsSlotVar(void *td) } (void)SC_ATOMIC_SET(s->slot_data, slot_data); } - memset(&s->slot_pre_pq, 0, sizeof(PacketQueue)); - SCMutexInit(&s->slot_pre_pq.mutex_q, NULL); /* special case: we need to access the stream queue * from the flow timeout code */ @@ -609,7 +582,6 @@ static void *TmThreadsSlotVar(void *td) goto error; } } - CheckSlot(s); } SCLogDebug("%s ending", tv->name); @@ -655,7 +627,6 @@ static void *TmThreadsManagement(void *td) } (void)SC_ATOMIC_SET(s->slot_data, slot_data); } - memset(&s->slot_pre_pq, 0, sizeof(PacketQueue)); StatsSetupPrivate(tv); @@ -2092,10 +2063,6 @@ static void TmThreadDoDumpSlots(const ThreadVars *tv) TmModule *m = TmModuleGetById(s->tm_id); SCLogNotice("tv %p: -> slot %p tm_id %d name %s", tv, s, s->tm_id, m->name); - for (Packet *xp = s->slot_pre_pq.top; xp != NULL; xp = xp->next) { - SCLogNotice("tv %p: ==> pre_pq: slot tm_id %u pre_pq.len %u packet src %s", - tv, s->tm_id, s->slot_pre_pq.len, PktSrcToString(xp->pkt_src)); - } } } @@ -2116,6 +2083,10 @@ void TmThreadDumpThreads(void) tv, tv->stream_pq_local->len, PktSrcToString(xp->pkt_src)); } } + for (Packet *xp = tv->decode_pq.top; xp != NULL; xp = xp->next) { + SCLogNotice("tv %p: ==> decode_pq: decode_pq.len %u packet src %s", + tv, tv->decode_pq.len, PktSrcToString(xp->pkt_src)); + } TmThreadDoDumpSlots(tv); tv = tv->next; } diff --git a/src/tm-threads.h b/src/tm-threads.h index 2e4f8a1398..54ef9c4c73 100644 --- a/src/tm-threads.h +++ b/src/tm-threads.h @@ -47,7 +47,7 @@ static inline void SleepUsec(uint64_t usec) #define TM_QUEUE_NAME_MAX 16 #define TM_THREAD_NAME_MAX 16 -typedef TmEcode (*TmSlotFunc)(ThreadVars *, Packet *, void *, PacketQueue *); +typedef TmEcode (*TmSlotFunc)(ThreadVars *, Packet *, void *); typedef struct TmSlot_ { /* function pointers */ @@ -62,11 +62,6 @@ typedef struct TmSlot_ { SC_ATOMIC_DECLARE(void *, slot_data); - /* queue filled by the SlotFunc with packets that will - * be processed futher _before_ the current packet. - * The locks in the queue are NOT used */ - PacketQueue slot_pre_pq; - TmEcode (*SlotThreadInit)(ThreadVars *, const void *, void **); void (*SlotThreadExitPrintStats)(ThreadVars *, void *); TmEcode (*SlotThreadDeinit)(ThreadVars *, void *); @@ -134,12 +129,22 @@ TmSlot *TmThreadGetFirstTmSlotForPartialPattern(const char *); uint32_t TmThreadCountThreadsByTmmFlags(uint8_t flags); +static inline void TmThreadsCleanDecodePQ(PacketQueueNoLock *pq) +{ + while (1) { + Packet *p = PacketDequeueNoLock(pq); + if (unlikely(p == NULL)) + break; + TmqhOutputPacketpool(NULL, p); + } +} + static inline void TmThreadsSlotProcessPktFail(ThreadVars *tv, TmSlot *s, Packet *p) { if (p != NULL) { TmqhOutputPacketpool(tv, p); } - TmqhReleasePacketsToPacketPool(&s->slot_pre_pq); + TmThreadsCleanDecodePQ(&tv->decode_pq); if (tv->stream_pq_local) { SCMutexLock(&tv->stream_pq_local->mutex_q); TmqhReleasePacketsToPacketPool(tv->stream_pq_local); diff --git a/src/util-unittest-helper.c b/src/util-unittest-helper.c index a2baf67ee2..ea04be27c2 100644 --- a/src/util-unittest-helper.c +++ b/src/util-unittest-helper.c @@ -302,7 +302,7 @@ Packet **UTHBuildPacketArrayFromEth(uint8_t *raw_eth[], int *pktsize, int numpkt SCFree(p); return NULL; } - DecodeEthernet(&th_v, &dtv, p[i], raw_eth[i], pktsize[i], NULL); + DecodeEthernet(&th_v, &dtv, p[i], raw_eth[i], pktsize[i]); } return p; } @@ -326,7 +326,7 @@ Packet *UTHBuildPacketFromEth(uint8_t *raw_eth, uint16_t pktsize) memset(&dtv, 0, sizeof(DecodeThreadVars)); memset(&th_v, 0, sizeof(th_v)); - DecodeEthernet(&th_v, &dtv, p, raw_eth, pktsize, NULL); + DecodeEthernet(&th_v, &dtv, p, raw_eth, pktsize); return p; }