diff options
-rw-r--r-- | src/include/ndpi_typedefs.h | 9 | ||||
-rw-r--r-- | src/lib/ndpi_serializer.c | 80 |
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); } |