MCPcopy Create free account
hub / github.com/Edgio/vflow / decodeSet

Method decodeSet

netflow/v9/decoder.go:413–474  ·  view source on GitHub ↗
(mem MemCache, msg *Message)

Source from the content-addressed store, hash-verified

411}
412
413func (d *Decoder) decodeSet(mem MemCache, msg *Message) error {
414 startCount := d.reader.ReadCount()
415
416 setHeader := new(SetHeader)
417 if err := setHeader.unmarshal(d.reader); err != nil {
418 return err
419 }
420 if setHeader.Length < 4 {
421 return io.ErrUnexpectedEOF
422 }
423
424 var tr TemplateRecord
425 var err error
426 // This check is somewhat redundant with the switch-clause below, but the retrieve() operation should not be executed inside the loop.
427 if setHeader.FlowSetID > 255 {
428 var ok bool
429 tr, ok = mem.retrieve(setHeader.FlowSetID, d.raddr)
430 if !ok {
431 err = nonfatalError(fmt.Errorf("%s unknown netflow template id# %d",
432 d.raddr.String(),
433 setHeader.FlowSetID,
434 ))
435 }
436 }
437
438 // the next set should be greater than 4 bytes otherwise that's padding
439 for err == nil && (int(setHeader.Length)-(d.reader.ReadCount()-startCount) > 4) && d.reader.Len() > 4 {
440 if setId := setHeader.FlowSetID; setId == 0 || setId == 1 {
441 // Template record or template option record
442 tr := TemplateRecord{}
443 if setId == 0 {
444 err = tr.unmarshal(d.reader)
445 } else {
446 err = tr.unmarshalOpts(d.reader)
447 }
448 if err == nil {
449 mem.insert(tr.TemplateID, d.raddr, tr)
450 }
451 } else if setId >= 4 && setId <= 255 {
452 // Reserved set, do not read any records
453 break
454 } else {
455 // Data set
456 var data []DecodedField
457 data, err = d.decodeData(tr)
458 if err == nil {
459 msg.DataSets = append(msg.DataSets, data)
460 }
461 }
462 }
463
464 // Skip the rest of the set in order to properly continue with the next set
465 // This is necessary if the set is padded, has a reserved set ID, or a nonfatal error occurred
466 leftoverBytes := int(setHeader.Length) - (d.reader.ReadCount() - startCount)
467 if leftoverBytes > 0 {
468 _, skipErr := d.reader.Read(int(leftoverBytes))
469 if skipErr != nil {
470 err = skipErr

Callers 1

DecodeMethod · 0.95

Calls 11

unmarshalMethod · 0.95
unmarshalOptsMethod · 0.95
decodeDataMethod · 0.95
ReadCountMethod · 0.80
StringMethod · 0.80
LenMethod · 0.80
ReadMethod · 0.80
nonfatalErrorTypeAlias · 0.70
unmarshalMethod · 0.45
retrieveMethod · 0.45
insertMethod · 0.45

Tested by

no test coverage detected