// in binder, but it *does* need to occur before the binding lookup (for service information)
HostAttriInfo host;
HostAttriInfo* p_host = nullptr;
- if ( HostAttributesManager::get_host_attributes(flow.server_ip, flow.server_port, &host) )
+
+ if ( HostAttributesManager::get_host_attributes(flow.server_ip, flow.pkt_type, flow.server_port, &host) )
p_host = &host;
if (p_host)
set_ip_protocol(flow);
HostAttriInfo host;
- if (HostAttributesManager::get_host_attributes(flow->server_ip, flow->server_port, &host))
+ if (HostAttributesManager::get_host_attributes(flow->server_ip, flow->ssn_state.ipprotocol, flow->server_port, &host))
{
set_snort_protocol_id_from_ha(flow, host.snort_protocol_id);
return flow->ssn_state.snort_protocol_id;
}
- if (HostAttributesManager::get_host_attributes(flow->client_ip, flow->client_port, &host))
+ if (HostAttributesManager::get_host_attributes(flow->client_ip, flow->ssn_state.ipprotocol, flow->client_port, &host))
{
set_snort_protocol_id_from_ha(flow, host.snort_protocol_id);
}
}
-void HostAttributesDescriptor::get_host_attributes(uint16_t port,HostAttriInfo* host_info) const
+void HostAttributesDescriptor::get_host_attributes(uint16_t protocol, uint16_t port, HostAttriInfo* host_info) const
{
std::lock_guard<std::mutex> slk(host_attributes_lock);
host_info->frag_policy = policies.fragPolicy;
host_info->stream_policy = policies.streamPolicy;
host_info->snort_protocol_id = UNKNOWN_PROTOCOL_ID;
auto it = std::find_if(services.cbegin(), services.cend(),
- [port](const HostServiceDescriptor &s){ return s.port == port; });
+ [protocol,port](const HostServiceDescriptor &s){ return protocol == s.ipproto and s.port == port; });
if (it != services.cend())
host_info->snort_protocol_id = (*it).snort_protocol_id;
}
void HostAttributesManager::term()
{ delete active_cache; }
-bool HostAttributesManager::get_host_attributes(const snort::SfIp& host_ip, uint16_t port, HostAttriInfo* host_info)
+bool HostAttributesManager::get_host_attributes(const snort::SfIp& host_ip, uint16_t protocol, uint16_t port, HostAttriInfo* host_info)
{
if ( !active_cache )
return false;
HostAttributesEntry h = active_cache->find(host_ip);
if (h)
{
- h->get_host_attributes(port, host_info);
+ h->get_host_attributes(protocol, port, host_info);
return true;
}
return false;
}
+bool HostAttributesManager::get_host_attributes(const snort::SfIp& host_ip, PktType pkt_type, uint16_t port, HostAttriInfo* host_info)
+{
+ if ( !active_cache )
+ return false;
+
+ uint16_t ipproto = 0;
+
+ switch (pkt_type)
+ {
+ case PktType::TCP:
+ ipproto = SNORT_PROTO_TCP;
+ break;
+
+ case PktType::UDP:
+ ipproto = SNORT_PROTO_UDP;
+ break;
+
+ case PktType::ICMP:
+ ipproto = SNORT_PROTO_ICMP;
+ break;
+
+ default:
+ break;
+ }
+
+ return get_host_attributes(host_ip, ipproto, port, host_info);
+}
+
void HostAttributesManager::update_service(const snort::SfIp& host_ip, uint16_t port,
uint16_t protocol, SnortProtocolId snort_protocol_id, bool is_appid_service)
{
#include <vector>
#include "framework/counts.h"
+#include "framework/decode_data.h"
#include "sfip/sf_ip.h"
#include "target_based/snort_protocols.h"
bool update_service(uint16_t port, uint16_t protocol, SnortProtocolId, bool& updated,
bool is_appid_service = false);
void clear_appid_services();
- void get_host_attributes(uint16_t, HostAttriInfo*) const;
+ void get_host_attributes(uint16_t protocol, uint16_t port, HostAttriInfo*) const;
// Note: the following get/set are only called from main thread on a temp LRU table
const snort::SfIp& get_ip_addr() const
static void term();
static bool add_host(HostAttributesEntry, snort::SnortConfig*);
- static bool get_host_attributes(const snort::SfIp&, uint16_t, HostAttriInfo*);
+ static bool get_host_attributes(const snort::SfIp&, uint16_t protocol, uint16_t port, HostAttriInfo*);
+ static bool get_host_attributes(const snort::SfIp&, PktType pkt_type, uint16_t port, HostAttriInfo*);
static void update_service(const snort::SfIp&, uint16_t port, uint16_t protocol,
SnortProtocolId, bool is_appid_service = false);
static void clear_appid_services();