const auto& src_ip = nfe->get_record()->initiator_ip;
const auto& mac_addr = layer::get_eth_layer(p)->ether_src;
uint32_t service = nfe->get_service_id();
- uint16_t port = nfe->get_record()->responder_port;
+ uint16_t port = 0;
IpProtocol proto = (IpProtocol) nfe->get_record()->proto;
+ if (nfe->is_initiator_swapped())
+ port = nfe->get_record()->initiator_port;
+ else
+ port = nfe->get_record()->responder_port;
+
auto ht = find_or_create_host_tracker(src_ip, new_host);
ht->update_last_seen();
bool is_new = false;
auto ha = ht->add_service(port, proto, (uint32_t) packet_time(), is_new, service);
+
+ ht->update_service_info(ha, nullptr, nullptr, conf->max_host_service_info);
+
if ( is_new )
{
if ( proto == IpProtocol::TCP )
{
public:
NetFlowEvent(const snort::Packet* p, const NetFlowSessionRecord* rec,
- bool cre_host, bool cre_serv, uint32_t s_id)
+ bool cre_host, bool cre_serv, bool swp_initiator, uint32_t s_id)
: pkt(p), record(rec), create_host(cre_host),
- create_service(cre_serv), serviceID(s_id) { }
+ create_service(cre_serv), swapped(swp_initiator), serviceID(s_id) { }
const Packet* get_packet() override
{ return pkt; }
bool get_create_service()
{ return create_service; }
+ bool is_initiator_swapped()
+ { return swapped; }
+
uint32_t get_service_id()
{ return serviceID; }
const NetFlowSessionRecord* record;
bool create_host;
bool create_service;
+ bool swapped;
uint32_t serviceID = 0;
};
static void publish_netflow_event(const Packet* p, const NetFlowRule* match, NetFlowSessionRecord& record)
{
uint32_t serviceID = 0;
+ bool swapped = false;
std::unordered_map<int, int>* service_mappings = nullptr;
// Use only the known port. If both are known, take the lower numbered port.
if (sid_responder && !sid_initiator)
+ {
serviceID = sid_responder;
+ }
else if (sid_initiator && !sid_responder)
+ {
serviceID = sid_initiator;
+ swapped = true;
+ }
else
+ {
serviceID = (record.initiator_port > record.responder_port) ? sid_responder : sid_initiator;
+ }
}
- NetFlowEvent event(p, &record, match->create_host, match->create_service, serviceID);
+ NetFlowEvent event(p, &record, match->create_host, match->create_service, swapped, serviceID);
DataBus::publish(NETFLOW_EVENT, event);
}