/** * \brief Store data record */ void Storage::storeDataRecord(struct metadata *mdata, struct json_conf * config) { const char *element_name = NULL; ELEMENT_TYPE element_type; offset = 0; uint16_t trans_len = 0; const char *trans_str = NULL; record.clear(); STR_APPEND(record, "{\"@type\": \"ipfix.entry\", "); struct ipfix_template *templ = mdata->record.templ; uint8_t *data_record = (uint8_t*) mdata->record.record; /* get all fields */ uint16_t added = 0; for (uint16_t count = 0, index = 0; count < templ->field_count; ++count, ++index) { /* Get Enterprise number and ID */ id = templ->fields[index].ie.id; length = templ->fields[index].ie.length; enterprise = 0; if (id & 0x8000) { id &= 0x7fff; enterprise = templ->fields[++index].enterprise_number; } /* Get element informations */ const ipfix_element_t * element = get_element_by_id(id, enterprise); if (element != NULL) { element_name = element->name; element_type = element->type; } else { // Element not found if (config->ignoreUnknown) { offset += realLength(length, data_record, offset); continue; } element_name = rawName(enterprise, id); element_type = ET_UNASSIGNED; MSG_DEBUG(msg_module, "Unknown element (%s)", element_name); } if (added > 0) { STR_APPEND(record, ", "); } STR_APPEND(record, "\""); record += config->prefix; record += element_name; STR_APPEND(record, "\": "); switch (element_type) { case ET_UNSIGNED_8: case ET_UNSIGNED_16: case ET_UNSIGNED_32: case ET_UNSIGNED_64:{ trans_str = translator.toUnsigned(length, &trans_len, data_record, offset, element, config); record.append(trans_str, trans_len); } break; case ET_SIGNED_8: case ET_SIGNED_16: case ET_SIGNED_32: case ET_SIGNED_64: trans_str = translator.toSigned(length, &trans_len, data_record, offset); record.append(trans_str, trans_len); break; case ET_FLOAT_32: case ET_FLOAT_64: trans_str = translator.toFloat(length, &trans_len, data_record, offset); record.append(trans_str, trans_len); break; case ET_IPV4_ADDRESS: record += '"'; trans_str = translator.formatIPv4(read32(data_record + offset), &trans_len); record.append(trans_str, trans_len); record += '"'; break; case ET_IPV6_ADDRESS: READ_BYTE_ARR(addr6, data_record + offset, IPV6_LEN); record += '"'; record += translator.formatIPv6(addr6); record += '"'; break; case ET_MAC_ADDRESS: READ_BYTE_ARR(addrMac, data_record + offset, MAC_LEN); record += '"'; record += translator.formatMac(addrMac); record += '"'; break; case ET_DATE_TIME_SECONDS: record += translator.formatTimestamp(read32(data_record + offset), t_units::SEC, config); break; case ET_DATE_TIME_MILLISECONDS: record += translator.formatTimestamp(read64(data_record + offset), t_units::MILLISEC, config); break; case ET_DATE_TIME_MICROSECONDS: record += translator.formatTimestamp(read64(data_record + offset), t_units::MICROSEC, config); break; case ET_DATE_TIME_NANOSECONDS: record += translator.formatTimestamp(read64(data_record + offset), t_units::NANOSEC, config); break; case ET_STRING: length = realLength(length, data_record, offset); record += translator.escapeString(length, data_record + offset, config); break; case ET_BOOLEAN: case ET_UNASSIGNED: default: readRawData(length, data_record, offset); break; } offset += length; added++; } /* Store metadata */ if (processMetadata) { STR_APPEND(record, ", \"ipfix.metadata\": {"); storeMetadata(mdata); STR_APPEND(record, "}"); } STR_APPEND(record, "}\n"); sendData(); }
/** * \brief Store data record */ void Storage::storeDataRecord(struct metadata *mdata) { offset = 0; record.clear(); record += "{\"@type\": \"ipfix.entry\", \"ipfix\": {"; struct ipfix_template *templ = mdata->record.templ; uint8_t *data_record = (uint8_t*) mdata->record.record; /* get all fields */ for (uint16_t count = 0, index = 0; count < templ->field_count; ++count, ++index) { /* Get Enterprise number and ID */ id = templ->fields[index].ie.id; length = templ->fields[index].ie.length; enterprise = 0; if (id & 0x8000) { id &= 0x7fff; enterprise = templ->fields[++index].enterprise_number; } /* Get element informations */ struct ipfix_element& element = elements[enterprise][id]; if (element.type == UNKNOWN && element.name.empty()) { element.name = rawName(enterprise, id); elements[enterprise][id] = element; MSG_DEBUG(msg_module, "Unknown element (%s)", element.name.c_str()); } if (count > 0) { record += ", "; } record += "\""; record += element.name; record += "\": \""; switch (element.type) { case PROTOCOL: record += translator.formatProtocol(read8(data_record + offset)); break; case FLAGS: record += translator.formatFlags(read16(data_record + offset)); break; case IPV4: record += translator.formatIPv4(read32(data_record + offset)); break; case IPV6:{ READ_BYTE_ARR(addr6, data_record + offset, IPV6_LEN); record += translator.formatIPv6(addr6); break;} case MAC: { READ_BYTE_ARR(addrMac, data_record + offset, MAC_LEN); record += translator.formatMac(addrMac); break;} case TSTAMP_SEC: record += translator.formatTimestamp(read64(data_record + offset), t_units::SEC); break; case TSTAMP_MILLI: record += translator.formatTimestamp(read64(data_record + offset), t_units::MILLISEC); break; case TSTAMP_MICRO: record += translator.formatTimestamp(read64(data_record + offset), t_units::MICROSEC); break; case TSTAMP_NANO: record += translator.formatTimestamp(read64(data_record + offset), t_units::NANOSEC); break; case STRING: readString(length, data_record, offset); break; case RAW: readRawData(length, data_record, offset); break; default: readRawData(length, data_record, offset); break; } record += "\""; offset += length; } /* Store metadata */ if (processMetadata) { record += "}, \"metadata\": {"; storeMetadata(mdata); } record += "}}\n"; sendData(); }