aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/ndpi_api.h17
-rw-r--r--src/include/ndpi_typedefs.h4
-rw-r--r--src/lib/ndpi_utils.c166
3 files changed, 161 insertions, 26 deletions
diff --git a/src/include/ndpi_api.h b/src/include/ndpi_api.h
index 54d8837e4..dcfb12ae4 100644
--- a/src/include/ndpi_api.h
+++ b/src/include/ndpi_api.h
@@ -821,12 +821,16 @@ extern "C" {
void ndpi_reset_serializer(ndpi_serializer *serializer);
int ndpi_serialize_uint32_uint32(ndpi_serializer *serializer,
u_int32_t key, u_int32_t value);
+ int ndpi_serialize_uint32_uint64(ndpi_serializer *serializer,
+ u_int32_t key, u_int64_t value);
int ndpi_serialize_uint32_string(ndpi_serializer *serializer,
u_int32_t key, char *value);
- int ndpi_serialize_string_string(ndpi_serializer *serializer,
- char *key, char *value);
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);
+ int ndpi_serialize_string_string(ndpi_serializer *serializer,
+ char *key, char *value);
/* **** */
int ndpi_init_deserializer(ndpi_deserializer *deserializer,
@@ -839,12 +843,17 @@ extern "C" {
int ndpi_deserialize_uint32_uint32(ndpi_deserializer *deserializer,
u_int32_t *key, u_int32_t *value);
+ int ndpi_deserialize_uint32_uint64(ndpi_deserializer *deserializer,
+ 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_string(ndpi_deserializer *deserializer,
- ndpi_string *key, ndpi_string *value);
int ndpi_deserialize_string_uint32(ndpi_deserializer *deserializer,
ndpi_string *key, u_int32_t *value);
+ int ndpi_deserialize_string_uint64(ndpi_deserializer *deserializer,
+ ndpi_string *key, u_int64_t *value);
+ int ndpi_deserialize_string_string(ndpi_deserializer *deserializer,
+ ndpi_string *key, ndpi_string *value);
+
#ifdef __cplusplus
}
diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h
index 72547bc4a..3d2e798fc 100644
--- a/src/include/ndpi_typedefs.h
+++ b/src/include/ndpi_typedefs.h
@@ -1268,9 +1268,11 @@ typedef enum {
typedef enum {
ndpi_serialization_unknown = 0,
ndpi_serialization_uint32_uint32,
+ ndpi_serialization_uint32_uint64,
ndpi_serialization_uint32_string,
- ndpi_serialization_string_string,
ndpi_serialization_string_uint32,
+ ndpi_serialization_string_uint64,
+ ndpi_serialization_string_string,
} ndpi_serialization_element_type;
typedef struct {
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