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();