aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/ndpi_typedefs.h9
-rw-r--r--src/lib/ndpi_serializer.c80
2 files changed, 65 insertions, 24 deletions
diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h
index 31a718bde..a1d843c83 100644
--- a/src/include/ndpi_typedefs.h
+++ b/src/include/ndpi_typedefs.h
@@ -1439,8 +1439,9 @@ typedef enum {
ndpi_serialization_format_csv
} ndpi_serialization_format;
-/* Note: key supports string and uint32 (compressed to uint8/uint16) only,
- * this is also enforced by the API */
+/* Note:
+ * - up to 16 types (TLV encoding: "4 bit key type" << 4 | "4 bit value type")
+ * - key supports string and uint32 (compressed to uint8/uint16) only, this is also enforced by the API */
typedef enum {
ndpi_serialization_unknown = 0,
ndpi_serialization_end_of_record,
@@ -1453,7 +1454,9 @@ typedef enum {
ndpi_serialization_int32,
ndpi_serialization_int64,
ndpi_serialization_float,
- ndpi_serialization_string
+ ndpi_serialization_string,
+ ndpi_serialization_start_of_block,
+ ndpi_serialization_end_of_block
} ndpi_serialization_type;
#define NDPI_SERIALIZER_DEFAULT_HEADER_SIZE 1024
diff --git a/src/lib/ndpi_serializer.c b/src/lib/ndpi_serializer.c
index 83365e58c..c1f52f89e 100644
--- a/src/lib/ndpi_serializer.c
+++ b/src/lib/ndpi_serializer.c
@@ -1743,14 +1743,15 @@ int ndpi_serialize_end_of_list(ndpi_serializer *_serializer) {
/* ********************************** */
-/* Serialize start of nested block (JSON only)*/
-int ndpi_serialize_start_of_block(ndpi_serializer *_serializer,
- const char *key) {
+/* Serialize start of nested block */
+int ndpi_serialize_start_of_block_binary(ndpi_serializer *_serializer,
+ const char *key, u_int16_t klen) {
ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer;
u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
- u_int32_t needed, klen = strlen(key);
+ u_int32_t needed;
- if(serializer->fmt != ndpi_serialization_format_json)
+ if(serializer->fmt != ndpi_serialization_format_json &&
+ serializer->fmt != ndpi_serialization_format_tlv)
return(-1);
needed = 16 + klen;
@@ -1761,28 +1762,45 @@ int ndpi_serialize_start_of_block(ndpi_serializer *_serializer,
buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
}
- ndpi_serialize_json_pre(_serializer);
- serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen,
- (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff);
- buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
- serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ": {");
- buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
- ndpi_serialize_json_post(_serializer);
-
- serializer->status.flags |= NDPI_SERIALIZER_STATUS_SOB;
+ if (serializer->fmt == ndpi_serialization_format_json) {
+ ndpi_serialize_json_pre(_serializer);
+ serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen,
+ (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff);
+ buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
+ serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ": {");
+ buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
+ ndpi_serialize_json_post(_serializer);
+
+ serializer->status.flags |= NDPI_SERIALIZER_STATUS_SOB;
+ } else /* ndpi_serialization_format_tlv */ {
+ serializer->buffer.data[serializer->status.buffer.size_used++] = ndpi_serialization_start_of_block;
+ ndpi_serialize_single_string(serializer, key, klen);
+ }
return(0);
}
/* ********************************** */
+/* Serialize start of nested block */
+int ndpi_serialize_start_of_block(ndpi_serializer *_serializer,
+ const char *_key) {
+ const char *key = _key ? _key : "";
+ u_int16_t klen = strlen(key);
+
+ return ndpi_serialize_start_of_block_binary(_serializer, key, klen);
+}
+
+/* ********************************** */
+
/* Serialize end of nested block (JSON only)*/
int ndpi_serialize_end_of_block(ndpi_serializer *_serializer) {
ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer;
u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
u_int32_t needed;
- if(serializer->fmt != ndpi_serialization_format_json)
+ if(serializer->fmt != ndpi_serialization_format_json &&
+ serializer->fmt != ndpi_serialization_format_tlv)
return(-1);
needed = 4;
@@ -1793,11 +1811,16 @@ int ndpi_serialize_end_of_block(ndpi_serializer *_serializer) {
buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
}
- if(serializer->status.flags & NDPI_SERIALIZER_STATUS_SOB) /* Empty block */
- serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_SOB;
+ if (serializer->fmt == ndpi_serialization_format_json) {
- // buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
- ndpi_serialize_json_post(_serializer);
+ if(serializer->status.flags & NDPI_SERIALIZER_STATUS_SOB) /* Empty block */
+ serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_SOB;
+
+ // buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
+ ndpi_serialize_json_post(_serializer);
+ } else {
+ serializer->buffer.data[serializer->status.buffer.size_used++] = ndpi_serialization_end_of_block;
+ }
return(0);
}
@@ -1987,9 +2010,11 @@ static inline int ndpi_deserialize_get_single_size(ndpi_private_deserializer *de
size = sizeof(float);
break;
case ndpi_serialization_string:
+ case ndpi_serialization_start_of_block:
size = ndpi_deserialize_get_single_string_size(deserializer, offset);
break;
case ndpi_serialization_end_of_record:
+ case ndpi_serialization_end_of_block:
case ndpi_serialization_unknown:
size = 0;
break;
@@ -2003,6 +2028,8 @@ static inline int ndpi_deserialize_get_single_size(ndpi_private_deserializer *de
/* ********************************** */
+/* Move the current offset (status.buffer.size_used) to point
+ * to the next element */
int ndpi_deserialize_next(ndpi_deserializer *_deserializer) {
ndpi_private_deserializer *deserializer = (ndpi_private_deserializer *) _deserializer;
u_int32_t buff_diff = deserializer->buffer.size - deserializer->status.buffer.size_used;
@@ -2077,6 +2104,7 @@ int ndpi_deserialize_key_uint32(ndpi_deserializer *_deserializer,
/* ********************************** */
+/* Return the string key for the current element */
int ndpi_deserialize_key_string(ndpi_deserializer *_deserializer,
ndpi_string *key) {
ndpi_private_deserializer *deserializer = (ndpi_private_deserializer*)_deserializer;
@@ -2297,6 +2325,7 @@ int ndpi_deserialize_value_float(ndpi_deserializer *_deserializer,
/* ********************************** */
+/* Return the string value for the current element */
int ndpi_deserialize_value_string(ndpi_deserializer *_deserializer,
ndpi_string *value) {
ndpi_private_deserializer *deserializer = (ndpi_private_deserializer*)_deserializer;
@@ -2309,12 +2338,14 @@ int ndpi_deserialize_value_string(ndpi_deserializer *_deserializer,
if(buff_diff < expected) return(-2);
kt = ndpi_deserialize_get_key_subtype(deserializer);
+
size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.buffer.size_used + expected);
if(size < 0) return(-2);
expected += size;
et = ndpi_deserialize_get_value_subtype(deserializer);
+
size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.buffer.size_used + expected);
if(size < 0) return(-2);
@@ -2391,8 +2422,14 @@ int ndpi_deserialize_clone_all(ndpi_deserializer *deserializer, ndpi_serializer
if(et == ndpi_serialization_end_of_record) {
ndpi_serialize_end_of_record(serializer);
- ndpi_deserialize_next(deserializer);
- continue;
+ goto next;
+ } else if(et == ndpi_serialization_start_of_block) {
+ ndpi_deserialize_key_string(deserializer, &ks);
+ ndpi_serialize_start_of_block_binary(serializer, ks.str, ks.str_len);
+ goto next;
+ } else if(et == ndpi_serialization_end_of_block) {
+ ndpi_serialize_end_of_block(serializer);
+ goto next;
}
key_is_string = 0;
@@ -2449,6 +2486,7 @@ int ndpi_deserialize_clone_all(ndpi_deserializer *deserializer, ndpi_serializer
return(-2);
}
+ next:
ndpi_deserialize_next(deserializer);
}