#include "util-unittest.h"
#include "util-debug.h"
-#include "tmqh-packetpool.h"
-
/**
* \brief Function to decode GRE packets
*/
case ETHERNET_TYPE_IP:
{
if (pq != NULL) {
- Packet *tp = PacketPseudoPktSetup(p, pkt + header_len,
- len - header_len, IPPROTO_IP);
+ Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len,
+ len - header_len, IPPROTO_IP, pq);
if (tp != NULL) {
PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE);
- if (DecodeTunnel(tv, dtv, tp, GET_PKT_DATA(tp),
- GET_PKT_LEN(tp), pq, IPPROTO_IP) == TM_ECODE_OK) {
- PacketEnqueue(pq,tp);
- } else {
- TmqhOutputPacketpool(tv, tp);
- }
+ PacketEnqueue(pq,tp);
}
}
break;
case GRE_PROTO_PPP:
{
if (pq != NULL) {
- Packet *tp = PacketPseudoPktSetup(p, pkt + header_len,
- len - header_len, PPP_OVER_GRE);
+ Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len,
+ len - header_len, PPP_OVER_GRE, pq);
if (tp != NULL) {
PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE);
- if (DecodeTunnel(tv, dtv, tp, GET_PKT_DATA(tp),
- GET_PKT_LEN(tp), pq, PPP_OVER_GRE) == TM_ECODE_OK) {
- PacketEnqueue(pq,tp);
- } else {
- TmqhOutputPacketpool(tv, tp);
- }
+ PacketEnqueue(pq,tp);
}
}
break;
case ETHERNET_TYPE_IPV6:
{
if (pq != NULL) {
- Packet *tp = PacketPseudoPktSetup(p, pkt + header_len,
- len - header_len, IPPROTO_IPV6);
+ Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len,
+ len - header_len, IPPROTO_IPV6, pq);
if (tp != NULL) {
PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE);
- if (DecodeTunnel(tv, dtv, tp, GET_PKT_DATA(tp),
- GET_PKT_LEN(tp), pq, IPPROTO_IPV6) == TM_ECODE_OK) {
- PacketEnqueue(pq,tp);
- } else {
- TmqhOutputPacketpool(tv, tp);
- }
+ PacketEnqueue(pq,tp);
}
}
break;
case ETHERNET_TYPE_VLAN:
{
if (pq != NULL) {
- Packet *tp = PacketPseudoPktSetup(p, pkt + header_len,
- len - header_len, VLAN_OVER_GRE);
+ Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + header_len,
+ len - header_len, VLAN_OVER_GRE, pq);
if (tp != NULL) {
PKT_SET_SRC(tp, PKT_SRC_DECODER_GRE);
- if (DecodeTunnel(tv, dtv, tp, GET_PKT_DATA(tp),
- GET_PKT_LEN(tp), pq, VLAN_OVER_GRE) == TM_ECODE_OK) {
- PacketEnqueue(pq,tp);
- } else {
- TmqhOutputPacketpool(tv, tp);
- }
+ PacketEnqueue(pq,tp);
}
}
break;
{
if (pq != NULL) {
/* spawn off tunnel packet */
- Packet *tp = PacketPseudoPktSetup(p, pkt + IPV4_GET_HLEN(p),
+ Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + IPV4_GET_HLEN(p),
IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p),
- IPV4_GET_IPPROTO(p));
+ IPV4_GET_IPPROTO(p), pq);
if (tp != NULL) {
PKT_SET_SRC(tp, PKT_SRC_DECODER_IPV4);
- /* send that to the Tunnel decoder */
- ret = DecodeTunnel(tv, dtv, tp, GET_PKT_DATA(tp),
- GET_PKT_LEN(tp), pq, IPV4_GET_IPPROTO(p));
-
- if (unlikely(ret != TM_ECODE_OK)) {
- TmqhOutputPacketpool(tv, tp);
- } else {
- /* add the tp to the packet queue. */
- PacketEnqueue(pq,tp);
- }
+ PacketEnqueue(pq,tp);
}
}
break;
}
if (IP_GET_RAW_VER(pkt) == 4) {
if (pq != NULL) {
- Packet *tp = PacketPseudoPktSetup(p, pkt, plen, IPPROTO_IP);
+ Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt, plen, IPPROTO_IP, pq);
if (tp != NULL) {
- int ret;
-
PKT_SET_SRC(tp, PKT_SRC_DECODER_IPV6);
- ret = DecodeTunnel(tv, dtv, tp, GET_PKT_DATA(tp),
- GET_PKT_LEN(tp), pq, IPPROTO_IP);
- if (unlikely(ret != TM_ECODE_OK)) {
- TmqhOutputPacketpool(tv, tp);
- } else {
- /* add the tp to the packet queue. */
- PacketEnqueue(pq,tp);
- SCPerfCounterIncr(dtv->counter_ipv4inipv6, tv->sc_perf_pca);
- }
+ /* add the tp to the packet queue. */
+ PacketEnqueue(pq,tp);
+ SCPerfCounterIncr(dtv->counter_ipv4inipv6, tv->sc_perf_pca);
return;
}
}
}
if (IP_GET_RAW_VER(pkt) == 6) {
if (unlikely(pq != NULL)) {
- Packet *tp = PacketPseudoPktSetup(p, pkt, plen, IPPROTO_IPV6);
- if (unlikely(tp != NULL)) {
+ Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt, plen, IPPROTO_IPV6, pq);
+ if (tp != NULL) {
PKT_SET_SRC(tp, PKT_SRC_DECODER_IPV6);
- if (DecodeTunnel(tv, dtv, tp, GET_PKT_DATA(tp),
- GET_PKT_LEN(tp), pq, IPPROTO_IPV6) == TM_ECODE_OK) {
- PacketEnqueue(pq,tp);
- SCPerfCounterIncr(dtv->counter_ipv6inipv6, tv->sc_perf_pca);
- } else {
- TmqhOutputPacketpool(tv, tp);
- }
+ PacketEnqueue(pq,tp);
+ SCPerfCounterIncr(dtv->counter_ipv6inipv6, tv->sc_perf_pca);
}
}
} else {
#include "decode-ipv6.h"
#include "util-debug.h"
-#include "tmqh-packetpool.h"
-
#define TEREDO_ORIG_INDICATION_LENGTH 8
/**
{
uint8_t *start = pkt;
- int ret;
/* Is this packet to short to contain an IPv6 packet ? */
if (len < IPV6_HEADER_LEN)
if (pq != NULL) {
int blen = len - (start - pkt);
/* spawn off tunnel packet */
- Packet *tp = PacketPseudoPktSetup(p, start, blen,
- IPPROTO_IPV6);
+ Packet *tp = PacketTunnelPktSetup(tv, dtv, p, start, blen,
+ IPPROTO_IPV6, pq);
if (tp != NULL) {
PKT_SET_SRC(tp, PKT_SRC_DECODER_TEREDO);
- /* send that to the Tunnel decoder */
- ret = DecodeTunnel(tv, dtv, tp, GET_PKT_DATA(tp), GET_PKT_LEN(tp),
- pq, IPPROTO_IPV6);
- if (unlikely(ret != TM_ECODE_OK)) {
- TmqhOutputPacketpool(tv, tp);
- return TM_ECODE_FAILED;
- } else {
- /* add the tp to the packet queue. */
- PacketEnqueue(pq,tp);
- SCPerfCounterIncr(dtv->counter_teredo, tv->sc_perf_pca);
- return TM_ECODE_OK;
- }
+ /* add the tp to the packet queue. */
+ PacketEnqueue(pq,tp);
+ SCPerfCounterIncr(dtv->counter_teredo, tv->sc_perf_pca);
+ return TM_ECODE_OK;
}
}
}
*
* \retval p the pseudo packet or NULL if out of memory
*/
-Packet *PacketPseudoPktSetup(Packet *parent, uint8_t *pkt, uint16_t len, uint8_t proto)
+Packet *PacketTunnelPktSetup(ThreadVars *tv, DecodeThreadVars *dtv, Packet *parent,
+ uint8_t *pkt, uint16_t len, uint8_t proto, PacketQueue *pq)
{
+ int ret;
+
SCEnter();
/* get us a packet */
p->ts.tv_usec = parent->ts.tv_usec;
p->datalink = DLT_RAW;
- /* set tunnel flags */
-
/* tell new packet it's part of a tunnel */
SET_TUNNEL_PKT(p);
+
+ ret = DecodeTunnel(tv, dtv, p, GET_PKT_DATA(p),
+ GET_PKT_LEN(p), pq, proto);
+
+ if (unlikely(ret != TM_ECODE_OK)) {
+ TmqhOutputPacketpool(tv, p);
+ SCReturnPtr(NULL, "Packet");
+ }
+
/* tell parent packet it's part of a tunnel */
SET_TUNNEL_PKT(parent);
void DecodeRegisterPerfCounters(DecodeThreadVars *, ThreadVars *);
-Packet *PacketPseudoPktSetup(Packet *parent, uint8_t *pkt, uint16_t len, uint8_t proto);
+Packet *PacketTunnelPktSetup(ThreadVars *tv, DecodeThreadVars *dtv, Packet *parent,
+ uint8_t *pkt, uint16_t len, uint8_t proto, PacketQueue *pq);
Packet *PacketDefragPktSetup(Packet *parent, uint8_t *pkt, uint16_t len, uint8_t proto);
Packet *PacketGetFromQueueOrAlloc(void);
Packet *PacketGetFromAlloc(void);