-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
The library accepts only one flow in a packet. But IPFIX packet contains more than one.
I've made a fix. Could you merge it into the master ?
/ipfix_node/lib/ipfix_packet_elements/data_set/record.js
--- record.js.backup 2023-06-30 13:38:51.447062387 +0200
+++ record.js 2023-06-30 13:42:54.227860127 +0200
@@ -4,29 +4,22 @@
this.dataSetType = undefined;
this.Fields = [];
var template = params.template;
+ this.byteLength = 0;
var self = this;
var _construct = function() {
- var i = 0;
- self.templateId = buffer.readUInt16BE(i);
- //Prepare buffer for the record
- buffer = buffer.slice(4);
-
- var currentField = 0;
-
var CachedFieldSpecifiers = template.FieldSpecifiers;
var cfsLength = Object.keys(CachedFieldSpecifiers).length
var currentField = 0;
-
while (currentField < cfsLength) {
var cachedField = CachedFieldSpecifiers[currentField];
var FreshField = new FieldSpecifier(buffer, cachedField, params);
self.Fields.push(FreshField);
+ self.byteLength += FreshField.sizeInBytes;
buffer = buffer.slice(FreshField.sizeInBytes);
currentField++;
}
-
return this;
};and
/ipfix_node/lib/ipfix_packet_elements/ipfix_packet.js
(contains changes from my previous issue with multiple templates)
--- ipfix_packet.js.backup 2023-06-30 13:47:43.396803003 +0200
+++ ipfix_packet.js 2023-06-30 13:47:20.540728681 +0200
@@ -18,14 +18,20 @@
self.Header = new IpfixHeader(buffer);
buffer = buffer.slice(self.Header.sizeInBytes);
while (buffer.byteLength > 0) {
+
var setId = buffer.readUInt16BE(0);
var setType = getSetType(setId);
var sizeInBytes = buffer.readUInt16BE(2);
- if (setType == 'DataTemplate') {
- var TemplateSet = new TemplateRecord(buffer);
- storeTemplate(TemplateSet);
- self.TemplateSets.push(TemplateSet);
+ if (setType == 'DataTemplate') {
+ var isLast = false;
+ while (!isLast) {
+ var TemplateSet = new TemplateRecord(buffer);
+ buffer = TemplateSet.newBuffer;
+ isLast = TemplateSet.isLast;
+ storeTemplate(TemplateSet);
+ self.TemplateSets.push(TemplateSet);
+ }
} else if (setType == 'OptionTemplate') {
var OptionsTemplateSet = new OptionsTemplateRecord(buffer);
storeTemplate(OptionsTemplateSet);
@@ -57,15 +63,20 @@
if(typeof template == 'undefined')
return console.error(`Couldn't fetch template with id ${templateNeeded.id}`)
try{
- var DataSet = new DataSetRecord(buffer,{template: template, parseDataValues: params.parseDataValues});
- self.DataSets.push(DataSet);
+ var templateId = buffer.readUInt16BE(0);
+ buffer = buffer.slice(4);
+ while (buffer.byteLength > 1) { // padding byte at the end
+ var DataSet = new DataSetRecord(buffer,{template: template, parseDataValues: params.parseDataValues});
+ DataSet.templateId = templateId;
+ self.DataSets.push(DataSet);
+ buffer = buffer.slice(DataSet.byteLength);
+ }
}catch(e){
console.error(e);
console.error(`Couldn't deserialize template with id ${templateNeeded.id}`);
console.error(`Template with id ${templateNeeded.id} has invalid structure !`);
}
}
-
buffer = buffer.slice(sizeInBytes);
}
};Metadata
Metadata
Assignees
Labels
No labels