mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
Add IP-specific ConnKey implementation.
The InitTuple() implementation here is a placeholder for a fuller one following later, when we do away with the need for ConnTuple.
This commit is contained in:
parent
0c64f6a7b9
commit
5af8fc242a
4 changed files with 129 additions and 0 deletions
|
@ -1,3 +1,5 @@
|
||||||
zeek_add_plugin(
|
zeek_add_plugin(
|
||||||
PacketAnalyzer IP
|
PacketAnalyzer IP
|
||||||
SOURCES IP.cc IPBasedAnalyzer.cc SessionAdapter.cc Plugin.cc)
|
SOURCES IP.cc IPBasedAnalyzer.cc SessionAdapter.cc Plugin.cc)
|
||||||
|
|
||||||
|
add_subdirectory(conn_key)
|
||||||
|
|
1
src/packet_analysis/protocol/ip/conn_key/CMakeLists.txt
Normal file
1
src/packet_analysis/protocol/ip/conn_key/CMakeLists.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
zeek_add_subdir_library(connkey-ip SOURCES IPBasedConnKey.cc)
|
|
@ -0,0 +1,3 @@
|
||||||
|
// See the file "COPYING" in the main distribution directory for copyright.
|
||||||
|
|
||||||
|
#include "zeek/packet_analysis/protocol/ip/conn_key/IPBasedConnKey.h"
|
123
src/packet_analysis/protocol/ip/conn_key/IPBasedConnKey.h
Normal file
123
src/packet_analysis/protocol/ip/conn_key/IPBasedConnKey.h
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
// See the file "COPYING" in the main distribution directory for copyright.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#include "zeek/Conn.h"
|
||||||
|
#include "zeek/ConnKey.h"
|
||||||
|
#include "zeek/IPAddr.h"
|
||||||
|
|
||||||
|
namespace zeek {
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct for embedding into an IPBasedConnKey.
|
||||||
|
*/
|
||||||
|
struct PackedConnTuple {
|
||||||
|
in6_addr ip1;
|
||||||
|
in6_addr ip2;
|
||||||
|
uint16_t port1 = 0;
|
||||||
|
uint16_t port2 = 0;
|
||||||
|
uint16_t proto = 0;
|
||||||
|
} __attribute__((packed, aligned));
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract key class for IP-based connections.
|
||||||
|
*
|
||||||
|
* ConnKey instances for IP always hold a ConnTuple instance which is provided
|
||||||
|
* by the IPBasedAnalyzer. The InitConnTuple() method stores a normalized version
|
||||||
|
* in the tuple, losing the information about orig and responder.
|
||||||
|
*/
|
||||||
|
class IPBasedConnKey : public zeek::ConnKey {
|
||||||
|
public:
|
||||||
|
void InitTuple(const ConnTuple& ct) { InitPackedTuple(ct); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a modifiable reference to the embedded PackedConnTuple.
|
||||||
|
*
|
||||||
|
* This is virtual to give subclasses control over where
|
||||||
|
* to place the tuple within the key.
|
||||||
|
*
|
||||||
|
* @return A modifiable reference to the embedded PackedConnTuple.
|
||||||
|
*/
|
||||||
|
virtual detail::PackedConnTuple& PackedTuple() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a non-modifiable reference to the embedded PackedConnTuple.
|
||||||
|
*
|
||||||
|
* This is virtual to give subclasses control over where
|
||||||
|
* to place the tuple within the key.
|
||||||
|
*
|
||||||
|
* @return A non-modifiable reference to the embedded PackedConnTuple.
|
||||||
|
*/
|
||||||
|
virtual const detail::PackedConnTuple& PackedTuple() const = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Initialize a packed tuple from a ConnTuple instance.
|
||||||
|
*/
|
||||||
|
void InitPackedTuple(const ConnTuple& ct) {
|
||||||
|
auto& tuple = PackedTuple();
|
||||||
|
|
||||||
|
if ( ct.is_one_way || addr_port_canon_lt(ct.src_addr, ct.src_port, ct.dst_addr, ct.dst_port) ) {
|
||||||
|
ct.src_addr.CopyIPv6(&tuple.ip1);
|
||||||
|
ct.dst_addr.CopyIPv6(&tuple.ip2);
|
||||||
|
tuple.port1 = ct.src_port;
|
||||||
|
tuple.port2 = ct.dst_port;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ct.dst_addr.CopyIPv6(&tuple.ip1);
|
||||||
|
ct.src_addr.CopyIPv6(&tuple.ip2);
|
||||||
|
tuple.port1 = ct.dst_port;
|
||||||
|
tuple.port2 = ct.src_port;
|
||||||
|
}
|
||||||
|
|
||||||
|
tuple.proto = ct.proto;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
using IPBasedConnKeyPtr = std::unique_ptr<IPBasedConnKey>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The usual 5-tuple ConnKey, fully instantiable.
|
||||||
|
*/
|
||||||
|
class IPConnKey : public IPBasedConnKey {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* Fill any holes in the key struct as we use the full tuple as a key.
|
||||||
|
*/
|
||||||
|
IPConnKey() { memset(static_cast<void*>(&key), 0, sizeof(key)); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copydoc
|
||||||
|
*/
|
||||||
|
detail::PackedConnTuple& PackedTuple() override { return key.tuple; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copydoc
|
||||||
|
*/
|
||||||
|
const detail::PackedConnTuple& PackedTuple() const override { return key.tuple; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* @copydoc
|
||||||
|
*/
|
||||||
|
zeek::session::detail::Key DoSessionKey() const override {
|
||||||
|
return {reinterpret_cast<const void*>(&key), sizeof(key),
|
||||||
|
// XXX: Not sure we need CONNECTION_KEY_TYPE?
|
||||||
|
session::detail::Key::CONNECTION_KEY_TYPE};
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct {
|
||||||
|
struct detail::PackedConnTuple tuple;
|
||||||
|
} key;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace zeek
|
Loading…
Add table
Add a link
Reference in a new issue