return;
// FIXIT-L -- Allocating a new Packet here is ridiculously excessive.
- Packet* orig_p = PacketManager::encode_new();
- orig_p->reset();
+ Packet* orig_p = new Packet;
Packet& op = *orig_p;
if (!layer::set_api_ip_embed_icmp(p, op.ptrs.ip_api))
TextLog_Puts(log, "** END OF DUMP");
}
- PacketManager::encode_delete(orig_p);
+ delete orig_p;
}
/*--------------------------------------------------------------------
#include <CppUTest/CommandLineTestRunner.h>
#include <CppUTest/TestHarness.h>
+#include <string.h>
TEST_GROUP(ObfuscatorTests)
{
if (daq_instance->configure(snort_conf))
daq_instance->start();
- s_packet = PacketManager::encode_new(false);
+ s_packet = new Packet(false);
CodecManager::thread_init(snort_conf);
// this depends on instantiated daq capabilities
if ( s_packet )
{
- PacketManager::encode_delete(s_packet);
+ delete s_packet;
s_packet = nullptr;
}
return new CodecWrapper(api, p);
}
-
#endif
static CodecWrapper* instantiate(const char*, Module*, SnortConfig*);
#endif
+ static uint8_t get_max_layers()
+ { return max_layers; }
+
private:
struct CodecApiWrapper;
#ifdef UNIT_TEST
Packet* init_null_packet()
{
- static Packet p;
+ static Packet p(false);
static DAQ_PktHdr_t h;
p.pkt = nullptr;
const uint8_t cooked[] = "AbCdEfGhIjKlMnOpQrStUvWxYz";
struct pcap_pkthdr hdr;
- Packet p;
+ Packet p(false);
DAQ_PktHdr_t daq_hdr;
p.pkt = cooked;
p.pkth = &daq_hdr;
"\x45\x00\x00\x14\x96\x22\x40\x00\x39\x06\xb1\xeb\x0b\x52\xf0\x52"
"\x0a\x96";
- struct pcap_pkthdr hdr;
-
- Packet p_match, p_non_match;
+ Packet p_match(false), p_non_match(false);
DAQ_PktHdr_t daq_hdr;
p_match.pkth = &daq_hdr;
TEST_CASE("no protocol", "[FlowTracker]")
{
Packet p;
- DAQ_PktHdr_t pkth;
- uint32_t* len_ptr = (uint32_t*) &pkth.caplen;
+ uint32_t* len_ptr = (uint32_t*) &p.pkth->caplen;
PerfConfig config;
config.format = PERF_MOCK;
p.ptrs.tcph = nullptr;
p.ptrs.udph = nullptr;
p.ptrs.icmph = nullptr;
- p.pkth = &pkth;
*len_ptr = 127;
tracker.update(&p);
TEST_CASE("icmp", "[FlowTracker]")
{
Packet p;
- DAQ_PktHdr_t pkth;
icmp::ICMPHdr icmp;
- uint32_t* len_ptr = (uint32_t*) &pkth.caplen;
+ uint32_t* len_ptr = (uint32_t*) &p.pkth->caplen;
uint8_t* type_ptr = (uint8_t*) &icmp.type;
PerfConfig config;
p.ptrs.tcph = nullptr;
p.ptrs.udph = nullptr;
p.ptrs.icmph = &icmp;
- p.pkth = &pkth;
*len_ptr = 127;
*type_ptr = 3;
TEST_CASE("tcp", "[FlowTracker]")
{
Packet p;
- DAQ_PktHdr_t pkth;
tcp::TCPHdr tcp;
- uint32_t* len_ptr = (uint32_t*) &pkth.caplen;
+ uint32_t* len_ptr = (uint32_t*) &p.pkth->caplen;
PerfConfig config;
config.format = PERF_MOCK;
p.ptrs.tcph = &tcp;
p.ptrs.udph = nullptr;
p.ptrs.icmph = nullptr;
- p.pkth = &pkth;
tracker.reset();
TEST_CASE("udp", "[FlowTracker]")
{
Packet p;
- DAQ_PktHdr_t pkth;
udp::UDPHdr udp;
- uint32_t* len_ptr = (uint32_t*) &pkth.caplen;
+ uint32_t* len_ptr = (uint32_t*) &p.pkth->caplen;
PerfConfig config;
config.format = PERF_MOCK;
p.ptrs.tcph = nullptr;
p.ptrs.udph = &udp;
p.ptrs.icmph = nullptr;
- p.pkth = &pkth;
tracker.reset();
void PortScan::tinit()
{
- g_tmp_pkt = PacketManager::encode_new();
+ g_tmp_pkt = new Packet;
ps_init_hash(config->common->memcap);
if ( !config->logfile )
g_logfile = nullptr;
}
ps_cleanup();
- PacketManager::encode_delete(g_tmp_pkt);
- g_tmp_pkt = NULL;
+ delete g_tmp_pkt;
+ g_tmp_pkt = nullptr;
}
void PortScan::show(SnortConfig*)
#include "protocols/packet_manager.h"
#include "protocols/protocol_ids.h"
#include "log/obfuscator.h"
+#include "log/messages.h"
+#include "managers/codec_manager.h"
+#include "utils/util.h"
-#if 0
-uint8_t Packet::ip_proto_next() const
+Packet::Packet(bool packet_data)
{
- if (is_ip4())
+ layers = new Layer[CodecManager::get_max_layers()];
+ allocated = packet_data;
+
+ if (!packet_data)
{
- return ptrs.ip_api.get_ip4h()->proto();
+ pkt = nullptr;
+ pkth = nullptr;
}
- else if (is_ip6())
+ else
{
- const ip::IP6Hdr* const ip6h = ptrs.ip_api.get_ip6h();
- int lyr = num_layers-1;
+ uint8_t* b = new uint8_t[sizeof(*pkth) + Codec::PKT_MAX + SPARC_TWIDDLE];
+ pkth = (DAQ_PktHdr_t*)b;
+ b += sizeof(*pkth);
+ b += SPARC_TWIDDLE;
+ pkt = b;
+ }
- for (; lyr >= 0; lyr--)
- if (layers[lyr].start == (const uint8_t*)(ip6h))
- break;
+ obfuscator = nullptr;
-#if 0
- Since this packet 'is_ip6()', we ar gauranteed to find the layer
- if (lyr < 0)
- return IPPROTO_ID_RESERVED;
-#endif
+ reset();
+}
- while (lyr < num_layers)
- {
- const uint16_t prot = layers[lyr].prot_id;
+Packet::~Packet()
+{
+ if (allocated)
+ delete[] (uint8_t*)pkth;
+ delete[] layers;
+}
- if (!is_ip_protocol(prot))
- return (uint8_t)prot;
+void Packet::reset()
+{
+ if (obfuscator)
+ delete obfuscator;
- ++lyr;
- }
- }
+ flow = nullptr;
+ endianness = nullptr;
+ obfuscator = nullptr;
+ packet_flags = 0;
+ xtradata_mask = 0;
+ proto_bits = 0;
+ alt_dsize = 0;
+ num_layers = 0;
+ ip_proto_next = IpProtocol::PROTO_NOT_SET;
+ disable_inspect = false;
- return IPPROTO_ID_RESERVED;
+ ptrs.reset();
}
-#endif
-
bool Packet::get_ip_proto_next(uint8_t& lyr, IpProtocol& proto) const
{
if (lyr > num_layers)
return "other";
}
-void Packet::reset()
-{
- if (obfuscator)
- delete obfuscator;
-
- memset(this, 0, offsetof(Packet, pkth));
- ptrs.reset();
-}
// payload data only, no headers.
struct SO_PUBLIC Packet
{
+ Packet(bool packet_data = true);
+ ~Packet();
+
class Flow* flow; /* for session tracking */
+ class Endianness* endianness;
+ class Obfuscator* obfuscator;
uint32_t packet_flags; /* special flags for the packet */
uint32_t xtradata_mask;
uint16_t alt_dsize; /* the dsize of a packet before munging (used for log)*/
uint8_t num_layers; /* index into layers for next encap */
+ // FIXIT-M: Consider moving ip_proto_next below `pkth`.
IpProtocol ip_proto_next; /* the protocol ID after IP and all IP6 extension */
bool disable_inspect;
- class Endianness* endianness;
- class Obfuscator* obfuscator;
-
// nothing after this point is zeroed ...
// Everything beyond this point is set by PacketManager::decode()
void set_application_protocol(int16_t ap)
{ if ( flow ) flow->ssn_state.application_protocol = ap; }
+
+private:
+ bool allocated;
};
/* Macros to deal with sequence numbers - p810 TCP Illustrated vol 2 */
// Initialization and setup
//-------------------------------------------------------------------------
-Packet* PacketManager::encode_new(bool packet_data)
-{
- Packet* p = (Packet*)SnortAlloc(sizeof(*p));
- Layer* lyr = new Layer[CodecManager::max_layers];
-
- if ( !p || !lyr)
- FatalError("encode_new() => Failed to allocate packet\n");
-
- if (!packet_data)
- {
- p->pkt = nullptr;
- p->pkth = nullptr;
- }
- else
- {
- uint8_t* b = (uint8_t*)SnortAlloc(sizeof(*p->pkth) + Codec::PKT_MAX + SPARC_TWIDDLE);
-
- if (!b)
- FatalError("encode_new() => Failed to allocate packet\n");
-
- p->pkth = (DAQ_PktHdr_t*)b;
- b += sizeof(*p->pkth);
- b += SPARC_TWIDDLE;
- p->pkt = b;
- }
-
- p->layers = lyr;
- return p;
-}
-
-void PacketManager::encode_delete(Packet* p)
-{
- if (p)
- {
- if (p->pkth)
- free((void*)p->pkth);
-
- if (p->layers)
- delete[] p->layers;
-
- p->pkth = nullptr;
- p->layers = nullptr;
- free(p);
- }
-}
-
// Assertions required for this code to work
// Look below inside main decode() loop for these static_asserts
p->reset();
p->pkth = pkthdr;
p->pkt = pkt;
- p->ptrs.reset();
layer::set_packet_pointer(p);
s_stats[total_processed]++;
// decode this packet and set all relevent packet fields.
static void decode(Packet*, const struct _daq_pkthdr*, const uint8_t*, bool cooked = false);
- // allocate a Packet for later formatting (cloning)
- static Packet* encode_new(bool allocate_packet_data = true);
-
- // release the allocated Packet
- static void encode_delete(Packet*);
-
// when encoding, rather than copy the destination MAC address from the
// inbound packet, manually set the MAC address.
static void encode_set_dst_mac(uint8_t*);
// XXX NOT YET IMPLEMENTED - debugging
if (!defrag_pkts[encap_frag_cnt])
- defrag_pkts[encap_frag_cnt] = PacketManager::encode_new();
+ defrag_pkts[encap_frag_cnt] = new Packet();
dpkt = defrag_pkts[encap_frag_cnt];
for (int i = 1; i < layers; i++)
defrag_pkts[i] = nullptr;
- defrag_pkts[0] = PacketManager::encode_new();
+ defrag_pkts[0] = new Packet();
pkt_snaplen = SFDAQ::get_snap_len();
}
{
if (defrag_pkts[i] != nullptr)
{
- PacketManager::encode_delete(defrag_pkts[i]);
+ delete defrag_pkts[i];
defrag_pkts[i] = nullptr;
}
}
void TcpStreamSession::sinit(void)
{
- s5_pkt = PacketManager::encode_new();
+ s5_pkt = new Packet();
//AtomSplitter::init(); // FIXIT-L PAF implement
}
{
if (s5_pkt)
{
- PacketManager::encode_delete(s5_pkt);
+ delete s5_pkt;
s5_pkt = nullptr;
}
}
void UserTracker::detect(const Packet* p, const StreamBuffer* sb, uint32_t flags)
{
- Packet up;
- up.reset();
+ Packet up(false);
up.pkth = p->pkth;
up.ptrs = p->ptrs;