Skip to content

Commit

Permalink
allow any flow sample element to be included in a discard sample; bum…
Browse files Browse the repository at this point in the history
…p version to 6.03
  • Loading branch information
sflow committed Mar 12, 2024
1 parent c1eeb55 commit 4b18116
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 87 deletions.
2 changes: 1 addition & 1 deletion configure.ac
Expand Up @@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.57)
AC_INIT([sflowtool],[6.02])
AC_INIT([sflowtool],[6.03])
AC_CONFIG_SRCDIR([src/sflowtool.c])
AM_INIT_AUTOMAKE
AM_CONFIG_HEADER(config.h)
Expand Down
2 changes: 1 addition & 1 deletion sflowtool.spec
@@ -1,6 +1,6 @@
Summary: tool to ascii-print or forward sFlow datagrams
Name: sflowtool
Version: 6.02
Version: 6.03
Release: 1%{?dist}
License: https://www.inmon.com/technology/sflowlicense.txt
Group: Productivity/Networking/Diagnostic
Expand Down
152 changes: 67 additions & 85 deletions src/sflowtool.c
Expand Up @@ -3865,64 +3865,13 @@ static void readFlowSample_v2v4(SFSample *sample)
}

/*_________________---------------------------__________________
_________________ readFlowSample __________________
_________________ readFlowSampleElements __________________
-----------------___________________________------------------
*/

static void readFlowSample(SFSample *sample, int expanded)
static void readFlowSampleElements(SFSample *sample)
{
SFStr buf;
uint32_t num_elements, sampleLength;
uint8_t *sampleStart;

sf_logf(sample, "sampleType", "FLOWSAMPLE");
sampleLength = getData32(sample);
sampleStart = (uint8_t *)sample->datap;
sample->s.samplesGenerated = getData32(sample);
if(expanded) {
sample->s.ds_class = getData32(sample);
sample->s.ds_index = getData32(sample);
}
else {
uint32_t samplerId = getData32(sample);
sample->s.ds_class = samplerId >> 24;
sample->s.ds_index = samplerId & 0x00ffffff;
}
sf_logf_U32(sample, "sampleSequenceNo", sample->s.samplesGenerated);
sf_logf(sample, "sourceId", printDataSource(sample->s.ds_class, sample->s.ds_index, &buf));

sample->s.meanSkipCount = getData32(sample);
sample->s.samplePool = getData32(sample);
sample->s.dropEvents = getData32(sample);
sf_logf_U32(sample, "meanSkipCount", sample->s.meanSkipCount);
sf_logf_U32(sample, "samplePool", sample->s.samplePool);
sf_logf_U32(sample, "dropEvents", sample->s.dropEvents);
if(expanded) {
sample->s.inputPortFormat = getData32(sample);
sample->s.inputPort = getData32(sample);
sample->s.outputPortFormat = getData32(sample);
sample->s.outputPort = getData32(sample);
}
else {
uint32_t inp, outp;
inp = getData32(sample);
outp = getData32(sample);
sample->s.inputPortFormat = inp >> 30;
sample->s.outputPortFormat = outp >> 30;
sample->s.inputPort = inp & 0x3fffffff;
sample->s.outputPort = outp & 0x3fffffff;
}

sf_logf(sample, "inputPort", printInOutPort(sample->s.inputPort, sample->s.inputPortFormat, &buf));
sf_logf(sample, "outputPort", printInOutPort(sample->s.outputPort, sample->s.outputPortFormat, &buf));

/* clear the CLF record */
sfCLF.valid = NO;
sfCLF.client[0] = '\0';

if(sfConfig.outputFormat == SFLFMT_JSON)
json_start_ar("elements");

uint32_t num_elements;
num_elements = getData32(sample);
{
uint32_t el;
Expand Down Expand Up @@ -3993,6 +3942,69 @@ static void readFlowSample(SFSample *sample, int expanded)
json_end_ob();
}
}
}

/*_________________---------------------------__________________
_________________ readFlowSample __________________
-----------------___________________________------------------
*/

