diff options
Diffstat (limited to 'src/lib/ndpi_serializer.c')
-rw-r--r-- | src/lib/ndpi_serializer.c | 813 |
1 files changed, 467 insertions, 346 deletions
diff --git a/src/lib/ndpi_serializer.c b/src/lib/ndpi_serializer.c index 5c4807eb6..a50f98860 100644 --- a/src/lib/ndpi_serializer.c +++ b/src/lib/ndpi_serializer.c @@ -146,15 +146,27 @@ void ndpi_reset_serializer(ndpi_serializer *_serializer) { if(serializer->fmt == ndpi_serialization_format_json) { u_int32_t buff_diff; - serializer->status.size_used = 0; - buff_diff = serializer->buffer_size - serializer->status.size_used; + serializer->status.buffer.size_used = 0; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; /* Note: please keep a space at the beginning as it is used for arrays when an end-of-record is used */ - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, " {}"); - } else if(serializer->fmt == ndpi_serialization_format_csv) - serializer->status.size_used = 0; - else /* ndpi_serialization_format_tlv */ - serializer->status.size_used = 2 * sizeof(u_int8_t); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, " {}"); + } else if(serializer->fmt == ndpi_serialization_format_csv) { + serializer->status.header.size_used = 0; + serializer->status.buffer.size_used = 0; + } else { /* ndpi_serialization_format_tlv */ + serializer->status.buffer.size_used = 2 * sizeof(u_int8_t); + } +} + +/* ********************************** */ + +static int ndpi_init_serializer_buffer(ndpi_private_serializer_buffer *buffer, u_int32_t buffer_size) { + buffer->initial_size = buffer->size = buffer_size; + buffer->data = (u_int8_t *) calloc(buffer->size, sizeof(u_int8_t)); + if(buffer->data == NULL) + return -1; + return 0; } /* ********************************** */ @@ -166,16 +178,22 @@ int ndpi_init_serializer_ll(ndpi_serializer *_serializer, memset(serializer, 0, sizeof(ndpi_private_serializer)); - serializer->initial_buffer_size = serializer->buffer_size = buffer_size; - serializer->buffer = (u_int8_t *) calloc(serializer->buffer_size, sizeof(u_int8_t)); + serializer->fmt = fmt; - if(serializer->buffer == NULL) + if (ndpi_init_serializer_buffer(&serializer->buffer, buffer_size) != 0) return(-1); + + if(serializer->fmt == ndpi_serialization_format_json) { + /* nothing to do */ - serializer->fmt = fmt; + } else if (fmt == ndpi_serialization_format_csv) { + if (ndpi_init_serializer_buffer(&serializer->header, NDPI_SERIALIZER_DEFAULT_HEADER_SIZE) != 0) + return(-1); - serializer->buffer[0] = 1; /* version */ - serializer->buffer[1] = (u_int8_t) fmt; + } else /* ndpi_serialization_format_tlv */ { + serializer->buffer.data[0] = 1; /* version */ + serializer->buffer.data[1] = (u_int8_t) fmt; + } serializer->csv_separator[0] = ','; serializer->csv_separator[1] = '\0'; @@ -194,45 +212,106 @@ int ndpi_init_serializer(ndpi_serializer *_serializer, /* ********************************** */ -static inline int ndpi_extend_serializer_buffer(ndpi_serializer *_serializer, u_int32_t min_len) { +static inline int ndpi_extend_serializer_buffer(ndpi_private_serializer_buffer *buffer, u_int32_t min_len) { u_int32_t new_size; void *r; - ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; if(min_len < NDPI_SERIALIZER_DEFAULT_BUFFER_INCR) { - if(serializer->initial_buffer_size < NDPI_SERIALIZER_DEFAULT_BUFFER_INCR) { - if(min_len < serializer->initial_buffer_size) - min_len = serializer->initial_buffer_size; + if(buffer->initial_size < NDPI_SERIALIZER_DEFAULT_BUFFER_INCR) { + if(min_len < buffer->initial_size) + min_len = buffer->initial_size; } else { min_len = NDPI_SERIALIZER_DEFAULT_BUFFER_INCR; } } - new_size = serializer->buffer_size + min_len; + new_size = buffer->size + min_len; new_size = ((new_size / 4) + 1) * 4; /* required by zmq encryption */ - r = realloc((void *) serializer->buffer, new_size); + r = realloc((void *) buffer->data, new_size); if(r == NULL) return(-1); - serializer->buffer = r; - serializer->buffer_size = new_size; + buffer->data = r; + buffer->size = new_size; return(0); } /* ********************************** */ +static inline int ndpi_serializer_check_header_room(ndpi_private_serializer *serializer, u_int32_t needed) { + u_int32_t buff_diff = serializer->header.size - serializer->status.header.size_used; + + if (buff_diff < needed) + if (ndpi_extend_serializer_buffer(&serializer->header, needed - buff_diff) < 0) + return -1; + + buff_diff = serializer->header.size - serializer->status.header.size_used; + + return buff_diff; +} + +/* ********************************** */ + +static inline int ndpi_serializer_header_uint32(ndpi_private_serializer *serializer, u_int32_t key) { + int room; + + if (serializer->status.flags & NDPI_SERIALIZER_STATUS_HDR_DONE) + return 0; + + room = ndpi_serializer_check_header_room(serializer, 12); + + if (room < 0) + return -1; + + serializer->status.header.size_used += snprintf((char *) &serializer->header.data[serializer->status.header.size_used], + room, "%s%u", (serializer->status.header.size_used > 0) ? serializer->csv_separator : "", key); + + return 0; +} + +/* ********************************** */ + +static inline int ndpi_serializer_header_string(ndpi_private_serializer *serializer, const char *key, u_int16_t klen) { + int room; + + if (serializer->status.flags & NDPI_SERIALIZER_STATUS_HDR_DONE) + return 0; + + room = ndpi_serializer_check_header_room(serializer, klen + 4); + + if (room < 0) + return -1; + + if (serializer->status.header.size_used > 0) { + int slen = strlen(serializer->csv_separator); + memcpy(&serializer->header.data[serializer->status.header.size_used], serializer->csv_separator, slen); + serializer->status.header.size_used += slen; + } + + if (klen > 0) { + memcpy(&serializer->header.data[serializer->status.header.size_used], key, klen); + serializer->status.header.size_used += klen; + } + + serializer->header.data[serializer->status.header.size_used] = '\0'; + + return 0; +} + +/* ********************************** */ + char* ndpi_serializer_get_buffer(ndpi_serializer *_serializer, u_int32_t *buffer_len) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - char *buf = (char*)serializer->buffer; + char *buf = (char*)serializer->buffer.data; - /* NULL terminate the buffer if there is space available */ - if(serializer->buffer_size > serializer->status.size_used) - serializer->buffer[serializer->status.size_used] = '\0'; + /* NULL terminate the buffer */ + if(serializer->buffer.size > serializer->status.buffer.size_used) /* safety check */ + serializer->buffer.data[serializer->status.buffer.size_used] = '\0'; - *buffer_len = serializer->status.size_used; + *buffer_len = serializer->status.buffer.size_used; if(serializer->fmt == ndpi_serialization_format_json) { while((buf[0] == '\0') || (buf[0] == ' ')) @@ -245,13 +324,13 @@ char* ndpi_serializer_get_buffer(ndpi_serializer *_serializer, u_int32_t *buffer /* ********************************** */ u_int32_t ndpi_serializer_get_buffer_len(ndpi_serializer *_serializer) { - return(((ndpi_private_serializer*)_serializer)->status.size_used); + return(((ndpi_private_serializer*)_serializer)->status.buffer.size_used); } /* ********************************** */ u_int32_t ndpi_serializer_get_internal_buffer_size(ndpi_serializer *_serializer) { - return(((ndpi_private_serializer*)_serializer)->buffer_size); + return(((ndpi_private_serializer*)_serializer)->buffer.size); } /* ********************************** */ @@ -260,10 +339,10 @@ int ndpi_serializer_set_buffer_len(ndpi_serializer *_serializer, u_int32_t l) { ndpi_private_serializer *p = (ndpi_private_serializer*)_serializer; if(p) { - if(p->buffer_size <= l) + if(p->buffer.size <= l) return(-1); /* Invalid size */ - p->status.size_used = l; + p->status.buffer.size_used = l; return(0); } @@ -272,6 +351,27 @@ int ndpi_serializer_set_buffer_len(ndpi_serializer *_serializer, u_int32_t l) { /* ********************************** */ +/* Return the header automatically built from keys (CSV only) */ +char* ndpi_serializer_get_header(ndpi_serializer *_serializer, u_int32_t *buffer_len) { + ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; + char *buf = (char*)serializer->header.data; + + if(buf == NULL) { + *buffer_len = 0; + return ""; + } + + /* NULL terminate the buffer */ + if(serializer->header.size > serializer->status.header.size_used) /* safety check */ + serializer->header.data[serializer->status.header.size_used] = '\0'; + + *buffer_len = serializer->status.header.size_used; + + return(buf); +} + +/* ********************************** */ + void ndpi_serializer_set_csv_separator(ndpi_serializer *_serializer, char separator) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; @@ -283,10 +383,16 @@ void ndpi_serializer_set_csv_separator(ndpi_serializer *_serializer, char separa void ndpi_term_serializer(ndpi_serializer *_serializer) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - if(serializer->buffer) { - free(serializer->buffer); - serializer->buffer_size = 0; - serializer->buffer = NULL; + if(serializer->buffer.data) { + free(serializer->buffer.data); + serializer->buffer.size = 0; + serializer->buffer.data = NULL; + } + + if(serializer->header.data) { + free(serializer->header.data); + serializer->header.size = 0; + serializer->header.data = NULL; } } @@ -296,8 +402,8 @@ static inline void ndpi_serialize_single_uint8(ndpi_private_serializer *serializ u_int8_t s) { u_int8_t v = s; - memcpy(&serializer->buffer[serializer->status.size_used], &v, sizeof(u_int8_t)); - serializer->status.size_used += sizeof(u_int8_t); + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], &v, sizeof(u_int8_t)); + serializer->status.buffer.size_used += sizeof(u_int8_t); } /* ********************************** */ @@ -306,8 +412,8 @@ static inline void ndpi_serialize_single_uint16(ndpi_private_serializer *seriali u_int16_t s) { u_int16_t v = htons(s); - memcpy(&serializer->buffer[serializer->status.size_used], &v, sizeof(u_int16_t)); - serializer->status.size_used += sizeof(u_int16_t); + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], &v, sizeof(u_int16_t)); + serializer->status.buffer.size_used += sizeof(u_int16_t); } /* ********************************** */ @@ -316,8 +422,8 @@ static inline void ndpi_serialize_single_uint32(ndpi_private_serializer *seriali u_int32_t s) { u_int32_t v = htonl(s); - memcpy(&serializer->buffer[serializer->status.size_used], &v, sizeof(u_int32_t)); - serializer->status.size_used += sizeof(u_int32_t); + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], &v, sizeof(u_int32_t)); + serializer->status.buffer.size_used += sizeof(u_int32_t); } /* ********************************** */ @@ -326,8 +432,8 @@ static inline void ndpi_serialize_single_uint64(ndpi_private_serializer *seriali u_int64_t s) { u_int64_t v = ndpi_htonll(s); - memcpy(&serializer->buffer[serializer->status.size_used], &v, sizeof(u_int64_t)); - serializer->status.size_used += sizeof(u_int64_t); + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], &v, sizeof(u_int64_t)); + serializer->status.buffer.size_used += sizeof(u_int64_t); } /* ********************************** */ @@ -335,8 +441,8 @@ static inline void ndpi_serialize_single_uint64(ndpi_private_serializer *seriali /* TODO: fix portability across platforms */ static inline void ndpi_serialize_single_float(ndpi_private_serializer *serializer, float s) { - memcpy(&serializer->buffer[serializer->status.size_used], &s, sizeof(s)); - serializer->status.size_used += sizeof(float); + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], &s, sizeof(s)); + serializer->status.buffer.size_used += sizeof(float); } /* ********************************** */ @@ -345,69 +451,69 @@ static inline void ndpi_serialize_single_string(ndpi_private_serializer *seriali const char *s, u_int16_t slen) { u_int16_t l = htons(slen); - memcpy(&serializer->buffer[serializer->status.size_used], &l, sizeof(u_int16_t)); - serializer->status.size_used += sizeof(u_int16_t); + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], &l, sizeof(u_int16_t)); + serializer->status.buffer.size_used += sizeof(u_int16_t); if(slen > 0) - memcpy(&serializer->buffer[serializer->status.size_used], s, slen); + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], s, slen); - serializer->status.size_used += slen; + serializer->status.buffer.size_used += slen; } /* ********************************** */ static inline void ndpi_deserialize_single_uint8(ndpi_private_deserializer *deserializer, u_int32_t offset, u_int8_t *s) { - *s = (*((u_int8_t *) &deserializer->buffer[offset])); + *s = (*((u_int8_t *) &deserializer->buffer.data[offset])); } /* ********************************** */ static inline void ndpi_deserialize_single_uint16(ndpi_private_deserializer *deserializer, u_int32_t offset, u_int16_t *s) { - *s = ntohs(*((u_int16_t *) &deserializer->buffer[offset])); + *s = ntohs(*((u_int16_t *) &deserializer->buffer.data[offset])); } /* ********************************** */ static inline void ndpi_deserialize_single_uint32(ndpi_private_deserializer *deserializer, u_int32_t offset, u_int32_t *s) { - *s = ntohl(*((u_int32_t *) &deserializer->buffer[offset])); + *s = ntohl(*((u_int32_t *) &deserializer->buffer.data[offset])); } /* ********************************** */ static inline void ndpi_deserialize_single_int8(ndpi_private_deserializer *deserializer, u_int32_t offset, int8_t *s) { - *s = (*((int8_t *) &deserializer->buffer[offset])); + *s = (*((int8_t *) &deserializer->buffer.data[offset])); } /* ********************************** */ static inline void ndpi_deserialize_single_int16(ndpi_private_deserializer *deserializer, u_int32_t offset, int16_t *s) { - *s = ntohs(*((int16_t *) &deserializer->buffer[offset])); + *s = ntohs(*((int16_t *) &deserializer->buffer.data[offset])); } /* ********************************** */ static inline void ndpi_deserialize_single_int32(ndpi_private_deserializer *deserializer, u_int32_t offset, int32_t *s) { - *s = ntohl(*((int32_t *) &deserializer->buffer[offset])); + *s = ntohl(*((int32_t *) &deserializer->buffer.data[offset])); } /* ********************************** */ static inline void ndpi_deserialize_single_uint64(ndpi_private_deserializer *deserializer, u_int32_t offset, u_int64_t *s) { - *s = ndpi_ntohll(*(u_int64_t*)&deserializer->buffer[offset]); + *s = ndpi_ntohll(*(u_int64_t*)&deserializer->buffer.data[offset]); } /* ********************************** */ static inline void ndpi_deserialize_single_int64(ndpi_private_deserializer *deserializer, u_int32_t offset, int64_t *s) { - *s = ndpi_ntohll(*(int64_t*)&deserializer->buffer[offset]); + *s = ndpi_ntohll(*(int64_t*)&deserializer->buffer.data[offset]); } /* ********************************** */ @@ -415,15 +521,15 @@ static inline void ndpi_deserialize_single_int64(ndpi_private_deserializer *dese /* TODO: fix portability across platforms */ static inline void ndpi_deserialize_single_float(ndpi_private_deserializer *deserializer, u_int32_t offset, float *s) { - *s = *(float*)&deserializer->buffer[offset]; + *s = *(float*)&deserializer->buffer.data[offset]; } /* ********************************** */ static inline void ndpi_deserialize_single_string(ndpi_private_deserializer *deserializer, u_int32_t offset, ndpi_string *v) { - v->str_len = ntohs(*((u_int16_t *) &deserializer->buffer[offset])); - v->str = (char *) &deserializer->buffer[offset + sizeof(u_int16_t)]; + v->str_len = ntohs(*((u_int16_t *) &deserializer->buffer.data[offset])); + v->str = (char *) &deserializer->buffer.data[offset + sizeof(u_int16_t)]; } /* ********************************** */ @@ -436,39 +542,39 @@ static inline void ndpi_deserialize_single_string(ndpi_private_deserializer *des int ndpi_serialize_raw_record(ndpi_serializer *_serializer, u_char *record, u_int32_t record_len) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int16_t needed = record_len; u_int8_t add_comma = 0; if(serializer->fmt == ndpi_serialization_format_json) { needed += 1; - if(serializer->status.size_used == 3) /* Empty buffer [{} */ - serializer->status.size_used = 2; /* Remove {} */ + if(serializer->status.buffer.size_used == 3) /* Empty buffer [{} */ + serializer->status.buffer.size_used = 2; /* Remove {} */ else needed += 2, add_comma = 1; } if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { if(add_comma) - serializer->buffer[serializer->status.size_used-1] = ','; + serializer->buffer.data[serializer->status.buffer.size_used-1] = ','; else - serializer->status.size_used--; + serializer->status.buffer.size_used--; } - memcpy(&serializer->buffer[serializer->status.size_used], record, record_len); - serializer->status.size_used += record_len; + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], record, record_len); + serializer->status.buffer.size_used += record_len; if(serializer->fmt == ndpi_serialization_format_json) { - serializer->buffer[serializer->status.size_used] = ']'; - if(add_comma) serializer->status.size_used++; + serializer->buffer.data[serializer->status.buffer.size_used] = ']'; + if(add_comma) serializer->status.buffer.size_used++; } ndpi_serialize_end_of_record(_serializer); @@ -480,29 +586,31 @@ int ndpi_serialize_raw_record(ndpi_serializer *_serializer, int ndpi_serialize_end_of_record(ndpi_serializer *_serializer) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int16_t needed = sizeof(u_int8_t) /* type */; if(serializer->fmt == ndpi_serialization_format_json) needed += 1; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - if(serializer->fmt == ndpi_serialization_format_json) { + if(serializer->fmt == ndpi_serialization_format_csv) { + serializer->status.flags |= NDPI_SERIALIZER_STATUS_HDR_DONE; + } else if(serializer->fmt == ndpi_serialization_format_json) { if(!(serializer->status.flags & NDPI_SERIALIZER_STATUS_ARRAY)) { - serializer->buffer[0] = '['; - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], + serializer->buffer.data[0] = '['; + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "]"); } serializer->status.flags |= NDPI_SERIALIZER_STATUS_ARRAY | NDPI_SERIALIZER_STATUS_EOR; serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_COMMA; } else { - serializer->buffer[serializer->status.size_used++] = ndpi_serialization_end_of_record; + serializer->buffer.data[serializer->status.buffer.size_used++] = ndpi_serialization_end_of_record; } serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_NOT_EMPTY; @@ -516,27 +624,27 @@ static inline void ndpi_serialize_json_pre(ndpi_serializer *_serializer) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; if(serializer->status.flags & NDPI_SERIALIZER_STATUS_EOR) { - serializer->status.size_used--; /* Remove ']' */ + serializer->status.buffer.size_used--; /* Remove ']' */ serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_EOR; - serializer->buffer[serializer->status.size_used++] = ','; - serializer->buffer[serializer->status.size_used++] = '{'; + serializer->buffer.data[serializer->status.buffer.size_used++] = ','; + serializer->buffer.data[serializer->status.buffer.size_used++] = '{'; } else { if(serializer->status.flags & NDPI_SERIALIZER_STATUS_ARRAY) - serializer->status.size_used--; /* Remove ']' */ + serializer->status.buffer.size_used--; /* Remove ']' */ - serializer->status.size_used--; /* Remove '}' */ + serializer->status.buffer.size_used--; /* Remove '}' */ if(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST) { - serializer->status.size_used--; /* Remove ']' */ + serializer->status.buffer.size_used--; /* Remove ']' */ if(serializer->status.flags & NDPI_SERIALIZER_STATUS_SOL) serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_SOL; else - serializer->buffer[serializer->status.size_used++] = ','; + serializer->buffer.data[serializer->status.buffer.size_used++] = ','; } else { if(serializer->status.flags & NDPI_SERIALIZER_STATUS_SOB) serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_SOB; else if(serializer->status.flags & NDPI_SERIALIZER_STATUS_COMMA) - serializer->buffer[serializer->status.size_used++] = ','; + serializer->buffer.data[serializer->status.buffer.size_used++] = ','; } } } @@ -547,12 +655,12 @@ static inline void ndpi_serialize_json_post(ndpi_serializer *_serializer) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; if(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST) - serializer->buffer[serializer->status.size_used++] = ']'; + serializer->buffer.data[serializer->status.buffer.size_used++] = ']'; - serializer->buffer[serializer->status.size_used++] = '}'; + serializer->buffer.data[serializer->status.buffer.size_used++] = '}'; if(serializer->status.flags & NDPI_SERIALIZER_STATUS_ARRAY) - serializer->buffer[serializer->status.size_used++] = ']'; + serializer->buffer.data[serializer->status.buffer.size_used++] = ']'; serializer->status.flags |= NDPI_SERIALIZER_STATUS_COMMA; } @@ -581,7 +689,7 @@ static inline ndpi_serialization_type ndpi_serialize_key_uint32(ndpi_private_ser int ndpi_serialize_uint32_uint32(ndpi_serializer *_serializer, u_int32_t key, u_int32_t value) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int16_t needed = sizeof(u_int8_t) /* type */ + sizeof(u_int32_t) /* key */ + @@ -591,33 +699,34 @@ int ndpi_serialize_uint32_uint32(ndpi_serializer *_serializer, needed += 24; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%u", value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, - "%s%u", (serializer->status.size_used > 0) ? serializer->csv_separator : "", value); + if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + "%s%u", (serializer->status.buffer.size_used > 0) ? serializer->csv_separator : "", value); } else { ndpi_serialization_type kt; u_int8_t type = 0; - u_int32_t type_offset = serializer->status.size_used++; + u_int32_t type_offset = serializer->status.buffer.size_used++; kt = ndpi_serialize_key_uint32(serializer, key); type = (kt << 4); @@ -633,7 +742,7 @@ int ndpi_serialize_uint32_uint32(ndpi_serializer *_serializer, type |= ndpi_serialization_uint32; } - serializer->buffer[type_offset] = type; + serializer->buffer.data[type_offset] = type; } serializer->status.flags |= NDPI_SERIALIZER_STATUS_NOT_EMPTY; @@ -645,7 +754,7 @@ int ndpi_serialize_uint32_uint32(ndpi_serializer *_serializer, int ndpi_serialize_uint32_uint64(ndpi_serializer *_serializer, u_int32_t key, u_int64_t value) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int16_t needed = sizeof(u_int8_t) /* type */ + sizeof(u_int32_t) /* key */ + @@ -655,30 +764,31 @@ int ndpi_serialize_uint32_uint64(ndpi_serializer *_serializer, needed += 32; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], buff_diff, + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], buff_diff, + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%llu", (unsigned long long)value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, + if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s%llu", - (serializer->status.size_used > 0) ? serializer->csv_separator : "", + (serializer->status.buffer.size_used > 0) ? serializer->csv_separator : "", (unsigned long long)value); } else { if(value <= 0xffffffff) { @@ -686,7 +796,7 @@ int ndpi_serialize_uint32_uint64(ndpi_serializer *_serializer, } else { ndpi_serialization_type kt; u_int8_t type = 0; - u_int32_t type_offset = serializer->status.size_used++; + u_int32_t type_offset = serializer->status.buffer.size_used++; kt = ndpi_serialize_key_uint32(serializer, key); type = (kt << 4); @@ -694,7 +804,7 @@ int ndpi_serialize_uint32_uint64(ndpi_serializer *_serializer, ndpi_serialize_single_uint64(serializer, value); type |= ndpi_serialization_uint64; - serializer->buffer[type_offset] = type; + serializer->buffer.data[type_offset] = type; } } @@ -707,7 +817,7 @@ int ndpi_serialize_uint32_uint64(ndpi_serializer *_serializer, int ndpi_serialize_uint32_int32(ndpi_serializer *_serializer, u_int32_t key, int32_t value) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int16_t needed = sizeof(u_int8_t) /* type */ + sizeof(u_int32_t) /* key */ + @@ -717,33 +827,34 @@ int ndpi_serialize_uint32_int32(ndpi_serializer *_serializer, needed += 24; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%d", value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, - "%s%d", (serializer->status.size_used > 0) ? serializer->csv_separator : "", value); + if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + "%s%d", (serializer->status.buffer.size_used > 0) ? serializer->csv_separator : "", value); } else { ndpi_serialization_type kt; u_int8_t type = 0; - u_int32_t type_offset = serializer->status.size_used++; + u_int32_t type_offset = serializer->status.buffer.size_used++; kt = ndpi_serialize_key_uint32(serializer, key); type = (kt << 4); @@ -759,7 +870,7 @@ int ndpi_serialize_uint32_int32(ndpi_serializer *_serializer, type |= ndpi_serialization_int32; } - serializer->buffer[type_offset] = type; + serializer->buffer.data[type_offset] = type; } serializer->status.flags |= NDPI_SERIALIZER_STATUS_NOT_EMPTY; @@ -771,7 +882,7 @@ int ndpi_serialize_uint32_int32(ndpi_serializer *_serializer, int ndpi_serialize_uint32_int64(ndpi_serializer *_serializer, u_int32_t key, int64_t value) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int16_t needed = sizeof(u_int8_t) /* type */ + sizeof(u_int32_t) /* key */ + @@ -781,30 +892,31 @@ int ndpi_serialize_uint32_int64(ndpi_serializer *_serializer, needed += 32; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%lld", (long long int)value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, + if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s%lld", - (serializer->status.size_used > 0) ? serializer->csv_separator : "", + (serializer->status.buffer.size_used > 0) ? serializer->csv_separator : "", (long long int)value); } @@ -814,7 +926,7 @@ int ndpi_serialize_uint32_int64(ndpi_serializer *_serializer, } else { ndpi_serialization_type kt; u_int8_t type = 0; - u_int32_t type_offset = serializer->status.size_used++; + u_int32_t type_offset = serializer->status.buffer.size_used++; kt = ndpi_serialize_key_uint32(serializer, key); type = (kt << 4); @@ -822,7 +934,7 @@ int ndpi_serialize_uint32_int64(ndpi_serializer *_serializer, ndpi_serialize_single_uint64(serializer, value); type |= ndpi_serialization_int64; - serializer->buffer[type_offset] = type; + serializer->buffer.data[type_offset] = type; } } @@ -836,7 +948,7 @@ int ndpi_serialize_uint32_float(ndpi_serializer *_serializer, u_int32_t key, float value, const char *format /* e.f. "%.2f" */) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int16_t needed = sizeof(u_int8_t) /* type */ + sizeof(u_int32_t) /* key */ + @@ -846,31 +958,32 @@ int ndpi_serialize_uint32_float(ndpi_serializer *_serializer, needed += 32; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, "\"%u\":", key); - buff_diff = serializer->buffer_size - serializer->status.size_used; + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, format, value); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, "%s", - (serializer->status.size_used > 0) ? serializer->csv_separator : ""); - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, format, value); + if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", + (serializer->status.buffer.size_used > 0) ? serializer->csv_separator : ""); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); } else { ndpi_serialization_type kt; u_int8_t type = 0; - u_int32_t type_offset = serializer->status.size_used++; + u_int32_t type_offset = serializer->status.buffer.size_used++; kt = ndpi_serialize_key_uint32(serializer, key); type = (kt << 4); @@ -878,7 +991,7 @@ int ndpi_serialize_uint32_float(ndpi_serializer *_serializer, ndpi_serialize_single_float(serializer, value); type |= ndpi_serialization_float; - serializer->buffer[type_offset] = type; + serializer->buffer.data[type_offset] = type; } serializer->status.flags |= NDPI_SERIALIZER_STATUS_NOT_EMPTY; @@ -890,7 +1003,7 @@ int ndpi_serialize_uint32_float(ndpi_serializer *_serializer, static int ndpi_serialize_uint32_binary(ndpi_serializer *_serializer, u_int32_t key, const char *value, u_int16_t slen) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed = sizeof(u_int8_t) /* type */ + sizeof(u_int32_t) /* key */ + @@ -901,30 +1014,31 @@ static int ndpi_serialize_uint32_binary(ndpi_serializer *_serializer, needed += 24 + slen; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += ndpi_json_string_escape(value, slen, - (char *) &serializer->buffer[serializer->status.size_used], buff_diff); - buff_diff = serializer->buffer_size - serializer->status.size_used; + serializer->status.buffer.size_used += ndpi_json_string_escape(value, slen, + (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, - "%s%s", (serializer->status.size_used > 0) ? serializer->csv_separator : "", value); + if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + "%s%s", (serializer->status.buffer.size_used > 0) ? serializer->csv_separator : "", value); } else { ndpi_serialization_type kt; u_int8_t type = 0; - u_int32_t type_offset = serializer->status.size_used++; + u_int32_t type_offset = serializer->status.buffer.size_used++; kt = ndpi_serialize_key_uint32(serializer, key); type = (kt << 4); @@ -932,7 +1046,7 @@ static int ndpi_serialize_uint32_binary(ndpi_serializer *_serializer, ndpi_serialize_single_string(serializer, value, slen); type |= ndpi_serialization_string; - serializer->buffer[type_offset] = type; + serializer->buffer.data[type_offset] = type; } serializer->status.flags |= NDPI_SERIALIZER_STATUS_NOT_EMPTY; @@ -952,7 +1066,7 @@ int ndpi_serialize_uint32_string(ndpi_serializer *_serializer, int ndpi_serialize_uint32_boolean(ndpi_serializer *_serializer, u_int32_t key, u_int8_t value) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed = 24; if(serializer->fmt != ndpi_serialization_format_json && @@ -960,29 +1074,30 @@ int ndpi_serialize_uint32_boolean(ndpi_serializer *_serializer, return -1; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", value ? "true" : "false"); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, - "%s%s", (serializer->status.size_used > 0) ? serializer->csv_separator : "", + if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + "%s%s", (serializer->status.buffer.size_used > 0) ? serializer->csv_separator : "", value ? "true" : "false"); } @@ -996,7 +1111,7 @@ static int ndpi_serialize_binary_int32(ndpi_serializer *_serializer, const char *key, u_int16_t klen, int32_t value) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed; if(ndpi_is_number(key, klen)) @@ -1012,41 +1127,42 @@ static int ndpi_serialize_binary_int32(ndpi_serializer *_serializer, needed += 16 + klen; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += ndpi_json_string_escape(key, klen, - (char *) &serializer->buffer[serializer->status.size_used], buff_diff); - buff_diff = serializer->buffer_size - serializer->status.size_used; - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], buff_diff, ":"); - buff_diff = serializer->buffer_size - serializer->status.size_used; + serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], buff_diff, "%d", value); + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%d", value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, - "%s%d", (serializer->status.size_used > 0) ? serializer->csv_separator : "", value); + if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + "%s%d", (serializer->status.buffer.size_used > 0) ? serializer->csv_separator : "", value); } else { if(value <= 127 && value >= -128) { - serializer->buffer[serializer->status.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_int8; + serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_int8; ndpi_serialize_single_string(serializer, key, klen); ndpi_serialize_single_uint8(serializer, value); } else if(value <= 32767 && value >= -32768) { - serializer->buffer[serializer->status.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_int16; + serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_int16; ndpi_serialize_single_string(serializer, key, klen); ndpi_serialize_single_uint16(serializer, value); } else { - serializer->buffer[serializer->status.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_int32; + serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_int32; ndpi_serialize_single_string(serializer, key, klen); ndpi_serialize_single_uint32(serializer, value); } @@ -1070,7 +1186,7 @@ int ndpi_serialize_binary_int64(ndpi_serializer *_serializer, const char *key, u_int16_t klen, int64_t value) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed; if(ndpi_is_number(key, klen)) @@ -1086,38 +1202,39 @@ int ndpi_serialize_binary_int64(ndpi_serializer *_serializer, needed += 16 + klen; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += ndpi_json_string_escape(key, klen, - (char *) &serializer->buffer[serializer->status.size_used], buff_diff); - buff_diff = serializer->buffer_size - serializer->status.size_used; - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], buff_diff, + serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], buff_diff, + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%lld", (long long int)value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, - "%s%lld", (serializer->status.size_used > 0) ? serializer->csv_separator : "", + if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + "%s%lld", (serializer->status.buffer.size_used > 0) ? serializer->csv_separator : "", (long long int)value); } else { if ((value & 0xFFFFFFFF) == value) { return(ndpi_serialize_string_int32(_serializer, key, value)); } else { - serializer->buffer[serializer->status.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_int64; + serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_int64; ndpi_serialize_single_string(serializer, key, klen); ndpi_serialize_single_uint32(serializer, value); } @@ -1139,7 +1256,7 @@ int ndpi_serialize_string_int64(ndpi_serializer *_serializer, static int ndpi_serialize_binary_uint32(ndpi_serializer *_serializer, const char *key, u_int16_t klen, u_int32_t value) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed; if(ndpi_is_number(key, klen)) @@ -1155,44 +1272,45 @@ static int ndpi_serialize_binary_uint32(ndpi_serializer *_serializer, needed += 16 + klen; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += ndpi_json_string_escape(key, klen, - (char *) &serializer->buffer[serializer->status.size_used], buff_diff); - buff_diff = serializer->buffer_size - serializer->status.size_used; + serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%u", value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, - "%s%u", (serializer->status.size_used > 0) ? serializer->csv_separator : "", value); + if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + "%s%u", (serializer->status.buffer.size_used > 0) ? serializer->csv_separator : "", value); } else { if(value <= 0xff) { - serializer->buffer[serializer->status.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_uint8; + serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_uint8; ndpi_serialize_single_string(serializer, key, klen); ndpi_serialize_single_uint8(serializer, value); } else if(value <= 0xffff) { - serializer->buffer[serializer->status.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_uint16; + serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_uint16; ndpi_serialize_single_string(serializer, key, klen); ndpi_serialize_single_uint16(serializer, value); } else { - serializer->buffer[serializer->status.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_uint32; + serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_uint32; ndpi_serialize_single_string(serializer, key, klen); ndpi_serialize_single_uint32(serializer, value); } @@ -1237,7 +1355,7 @@ static int ndpi_serialize_binary_uint64(ndpi_serializer *_serializer, const char *key, u_int16_t klen, u_int64_t value) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed; if(ndpi_is_number(key, klen)) @@ -1253,38 +1371,39 @@ static int ndpi_serialize_binary_uint64(ndpi_serializer *_serializer, needed += 32 + klen; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += ndpi_json_string_escape(key, klen, - (char *) &serializer->buffer[serializer->status.size_used], buff_diff); - buff_diff = serializer->buffer_size - serializer->status.size_used; - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], buff_diff, + serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], buff_diff, + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%llu", (unsigned long long)value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, - "%s%llu", (serializer->status.size_used > 0) ? serializer->csv_separator : "", + if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + "%s%llu", (serializer->status.buffer.size_used > 0) ? serializer->csv_separator : "", (unsigned long long)value); } else { if(value <= 0xffffffff) { return(ndpi_serialize_string_uint32(_serializer, key, value)); } else { - serializer->buffer[serializer->status.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_uint64; + serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_uint64; ndpi_serialize_single_string(serializer, key, klen); ndpi_serialize_single_uint64(serializer, value); } @@ -1309,7 +1428,7 @@ static int ndpi_serialize_binary_float(ndpi_serializer *_serializer, float value, const char *format /* e.f. "%.2f" */) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed; if(ndpi_is_number(key, klen)) @@ -1325,32 +1444,32 @@ static int ndpi_serialize_binary_float(ndpi_serializer *_serializer, needed += 32 + klen; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += ndpi_json_string_escape(key, klen, - (char *) &serializer->buffer[serializer->status.size_used], buff_diff); - buff_diff = serializer->buffer_size - serializer->status.size_used; - serializer->buffer[serializer->status.size_used] = ':'; - serializer->status.size_used++; + serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + serializer->buffer.data[serializer->status.buffer.size_used] = ':'; + serializer->status.buffer.size_used++; } - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, format, value); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - if(serializer->status.size_used > 0) - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, "%s", serializer->csv_separator); - - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, format, value); + if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); + if(serializer->status.buffer.size_used > 0) + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", serializer->csv_separator); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); } else { - serializer->buffer[serializer->status.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_float; + serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_float; ndpi_serialize_single_string(serializer, key, klen); ndpi_serialize_single_float(serializer, value); @@ -1379,7 +1498,7 @@ static int ndpi_serialize_binary_raw(ndpi_serializer *_serializer, u_int16_t vlen, u_int8_t escape) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed; needed = @@ -1393,36 +1512,37 @@ static int ndpi_serialize_binary_raw(ndpi_serializer *_serializer, needed += 16 + klen + vlen; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += ndpi_json_string_escape(key, klen, - (char *) &serializer->buffer[serializer->status.size_used], buff_diff); - buff_diff = serializer->buffer_size - serializer->status.size_used; - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, ":"); - buff_diff = serializer->buffer_size - serializer->status.size_used; + serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if (escape) - serializer->status.size_used += ndpi_json_string_escape(value, vlen, - (char *) &serializer->buffer[serializer->status.size_used], buff_diff); + serializer->status.buffer.size_used += ndpi_json_string_escape(value, vlen, + (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); else - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, value, vlen); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, + if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s%s", ndpi_serialize_is_not_empty(_serializer) ? serializer->csv_separator : "", value); } else { - serializer->buffer[serializer->status.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_string; + serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_string; ndpi_serialize_single_string(serializer, key, klen); ndpi_serialize_single_string(serializer, value, vlen); @@ -1479,7 +1599,7 @@ int ndpi_serialize_string_raw(ndpi_serializer *_serializer, int ndpi_serialize_string_boolean(ndpi_serializer *_serializer, const char *key, u_int8_t value) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int16_t klen = strlen(key); u_int32_t needed; @@ -1493,30 +1613,31 @@ int ndpi_serialize_string_boolean(ndpi_serializer *_serializer, needed = klen + 16; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.size_used += ndpi_json_string_escape(key, klen, - (char *) &serializer->buffer[serializer->status.size_used], buff_diff); - buff_diff = serializer->buffer_size - serializer->status.size_used; - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], buff_diff, ":"); - buff_diff = serializer->buffer_size - serializer->status.size_used; + serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.size_used += snprintf((char *) - &serializer->buffer[serializer->status.size_used], buff_diff, "%s", + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", value ? "true" : "false"); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, + if (ndpi_serializer_header_string(serializer, key, strlen(key)) < 0) return(-1); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s%s", ndpi_serialize_is_not_empty(_serializer) ? serializer->csv_separator : "", value ? "true" : "false"); } @@ -1531,7 +1652,7 @@ int ndpi_serialize_string_boolean(ndpi_serializer *_serializer, int ndpi_serialize_start_of_list(ndpi_serializer *_serializer, const char *key) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed, klen = strlen(key); if(serializer->fmt != ndpi_serialization_format_json) @@ -1540,18 +1661,18 @@ int ndpi_serialize_start_of_list(ndpi_serializer *_serializer, needed = 16 + klen; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } ndpi_serialize_json_pre(_serializer); - serializer->status.size_used += ndpi_json_string_escape(key, klen, - (char *) &serializer->buffer[serializer->status.size_used], buff_diff); - buff_diff = serializer->buffer_size - serializer->status.size_used; + serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, ": ["); + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ": ["); serializer->status.flags |= NDPI_SERIALIZER_STATUS_LIST | NDPI_SERIALIZER_STATUS_SOL; @@ -1583,7 +1704,7 @@ int ndpi_serialize_end_of_list(ndpi_serializer *_serializer) { int ndpi_serialize_start_of_block(ndpi_serializer *_serializer, const char *key) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed, klen = strlen(key); if(serializer->fmt != ndpi_serialization_format_json) @@ -1592,17 +1713,17 @@ int ndpi_serialize_start_of_block(ndpi_serializer *_serializer, needed = 16 + klen; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } ndpi_serialize_json_pre(_serializer); - serializer->status.size_used += ndpi_json_string_escape(key, klen, - (char *) &serializer->buffer[serializer->status.size_used], buff_diff); - buff_diff = serializer->buffer_size - serializer->status.size_used; - serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, ": {"); - buff_diff = serializer->buffer_size - serializer->status.size_used; + serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ": {"); + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; ndpi_serialize_json_post(_serializer); serializer->status.flags |= NDPI_SERIALIZER_STATUS_SOB; @@ -1615,7 +1736,7 @@ int ndpi_serialize_start_of_block(ndpi_serializer *_serializer, /* Serialize end of nested block (JSON only)*/ int ndpi_serialize_end_of_block(ndpi_serializer *_serializer) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed; if(serializer->fmt != ndpi_serialization_format_json) @@ -1624,15 +1745,15 @@ int ndpi_serialize_end_of_block(ndpi_serializer *_serializer) { needed = 4; if(buff_diff < needed) { - if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - buff_diff = serializer->buffer_size - serializer->status.size_used; + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } if(serializer->status.flags & NDPI_SERIALIZER_STATUS_SOB) /* Empty block */ serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_SOB; - // buff_diff = serializer->buffer_size - serializer->status.size_used; + // buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; ndpi_serialize_json_post(_serializer); return(0); @@ -1666,10 +1787,10 @@ void ndpi_serializer_rollback_snapshot(ndpi_serializer *_serializer) { if(serializer->fmt == ndpi_serialization_format_json) { if(serializer->status.flags & NDPI_SERIALIZER_STATUS_ARRAY) { - serializer->buffer[serializer->status.size_used-1] = ']'; + serializer->buffer.data[serializer->status.buffer.size_used-1] = ']'; } else { - serializer->buffer[0] = ' '; - serializer->buffer[serializer->status.size_used-1] = '}'; + serializer->buffer.data[0] = ' '; + serializer->buffer.data[serializer->status.buffer.size_used-1] = '}'; } } } @@ -1686,13 +1807,13 @@ int ndpi_init_deserializer_buf(ndpi_deserializer *_deserializer, if(serialized_buffer_len < (2 * sizeof(u_int8_t))) return(-1); - deserializer->buffer = serialized_buffer; + deserializer->buffer.data = serialized_buffer; - if(deserializer->buffer[0] != 1) + if(deserializer->buffer.data[0] != 1) return(-2); /* Invalid version */ - deserializer->buffer_size = serialized_buffer_len; - deserializer->fmt = deserializer->buffer[1]; + deserializer->buffer.size = serialized_buffer_len; + deserializer->fmt = deserializer->buffer.data[1]; ndpi_reset_serializer(_deserializer); return(0); @@ -1705,8 +1826,8 @@ int ndpi_init_deserializer(ndpi_deserializer *deserializer, ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; return(ndpi_init_deserializer_buf(deserializer, - serializer->buffer, - serializer->status.size_used)); + serializer->buffer.data, + serializer->status.buffer.size_used)); } /* ********************************** */ @@ -1721,10 +1842,10 @@ ndpi_serialization_format ndpi_deserialize_get_format(ndpi_deserializer *_deseri static inline ndpi_serialization_type ndpi_deserialize_get_key_subtype(ndpi_private_deserializer *deserializer) { u_int8_t type; - if(deserializer->status.size_used >= deserializer->buffer_size) + if(deserializer->status.buffer.size_used >= deserializer->buffer.size) return(ndpi_serialization_unknown); - type = deserializer->buffer[deserializer->status.size_used]; + type = deserializer->buffer.data[deserializer->status.buffer.size_used]; return((ndpi_serialization_type) (type >> 4)); } @@ -1734,10 +1855,10 @@ static inline ndpi_serialization_type ndpi_deserialize_get_key_subtype(ndpi_priv static inline ndpi_serialization_type ndpi_deserialize_get_value_subtype(ndpi_private_deserializer *deserializer) { u_int8_t type; - if(deserializer->status.size_used >= deserializer->buffer_size) + if(deserializer->status.buffer.size_used >= deserializer->buffer.size) return(ndpi_serialization_unknown); - type = deserializer->buffer[deserializer->status.size_used]; + type = deserializer->buffer.data[deserializer->status.buffer.size_used]; return(ndpi_serialization_type) (type & 0xf); } @@ -1783,13 +1904,13 @@ ndpi_serialization_type ndpi_deserialize_get_item_type(ndpi_deserializer *_deser /* ********************************** */ static inline int ndpi_deserialize_get_single_string_size(ndpi_private_deserializer *deserializer, u_int32_t offset) { - u_int32_t buff_diff = deserializer->buffer_size - offset; + u_int32_t buff_diff = deserializer->buffer.size - offset; u_int16_t expected, str_len; expected = sizeof(u_int16_t) /* len */; if(buff_diff < expected) return(-2); - str_len = ntohs(*((u_int16_t *) &deserializer->buffer[offset])); + str_len = ntohs(*((u_int16_t *) &deserializer->buffer.data[offset])); expected += str_len; if(buff_diff < expected) return(-2); @@ -1841,7 +1962,7 @@ static inline int ndpi_deserialize_get_single_size(ndpi_private_deserializer *de int ndpi_deserialize_next(ndpi_deserializer *_deserializer) { ndpi_private_deserializer *deserializer = (ndpi_private_deserializer *) _deserializer; - u_int32_t buff_diff = deserializer->buffer_size - deserializer->status.size_used; + u_int32_t buff_diff = deserializer->buffer.size - deserializer->status.buffer.size_used; ndpi_serialization_type kt, et; u_int16_t expected; int size; @@ -1851,20 +1972,20 @@ int ndpi_deserialize_next(ndpi_deserializer *_deserializer) { if(buff_diff < expected) return(-2); kt = ndpi_deserialize_get_key_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); expected += size; et = ndpi_deserialize_get_value_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); expected += size; - deserializer->status.size_used += expected; + deserializer->status.buffer.size_used += expected; return(0); } @@ -1874,7 +1995,7 @@ int ndpi_deserialize_next(ndpi_deserializer *_deserializer) { int ndpi_deserialize_key_uint32(ndpi_deserializer *_deserializer, u_int32_t *key) { ndpi_private_deserializer *deserializer = (ndpi_private_deserializer*)_deserializer; - u_int32_t offset, buff_diff = deserializer->buffer_size - deserializer->status.size_used; + u_int32_t offset, buff_diff = deserializer->buffer.size - deserializer->status.buffer.size_used; ndpi_serialization_type kt; u_int16_t expected; u_int16_t v16; @@ -1886,10 +2007,10 @@ int ndpi_deserialize_key_uint32(ndpi_deserializer *_deserializer, kt = ndpi_deserialize_get_key_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); - offset = deserializer->status.size_used + expected; + offset = deserializer->status.buffer.size_used + expected; switch(kt) { case ndpi_serialization_uint32: @@ -1917,7 +2038,7 @@ int ndpi_deserialize_key_string(ndpi_deserializer *_deserializer, ndpi_string *key) { ndpi_private_deserializer *deserializer = (ndpi_private_deserializer*)_deserializer; ndpi_serialization_type kt; - u_int32_t buff_diff = deserializer->buffer_size - deserializer->status.size_used; + u_int32_t buff_diff = deserializer->buffer.size - deserializer->status.buffer.size_used; u_int16_t expected; int size; @@ -1926,10 +2047,10 @@ int ndpi_deserialize_key_string(ndpi_deserializer *_deserializer, kt = ndpi_deserialize_get_key_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); - ndpi_deserialize_single_string(deserializer, deserializer->status.size_used + expected, key); + ndpi_deserialize_single_string(deserializer, deserializer->status.buffer.size_used + expected, key); return(0); } @@ -1940,7 +2061,7 @@ int ndpi_deserialize_value_uint32(ndpi_deserializer *_deserializer, u_int32_t *value) { ndpi_private_deserializer *deserializer = (ndpi_private_deserializer*)_deserializer; ndpi_serialization_type kt, et; - u_int32_t offset, buff_diff = deserializer->buffer_size - deserializer->status.size_used; + u_int32_t offset, buff_diff = deserializer->buffer.size - deserializer->status.buffer.size_used; u_int16_t v16; u_int8_t v8; u_int16_t expected; @@ -1950,16 +2071,16 @@ int ndpi_deserialize_value_uint32(ndpi_deserializer *_deserializer, if(buff_diff < expected) return(-2); kt = ndpi_deserialize_get_key_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); expected += size; et = ndpi_deserialize_get_value_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); - offset = deserializer->status.size_used + expected; + offset = deserializer->status.buffer.size_used + expected; switch(et) { case ndpi_serialization_uint32: @@ -1986,7 +2107,7 @@ int ndpi_deserialize_value_uint64(ndpi_deserializer *_deserializer, u_int64_t *value) { ndpi_private_deserializer *deserializer = (ndpi_private_deserializer*)_deserializer; ndpi_serialization_type kt, et; - u_int32_t buff_diff = deserializer->buffer_size - deserializer->status.size_used; + u_int32_t buff_diff = deserializer->buffer.size - deserializer->status.buffer.size_used; u_int32_t v32; u_int16_t expected; int size; @@ -1996,13 +2117,13 @@ int ndpi_deserialize_value_uint64(ndpi_deserializer *_deserializer, if(buff_diff < expected) return(-2); kt = ndpi_deserialize_get_key_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); expected += size; et = ndpi_deserialize_get_value_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); if(et != ndpi_serialization_uint64) { @@ -2012,7 +2133,7 @@ int ndpi_deserialize_value_uint64(ndpi_deserializer *_deserializer, return(rc); } - ndpi_deserialize_single_uint64(deserializer, deserializer->status.size_used + expected, value); + ndpi_deserialize_single_uint64(deserializer, deserializer->status.buffer.size_used + expected, value); return(0); } @@ -2023,7 +2144,7 @@ int ndpi_deserialize_value_int32(ndpi_deserializer *_deserializer, int32_t *value) { ndpi_private_deserializer *deserializer = (ndpi_private_deserializer*)_deserializer; ndpi_serialization_type kt, et; - u_int32_t offset, buff_diff = deserializer->buffer_size - deserializer->status.size_used; + u_int32_t offset, buff_diff = deserializer->buffer.size - deserializer->status.buffer.size_used; int16_t v16; int8_t v8; u_int16_t expected; @@ -2033,16 +2154,16 @@ int ndpi_deserialize_value_int32(ndpi_deserializer *_deserializer, if(buff_diff < expected) return(-2); kt = ndpi_deserialize_get_key_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); expected += size; et = ndpi_deserialize_get_value_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); - offset = deserializer->status.size_used + expected; + offset = deserializer->status.buffer.size_used + expected; switch(et) { case ndpi_serialization_int32: @@ -2069,7 +2190,7 @@ int ndpi_deserialize_value_int64(ndpi_deserializer *_deserializer, int64_t *value) { ndpi_private_deserializer *deserializer = (ndpi_private_deserializer*)_deserializer; ndpi_serialization_type kt, et; - u_int32_t buff_diff = deserializer->buffer_size - deserializer->status.size_used; + u_int32_t buff_diff = deserializer->buffer.size - deserializer->status.buffer.size_used; int32_t v32; u_int16_t expected; int size; @@ -2079,13 +2200,13 @@ int ndpi_deserialize_value_int64(ndpi_deserializer *_deserializer, if(buff_diff < expected) return(-2); kt = ndpi_deserialize_get_key_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); expected += size; et = ndpi_deserialize_get_value_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); if(et != ndpi_serialization_int64) { @@ -2095,7 +2216,7 @@ int ndpi_deserialize_value_int64(ndpi_deserializer *_deserializer, return(rc); } - ndpi_deserialize_single_int64(deserializer, deserializer->status.size_used + expected, value); + ndpi_deserialize_single_int64(deserializer, deserializer->status.buffer.size_used + expected, value); return(0); } @@ -2106,7 +2227,7 @@ int ndpi_deserialize_value_float(ndpi_deserializer *_deserializer, float *value) { ndpi_private_deserializer *deserializer = (ndpi_private_deserializer*)_deserializer; ndpi_serialization_type kt, et; - u_int32_t buff_diff = deserializer->buffer_size - deserializer->status.size_used; + u_int32_t buff_diff = deserializer->buffer.size - deserializer->status.buffer.size_used; u_int16_t expected; int size; @@ -2114,19 +2235,19 @@ int ndpi_deserialize_value_float(ndpi_deserializer *_deserializer, if(buff_diff < expected) return(-2); kt = ndpi_deserialize_get_key_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); expected += size; et = ndpi_deserialize_get_value_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); if(et != ndpi_serialization_float) return(-1); - ndpi_deserialize_single_float(deserializer, deserializer->status.size_used + expected, value); + ndpi_deserialize_single_float(deserializer, deserializer->status.buffer.size_used + expected, value); return(0); } @@ -2137,7 +2258,7 @@ int ndpi_deserialize_value_string(ndpi_deserializer *_deserializer, ndpi_string *value) { ndpi_private_deserializer *deserializer = (ndpi_private_deserializer*)_deserializer; ndpi_serialization_type kt, et; - u_int32_t buff_diff = deserializer->buffer_size - deserializer->status.size_used; + u_int32_t buff_diff = deserializer->buffer.size - deserializer->status.buffer.size_used; u_int16_t expected; int size; @@ -2145,19 +2266,19 @@ int ndpi_deserialize_value_string(ndpi_deserializer *_deserializer, if(buff_diff < expected) return(-2); kt = ndpi_deserialize_get_key_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); expected += size; et = ndpi_deserialize_get_value_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); if(et != ndpi_serialization_string) return(-1); - ndpi_deserialize_single_string(deserializer, deserializer->status.size_used + expected, value); + ndpi_deserialize_single_string(deserializer, deserializer->status.buffer.size_used + expected, value); return(0); } @@ -2168,8 +2289,8 @@ int ndpi_deserialize_value_string(ndpi_deserializer *_deserializer, int ndpi_deserialize_clone_item(ndpi_deserializer *_deserializer, ndpi_serializer *_serializer) { ndpi_private_deserializer *deserializer = (ndpi_private_deserializer *) _deserializer; ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - u_int32_t src_buff_diff = deserializer->buffer_size - deserializer->status.size_used; - u_int32_t dst_buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t src_buff_diff = deserializer->buffer.size - deserializer->status.buffer.size_used; + u_int32_t dst_buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; ndpi_serialization_type kt, et; u_int16_t expected; int size; @@ -2182,30 +2303,30 @@ int ndpi_deserialize_clone_item(ndpi_deserializer *_deserializer, ndpi_serialize if(src_buff_diff < expected) return(-2); kt = ndpi_deserialize_get_key_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, kt, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); expected += size; et = ndpi_deserialize_get_value_subtype(deserializer); - size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.size_used + expected); + size = ndpi_deserialize_get_single_size(deserializer, et, deserializer->status.buffer.size_used + expected); if(size < 0) return(-2); expected += size; if(dst_buff_diff < expected) { - if(ndpi_extend_serializer_buffer(_serializer, expected - dst_buff_diff) < 0) + if(ndpi_extend_serializer_buffer(&serializer->buffer, expected - dst_buff_diff) < 0) return(-1); - dst_buff_diff = serializer->buffer_size - serializer->status.size_used; + dst_buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - memcpy(&serializer->buffer[serializer->status.size_used], - &deserializer->buffer[deserializer->status.size_used], + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], + &deserializer->buffer.data[deserializer->status.buffer.size_used], expected); - serializer->status.size_used += expected; + serializer->status.buffer.size_used += expected; return(0); } |