diff --git a/decoders/sflow/datastructure.go b/decoders/sflow/datastructure.go index 515e0916..52847c52 100644 --- a/decoders/sflow/datastructure.go +++ b/decoders/sflow/datastructure.go @@ -91,6 +91,17 @@ type ExtendedFunction struct { Symbol string `json:"symbol"` } +// Host sFlow extension: Devlink Trap name +type ExtendedHwTrap struct { + Group string `json:"group"` + Trap string `json:"trap"` +} + +// Host sFlow extension: Linux drop_monitor reason +type ExtendedLinuxDropReason struct { + Reason string `json:"reason"` +} + // IfCounters stores interface counter statistics. type IfCounters struct { IfIndex uint32 `json:"if-index"` diff --git a/decoders/sflow/sflow.go b/decoders/sflow/sflow.go index 879773c2..f86676fd 100644 --- a/decoders/sflow/sflow.go +++ b/decoders/sflow/sflow.go @@ -37,9 +37,11 @@ const ( FLOW_TYPE_EXT_VLAN_TUNNEL = 1012 // According to https://sflow.org/sflow_drops.txt - FLOW_TYPE_EGRESS_QUEUE = 1036 - FLOW_TYPE_EXT_ACL = 1037 - FLOW_TYPE_EXT_FUNCTION = 1038 + FLOW_TYPE_EGRESS_QUEUE = 1036 + FLOW_TYPE_EXT_ACL = 1037 + FLOW_TYPE_EXT_FUNCTION = 1038 + FLOW_TYPE_EXT_HW_TRAP = 1041 + FLOW_TYPE_EXT_LINUX_DROP_REASON = 1042 ) // Opaque counter_data types according to https://sflow.org/SFLOW-STRUCTS5.txt @@ -351,6 +353,18 @@ func DecodeFlowRecord(header *RecordHeader, payload *bytes.Buffer) (FlowRecord, return flowRecord, &RecordError{header.DataFormat, err} } flowRecord.Data = function + case FLOW_TYPE_EXT_HW_TRAP: + var hwTrap ExtendedHwTrap + if err := utils.BinaryDecoder(payload, &hwTrap.Group, &hwTrap.Trap); err != nil { + return flowRecord, &RecordError{header.DataFormat, err} + } + flowRecord.Data = hwTrap + case FLOW_TYPE_EXT_LINUX_DROP_REASON: + var linuxDrop ExtendedLinuxDropReason + if err := utils.BinaryDecoder(payload, &linuxDrop.Reason); err != nil { + return flowRecord, &RecordError{header.DataFormat, err} + } + flowRecord.Data = linuxDrop default: var rawRecord RawRecord rawRecord.Data = payload.Bytes() diff --git a/decoders/utils/utils.go b/decoders/utils/utils.go index 6d0474b9..d4618577 100644 --- a/decoders/utils/utils.go +++ b/decoders/utils/utils.go @@ -55,11 +55,12 @@ func BinaryRead(payload BytesBuffer, order binary.ByteOrder, data any) error { *data = order.Uint64(bs) case *string: strlen := int(order.Uint32(bs)) - buf := payload.Next(strlen) + paddedlen := (strlen + 3) &^ 3 // Pad to 4-byte boundary + buf := payload.Next(paddedlen) if len(buf) < strlen { return io.ErrUnexpectedEOF } - *data = string(buf) + *data = string(buf[:strlen]) case []bool: for i, x := range bs { // Easier to loop over the input for 8-bit values. data[i] = x != 0