aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Deri <deri@ntop.org>2019-07-24 15:20:31 +0200
committerLuca Deri <deri@ntop.org>2019-07-24 15:20:31 +0200
commit21485683475ab6b3bb4468f142843d5f15f412f8 (patch)
tree79ad3b01aebeeb4fe8aba6d8e2cb868da717a3e4
parent5c6c64ed1d962a564570c84d07f73ce3305804d5 (diff)
Added int32/int64 (with sign) serialization/deserialization
-rw-r--r--src/include/ndpi_api.h8
-rw-r--r--src/include/ndpi_typedefs.h2
-rw-r--r--src/lib/ndpi_utils.c138
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) {