]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
packet manager refactor
authorJosh <jrosenba@cisco.com>
Tue, 29 Apr 2014 20:36:14 +0000 (16:36 -0400)
committerJosh <jrosenba@cisco.com>
Tue, 29 Apr 2014 20:36:14 +0000 (16:36 -0400)
31 files changed:
1  2 
src/codecs/basic/cd_esp.cc
src/codecs/basic/cd_eth.cc
src/codecs/basic/cd_icmp4.cc
src/codecs/basic/cd_icmp6.cc
src/codecs/basic/cd_ipv4.cc
src/codecs/basic/cd_ipv6.cc
src/codecs/basic/cd_null.cc
src/codecs/basic/cd_tcp.cc
src/codecs/basic/cd_udp.cc
src/codecs/plugins/cd_ah.cc
src/codecs/plugins/cd_arp.cc
src/codecs/plugins/cd_dstopts.cc
src/codecs/plugins/cd_erspan2.cc
src/codecs/plugins/cd_erspan3.cc
src/codecs/plugins/cd_ethloopback.cc
src/codecs/plugins/cd_fragment.cc
src/codecs/plugins/cd_gre.cc
src/codecs/plugins/cd_gtp.cc
src/codecs/plugins/cd_hopopts.cc
src/codecs/plugins/cd_mpls.cc
src/codecs/plugins/cd_pppencap.cc
src/codecs/plugins/cd_pppoepkt.cc
src/codecs/plugins/cd_routing.cc
src/codecs/plugins/cd_swipe.cc
src/codecs/plugins/cd_teredo.cc
src/codecs/plugins/cd_transbridge.cc
src/codecs/plugins/cd_vlan.cc
src/codecs/template.cc
src/framework/codec.h
src/managers/packet_manager.cc
src/protocols/undefined_protocols.h

index 650bfc21a105ea32c1d5530c662b2f550fe0d25c,ce70f10252ff96fae5bc68d50db8a48f1f6d0024..d37482d90b30b95d2259aa228935da3fd19780a9
@@@ -41,9 -41,8 +41,9 @@@ public
      ~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);
      
  };
  
