#include "defrag-queue.h"
#include "defrag-config.h"
+#include "tmqh-packetpool.h"
+#include "decode.h"
+
#ifdef UNITTESTS
#include "util-unittest.h"
#endif
* \todo Allocate packet buffers from a pool.
*/
static Packet *
-DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, Packet *p)
+DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, Packet *p, PacketQueue *pq)
{
Packet *r = NULL;
int ltrim = 0;
if (r != NULL && tv != NULL && dtv != NULL) {
SCPerfCounterIncr(dtv->counter_defrag_ipv4_reassembled,
tv->sc_perf_pca);
+ if (pq && DecodeIPV4(tv, dtv, r, (void *)r->ip4h,
+ IPV4_GET_IPLEN(r), pq) != TM_ECODE_OK) {
+ TmqhOutputPacketpool(tv, r);
+ } else {
+ PacketDefragPktFinishSetup(r, p);
+ }
}
}
else if (tracker->af == AF_INET6) {
r = Defrag6Reassemble(tv, tracker, p);
if (r != NULL && tv != NULL && dtv != NULL) {
SCPerfCounterIncr(dtv->counter_defrag_ipv6_reassembled,
- tv->sc_perf_pca);
+ tv->sc_perf_pca);
+ if (pq && DecodeIPV6(tv, dtv, r, (uint8_t *)r->ip6h,
+ IPV6_GET_PLEN(r) + IPV6_HEADER_LEN,
+ pq) != TM_ECODE_OK) {
+ TmqhOutputPacketpool(tv, r);
+ } else {
+ PacketDefragPktFinishSetup(r, p);
+ }
}
}
}
+
done:
if (overlap) {
if (af == AF_INET) {
* NULL is returned.
*/
Packet *
-Defrag(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p)
+Defrag(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, PacketQueue *pq)
{
uint16_t frag_offset;
uint8_t more_frags;
if (tracker == NULL)
return NULL;
- Packet *rp = DefragInsertFrag(tv, dtv, tracker, p);
+ Packet *rp = DefragInsertFrag(tv, dtv, tracker, p, pq);
DefragTrackerRelease(tracker);
return rp;
if (p3 == NULL)
goto end;
- if (Defrag(NULL, NULL, p1) != NULL)
+ if (Defrag(NULL, NULL, p1, NULL) != NULL)
goto end;
- if (Defrag(NULL, NULL, p2) != NULL)
+ if (Defrag(NULL, NULL, p2, NULL) != NULL)
goto end;
- reassembled = Defrag(NULL, NULL, p3);
+ reassembled = Defrag(NULL, NULL, p3, NULL);
if (reassembled == NULL) {
goto end;
}
if (p3 == NULL)
goto end;
- if (Defrag(NULL, NULL, p3) != NULL)
+ if (Defrag(NULL, NULL, p3, NULL) != NULL)
goto end;
- if (Defrag(NULL, NULL, p2) != NULL)
+ if (Defrag(NULL, NULL, p2, NULL) != NULL)
goto end;
- reassembled = Defrag(NULL, NULL, p1);
+ reassembled = Defrag(NULL, NULL, p1, NULL);
if (reassembled == NULL)
goto end;
if (p3 == NULL)
goto end;
- if (Defrag(NULL, NULL, p1) != NULL)
+ if (Defrag(NULL, NULL, p1, NULL) != NULL)
goto end;
- if (Defrag(NULL, NULL, p2) != NULL)
+ if (Defrag(NULL, NULL, p2, NULL) != NULL)
goto end;
- reassembled = Defrag(NULL, NULL, p3);
+ reassembled = Defrag(NULL, NULL, p3, NULL);
if (reassembled == NULL)
goto end;
if (p3 == NULL)
goto end;
- if (Defrag(NULL, NULL, p3) != NULL)
+ if (Defrag(NULL, NULL, p3, NULL) != NULL)
goto end;
- if (Defrag(NULL, NULL, p2) != NULL)
+ if (Defrag(NULL, NULL, p2, NULL) != NULL)
goto end;
- reassembled = Defrag(NULL, NULL, p1);
+ reassembled = Defrag(NULL, NULL, p1, NULL);
if (reassembled == NULL)
goto end;
/* Send all but the last. */
for (i = 0; i < 9; i++) {
- Packet *tp = Defrag(NULL, NULL, packets[i]);
+ Packet *tp = Defrag(NULL, NULL, packets[i], NULL);
if (tp != NULL) {
SCFree(tp);
goto end;
}
int overlap = 0;
for (; i < 16; i++) {
- Packet *tp = Defrag(NULL, NULL, packets[i]);
+ Packet *tp = Defrag(NULL, NULL, packets[i], NULL);
if (tp != NULL) {
SCFree(tp);
goto end;
}
/* And now the last one. */
- Packet *reassembled = Defrag(NULL, NULL, packets[16]);
+ Packet *reassembled = Defrag(NULL, NULL, packets[16], NULL);
if (reassembled == NULL) {
goto end;
}
/* Send all but the last. */
for (i = 0; i < 9; i++) {
- Packet *tp = Defrag(NULL, NULL, packets[i]);
+ Packet *tp = Defrag(NULL, NULL, packets[i], NULL);
if (tp != NULL) {
SCFree(tp);
goto end;
}
int overlap = 0;
for (; i < 16; i++) {
- Packet *tp = Defrag(NULL, NULL, packets[i]);
+ Packet *tp = Defrag(NULL, NULL, packets[i], NULL);
if (tp != NULL) {
SCFree(tp);
goto end;
goto end;
/* And now the last one. */
- Packet *reassembled = Defrag(NULL, NULL, packets[16]);
+ Packet *reassembled = Defrag(NULL, NULL, packets[16], NULL);
if (reassembled == NULL)
goto end;
if (memcmp(GET_PKT_DATA(reassembled) + 40, expected, expected_len) != 0)
if (p == NULL)
goto end;
- Packet *tp = Defrag(NULL, NULL, p);
+ Packet *tp = Defrag(NULL, NULL, p, NULL);
SCFree(p);
goto end;
p->ts.tv_sec += (defrag_context->timeout + 1);
- Packet *tp = Defrag(NULL, NULL, p);
+ Packet *tp = Defrag(NULL, NULL, p, NULL);
if (tp != NULL) {
SCFree(tp);
goto end;
/* We do not expect a packet returned. */
- if (Defrag(NULL, NULL, p) != NULL)
+ if (Defrag(NULL, NULL, p, NULL) != NULL)
goto end;
/* The fragment should have been ignored so no fragments should
goto end;
/* We do not expect a packet returned. */
- if (Defrag(NULL, NULL, p) != NULL)
+ if (Defrag(NULL, NULL, p, NULL) != NULL)
goto end;
if (!ENGINE_ISSET_EVENT(p, IPV4_FRAG_PKT_TOO_LARGE))
goto end;
goto end;
/* With no VLAN IDs set, packets should re-assemble. */
- if ((r = Defrag(NULL, NULL, p1)) != NULL)
+ if ((r = Defrag(NULL, NULL, p1, NULL)) != NULL)
goto end;
- if ((r = Defrag(NULL, NULL, p2)) == NULL)
+ if ((r = Defrag(NULL, NULL, p2, NULL)) == NULL)
goto end;
SCFree(r);
/* With mismatched VLANs, packets should not re-assemble. */
p1->vlan_id[0] = 1;
p2->vlan_id[0] = 2;
- if ((r = Defrag(NULL, NULL, p1)) != NULL)
+ if ((r = Defrag(NULL, NULL, p1, NULL)) != NULL)
goto end;
- if ((r = Defrag(NULL, NULL, p2)) != NULL)
+ if ((r = Defrag(NULL, NULL, p2, NULL)) != NULL)
goto end;
/* Pass. */
goto end;
/* With no VLAN IDs set, packets should re-assemble. */
- if ((r = Defrag(NULL, NULL, p1)) != NULL)
+ if ((r = Defrag(NULL, NULL, p1, NULL)) != NULL)
goto end;
- if ((r = Defrag(NULL, NULL, p2)) == NULL)
+ if ((r = Defrag(NULL, NULL, p2, NULL)) == NULL)
goto end;
SCFree(r);
p2->vlan_id[0] = 1;
p1->vlan_id[1] = 1;
p2->vlan_id[1] = 2;
- if ((r = Defrag(NULL, NULL, p1)) != NULL)
+ if ((r = Defrag(NULL, NULL, p1, NULL)) != NULL)
goto end;
- if ((r = Defrag(NULL, NULL, p2)) != NULL)
+ if ((r = Defrag(NULL, NULL, p2, NULL)) != NULL)
goto end;
/* Pass. */