diff options
-rw-r--r-- | example/ndpiReader.c | 12 | ||||
-rw-r--r-- | src/include/ndpi_api.h | 6 | ||||
-rw-r--r-- | src/include/ndpi_typedefs.h | 1 | ||||
-rw-r--r-- | src/lib/ndpi_utils.c | 48 |
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); +} + +/* ********************************** */ + |