diff --git a/testing/btest/Baseline/plugins.pktsrc/conn.log b/testing/btest/Baseline/plugins.pktsrc/conn.log new file mode 100644 index 0000000000..550f520352 --- /dev/null +++ b/testing/btest/Baseline/plugins.pktsrc/conn.log @@ -0,0 +1,10 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path conn +#open 2014-08-28-04-53-05 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents +#types time string addr port addr port enum string interval count count string bool count string count count count count set[string] +1409193037.000000 CXWv6p3arKYeMETxOg 1.2.0.2 2527 1.2.0.3 6649 tcp - - - - S0 - 0 S 1 64 0 0 (empty) +#close 2014-08-28-04-53-05 diff --git a/testing/btest/plugins/pktsrc-plugin/.btest-ignore b/testing/btest/plugins/pktsrc-plugin/.btest-ignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testing/btest/plugins/pktsrc-plugin/CMakeLists.txt b/testing/btest/plugins/pktsrc-plugin/CMakeLists.txt new file mode 100644 index 0000000000..2234907ad2 --- /dev/null +++ b/testing/btest/plugins/pktsrc-plugin/CMakeLists.txt @@ -0,0 +1,17 @@ + +project(Bro-Plugin-Demo-Foo) + +cmake_minimum_required(VERSION 2.6.3) + +if ( NOT BRO_DIST ) + message(FATAL_ERROR "BRO_DIST not set") +endif () + +set(CMAKE_MODULE_PATH ${BRO_DIST}/cmake) + +include(BroPlugin) + +bro_plugin_begin(Demo Foo) +bro_plugin_cc(src/Plugin.cc) +bro_plugin_cc(src/Foo.cc) +bro_plugin_end() diff --git a/testing/btest/plugins/pktsrc-plugin/src/Foo.cc b/testing/btest/plugins/pktsrc-plugin/src/Foo.cc new file mode 100644 index 0000000000..b08bc51d72 --- /dev/null +++ b/testing/btest/plugins/pktsrc-plugin/src/Foo.cc @@ -0,0 +1,77 @@ + +#include +#include + +#include "Foo.h" + +using namespace plugin::Demo_Foo; + +Foo::Foo(const std::string& path, bool is_live) + { + packet = + string("\x45\x00\x00\x40\x15\x55\x40\x00\x3e\x06\x25\x5b\x01\x02\x00\x02" + "\x01\x02\x00\x03\x09\xdf\x19\xf9\x5d\x8a\x36\x7c\x00\x00\x00\x00" + "\xb0\x02\x40\x00\x3c\x72\x00\x00\x02\x04\x05\x5c\x01\x03\x03\x00" + "\x01\x01\x08\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x04\x02", 64); + + props.path = path; + props.selectable_fd = open("/bin/sh", O_RDONLY); // any fd is fine. + props.link_type = DLT_RAW; + props.hdr_size = 0; + props.netmask = 0; + props.is_live = 0; + } + +iosource::PktSrc* Foo::Instantiate(const std::string& path, bool is_live) + { + return new Foo(path, is_live); + } + +void Foo::Open() + { + Opened(props); + } + +void Foo::Close() + { + Closed(); + } + +bool Foo::ExtractNextPacket(Packet* pkt) + { + if ( packet.empty() ) + { + Close(); + return false; + } + + hdr.ts.tv_sec = 1409193037; + hdr.ts.tv_usec = 0; + hdr.caplen = hdr.len = packet.size(); + pkt->ts = hdr.ts.tv_sec; + pkt->hdr = &hdr; + pkt->data = (const u_char *)packet.c_str(); + return true; + } + +void Foo::DoneWithPacket() + { + packet.clear(); + } + +bool Foo::PrecompileFilter(int index, const std::string& filter) + { + // skip for the testing. + return true; + } + +bool Foo::SetFilter(int index) + { + // skip for the testing. + return true; + } + +void Foo::Statistics(Stats* stats) + { + // skip for the testing. + } diff --git a/testing/btest/plugins/pktsrc-plugin/src/Foo.h b/testing/btest/plugins/pktsrc-plugin/src/Foo.h new file mode 100644 index 0000000000..902ac0e37a --- /dev/null +++ b/testing/btest/plugins/pktsrc-plugin/src/Foo.h @@ -0,0 +1,35 @@ + +#ifndef BRO_PLUGIN_DEMO_FOO_H +#define BRO_PLUGIN_DEMO_FOO_H + +#include +#include + +namespace plugin { +namespace Demo_Foo { + +class Foo : public iosource::PktSrc { +public: + Foo(const std::string& path, bool is_live); + + static PktSrc* Instantiate(const std::string& path, bool is_live); + +protected: + virtual void Open(); + virtual void Close(); + virtual bool ExtractNextPacket(Packet* pkt); + virtual void DoneWithPacket(); + virtual bool PrecompileFilter(int index, const std::string& filter); + virtual bool SetFilter(int index); + virtual void Statistics(Stats* stats); + +private: + Properties props; + string packet; + struct pcap_pkthdr hdr; +}; + +} +} + +#endif diff --git a/testing/btest/plugins/pktsrc-plugin/src/Plugin.cc b/testing/btest/plugins/pktsrc-plugin/src/Plugin.cc new file mode 100644 index 0000000000..ecc94866a6 --- /dev/null +++ b/testing/btest/plugins/pktsrc-plugin/src/Plugin.cc @@ -0,0 +1,20 @@ + +#include "Plugin.h" + +#include "Foo.h" + +namespace plugin { namespace Demo_Foo { Plugin plugin; } } + +using namespace plugin::Demo_Foo; + +plugin::Configuration Plugin::Configure() + { + AddComponent(new ::iosource::PktSrcComponent("FooPktSrc", "foo", ::iosource::PktSrcComponent::BOTH, ::plugin::Demo_Foo::Foo::Instantiate)); + + plugin::Configuration config; + config.name = "Demo::Foo"; + config.description = "A Foo packet source"; + config.version.major = 1; + config.version.minor = 0; + return config; + } diff --git a/testing/btest/plugins/pktsrc.bro b/testing/btest/plugins/pktsrc.bro new file mode 100644 index 0000000000..2bd9be7bb7 --- /dev/null +++ b/testing/btest/plugins/pktsrc.bro @@ -0,0 +1,8 @@ +# @TEST-EXEC: ${DIST}/aux/bro-aux/plugin-support/init-plugin Demo Foo +# @TEST-EXEC: cp -r %DIR/pktsrc-plugin/* . +# @TEST-EXEC: ./configure --bro-dist=${DIST} && make +# @TEST-EXEC: BRO_PLUGIN_PATH=`pwd` bro -NN Demo::Foo >>output +# @TEST-EXEC: echo === >>output +# @TEST-EXEC: BRO_PLUGIN_PATH=`pwd` bro -r foo:XXX %INPUT FilteredTraceDetection::enable=F >>output +# @TEST-EXEC: TEST_DIFF_CANONIFIER= btest-diff conn.log +