diff options
author | Luca Deri <deri@ntop.org> | 2019-07-24 15:20:31 +0200 |
---|---|---|
committer | Luca Deri <deri@ntop.org> | 2019-07-24 15:20:31 +0200 |
commit | 21485683475ab6b3bb4468f142843d5f15f412f8 (patch) | |
tree | 79ad3b01aebeeb4fe8aba6d8e2cb868da717a3e4 | |
parent | 5c6c64ed1d962a564570c84d07f73ce3305804d5 (diff) |
Added int32/int64 (with sign) serialization/deserialization
-rw-r--r-- | src/include/ndpi_api.h | 8 | ||||
-rw-r--r-- | src/include/ndpi_typedefs.h | 2 | ||||
-rw-r--r-- | src/lib/ndpi_utils.c | 138 |
3 files changed, 148 insertions, 0 deletions
diff --git a/src/include/ndpi_api.h b/src/include/ndpi_api.h index 41ae2fbaa..20dd048ad 100644 --- a/src/include/ndpi_api.h +++ b/src/include/ndpi_api.h @@ -821,6 +821,10 @@ extern "C" { int ndpi_init_serializer(ndpi_serializer *serializer, ndpi_serialization_format fmt); void ndpi_term_serializer(ndpi_serializer *serializer); void ndpi_reset_serializer(ndpi_serializer *serializer); + int ndpi_serialize_string_int32(ndpi_serializer *serializer, + const char *key, int32_t value); + int ndpi_serialize_string_int64(ndpi_serializer *serializer, + const char *key, int64_t value); int ndpi_serialize_uint32_uint32(ndpi_serializer *serializer, u_int32_t key, u_int32_t value); int ndpi_serialize_uint32_uint64(ndpi_serializer *serializer, @@ -850,6 +854,10 @@ extern "C" { u_int32_t *key, u_int64_t *value); int ndpi_deserialize_uint32_string(ndpi_deserializer *deserializer, u_int32_t *key, ndpi_string *value); + int ndpi_deserialize_string_int32(ndpi_deserializer *deserializer, + ndpi_string *key, int32_t *value); + int ndpi_deserialize_string_int64(ndpi_deserializer *deserializer, + ndpi_string *key, int64_t *value); int ndpi_deserialize_string_uint32(ndpi_deserializer *deserializer, ndpi_string *key, u_int32_t *value); int ndpi_deserialize_string_uint64(ndpi_deserializer *deserializer, diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h index 31e5c0056..c124cf5fc 100644 --- a/src/include/ndpi_typedefs.h +++ b/src/include/ndpi_typedefs.h @@ -1314,6 +1314,8 @@ typedef enum { ndpi_serialization_uint32_uint32, ndpi_serialization_uint32_uint64, ndpi_serialization_uint32_string, + ndpi_serialization_string_int32, + ndpi_serialization_string_int64, ndpi_serialization_string_uint32, ndpi_serialization_string_uint64, ndpi_serialization_string_string, diff --git a/src/lib/ndpi_utils.c b/src/lib/ndpi_utils.c index 992eaa297..8959aa05e 100644 --- a/src/lib/ndpi_utils.c +++ b/src/lib/ndpi_utils.c @@ -916,6 +916,14 @@ static void ndpi_deserialize_single_uint32(ndpi_serializer *deserializer, /* ********************************** */ +static void ndpi_deserialize_single_int32(ndpi_serializer *deserializer, + int32_t *s) { + *s = ntohl(*((int32_t *) &deserializer->buffer[deserializer->size_used])); + deserializer->size_used += sizeof(int32_t); +} + +/* ********************************** */ + static void ndpi_deserialize_single_uint64(ndpi_serializer *deserializer, u_int64_t *s) { *s = ndpi_ntohll(*(u_int64_t*)&deserializer->buffer[deserializer->size_used]); @@ -924,6 +932,14 @@ static void ndpi_deserialize_single_uint64(ndpi_serializer *deserializer, /* ********************************** */ +static void ndpi_deserialize_single_int64(ndpi_serializer *deserializer, + int64_t *s) { + *s = ndpi_ntohll(*(int64_t*)&deserializer->buffer[deserializer->size_used]); + deserializer->size_used += sizeof(int64_t); +} + +/* ********************************** */ + static void ndpi_deserialize_single_string(ndpi_serializer *deserializer, ndpi_string *v) { v->str_len = ntohs(*((u_int16_t *) &deserializer->buffer[deserializer->size_used])); @@ -1100,6 +1116,84 @@ int ndpi_serialize_uint32_string(ndpi_serializer *serializer, /* ********************************** */ +int ndpi_serialize_string_int32(ndpi_serializer *serializer, + const char *key, int32_t value) { + u_int16_t klen = strlen(key); + u_int32_t buff_diff = serializer->buffer_size - serializer->size_used; + u_int32_t needed = + sizeof(u_int8_t) /* type */ + + sizeof(u_int16_t) /* key len */ + + klen /* key */ + + sizeof(u_int32_t); + + if(serializer->fmt == ndpi_serialization_format_json) + needed += 16 + klen; + + if(buff_diff < needed) { + if (ndpi_extend_serializer_buffer(serializer, needed - buff_diff) < 0) + return(-1); + buff_diff = serializer->buffer_size - serializer->size_used; + } + + if(serializer->fmt == ndpi_serialization_format_json) { + ndpi_serialize_json_pre(serializer); + serializer->size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer[serializer->size_used], buff_diff); + buff_diff = serializer->buffer_size - serializer->size_used; + serializer->size_used += snprintf((char *) &serializer->buffer[serializer->size_used], buff_diff, + ":%d", value); + ndpi_serialize_json_post(serializer); + } else { + serializer->buffer[serializer->size_used++] = ndpi_serialization_string_int32; + + ndpi_serialize_single_string(serializer, key, klen); + ndpi_serialize_single_uint32(serializer, value); + } + + return(0); +} + +/* ********************************** */ + +int ndpi_serialize_string_int64(ndpi_serializer *serializer, + const char *key, int64_t value) { + u_int16_t klen = strlen(key); + u_int32_t buff_diff = serializer->buffer_size - serializer->size_used; + u_int32_t needed = + sizeof(u_int8_t) /* type */ + + sizeof(u_int16_t) /* key len */ + + klen /* key */ + + sizeof(u_int32_t); + + if(serializer->fmt == ndpi_serialization_format_json) + needed += 16 + klen; + + if(buff_diff < needed) { + if (ndpi_extend_serializer_buffer(serializer, needed - buff_diff) < 0) + return(-1); + buff_diff = serializer->buffer_size - serializer->size_used; + } + + if(serializer->fmt == ndpi_serialization_format_json) { + ndpi_serialize_json_pre(serializer); + serializer->size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer[serializer->size_used], buff_diff); + buff_diff = serializer->buffer_size - serializer->size_used; + serializer->size_used += snprintf((char *) &serializer->buffer[serializer->size_used], buff_diff, + ":%lld", value); + ndpi_serialize_json_post(serializer); + } else { + serializer->buffer[serializer->size_used++] = ndpi_serialization_string_int64; + + ndpi_serialize_single_string(serializer, key, klen); + ndpi_serialize_single_uint32(serializer, value); + } + + return(0); +} + +/* ********************************** */ + int ndpi_serialize_string_uint32(ndpi_serializer *serializer, const char *key, u_int32_t value) { u_int16_t klen = strlen(key); @@ -1347,6 +1441,50 @@ int ndpi_deserialize_uint32_string(ndpi_deserializer *deserializer, /* ********************************** */ +int ndpi_deserialize_string_int32(ndpi_deserializer *deserializer, + ndpi_string *key, int32_t *value) { + if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_string_int32) { + u_int32_t buff_diff = deserializer->buffer_size - deserializer->size_used; + u_int32_t expected = + sizeof(u_int8_t) /* type */ + + sizeof(u_int16_t) /* key len */ + + sizeof(int32_t); + + if(buff_diff < expected) return(-2); + + deserializer->size_used++; /* Skip element type */ + ndpi_deserialize_single_string(deserializer, key); + ndpi_deserialize_single_int32(deserializer, value); + + return(0); + } else + return(-1); +} + +/* ********************************** */ + +int ndpi_deserialize_string_int64(ndpi_deserializer *deserializer, + ndpi_string *key, int64_t *value) { + if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_string_int64) { + u_int32_t buff_diff = deserializer->buffer_size - deserializer->size_used; + u_int32_t expected = + sizeof(u_int8_t) /* type */ + + sizeof(u_int16_t) /* key len */ + + sizeof(int64_t); + + if(buff_diff < expected) return(-2); + + deserializer->size_used++; /* Skip element type */ + ndpi_deserialize_single_string(deserializer, key); + ndpi_deserialize_single_int64(deserializer, value); + + return(0); + } 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) { |