diff --git a/httpdocs/js/pages/snmpdevices_stats/overview.js b/httpdocs/js/pages/snmpdevices_stats/overview.js index 5fcd1cf5a4..2da0ed58ba 100644 --- a/httpdocs/js/pages/snmpdevices_stats/overview.js +++ b/httpdocs/js/pages/snmpdevices_stats/overview.js @@ -31,11 +31,10 @@ $(document).ready(function () { if (type == "display" && row.column_device_status == "unreachable") { return (` - ${data} - + ${data} `); } @@ -56,7 +55,7 @@ $(document).ready(function () { }, { data: "column_last_update", className: "text-center" }, { data: "column_last_poll_duration", className: "text-center" }, - { data: "column_delta_errors", className: "text-center" }, + /* { data: "column_delta_errors", className: "text-center" }, */ { targets: -1, visible: isAdministrator, @@ -89,4 +88,4 @@ $(document).ready(function () { delete_device_id = rowData.column_key; }); -}); \ No newline at end of file +}); diff --git a/include/Cardinality.h b/include/Cardinality.h index 6b74153391..69eb78a9f1 100644 --- a/include/Cardinality.h +++ b/include/Cardinality.h @@ -51,6 +51,10 @@ public: u_int32_t getEstimate() { return((u_int32_t)ndpi_hll_count(&hll)); } + + void reset() { + memset(hll.registers, 0, hll.size); /* A lock might help here... */ + } }; #endif /* _CARDINALITY_H_ */ diff --git a/include/Host.h b/include/Host.h index 522fd9fda8..07aef62cf1 100644 --- a/include/Host.h +++ b/include/Host.h @@ -384,7 +384,7 @@ class Host : public GenericHashEntry, public AlertableEntity { void incCliContactedPorts(u_int16_t port) { stats->incCliContactedPorts(port); } void incSrvHostContacts(IpAddress *peer) { stats->incSrvHostContacts(peer); } void incSrvPortsContacts(u_int16_t port) { stats->incSrvPortsContacts(port); } - void incServicesContacted(char *name) { stats->incServicesContacted(name); } + void incContactedService(char *name) { stats->incContactedService(name); } }; #endif /* _HOST_H_ */ diff --git a/include/HostStats.h b/include/HostStats.h index e82baed3c5..18c7b5efc3 100644 --- a/include/HostStats.h +++ b/include/HostStats.h @@ -139,7 +139,7 @@ class HostStats: public GenericTrafficElement { virtual void incCliContactedPorts(u_int16_t port) { ; } virtual void incSrvPortsContacts(u_int16_t port) { ; } - virtual void incServicesContacted(char *name) { ; } + virtual void incContactedService(char *name) { ; } virtual void incCliContactedHosts(IpAddress *peer) { ; } virtual void incSrvHostContacts(IpAddress *peer) { ; } }; diff --git a/include/LocalHostStats.h b/include/LocalHostStats.h index e0375c306b..f52d9a2775 100644 --- a/include/LocalHostStats.h +++ b/include/LocalHostStats.h @@ -29,9 +29,9 @@ class LocalHostStats: public HostStats { HTTPstats *http; ICMPstats *icmp; FrequentStringItems *top_sites; - time_t nextSitesUpdate; - std::map contacts_as_cli, contacts_as_srv; - + time_t nextSitesUpdate, nextContactsUpdate; + u_int32_t num_contacts_as_cli, num_contacts_as_srv; + /* Written by NetworkInterface::periodicStatsUpdate thread */ char *old_sites; @@ -40,7 +40,10 @@ class LocalHostStats: public HostStats { *num_contacted_services_as_client, /* DNS, TLS, HTTP.... */ *num_contacted_ports_as_client, /* # of different ports this host has contacted */ *num_host_contacted_ports_as_server; /* # of different server ports contacted by remote peers */ + Cardinality *contacts_as_cli, *contacts_as_srv; /* Minute reset host contacts */ + void updateHostContacts(); + public: LocalHostStats(Host *_host); LocalHostStats(LocalHostStats &s); @@ -71,14 +74,25 @@ class LocalHostStats: public HostStats { virtual HTTPstats* getHTTPstats() const { return(http); }; virtual DnsStats* getDNSstats() const { return(dns); }; virtual ICMPstats* getICMPstats() const { return(icmp); }; - virtual u_int16_t getNumActiveContactsAsClient() { return contacts_as_cli.size(); } - virtual u_int16_t getNumActiveContactsAsServer() { return contacts_as_srv.size(); } + virtual u_int16_t getNumActiveContactsAsClient() { return(num_contacts_as_cli); } + virtual u_int16_t getNumActiveContactsAsServer() { return(num_contacts_as_srv); } - virtual void incCliContactedPorts(u_int16_t port) { if(num_contacted_ports_as_client) num_contacted_ports_as_client->addElement(port); } - virtual void incSrvPortsContacts(u_int16_t port) { if(num_host_contacted_ports_as_server) num_host_contacted_ports_as_server->addElement(port); } - virtual void incServicesContacted(char *name) { if(num_contacted_services_as_client) num_contacted_services_as_client->addElement(name, strlen(name)); } - virtual void incCliContactedHosts(IpAddress *peer) { if(num_contacted_hosts_as_client) peer->incCardinality(num_contacted_hosts_as_client); } - virtual void incSrvHostContacts(IpAddress *peer) { if(num_host_contacts_as_server) peer->incCardinality(num_host_contacts_as_server); } + virtual void incCliContactedPorts(u_int16_t port) { if(num_contacted_ports_as_client) num_contacted_ports_as_client->addElement(port); } + virtual void incSrvPortsContacts(u_int16_t port) { if(num_host_contacted_ports_as_server) num_host_contacted_ports_as_server->addElement(port); } + + virtual void incCliContactedHosts(IpAddress *peer) { + if(num_contacted_hosts_as_client) peer->incCardinality(num_contacted_hosts_as_client); + if(contacts_as_cli) peer->incCardinality(contacts_as_cli); + } + virtual void incSrvHostContacts(IpAddress *peer) { + if(num_host_contacts_as_server) peer->incCardinality(num_host_contacts_as_server); + if(contacts_as_srv) peer->incCardinality(contacts_as_srv); + } + + virtual void incContactedService(char *name) { + if(num_contacted_services_as_client && name && (name[0] != '\0')) + num_contacted_services_as_client->addElement(name, strlen(name)); + } }; #endif diff --git a/include/ntop_defines.h b/include/ntop_defines.h index 8ec65b6079..6ffa4469f7 100644 --- a/include/ntop_defines.h +++ b/include/ntop_defines.h @@ -294,6 +294,7 @@ #define CONST_EST_MAX_HOSTS 200000 #define MIN_HOST_RESOLUTION_FREQUENCY 60 /* 1 min */ #define HOST_SITES_REFRESH 300 /* 5 min */ +#define HOST_CONTACTS_REFRESH 60 /* 1 min */ #define HOST_SITES_TOP_NUMBER 10 #define HOST_MAX_SERIALIZED_LEN 1048576 /* 1MB, use only when allocating memory in the heap */ #define POOL_MAX_SERIALIZED_LEN 32768 /* bytes */ diff --git a/scripts/locales/en.lua b/scripts/locales/en.lua index 58adfcb0df..b974d959be 100644 --- a/scripts/locales/en.lua +++ b/scripts/locales/en.lua @@ -2656,6 +2656,8 @@ local lang = { ["note_live_flows_chart"] = "This chart depicts only TCP connections.", ["note_possible_probing_alert"] = "An icon like %{icon} indicates a possible probing (or application server down) alert as the host has received traffic for a specific application without sending back any data. You can use historical reports to drill-down this issue.", ["note_protocol_usage_time"] = "Application usage time is computed on discrete slot intervals.", + ["num_contacted_services_as_client"] = "Client Contacted Services", + ["num_contacted_services_as_client_descr"] = "(TLS, HTTP and DNS names)", ["overview"] = "%{what} Overview", ["rcvd"] = "Rcvd", ["received_only"] = "Received only", @@ -3055,7 +3057,7 @@ local lang = { }, ["ports_page"] = { ["client_ports"] = "Client Ports", - ["num_contacted_ports"] = "Ports Cardinality Contacts", + ["num_contacted_ports"] = "Total Unique Port Contacts", ["num_contacted_ports_as_client"] = "Remote Contacted Ports (as Client)", ["num_host_contacted_ports_as_server"] = "Local Contacted Ports (as Server)", ["server_ports"] = "Server Ports", @@ -3822,7 +3824,7 @@ local lang = { ["snmp_all_interfaces"] = "All Interfaces", ["snmp_also_seen_on"] = "Also seen on", ["snmp_and_n_more_interfaces"] = "and %{count} more interfaces", - ["snmp_community"] = "SNMP Community", + ["snmp_community"] = "Community", ["snmp_device"] = "SNMP Device", ["snmp_device_does_not_respond"] = "The SNMP device does not respond.", ["snmp_device_last_poll"] = "Time Since Last Poll", @@ -4000,8 +4002,11 @@ local lang = { ["flow_distribution"] = "Flow Distribution", ["flow_duration"] = "Total Flow Duration", ["flow_frequency"] = "New Flow Creation Frequency", + ["hosts_contacts_cardinality"] = "Total Unique Hosts Contacts", ["l4_proto_overview"] = "Protocol Overview", ["no_traffic_observed_message"] = "No traffic has been observed for the specified host", + ["num_contacted_hosts_as_client"] = "Hosts Contacted (as Client)", + ["num_host_contacts_as_server"] = "Hosts Contacts (as Server)", ["rcvd"] = "Rcvd", }, ["traffic_profiles"] = { diff --git a/scripts/lua/host_details.lua b/scripts/lua/host_details.lua index e718d7daf7..382e55957a 100644 --- a/scripts/lua/host_details.lua +++ b/scripts/lua/host_details.lua @@ -213,7 +213,6 @@ if(host == nil) and (not only_historical) then else sendHTTPContentTypeHeader('text/html') - page_utils.set_active_menu_entry(page_utils.menu_entries.hosts, nil, i18n("host", { host = host_info["host"] })) print("\n") @@ -261,6 +260,7 @@ else local url = hostinfo2detailsurl(host, {tskey = _GET["tskey"]}) local has_snmp_location = info["version.enterprise_edition"] and snmp_utils.host_has_snmp_location(host["mac"]) + local has_icmp = ((table.len(host["ICMPv4"]) + table.len(host["ICMPv6"])) ~= 0) page_utils.print_navbar(title, url, { @@ -295,7 +295,7 @@ else label = i18n("peers"), }, { - hidden = have_nedge or only_historical or not host["localhost"] or (not host["ICMPv4"] and not host["ICMPv6"]), + hidden = have_nedge or only_historical or not(has_icmp), active = page == "ICMP", page_name = "ICMP", label = i18n("icmp"), @@ -554,7 +554,7 @@ if((page == "overview") or (page == nil)) then if((host["privatehost"] == false) and (host["is_multicast"] == false) and (host["is_broadcast"] == false)) then print(' ') end - + print("\n") end @@ -949,7 +949,7 @@ print [[/lua/get_arp_data.lua', { ifid: "]] print(ifId.."") print ('", '..hostin print(''..i18n("ports_page.num_contacted_ports")..'') print(''..i18n("ports_page.num_contacted_ports_as_client")..''.. formatValue(host.cardinality.num_contacted_ports_as_client) ..' ') print(''..i18n("ports_page.num_host_contacted_ports_as_server")..''.. formatValue(host.cardinality.num_host_contacted_ports_as_server) ..' ') - print('') + print('') end print(''..i18n("ports_page.client_ports")..'
') print(''..i18n("ports_page.server_ports")..'
') @@ -1105,8 +1105,6 @@ dc.renderAll(); ]] - - else print(" "..i18n("peers_page.no_active_flows_message").."") end @@ -1122,8 +1120,18 @@ end print("
"..i18n("traffic_page.no_traffic_observed_message").."
") else print [[ + ]] -
+ if(host.cardinality) then + print('') + print('') + print('') + print('') + end + + print [[ ]] @@ -1277,6 +1285,13 @@ elseif((page == "ndpi")) then
'..i18n("traffic_page.hosts_contacts_cardinality")..''..i18n("traffic_page.num_contacted_hosts_as_client")..'' + .. formatValue(host.cardinality.num_contacted_hosts_as_client) ..' '..i18n("traffic_page.num_host_contacts_as_server")..''.. + formatValue(host.cardinality.num_host_contacts_as_server) ..'
]] print(i18n("traffic_page.l4_proto_overview")) print[[
]] + if(host.cardinality) then + print('') + print('') + end + + if ntop.isPro() and host["custom_apps"] then print[[ @@ -2323,8 +2338,11 @@ if(not only_historical) and (host ~= nil) then end if(host.cardinality) then - print("var last_num_contacted_ports_as_client = " .. host.cardinality.num_contacted_ports_as_client .. ";\n") - print("var last_num_host_contacted_ports_as_server = " .. host.cardinality.num_host_contacted_ports_as_server .. ";\n") + print("var last_num_contacted_ports_as_client = " .. host.cardinality.num_contacted_ports_as_client .. ";\n") + print("var last_num_host_contacted_ports_as_server = " .. host.cardinality.num_host_contacted_ports_as_server .. ";\n") + print("var last_num_contacted_hosts_as_client = " .. host.cardinality.num_contacted_hosts_as_client .. ";\n") + print("var last_num_host_contacts_as_server = " .. host.cardinality.num_host_contacts_as_server .. ";\n") + print("var last_num_contacted_services_as_client = " .. host.cardinality.num_contacted_services_as_client .. ";\n") end print [[ @@ -2368,6 +2386,17 @@ if(not only_historical) and (host ~= nil) then $('#num_host_contacted_ports_as_server_trend').html(drawTrend(card.num_host_contacted_ports_as_server, last_num_host_contacted_ports_as_server, "")); last_num_contacted_ports_as_client = card.num_contacted_ports_as_client; last_num_host_contacted_ports_as_server = card.num_host_contacted_ports_as_server; + + $('#num_contacted_hosts_as_client').html(formatValue(card.num_contacted_hosts_as_client)); + $('#num_host_contacts_as_server').html(formatValue(card.num_host_contacts_as_server)); + $('#num_contacted_hosts_as_client_trend').html(drawTrend(card.num_contacted_hosts_as_client, last_num_contacted_hosts_as_client, "")); + $('#num_host_contacts_as_server_trend').html(drawTrend(card.num_host_contacts_as_server, last_num_host_contacts_as_server, "")); + last_num_contacted_hosts_as_client = card.num_contacted_hosts_as_client; + last_num_host_contacts_as_server = card.num_host_contacts_as_server; + + $('#num_contacted_services_as_client').html(formatValue(card.num_contacted_services_as_client)); + $('#num_contacted_services_as_client_trend').html(drawTrend(card.num_contacted_services_as_client, last_num_contacted_services_as_client, "")); + last_num_contacted_services_as_client = card.num_contacted_services_as_client; } if(!host["name"]) { diff --git a/src/Flow.cpp b/src/Flow.cpp index 80ccaa9c2a..7522b9b881 100644 --- a/src/Flow.cpp +++ b/src/Flow.cpp @@ -95,7 +95,7 @@ Flow::Flow(NetworkInterface *_iface, if(cli_host) { NetworkStats *network_stats = cli_host->getNetworkStats(cli_host->get_local_network_id()); - + cli_host->incUses(); cli_host->incNumFlows(last_seen, true, srv_host, this); if(network_stats) network_stats->incNumFlows(last_seen, true); @@ -293,24 +293,25 @@ Flow::~Flow() { if(protos.tls.ja3.server_hash) free(protos.tls.ja3.server_hash); if(protos.tls.client_alpn) free(protos.tls.client_alpn); if(protos.tls.client_tls_supported_versions) free(protos.tls.client_tls_supported_versions); - if(protos.tls.issuerDN) free(protos.tls.issuerDN); - if(protos.tls.subjectDN) free(protos.tls.subjectDN); + if(protos.tls.issuerDN) free(protos.tls.issuerDN); + if(protos.tls.subjectDN) free(protos.tls.subjectDN); } - if(bt_hash) free(bt_hash); + if(bt_hash) + free(bt_hash); if(status_infos) { for(int i=0; iisLocalHost()) cli_host->incrVisitedWebSite(protos.tls.client_requested_server_name); + + cli_host->incContactedService(protos.tls.client_requested_server_name); break; case NDPI_PROTOCOL_HTTP: case NDPI_PROTOCOL_HTTP_PROXY: - if(ndpiFlow->http.url) { if(protos.http.last_url) free(protos.http.last_url); protos.http.last_url = strdup(ndpiFlow->http.url); - + if(protos.http.last_method) free(protos.http.last_method); + switch(ndpiFlow->http.method) { case NDPI_HTTP_METHOD_OPTIONS: protos.http.last_method = strdup("OPTIONS"); @@ -439,6 +442,7 @@ void Flow::processDetectedProtocol() { break; } } + if(ndpiFlow->host_server_name[0] != '\0') { char *doublecol, delimiter = ':'; @@ -447,6 +451,8 @@ void Flow::processDetectedProtocol() { doublecol[0] = '\0'; if(cli_host) { + cli_host->incContactedService((char*)ndpiFlow->host_server_name); + if(ndpiFlow->protos.http.detected_os[0] != '\0') cli_host->inlineSetOSDetail((char*)ndpiFlow->protos.http.detected_os); @@ -520,7 +526,7 @@ void Flow::processExtraDissectedInformation() { if((protos.tls.subjectDN == NULL) && (ndpiFlow->protos.stun_ssl.ssl.subjectDN != NULL)) protos.tls.subjectDN= strdup(ndpiFlow->protos.stun_ssl.ssl.subjectDN); - + if((protos.tls.ja3.client_hash == NULL) && (ndpiFlow->protos.stun_ssl.ssl.ja3_client[0] != '\0')) { protos.tls.ja3.client_hash = strdup(ndpiFlow->protos.stun_ssl.ssl.ja3_client); updateCliJA3(); @@ -547,7 +553,7 @@ void Flow::processExtraDissectedInformation() { if(risk != NDPI_NO_RISK) ndpi_flow_risk_bitmap |= risk; } - + break; } } @@ -628,7 +634,7 @@ void Flow::processPacket(const u_char *ip_packet, u_int16_t ip_len, u_int64_t pa /* *************************************** */ -void Flow::setMatchedPacketPayload(u_int8_t *payload, u_int16_t payload_len) { +void Flow::setMatchedPacketPayload(u_int8_t *payload, u_int16_t payload_len) { if((payload_len > 0) && (packet_payload_match.payload_len == 0)) { if((packet_payload_match.payload = (u_int8_t*)malloc(payload_len*sizeof(u_int8_t))) != NULL) { memcpy(packet_payload_match.payload, payload, payload_len); @@ -668,6 +674,8 @@ void Flow::processDNSPacket(const u_char *ip_packet, u_int16_t ip_len, u_int64_t ndpiDetectedProtocol = proto_id; /* Override! */ if(ndpiFlow->host_server_name[0] != '\0') { + cli_host->incContactedService((char*)ndpiFlow->host_server_name); + if(ndpiFlow->protos.dns.is_query) { char *q = strdup((const char*)ndpiFlow->host_server_name); @@ -1922,17 +1930,17 @@ void Flow::lua(lua_State* vm, AddressTree * ptree, has_json_info = true; } else if (get_tlv_info()) { ndpi_deserializer deserializer; - + if (ndpi_init_deserializer(&deserializer, get_tlv_info()) == 0) { ndpi_serializer serializer; - + if (ndpi_init_serializer(&serializer, ndpi_serialization_format_json) >= 0) { char *buffer; u_int32_t buffer_len; - + ndpi_deserialize_clone_all(&deserializer, &serializer); buffer = ndpi_serializer_get_buffer(&serializer, &buffer_len); - + if (buffer) { lua_push_str_table_entry(vm, "moreinfo.json", buffer); has_json_info = true; @@ -1981,10 +1989,10 @@ void Flow::lua(lua_State* vm, AddressTree * ptree, void Flow::lua_get_risk_info(lua_State* vm, bool as_table) { if(ndpi_flow_risk_bitmap != 0) { u_int i; - + if(as_table) lua_newtable(vm); - + for(i = 0; i < NDPI_MAX_RISK; i++) if(hasRisk((ndpi_risk_enum)i)) lua_push_uint64_table_entry(vm, ndpi_risk2str((ndpi_risk_enum)i), i); @@ -2394,11 +2402,11 @@ json_object* Flow::flow2json() { if(cli_ip) { if (cli_ip->isIPv4()) { - json_object_object_add(my_object, + json_object_object_add(my_object, Utils::jsonLabel(IP_PROTOCOL_VERSION, "IP_PROTOCOL_VERSION", jsonbuf, sizeof(jsonbuf)), json_object_new_int(4)); } else if(cli_ip->isIPv6()) { - json_object_object_add(my_object, + json_object_object_add(my_object, Utils::jsonLabel(IP_PROTOCOL_VERSION, "IP_PROTOCOL_VERSION", jsonbuf, sizeof(jsonbuf)), json_object_new_int(6)); } @@ -4078,7 +4086,7 @@ void Flow::fillZmqFlowCategory(const ParsedFlow *zflow, ndpi_protocol *res) cons int rc; ndpi_protocol_match_result tmp; ndpi_protocol_category_t c; - + /* Match for custom protocols (protos.txt) */ if((rc = ndpi_match_string_subprotocol(ndpi_struct, (char*)dst_name, strlen(dst_name), &tmp, 1 /* host match */)) != 0) { if(rc >= NDPI_MAX_SUPPORTED_PROTOCOLS) { diff --git a/src/LocalHostStats.cpp b/src/LocalHostStats.cpp index 7fbb720a34..97c6caec8b 100644 --- a/src/LocalHostStats.cpp +++ b/src/LocalHostStats.cpp @@ -29,13 +29,16 @@ LocalHostStats::LocalHostStats(Host *_host) : HostStats(_host) { dns = new (std::nothrow) DnsStats(); http = new (std::nothrow) HTTPstats(_host); icmp = new (std::nothrow) ICMPstats(); - nextSitesUpdate = 0; - + nextSitesUpdate = 0, nextContactsUpdate = time(NULL)+HOST_CONTACTS_REFRESH; + contacts_as_cli = contacts_as_srv = 0; + num_contacted_hosts_as_client = new Cardinality(14); num_host_contacts_as_server = new Cardinality(14); num_contacted_services_as_client = new Cardinality(14); num_contacted_ports_as_client = new Cardinality(4); - num_host_contacted_ports_as_server = new Cardinality(4); + num_host_contacted_ports_as_server = new Cardinality(4); + contacts_as_cli = new Cardinality(4); + contacts_as_srv = new Cardinality(4); } /* *************************************** */ @@ -46,13 +49,16 @@ LocalHostStats::LocalHostStats(LocalHostStats &s) : HostStats(s) { dns = s.getDNSstats() ? new (std::nothrow) DnsStats(*s.getDNSstats()) : NULL; http = NULL; icmp = NULL; - nextSitesUpdate = 0; - + nextSitesUpdate = 0, nextContactsUpdate = time(NULL)+HOST_CONTACTS_REFRESH; + contacts_as_cli = contacts_as_srv = 0; + num_contacted_hosts_as_client = NULL; num_host_contacts_as_server = NULL; num_contacted_services_as_client = NULL; num_contacted_ports_as_client = NULL; num_host_contacted_ports_as_server = NULL; + contacts_as_cli = NULL; + contacts_as_srv = NULL; } /* *************************************** */ @@ -69,6 +75,8 @@ LocalHostStats::~LocalHostStats() { if(num_contacted_services_as_client) delete num_contacted_services_as_client; if(num_contacted_ports_as_client) delete num_contacted_ports_as_client; if(num_host_contacted_ports_as_server) delete num_host_contacted_ports_as_server; + if(contacts_as_cli) delete contacts_as_cli; + if(contacts_as_srv) delete contacts_as_srv; } /* *************************************** */ @@ -105,6 +113,11 @@ void LocalHostStats::updateStats(struct timeval *tv) { if(icmp) icmp->updateStats(tv); if(http) http->updateStats(tv); + if(tv->tv_sec >= nextContactsUpdate) { + updateHostContacts(); + nextContactsUpdate = tv->tv_sec+HOST_CONTACTS_REFRESH; + } + if(top_sites && ntop->getPrefs()->are_top_talkers_enabled() && (tv->tv_sec >= nextSitesUpdate)) { if(nextSitesUpdate > 0) { if(old_sites) @@ -118,6 +131,13 @@ void LocalHostStats::updateStats(struct timeval *tv) { /* *************************************** */ +void LocalHostStats::updateHostContacts() { + num_contacts_as_cli = contacts_as_cli->getEstimate(), num_contacts_as_srv = contacts_as_srv->getEstimate(); + contacts_as_cli->reset(), contacts_as_srv->reset(); +} + +/* *************************************** */ + void LocalHostStats::getJSONObject(json_object *my_object, DetailsLevel details_level) { HostStats::getJSONObject(my_object, details_level); @@ -223,50 +243,12 @@ void LocalHostStats::deserialize(json_object *o) { void LocalHostStats::incNumFlows(bool as_client, Host *peer) { HostStats::incNumFlows(as_client, peer); - - map *contacts_map; - - if(as_client) - contacts_map = &contacts_as_cli; - else - contacts_map = &contacts_as_srv; - - if(peer) { - (*contacts_map)[peer] += 1; - -#if 0 - char buf1[64], buf2[64]; - ntop->getTrace()->traceEvent(TRACE_NORMAL, "INC contacts: %s %s %s, now %u", - get_string_key(buf1, sizeof(buf1)), as_client ? "->" : "<-", - peer->get_string_key(buf2, sizeof(buf2)), (*contacts_map)[peer]); -#endif - } } /* *************************************** */ void LocalHostStats::decNumFlows(bool as_client, Host *peer) { HostStats::decNumFlows(as_client, peer); - - if(peer) { - map *contacts_map = as_client ? &contacts_as_cli : &contacts_as_srv; - map::iterator it; - - if((it = contacts_map->find(peer)) != contacts_map->end()) { - if(it->second) - it->second -= 1; - -#if 0 - char buf1[64], buf2[64]; - ntop->getTrace()->traceEvent(TRACE_NORMAL, "DEC contacts: %s %s %s, now %u", - get_string_key(buf1, sizeof(buf1)), as_client ? "->" : "<-", - peer->get_string_key(buf2, sizeof(buf2)), it->second); -#endif - - if(!it->second) - contacts_map->erase(it); - } - } } /* *************************************** */
'..i18n("ndpi_page.num_contacted_services_as_client")..''.. formatValue(host.cardinality.num_contacted_services_as_client)) + print(' '..i18n("ndpi_page.num_contacted_services_as_client_descr")..'