aboutsummaryrefslogtreecommitdiff
path: root/example/ndpiReader.c
diff options
context:
space:
mode:
authorIvan Nardi <12729895+IvanNardi@users.noreply.github.com>2023-06-21 09:16:20 +0200
committerGitHub <noreply@github.com>2023-06-21 09:16:20 +0200
commit3608ab01b61bde1b7ac88baa448fe37724a313db (patch)
tree6e3223c4908f82bf057c0d2477c2780baf9fc8b6 /example/ndpiReader.c
parent04be3080921507b69899d01bc79be86181e6f536 (diff)
STUN: keep monitoring/processing STUN flows (#2012)
Look for RTP packets in the STUN sessions. TODO: tell RTP from RTCP
Diffstat (limited to 'example/ndpiReader.c')
-rw-r--r--example/ndpiReader.c47
1 files changed, 45 insertions, 2 deletions
diff --git a/example/ndpiReader.c b/example/ndpiReader.c
index 5eb47f741..4e4b74491 100644
--- a/example/ndpiReader.c
+++ b/example/ndpiReader.c
@@ -90,6 +90,8 @@ static u_int8_t ignore_vlanid = 0;
/** User preferences **/
u_int8_t enable_protocol_guess = 1, enable_payload_analyzer = 0, num_bin_clusters = 0, extcap_exit = 0;
u_int8_t verbose = 0, enable_flow_stats = 0;
+int stun_monitoring_pkts_to_process = -1; /* Default */
+int stun_monitoring_flags = -1; /* Default */
int nDPI_LogLevel = 0;
char *_debug_protocols = NULL;
char *_disabled_protocols = NULL;
@@ -511,8 +513,10 @@ static void help(u_int long_help) {
" -A | Dump internal statistics (LRU caches / Patricia trees / Ahocarasick automas / ...\n"
" -M | Memory allocation stats on data-path (only by the library). It works only on single-thread configuration\n"
" -Z proto:value | Set this value of aggressiveness for this protocol (0 to disable it). This flag can be used multiple times\n"
- " --lru-cache-size=NAME:size | Specify the size for this LRU cache (0 to disable it). This flag can be used multiple times\n"
- " --lru-cache-ttl=NAME:size | Specify the TTL [in seconds] for this LRU cache (0 to disable it). This flag can be used multiple times\n"
+ " --lru-cache-size=NAME:size | Specify the size for this LRU cache (0 to disable it). This flag can be used multiple times\n"
+ " --lru-cache-ttl=NAME:size | Specify the TTL [in seconds] for this LRU cache (0 to disable it). This flag can be used multiple times\n"
+ " --stun-monitoring=<pkts>:<flags> | Configure STUN monitoring: keep monitoring STUN session for <pkts> more pkts looking for RTP\n"
+ " | (0:0 to disable the feature); set the specified features in <flags>\n"
,
human_readeable_string_len,
min_pattern_len, max_pattern_len, max_num_packets_per_flow, max_packet_payload_dissection,
@@ -566,6 +570,8 @@ static void help(u_int long_help) {
#define OPTLONG_VALUE_LRU_CACHE_SIZE 1000
#define OPTLONG_VALUE_LRU_CACHE_TTL 1001
+#define OPTLONG_VALUE_STUN_MONITORING 2000
+
static struct option longopts[] = {
/* mandatory extcap options */
{ "extcap-interfaces", no_argument, NULL, '0'},
@@ -608,6 +614,7 @@ static struct option longopts[] = {
{ "lru-cache-size", required_argument, NULL, OPTLONG_VALUE_LRU_CACHE_SIZE},
{ "lru-cache-ttl", required_argument, NULL, OPTLONG_VALUE_LRU_CACHE_TTL},
+ { "stun-monitoring", required_argument, NULL, OPTLONG_VALUE_STUN_MONITORING},
{0, 0, 0, 0}
};
@@ -844,6 +851,27 @@ static int parse_cache_param(char *param, int *cache_idx, int *param_value)
return -1;
}
+static int parse_two_unsigned_integer(char *param, u_int32_t *num1, u_int32_t *num2)
+{
+ char *saveptr, *tmp_str, *num1_str, *num2_str;
+
+ tmp_str = ndpi_strdup(param);
+ if(tmp_str) {
+ num1_str = strtok_r(tmp_str, ":", &saveptr);
+ if(num1_str) {
+ num2_str = strtok_r(NULL, ":", &saveptr);
+ if(num2_str) {
+ *num1 = atoi(num1_str);
+ *num2 = atoi(num2_str);
+ ndpi_free(tmp_str);
+ return 0;
+ }
+ }
+ }
+ ndpi_free(tmp_str);
+ return -1;
+}
+
/* ********************************** */
/**
@@ -861,6 +889,7 @@ static void parseOptions(int argc, char **argv) {
#endif
#endif
int cache_idx, cache_size, cache_ttl;
+ u_int32_t num_pkts, flags;
#ifdef USE_DPDK
{
@@ -1190,6 +1219,15 @@ static void parseOptions(int argc, char **argv) {
lru_cache_ttls[cache_idx] = cache_ttl;
break;
+ case OPTLONG_VALUE_STUN_MONITORING:
+ if(parse_two_unsigned_integer(optarg, &num_pkts, &flags) == -1) {
+ printf("Invalid parameter [%s]\n", optarg);
+ exit(1);
+ }
+ stun_monitoring_pkts_to_process = num_pkts;
+ stun_monitoring_flags = flags;
+ break;
+
default:
#ifdef DEBUG_TRACE
if(trace) fprintf(trace, " #### Unknown option -%c: skipping it #### \n", opt);
@@ -2625,6 +2663,11 @@ static void setupDetection(u_int16_t thread_id, pcap_t * pcap_handle) {
ndpi_set_protocol_aggressiveness(ndpi_thread_info[thread_id].workflow->ndpi_struct, i, aggressiveness[i]);
}
+ if(stun_monitoring_pkts_to_process != -1 &&
+ stun_monitoring_flags != -1)
+ ndpi_set_monitoring_state(ndpi_thread_info[thread_id].workflow->ndpi_struct, NDPI_PROTOCOL_STUN,
+ stun_monitoring_pkts_to_process, stun_monitoring_flags);
+
ndpi_finalize_initialization(ndpi_thread_info[thread_id].workflow->ndpi_struct);
if(enable_doh_dot_detection)