aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--example/ndpiReader.c12
-rw-r--r--src/include/ndpi_api.h6
-rw-r--r--src/include/ndpi_typedefs.h1
-rw-r--r--src/lib/ndpi_utils.c48
4 files changed, 65 insertions, 2 deletions
diff --git a/example/ndpiReader.c b/example/ndpiReader.c
index 2c2e69651..fe2355f75 100644
--- a/example/ndpiReader.c
+++ b/example/ndpiReader.c
@@ -3092,6 +3092,7 @@ void serializerUnitTest() {
snprintf(vbuf, sizeof(vbuf), "World %u", i);
assert(ndpi_serialize_uint32_string(&serializer, i, "Hello") != -1);
assert(ndpi_serialize_string_string(&serializer, kbuf, vbuf) != -1);
+ assert(ndpi_serialize_string_uint32(&serializer, kbuf, i*i) != -1);
}
if(trace)
@@ -3136,6 +3137,17 @@ void serializerUnitTest() {
}
break;
+ case ndpi_serialization_string_uint32:
+ assert(ndpi_deserialize_string_uint32(&deserializer, &ks, &v32) != -1);
+ if(trace) {
+ u_int8_t bkpk = ks.str[ks.str_len];
+
+ ks.str[ks.str_len] = '\0';
+ printf("%s=%u\n", ks.str, v32);
+ ks.str[ks.str_len] = bkpk;
+ }
+ break;
+
default:
break;
}
diff --git a/src/include/ndpi_api.h b/src/include/ndpi_api.h
index c6666cda5..54d8837e4 100644
--- a/src/include/ndpi_api.h
+++ b/src/include/ndpi_api.h
@@ -825,8 +825,8 @@ extern "C" {
u_int32_t key, char *value);
int ndpi_serialize_string_string(ndpi_serializer *serializer,
char *key, char *value);
- int ndpi_serialize_string_string(ndpi_serializer *serializer,
- char *key, char *value);
+ int ndpi_serialize_string_uint32(ndpi_serializer *serializer,
+ char *key, u_int32_t value);
/* **** */
int ndpi_init_deserializer(ndpi_deserializer *deserializer,
@@ -843,6 +843,8 @@ extern "C" {
u_int32_t *key, ndpi_string *value);
int ndpi_deserialize_string_string(ndpi_deserializer *deserializer,
ndpi_string *key, ndpi_string *value);
+ int ndpi_deserialize_string_uint32(ndpi_deserializer *deserializer,
+ ndpi_string *key, u_int32_t *value);
#ifdef __cplusplus
}
diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h
index 820973874..72547bc4a 100644
--- a/src/include/ndpi_typedefs.h
+++ b/src/include/ndpi_typedefs.h
@@ -1270,6 +1270,7 @@ typedef enum {
ndpi_serialization_uint32_uint32,
ndpi_serialization_uint32_string,
ndpi_serialization_string_string,
+ ndpi_serialization_string_uint32,
} ndpi_serialization_element_type;
typedef struct {
diff --git a/src/lib/ndpi_utils.c b/src/lib/ndpi_utils.c
index 9dcb5fda3..641c1091f 100644
--- a/src/lib/ndpi_utils.c
+++ b/src/lib/ndpi_utils.c
@@ -881,6 +881,33 @@ int ndpi_serialize_string_string(ndpi_serializer *serializer,
}
/* ********************************** */
+
+int ndpi_serialize_string_uint32(ndpi_serializer *serializer,
+ char *key, u_int32_t value) {
+ u_int32_t klen = strlen(key);
+ u_int32_t needed = 1 /* type */ + 2 /* key len */ + klen /* key */ + 4 /* value */;
+ u_int32_t buff_diff = serializer->buffer_size - serializer->size_used;
+
+ if(buff_diff < needed) {
+ ndpi_extend_serializer_buffer(serializer);
+ if(serializer->size_used < 10) return(-1);
+ }
+
+ serializer->buffer[serializer->size_used++] = ndpi_serialization_string_uint32;
+
+ if(serializer->fmt == ndpi_serialization_format_json) {
+ serializer->size_used += snprintf((char*)serializer->buffer, buff_diff, "%s\"%s\":%u",
+ (serializer->size_used > 2) ? "," : "",
+ key, value);
+ } else {
+ ndpi_serialize_single_string(serializer, key, klen);
+ ndpi_serialize_single_uint32(serializer, value);
+ }
+
+ return(0);
+}
+
+/* ********************************** */
/* ********************************** */
int ndpi_init_deserializer_buf(ndpi_deserializer *deserializer,
@@ -972,3 +999,24 @@ int ndpi_deserialize_string_string(ndpi_deserializer *deserializer,
} else
return(-1);
}
+
+/* ********************************** */
+
+int ndpi_deserialize_string_uint32(ndpi_deserializer *deserializer,
+ ndpi_string *key, u_int32_t *value) {
+ if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_string_uint32) {
+ u_int32_t buff_diff = deserializer->buffer_size - deserializer->size_used;
+
+ if(buff_diff < 8) return(-2);
+
+ deserializer->size_used++; /* Skip element type */
+ ndpi_deserialize_single_string(deserializer, key);
+ ndpi_deserialize_single_uint32(deserializer, value);
+
+ return(0);
+ } else
+ return(-1);
+}
+
+/* ********************************** */
+