Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions decoders/sflow/datastructure.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down
20 changes: 17 additions & 3 deletions decoders/sflow/sflow.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down
5 changes: 3 additions & 2 deletions decoders/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down