static void readFlowSample(SFSample *sample, int expanded)
{
SFStr buf;
uint32_t num_elements, sampleLength;
uint8_t *sampleStart;

sf_logf(sample, "sampleType", "FLOWSAMPLE");
sampleLength = getData32(sample);
sampleStart = (uint8_t *)sample->datap;
sample->s.samplesGenerated = getData32(sample);
if(expanded) {
sample->s.ds_class = getData32(sample);
sample->s.ds_index = getData32(sample);
}
else {
uint32_t samplerId = getData32(sample);
sample->s.ds_class = samplerId >> 24;
sample->s.ds_index = samplerId & 0x00ffffff;
}
sf_logf_U32(sample, "sampleSequenceNo", sample->s.samplesGenerated);
sf_logf(sample, "sourceId", printDataSource(sample->s.ds_class, sample->s.ds_index, &buf));

sample->s.meanSkipCount = getData32(sample);
sample->s.samplePool = getData32(sample);
sample->s.dropEvents = getData32(sample);
sf_logf_U32(sample, "meanSkipCount", sample->s.meanSkipCount);
sf_logf_U32(sample, "samplePool", sample->s.samplePool);
sf_logf_U32(sample, "dropEvents", sample->s.dropEvents);
if(expanded) {
sample->s.inputPortFormat = getData32(sample);
sample->s.inputPort = getData32(sample);
sample->s.outputPortFormat = getData32(sample);
sample->s.outputPort = getData32(sample);
}
else {
uint32_t inp, outp;
inp = getData32(sample);
outp = getData32(sample);
sample->s.inputPortFormat = inp >> 30;
sample->s.outputPortFormat = outp >> 30;
sample->s.inputPort = inp & 0x3fffffff;
sample->s.outputPort = outp & 0x3fffffff;
}

sf_logf(sample, "inputPort", printInOutPort(sample->s.inputPort, sample->s.inputPortFormat, &buf));
sf_logf(sample, "outputPort", printInOutPort(sample->s.outputPort, sample->s.outputPortFormat, &buf));

/* clear the CLF record */
sfCLF.valid = NO;
sfCLF.client[0] = '\0';

if(sfConfig.outputFormat == SFLFMT_JSON)
json_start_ar("elements");

readFlowSampleElements(sample);

lengthCheck(sample, "flow_sample", sampleStart, sampleLength);
if(sfConfig.outputFormat == SFLFMT_JSON)
json_end_ar();
Expand Down Expand Up @@ -4101,37 +4113,7 @@ static void readDiscardSample(SFSample *sample)
json_start_ar("elements");

sf_logf_pushPrefix(sample, "discarded_");

num_elements = getData32(sample);
{
uint32_t el;
for(el = 0; el < num_elements; el++) {
uint32_t tag, length;
uint8_t *start;
SFStr buf;
if(sfConfig.outputFormat == SFLFMT_JSON) {
json_start_ob(NULL);
}
tag = sample->s.elementType = getData32(sample);
sf_logf(sample, "flowBlock_tag", printTag(tag, &buf));
length = getData32(sample);
start = (uint8_t *)sample->datap;

// TODO: separate fn for flow-sample elements?
switch(tag) {
case SFLFLOW_HEADER: readFlowSample_header(sample); break;
case SFLFLOW_EX_FUNCTION: readExtendedFunction(sample); break;
case SFLFLOW_EX_EGRESS_Q: readExtendedEgressQueue(sample); break;
case SFLFLOW_EX_HW_TRAP: readExtendedHardwareTrap(sample); break;
case SFLFLOW_EX_LINUX_REASON: readExtendedLinuxReason(sample); break;
default: skipTLVRecord(sample, tag, length, "discard_sample_element"); break;
}
lengthCheck(sample, "discard_sample_element", start, length);
if(sfConfig.outputFormat == SFLFMT_JSON)
json_end_ob();
}
}

readFlowSampleElements(sample);
sf_logf_popPrefix(sample);

lengthCheck(sample, "discard_sample", sampleStart, sampleLength);
Expand Down

0 comments on commit 4b18116

Please sign in to comment.