static const Parameter s_capture[] =
{
- { "filter", Parameter::PT_STRING, nullptr, nullptr,
+ { "enable", Parameter::PT_BOOL, nullptr, "false",
+ "initially enable packet dumping" },
+
+ { "filter", Parameter::PT_STRING, nullptr, "",
"bpf filter to use for packet dump" },
{ nullptr, Parameter::PT_MAX, nullptr, nullptr, nullptr }
static const Command cap_cmds[] =
{
- { "enable", enable, s_capture, "dump raw packets"},
+ { "enable", enable, &s_capture[1], "dump raw packets"},
{ "disable", disable, nullptr, "stop packet dump"},
{ nullptr, nullptr, nullptr, nullptr }
};
return 0;
}
-CaptureModule::CaptureModule() : Module(CAPTURE_NAME, CAPTURE_HELP){ }
+CaptureModule::CaptureModule() :
+ Module(CAPTURE_NAME, CAPTURE_HELP, s_capture)
+{ memset(&config, 0, sizeof(config)); }
+
+bool CaptureModule::set(const char*, Value& v, SnortConfig*)
+{
+ if ( v.is("enable") )
+ config.enabled = v.get_bool();
+
+ else if ( v.is("filter") )
+ config.filter = v.get_string();
+
+ else
+ return false;
+
+ return true;
+}
const Command* CaptureModule::get_commands() const
{ return cap_cmds; }
#define CAPTURE_NAME "packet_capture"
#define CAPTURE_HELP "raw packet dumping facility"
-struct CaptureConfig{};
+struct CaptureConfig
+{
+ bool enabled;
+ std::string filter;
+};
+
+struct CaptureStats
+{
+ PegCount checked;
+ PegCount matched;
+};
class CaptureModule : public Module
{
PegCount* get_counts() const override;
ProfileStats* get_profile() const override;
const Command* get_commands() const override;
+ bool set(const char*, Value&, SnortConfig*) override;
void get_config(CaptureConfig&);
CaptureConfig config;
};
-struct CaptureStats
-{
- PegCount checked;
- PegCount matched;
-};
-
extern THREAD_LOCAL CaptureStats cap_count_stats;
extern THREAD_LOCAL ProfileStats cap_prof_stats;
using namespace std;
-static bool enabled = false;
-static string filter = "";
+static CaptureConfig config;
static THREAD_LOCAL pcap_t* pcap = nullptr;
static THREAD_LOCAL pcap_dumper_t* dumper = nullptr;
void packet_capture_enable(string f)
{
- if ( !enabled )
+ if ( !config.enabled )
{
- filter = f;
- enabled = true;
+ config.filter = f;
+ config.enabled = true;
}
else
WarningMessage("Conflicting packet capture already in progress.\n");
void packet_capture_disable()
{
- enabled = false;
+ config.enabled = false;
LogMessage("Packet capture disabled\n");
}
class PacketCapture : public Inspector
{
public:
- PacketCapture(CaptureModule*) {};
+ PacketCapture(CaptureModule*);
void eval(Packet*) override;
void tterm() override { capture_term(); };
virtual void write_packet(Packet* p);
};
+PacketCapture::PacketCapture(CaptureModule* m)
+{ m->get_config(config); }
+
void PacketCapture::eval(Packet* p)
{
- if ( enabled )
+ if ( config.enabled )
{
if ( !capture_initialized() )
if ( !capture_init() )
bool PacketCapture::capture_init()
{
- if ( sfbpf_compile(SNAP_LEN, DLT_EN10MB, &bpf, filter.c_str(), 1, 0) >= 0 )
+ if ( sfbpf_compile(SNAP_LEN, DLT_EN10MB, &bpf,
+ config.filter.c_str(), 1, 0) >= 0 )
{
if ( sfbpf_validate(bpf.bf_insns, bpf.bf_len) )
{