aboutsummaryrefslogtreecommitdiff
path: root/src/lib/ndpi_utils.c
diff options
context:
space:
mode:
authorAlfredo Cardigliano <cardigliano@ntop.org>2019-07-17 10:10:41 +0000
committerAlfredo Cardigliano <cardigliano@ntop.org>2019-07-17 10:10:41 +0000
commit2fcc4f3e7386a7b51c7248e517ff8a5d692416d2 (patch)
treeca683038f23df68170b230a07b2f0e9f499c5bc5 /src/lib/ndpi_utils.c
parent1657686eb4e85aabe31e2224888e8b09276a9a2e (diff)
Added ndpi_serialization_uint32_uint64 and ndpi_serialization_string_uint64
Diffstat (limited to 'src/lib/ndpi_utils.c')
-rw-r--r--src/lib/ndpi_utils.c166
1 files changed, 145 insertions, 21 deletions
diff --git a/src/lib/ndpi_utils.c b/src/lib/ndpi_utils.c
index 641c1091f..82e990883 100644
--- a/src/lib/ndpi_utils.c
+++ b/src/lib/ndpi_utils.c
@@ -709,6 +709,23 @@ char* ndpi_ssl_version2str(u_int16_t version) {
/* ********************************** */
/* ********************************** */
+static u_int64_t ndpi_htonll(u_int64_t v) {
+ union { u_int32_t lv[2]; u_int64_t llv; } u;
+ u.lv[0] = htonl(v >> 32);
+ u.lv[1] = htonl(v & 0xFFFFFFFFULL);
+ return u.llv;
+}
+
+/* ********************************** */
+
+static u_int64_t ndpi_ntohll(u_int64_t v) {
+ union { u_int32_t lv[2]; u_int64_t llv; } u;
+ u.llv = v;
+ return ((u_int64_t)ntohl(u.lv[0]) << 32) | (u_int64_t)ntohl(u.lv[1]);
+}
+
+/* ********************************** */
+
int ndpi_init_serializer(ndpi_serializer *serializer,
ndpi_serialization_format fmt) {
serializer->buffer_size = 8192;
@@ -786,6 +803,25 @@ static void ndpi_deserialize_single_uint32(ndpi_serializer *serializer,
/* ********************************** */
+static void ndpi_serialize_single_uint64(ndpi_serializer *serializer,
+ u_int64_t s) {
+
+ u_int64_t v = ndpi_htonll(s);
+
+ memcpy(&serializer->buffer[serializer->size_used], &v, sizeof(u_int64_t));
+ serializer->size_used += sizeof(u_int64_t);
+}
+
+/* ********************************** */
+
+static void ndpi_deserialize_single_uint64(ndpi_serializer *serializer,
+ u_int64_t *s) {
+ *s = ndpi_ntohll(*(u_int64_t*)&serializer->buffer[serializer->size_used]);
+ serializer->size_used += sizeof(u_int64_t);
+}
+
+/* ********************************** */
+
static void ndpi_deserialize_single_string(ndpi_serializer *serializer,
ndpi_string *v) {
v->str_len = (u_int16_t)serializer->buffer[serializer->size_used];
@@ -828,6 +864,31 @@ int ndpi_serialize_uint32_uint32(ndpi_serializer *serializer,
/* ********************************** */
+int ndpi_serialize_uint32_uint64(ndpi_serializer *serializer,
+ u_int32_t key, u_int64_t value) {
+ u_int32_t buff_diff = serializer->buffer_size - serializer->size_used;
+
+ if(buff_diff < 14) {
+ ndpi_extend_serializer_buffer(serializer);
+ if(serializer->size_used < 10) return(-1);
+ }
+
+ if(serializer->fmt == ndpi_serialization_format_json) {
+ serializer->size_used += snprintf((char*)serializer->buffer, buff_diff, "%s\"%u\":%lu",
+ (serializer->size_used > 2) ? "," : "",
+ key, value);
+ } else {
+ serializer->buffer[serializer->size_used++] = ndpi_serialization_uint32_uint64;
+
+ ndpi_serialize_single_uint32(serializer, key);
+ ndpi_serialize_single_uint64(serializer, value);
+ }
+
+ return(0);
+}
+
+/* ********************************** */
+
int ndpi_serialize_uint32_string(ndpi_serializer *serializer,
u_int32_t key, char *value) {
u_int32_t slen = strlen(value);
@@ -855,10 +916,10 @@ int ndpi_serialize_uint32_string(ndpi_serializer *serializer,
/* ********************************** */
-int ndpi_serialize_string_string(ndpi_serializer *serializer,
- char *key, char *value) {
- u_int32_t klen = strlen(key), vlen = strlen(value);
- u_int32_t needed = klen + 2 /* str len */ + vlen + 2 /* str len */;
+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) {
@@ -866,15 +927,15 @@ int ndpi_serialize_string_string(ndpi_serializer *serializer,
if(serializer->size_used < 10) return(-1);
}
- serializer->buffer[serializer->size_used++] = ndpi_serialization_string_string;
+ 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\":\"%s\"",
+ 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_string(serializer, value, vlen);
+ ndpi_serialize_single_uint32(serializer, value);
}
return(0);
@@ -882,10 +943,10 @@ int ndpi_serialize_string_string(ndpi_serializer *serializer,
/* ********************************** */
-int ndpi_serialize_string_uint32(ndpi_serializer *serializer,
- char *key, u_int32_t value) {
+int ndpi_serialize_string_uint64(ndpi_serializer *serializer,
+ char *key, u_int64_t value) {
u_int32_t klen = strlen(key);
- u_int32_t needed = 1 /* type */ + 2 /* key len */ + klen /* key */ + 4 /* value */;
+ u_int32_t needed = 1 /* type */ + 2 /* key len */ + klen /* key */ + 8 /* value */;
u_int32_t buff_diff = serializer->buffer_size - serializer->size_used;
if(buff_diff < needed) {
@@ -893,15 +954,42 @@ int ndpi_serialize_string_uint32(ndpi_serializer *serializer,
if(serializer->size_used < 10) return(-1);
}
- serializer->buffer[serializer->size_used++] = ndpi_serialization_string_uint32;
+ serializer->buffer[serializer->size_used++] = ndpi_serialization_string_uint64;
if(serializer->fmt == ndpi_serialization_format_json) {
- serializer->size_used += snprintf((char*)serializer->buffer, buff_diff, "%s\"%s\":%u",
+ serializer->size_used += snprintf((char*)serializer->buffer, buff_diff, "%s\"%s\":%lu",
(serializer->size_used > 2) ? "," : "",
key, value);
} else {
ndpi_serialize_single_string(serializer, key, klen);
- ndpi_serialize_single_uint32(serializer, value);
+ ndpi_serialize_single_uint64(serializer, value);
+ }
+
+ return(0);
+}
+
+/* ********************************** */
+
+int ndpi_serialize_string_string(ndpi_serializer *serializer,
+ char *key, char *value) {
+ u_int32_t klen = strlen(key), vlen = strlen(value);
+ u_int32_t needed = klen + 2 /* str len */ + vlen + 2 /* str len */;
+ 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_string;
+
+ if(serializer->fmt == ndpi_serialization_format_json) {
+ serializer->size_used += snprintf((char*)serializer->buffer, buff_diff, "%s\"%s\":\"%s\"",
+ (serializer->size_used > 2) ? "," : "",
+ key, value);
+ } else {
+ ndpi_serialize_single_string(serializer, key, klen);
+ ndpi_serialize_single_string(serializer, value, vlen);
}
return(0);
@@ -966,6 +1054,24 @@ int ndpi_deserialize_uint32_uint32(ndpi_deserializer *deserializer,
/* ********************************** */
+int ndpi_deserialize_uint32_uint64(ndpi_deserializer *deserializer,
+ u_int32_t *key, u_int64_t *value) {
+ if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_uint32_uint64) {
+ u_int32_t buff_diff = deserializer->buffer_size - deserializer->size_used;
+
+ if(buff_diff < 10) return(-2);
+
+ deserializer->size_used++; /* Skip element type */
+ ndpi_deserialize_single_uint32(deserializer, key);
+ ndpi_deserialize_single_uint64(deserializer, value);
+
+ return(0);
+ } else
+ return(-1);
+}
+
+/* ********************************** */
+
int ndpi_deserialize_uint32_string(ndpi_deserializer *deserializer,
u_int32_t *key, ndpi_string *value) {
if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_uint32_string) {
@@ -984,16 +1090,16 @@ int ndpi_deserialize_uint32_string(ndpi_deserializer *deserializer,
/* ********************************** */
-int ndpi_deserialize_string_string(ndpi_deserializer *deserializer,
- ndpi_string *key, ndpi_string *value) {
- if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_string_string) {
+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_string(deserializer, value);
+ ndpi_deserialize_single_uint32(deserializer, value);
return(0);
} else
@@ -1002,16 +1108,34 @@ int ndpi_deserialize_string_string(ndpi_deserializer *deserializer,
/* ********************************** */
-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) {
+int ndpi_deserialize_string_uint64(ndpi_deserializer *deserializer,
+ ndpi_string *key, u_int64_t *value) {
+ if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_string_uint64) {
+ u_int32_t buff_diff = deserializer->buffer_size - deserializer->size_used;
+
+ if(buff_diff < 12) return(-2);
+
+ deserializer->size_used++; /* Skip element type */
+ ndpi_deserialize_single_string(deserializer, key);
+ ndpi_deserialize_single_uint64(deserializer, value);
+
+ return(0);
+ } else
+ return(-1);
+}
+
+/* ********************************** */
+
+int ndpi_deserialize_string_string(ndpi_deserializer *deserializer,
+ ndpi_string *key, ndpi_string *value) {
+ if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_string_string) {
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);
+ ndpi_deserialize_single_string(deserializer, value);
return(0);
} else