From: Josh Date: Fri, 25 Apr 2014 17:10:56 +0000 (-0400) Subject: Adding Codec patch from mac X-Git-Tag: 3.0.0-233~1550 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d4197e687808eeff4cf3d45d945d9ce0d47cb670;p=thirdparty%2Fsnort3.git Adding Codec patch from mac --- d4197e687808eeff4cf3d45d945d9ce0d47cb670 diff --cc src/codecs/basic/cd_eth.cc index 269f85f6f,3982921c3..c151c33db --- a/src/codecs/basic/cd_eth.cc +++ b/src/codecs/basic/cd_eth.cc @@@ -53,7 -60,10 +53,10 @@@ public }; - } // namespace -} // anonymous namespace ++} // anonymous + + static const uint16_t MAX_LENGTH = 1500; + static const uint16_t MIN_ETHERTYPE = 1536; //-------------------------------------------------------------------- @@@ -114,9 -125,19 +117,18 @@@ bool EthCodec::decode(const uint8_t *ra ); next_prot_id = ntohs(p->eh->ether_type); - lyr_len = eth::hdr_len(); - + if (next_prot_id > MIN_ETHERTYPE ) + { - hdr_len = eth::hdr_len(); ++ lyr_len = eth::hdr_len(); + return true; + } + + // add this alert type + // if(len > MAX_LENGTH) { + // CodecEvents::decoder_event(p, DECODE_ETH_INVALID_FRAME); + - return true; + return false; } diff --cc src/codecs/basic/cd_udp.cc index 7221e390f,2ec025a87..88bf737e0 --- a/src/codecs/basic/cd_udp.cc +++ b/src/codecs/basic/cd_udp.cc @@@ -1,5 -1,5 +1,3 @@@ --/* $Id: decode.c,v 1.285 2013-06-29 03:03:00 rcombs Exp $ */ -- /* ** Copyright (C) 2002-2013 Sourcefire, Inc. ** Copyright (C) 1998-2002 Martin Roesch diff --cc src/managers/packet_manager.cc index 8b3bd9dc6,03a4d2bb6..a00c19adc --- a/src/managers/packet_manager.cc +++ b/src/managers/packet_manager.cc @@@ -16,15 -16,14 +16,13 @@@ ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - // packet_manager.cc author Josh Rosenbaum --#include "packet_manager.h" - #include -using namespace std; - +#include +#include - #include "framework/codec.h" +#include "packet_manager.h" + #include "framework/codec.h" #include "snort.h" #include "thread.h" #include "log/messages.h" @@@ -32,26 -31,13 +30,26 @@@ #include "protocols/packet.h" #include "protocols/undefined_protocols.h" +#include "time/profiler.h" -#include "time/profiler.h" +namespace +{ +struct CdGenPegs{ + PegCount total_processed = 0; + PegCount other_codecs = 0; + PegCount discards = 0; +}; +std::vector CdGenPegNames = +{ + "total", + "other", + "discards" +}; + - } // anonymous namespace ++} // anonymous -//static list s_codecs; -//static THREAD_LOCAL decode_f grinder; #ifdef PERF_PROFILING THREAD_LOCAL PreprocStats decodePerfStats; @@@ -130,27 -105,21 +126,27 @@@ void PacketManager::decode p->pkt = pkt; len = pkthdr->caplen; curr_prot_id = GRINDER_ID; + pkt_cnt.total_processed++; - // The boolean check in this order so - while(curr_prot_id >= 0 && - curr_prot_id < max_protocol_id && - s_protocols[curr_prot_id] != 0 && - s_protocols[curr_prot_id]->decode(pkt, len, p, lyr_len, next_prot_id)) + // loop until the protocol id is no longer valid + while(curr_prot_id >= 0 && curr_prot_id < max_protocol_id) { + 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; + } - - // if we have succesfully decoded this layer, push the layer PacketClass::PushLayer(p, s_protocols[curr_prot_id], pkt, lyr_len); curr_prot_id = next_prot_id; + next_prot_id = -1; len -= lyr_len; pkt += lyr_len; - next_prot_id = -1; lyr_len = 0; } @@@ -218,56 -231,19 +214,55 @@@ void PacketManager::set_grinder(void if (!codec_registered) WarningMessage("The Codec %s is never used\n", cd->get_name()); - // ERRRO: If multiple correct grinders found. } +} - +void PacketManager::dump_stats() +{ + sum_stats((PegCount*)&gpkt_cnt, (PegCount*)&pkt_cnt, array_size(CdGenPegNames)); + for ( auto* cd : s_codecs ) + if (cd->sum != nullptr) + cd->sum(); -// FatalError("Codec installation checking!!"); -} + std::vector pegNames(CdGenPegNames); + std::vector pegs; + std::memcpy(&pegs[0], &gpkt_cnt, sizeof(gpkt_cnt)); -void PacketManager::dump_stats() -{ -// for ( auto* cd : s_codecs ) -// cd->sum(); +// pegs.push_back(gpkt_cnt.total_processed); +// pegs.push_back(gpkt_cnt.other_codecs); +// pegs.push_back(gpkt_cnt.discards); + + // using two temporary vectors to ensure codecs cannot + // see any other codecs statistics + std::vector tmpNames; + std::vector tmpPegs; + + for ( auto* cd : s_codecs ) + { + if (cd->stats != nullptr) + { + tmpPegs.clear(); + tmpNames.clear(); + if(cd->stats) + cd->stats(tmpPegs, tmpNames); + if (tmpNames.size() == tmpPegs.size()) + { + pegs.insert(pegs.end(), tmpPegs.begin(), tmpPegs.end()); + pegNames.insert(pegNames.end(), tmpNames.begin(), tmpNames.end()); + } + else + { + WarningMessage("The %s Codecs stats function returned a " + "different %d PegCounts and %d PegNames. the two " + "values must be equal\n", + cd->base.name, pegs.size(), pegNames.size()); + } + } + } + show_percent_stats(&pegs[0], &pegNames[0], pegNames.size(), + "codecs"); } bool PacketManager::has_codec(uint16_t cd_id)