diff options
author | Luca Deri <deri@ntop.org> | 2019-10-08 13:32:43 +0200 |
---|---|---|
committer | Luca Deri <deri@ntop.org> | 2019-10-08 13:32:43 +0200 |
commit | 0a7521060a910d0ea1d098af334c7bae8b92f0e3 (patch) | |
tree | 2a65d73c65399a091258a9c5b5db4cbd8d4191c9 /src | |
parent | 6b5a9aa9929c6229a7bb0926edcf7ae713aabef9 (diff) | |
parent | 2dfdaa4d703ae2e7d88c72c5a1bd9ca3f8258ce9 (diff) |
Merge branch 'dev' of https://github.com/ntop/nDPI into dev
Diffstat (limited to 'src')
-rw-r--r-- | src/include/ndpi_api.h | 14 | ||||
-rw-r--r-- | src/lib/ndpi_main.c | 91 |
2 files changed, 90 insertions, 15 deletions
diff --git a/src/include/ndpi_api.h b/src/include/ndpi_api.h index e5c52610e..ccca9cc25 100644 --- a/src/include/ndpi_api.h +++ b/src/include/ndpi_api.h @@ -613,6 +613,16 @@ extern "C" { int ndpi_load_protocols_file(struct ndpi_detection_module_struct *ndpi_mod, const char* path); + /** + * Read a file and load the categories + * + * @par ndpi_mod = the detection module + * @par path = the path of the file + * @return 0 if the file is loaded correctly; + * -1 else + */ + int ndpi_load_categories_file(struct ndpi_detection_module_struct *ndpi_str, const char* path); + /** * Get the total number of the supported protocols * @@ -744,10 +754,12 @@ extern "C" { */ int ndpi_match_string(void *_automa, char *string_to_match); - void ndpi_load_ip_category(struct ndpi_detection_module_struct *ndpi_struct, + int ndpi_load_ip_category(struct ndpi_detection_module_struct *ndpi_struct, const char *ip_address_and_mask, ndpi_protocol_category_t category); int ndpi_load_hostname_category(struct ndpi_detection_module_struct *ndpi_struct, const char *name_to_add, ndpi_protocol_category_t category); + int ndpi_load_category(struct ndpi_detection_module_struct *ndpi_struct, + const char *ip_or_name, ndpi_protocol_category_t category); int ndpi_enable_loaded_categories(struct ndpi_detection_module_struct *ndpi_struct); int ndpi_fill_ip_protocol_category(struct ndpi_detection_module_struct *ndpi_struct, u_int32_t saddr, diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c index cc1d48f7b..53ebff590 100644 --- a/src/lib/ndpi_main.c +++ b/src/lib/ndpi_main.c @@ -2698,6 +2698,57 @@ int ndpi_handle_rule(struct ndpi_detection_module_struct *ndpi_str, /* ******************************************************************** */ /* + * Format: + * + * <host|ip> <category_id> + * + * Notes: + * - host and category are separated by a single TAB + * - empty lines or lines starting with # are ignored + */ +int ndpi_load_categories_file(struct ndpi_detection_module_struct *ndpi_str, const char* path) { + char buffer[512], *line, *name, *category, *saveptr; + FILE *fd; + int len; + + fd = fopen(path, "r"); + + if(fd == NULL) { + NDPI_LOG_ERR(ndpi_str, "Unable to open file %s [%s]\n", path, strerror(errno)); + return(-1); + } + + while(fd) { + line = fgets(buffer, sizeof(buffer), fd); + + if(line == NULL) + break; + + len = strlen(line); + + if((len <= 1) || (line[0] == '#')) + continue; + + line[len-1] = '\0'; + name = strtok_r(line, "\t", &saveptr); + + if(name) { + category = strtok_r(NULL, "\t", &saveptr); + + if(category) + ndpi_load_category(ndpi_str, name, (ndpi_protocol_category_t) atoi(category)); + } + } + + fclose(fd); + ndpi_enable_loaded_categories(ndpi_str); + + return(0); +} + +/* ******************************************************************** */ + +/* Format: <tcp|udp>:<port>,<tcp|udp>:<port>,.....@<proto> @@ -4231,7 +4282,7 @@ void ndpi_process_extra_packet(struct ndpi_detection_module_struct *ndpi_str, /* ********************************************************************************* */ -void ndpi_load_ip_category(struct ndpi_detection_module_struct *ndpi_str, +int ndpi_load_ip_category(struct ndpi_detection_module_struct *ndpi_str, const char *ip_address_and_mask, ndpi_protocol_category_t category) { patricia_node_t *node; struct in_addr pin; @@ -4252,12 +4303,13 @@ void ndpi_load_ip_category(struct ndpi_detection_module_struct *ndpi_str, if(inet_pton(AF_INET, ipbuf, &pin) != 1) { NDPI_LOG_DBG2(ndpi_str, "Invalid ip/ip+netmask: %s\n", ip_address_and_mask); - return; + return(-1); } if((node = add_to_ptree(ndpi_str->custom_categories.ipAddresses_shadow, AF_INET, &pin, bits)) != NULL) node->value.user_value = (int)category; + return(0); } /* ********************************************************************************* */ @@ -4316,21 +4368,30 @@ int ndpi_load_hostname_category(struct ndpi_detection_module_struct *ndpi_str, /* ********************************************************************************* */ +/* Loads an IP or name category */ +int ndpi_load_category(struct ndpi_detection_module_struct *ndpi_struct, + const char *ip_or_name, ndpi_protocol_category_t category) { + int rv; + + /* Try to load as IP address first */ + rv = ndpi_load_ip_category(ndpi_struct, ip_or_name, category); + + if(rv < 0) { + /* IP load failed, load as hostname */ + rv = ndpi_load_hostname_category(ndpi_struct, ip_or_name, category); + } + + return(rv); +} + +/* ********************************************************************************* */ + int ndpi_enable_loaded_categories(struct ndpi_detection_module_struct *ndpi_str) { - int i, ip_addr[4]; + int i; /* First add the nDPI known categories matches */ - for(i=0; category_match[i].string_to_match != NULL; i++) { - if(sscanf(category_match[i].string_to_match, "%d.%d.%d.%d", &ip_addr[0], &ip_addr[1], &ip_addr[2], &ip_addr[3]) == 4){ - ndpi_load_ip_category(ndpi_str, - category_match[i].string_to_match, - category_match[i].protocol_category); - } else{ - ndpi_load_hostname_category(ndpi_str, - category_match[i].string_to_match, - category_match[i].protocol_category); - } - } + for(i=0; category_match[i].string_to_match != NULL; i++) + ndpi_load_category(ndpi_str, category_match[i].string_to_match, category_match[i].protocol_category); #ifdef HAVE_HYPERSCAN if(ndpi_str->custom_categories.num_to_load > 0) { @@ -6422,6 +6483,8 @@ const char* ndpi_get_l4_proto_name(ndpi_l4_proto_info proto) { return("TCP/UDP"); break; } + + return(""); } /* ******************************************************************** */ |