1
0
mirror of https://github.com/netsampler/goflow2.git synced 2024-05-06 15:54:52 +00:00

85 lines
1.8 KiB
Go
Raw Normal View History

2021-05-22 16:12:26 -07:00
package netflowlegacy
import (
"bytes"
"fmt"
2023-08-09 19:47:20 -07:00
"github.com/netsampler/goflow2/v2/decoders/utils"
2021-05-22 16:12:26 -07:00
)
2023-08-09 19:47:20 -07:00
type DecoderError struct {
Err error
2021-05-22 16:12:26 -07:00
}
2023-08-09 19:47:20 -07:00
func (e *DecoderError) Error() string {
return fmt.Sprintf("NetFlowLegacy %s", e.Err.Error())
2021-05-22 16:12:26 -07:00
}
2023-08-09 19:47:20 -07:00
func (e *DecoderError) Unwrap() error {
return e.Err
2021-05-22 16:12:26 -07:00
}
2023-08-09 19:47:20 -07:00
func DecodeMessageVersion(payload *bytes.Buffer, packet *PacketNetFlowV5) error {
2021-05-22 16:12:26 -07:00
var version uint16
2023-08-09 19:47:20 -07:00
if err := utils.BinaryDecoder(payload, &version); err != nil {
return err
}
2023-08-09 19:47:20 -07:00
packet.Version = version
if packet.Version != 5 {
return &DecoderError{fmt.Errorf("unknown version %d", version)}
}
return DecodeMessage(payload, packet)
}
2021-05-22 16:12:26 -07:00
2023-08-09 19:47:20 -07:00
func DecodeMessage(payload *bytes.Buffer, packet *PacketNetFlowV5) error {
if err := utils.BinaryDecoder(payload,
&packet.Count,
&packet.SysUptime,
&packet.UnixSecs,
&packet.UnixNSecs,
&packet.FlowSequence,
&packet.EngineType,
&packet.EngineId,
&packet.SamplingInterval,
); err != nil {
return &DecoderError{err}
2021-05-22 16:12:26 -07:00
}
2023-08-09 19:47:20 -07:00
packet.Records = make([]RecordsNetFlowV5, int(packet.Count)) // maximum is 65535 which would be 3MB
for i := 0; i < int(packet.Count) && payload.Len() >= 48; i++ {
record := RecordsNetFlowV5{}
var srcAddr, dstAddr, nextHop uint32
if err := utils.BinaryDecoder(payload,
&srcAddr,
&dstAddr,
&nextHop,
&record.Input,
&record.Output,
&record.DPkts,
&record.DOctets,
&record.First,
&record.Last,
&record.SrcPort,
&record.DstPort,
&record.Pad1,
&record.TCPFlags,
&record.Proto,
&record.Tos,
&record.SrcAS,
&record.DstAS,
&record.SrcMask,
&record.DstMask,
&record.Pad2,
); err != nil {
2023-08-09 19:47:20 -07:00
return &DecoderError{err}
}
record.SrcAddr = IPAddress(srcAddr)
record.DstAddr = IPAddress(dstAddr)
record.NextHop = IPAddress(nextHop)
2023-08-09 19:47:20 -07:00
packet.Records[i] = record
}
return nil
2021-05-22 16:12:26 -07:00
}