virtual void get_protocol_ids(std::vector<uint16_t>&);
- virtual bool decode(const uint8_t *raw_pkt, const uint32_t& raw_len,
- Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
+ virtual bool decode(const RawData&, CodecData&, SnortData&);
};
v.push_back(IPPROTO_ID_PIM);
}
-bool PimCodec::decode(const uint8_t* /*raw_pkt*/, const uint32_t& /*raw_len*/,
- Packet* p, uint16_t& /*lyr_len*/, uint16_t& /*next_prot_id*/)
+bool PimCodec::decode(const RawData&, CodecData&, SnortData&)
{
- codec_events::decoder_event(p, DECODE_IP_BAD_PROTO);
+ codec_events::decoder_event(DECODE_IP_BAD_PROTO);
return true;
}
#endif
#include <pcap.h>
-#include "protocols/packet.h"
#include "protocols/token_ring.h"
#include "framework/codec.h"
#include "codecs/codec_events.h"
#include "codecs/decode_module.h"
+
+#ifdef DLT_IEEE802
+
namespace
{
virtual void get_data_link_type(std::vector<int>&);
- virtual bool decode(const uint8_t *raw_pkt, const uint32_t& raw_len,
- Packet *, uint16_t &lyr_len, uint16_t &next_prot_id);
+ virtual bool decode(const RawData&, CodecData&, SnortData&);
};
void TrCodec::get_data_link_type(std::vector<int>&v)
{
-#ifdef DLT_IEEE802
v.push_back(DLT_IEEE802);
-#endif
}
//void DecodeTRPkt(Packet * p, const DAQ_PktHdr_t * pkthdr, const uint8_t * pkt)
-bool TrCodec::decode(const uint8_t *raw_pkt, const uint32_t& raw_len,
- Packet *p, uint16_t &lyr_len, uint16_t &next_prot_id)
+bool TrCodec::decode(const RawData& raw, CodecData& codec, SnortData&)
{
- uint32_t cap_len = raw_len;
+ const uint32_t cap_len = raw.len;
uint32_t dataoff; /* data offset is variable here */
if(cap_len < sizeof(token_ring::Trh_hdr))
{
- codec_events::decoder_event(p, DECODE_BAD_TRH);
+ codec_events::decoder_event(DECODE_BAD_TRH);
return false;
}
*/
if(cap_len < (sizeof(token_ring::Trh_hdr) + sizeof(token_ring::Trh_llc)))
{
- codec_events::decoder_event(p, DECODE_BAD_TR_ETHLLC);
+ codec_events::decoder_event(DECODE_BAD_TR_ETHLLC);
return false;
}
const token_ring::Trh_llc *trhllc =
- reinterpret_cast<const token_ring::Trh_llc *>(raw_pkt + sizeof(token_ring::Trh_hdr));
+ reinterpret_cast<const token_ring::Trh_llc *>(raw.data + sizeof(token_ring::Trh_hdr));
if(trhllc->dsap != IPARP_SAP && trhllc->ssap != IPARP_SAP)
{
if(cap_len < (sizeof(token_ring::Trh_hdr) + sizeof(token_ring::Trh_llc) + sizeof(token_ring::Trh_mr)))
{
- codec_events::decoder_event(p, DECODE_BAD_TRHMR);
+ codec_events::decoder_event(DECODE_BAD_TRHMR);
return false;
}
- const token_ring::Trh_mr* trhmr =
- reinterpret_cast<const token_ring::Trh_mr *>(raw_pkt + sizeof(token_ring::Trh_hdr));
+ const token_ring::Trh_mr* const trhmr =
+ reinterpret_cast<const token_ring::Trh_mr *>(raw.data + sizeof(token_ring::Trh_hdr));
if(cap_len < (sizeof(token_ring::Trh_hdr) + sizeof(token_ring::Trh_llc) +
sizeof(token_ring::Trh_mr) + TRH_MR_LEN(trhmr)))
{
- codec_events::decoder_event(p, DECODE_BAD_TR_MR_LEN);
+ codec_events::decoder_event(DECODE_BAD_TR_MR_LEN);
return false;
}
- dataoff = sizeof(token_ring::Trh_hdr) + TRH_MR_LEN(trhmr) + sizeof(token_ring::Trh_llc);
+ dataoff = sizeof(token_ring::Trh_hdr) + TRH_MR_LEN(trhmr) + sizeof(token_ring::Trh_llc);
}
else
return false;
}
- lyr_len = dataoff;
- next_prot_id = htons(trhllc->ethertype);
+ codec.lyr_len = dataoff;
+ codec.next_prot_id = htons(trhllc->ethertype);
return true;
}
static Module* mod_ctor()
-{
- return new TrCodecModule;
-}
+{ return new TrCodecModule; }
static void mod_dtor(Module* m)
-{
- delete m;
-}
+{ delete m; }
static Codec* ctor(Module*)
-{
- return new TrCodec();
-}
+{ return new TrCodec(); }
static void dtor(Codec *cd)
-{
- delete cd;
-}
+{ delete cd; }
static const CodecApi tr_api =
&tr_api.base,
nullptr
};
+
+#endif
// precondition - what we registered for
assert(IsUDP(p));
- if ( p->dp == port && p->dsize > max )
+ if ( p->ptrs.dp == port && p->dsize > max )
SnortEventqAdd(DPX_GID, DPX_SID);
++dpxstats.total_packets;
int rval = DETECTION_OPTION_NO_MATCH;
- if ( p->tcph && config.eval(p->tcph->th_ack) )
+ if ( p->ptrs.tcph && config.eval(p->ptrs.tcph->th_ack) )
rval = DETECTION_OPTION_MATCH;
//MODULE_PROFILE_END(tcpUrgPerfStats);
/* Run a bunch of ICMP decoder rules */
ICMP4MiscTests(icmph, codec, (uint16_t)raw.len - len);
+ snort.packet_type = PKT_TYPE__ICMP4;
snort.icmph = icmph;
codec.proto_bits |= PROTO_BIT__ICMP;
codec.lyr_len = len;
codec.lyr_len = len;
codec.proto_bits |= PROTO_BIT__ICMP;
snort.icmph = reinterpret_cast<const icmp::ICMPHdr*>(icmp6h);
+ snort.packet_type = PKT_TYPE__ICMP6;
return true;
}
codec_events::decoder_event(DECODE_BAD_FRAGBITS);
+ snort.packet_type = PKT_TYPE__IP;
codec.proto_bits |= PROTO_BIT__IP;
IPMiscTests(iph, ip::IP4_HEADER_LEN + ip_opt_len);
codec.lyr_len = hlen;
IPV6MiscTests(snort);
CheckIPV6Multicast(ip6h);
+ snort.packet_type = PKT_TYPE__IP;
codec.next_prot_id = ip6h->get_next();
codec.lyr_len = ip::IP6_HEADER_LEN;
snort.tcph = tcph;
snort.sp = tcph->src_port();
snort.dp = tcph->dst_port();
+ snort.packet_type = PKT_TYPE__TCP;
TCPMiscTests(snort, tcph);
snort.dp = dst_port;
codec.lyr_len = udp::UDP_HEADER_LEN;
codec.proto_bits |= PROTO_BIT__UDP;
+ snort.packet_type = PKT_TYPE__UDP;
// set in packet manager
UDPMiscTests(snort, uhlen - udp::UDP_HEADER_LEN);
*
* Returns: void function
*/
-bool ArpCodec::decode(const RawData& raw, CodecData& codec, SnortData&)
+bool ArpCodec::decode(const RawData& raw, CodecData& codec, SnortData& snort)
{
if(raw.len < sizeof(arp::EtherARP))
{
codec.proto_bits |= PROTO_BIT__ARP;
codec.lyr_len = sizeof(arp::EtherARP);
-
+ snort.packet_type = PKT_TYPE__ARP;
+
return true;
}
#include <vector>
#include <cstdint>
#include <cstddef>
+#include <type_traits> // static_assert
#include "main/snort_types.h"
#include "framework/base_api.h"
uint32_t len;
};
+/* SnortData Flags */
+
+/* error flags */
+constexpr uint8_t DECODE_ERR_CKSUM_IP = 0x01;
+constexpr uint8_t DECODE_ERR_CKSUM_TCP = 0x02;
+constexpr uint8_t DECODE_ERR_CKSUM_UDP = 0x04;
+constexpr uint8_t DECODE_ERR_CKSUM_ICMP = 0x08;
+constexpr uint8_t DECODE_ERR_CKSUM_ANY = 0x0F;
+constexpr uint8_t DECODE_ERR_BAD_TTL = 0x10;
+constexpr uint8_t DECODE_PKT_TRUST = 0x20; /* Tell Snort++ to whitelist this packet */
+constexpr uint8_t DECODE_FRAG = 0x40; /* flag to indicate a fragmented packet */
+constexpr uint8_t DECODE_MF = 0x80;
+
+constexpr uint8_t DECODE_ERR_FLAGS = DECODE_ERR_CKSUM_IP |
+ DECODE_ERR_CKSUM_TCP |
+ DECODE_ERR_CKSUM_UDP |
+ DECODE_ERR_CKSUM_UDP |
+ DECODE_ERR_CKSUM_ICMP |
+ DECODE_ERR_CKSUM_ANY |
+ DECODE_ERR_BAD_TTL;
+
+
+constexpr uint8_t PKT_TYPE__UNKOWN = 0x00;
+constexpr uint8_t PKT_TYPE__IP = 0x01;
+constexpr uint8_t PKT_TYPE__TCP = 0x02;
+constexpr uint8_t PKT_TYPE__UDP = 0x04;
+constexpr uint8_t PKT_TYPE__ICMP4 = 0x08;
+constexpr uint8_t PKT_TYPE__ICMP6 = 0x10;
+constexpr uint8_t PKT_TYPE__ARP = 0x10;
+
struct SnortData
{
/* Pointers which will be used by Snort++. (starting with uint16_t so tcph is 64 bytes from start*/
uint16_t sp; /* source port (TCP/UDP) */
uint16_t dp; /* dest port (TCP/UDP) */
uint8_t decode_flags; /* decoder flags including checksum errors, bad TTLs, frag, etc. */
+ uint8_t packet_type;
ip::IpApi ip_api;
mpls::MplsHdr mplsHdr;
inline void reset()
{
+ static_assert(PKT_TYPE__UNKOWN == 0, "PKT_TYPE__UNKOWN must be zero!!");
memset((char*)tcph, '\0', offsetof(SnortData, ip_api));
ip_api.reset();
}
};
-/* error flags */
-constexpr uint8_t DECODE_ERR_CKSUM_IP = 0x01;
-constexpr uint8_t DECODE_ERR_CKSUM_TCP = 0x02;
-constexpr uint8_t DECODE_ERR_CKSUM_UDP = 0x04;
-constexpr uint8_t DECODE_ERR_CKSUM_ICMP = 0x08;
-constexpr uint8_t DECODE_ERR_CKSUM_ANY = 0x0F;
-constexpr uint8_t DECODE_ERR_BAD_TTL = 0x10;
-constexpr uint8_t DECODE_PKT_TRUST = 0x20; /* Tell Snort++ to whitelist this packet */
-constexpr uint8_t DECODE_FRAG = 0x40; /* flag to indicate a fragmented packet */
-constexpr uint8_t DECODE_MF = 0x80;
-
-constexpr uint8_t DECODE_ERR_FLAGS = DECODE_ERR_CKSUM_IP |
- DECODE_ERR_CKSUM_TCP |
- DECODE_ERR_CKSUM_UDP |
- DECODE_ERR_CKSUM_UDP |
- DECODE_ERR_CKSUM_ICMP |
- DECODE_ERR_CKSUM_ANY |
- DECODE_ERR_BAD_TTL;
-
struct CodecData
{
#define PROTO_BIT__ALL 0xffff
+
+
/* Decode Flags */
constexpr uint8_t CODEC_DF = 0x01; /* don't fragment flag */
constexpr uint8_t CODEC_UNSURE_ENCAP = 0x02; /* packet may have incorrect encapsulation layer.
uint32_t iplist_id;
uint8_t ps_proto; // Used for portscan and unified2 logging
+
+ /* Access methods */
+
+ inline uint8_t type() const
+ { return ptrs.packet_type; }
};
#define PKT_ZERO_LEN offsetof(Packet, pkth)
#ifndef PROTOCOLS_TOKEN_RING_H
#define PROTOCOLS_TOKEN_RING_H
+#include <cstdint>
+
namespace token_ring{
/* LLC structure */