diff --git a/include/Host.h b/include/Host.h index eb12f26ac5..418fab520b 100644 --- a/include/Host.h +++ b/include/Host.h @@ -228,7 +228,8 @@ class Host : public GenericHashEntry { void incNumFlows(time_t t, bool as_client, Host *peer); void decNumFlows(time_t t, bool as_client, Host *peer); - + inline void incNumUnreachableFlows(bool as_server) { if(stats) stats->incNumUnreachableFlows(as_server); } + inline void incFlagStats(bool as_client, u_int8_t flags) { stats->incFlagStats(as_client, flags); }; virtual void incNumDNSQueriesSent(u_int16_t query_type) { }; virtual void incNumDNSQueriesRcvd(u_int16_t query_type) { }; @@ -254,6 +255,8 @@ class Host : public GenericHashEntry { inline u_int32_t getNumActiveFlows() { return(getNumOutgoingFlows()+getNumIncomingFlows()); } inline u_int32_t getTotalNumAnomalousOutgoingFlows() const { return stats->getTotalAnomalousNumFlowsAsClient(); }; inline u_int32_t getTotalNumAnomalousIncomingFlows() const { return stats->getTotalAnomalousNumFlowsAsServer(); }; + inline u_int32_t getTotalNumUnreachableOutgoingFlows() const { return stats->getTotalUnreachableNumFlowsAsClient(); }; + inline u_int32_t getTotalNumUnreachableIncomingFlows() const { return stats->getTotalUnreachableNumFlowsAsServer(); }; void splitHostVlan(const char *at_sign_str, char *buf, int bufsize, u_int16_t *vlan_id); char* get_country(char *buf, u_int buf_len); char* get_city(char *buf, u_int buf_len); diff --git a/include/HostStats.h b/include/HostStats.h index 31109c1f9a..ecc6937757 100644 --- a/include/HostStats.h +++ b/include/HostStats.h @@ -47,6 +47,7 @@ class HostStats: public Checkpointable, public GenericTrafficElement { PacketStats sent_stats, recv_stats; u_int32_t total_num_flows_as_client, total_num_flows_as_server; u_int32_t anomalous_flows_as_client, anomalous_flows_as_server; + u_int32_t unreachable_flows_as_client, unreachable_flows_as_server; struct { u_int32_t pktRetr, pktOOO, pktLost, pktKeepAlive; } tcpPacketStats; /* Sent packets */ @@ -62,13 +63,13 @@ class HostStats: public Checkpointable, public GenericTrafficElement { void checkPointHostTalker(lua_State *vm, bool saveCheckpoint); bool serializeCheckpoint(json_object *my_object, DetailsLevel details_level); void incStats(time_t when, u_int8_t l4_proto, u_int ndpi_proto, - custom_app_t custom_app, - u_int64_t sent_packets, u_int64_t sent_bytes, u_int64_t sent_goodput_bytes, - u_int64_t rcvd_packets, u_int64_t rcvd_bytes, u_int64_t rcvd_goodput_bytes); - + custom_app_t custom_app, + u_int64_t sent_packets, u_int64_t sent_bytes, u_int64_t sent_goodput_bytes, + u_int64_t rcvd_packets, u_int64_t rcvd_bytes, u_int64_t rcvd_goodput_bytes); virtual void getJSONObject(json_object *my_object, DetailsLevel details_level); inline void incFlagStats(bool as_client, u_int8_t flags) { if (as_client) sent_stats.incFlagStats(flags); else recv_stats.incFlagStats(flags); }; inline void incNumAnomalousFlows(bool as_client) { if(as_client) anomalous_flows_as_client++; else anomalous_flows_as_server++; }; + inline void incNumUnreachableFlows(bool as_server) { if(as_server) unreachable_flows_as_server++; else unreachable_flows_as_client++; } inline nDPIStats* getnDPIStats() { return(ndpiStats); }; virtual void computeAnomalyIndex(time_t when) {}; @@ -84,6 +85,8 @@ class HostStats: public Checkpointable, public GenericTrafficElement { inline u_int32_t getTotalNumFlowsAsServer() const { return(total_num_flows_as_server); }; inline u_int32_t getTotalAnomalousNumFlowsAsClient() const { return(anomalous_flows_as_client); }; inline u_int32_t getTotalAnomalousNumFlowsAsServer() const { return(anomalous_flows_as_server); }; + inline u_int32_t getTotalUnreachableNumFlowsAsClient() const { return(unreachable_flows_as_client); }; + inline u_int32_t getTotalUnreachableNumFlowsAsServer() const { return(unreachable_flows_as_server); }; virtual void deserialize(json_object *obj) {} virtual void incNumFlows(bool as_client, Host *peer) { if(as_client) total_num_flows_as_client++; else total_num_flows_as_server++; } ; virtual void decNumFlows(bool as_client, Host *peer) {}; diff --git a/include/HostTimeseriesPoint.h b/include/HostTimeseriesPoint.h index 33507ee95e..7914dc8a50 100644 --- a/include/HostTimeseriesPoint.h +++ b/include/HostTimeseriesPoint.h @@ -31,6 +31,7 @@ class HostTimeseriesPoint: public TimeseriesPoint { u_int32_t num_flows_as_client, num_flows_as_server; u_int64_t total_alerts; u_int64_t total_num_anomalous_flows_as_client, total_num_anomalous_flows_as_server; + u_int64_t total_num_unreachable_flows_as_client, total_num_unreachable_flows_as_server; TrafficCounter l4_stats[4]; // tcp, udp, icmp, other u_int32_t num_contacts_as_cli, num_contacts_as_srv; diff --git a/scripts/locales/en.lua b/scripts/locales/en.lua index 3bf1fab636..7962c147de 100644 --- a/scripts/locales/en.lua +++ b/scripts/locales/en.lua @@ -234,8 +234,6 @@ local lang = { }, ["alerts_dashboard"] = { ["active_flows_anomaly"] = "Active Flows Anomaly", - ["dns_anomaly"] = "DNS Anomaly", - ["icmp_anomaly"] = "ICMP Anomaly", ["alert_counts"] = "Counts", ["alert_duration"] = "Duration", ["alert_severity"] = "Severity", @@ -247,6 +245,7 @@ local lang = { ["custom_period"] = "Custom Period", ["device_connection"] = "Device Connection", ["device_disconnection"] = "Device Disconnection", + ["dns_anomaly"] = "DNS Anomaly", ["engaged_for_longest"] = "Past Alerts Engaged for Longest", ["error"] = "Error", ["five_mins"] = "Last 5 Minutes", @@ -256,6 +255,7 @@ local lang = { ["flows_flood"] = "Flows Flood", ["host_pool_connection"] = "Host Pool Connection", ["host_pool_disconnection"] = "Host Pool Disconnection", + ["icmp_anomaly"] = "ICMP Anomaly", ["inactivity"] = "Inactivity", ["influxdb_export_failure"] = "InfluxDB Export Failure", ["info"] = "Info", @@ -519,7 +519,7 @@ local lang = { ["flow_snmp_localization"] = "Flow SNMP Localization", ["flows_dropped_by_bridge"] = "Flows Blocked due to Traffic Policies", ["flows_non_packet_iface"] = "Recently Active Flows / Total / Total Anomalous", - ["flows_packet_iface"] = "Flows Active / Total / Low Goodput / Total Anomalous", + ["flows_packet_iface"] = "Flows: Active / Total / Low Goodput / Anomalous / Unreach", ["flows_packet_pcap_dump_iface"] = "Flows / Total Active / Total Anomalous", ["further_host_names_information"] = "Additional Host Names", ["goodput"] = "Goodput", @@ -1345,6 +1345,7 @@ local lang = { ["top_senders"] = "Top Senders", ["top_servers"] = "Top %{protocol} Servers", ["total_anomalous_flows"] = "Total Anomalous Flows", + ["total_unreachable_flows"] = "Total Unreachable Flows", ["traffic_txrx"] = "Traffic TX/RX", ["trend"] = "Trend", ["zmq_flow_coll_drops"] = "ZMQ Flow Collection Drops", diff --git a/scripts/locales/it.lua b/scripts/locales/it.lua index e08a7004ad..4d7847c1e9 100644 --- a/scripts/locales/it.lua +++ b/scripts/locales/it.lua @@ -496,7 +496,7 @@ local lang = { ["flow_snmp_localization"] = "Localizazione Flusso SNMP", ["flows_dropped_by_bridge"] = "Flussi Bloccati a causa delle Politiche di Traffico", ["flows_non_packet_iface"] = "Flussi recentemente attivi / Totale", - ["flows_packet_iface"] = "Flussi Attivi / Totale Attivi / A Basso Goodput", + ["flows_packet_iface"] = "Flussi: Attivi / Totali / A Basso Goodput / Non Raggiungibili", ["flows_packet_pcap_dump_iface"] = "Flussi / Totale Attivi / A Basso Goodput", ["further_host_names_information"] = "Ulteriori nomi", ["goodput"] = "Goodput", diff --git a/scripts/lua/get_flows_data.lua b/scripts/lua/get_flows_data.lua index 9be08612d9..919c55de64 100644 --- a/scripts/lua/get_flows_data.lua +++ b/scripts/lua/get_flows_data.lua @@ -190,8 +190,13 @@ if not isEmptyString(tcp_state) then end local flows_stats = interface.getFlowsInfo(host, pageinfo) -local total = flows_stats["numFlows"] -local flows_stats = flows_stats["flows"] +local total +local flows_stats + +if(flows_stats ~= nil) then + total = flows_stats["numFlows"] + flows_stats = flows_stats["flows"] +end -- Prepare host local host_list = {} diff --git a/scripts/lua/host_details.lua b/scripts/lua/host_details.lua index e1ee933bfd..e1425415e2 100644 --- a/scripts/lua/host_details.lua +++ b/scripts/lua/host_details.lua @@ -620,6 +620,7 @@ end print("/ " .. formatValue(host["low_goodput_flows.as_client"]) .. " \n") end print("/ " .. formatValue(host["anomalous_flows.as_client"]) .. " ") + print(" / " .. formatValue(host["unreachable_flows.as_client"]) .. " ") print("") print("" .. formatValue(host["active_flows.as_server"]) .. " \n") @@ -628,6 +629,7 @@ end print("/ " .. formatValue(host["low_goodput_flows.as_server"]) .. " \n") end print("/ " .. formatValue(host["anomalous_flows.as_server"]) .. " ") + print(" / " .. formatValue(host["unreachable_flows.as_server"]) .. " ") print("") if ntop.isnEdge() then @@ -1921,6 +1923,7 @@ drawGraphs(ifId, schema, tags, _GET["zoom"], url, selected_epoch, { {schema="host:traffic", label=i18n("traffic")}, {schema="host:flows", label=i18n("graphs.active_flows")}, {schema="host:anomalous_flows", label=i18n("graphs.total_anomalous_flows")}, + {schema="host:unreachable_flows", label=i18n("graphs.total_unreachable_flows")}, {schema="host:contacts", label=i18n("graphs.active_host_contacts")}, {schema="host:total_alerts", label=i18n("details.alerts")}, @@ -1957,6 +1960,8 @@ if(page ~= "historical") and (host ~= nil) then print("var last_low_goodput_flows_as_server = " .. host["low_goodput_flows.as_server"] .. ";\n") print("var last_anomalous_flows_as_server = " .. host["anomalous_flows.as_server"] .. ";\n") print("var last_anomalous_flows_as_client = " .. host["anomalous_flows.as_client"] .. ";\n") + print("var last_unreachable_flows_as_server = " .. host["unreachable_flows.as_server"] .. ";\n") + print("var last_unreachable_flows_as_client = " .. host["unreachable_flows.as_client"] .. ";\n") print("var last_tcp_retransmissions = " .. host["tcp.packets.retransmissions"] .. ";\n") print("var last_tcp_ooo = " .. host["tcp.packets.out_of_order"] .. ";\n") print("var last_tcp_lost = " .. host["tcp.packets.lost"] .. ";\n") @@ -2023,11 +2028,13 @@ if(page ~= "historical") and (host ~= nil) then $('#active_flows_as_client').html(addCommas(host["active_flows.as_client"])); $('#flows_as_client').html(addCommas(host["flows.as_client"])); $('#low_goodput_as_client').html(addCommas(host["low_goodput_flows.as_client"])); - $('#anomalous_flows_as_client').html(addCommas(host["anomalous_flows.as_client"])); + $('#anomalous_flows_as_client').html(addCommas(host["anomalous_flows.as_client"])); + $('#unreachable_flows_as_client').html(addCommas(host["unreachable_flows.as_client"])); $('#active_flows_as_server').html(addCommas(host["active_flows.as_server"])); $('#flows_as_server').html(addCommas(host["flows.as_server"])); $('#low_goodput_as_server').html(addCommas(host["low_goodput_flows.as_server"])); - $('#anomalous_flows_as_server').html(addCommas(host["anomalous_flows.as_server"])); + $('#anomalous_flows_as_server').html(addCommas(host["anomalous_flows.as_server"])); + $('#unreachable_flows_as_server').html(addCommas(host["unreachable_flows.as_server"])); }]] if ntop.isnEdge() then @@ -2150,6 +2157,8 @@ print [[ $('#low_goodput_trend_as_server').html(drawTrend(host["low_goodput_flows.as_server"], last_low_goodput_flows_as_server, " style=\"color: #B94A48;\"")); $('#trend_anomalous_flows_as_server').html(drawTrend(host["anomalous_flows.as_server"], last_anomalous_flows_as_server, " style=\"color: #B94A48;\"")); $('#trend_anomalous_flows_as_client').html(drawTrend(host["anomalous_flows.as_client"], last_anomalous_flows_as_client, " style=\"color: #B94A48;\"")); + $('#trend_unreachable_flows_as_server').html(drawTrend(host["unreachable_flows.as_server"], last_unreachable_flows_as_server, " style=\"color: #B94A48;\"")); + $('#trend_unreachable_flows_as_client').html(drawTrend(host["unreachable_flows.as_client"], last_unreachable_flows_as_client, " style=\"color: #B94A48;\"")); $('#alerts_trend').html(drawTrend(host["num_alerts"], last_num_alerts, " style=\"color: #B94A48;\"")); $('#sent_trend').html(drawTrend(host["packets.sent"], last_pkts_sent, "")); @@ -2169,6 +2178,8 @@ print [[ last_low_goodput_flows_as_client = host["low_goodput_flows.as_client"]; last_anomalous_flows_as_server = host["anomalous_flows.as_server"]; last_anomalous_flows_as_client = host["anomalous_flows.as_client"]; + last_unreachable_flows_as_server = host["unreachable_flows.as_server"]; + last_unreachable_flows_as_client = host["unreachable_flows.as_client"]; last_flows_as_server = host["flows.as_server"]; last_tcp_retransmissions = host["tcp.packets.retransmissions"]; last_tcp_ooo = host["tcp.packets.out_of_order"]; diff --git a/scripts/lua/modules/custom_column_utils.lua b/scripts/lua/modules/custom_column_utils.lua index 348dbd48e3..fc55e70f43 100644 --- a/scripts/lua/modules/custom_column_utils.lua +++ b/scripts/lua/modules/custom_column_utils.lua @@ -21,6 +21,8 @@ custom_column_utils.available_custom_columns = { { "num_flows_as_server", i18n("flows_page.flows_as_server"), "active_flows.as_server", format_utils.formatValue, "center" }, { "total_num_anomalous_flows_as_client", i18n("total_outgoing_anomalous_flows"), "anomalous_flows.as_client", format_utils.formatValue, "center" }, { "total_num_anomalous_flows_as_server", i18n("total_incoming_anomalous_flows"), "anomalous_flows.as_server", format_utils.formatValue, "center" }, + { "total_num_unreachable_flows_as_client", i18n("total_outgoing_unreachable_flows"), "unreachable_flows.as_client", format_utils.formatValue, "center" }, + { "total_num_unreachable_flows_as_server", i18n("total_incoming_unreachable_flows"), "unreachable_flows.as_server", format_utils.formatValue, "center" }, { "alerts", i18n("show_alerts.engaged_alerts"), "num_alerts", format_utils.formatValue, "center" }, { "total_alerts", i18n("alerts_dashboard.total_alerts"), "total_alerts", format_utils.formatValue, "center" }, } diff --git a/scripts/lua/modules/timeseries/schemas/ts_5min.lua b/scripts/lua/modules/timeseries/schemas/ts_5min.lua index dd72df120c..a1decba3ed 100644 --- a/scripts/lua/modules/timeseries/schemas/ts_5min.lua +++ b/scripts/lua/modules/timeseries/schemas/ts_5min.lua @@ -182,6 +182,14 @@ schema:addMetric("flows_as_server") -- ############################################## +schema = ts_utils.newSchema("host:unreachable_flows", {step = 300, rrd_fname = "unreachable_flows"}) +schema:addTag("ifid") +schema:addTag("host") +schema:addMetric("flows_as_client") +schema:addMetric("flows_as_server") + +-- ############################################## + schema = ts_utils.newSchema("host:total_alerts", {step = 300, rrd_fname = "total_alerts"}) schema:addTag("ifid") schema:addTag("host") diff --git a/scripts/lua/modules/ts_5min_dump_utils.lua b/scripts/lua/modules/ts_5min_dump_utils.lua index 09368b8b5a..5ba2caf46b 100644 --- a/scripts/lua/modules/ts_5min_dump_utils.lua +++ b/scripts/lua/modules/ts_5min_dump_utils.lua @@ -183,6 +183,12 @@ function ts_dump.host_update_stats_rrds(when, hostname, host, ifstats, verbose) flows_as_server = host["anomalous_flows.as_server"]}, when, verbose) + -- Number of unreachable flows + ts_utils.append("host:unreachable_flows", {ifid = ifstats.id, host = hostname, + flows_as_client = host["unreachable_flows.as_client"], + flows_as_server = host["unreachable_flows.as_server"]}, + when, verbose) + -- Total number of alerts ts_utils.append("host:total_alerts", {ifid = ifstats.id, host = hostname, alerts = host["total_alerts"]}, diff --git a/src/Flow.cpp b/src/Flow.cpp index 256fd42574..e180d25c7b 100644 --- a/src/Flow.cpp +++ b/src/Flow.cpp @@ -82,6 +82,16 @@ Flow::Flow(NetworkInterface *_iface, if(cli_host) { cli_host->incUses(); cli_host->incNumFlows(last_seen, true, srv_host); } if(srv_host) { srv_host->incUses(); srv_host->incNumFlows(last_seen, false, cli_host); } + if(icmp_info) { + /* + This is an ICMP flow which contains unreachable information. As is the cli_host + that complains, it means that the srv_host has made a connection that triggered + the issue and thus it must be accounted in reverse + */ + if(cli_host) cli_host->incNumUnreachableFlows(true /* as server */); + if(srv_host) srv_host->incNumUnreachableFlows(false /* as client */); + } + memset(&custom_app, 0, sizeof(custom_app)); #ifdef NTOPNG_PRO diff --git a/src/Host.cpp b/src/Host.cpp index 625bafb8ac..c9b6ae31da 100644 --- a/src/Host.cpp +++ b/src/Host.cpp @@ -561,6 +561,8 @@ void Host::lua(lua_State* vm, AddressTree *ptree, lua_push_uint64_table_entry(vm, "anomalous_flows.as_server", getTotalNumAnomalousIncomingFlows()); lua_push_uint64_table_entry(vm, "anomalous_flows.as_client", getTotalNumAnomalousOutgoingFlows()); + lua_push_uint64_table_entry(vm, "unreachable_flows.as_server", getTotalNumUnreachableIncomingFlows()); + lua_push_uint64_table_entry(vm, "unreachable_flows.as_client", getTotalNumUnreachableOutgoingFlows()); lua_push_uint64_table_entry(vm, "total_alerts", stats->getTotalAlerts()); #ifdef NTOPNG_PRO diff --git a/src/HostStats.cpp b/src/HostStats.cpp index 940a34b999..7017454464 100644 --- a/src/HostStats.cpp +++ b/src/HostStats.cpp @@ -39,6 +39,7 @@ HostStats::HostStats(Host *_host) { total_num_flows_as_client = total_num_flows_as_server = 0; anomalous_flows_as_client = anomalous_flows_as_server = 0; + unreachable_flows_as_client = unreachable_flows_as_server = 0; total_alerts = 0; checkpoint_set = false; checkpoint_sent_bytes = checkpoint_rcvd_bytes = 0; @@ -67,6 +68,8 @@ void HostStats::getJSONObject(json_object *my_object, DetailsLevel details_level json_object_object_add(my_object, "flows.as_server", json_object_new_int(getTotalNumFlowsAsServer())); json_object_object_add(my_object, "anomalous_flows.as_client", json_object_new_int(getTotalAnomalousNumFlowsAsClient())); json_object_object_add(my_object, "anomalous_flows.as_server", json_object_new_int(getTotalAnomalousNumFlowsAsServer())); + json_object_object_add(my_object, "unreachable_flows.as_client", json_object_new_int(unreachable_flows_as_client)); + json_object_object_add(my_object, "unreachable_flows.as_server", json_object_new_int(unreachable_flows_as_server)); json_object_object_add(my_object, "total_alerts", json_object_new_int(total_alerts)); if(total_num_dropped_flows) @@ -142,6 +145,8 @@ void HostStats::lua(lua_State* vm, bool mask_host, bool host_details, bool verbo lua_push_uint64_table_entry(vm, "flows.as_server", getTotalNumFlowsAsServer()); lua_push_uint64_table_entry(vm, "anomalous_flows.as_client", getTotalAnomalousNumFlowsAsClient()); lua_push_uint64_table_entry(vm, "anomalous_flows.as_server", getTotalAnomalousNumFlowsAsServer()); + lua_push_uint64_table_entry(vm, "unreachable_flows.as_client", unreachable_flows_as_client); + lua_push_uint64_table_entry(vm, "unreachable_flows.as_server", unreachable_flows_as_server); lua_push_uint64_table_entry(vm, "total_alerts", total_alerts); lua_push_uint64_table_entry(vm, "udp.packets.sent", udp_sent.getNumPkts()); lua_push_uint64_table_entry(vm, "udp.bytes.sent", udp_sent.getNumBytes()); diff --git a/src/HostTimeseriesPoint.cpp b/src/HostTimeseriesPoint.cpp index b3e9d9455e..71442ea806 100644 --- a/src/HostTimeseriesPoint.cpp +++ b/src/HostTimeseriesPoint.cpp @@ -43,6 +43,8 @@ void HostTimeseriesPoint::lua(lua_State* vm, NetworkInterface *iface) { lua_push_uint64_table_entry(vm, "active_flows.as_server", num_flows_as_server); lua_push_uint64_table_entry(vm, "anomalous_flows.as_client", total_num_anomalous_flows_as_client); lua_push_uint64_table_entry(vm, "anomalous_flows.as_server", total_num_anomalous_flows_as_server); + lua_push_uint64_table_entry(vm, "unreachable_flows.as_client", total_num_unreachable_flows_as_client); + lua_push_uint64_table_entry(vm, "unreachable_flows.as_server", total_num_unreachable_flows_as_server); lua_push_uint64_table_entry(vm, "total_alerts", total_alerts); lua_push_uint64_table_entry(vm, "contacts.as_client", num_contacts_as_cli); lua_push_uint64_table_entry(vm, "contacts.as_server", num_contacts_as_srv); diff --git a/src/LocalHost.cpp b/src/LocalHost.cpp index a8ee6a8539..5fc69f77c6 100644 --- a/src/LocalHost.cpp +++ b/src/LocalHost.cpp @@ -5,7 +5,7 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or +o * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, diff --git a/src/LocalHostStats.cpp b/src/LocalHostStats.cpp index af9809f65b..606e2de2c9 100644 --- a/src/LocalHostStats.cpp +++ b/src/LocalHostStats.cpp @@ -191,6 +191,8 @@ void LocalHostStats::deserialize(json_object *o) { if(json_object_object_get_ex(o, "flows.as_server", &obj)) total_num_flows_as_server = json_object_get_int(obj); if(json_object_object_get_ex(o, "anomalous_flows.as_client", &obj)) anomalous_flows_as_client = json_object_get_int(obj); if(json_object_object_get_ex(o, "anomalous_flows.as_server", &obj)) anomalous_flows_as_server = json_object_get_int(obj); + if(json_object_object_get_ex(o, "unreachable_flows.as_client", &obj)) unreachable_flows_as_client = json_object_get_int(obj); + if(json_object_object_get_ex(o, "unreachable_flows.as_server", &obj)) unreachable_flows_as_server = json_object_get_int(obj); if(json_object_object_get_ex(o, "total_alerts", &obj)) total_alerts = json_object_get_int(obj); if(json_object_object_get_ex(o, "flows.dropped", &obj)) total_num_dropped_flows = json_object_get_int(obj); } @@ -205,6 +207,8 @@ void LocalHostStats::makeTsPoint(HostTimeseriesPoint *pt) { pt->num_flows_as_server = host->getNumIncomingFlows(); pt->total_num_anomalous_flows_as_client = host->getTotalNumAnomalousOutgoingFlows(); pt->total_num_anomalous_flows_as_server = host->getTotalNumAnomalousIncomingFlows(); + pt->total_num_unreachable_flows_as_client = host->getTotalNumUnreachableOutgoingFlows(); + pt->total_num_unreachable_flows_as_server = host->getTotalNumUnreachableIncomingFlows(); pt->total_alerts = host->getTotalAlerts(); pt->num_contacts_as_cli = contacts_as_cli.size(); pt->num_contacts_as_srv = contacts_as_srv.size();