@@@ -81,7 -88,7 +81,7 @@@ void EspCodec::get_protocol_ids(std::ve
   * 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;
index 312b41290b0f6c1da5bcf8ddba6ff99b7a95fb74,ac81d9bdbf17a2f246f48aa95230212b1ec3719b..6fd60a54d4e4391ba220f8419ba5cd0ae34e977c
@@@ -42,10 -42,8 +42,10 @@@ public
      ~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"
@@@ -79,7 -72,7 +79,7 @@@ void EthCodec::get_data_link_type(std::
   * 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++;
index 19a88834920e187e518a7a7b386522c711aeeb3e,aa2df3cfeaf8a743e757e802c8230b6259db2bae..e8cbe1016693d94ed5a8e8903aae161f34699a01
@@@ -49,9 -49,8 +49,9 @@@ public
      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
@@@ -93,7 -87,7 +93,7 @@@ void Icmp4Codec::get_protocol_ids(std::
   * 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)
      {
index e7ee50468b938f49a2797b0a2407c19e9acbb6fe,ae3f1a8e147af6d98f117588340cb7769ba547ec..6568fb8514c2c6d7d15db5bfa143d2e97b016a37
@@@ -43,10 -43,8 +43,10 @@@ public
      ~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"
@@@ -76,7 -68,7 +76,7 @@@ static unsigned short in_chksum_icmp6(p
  //--------------------------------------------------------------------
  
  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())
      {
index 1b64e2d8b033bd95aaa10ebc044dbb3aae9c5c70,706762771e831bf3e15654d592e86e6f6161a2b2..a1606c74be00318b5cbad69e54ae0dcac254ca64
@@@ -51,9 -51,8 +51,9 @@@ public
      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++
  
@@@ -114,7 -107,7 +114,7 @@@ void Ipv4Codec::get_protocol_ids(std::v
   * 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 */
  
index 5491d4d5b484739511f98efe9cbc3b171dd915e6,3a927ac961bd475d94a9a4f3f1ed51ed605b7ec4..2c26e6f5031827f826b9245a703549d5e5e8b8e1
@@@ -40,9 -42,8 +40,9 @@@ public
      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"
@@@ -72,7 -68,7 +72,7 @@@ void Ipv6Codec::get_protocol_ids(std::v
  //--------------------------------------------------------------------
  
  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;
index e1cbae62c12c5c1a2c840811670755817cb14995,a836d60247c0feae559b5a8c691b9cd8f57ac7d4..edf4fa4fad9ed82c93cd8f903351b29b97da4d68
  
  #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()
index 6c082cc3f3caa963134f7508b721f5a77d5c245c,17964a022c2bbe6421e70551d09d6d92ff8f147f..26f2e44a9d20e764434b825fd7f616b3784d162f
@@@ -57,10 -57,8 +57,10 @@@ public
      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"
@@@ -106,7 -98,7 +106,7 @@@ void TcpCodec::get_protocol_ids(std::ve
   * 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())
      {
index 5f8b06508c9a6b509b9f2035701da9461a75eec7,9b678ad675204d69c4cc91563ae9fc25d32c66f3..b6ef15ee80dd23ea0b579c46735b194ba7065bdf
@@@ -50,9 -50,8 +50,9 @@@ public
      ~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"
@@@ -75,14 -74,8 +75,14 @@@ static inline unsigned short in_chksum_
  
  
  
 +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;
index 8b4029ae0b92f31c75a121733f16dae87c8a8b5c,1c3f9b44f1dcda214e1caddda1bb56ffe3188850..f3d1701cb93e3deba7e8df9d5767d28bdc7f204b
@@@ -39,9 -39,8 +39,9 @@@ public
      ~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
@@@ -55,14 -54,9 +55,14 @@@ static const uint16_t AH_PROT_ID = 51; 
  
  } // 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;
index e80216b7691dd84b8ad69aeba6c1fc253fcaa3cd,4dde063e9f081f67dea5cc46dbbd2e8c262056f4..4ac2206d81711faaff09a4d348ef00eda47525a3
@@@ -38,9 -38,8 +38,9 @@@ public
      ~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
@@@ -78,7 -71,7 +78,7 @@@ void ArpCodec::get_protocol_ids(std::ve
   * 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++;
  
index 8ad048d6184ae7fee6c1d1391dbc7631464e9913,54bdfd3a3f07c4f27b5e0b9bcefe9eda7d432c04..c64c0442d48331c313c1d82fb94451fe51ef2d9f
@@@ -47,9 -47,8 +47,9 @@@ public
      ~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>&){};
index bd4151127d81dba51011deb623dd2e45c112d035,4a83f1677662688164e92da1f664218b6c0b19fb..8cd5870a1dd75f86b31e76eafbc3ce06c9cb9beb
@@@ -31,12 -31,11 +31,12 @@@ namespac
  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"
@@@ -74,7 -70,7 +74,7 @@@ void Erspan2Codec::get_protocol_ids(std
   *
   */
  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;
index d66251112f3de0a2e7d83b1ad1d56b9892092a21,1cc5e3ac5cc12a472bdc8ff7eb92e82844e2d2be..980220808e735b0b5d058837f1cb851aa7dde3bf
@@@ -37,9 -37,8 +37,9 @@@ public
      ~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"
@@@ -82,7 -74,7 +82,7 @@@ void Erspan3Codec::get_protocol_ids(std
   *
   */
  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;
index 3780883a55dfae149762125501dad31b39b0a851,17e1390e21681ef0d0d9120da41f825e844f8606..fc1f326b1fc2cb9bdd7e26ea983d8547645970a0
@@@ -34,9 -34,8 +34,9 @@@ public
      ~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);
  
      
  };
@@@ -46,14 -45,8 +46,14 @@@ const uint16_t ETHERNET_TYPE_LOOP = 0x9
  
  } // 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"););
index 571fe53aac611f42fae7fae6a42ead9aba8206a8,e98cbf8e0df676a4133dbd607b98fb30da0e24fb..1916a9fd9e2a07db57114af75eea785880d7b3c5
@@@ -45,9 -47,8 +45,9 @@@ public
      ~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>&);
      
index 5e087755df3be9bb290c063079bd193b6d4a7488,10d8c040e4561050b4df27f5c5046a55a643540a..c9dd04b365680a7b8d97f4fe468f328a5d33b5fd
@@@ -37,9 -37,8 +37,9 @@@ public
      ~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"
@@@ -93,7 -100,7 +93,7 @@@ void GreCodec::get_protocol_ids(std::ve
   * 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)
      {
index 1806fcad23a62683042b82f96ed3382d93c1963d,865a66d7cf9399467f8a5fc9aaf8b389ca21cd4d..ee249b8541825cde0bd42bbb7ab4731a582fd0ca
@@@ -44,12 -44,12 +44,12 @@@ namespac
  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
@@@ -73,7 -69,7 +73,7 @@@ void GtpCodec::get_protocol_ids(std::ve
   */
  
  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;
index dc23d8ec14564439109d1d3683144fe1a729c767,a836d60247c0feae559b5a8c691b9cd8f57ac7d4..cc98d5708e4d235ef8a5eaeeeb1cd1270a75ed19
@@@ -45,10 -47,8 +45,10 @@@ public
      ~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>&){};
index 60cb20f9d1d81197892ce30bc70b240175c5727f,665f059ac310c8295668c3951a1256593070d179..95ca5dabedea4aaeced30ea26a9d60887f8c430a
@@@ -39,12 -39,12 +39,12 @@@ namespac
  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"
@@@ -63,15 -63,8 +63,15 @@@ const static uint32_t NUM_RESERVED_LABE
  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;
index 44f8b683d73414db68c9c58891aa22f027ddc310,e878fd59a8009ffc3c3d46300ae3d5b097b33cb6..3cf99983ddad1044c0bc858545e1c537321f0857
@@@ -41,9 -41,8 +41,9 @@@ public
      ~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"
@@@ -78,7 -74,7 +78,7 @@@ void PppEncap::get_protocol_ids(std::ve
   * 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;
index feebdd69889cd3447a2864dcb19bebdcf93602d3,0a38970c254135eb984c9c7c4caa8fd433ccf179..8b2b962e001e0c41ef0d51bb1d0d2edc34193f4b
@@@ -35,9 -35,8 +35,9 @@@ public
      ~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"
@@@ -101,7 -93,7 +101,7 @@@ void PPPoEPkt::get_protocol_ids(std::ve
   *
   */
  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 */
index a836d60247c0feae559b5a8c691b9cd8f57ac7d4,a836d60247c0feae559b5a8c691b9cd8f57ac7d4..36c6bf44d275c68a060f86eb1d8e96c009b84de8
@@@ -48,7 -48,7 +48,7 @@@ public
  
  
      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>&){};
index 1fe241a9df9b6dfffb6e0808f10f0d1bf251c26e,4f8a54e9a2f576472deb900cdb8329715f7c1ee4..4dda224fc8322d8485672b483b25dafe659a63ac
@@@ -42,22 -42,14 +42,22 @@@ public
      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);
index 989f80d86b536ee60680b4f3651941454c791948,ba2fcd12e370da36a5f83ab19e03679564d952f7..36ad5f3a1140f9544064b94dc7e655c2ed41ef7f
@@@ -50,22 -50,15 +50,22 @@@ public
      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)
  {
  
  
index 9b2c06f43e2786068698eb91c051a48220c40eef,55c6c9e549001b11b0d195e2657374747802a1cf..a87cfb35d858ec482104911e468fcb0a08f6a76c
@@@ -43,9 -43,8 +43,9 @@@ public
      ~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);
      
  };
  
@@@ -75,7 -70,7 +75,7 @@@ void TransbridgeCodec::get_protocol_ids
   * 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++;
  
index 33b8e74c7f199ccf7e773657a54a41e0204cc936,44f44657b6da3f02953c67785c3b500a0ec02e19..5203b2a43bbf1dcb76f81182517943382f2df73f
@@@ -39,9 -39,9 +39,9 @@@ public
      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
@@@ -60,14 -73,8 +60,14 @@@ static inline uint32_t len_vlan_llc_oth
  }
  
  
 +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++;
  
index 67b313c74f87d3432cf6ea5c8dcac810e2825f24,d7c95aa5061a1116f4f968d1c5bac26afaba8a57..a55fd4698e81faf0509e9af35c818f82361b5757
@@@ -40,7 -40,7 +40,7 @@@ public
  
  
      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>&){};
@@@ -55,7 -55,7 +55,7 @@@ static CdPegs gcounts
  
  
  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)
  {
  
  }
index 41107319d3430beee44df343a0c0aadb4c8f5591,1a8cef33c53a6eb876f06eeaf75d9eb9d1a1935f..133339a7244ee9e6838e0e6df6b677ecb2dd234b
@@@ -46,18 -51,13 +46,18 @@@ public
      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; };
  
  
index 599b2d018ecd1f2354bd8a641a83c1c175162fc1,09f12724588968d7776a759bd309263be5f65678..a647250a19dec7a1db81e4b42024d4ece2e107b7
@@@ -62,33 -61,13 +62,34 @@@ THREAD_LOCAL PreprocStats decodePerfSta
  
  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
@@@ -245,19 -211,20 +246,19 @@@ void PacketManager::set_grinder(void
          {
             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()
@@@ -302,55 -269,6 +303,44 @@@ void PacketManager::accumulate(
      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;
index cdc15bc9ff8470422defa828c88e1e7e0dcef753,cdc15bc9ff8470422defa828c88e1e7e0dcef753..b04584b350ecca681b84070606295016c8172398
@@@ -28,7 -28,7 +28,7 @@@
   *   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;