From 1fdc42b49a1f9423ea695de7703f66895269b5f8 Mon Sep 17 00:00:00 2001 From: Nardi Ivan Date: Sat, 20 May 2023 20:35:58 +0200 Subject: [PATCH] Add support for Epic Games and GeForceNow/Nvidia --- doc/protocols.rst | 29 +++++- src/include/ndpi_protocol_ids.h | 3 + src/include/ndpi_protocols.h | 1 + src/include/ndpi_typedefs.h | 4 + .../inc_generated/ndpi_asn_epicgames.c.inc | 31 +++++++ src/lib/inc_generated/ndpi_asn_nvidia.c.inc | 59 ++++++++++++ src/lib/ndpi_content_match.c.inc | 19 ++++ src/lib/ndpi_main.c | 7 ++ src/lib/protocols/epicgames.c | 87 ++++++++++++++++++ tests/cfgs/default/pcap/epicgames.pcapng | Bin 0 -> 14144 bytes tests/cfgs/default/pcap/geforcenow.pcapng | Bin 0 -> 73024 bytes tests/cfgs/default/result/1kxun.pcap.out | 2 +- tests/cfgs/default/result/4in4tunnel.pcap.out | 2 +- tests/cfgs/default/result/6in6tunnel.pcap.out | 2 +- tests/cfgs/default/result/EAQ.pcap.out | 2 +- .../default/result/adult_content.pcap.out | 2 +- .../default/result/anyconnect-vpn.pcap.out | 2 +- tests/cfgs/default/result/collectd.pcap.out | 2 +- ...om_rules_same-ip_multiple_ports.pcapng.out | 4 +- .../cfgs/default/result/dhcp-fuzz.pcapng.out | 2 +- tests/cfgs/default/result/discord.pcap.out | 2 +- .../default/result/discord_mid_flow.pcap.out | 2 +- .../dnscrypt-v1-and-resolver-pings.pcap.out | 2 +- .../cfgs/default/result/dnscrypt-v2.pcap.out | 2 +- .../dnscrypt_skype_false_positive.pcapng.out | 2 +- .../cfgs/default/result/epicgames.pcapng.out | 28 ++++++ .../result/fuzz-2006-06-26-2594.pcap.out | 2 +- .../result/fuzz-2020-02-16-11740.pcap.out | 2 +- .../cfgs/default/result/geforcenow.pcapng.out | 33 +++++++ tests/cfgs/default/result/gnutella.pcap.out | 2 +- .../result/gtp_false_positive.pcapng.out | 2 +- tests/cfgs/default/result/h323.pcap.out | 2 +- tests/cfgs/default/result/http_ipv6.pcap.out | 2 +- tests/cfgs/default/result/imo.pcap.out | 2 +- tests/cfgs/default/result/instagram.pcap.out | 2 +- tests/cfgs/default/result/iphone.pcap.out | 2 +- tests/cfgs/default/result/kontiki.pcap.out | 2 +- tests/cfgs/default/result/line.pcap.out | 2 +- .../result/linecall_falsepositve.pcap.out | 2 +- .../default/result/lru_ipv6_caches.pcapng.out | 2 +- tests/cfgs/default/result/nintendo.pcap.out | 2 +- tests/cfgs/default/result/openvpn.pcap.out | 2 +- .../ossfuzz_seed_fake_traces_1.pcapng.out | 2 +- .../ossfuzz_seed_fake_traces_2.pcapng.out | 2 +- .../ossfuzz_seed_fake_traces_4.pcapng.out | 2 +- tests/cfgs/default/result/pps.pcap.out | 2 +- tests/cfgs/default/result/quic.pcap.out | 2 +- tests/cfgs/default/result/quic_0RTT.pcap.out | 2 +- .../result/radius_false_positive.pcapng.out | 2 +- tests/cfgs/default/result/raknet.pcap.out | 2 +- tests/cfgs/default/result/rx.pcap.out | 2 +- tests/cfgs/default/result/sflow.pcap.out | 2 +- .../cfgs/default/result/sip_hello.pcapng.out | 2 +- tests/cfgs/default/result/skype_udp.pcap.out | 2 +- tests/cfgs/default/result/softether.pcap.out | 2 +- .../default/result/starcraft_battle.pcap.out | 2 +- tests/cfgs/default/result/stun.pcap.out | 2 +- .../default/result/stun_signal.pcapng.out | 2 +- tests/cfgs/default/result/synscan.pcap.out | 4 +- tests/cfgs/default/result/teams.pcap.out | 2 +- tests/cfgs/default/result/teamspeak3.pcap.out | 2 +- tests/cfgs/default/result/teamviewer.pcap.out | 2 +- tests/cfgs/default/result/telegram.pcap.out | 2 +- tests/cfgs/default/result/tftp.pcap.out | 2 +- tests/cfgs/default/result/toca-boca.pcap.out | 2 +- tests/cfgs/default/result/viber.pcap.out | 2 +- tests/cfgs/default/result/webex.pcap.out | 2 +- tests/cfgs/default/result/weibo.pcap.out | 2 +- tests/cfgs/default/result/wireguard.pcap.out | 2 +- tests/cfgs/default/result/zoom2.pcap.out | 2 +- tests/cfgs/default/result/zoom_p2p.pcapng.out | 2 +- .../result/dns_long_domainname.pcap.out | 2 +- .../result/quic-mvfst-27.pcapng.out | 2 +- utils/asn_update.sh | 10 ++ windows/nDPI.vcxproj | 1 + windows/nDPI.vcxproj.filters | 1 + 76 files changed, 374 insertions(+), 63 deletions(-) create mode 100644 src/lib/inc_generated/ndpi_asn_epicgames.c.inc create mode 100644 src/lib/inc_generated/ndpi_asn_nvidia.c.inc create mode 100644 src/lib/protocols/epicgames.c create mode 100644 tests/cfgs/default/pcap/epicgames.pcapng create mode 100644 tests/cfgs/default/pcap/geforcenow.pcapng create mode 100644 tests/cfgs/default/result/epicgames.pcapng.out create mode 100644 tests/cfgs/default/result/geforcenow.pcapng.out diff --git a/doc/protocols.rst b/doc/protocols.rst index e332361081a..8374653f96e 100644 --- a/doc/protocols.rst +++ b/doc/protocols.rst @@ -8,7 +8,7 @@ Work in progress! .. _Proto 338: `NDPI_PROTOCOL_SRTP`: SRTP (Secure Real-time Transport Protocol) -============================================================== +================================================================ The Secure Real-time Transport Protocol (SRTP) is a profile for Real-time Transport Protocol (RTP) intended to provide encryption, message authentication, integrity, and replay attack protection to the RTP data. References: `RFC3711 `_. @@ -17,3 +17,30 @@ Notes: - You can think of SRTP simply as the "encrypted" version of RTP, something like HTTPS vs HTTP; - It is not usually possible to tell RTP from SRTP. nDPI generally uses the former and it uses the latter only when it is really sure that the media stream has been encrypted. + + +.. _Proto 340: + +`NDPI_PROTOCOL_EPICGAMES` +========================= +Epic Games is a video game company developing the Unreal Engine and some successful games as Fortnite and Gears of War. + +References: `Main site `_ `Fortnite `_. + + +.. _Proto 341: + +`NDPI_PROTOCOL_GEFORCENOW` +========================== +GeForce Now is the brand used by Nvidia for its cloud gaming service. + +References: `Main site `_. + + +.. _Proto 342: + +`NDPI_PROTOCOL_NVIDIA` +====================== +Generic web traffic from Nvidia sites. + +References: `Main site `_. diff --git a/src/include/ndpi_protocol_ids.h b/src/include/ndpi_protocol_ids.h index 2db04cc0c40..ad59a945ff4 100644 --- a/src/include/ndpi_protocol_ids.h +++ b/src/include/ndpi_protocol_ids.h @@ -368,6 +368,9 @@ typedef enum { NDPI_PROTOCOL_FACEBOOK_REEL_STORY = 337, NDPI_PROTOCOL_SRTP = 338, NDPI_PROTOCOL_GAMBLING = 339, + NDPI_PROTOCOL_EPICGAMES = 340, + NDPI_PROTOCOL_GEFORCENOW = 341, + NDPI_PROTOCOL_NVIDIA = 342, #ifdef CUSTOM_NDPI_PROTOCOLS #include "../../../nDPI-custom/custom_ndpi_protocol_ids.h" diff --git a/src/include/ndpi_protocols.h b/src/include/ndpi_protocols.h index c9e24783478..a1b98eeeb66 100644 --- a/src/include/ndpi_protocols.h +++ b/src/include/ndpi_protocols.h @@ -241,6 +241,7 @@ void init_tailscale_dissector(struct ndpi_detection_module_struct *ndpi_struct, void init_source_engine_dissector(struct ndpi_detection_module_struct *ndpi_struct, u_int32_t *id); void init_bacnet_dissector(struct ndpi_detection_module_struct *ndpi_struct, u_int32_t *id); void init_oicq_dissector(struct ndpi_detection_module_struct *ndpi_struct, u_int32_t *id); +void init_epicgames_dissector(struct ndpi_detection_module_struct *ndpi_struct, u_int32_t *id); /* ndpi_main.c */ extern u_int32_t ndpi_ip_port_hash_funct(u_int32_t ip, u_int16_t port); diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h index efe90da72a2..491de0d7908 100644 --- a/src/include/ndpi_typedefs.h +++ b/src/include/ndpi_typedefs.h @@ -822,6 +822,10 @@ struct ndpi_flow_udp_struct { /* NDPI_PROTOCOL_QUIC */ u_int32_t quic_0rtt_found:1; + /* NDPI_PROTOCOL_EPICGAMES */ + u_int32_t epicgames_stage:1; + u_int32_t epicgames_word; + /* NDPI_PROTOCOL_SKYPE */ u_int8_t skype_crc[4]; diff --git a/src/lib/inc_generated/ndpi_asn_epicgames.c.inc b/src/lib/inc_generated/ndpi_asn_epicgames.c.inc new file mode 100644 index 00000000000..c4f76d07ace --- /dev/null +++ b/src/lib/inc_generated/ndpi_asn_epicgames.c.inc @@ -0,0 +1,31 @@ +/* + * + * This file is generated automatically and part of nDPI + * + * nDPI is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * nDPI is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with nDPI. If not, see . + * + */ + +/* ****************************************************** */ + + +static ndpi_network ndpi_protocol_epicgames_protocol_list[] = { + { 0x944E7000 /* 148.78.112.0/23 */, 23, NDPI_PROTOCOL_EPICGAMES }, + { 0x944E7200 /* 148.78.114.0/24 */, 24, NDPI_PROTOCOL_EPICGAMES }, + { 0x944E7900 /* 148.78.121.0/24 */, 24, NDPI_PROTOCOL_EPICGAMES }, + { 0x944E7A00 /* 148.78.122.0/24 */, 24, NDPI_PROTOCOL_EPICGAMES }, + { 0xC7FF2800 /* 199.255.40.0/22 */, 22, NDPI_PROTOCOL_EPICGAMES }, + /* End */ + { 0x0, 0, 0 } +}; diff --git a/src/lib/inc_generated/ndpi_asn_nvidia.c.inc b/src/lib/inc_generated/ndpi_asn_nvidia.c.inc new file mode 100644 index 00000000000..417773eb4f4 --- /dev/null +++ b/src/lib/inc_generated/ndpi_asn_nvidia.c.inc @@ -0,0 +1,59 @@ +/* + * + * This file is generated automatically and part of nDPI + * + * nDPI is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * nDPI is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with nDPI. If not, see . + * + */ + +/* ****************************************************** */ + + +static ndpi_network ndpi_protocol_nvidia_protocol_list[] = { + { 0x081A9200 /* 8.26.146.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x081CE500 /* 8.28.229.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x08247000 /* 8.36.112.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x08247800 /* 8.36.120.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x082C3300 /* 8.44.51.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x082C3400 /* 8.44.52.0/22 */, 22, NDPI_PROTOCOL_NVIDIA }, + { 0x082F4300 /* 8.47.67.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x18330000 /* 24.51.0.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x18330200 /* 24.51.2.0/23 */, 23, NDPI_PROTOCOL_NVIDIA }, + { 0x18330400 /* 24.51.4.0/22 */, 22, NDPI_PROTOCOL_NVIDIA }, + { 0x18330800 /* 24.51.8.0/21 */, 21, NDPI_PROTOCOL_NVIDIA }, + { 0x18331000 /* 24.51.16.0/20 */, 20, NDPI_PROTOCOL_NVIDIA }, + { 0x25BA6F00 /* 37.186.111.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x42168000 /* 66.22.128.0/21 */, 21, NDPI_PROTOCOL_NVIDIA }, + { 0x42168800 /* 66.22.136.0/22 */, 22, NDPI_PROTOCOL_NVIDIA }, + { 0x42168C00 /* 66.22.140.0/23 */, 23, NDPI_PROTOCOL_NVIDIA }, + { 0x48194000 /* 72.25.64.0/23 */, 23, NDPI_PROTOCOL_NVIDIA }, + { 0x48194200 /* 72.25.66.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x48194400 /* 72.25.68.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x4D6FF900 /* 77.111.249.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x4D6FFB00 /* 77.111.251.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x5054A000 /* 80.84.160.0/20 */, 20, NDPI_PROTOCOL_NVIDIA }, + { 0x551D0E00 /* 85.29.14.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x551D1200 /* 85.29.18.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x59F8ED00 /* 89.248.237.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x6706D300 /* 103.6.211.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x70D98000 /* 112.217.128.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0x79C82D00 /* 121.200.45.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0xB9884400 /* 185.136.68.0/22 */, 22, NDPI_PROTOCOL_NVIDIA }, + { 0xC1F63300 /* 193.246.51.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0xD8E47000 /* 216.228.112.0/20 */, 20, NDPI_PROTOCOL_NVIDIA }, + { 0xD9C7D100 /* 217.199.209.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + { 0xD9C7DE00 /* 217.199.222.0/24 */, 24, NDPI_PROTOCOL_NVIDIA }, + /* End */ + { 0x0, 0, 0 } +}; diff --git a/src/lib/ndpi_content_match.c.inc b/src/lib/ndpi_content_match.c.inc index c006271536b..097db3d2b6a 100644 --- a/src/lib/ndpi_content_match.c.inc +++ b/src/lib/ndpi_content_match.c.inc @@ -1368,6 +1368,25 @@ static ndpi_protocol_match host_match[] = { "pvp.net", "RiotGames", NDPI_PROTOCOL_RIOTGAMES, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, { "riotcdn.net", "RiotGames", NDPI_PROTOCOL_RIOTGAMES, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "epicgames.com", "EpicGames", NDPI_PROTOCOL_EPICGAMES, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "unrealengine.com", "EpicGames", NDPI_PROTOCOL_EPICGAMES, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "fortnite.com", "EpicGames", NDPI_PROTOCOL_EPICGAMES, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "fortnite-vod.akamaized.net", "EpicGames", NDPI_PROTOCOL_EPICGAMES, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "epicgames.net", "EpicGames", NDPI_PROTOCOL_EPICGAMES, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "epicgames.dev", "EpicGames", NDPI_PROTOCOL_EPICGAMES, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + + { "nvidiagrid.net", "GeForceNow", NDPI_PROTOCOL_GEFORCENOW, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "gfe.nvidia.com", "GeForceNow", NDPI_PROTOCOL_GEFORCENOW, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "geforcenow.com", "GeForceNow", NDPI_PROTOCOL_GEFORCENOW, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "geforce.com", "GeForceNow", NDPI_PROTOCOL_GEFORCENOW, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "kaizen.nvidia.com", "GeForceNow", NDPI_PROTOCOL_GEFORCENOW, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "dtrace.nvidia.com", "GeForceNow", NDPI_PROTOCOL_GEFORCENOW, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "nvgs.nvidia.com", "GeForceNow", NDPI_PROTOCOL_GEFORCENOW, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "gx.nvidia.com", "GeForceNow", NDPI_PROTOCOL_GEFORCENOW, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + { "userstore.nvidia.com", "GeForceNow", NDPI_PROTOCOL_GEFORCENOW, NDPI_PROTOCOL_CATEGORY_GAME, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_DEFAULT_LEVEL}, + + { "nvidia.com", "Nvidia", NDPI_PROTOCOL_NVIDIA, NDPI_PROTOCOL_CATEGORY_WEB, NDPI_PROTOCOL_SAFE, NDPI_PROTOCOL_DEFAULT_LEVEL}, + /* ADS/tracking/analytic */ diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c index 4792c4edf2f..5b340aba196 100644 --- a/src/lib/ndpi_main.c +++ b/src/lib/ndpi_main.c @@ -107,6 +107,8 @@ #include "inc_generated/ndpi_asn_yandex_cloud.c.inc" #include "inc_generated/ndpi_asn_disney_plus.c.inc" #include "inc_generated/ndpi_asn_hulu.c.inc" +#include "inc_generated/ndpi_asn_epicgames.c.inc" +#include "inc_generated/ndpi_asn_nvidia.c.inc" /* Third party libraries */ #include "third_party/include/ndpi_patricia.h" @@ -2835,6 +2837,8 @@ struct ndpi_detection_module_struct *ndpi_init_detection_module(ndpi_init_prefs ndpi_init_ptree_ipv4(ndpi_str, ndpi_str->protocols_ptree, ndpi_protocol_yandex_cloud_protocol_list); ndpi_init_ptree_ipv4(ndpi_str, ndpi_str->protocols_ptree, ndpi_protocol_disneyplus_protocol_list); ndpi_init_ptree_ipv4(ndpi_str, ndpi_str->protocols_ptree, ndpi_protocol_hulu_protocol_list); + ndpi_init_ptree_ipv4(ndpi_str, ndpi_str->protocols_ptree, ndpi_protocol_epicgames_protocol_list); + ndpi_init_ptree_ipv4(ndpi_str, ndpi_str->protocols_ptree, ndpi_protocol_nvidia_protocol_list); } if(prefs & ndpi_track_flow_payload) @@ -4942,6 +4946,9 @@ static int ndpi_callback_init(struct ndpi_detection_module_struct *ndpi_str) { /* Heroes of the Storm */ init_hots_dissector(ndpi_str, &a); + /* EpicGames */ + init_epicgames_dissector(ndpi_str, &a); + #ifdef CUSTOM_NDPI_PROTOCOLS #include "../../../nDPI-custom/custom_ndpi_main_init.c" #endif diff --git a/src/lib/protocols/epicgames.c b/src/lib/protocols/epicgames.c new file mode 100644 index 00000000000..ea30783fd24 --- /dev/null +++ b/src/lib/protocols/epicgames.c @@ -0,0 +1,87 @@ +/* + * epicgames.c + * + * Copyright (C) 2023 - ntop.org + * + * nDPI is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * nDPI is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with nDPI. If not, see . + * + */ + + +#include "ndpi_protocol_ids.h" + +#define NDPI_CURRENT_PROTO NDPI_PROTOCOL_EPICGAMES + +#include "ndpi_api.h" + +static void ndpi_int_epicgames_add_connection(struct ndpi_detection_module_struct * const ndpi_struct, + struct ndpi_flow_struct * const flow) +{ + NDPI_LOG_INFO(ndpi_struct, "found EpicGames\n"); + ndpi_set_detected_protocol(ndpi_struct, flow, + NDPI_PROTOCOL_UNKNOWN, + NDPI_PROTOCOL_EPICGAMES, + NDPI_CONFIDENCE_DPI); +} + +static void ndpi_search_epicgames(struct ndpi_detection_module_struct *ndpi_struct, + struct ndpi_flow_struct *flow) +{ + struct ndpi_packet_struct *packet = &ndpi_struct->packet; + + NDPI_LOG_DBG(ndpi_struct, "searching EpicGames (stage %d dir %d)\n", + flow->l4.udp.epicgames_stage, packet->packet_direction); + + if(flow->packet_counter == 1) { + if(packet->payload_packet_len >= 34 && + ((ntohl(get_u_int32_t(packet->payload, 0)) & 0x08) == 0) && + get_u_int64_t(packet->payload, 10) == 0 && + get_u_int64_t(packet->payload, 18) == 0 && + get_u_int64_t(packet->payload, 26) == 0) { + flow->l4.udp.epicgames_stage = 1 + packet->packet_direction; + flow->l4.udp.epicgames_word = ntohl(get_u_int32_t(packet->payload, 0)); + return; + } else { + NDPI_EXCLUDE_PROTO(ndpi_struct, flow); + return; + } + } else if(flow->l4.udp.epicgames_stage == 2 - packet->packet_direction) { + if(packet->payload_packet_len > 4 && + (flow->l4.udp.epicgames_word | 0x08) == ntohl(get_u_int32_t(packet->payload, 0))) { + ndpi_int_epicgames_add_connection(ndpi_struct, flow); + return; + } else { + NDPI_EXCLUDE_PROTO(ndpi_struct, flow); + return; + } + } + + if(flow->packet_counter >= 4) { + NDPI_EXCLUDE_PROTO(ndpi_struct, flow); + return; + } +} + +void init_epicgames_dissector(struct ndpi_detection_module_struct *ndpi_struct, + u_int32_t *id) +{ + ndpi_set_bitmask_protocol_detection("EpicGames", ndpi_struct, *id, + NDPI_PROTOCOL_EPICGAMES, + ndpi_search_epicgames, + NDPI_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD, + SAVE_DETECTION_BITMASK_AS_UNKNOWN, + ADD_TO_DETECTION_BITMASK); + + *id += 1; +} diff --git a/tests/cfgs/default/pcap/epicgames.pcapng b/tests/cfgs/default/pcap/epicgames.pcapng new file mode 100644 index 0000000000000000000000000000000000000000..f3f9210c279c73454b267d019f579a91d7db713c GIT binary patch literal 14144 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 F{{c(w literal 0 HcmV?d00001 diff --git a/tests/cfgs/default/pcap/geforcenow.pcapng b/tests/cfgs/default/pcap/geforcenow.pcapng new file mode 100644 index 0000000000000000000000000000000000000000..04fc317a06a1029c35c35b97e13a43e1ce4069b2 GIT binary patch literal 73024 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≠HeHkhm0 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 HedGTDg`+U^ literal 0 HcmV?d00001 diff --git a/tests/cfgs/default/result/1kxun.pcap.out b/tests/cfgs/default/result/1kxun.pcap.out index 8c4bb0d7d90..5ebea11198b 100644 --- a/tests/cfgs/default/result/1kxun.pcap.out +++ b/tests/cfgs/default/result/1kxun.pcap.out @@ -5,7 +5,7 @@ DPI Packets (UDP): 120 (1.21 pkts/flow) Confidence Unknown : 14 (flows) Confidence Match by port : 6 (flows) Confidence DPI : 177 (flows) -Num dissector calls: 4414 (22.41 diss/flow) +Num dissector calls: 4428 (22.48 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/60/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/4in4tunnel.pcap.out b/tests/cfgs/default/result/4in4tunnel.pcap.out index b50291c10eb..1d25b8ce7df 100644 --- a/tests/cfgs/default/result/4in4tunnel.pcap.out +++ b/tests/cfgs/default/result/4in4tunnel.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 1 DPI Packets (UDP): 5 (5.00 pkts/flow) Confidence Unknown : 1 (flows) -Num dissector calls: 174 (174.00 diss/flow) +Num dissector calls: 175 (175.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/6in6tunnel.pcap.out b/tests/cfgs/default/result/6in6tunnel.pcap.out index 9fa0607efe4..c733233be5f 100644 --- a/tests/cfgs/default/result/6in6tunnel.pcap.out +++ b/tests/cfgs/default/result/6in6tunnel.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 1 DPI Packets (UDP): 2 (2.00 pkts/flow) Confidence Unknown : 1 (flows) -Num dissector calls: 124 (124.00 diss/flow) +Num dissector calls: 125 (125.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/EAQ.pcap.out b/tests/cfgs/default/result/EAQ.pcap.out index 5f11dc2ff3f..14a9e461685 100644 --- a/tests/cfgs/default/result/EAQ.pcap.out +++ b/tests/cfgs/default/result/EAQ.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 0 DPI Packets (TCP): 12 (6.00 pkts/flow) DPI Packets (UDP): 116 (4.00 pkts/flow) Confidence DPI : 31 (flows) -Num dissector calls: 4329 (139.65 diss/flow) +Num dissector calls: 4358 (140.58 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/adult_content.pcap.out b/tests/cfgs/default/result/adult_content.pcap.out index 7cd464b80c0..d56adf2d867 100644 --- a/tests/cfgs/default/result/adult_content.pcap.out +++ b/tests/cfgs/default/result/adult_content.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 4 (4.00 pkts/flow) Confidence DPI : 1 (flows) -Num dissector calls: 144 (144.00 diss/flow) +Num dissector calls: 145 (145.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/anyconnect-vpn.pcap.out b/tests/cfgs/default/result/anyconnect-vpn.pcap.out index e017ff46e16..0467ad2107e 100644 --- a/tests/cfgs/default/result/anyconnect-vpn.pcap.out +++ b/tests/cfgs/default/result/anyconnect-vpn.pcap.out @@ -6,7 +6,7 @@ DPI Packets (other): 10 (1.00 pkts/flow) Confidence Unknown : 2 (flows) Confidence Match by port : 6 (flows) Confidence DPI : 61 (flows) -Num dissector calls: 851 (12.33 diss/flow) +Num dissector calls: 852 (12.35 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/24/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/collectd.pcap.out b/tests/cfgs/default/result/collectd.pcap.out index 322c3e1f510..a9a29579300 100644 --- a/tests/cfgs/default/result/collectd.pcap.out +++ b/tests/cfgs/default/result/collectd.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 3 DPI Packets (UDP): 13 (1.62 pkts/flow) Confidence Match by port : 3 (flows) Confidence DPI : 5 (flows) -Num dissector calls: 399 (49.88 diss/flow) +Num dissector calls: 402 (50.25 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/9/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/custom_rules_same-ip_multiple_ports.pcapng.out b/tests/cfgs/default/result/custom_rules_same-ip_multiple_ports.pcapng.out index 2ce59831307..2a834a37ac2 100644 --- a/tests/cfgs/default/result/custom_rules_same-ip_multiple_ports.pcapng.out +++ b/tests/cfgs/default/result/custom_rules_same-ip_multiple_ports.pcapng.out @@ -23,5 +23,5 @@ Patricia protocols: 2/2 (search/found) CustomProtocolA 3 222 1 CustomProtocolB 2 148 1 - 1 TCP 192.168.1.245:56866 -> 3.3.3.3:443 [proto: 91.346/TLS.CustomProtocolA][IP: 346/CustomProtocolA][Encrypted][Confidence: Unknown][DPI packets: 1][cat: Web/5][3 pkts/222 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][3.05 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 2 TCP 192.168.1.245:59682 -> 3.3.3.3:444 [proto: 347/CustomProtocolB][IP: 347/CustomProtocolB][ClearText][Confidence: Unknown][DPI packets: 1][2 pkts/148 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][1.02 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + 1 TCP 192.168.1.245:56866 -> 3.3.3.3:443 [proto: 91.349/TLS.CustomProtocolA][IP: 349/CustomProtocolA][Encrypted][Confidence: Unknown][DPI packets: 1][cat: Web/5][3 pkts/222 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][3.05 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + 2 TCP 192.168.1.245:59682 -> 3.3.3.3:444 [proto: 350/CustomProtocolB][IP: 350/CustomProtocolB][ClearText][Confidence: Unknown][DPI packets: 1][2 pkts/148 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][1.02 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] diff --git a/tests/cfgs/default/result/dhcp-fuzz.pcapng.out b/tests/cfgs/default/result/dhcp-fuzz.pcapng.out index fe289bbcb57..23af6fa9851 100644 --- a/tests/cfgs/default/result/dhcp-fuzz.pcapng.out +++ b/tests/cfgs/default/result/dhcp-fuzz.pcapng.out @@ -2,7 +2,7 @@ Guessed flow protos: 1 DPI Packets (UDP): 1 (1.00 pkts/flow) Confidence Match by port : 1 (flows) -Num dissector calls: 110 (110.00 diss/flow) +Num dissector calls: 111 (111.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/discord.pcap.out b/tests/cfgs/default/result/discord.pcap.out index 5d0c45e9cb5..8bcd2b66866 100644 --- a/tests/cfgs/default/result/discord.pcap.out +++ b/tests/cfgs/default/result/discord.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 0 DPI Packets (TCP): 5 (5.00 pkts/flow) DPI Packets (UDP): 60 (1.82 pkts/flow) Confidence DPI : 34 (flows) -Num dissector calls: 4012 (118.00 diss/flow) +Num dissector calls: 4039 (118.79 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/discord_mid_flow.pcap.out b/tests/cfgs/default/result/discord_mid_flow.pcap.out index ef504c43cce..a7953a3b710 100644 --- a/tests/cfgs/default/result/discord_mid_flow.pcap.out +++ b/tests/cfgs/default/result/discord_mid_flow.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 3 (3.00 pkts/flow) Confidence DPI : 1 (flows) -Num dissector calls: 145 (145.00 diss/flow) +Num dissector calls: 146 (146.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/dnscrypt-v1-and-resolver-pings.pcap.out b/tests/cfgs/default/result/dnscrypt-v1-and-resolver-pings.pcap.out index 603155ac2c7..17089cbe83b 100644 --- a/tests/cfgs/default/result/dnscrypt-v1-and-resolver-pings.pcap.out +++ b/tests/cfgs/default/result/dnscrypt-v1-and-resolver-pings.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 256 (1.04 pkts/flow) Confidence DPI : 245 (flows) -Num dissector calls: 20803 (84.91 diss/flow) +Num dissector calls: 20814 (84.96 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/513/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/dnscrypt-v2.pcap.out b/tests/cfgs/default/result/dnscrypt-v2.pcap.out index 040fb8ccab1..df9656e7c72 100644 --- a/tests/cfgs/default/result/dnscrypt-v2.pcap.out +++ b/tests/cfgs/default/result/dnscrypt-v2.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 6 (2.00 pkts/flow) Confidence DPI : 3 (flows) -Num dissector calls: 375 (125.00 diss/flow) +Num dissector calls: 378 (126.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/dnscrypt_skype_false_positive.pcapng.out b/tests/cfgs/default/result/dnscrypt_skype_false_positive.pcapng.out index 1e69087465e..e9347fc51eb 100644 --- a/tests/cfgs/default/result/dnscrypt_skype_false_positive.pcapng.out +++ b/tests/cfgs/default/result/dnscrypt_skype_false_positive.pcapng.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 2 (2.00 pkts/flow) Confidence DPI : 1 (flows) -Num dissector calls: 126 (126.00 diss/flow) +Num dissector calls: 127 (127.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/epicgames.pcapng.out b/tests/cfgs/default/result/epicgames.pcapng.out new file mode 100644 index 00000000000..1a2081119a3 --- /dev/null +++ b/tests/cfgs/default/result/epicgames.pcapng.out @@ -0,0 +1,28 @@ +Guessed flow protos: 0 + +DPI Packets (UDP): 12 (3.00 pkts/flow) +Confidence DPI : 4 (flows) +Num dissector calls: 592 (148.00 diss/flow) +LRU cache ookla: 0/0/0 (insert/search/found) +LRU cache bittorrent: 0/0/0 (insert/search/found) +LRU cache zoom: 0/0/0 (insert/search/found) +LRU cache stun: 0/0/0 (insert/search/found) +LRU cache tls_cert: 0/0/0 (insert/search/found) +LRU cache mining: 0/0/0 (insert/search/found) +LRU cache msteams: 0/0/0 (insert/search/found) +LRU cache stun_zoom: 0/0/0 (insert/search/found) +Automa host: 0/0 (search/found) +Automa domain: 0/0 (search/found) +Automa tls cert: 0/0 (search/found) +Automa risk mask: 0/0 (search/found) +Automa common alpns: 0/0 (search/found) +Patricia risk mask: 8/0 (search/found) +Patricia risk: 0/0 (search/found) +Patricia protocols: 4/4 (search/found) + +EpicGames 81 11186 4 + + 1 UDP 192.168.12.156:39322 <-> 18.157.15.184:9011 [proto: 340/EpicGames][IP: 265/AmazonAWS][Encrypted][Confidence: DPI][DPI packets: 2][cat: Game/8][10 pkts/4805 bytes <-> 9 pkts/772 bytes][Goodput ratio: 91/51][0.62 sec][bytes ratio: 0.723 (Upload)][IAT c2s/s2c min/avg/max/stddev: 0/0 43/76 163/199 53/74][Pkt Len c2s/s2c min/avg/max/stddev: 81/55 480/86 994/119 424/18][Plen Bins: 10,53,10,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + 2 UDP 192.168.12.156:37989 <-> 18.157.15.184:15011 [proto: 340/EpicGames][IP: 265/AmazonAWS][Encrypted][Confidence: DPI][DPI packets: 2][cat: Game/8][11 pkts/1143 bytes <-> 13 pkts/1296 bytes][Goodput ratio: 60/58][1.01 sec][bytes ratio: -0.063 (Mixed)][IAT c2s/s2c min/avg/max/stddev: 19/0 116/76 455/433 133/121][Pkt Len c2s/s2c min/avg/max/stddev: 81/55 104/100 146/192 25/40][Plen Bins: 8,63,12,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + 3 UDP 192.168.12.156:47446 <-> 18.157.15.184:15011 [proto: 340/EpicGames][IP: 265/AmazonAWS][Encrypted][Confidence: DPI][DPI packets: 4][cat: Game/8][11 pkts/911 bytes <-> 8 pkts/680 bytes][Goodput ratio: 49/51][4.23 sec][bytes ratio: 0.145 (Mixed)][IAT c2s/s2c min/avg/max/stddev: 0/0 384/285 1029/741 372/304][Pkt Len c2s/s2c min/avg/max/stddev: 54/55 83/85 135/98 25/17][Plen Bins: 31,63,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + 4 UDP 192.168.12.156:49693 <-> 18.157.15.184:15011 [proto: 340/EpicGames][IP: 265/AmazonAWS][Encrypted][Confidence: DPI][DPI packets: 4][cat: Game/8][11 pkts/906 bytes <-> 8 pkts/673 bytes][Goodput ratio: 49/50][4.55 sec][bytes ratio: 0.148 (Mixed)][IAT c2s/s2c min/avg/max/stddev: 0/0 420/285 1035/741 405/303][Pkt Len c2s/s2c min/avg/max/stddev: 54/55 82/84 134/98 24/17][Plen Bins: 31,63,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] diff --git a/tests/cfgs/default/result/fuzz-2006-06-26-2594.pcap.out b/tests/cfgs/default/result/fuzz-2006-06-26-2594.pcap.out index 6d4fe1e9df9..bbefbb5b8e9 100644 --- a/tests/cfgs/default/result/fuzz-2006-06-26-2594.pcap.out +++ b/tests/cfgs/default/result/fuzz-2006-06-26-2594.pcap.out @@ -6,7 +6,7 @@ DPI Packets (other): 5 (1.00 pkts/flow) Confidence Unknown : 30 (flows) Confidence Match by port : 28 (flows) Confidence DPI : 193 (flows) -Num dissector calls: 5477 (21.82 diss/flow) +Num dissector calls: 5510 (21.95 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/180/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/fuzz-2020-02-16-11740.pcap.out b/tests/cfgs/default/result/fuzz-2020-02-16-11740.pcap.out index a5302a4aad8..bf35ecf36e6 100644 --- a/tests/cfgs/default/result/fuzz-2020-02-16-11740.pcap.out +++ b/tests/cfgs/default/result/fuzz-2020-02-16-11740.pcap.out @@ -5,7 +5,7 @@ DPI Packets (other): 7 (1.00 pkts/flow) Confidence Unknown : 19 (flows) Confidence Match by port : 3 (flows) Confidence DPI : 55 (flows) -Num dissector calls: 1821 (23.65 diss/flow) +Num dissector calls: 1837 (23.86 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/66/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/geforcenow.pcapng.out b/tests/cfgs/default/result/geforcenow.pcapng.out new file mode 100644 index 00000000000..05c3add1e79 --- /dev/null +++ b/tests/cfgs/default/result/geforcenow.pcapng.out @@ -0,0 +1,33 @@ +Guessed flow protos: 0 + +DPI Packets (TCP): 7 (7.00 pkts/flow) +DPI Packets (UDP): 3 (3.00 pkts/flow) +Confidence DPI : 2 (flows) +Num dissector calls: 133 (66.50 diss/flow) +LRU cache ookla: 0/0/0 (insert/search/found) +LRU cache bittorrent: 0/0/0 (insert/search/found) +LRU cache zoom: 0/0/0 (insert/search/found) +LRU cache stun: 0/6/0 (insert/search/found) +LRU cache tls_cert: 0/0/0 (insert/search/found) +LRU cache mining: 0/0/0 (insert/search/found) +LRU cache msteams: 0/0/0 (insert/search/found) +LRU cache stun_zoom: 0/0/0 (insert/search/found) +Automa host: 1/1 (search/found) +Automa domain: 1/0 (search/found) +Automa tls cert: 0/0 (search/found) +Automa risk mask: 1/0 (search/found) +Automa common alpns: 1/1 (search/found) +Patricia risk mask: 4/0 (search/found) +Patricia risk: 0/0 (search/found) +Patricia protocols: 2/2 (search/found) + +STUN 54 20349 1 +GeForceNow 54 48651 1 + +JA3 Host Stats: + IP Address # JA3C + 1 192.168.1.245 1 + + + 1 TCP 192.168.1.245:57490 <-> 80.84.167.206:49100 [proto: 91.341/TLS.GeForceNow][IP: 342/Nvidia][Encrypted][Confidence: DPI][DPI packets: 7][cat: Game/8][27 pkts/8759 bytes <-> 27 pkts/39892 bytes][Goodput ratio: 80/96][1.34 sec][Hostname/SNI: 80-84-167-206.cloudmatchbeta.nvidiagrid.net][(Advertised) ALPNs: http/1.1][TLS Supported Versions: GREASE;TLSv1.3;TLSv1.2][bytes ratio: -0.640 (Download)][IAT c2s/s2c min/avg/max/stddev: 0/0 56/12 946/84 200/21][Pkt Len c2s/s2c min/avg/max/stddev: 66/66 324/1477 2962/2962 631/1355][Risk: ** Known Proto on Non Std Port **][Risk Score: 50][TLSv1.2][JA3C: 021c7413ddeb0d58973451b0e3b19eca][ServerNames: prod.cloudmatchbeta.nvidiagrid.net,*.cloudmatchbeta.nvidiagrid.net][JA3S: 098e26e2609212ac1bfac552fbe04127][Issuer: C=US, O=DigiCert Inc, CN=DigiCert TLS RSA SHA256 2020 CA1][Subject: C=US, ST=California, L=Santa Clara, O=NVIDIA Corporation, CN=prod.cloudmatchbeta.nvidiagrid.net][Certificate SHA-1: 8C:24:BC:2B:01:63:B9:AC:83:90:F3:A9:F9:EA:72:5E:F4:47:A2:77][Chrome][Validity: 2022-08-09 00:00:00 - 2023-08-09 23:59:59][Cipher: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256][Plen Bins: 0,23,2,0,0,5,0,0,14,0,2,0,0,0,0,0,5,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,42] + 2 UDP 192.168.1.245:52441 <-> 80.84.167.206:18452 [proto: 78/STUN][IP: 342/Nvidia][ClearText][Confidence: DPI][DPI packets: 3][cat: Network/14][21 pkts/3455 bytes <-> 33 pkts/16894 bytes][Goodput ratio: 74/92][1.03 sec][bytes ratio: -0.660 (Download)][IAT c2s/s2c min/avg/max/stddev: 0/0 51/30 360/689 91/130][Pkt Len c2s/s2c min/avg/max/stddev: 87/67 165/512 582/1222 101/514][Risk: ** Known Proto on Non Std Port **][Risk Score: 50][Risk Info: No server to client traffic][PLAIN TEXT (BffATDg/Gz0)][Plen Bins: 1,17,33,9,12,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0] diff --git a/tests/cfgs/default/result/gnutella.pcap.out b/tests/cfgs/default/result/gnutella.pcap.out index 7fb668aefdb..ce5d765f347 100644 --- a/tests/cfgs/default/result/gnutella.pcap.out +++ b/tests/cfgs/default/result/gnutella.pcap.out @@ -7,7 +7,7 @@ Confidence Unknown : 590 (flows) Confidence Match by port : 2 (flows) Confidence DPI : 167 (flows) Confidence Match by IP : 1 (flows) -Num dissector calls: 67212 (88.44 diss/flow) +Num dissector calls: 67724 (89.11 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/1779/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/gtp_false_positive.pcapng.out b/tests/cfgs/default/result/gtp_false_positive.pcapng.out index 8a77a118ec3..afeebce2672 100644 --- a/tests/cfgs/default/result/gtp_false_positive.pcapng.out +++ b/tests/cfgs/default/result/gtp_false_positive.pcapng.out @@ -3,7 +3,7 @@ Guessed flow protos: 3 DPI Packets (UDP): 7 (2.33 pkts/flow) Confidence Unknown : 1 (flows) Confidence Match by port : 2 (flows) -Num dissector calls: 398 (132.67 diss/flow) +Num dissector calls: 401 (133.67 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/9/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/h323.pcap.out b/tests/cfgs/default/result/h323.pcap.out index 85749d4ea00..3104dcef567 100644 --- a/tests/cfgs/default/result/h323.pcap.out +++ b/tests/cfgs/default/result/h323.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 0 DPI Packets (TCP): 2 (2.00 pkts/flow) DPI Packets (UDP): 2 (2.00 pkts/flow) Confidence DPI : 2 (flows) -Num dissector calls: 228 (114.00 diss/flow) +Num dissector calls: 229 (114.50 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/http_ipv6.pcap.out b/tests/cfgs/default/result/http_ipv6.pcap.out index ca3f8dadea3..7539a2e13ba 100644 --- a/tests/cfgs/default/result/http_ipv6.pcap.out +++ b/tests/cfgs/default/result/http_ipv6.pcap.out @@ -4,7 +4,7 @@ DPI Packets (TCP): 77 (5.92 pkts/flow) DPI Packets (UDP): 4 (2.00 pkts/flow) Confidence Match by port : 7 (flows) Confidence DPI : 8 (flows) -Num dissector calls: 147 (9.80 diss/flow) +Num dissector calls: 148 (9.87 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/21/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/imo.pcap.out b/tests/cfgs/default/result/imo.pcap.out index efe4a2b8c4b..cd83c6d46df 100644 --- a/tests/cfgs/default/result/imo.pcap.out +++ b/tests/cfgs/default/result/imo.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 7 (3.50 pkts/flow) Confidence DPI : 2 (flows) -Num dissector calls: 289 (144.50 diss/flow) +Num dissector calls: 291 (145.50 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/instagram.pcap.out b/tests/cfgs/default/result/instagram.pcap.out index 6fb2d8c498d..7c55cb6f5bf 100644 --- a/tests/cfgs/default/result/instagram.pcap.out +++ b/tests/cfgs/default/result/instagram.pcap.out @@ -6,7 +6,7 @@ DPI Packets (other): 1 (1.00 pkts/flow) Confidence Unknown : 1 (flows) Confidence Match by port : 7 (flows) Confidence DPI : 30 (flows) -Num dissector calls: 1311 (34.50 diss/flow) +Num dissector calls: 1312 (34.53 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/24/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/iphone.pcap.out b/tests/cfgs/default/result/iphone.pcap.out index 9d6294290a1..31f2e068f08 100644 --- a/tests/cfgs/default/result/iphone.pcap.out +++ b/tests/cfgs/default/result/iphone.pcap.out @@ -5,7 +5,7 @@ DPI Packets (UDP): 55 (1.77 pkts/flow) DPI Packets (other): 5 (1.00 pkts/flow) Confidence Match by port : 1 (flows) Confidence DPI : 50 (flows) -Num dissector calls: 349 (6.84 diss/flow) +Num dissector calls: 350 (6.86 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/kontiki.pcap.out b/tests/cfgs/default/result/kontiki.pcap.out index 946b301eea0..7603abb5826 100644 --- a/tests/cfgs/default/result/kontiki.pcap.out +++ b/tests/cfgs/default/result/kontiki.pcap.out @@ -4,7 +4,7 @@ DPI Packets (UDP): 6 (1.50 pkts/flow) DPI Packets (other): 4 (1.00 pkts/flow) Confidence Unknown : 2 (flows) Confidence DPI : 6 (flows) -Num dissector calls: 322 (40.25 diss/flow) +Num dissector calls: 324 (40.50 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/6/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/line.pcap.out b/tests/cfgs/default/result/line.pcap.out index 4cc5fe734d9..788ee863628 100644 --- a/tests/cfgs/default/result/line.pcap.out +++ b/tests/cfgs/default/result/line.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 0 DPI Packets (TCP): 13 (6.50 pkts/flow) DPI Packets (UDP): 40 (13.33 pkts/flow) Confidence DPI : 5 (flows) -Num dissector calls: 602 (120.40 diss/flow) +Num dissector calls: 605 (121.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/9/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/linecall_falsepositve.pcap.out b/tests/cfgs/default/result/linecall_falsepositve.pcap.out index 7bdacc2635c..460498c7b3f 100644 --- a/tests/cfgs/default/result/linecall_falsepositve.pcap.out +++ b/tests/cfgs/default/result/linecall_falsepositve.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 1 DPI Packets (UDP): 13 (13.00 pkts/flow) Confidence Unknown : 1 (flows) -Num dissector calls: 199 (199.00 diss/flow) +Num dissector calls: 200 (200.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/lru_ipv6_caches.pcapng.out b/tests/cfgs/default/result/lru_ipv6_caches.pcapng.out index 8e2e99d4d44..419a56dd988 100644 --- a/tests/cfgs/default/result/lru_ipv6_caches.pcapng.out +++ b/tests/cfgs/default/result/lru_ipv6_caches.pcapng.out @@ -4,7 +4,7 @@ DPI Packets (TCP): 9 (3.00 pkts/flow) DPI Packets (UDP): 38 (4.22 pkts/flow) Confidence DPI (cache) : 6 (flows) Confidence DPI : 6 (flows) -Num dissector calls: 1076 (89.67 diss/flow) +Num dissector calls: 1082 (90.17 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 25/12/4 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/nintendo.pcap.out b/tests/cfgs/default/result/nintendo.pcap.out index b9d30beed58..3fa9f89323b 100644 --- a/tests/cfgs/default/result/nintendo.pcap.out +++ b/tests/cfgs/default/result/nintendo.pcap.out @@ -6,7 +6,7 @@ DPI Packets (other): 2 (1.00 pkts/flow) Confidence Match by port : 1 (flows) Confidence DPI : 15 (flows) Confidence Match by IP : 5 (flows) -Num dissector calls: 1253 (59.67 diss/flow) +Num dissector calls: 1258 (59.90 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/18/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/openvpn.pcap.out b/tests/cfgs/default/result/openvpn.pcap.out index fa6c5edcfb9..5bd52eb0c09 100644 --- a/tests/cfgs/default/result/openvpn.pcap.out +++ b/tests/cfgs/default/result/openvpn.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 0 DPI Packets (TCP): 6 (6.00 pkts/flow) DPI Packets (UDP): 5 (2.50 pkts/flow) Confidence DPI : 3 (flows) -Num dissector calls: 391 (130.33 diss/flow) +Num dissector calls: 393 (131.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/ossfuzz_seed_fake_traces_1.pcapng.out b/tests/cfgs/default/result/ossfuzz_seed_fake_traces_1.pcapng.out index 8fd8abb5f92..30dc5760852 100644 --- a/tests/cfgs/default/result/ossfuzz_seed_fake_traces_1.pcapng.out +++ b/tests/cfgs/default/result/ossfuzz_seed_fake_traces_1.pcapng.out @@ -3,7 +3,7 @@ Guessed flow protos: 0 DPI Packets (TCP): 8 (1.33 pkts/flow) DPI Packets (UDP): 13 (3.25 pkts/flow) Confidence DPI : 10 (flows) -Num dissector calls: 691 (69.10 diss/flow) +Num dissector calls: 694 (69.40 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/9/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/ossfuzz_seed_fake_traces_2.pcapng.out b/tests/cfgs/default/result/ossfuzz_seed_fake_traces_2.pcapng.out index 581441c1833..70c2e8bd94a 100644 --- a/tests/cfgs/default/result/ossfuzz_seed_fake_traces_2.pcapng.out +++ b/tests/cfgs/default/result/ossfuzz_seed_fake_traces_2.pcapng.out @@ -4,7 +4,7 @@ DPI Packets (TCP): 12 (6.00 pkts/flow) DPI Packets (UDP): 4 (2.00 pkts/flow) Confidence Match by port : 1 (flows) Confidence DPI : 3 (flows) -Num dissector calls: 486 (121.50 diss/flow) +Num dissector calls: 488 (122.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/ossfuzz_seed_fake_traces_4.pcapng.out b/tests/cfgs/default/result/ossfuzz_seed_fake_traces_4.pcapng.out index d8d6a917114..bddc0ff70d2 100644 --- a/tests/cfgs/default/result/ossfuzz_seed_fake_traces_4.pcapng.out +++ b/tests/cfgs/default/result/ossfuzz_seed_fake_traces_4.pcapng.out @@ -2,7 +2,7 @@ Guessed flow protos: 1 DPI Packets (UDP): 2 (2.00 pkts/flow) Confidence Unknown : 1 (flows) -Num dissector calls: 127 (127.00 diss/flow) +Num dissector calls: 128 (128.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/pps.pcap.out b/tests/cfgs/default/result/pps.pcap.out index 0b0b6325b24..50d640ee50c 100644 --- a/tests/cfgs/default/result/pps.pcap.out +++ b/tests/cfgs/default/result/pps.pcap.out @@ -5,7 +5,7 @@ DPI Packets (UDP): 136 (3.09 pkts/flow) Confidence Unknown : 29 (flows) Confidence Match by port : 2 (flows) Confidence DPI : 76 (flows) -Num dissector calls: 5341 (49.92 diss/flow) +Num dissector calls: 5370 (50.19 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/93/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/quic.pcap.out b/tests/cfgs/default/result/quic.pcap.out index b2dc5f4f7ba..2c7cd9d0e22 100644 --- a/tests/cfgs/default/result/quic.pcap.out +++ b/tests/cfgs/default/result/quic.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 1 DPI Packets (UDP): 12 (1.20 pkts/flow) Confidence Match by port : 1 (flows) Confidence DPI : 9 (flows) -Num dissector calls: 212 (21.20 diss/flow) +Num dissector calls: 213 (21.30 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/quic_0RTT.pcap.out b/tests/cfgs/default/result/quic_0RTT.pcap.out index ff8ffde70cb..0361810194e 100644 --- a/tests/cfgs/default/result/quic_0RTT.pcap.out +++ b/tests/cfgs/default/result/quic_0RTT.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 4 (2.00 pkts/flow) Confidence DPI : 2 (flows) -Num dissector calls: 188 (94.00 diss/flow) +Num dissector calls: 189 (94.50 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/radius_false_positive.pcapng.out b/tests/cfgs/default/result/radius_false_positive.pcapng.out index d98bebd3acc..97932531136 100644 --- a/tests/cfgs/default/result/radius_false_positive.pcapng.out +++ b/tests/cfgs/default/result/radius_false_positive.pcapng.out @@ -2,7 +2,7 @@ Guessed flow protos: 1 DPI Packets (UDP): 10 (10.00 pkts/flow) Confidence Match by port : 1 (flows) -Num dissector calls: 192 (192.00 diss/flow) +Num dissector calls: 193 (193.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/raknet.pcap.out b/tests/cfgs/default/result/raknet.pcap.out index cd0bfaf3a46..492e85f2dac 100644 --- a/tests/cfgs/default/result/raknet.pcap.out +++ b/tests/cfgs/default/result/raknet.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 24 (2.00 pkts/flow) Confidence DPI : 12 (flows) -Num dissector calls: 1416 (118.00 diss/flow) +Num dissector calls: 1422 (118.50 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/rx.pcap.out b/tests/cfgs/default/result/rx.pcap.out index 12fca81e4dc..1356a2f550e 100644 --- a/tests/cfgs/default/result/rx.pcap.out +++ b/tests/cfgs/default/result/rx.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 10 (2.00 pkts/flow) Confidence DPI : 5 (flows) -Num dissector calls: 622 (124.40 diss/flow) +Num dissector calls: 627 (125.40 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/sflow.pcap.out b/tests/cfgs/default/result/sflow.pcap.out index e625c8a7049..9ccd3156c15 100644 --- a/tests/cfgs/default/result/sflow.pcap.out +++ b/tests/cfgs/default/result/sflow.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 2 (2.00 pkts/flow) Confidence DPI : 1 (flows) -Num dissector calls: 111 (111.00 diss/flow) +Num dissector calls: 112 (112.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/sip_hello.pcapng.out b/tests/cfgs/default/result/sip_hello.pcapng.out index f3b11e3b06f..e74988c41d2 100644 --- a/tests/cfgs/default/result/sip_hello.pcapng.out +++ b/tests/cfgs/default/result/sip_hello.pcapng.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 9 (9.00 pkts/flow) Confidence DPI : 1 (flows) -Num dissector calls: 189 (189.00 diss/flow) +Num dissector calls: 190 (190.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/skype_udp.pcap.out b/tests/cfgs/default/result/skype_udp.pcap.out index ad0bb5c3da7..f26093a3cb1 100644 --- a/tests/cfgs/default/result/skype_udp.pcap.out +++ b/tests/cfgs/default/result/skype_udp.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 2 (2.00 pkts/flow) Confidence DPI : 1 (flows) -Num dissector calls: 125 (125.00 diss/flow) +Num dissector calls: 126 (126.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/softether.pcap.out b/tests/cfgs/default/result/softether.pcap.out index da1aac43f5a..efe93e701d9 100644 --- a/tests/cfgs/default/result/softether.pcap.out +++ b/tests/cfgs/default/result/softether.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 1 DPI Packets (TCP): 4 (4.00 pkts/flow) DPI Packets (UDP): 31 (10.33 pkts/flow) Confidence DPI : 4 (flows) -Num dissector calls: 369 (92.25 diss/flow) +Num dissector calls: 371 (92.75 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/starcraft_battle.pcap.out b/tests/cfgs/default/result/starcraft_battle.pcap.out index e9efa25d0ae..0dc897efc30 100644 --- a/tests/cfgs/default/result/starcraft_battle.pcap.out +++ b/tests/cfgs/default/result/starcraft_battle.pcap.out @@ -6,7 +6,7 @@ DPI Packets (other): 1 (1.00 pkts/flow) Confidence Match by port : 12 (flows) Confidence DPI : 39 (flows) Confidence Match by IP : 1 (flows) -Num dissector calls: 1423 (27.37 diss/flow) +Num dissector calls: 1428 (27.46 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/39/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/stun.pcap.out b/tests/cfgs/default/result/stun.pcap.out index efbb0b82c24..a5ef1d2c5e2 100644 --- a/tests/cfgs/default/result/stun.pcap.out +++ b/tests/cfgs/default/result/stun.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 0 DPI Packets (TCP): 4 (4.00 pkts/flow) DPI Packets (UDP): 13 (4.33 pkts/flow) Confidence DPI : 4 (flows) -Num dissector calls: 578 (144.50 diss/flow) +Num dissector calls: 581 (145.25 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/stun_signal.pcapng.out b/tests/cfgs/default/result/stun_signal.pcapng.out index 2417ed78e3f..aaafdd26d99 100644 --- a/tests/cfgs/default/result/stun_signal.pcapng.out +++ b/tests/cfgs/default/result/stun_signal.pcapng.out @@ -4,7 +4,7 @@ DPI Packets (UDP): 72 (3.43 pkts/flow) DPI Packets (other): 2 (1.00 pkts/flow) Confidence DPI (partial) : 1 (flows) Confidence DPI : 22 (flows) -Num dissector calls: 2298 (99.91 diss/flow) +Num dissector calls: 2313 (100.57 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/24/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/synscan.pcap.out b/tests/cfgs/default/result/synscan.pcap.out index cdc2054ce60..f860ca8d6d5 100644 --- a/tests/cfgs/default/result/synscan.pcap.out +++ b/tests/cfgs/default/result/synscan.pcap.out @@ -124,7 +124,7 @@ iSCSI 2 116 2 44 TCP 172.16.0.8:36050 -> 64.13.134.52:2605 [proto: 13/BGP][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: Network/14][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 45 TCP 172.16.0.8:36050 -> 64.13.134.52:3000 [proto: 26/ntop][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: Network/14][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 46 TCP 172.16.0.8:36050 -> 64.13.134.52:3128 [proto: 131/HTTP_Proxy][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: Web/5][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 47 TCP 172.16.0.8:36050 -> 64.13.134.52:3260 [proto: 340/iSCSI][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + 47 TCP 172.16.0.8:36050 -> 64.13.134.52:3260 [proto: 343/iSCSI][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 48 TCP 172.16.0.8:36050 -> 64.13.134.52:3306 [proto: 20/MySQL][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: Database/11][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 49 TCP 172.16.0.8:36050 -> 64.13.134.52:3389 [proto: 88/RDP][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: RemoteAccess/12][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Desktop/File Sharing **** Unidirectional Traffic **][Risk Score: 20][Risk Info: No server to client traffic / Found RDP][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 50 TCP 172.16.0.8:36050 -> 64.13.134.52:4343 [proto: 170/Whois-DAS][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: Network/14][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] @@ -188,7 +188,7 @@ iSCSI 2 116 2 108 TCP 172.16.0.8:36051 -> 64.13.134.52:2605 [proto: 13/BGP][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: Network/14][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 109 TCP 172.16.0.8:36051 -> 64.13.134.52:3000 [proto: 26/ntop][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: Network/14][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 110 TCP 172.16.0.8:36051 -> 64.13.134.52:3128 [proto: 131/HTTP_Proxy][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: Web/5][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - 111 TCP 172.16.0.8:36051 -> 64.13.134.52:3260 [proto: 340/iSCSI][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + 111 TCP 172.16.0.8:36051 -> 64.13.134.52:3260 [proto: 343/iSCSI][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 112 TCP 172.16.0.8:36051 -> 64.13.134.52:3306 [proto: 20/MySQL][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: Database/11][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 113 TCP 172.16.0.8:36051 -> 64.13.134.52:3389 [proto: 88/RDP][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: RemoteAccess/12][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Desktop/File Sharing **** Unidirectional Traffic **][Risk Score: 20][Risk Info: No server to client traffic / Found RDP][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 114 TCP 172.16.0.8:36051 -> 64.13.134.52:4343 [proto: 170/Whois-DAS][IP: 0/Unknown][ClearText][Confidence: Match by port][DPI packets: 1][cat: Network/14][1 pkts/58 bytes -> 0 pkts/0 bytes][Goodput ratio: 0/0][< 1 sec][Risk: ** Unidirectional Traffic **][Risk Score: 10][Risk Info: No server to client traffic][Plen Bins: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] diff --git a/tests/cfgs/default/result/teams.pcap.out b/tests/cfgs/default/result/teams.pcap.out index 8dba8dd7554..db1acf5db45 100644 --- a/tests/cfgs/default/result/teams.pcap.out +++ b/tests/cfgs/default/result/teams.pcap.out @@ -7,7 +7,7 @@ Confidence Unknown : 1 (flows) Confidence Match by port : 1 (flows) Confidence DPI (partial) : 5 (flows) Confidence DPI : 76 (flows) -Num dissector calls: 493 (5.94 diss/flow) +Num dissector calls: 494 (5.95 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/9/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/teamspeak3.pcap.out b/tests/cfgs/default/result/teamspeak3.pcap.out index 5c12584ab58..7ed97acae4c 100644 --- a/tests/cfgs/default/result/teamspeak3.pcap.out +++ b/tests/cfgs/default/result/teamspeak3.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 4 (2.00 pkts/flow) Confidence DPI : 2 (flows) -Num dissector calls: 198 (99.00 diss/flow) +Num dissector calls: 199 (99.50 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/teamviewer.pcap.out b/tests/cfgs/default/result/teamviewer.pcap.out index 27a898acdf6..84a211f7cc9 100644 --- a/tests/cfgs/default/result/teamviewer.pcap.out +++ b/tests/cfgs/default/result/teamviewer.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 0 DPI Packets (TCP): 4 (4.00 pkts/flow) DPI Packets (UDP): 4 (4.00 pkts/flow) Confidence DPI : 2 (flows) -Num dissector calls: 152 (76.00 diss/flow) +Num dissector calls: 153 (76.50 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/telegram.pcap.out b/tests/cfgs/default/result/telegram.pcap.out index 96a0db11aab..4e7d20706e0 100644 --- a/tests/cfgs/default/result/telegram.pcap.out +++ b/tests/cfgs/default/result/telegram.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 5 DPI Packets (UDP): 81 (1.69 pkts/flow) Confidence Unknown : 2 (flows) Confidence DPI : 46 (flows) -Num dissector calls: 1484 (30.92 diss/flow) +Num dissector calls: 1486 (30.96 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/6/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/tftp.pcap.out b/tests/cfgs/default/result/tftp.pcap.out index d38dd91fcb9..976b9b3216a 100644 --- a/tests/cfgs/default/result/tftp.pcap.out +++ b/tests/cfgs/default/result/tftp.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 13 (1.86 pkts/flow) Confidence DPI : 7 (flows) -Num dissector calls: 311 (44.43 diss/flow) +Num dissector calls: 313 (44.71 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/toca-boca.pcap.out b/tests/cfgs/default/result/toca-boca.pcap.out index 621c28b328e..ffd050c98ab 100644 --- a/tests/cfgs/default/result/toca-boca.pcap.out +++ b/tests/cfgs/default/result/toca-boca.pcap.out @@ -3,7 +3,7 @@ Guessed flow protos: 4 DPI Packets (UDP): 21 (1.00 pkts/flow) Confidence Match by port : 4 (flows) Confidence DPI : 17 (flows) -Num dissector calls: 457 (21.76 diss/flow) +Num dissector calls: 461 (21.95 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/12/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/viber.pcap.out b/tests/cfgs/default/result/viber.pcap.out index 9056fa2e0ff..39c1a368f77 100644 --- a/tests/cfgs/default/result/viber.pcap.out +++ b/tests/cfgs/default/result/viber.pcap.out @@ -5,7 +5,7 @@ DPI Packets (UDP): 27 (1.93 pkts/flow) DPI Packets (other): 2 (1.00 pkts/flow) Confidence Match by port : 4 (flows) Confidence DPI : 25 (flows) -Num dissector calls: 435 (15.00 diss/flow) +Num dissector calls: 436 (15.03 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/12/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/webex.pcap.out b/tests/cfgs/default/result/webex.pcap.out index 11146fb4604..76bf024c789 100644 --- a/tests/cfgs/default/result/webex.pcap.out +++ b/tests/cfgs/default/result/webex.pcap.out @@ -5,7 +5,7 @@ DPI Packets (UDP): 14 (7.00 pkts/flow) Confidence Match by port : 3 (flows) Confidence DPI : 53 (flows) Confidence Match by IP : 1 (flows) -Num dissector calls: 268 (4.70 diss/flow) +Num dissector calls: 269 (4.72 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/12/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/weibo.pcap.out b/tests/cfgs/default/result/weibo.pcap.out index 91d588442b8..53367fe4f78 100644 --- a/tests/cfgs/default/result/weibo.pcap.out +++ b/tests/cfgs/default/result/weibo.pcap.out @@ -4,7 +4,7 @@ DPI Packets (TCP): 100 (3.33 pkts/flow) DPI Packets (UDP): 43 (3.07 pkts/flow) Confidence Match by port : 21 (flows) Confidence DPI : 23 (flows) -Num dissector calls: 516 (11.73 diss/flow) +Num dissector calls: 518 (11.77 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/63/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/wireguard.pcap.out b/tests/cfgs/default/result/wireguard.pcap.out index 51199156d81..b47f850717c 100644 --- a/tests/cfgs/default/result/wireguard.pcap.out +++ b/tests/cfgs/default/result/wireguard.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 0 DPI Packets (UDP): 6 (3.00 pkts/flow) Confidence DPI : 2 (flows) -Num dissector calls: 259 (129.50 diss/flow) +Num dissector calls: 261 (130.50 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/zoom2.pcap.out b/tests/cfgs/default/result/zoom2.pcap.out index a3613f3f170..8b9ff753449 100644 --- a/tests/cfgs/default/result/zoom2.pcap.out +++ b/tests/cfgs/default/result/zoom2.pcap.out @@ -4,7 +4,7 @@ DPI Packets (TCP): 8 (8.00 pkts/flow) DPI Packets (UDP): 15 (5.00 pkts/flow) DPI Packets (other): 1 (1.00 pkts/flow) Confidence DPI : 5 (flows) -Num dissector calls: 485 (97.00 diss/flow) +Num dissector calls: 488 (97.60 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/0/0 (insert/search/found) LRU cache zoom: 1/0/0 (insert/search/found) diff --git a/tests/cfgs/default/result/zoom_p2p.pcapng.out b/tests/cfgs/default/result/zoom_p2p.pcapng.out index 539f608ec1a..664406a81c8 100644 --- a/tests/cfgs/default/result/zoom_p2p.pcapng.out +++ b/tests/cfgs/default/result/zoom_p2p.pcapng.out @@ -4,7 +4,7 @@ DPI Packets (UDP): 52 (5.20 pkts/flow) DPI Packets (other): 2 (1.00 pkts/flow) Confidence DPI (partial cache): 4 (flows) Confidence DPI : 8 (flows) -Num dissector calls: 792 (66.00 diss/flow) +Num dissector calls: 796 (66.33 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/12/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/disable_protocols/result/dns_long_domainname.pcap.out b/tests/cfgs/disable_protocols/result/dns_long_domainname.pcap.out index e8a6aa07e2a..2854544befc 100644 --- a/tests/cfgs/disable_protocols/result/dns_long_domainname.pcap.out +++ b/tests/cfgs/disable_protocols/result/dns_long_domainname.pcap.out @@ -2,7 +2,7 @@ Guessed flow protos: 1 DPI Packets (UDP): 2 (2.00 pkts/flow) Confidence Match by IP : 1 (flows) -Num dissector calls: 125 (125.00 diss/flow) +Num dissector calls: 126 (126.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/tests/cfgs/disable_protocols/result/quic-mvfst-27.pcapng.out b/tests/cfgs/disable_protocols/result/quic-mvfst-27.pcapng.out index 31ce158e77c..a1a4c658b03 100644 --- a/tests/cfgs/disable_protocols/result/quic-mvfst-27.pcapng.out +++ b/tests/cfgs/disable_protocols/result/quic-mvfst-27.pcapng.out @@ -2,7 +2,7 @@ Guessed flow protos: 1 DPI Packets (UDP): 13 (13.00 pkts/flow) Confidence Match by IP : 1 (flows) -Num dissector calls: 185 (185.00 diss/flow) +Num dissector calls: 186 (186.00 diss/flow) LRU cache ookla: 0/0/0 (insert/search/found) LRU cache bittorrent: 0/3/0 (insert/search/found) LRU cache zoom: 0/0/0 (insert/search/found) diff --git a/utils/asn_update.sh b/utils/asn_update.sh index 86ade7b42ae..423ae54ad85 100755 --- a/utils/asn_update.sh +++ b/utils/asn_update.sh @@ -184,6 +184,16 @@ DEST=../src/lib/inc_generated/ndpi_asn_hulu.c.inc create_list NDPI_PROTOCOL_HULU $DEST "AS23286" echo "(3) Hulu IPs are available in $DEST" +echo "(1) Downloading EpicGames.." +DEST=../src/lib/inc_generated/ndpi_asn_epicgames.c.inc +create_list NDPI_PROTOCOL_EPICGAMES $DEST "AS4356" "AS397645" "AS395701" "AS393326" +echo "(3) EpicGames IPs are available in $DEST" + +echo "(1) Downloading Nvidia..." +DEST=../src/lib/inc_generated/ndpi_asn_nvidia.c.inc +create_list NDPI_PROTOCOL_NVIDIA $DEST "AS60977" "AS50889" "AS20347" "AS11414" +echo "(3) Nvidia IPs are available in $DEST" + if [ ${TOTAL_ASN} -eq ${FAILED_ASN} ]; then printf '%s: %s\n' "${0}" "All download(s) failed, ./get_routes_by_asn.sh broken?" exit 1 diff --git a/windows/nDPI.vcxproj b/windows/nDPI.vcxproj index 0c831dc3b75..a5885dbe9f1 100644 --- a/windows/nDPI.vcxproj +++ b/windows/nDPI.vcxproj @@ -156,6 +156,7 @@ + diff --git a/windows/nDPI.vcxproj.filters b/windows/nDPI.vcxproj.filters index 26fbd988a5e..b8639e19f29 100644 --- a/windows/nDPI.vcxproj.filters +++ b/windows/nDPI.vcxproj.filters @@ -21,6 +21,7 @@ +