aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/ndpi_private.h3
-rw-r--r--src/include/ndpi_typedefs.h4
-rw-r--r--src/lib/ndpi_main.c23
-rw-r--r--src/lib/ndpi_utils.c16
-rw-r--r--src/lib/protocols/ssdp.c32
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