MCPcopy Index your code
hub / github.com/google/gopacket / DecodeFromBytes

Method DecodeFromBytes

layers/sflow.go:300–348  ·  view source on GitHub ↗
(data []byte, df gopacket.DecodeFeedback)

Source from the content-addressed store, hash-verified

298}
299
300func (s *SFlowDatagram) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
301 var agentAddressType SFlowIPType
302
303 data, s.DatagramVersion = data[4:], binary.BigEndian.Uint32(data[:4])
304 data, agentAddressType = data[4:], SFlowIPType(binary.BigEndian.Uint32(data[:4]))
305 data, s.AgentAddress = data[agentAddressType.Length():], data[:agentAddressType.Length()]
306 data, s.SubAgentID = data[4:], binary.BigEndian.Uint32(data[:4])
307 data, s.SequenceNumber = data[4:], binary.BigEndian.Uint32(data[:4])
308 data, s.AgentUptime = data[4:], binary.BigEndian.Uint32(data[:4])
309 data, s.SampleCount = data[4:], binary.BigEndian.Uint32(data[:4])
310
311 if s.SampleCount < 1 {
312 return fmt.Errorf("SFlow Datagram has invalid sample length: %d", s.SampleCount)
313 }
314 for i := uint32(0); i < s.SampleCount; i++ {
315 sdf := SFlowDataFormat(binary.BigEndian.Uint32(data[:4]))
316 _, sampleType := sdf.decode()
317 switch sampleType {
318 case SFlowTypeFlowSample:
319 if flowSample, err := decodeFlowSample(&data, false); err == nil {
320 s.FlowSamples = append(s.FlowSamples, flowSample)
321 } else {
322 return err
323 }
324 case SFlowTypeCounterSample:
325 if counterSample, err := decodeCounterSample(&data, false); err == nil {
326 s.CounterSamples = append(s.CounterSamples, counterSample)
327 } else {
328 return err
329 }
330 case SFlowTypeExpandedFlowSample:
331 if flowSample, err := decodeFlowSample(&data, true); err == nil {
332 s.FlowSamples = append(s.FlowSamples, flowSample)
333 } else {
334 return err
335 }
336 case SFlowTypeExpandedCounterSample:
337 if counterSample, err := decodeCounterSample(&data, true); err == nil {
338 s.CounterSamples = append(s.CounterSamples, counterSample)
339 } else {
340 return err
341 }
342
343 default:
344 return fmt.Errorf("Unsupported SFlow sample type %d", sampleType)
345 }
346 }
347 return nil
348}
349
350// SFlowFlowSample represents a sampled packet and contains
351// one or more records describing the packet

Callers 3

decodeSFlowFunction · 0.95

Calls 6

LengthMethod · 0.95
SFlowIPTypeTypeAlias · 0.85
SFlowDataFormatTypeAlias · 0.85
decodeFlowSampleFunction · 0.85
decodeCounterSampleFunction · 0.85
decodeMethod · 0.45

Tested by 2