void AnonModule::addAnonymization(InformationElement::IeInfo id, int len, AnonMethod::Method methodName, std::vector<map_info> mapping, const std::string& parameter) { static const struct ipfix_identifier* ident; AnonPrimitive* a = createPrimitive(methodName, parameter, mapping); if (methods.find(id) != methods.end()) { methods[id].primitive.push_back(a); } else { AnonIE ie; if (len == -1) { if (!(ident = ipfix_id_lookup(id.id, id.enterprise))) { msg(MSG_ERROR, "Unknown or unsupported id %s detected.", id.toString().c_str()); return; } len = ident->length; } ie.offset = ie.header = ie.packetClass = 0; // attention: if ie.len==0, anonField() assumes that it is a variable length field and the whole information element will be processed ie.len = len; ie.primitive.push_back(a); methods[id] = ie; } }
/** * Prints a string representation of IpfixRecord::Data to stdout. */ void PrintHelpers::printFieldData(InformationElement::IeInfo type, IpfixRecord::Data* pattern) { timeval t; uint64_t hbnum; string typeStr = type.toString(); // try to get the values aligned if (typeStr.length() < 60) fprintf(fh, "%-60s: ", type.toString().c_str()); else fprintf(fh, "%s: ", type.toString().c_str()); switch (type.enterprise) { case 0: switch (type.id) { case IPFIX_TYPEID_protocolIdentifier: printProtocol(type, pattern); return; case IPFIX_TYPEID_sourceIPv4Address: printIPv4(type, pattern); return; case IPFIX_TYPEID_destinationIPv4Address: printIPv4(type, pattern); return; case IPFIX_TYPEID_sourceTransportPort: printPort(type, pattern); return; case IPFIX_TYPEID_destinationTransportPort: printPort(type, pattern); return; case IPFIX_TYPEID_flowStartSeconds: case IPFIX_TYPEID_flowEndSeconds: case IPFIX_TYPEID_flowStartMilliSeconds: case IPFIX_TYPEID_flowEndMilliSeconds: case PSAMP_TYPEID_observationTimeSeconds: printLocaltime(type, pattern); return; case IPFIX_TYPEID_flowStartNanoSeconds: case IPFIX_TYPEID_flowEndNanoSeconds: hbnum = ntohll(*(uint64_t*)pattern); if (hbnum>0) { t = timentp64(*((ntp64*)(&hbnum))); fprintf(fh, "%u.%06d seconds", (int32_t)t.tv_sec, (int32_t)t.tv_usec); } else { fprintf(fh, "no value (only zeroes in field)"); } return; } break; case IPFIX_PEN_reverse: switch (type.id) { case IPFIX_TYPEID_flowStartNanoSeconds: case IPFIX_TYPEID_flowEndNanoSeconds: hbnum = ntohll(*(uint64_t*)pattern); if (hbnum>0) { t = timentp64(*((ntp64*)(&hbnum))); fprintf(fh, "%u.%06d seconds", (int32_t)t.tv_sec, (int32_t)t.tv_usec); } else { fprintf(fh, "no value (only zeroes in field)"); } return; } break; default: { if (type==InformationElement::IeInfo(IPFIX_ETYPEID_frontPayload, IPFIX_PEN_vermont) || type==InformationElement::IeInfo(IPFIX_ETYPEID_frontPayload, IPFIX_PEN_vermont|IPFIX_PEN_reverse)) { printFrontPayload(type, pattern); return; } } } printUint(type, pattern); }