Skip to content

multiple template set #2

Description

@fedy85

The library ignores template sets with multiple templates and merges all of them into the first one it finds in byte buffer.
I've made a fix. Could you merge it into the master ?

/ipfix_node/lib/ipfix_packet_elements/template_set/record.js

--- record.js.backup    2023-06-20 22:56:54.323450660 +0200
+++ record.js   2023-06-21 11:09:49.482162620 +0200
@@ -4,20 +4,31 @@
     this.templateId = undefined;
     this.numberFields = undefined;
     this.FieldSpecifiers = []
+
+    this.isLast = false;
+    this.newBuffer = null;
+
     var _construct = function() {
-        var i = 0;
-        self.setId = buffer.readUInt16BE(i)
-        self.sizeInBytes = buffer.readUInt16BE(i += 2);
-        self.templateId = buffer.readUInt16BE(i += 2);
-        self.numberFields = buffer.readUInt16BE(i += 2);
-        buffer = buffer.slice(i += 2);
+        var byte = 0;
+        self.setId = buffer.readUInt16BE(byte)
+        self.sizeInBytes = buffer.readUInt16BE(byte += 2);
+        self.templateId = buffer.readUInt16BE(byte += 2);
+        self.numberFields = buffer.readUInt16BE(byte += 2);
+
+        var headerBuffer = buffer.slice(0, 4);
+        var setBuffer = buffer.slice(byte += 2);

-        while (i < self.sizeInBytes) {
-            var FreshSpecifier = new TemplateRecordFieldSpecifier(buffer);
+        var i = 0;
+        while (i < self.numberFields) {
+            var FreshSpecifier = new TemplateRecordFieldSpecifier(setBuffer);
             self.FieldSpecifiers.push(FreshSpecifier);
-            buffer = buffer.slice(4);
-            i += 4;
+            setBuffer = setBuffer.slice(4);
+            i++;
         }
+
+        self.isLast = (setBuffer.byteLength == 0) ? true : false;
+        self.newBuffer = Buffer.concat([headerBuffer, setBuffer]);
+
         return this;
     }

and

/ipfix_node/lib/ipfix_packet_elements/ipfix_packet.js

--- ipfix_packet.js.backup      2023-06-21 11:19:55.764359997 +0200
+++ ipfix_packet.js     2023-06-21 11:10:10.354236553 +0200
@@ -22,10 +22,16 @@
             var setType = getSetType(setId);
             var sizeInBytes = buffer.readUInt16BE(2);
             if (setType == 'DataTemplate') {
-                var TemplateSet = new TemplateRecord(buffer);
+                var isLast = false;
+                while (!isLast) {
+                    var TemplateSet = new TemplateRecord(buffer);

-                storeTemplate(TemplateSet);
-                self.TemplateSets.push(TemplateSet);
+                    buffer = TemplateSet.newBuffer;
+                    isLast = TemplateSet.isLast;
+
+                    storeTemplate(TemplateSet);
+                    self.TemplateSets.push(TemplateSet);
+                }
             } else if (setType == 'OptionTemplate') {
                 var OptionsTemplateSet = new OptionsTemplateRecord(buffer);
                 storeTemplate(OptionsTemplateSet);

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions