From 31137a3f5b893c17d3bb3295916b133b79e6b7c7 Mon Sep 17 00:00:00 2001 From: Peter Haag Date: Sun, 31 Dec 2017 12:43:40 +0100 Subject: [PATCH] Fix sampling for Juniper MX104. No sampling algorithm required --- ChangeLog | 10 ++++++++-- bin/ipfix.c | 23 +++++++++++++++-------- bin/ipfix.h | 9 ++++++++- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index eb9ffda..0aa8376 100755 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,12 @@ -2017-12-29 +2017-12-31 +- IPFIX sampling - sampling algorithm no longer required for tag #34 +- IPFIX sampling add tags #305 and #304 - set them identical to #34, #35 + +2017-12-30 - Add new output format json. Print each record as individual json object 2017-12-28 -- Add sampling elements ID 302,304,305. put them identcal to ID 48,49,50 +- Add sampling elements ID 302,304,305. put them identical to ID 48,49,50 - Add option to label filter terms. syntax: () %labelname. - Add %lbl option to print flow label in output - Update nfdump(1) man page for flowlabels @@ -26,6 +30,8 @@ - Add ipfix sampling. Process option template/record with sampling elements 34 and 35 - Report updates on existing samplers in v9 only if values change. issue 84 +2017-11-05 v1.6.16 + 2017-12-10 - Add lz4 compression - Remove old xstat legancy code, not needed diff --git a/bin/ipfix.c b/bin/ipfix.c index c983bd5..925ec5a 100644 --- a/bin/ipfix.c +++ b/bin/ipfix.c @@ -1349,7 +1349,8 @@ uint16_t offset_std_sampler_interval, offset_std_sampler_algorithm, found_std_sa switch (id) { // general sampling - case IPFIX_samplingInterval: + case IPFIX_samplingInterval: // legacy #34 + case IPFIX_samplingPacketInterval: // #305 if ( length == 4 ) { offset_std_sampler_interval = offset; found_std_sampling++; @@ -1359,7 +1360,8 @@ uint16_t offset_std_sampler_interval, offset_std_sampler_algorithm, found_std_sa exporter->info.id, length); } break; - case IPFIX_samplingAlgorithm: + case IPFIX_samplingAlgorithm: // legacy #35 + case IPFIX_selectorAlgorithm: // #304 if ( length == 1 ) { offset_std_sampler_algorithm = offset; dbg_printf(" 1 byte sampling algorithm option at offset: %u\n", offset); @@ -1374,12 +1376,16 @@ uint16_t offset_std_sampler_interval, offset_std_sampler_algorithm, found_std_sa offset += length; } - if ( found_std_sampling == 2 ) { // need all two tags - dbg_printf("[%u] Std sampling information found\n", exporter->info.id); + if ( offset_std_sampler_interval ) { + dbg_printf("[%u] Std sampling interval found. offset: %u\n", + exporter->info.id, offset_std_sampler_interval); + if ( offset_std_sampler_algorithm ) + dbg_printf("[%u] Std sampling algorithm found. offset: %u\n", + exporter->info.id, offset_std_sampler_algorithm); InsertStdSamplerOffset(fs, id, offset_std_sampler_interval, offset_std_sampler_algorithm); - } + dbg_printf("\n"); + } - dbg_printf("\n"); processed_records++; } // End of Process_ipfix_option_templates @@ -1747,7 +1753,8 @@ uint8_t *in; } else { id = in[offset_table->offset_id]; } - mode = in[offset_table->offset_mode]; + + mode = offset_table->offset_mode ? in[offset_table->offset_mode] : 0; interval = Get_val32((void *)&in[offset_table->offset_interval]); InsertSampler(fs, exporter, id, mode, interval); @@ -1760,7 +1767,7 @@ uint8_t *in; if ( TestFlag(offset_table->flags, HAS_STD_SAMPLER_DATA) ) { int32_t id = -1; - uint16_t mode = in[offset_table->offset_std_sampler_algorithm]; + uint16_t mode = offset_table->offset_std_sampler_algorithm ? in[offset_table->offset_std_sampler_algorithm] : 0; uint32_t interval = Get_val32((void *)&in[offset_table->offset_std_sampler_interval]); InsertSampler(fs, exporter, id, mode, interval); diff --git a/bin/ipfix.h b/bin/ipfix.h index 46f81ba..4f96d79 100644 --- a/bin/ipfix.h +++ b/bin/ipfix.h @@ -228,9 +228,16 @@ typedef struct ipfix_template_elements_e_s { #define IPFIX_DestinationIPv6PrefixLength 30 #define IPFIX_flowLabelIPv6 31 #define IPFIX_icmpTypeCodeIPv4 32 -// 33 igmpTYpe + +// deprecated elements for sampling #define IPFIX_samplingInterval 34 #define IPFIX_samplingAlgorithm 35 +// 1 - Deterministic Sampling, +// 2 - Random Sampling. + +#define IPFIX_samplingPacketInterval 305 +#define IPFIX_selectorAlgorithm 304 + // reserved 38, 39 // reserved 48, 49, 50, 51