diff options
-rw-r--r-- | src/include/ndpi_private.h | 3 | ||||
-rw-r--r-- | src/include/ndpi_typedefs.h | 4 | ||||
-rw-r--r-- | src/lib/ndpi_main.c | 23 | ||||
-rw-r--r-- | src/lib/ndpi_utils.c | 16 | ||||
-rw-r--r-- | src/lib/protocols/ssdp.c | 32 |
5 files changed, 78 insertions, 0 deletions
diff --git a/src/include/ndpi_private.h b/src/include/ndpi_private.h index accafdcd2..007038023 100644 --- a/src/include/ndpi_private.h +++ b/src/include/ndpi_private.h @@ -140,6 +140,9 @@ struct ndpi_packet_struct { struct ndpi_int_one_line_struct location_smart_speaker_audio; struct ndpi_int_one_line_struct nt; struct ndpi_int_one_line_struct nts; + struct ndpi_int_one_line_struct man; + struct ndpi_int_one_line_struct mx; + struct ndpi_int_one_line_struct st; u_int16_t l3_packet_len; u_int16_t payload_packet_len; diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h index 30b208441..e515840c9 100644 --- a/src/include/ndpi_typedefs.h +++ b/src/include/ndpi_typedefs.h @@ -1595,6 +1595,10 @@ struct ndpi_flow_struct { char *nt; char *nts; char *server; + char *man; + char *mx; + char *st; + char *user_agent; } ssdp; } protos; diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c index 8dba3f920..1831b7ecf 100644 --- a/src/lib/ndpi_main.c +++ b/src/lib/ndpi_main.c @@ -6906,6 +6906,18 @@ void ndpi_free_flow_data(struct ndpi_flow_struct* flow) { if(flow->protos.ssdp.method) ndpi_free(flow->protos.ssdp.method); + + if(flow->protos.ssdp.man) + ndpi_free(flow->protos.ssdp.man); + + if(flow->protos.ssdp.mx) + ndpi_free(flow->protos.ssdp.mx); + + if(flow->protos.ssdp.st) + ndpi_free(flow->protos.ssdp.st); + + if(flow->protos.ssdp.user_agent) + ndpi_free(flow->protos.ssdp.user_agent); } if(flow->tls_quic.message[0].buffer) @@ -8550,6 +8562,9 @@ static void ndpi_reset_packet_line_info(struct ndpi_packet_struct *packet) { packet->location_smart_speaker_audio.ptr = NULL, packet->location_smart_speaker_audio.len = 0; packet->nt.ptr = NULL, packet->nt.len = 0; packet->nts.ptr = NULL, packet->nts.len = 0; + packet->man.ptr = NULL, packet->man.len = 0; + packet->mx.ptr = NULL, packet->mx.len = 0; + packet->st.ptr = NULL, packet->st.len = 0; } /* ********************************************************************************* */ @@ -9319,10 +9334,14 @@ static void parse_single_packet_line(struct ndpi_detection_module_struct *ndpi_s { NULL, NULL} }; struct header_line headers_s[] = { { "Server:", &packet->server_line }, { "SECURELOCATION.UPNP.ORG:", &packet->securelocation_upnp }, + { "ST", &packet->st }, { NULL, NULL} }; struct header_line headers_l[] = { { "LOCATION:", &packet->location }, { "LOCATION.SMARTSPEAKER.AUDIO:", &packet->location_smart_speaker_audio }, { NULL, NULL}}; + struct header_line headers_m[] = { { "MAN:", &packet->man }, + { "MX:", &packet->mx }, + { NULL, NULL}}; struct header_line headers_n[] = { { "NT:", &packet->nt }, { "NTS:", &packet->nts }, { NULL, NULL}}; @@ -9390,6 +9409,10 @@ static void parse_single_packet_line(struct ndpi_detection_module_struct *ndpi_s case 'L': hs = headers_l; break; + case 'm': + case 'M': + hs = headers_m; + break; case 'n': case 'N': hs = headers_n; diff --git a/src/lib/ndpi_utils.c b/src/lib/ndpi_utils.c index 0a3babe3f..4670931af 100644 --- a/src/lib/ndpi_utils.c +++ b/src/lib/ndpi_utils.c @@ -1659,6 +1659,22 @@ int ndpi_dpi2json(struct ndpi_detection_module_struct *ndpi_struct, ndpi_serialize_string_string(serializer, "X-SONOS-HHSECURELOCATION", flow->protos.ssdp.sonos_securelocation); } + if (flow->protos.ssdp.man) { + ndpi_serialize_string_string(serializer, "MAN", flow->protos.ssdp.man); + } + + if (flow->protos.ssdp.mx) { + ndpi_serialize_string_string(serializer, "MX", flow->protos.ssdp.mx); + } + + if (flow->protos.ssdp.st) { + ndpi_serialize_string_string(serializer, "ST", flow->protos.ssdp.st); + } + + if (flow->protos.ssdp.user_agent) { + ndpi_serialize_string_string(serializer, "USER_AGENT", flow->protos.ssdp.user_agent); + } + ndpi_serialize_end_of_block(serializer); break; diff --git a/src/lib/protocols/ssdp.c b/src/lib/protocols/ssdp.c index acaf14e47..bd9f857ba 100644 --- a/src/lib/protocols/ssdp.c +++ b/src/lib/protocols/ssdp.c @@ -176,6 +176,38 @@ static void ssdp_parse_lines(struct ndpi_detection_module_struct flow->protos.ssdp.server[packet->server_line.len] = '\0'; } } + + if (packet->man.ptr != NULL && packet->man.len > 0) { + flow->protos.ssdp.man = ndpi_malloc(packet->man.len + 1); + if (flow->protos.ssdp.man) { + memcpy(flow->protos.ssdp.man, packet->man.ptr, packet->man.len); + flow->protos.ssdp.man[packet->man.len] = '\0'; + } + } + + if (packet->mx.ptr != NULL && packet->mx.len > 0) { + flow->protos.ssdp.mx = ndpi_malloc(packet->mx.len + 1); + if (flow->protos.ssdp.mx) { + memcpy(flow->protos.ssdp.mx, packet->mx.ptr, packet->mx.len); + flow->protos.ssdp.mx[packet->mx.len] = '\0'; + } + } + + if (packet->st.ptr != NULL && packet->st.len > 0) { + flow->protos.ssdp.st = ndpi_malloc(packet->st.len + 1); + if (flow->protos.ssdp.st) { + memcpy(flow->protos.ssdp.st, packet->st.ptr, packet->st.len); + flow->protos.ssdp.st[packet->st.len] = '\0'; + } + } + + if (packet->user_agent_line.ptr != NULL && packet->user_agent_line.len > 0) { + flow->protos.ssdp.user_agent = ndpi_malloc(packet->user_agent_line.len + 1); + if (flow->protos.ssdp.user_agent) { + memcpy(flow->protos.ssdp.user_agent, packet->user_agent_line.ptr, packet->user_agent_line.len); + flow->protos.ssdp.user_agent[packet->user_agent_line.len] = '\0'; + } + } } static void ndpi_int_ssdp_add_connection(struct ndpi_detection_module_struct |