aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--example/ndpiReader.c15
-rw-r--r--src/include/ndpi_api.h5
-rw-r--r--src/include/ndpi_typedefs.h1
-rw-r--r--src/lib/ndpi_utils.c84
4 files changed, 104 insertions, 1 deletions
diff --git a/example/ndpiReader.c b/example/ndpiReader.c
index e5ccc5648..326f4d419 100644
--- a/example/ndpiReader.c
+++ b/example/ndpiReader.c
@@ -3212,6 +3212,7 @@ void serializerUnitTest() {
assert(ndpi_serialize_uint32_string(&serializer, i, "Hello") != -1);
assert(ndpi_serialize_string_string(&serializer, kbuf, vbuf) != -1);
assert(ndpi_serialize_string_uint32(&serializer, kbuf, i*i) != -1);
+ assert(ndpi_serialize_string_float(&serializer, kbuf, (float)(i*i), "%f") != -1);
}
if(trace)
@@ -3227,7 +3228,8 @@ void serializerUnitTest() {
else {
u_int32_t k32, v32;
ndpi_string ks, vs;
-
+ float vf;
+
switch(et) {
case ndpi_serialization_uint32_uint32:
assert(ndpi_deserialize_uint32_uint32(&deserializer, &k32, &v32) != -1);
@@ -3267,6 +3269,17 @@ void serializerUnitTest() {
}
break;
+ case ndpi_serialization_string_float:
+ assert(ndpi_deserialize_string_float(&deserializer, &ks, &vf) != -1);
+ if(trace) {
+ u_int8_t bkpk = ks.str[ks.str_len];
+
+ ks.str[ks.str_len] = '\0';
+ printf("%s=%f\n", ks.str, vf);
+ ks.str[ks.str_len] = bkpk;
+ }
+ break;
+
default:
printf("serializerUnitTest: unsupported type %u detected!\n", et);
return;
diff --git a/src/include/ndpi_api.h b/src/include/ndpi_api.h
index 20dd048ad..8c899128e 100644
--- a/src/include/ndpi_api.h
+++ b/src/include/ndpi_api.h
@@ -837,6 +837,9 @@ extern "C" {
const char *key, u_int64_t value);
int ndpi_serialize_string_string(ndpi_serializer *serializer,
const char *key, const char *value);
+ int ndpi_serialize_string_float(ndpi_serializer *serializer,
+ const char *key, float value,
+ const char *format /* e.f. "%.2f" */);
int ndpi_serialize_end_of_record(ndpi_serializer *serializer);
/* Deserializer */
@@ -864,6 +867,8 @@ extern "C" {
ndpi_string *key, u_int64_t *value);
int ndpi_deserialize_string_string(ndpi_deserializer *deserializer,
ndpi_string *key, ndpi_string *value);
+ int ndpi_deserialize_string_float(ndpi_deserializer *deserializer,
+ ndpi_string *key, float *value);
int ndpi_deserialize_end_of_record(ndpi_deserializer *deserializer);
#ifdef __cplusplus
diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h
index c124cf5fc..a77f70ce0 100644
--- a/src/include/ndpi_typedefs.h
+++ b/src/include/ndpi_typedefs.h
@@ -1318,6 +1318,7 @@ typedef enum {
ndpi_serialization_string_int64,
ndpi_serialization_string_uint32,
ndpi_serialization_string_uint64,
+ ndpi_serialization_string_float,
ndpi_serialization_string_string,
} ndpi_serialization_element_type;
diff --git a/src/lib/ndpi_utils.c b/src/lib/ndpi_utils.c
index 8959aa05e..1e4f84702 100644
--- a/src/lib/ndpi_utils.c
+++ b/src/lib/ndpi_utils.c
@@ -893,6 +893,15 @@ static void ndpi_serialize_single_uint64(ndpi_serializer *serializer,
/* ********************************** */
+/* TODO: fix portability across platforms */
+static void ndpi_serialize_single_float(ndpi_serializer *serializer, float s) {
+
+ memcpy(&serializer->buffer[serializer->size_used], &s, sizeof(s));
+ serializer->size_used += sizeof(float);
+}
+
+/* ********************************** */
+
static void ndpi_serialize_single_string(ndpi_serializer *serializer,
const char *s, u_int16_t slen) {
u_int16_t l = htons(slen);
@@ -940,6 +949,15 @@ static void ndpi_deserialize_single_int64(ndpi_serializer *deserializer,
/* ********************************** */
+/* TODO: fix portability across platforms */
+static void ndpi_deserialize_single_float(ndpi_serializer *deserializer,
+ float *s) {
+ *s = *(float*)&deserializer->buffer[deserializer->size_used];
+ deserializer->size_used += sizeof(float);
+}
+
+/* ********************************** */
+
static void ndpi_deserialize_single_string(ndpi_serializer *deserializer,
ndpi_string *v) {
v->str_len = ntohs(*((u_int16_t *) &deserializer->buffer[deserializer->size_used]));
@@ -1272,6 +1290,50 @@ int ndpi_serialize_string_uint64(ndpi_serializer *serializer,
/* ********************************** */
+int ndpi_serialize_string_float(ndpi_serializer *serializer,
+ const char *key, float value,
+ const char *format /* e.f. "%.2f" */) {
+ 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(float);
+
+ if(serializer->fmt == ndpi_serialization_format_json)
+ needed += 32 + 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->buffer[serializer->size_used] = ':';
+ serializer->size_used++;
+
+ serializer->size_used += snprintf((char *) &serializer->buffer[serializer->size_used], buff_diff, format, value);
+
+ ndpi_serialize_json_post(serializer);
+ } else {
+ serializer->buffer[serializer->size_used++] = ndpi_serialization_string_float;
+
+ ndpi_serialize_single_string(serializer, key, klen);
+ ndpi_serialize_single_float(serializer, value);
+ }
+
+ return(0);
+}
+
+/* ********************************** */
+
int ndpi_serialize_string_string(ndpi_serializer *serializer,
const char *key, const char *value) {
u_int16_t klen = strlen(key), vlen = strlen(value);
@@ -1529,6 +1591,28 @@ int ndpi_deserialize_string_uint64(ndpi_deserializer *deserializer,
/* ********************************** */
+int ndpi_deserialize_string_float(ndpi_deserializer *deserializer,
+ ndpi_string *key, float *value) {
+ if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_string_float) {
+ 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(float);
+
+ if(buff_diff < expected) return(-2);
+
+ deserializer->size_used++; /* Skip element type */
+ ndpi_deserialize_single_string(deserializer, key);
+ ndpi_deserialize_single_float(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) {