示例#1
0
/**
 * \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();
}
示例#2
0
/**
 * \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();
}