~EspCodec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
};
* Returns: void function
*/
bool EspCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
const uint8_t *esp_payload;
uint8_t pad_length;
~EthCodec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v) {};
+ virtual void get_data_link_type(std::vector<int>&);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id);
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE
#include "codecs/sf_protocols.h"
* Returns: void function
*/
bool EthCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
// dc.eth++;
Icmp4Codec() : Codec("icmp4"){};
~Icmp4Codec() {};
+ virtual void get_protocol_ids(std::vector<uint16_t>&);
virtual bool decode(const uint8_t* raw_packet, const uint32_t raw_len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id);
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
* Returns: void function
*/
bool Icmp4Codec::decode(const uint8_t* raw_pkt, const uint32_t raw_len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
if(raw_len < ICMP_HEADER_LEN)
{
~Icmp6Codec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
+
// DELETE from here and below
#include "codecs/sf_protocols.h"
//--------------------------------------------------------------------
bool Icmp6Codec::decode(const uint8_t* raw_pkt, const uint32_t len,
-- Packet* p, uint16_t &lyr_len, int&next_prot_id)
++ Packet* p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
if(len < icmp6::hdr_min_len())
{
Ipv4Codec() : Codec("ipv4"){};
~Ipv4Codec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_packet, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// used in random classes throughout Snort++
* Returns: void function
*/
bool Ipv4Codec::decode(const uint8_t *raw_packet, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
uint32_t ip_len; /* length from the start of the ip hdr to the pkt end */
Ipv6Codec() : Codec("ipv6"){};
~Ipv6Codec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
#include "codecs/sf_protocols.h"
//--------------------------------------------------------------------
bool Ipv6Codec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
ipv6::IP6RawHdr *hdr;
uint32_t payload_len;
#include "framework/codec.h"
#include "events/codec_events.h"
+#include "codecs/decode_module.h"
++#include "protocols/undefined_protocols.h"
+
namespace
{
-class NameCodec : public Codec
+class NullCodec : public Codec
{
public:
- NameCodec() : Codec("NAME"){};
- ~NameCodec();
-
+ NullCodec() : Codec("null"){};
+ ~NullCodec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
- Packet *, uint16_t &lyr_len, int &next_prot_id) { return false; };
- Packet *, uint16_t &lyr_len, int &next_prot_id);
-
- virtual void get_protocol_ids(std::vector<uint16_t>&);
- virtual void get_data_link_type(std::vector<int>&){};
-
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id) { return false; };
+ virtual inline bool is_default_codec() { return true; };
};
-} // anonymous namespace
+} // namespace
+
+
+
+//-------------------------------------------------------------------------
+// api
+//-------------------------------------------------------------------------
-void NameCodec::get_protocol_ids(std::vector<uint16_t>& v)
+void NullCodec::get_protocol_ids(std::vector<uint16_t>& v)
{
- v.push_back(ipv6::ethertype());
- v.push_back(IPPROTO_IPV6);
++ v.push_back(FINISHED_DECODE);
+ // placeholder to avoid error
}
static Codec* ctor()
virtual ~TcpCodec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
+
// DELETE
#include "codecs/sf_protocols.h"
* Returns: void function
*/
bool TcpCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
if(len < tcp::hdr_len())
{
~UdpCodec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE
#include "codecs/sf_protocols.h"
+void UdpCodec::get_protocol_ids(std::vector<uint16_t>& v)
+{
+ v.push_back(IPPROTO_UDP);
+}
+
+
bool UdpCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
uint16_t uhlen;
u_char fragmented_udp_flag = 0;
~AhCodec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
} // anonymous namespace
+void AhCodec::get_protocol_ids(std::vector<uint16_t>& v)
+{
+ v.push_back(AH_PROT_ID);
+}
+
bool AhCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
IP6Extension *ah = (IP6Extension *)raw_pkt;
~ArpCodec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
* Returns: void function
*/
bool ArpCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
// dc.arp++;
~NameCodec();
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
virtual void get_protocol_ids(std::vector<uint16_t>&);
virtual void get_data_link_type(std::vector<int>&){};
class Erspan2Codec : public Codec
{
public:
- Erspan2Codec() : Codec("ERSPAN_2"){};
+ Erspan2Codec() : Codec("erspan2"){};
~Erspan2Codec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
#include "codecs/sf_protocols.h"
*
*/
bool Erspan2Codec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
lyr_len = sizeof(ERSpanType2Hdr);
uint32_t payload_len;
~Erspan3Codec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
#include "codecs/sf_protocols.h"
*
*/
bool Erspan3Codec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
lyr_len= sizeof(ERSpanType3Hdr);
uint32_t payload_len;
~EthLoopbackCodec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
};
} // anonymous namespace
+
+void EthLoopbackCodec::get_protocol_ids(std::vector<uint16_t>& v)
+{
+ v.push_back(ETHERNET_TYPE_LOOP);
+}
+
bool EthLoopbackCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
DEBUG_WRAP(DebugMessage(DEBUG_DECODE, "EthLoopback is not supported.\n"););
~NameCodec();
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
virtual void get_protocol_ids(std::vector<uint16_t>&);
~GreCodec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
#include "codecs/sf_protocols.h"
* Notes: see RFCs 1701, 2784 and 2637
*/
bool GreCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
if (len < GRE_HEADER_LEN)
{
class GtpCodec : public Codec
{
public:
- GtpCodec() : Codec("GTP"){};
+ GtpCodec() : Codec("gtp"){};
~GtpCodec(){};
-
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
*/
bool GtpCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
uint32_t header_len;
uint8_t next_hdr_type;
~NameCodec();
+
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
virtual void get_protocol_ids(std::vector<uint16_t>&);
virtual void get_data_link_type(std::vector<int>&){};
class MplsCodec : public Codec
{
public:
- MplsCodec() : Codec("MPLS"){};
+ MplsCodec() : Codec("mpls"){};
~MplsCodec(){};
-
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
#include "codecs/sf_protocols.h"
static int checkMplsHdr(uint32_t, uint8_t, uint8_t, uint8_t, Packet *);
+void MplsCodec::get_protocol_ids(std::vector<uint16_t>& v)
+{
+ v.push_back(ETHERNET_TYPE_MPLS_UNICAST);
+ v.push_back(ETHERNET_TYPE_MPLS_MULTICAST);
+}
+
+
bool MplsCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
uint32_t* tmpMplsHdr;
uint32_t mpls_h;
~PppEncap(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
#include "codecs/sf_protocols.h"
* Returns: void function
*/
bool PppEncap::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
static THREAD_LOCAL bool had_vj = false;
uint16_t protocol;
~PPPoEPkt(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
#include "codecs/sf_protocols.h"
*
*/
bool PPPoEPkt::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
//PPPoE_Tag *ppppoe_tag=0;
//PPPoE_Tag tag; /* needed to avoid alignment problems */
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
virtual void get_protocol_ids(std::vector<uint16_t>&);
virtual void get_data_link_type(std::vector<int>&){};
SwipeCodec() : Codec("swipe"){};
virtual ~SwipeCodec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t* raw_packet, const uint32_t raw_len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id);
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id);
};
} // namespace
+
+void SwipeCodec::get_protocol_ids(std::vector<uint16_t> &proto_ids)
+{
+ proto_ids.push_back(SWIPE_PROT_ID);
+}
+
+
bool SwipeCodec::decode(const uint8_t* raw_packet, const uint32_t raw_len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
codec_events::decoder_event(p, DECODE_IP_BAD_PROTO);
TeredoCodec() : Codec("teredo"){};
~TeredoCodec(){};
-
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
};
} // anonymous namespace
+
+void TeredoCodec::get_protocol_ids(std::vector<uint16_t>& v)
+{
+ v.push_back(PROTOCOL_TEREDO);
+}
+
+
bool TeredoCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
~TransbridgeCodec(){};
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
};
* wasn't needed since we are already deep into the packet
*/
bool TransbridgeCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
// dc.gre_eth++;
VlanCodec() : Codec("vlan"){};
~VlanCodec(){};
-
+ virtual void get_protocol_ids(std::vector<uint16_t>& v);
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
// DELETE from here and below
}
+void VlanCodec::get_protocol_ids(std::vector<uint16_t>& v)
+{
+ v.push_back(ETHERNET_TYPE_8021Q);
+}
+
+
bool VlanCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
// dc.vlan++;
virtual bool decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *, uint16_t &lyr_len, int &next_prot_id);
++ Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
virtual void get_protocol_ids(std::vector<uint16_t>&);
virtual void get_data_link_type(std::vector<int>&){};
bool NameCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id)
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
{
}
virtual ~Codec() { };
virtual bool decode(const uint8_t* raw_packet, const uint32_t raw_len,
-- Packet *p, uint16_t &lyr_len, int &next_prot_id) = 0;
-
- // do nothing unless methods overridden.
- // ONE OF THESE METHODS MUST BE IMPLEMENTED!!
++ Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id) = 0;
+ // Get the codec's name
virtual inline const char* get_name(){return name; };
+ // Registers this Codec's data link type (as defined by libpcap)
+ virtual void get_data_link_type(std::vector<int>&) {};
+ // Register the code's protocol ID's and Ethertypes
+ virtual void get_protocol_ids(std::vector<uint16_t>&) = 0;
+ // used by packet manager to determine the default/null codec
+ virtual inline bool is_default_codec() { return false; };
+ // DELETE
virtual inline PROTO_ID get_proto_id() { return PROTO_MAX; };
static const uint16_t max_protocol_id = 65535;
static std::list<const CodecApi*> s_codecs;
-static std::array<Codec*, max_protocol_id> s_protocols;
+//static std::array<Codec*, max_protocol_id> s_protocols;
+
- // statistics information
- static THREAD_LOCAL std::array<PegCount, max_protocol_id + gen_peg_size> s_stats;
- static std::array<PegCount, max_protocol_id + gen_peg_size> g_stats;
- static THREAD_LOCAL CdGenPegs pkt_cnt;
+
+static std::array<uint8_t, max_protocol_id> s_proto_map{};
+static std::array<Codec*, 256> s_protocols{};
+static THREAD_LOCAL uint8_t grinder = 0;
-static THREAD_LOCAL std::array<PegCount, max_protocol_id + gen_peg_size> s_stats;
-static std::array<PegCount, max_protocol_id + gen_peg_size> g_stats;
+ // statistics information
++static THREAD_LOCAL std::array<PegCount, 256 + gen_peg_size> s_stats;
++static std::array<PegCount, 256 + gen_peg_size> g_stats;
+ static THREAD_LOCAL CdGenPegs pkt_cnt;
+
+//-------------------------------------------------------------------------
+// helper functions
+//-------------------------------------------------------------------------
+
+// note that we now have multiple preproc configs saved by parser
+// (s5-global, s5-tcp, ..., etc.) but just one ppapi. that means
+// we must call the config func multiple times but add only the 1st
+// instance to the policy list.
+static inline const CodecApi* GetApi(const char* keyword)
+{
+ for ( auto* p : s_codecs )
+ if ( !strncasecmp(p->base.name, keyword, strlen(p->base.name)) )
+ return p;
+ return NULL;
+}
+
//-------------------------------------------------------------------------
// plugins
{
if (curr_dlt == daq_dlt)
{
- if (s_protocols[GRINDER_ID] != NULL)
+ if (grinder != 0)
WarningMessage("The Codecs %s and %s have both been registered "
"as the raw decoder. Codec %s will be used\n",
-- s_protocols[GRINDER_ID]->get_name(), cd->get_name(),
++ s_protocols[grinder]->get_name(), cd->get_name(),
cd->get_name());
- s_protocols[GRINDER_ID] = cd;
- codec_registered = true;
+ grinder = i;
}
}
-
- if (!codec_registered)
- WarningMessage("The Codec %s is never used\n", cd->get_name());
}
+
+ if(!grinder)
+ FatalError("Unable to find a Codec with data link type %d!!\n", daq_dlt);
}
void PacketManager::thread_term()
stats_mutex.unlock();
}
- int curr_prot_id, next_prot_id;
+//-------------------------------------------------------------------------
+// grinder
+//-------------------------------------------------------------------------
+
+void PacketManager::decode(
+ Packet* p, const DAQ_PktHdr_t* pkthdr, const uint8_t* pkt)
+{
+ PROFILE_VARS;
- curr_prot_id = GRINDER_ID;
++ uint16_t mapped_prot, next_prot_id;
+ uint16_t len, lyr_len;
+
+ PREPROC_PROFILE_START(decodePerfStats);
+
+ // initialize all of the relevent data to decode this packet
+ memset(p, 0, PKT_ZERO_LEN);
+ p->pkth = pkthdr;
+ p->pkt = pkt;
+ len = pkthdr->caplen;
- while(curr_prot_id >= 0 && curr_prot_id < max_protocol_id)
++ mapped_prot = grinder;
+ pkt_cnt.total_processed++;
+
+ // loop until the protocol id is no longer valid
- if (s_protocols[curr_prot_id] == 0)
- {
- pkt_cnt.other_codecs++;
- break;
- }
- else if( !s_protocols[curr_prot_id]->decode(pkt, len, p, lyr_len, next_prot_id))
- {
- pkt_cnt.discards++;
- break;
- }
-
- s_stats[curr_prot_id + stat_offset]++;
- PacketClass::PushLayer(p, s_protocols[curr_prot_id], pkt, lyr_len);
- curr_prot_id = next_prot_id;
- next_prot_id = -1;
++ while(s_protocols[mapped_prot]->decode(pkt, len, p, lyr_len, next_prot_id))
+ {
++ mapped_prot = s_proto_map[next_prot_id];
++ PacketClass::PushLayer(p, s_protocols[mapped_prot], pkt, lyr_len);
++ s_stats[mapped_prot + stat_offset]++;
+ len -= lyr_len;
+ pkt += lyr_len;
++ next_prot_id = FINISHED_DECODE; // necessary in case decode returns true an
+ lyr_len = 0;
+ }
+
+ p->dsize = len;
+ p->data = pkt;
+ PREPROC_PROFILE_END(decodePerfStats);
+}
+
bool PacketManager::has_codec(uint16_t cd_id)
{
return s_protocols[cd_id] != 0;
* 256 (0x0100) - 1535 (0x05FF) --> random protocols (teredo, gtp)
* 1536 (0x6000) - 65536 (0xFFFF) --> Ethertypes
*/
--const uint16_t GRINDER_ID = 0x0100;
++const uint16_t FINISHED_DECODE = 0x0100;
const uint16_t PROTOCOL_TEREDO = 0x0101;
const uint16_t PROTOCOL_GTP = 0x0102;