mirror of
				https://github.com/openobserve/goflow2.git
				synced 2025-11-04 05:53:14 +00:00 
			
		
		
		
	netflow: correctly decode options template set (#39)
netflow: correctly decode options template set
This commit is contained in:
		@@ -23,7 +23,7 @@ func DecodeNFv9OptionsTemplateSet(payload *bytes.Buffer) ([]NFv9OptionsTemplateR
 | 
				
			|||||||
		optsTemplateRecord := NFv9OptionsTemplateRecord{}
 | 
							optsTemplateRecord := NFv9OptionsTemplateRecord{}
 | 
				
			||||||
		err = utils.BinaryDecoder(payload, &optsTemplateRecord.TemplateId, &optsTemplateRecord.ScopeLength, &optsTemplateRecord.OptionLength)
 | 
							err = utils.BinaryDecoder(payload, &optsTemplateRecord.TemplateId, &optsTemplateRecord.ScopeLength, &optsTemplateRecord.OptionLength)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			break
 | 
								return records, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sizeScope := int(optsTemplateRecord.ScopeLength) / 4
 | 
							sizeScope := int(optsTemplateRecord.ScopeLength) / 4
 | 
				
			||||||
@@ -35,7 +35,10 @@ func DecodeNFv9OptionsTemplateSet(payload *bytes.Buffer) ([]NFv9OptionsTemplateR
 | 
				
			|||||||
		fields := make([]Field, sizeScope)
 | 
							fields := make([]Field, sizeScope)
 | 
				
			||||||
		for i := 0; i < sizeScope; i++ {
 | 
							for i := 0; i < sizeScope; i++ {
 | 
				
			||||||
			field := Field{}
 | 
								field := Field{}
 | 
				
			||||||
			err = utils.BinaryDecoder(payload, &field)
 | 
								err := utils.BinaryDecoder(payload, &field.Type, &field.Length)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return records, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			fields[i] = field
 | 
								fields[i] = field
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		optsTemplateRecord.Scopes = fields
 | 
							optsTemplateRecord.Scopes = fields
 | 
				
			||||||
@@ -43,7 +46,10 @@ func DecodeNFv9OptionsTemplateSet(payload *bytes.Buffer) ([]NFv9OptionsTemplateR
 | 
				
			|||||||
		fields = make([]Field, sizeOptions)
 | 
							fields = make([]Field, sizeOptions)
 | 
				
			||||||
		for i := 0; i < sizeOptions; i++ {
 | 
							for i := 0; i < sizeOptions; i++ {
 | 
				
			||||||
			field := Field{}
 | 
								field := Field{}
 | 
				
			||||||
			err = utils.BinaryDecoder(payload, &field)
 | 
								err := utils.BinaryDecoder(payload, &field.Type, &field.Length)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return records, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			fields[i] = field
 | 
								fields[i] = field
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		optsTemplateRecord.Options = fields
 | 
							optsTemplateRecord.Options = fields
 | 
				
			||||||
@@ -51,7 +57,7 @@ func DecodeNFv9OptionsTemplateSet(payload *bytes.Buffer) ([]NFv9OptionsTemplateR
 | 
				
			|||||||
		records = append(records, optsTemplateRecord)
 | 
							records = append(records, optsTemplateRecord)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return records, nil
 | 
						return records, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func DecodeIPFIXOptionsTemplateSet(payload *bytes.Buffer) ([]IPFIXOptionsTemplateRecord, error) {
 | 
					func DecodeIPFIXOptionsTemplateSet(payload *bytes.Buffer) ([]IPFIXOptionsTemplateRecord, error) {
 | 
				
			||||||
@@ -61,7 +67,7 @@ func DecodeIPFIXOptionsTemplateSet(payload *bytes.Buffer) ([]IPFIXOptionsTemplat
 | 
				
			|||||||
		optsTemplateRecord := IPFIXOptionsTemplateRecord{}
 | 
							optsTemplateRecord := IPFIXOptionsTemplateRecord{}
 | 
				
			||||||
		err = utils.BinaryDecoder(payload, &optsTemplateRecord.TemplateId, &optsTemplateRecord.FieldCount, &optsTemplateRecord.ScopeFieldCount)
 | 
							err = utils.BinaryDecoder(payload, &optsTemplateRecord.TemplateId, &optsTemplateRecord.FieldCount, &optsTemplateRecord.ScopeFieldCount)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			break
 | 
								return records, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		fields := make([]Field, int(optsTemplateRecord.ScopeFieldCount))
 | 
							fields := make([]Field, int(optsTemplateRecord.ScopeFieldCount))
 | 
				
			||||||
@@ -69,7 +75,10 @@ func DecodeIPFIXOptionsTemplateSet(payload *bytes.Buffer) ([]IPFIXOptionsTemplat
 | 
				
			|||||||
			field := Field{}
 | 
								field := Field{}
 | 
				
			||||||
			if field.Type&0x8000 != 0 {
 | 
								if field.Type&0x8000 != 0 {
 | 
				
			||||||
				field.PenProvided = true
 | 
									field.PenProvided = true
 | 
				
			||||||
				err = utils.BinaryDecoder(payload, &field.Pen)
 | 
									err := utils.BinaryDecoder(payload, &field.Pen)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										return records, err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			fields[i] = field
 | 
								fields[i] = field
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -82,13 +91,14 @@ func DecodeIPFIXOptionsTemplateSet(payload *bytes.Buffer) ([]IPFIXOptionsTemplat
 | 
				
			|||||||
		fields = make([]Field, optionsSize)
 | 
							fields = make([]Field, optionsSize)
 | 
				
			||||||
		for i := 0; i < optionsSize; i++ {
 | 
							for i := 0; i < optionsSize; i++ {
 | 
				
			||||||
			field := Field{}
 | 
								field := Field{}
 | 
				
			||||||
			err = utils.BinaryDecoder(payload, &field.Type)
 | 
								err := utils.BinaryDecoder(payload, &field.Type, &field.Length)
 | 
				
			||||||
			err = utils.BinaryDecoder(payload, &field.Length)
 | 
								if err == nil && field.Type&0x8000 != 0 {
 | 
				
			||||||
 | 
					 | 
				
			||||||
			if field.Type&0x8000 != 0 {
 | 
					 | 
				
			||||||
				field.PenProvided = true
 | 
									field.PenProvided = true
 | 
				
			||||||
				err = utils.BinaryDecoder(payload, &field.Pen)
 | 
									err = utils.BinaryDecoder(payload, &field.Pen)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return records, nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			fields[i] = field
 | 
								fields[i] = field
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		optsTemplateRecord.Options = fields
 | 
							optsTemplateRecord.Options = fields
 | 
				
			||||||
@@ -106,7 +116,7 @@ func DecodeTemplateSet(version uint16, payload *bytes.Buffer) ([]TemplateRecord,
 | 
				
			|||||||
		templateRecord := TemplateRecord{}
 | 
							templateRecord := TemplateRecord{}
 | 
				
			||||||
		err = utils.BinaryDecoder(payload, &templateRecord.TemplateId, &templateRecord.FieldCount)
 | 
							err = utils.BinaryDecoder(payload, &templateRecord.TemplateId, &templateRecord.FieldCount)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			break
 | 
								return records, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if int(templateRecord.FieldCount) < 0 {
 | 
							if int(templateRecord.FieldCount) < 0 {
 | 
				
			||||||
@@ -116,14 +126,15 @@ func DecodeTemplateSet(version uint16, payload *bytes.Buffer) ([]TemplateRecord,
 | 
				
			|||||||
		fields := make([]Field, int(templateRecord.FieldCount))
 | 
							fields := make([]Field, int(templateRecord.FieldCount))
 | 
				
			||||||
		for i := 0; i < int(templateRecord.FieldCount); i++ {
 | 
							for i := 0; i < int(templateRecord.FieldCount); i++ {
 | 
				
			||||||
			field := Field{}
 | 
								field := Field{}
 | 
				
			||||||
			err = utils.BinaryDecoder(payload, &field.Type)
 | 
								err := utils.BinaryDecoder(payload, &field.Type, &field.Length)
 | 
				
			||||||
			err = utils.BinaryDecoder(payload, &field.Length)
 | 
								if err == nil && version == 10 && field.Type&0x8000 != 0 {
 | 
				
			||||||
 | 
					 | 
				
			||||||
			if version == 10 && field.Type&0x8000 != 0 {
 | 
					 | 
				
			||||||
				field.PenProvided = true
 | 
									field.PenProvided = true
 | 
				
			||||||
				field.Type = field.Type ^ 0x8000
 | 
									field.Type = field.Type ^ 0x8000
 | 
				
			||||||
				err = utils.BinaryDecoder(payload, &field.Pen)
 | 
									err = utils.BinaryDecoder(payload, &field.Pen)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return records, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			fields[i] = field
 | 
								fields[i] = field
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		templateRecord.Fields = fields
 | 
							templateRecord.Fields = fields
 | 
				
			||||||
@@ -155,9 +166,15 @@ func DecodeDataSetUsingFields(version uint16, payload *bytes.Buffer, listFields
 | 
				
			|||||||
			if version == 10 && templateField.Length == 0xffff {
 | 
								if version == 10 && templateField.Length == 0xffff {
 | 
				
			||||||
				var variableLen8 byte
 | 
									var variableLen8 byte
 | 
				
			||||||
				var variableLen16 uint16
 | 
									var variableLen16 uint16
 | 
				
			||||||
				utils.BinaryDecoder(payload, &variableLen8)
 | 
									err := utils.BinaryDecoder(payload, &variableLen8)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										return []DataField{}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				if variableLen8 == 0xff {
 | 
									if variableLen8 == 0xff {
 | 
				
			||||||
					utils.BinaryDecoder(payload, &variableLen16)
 | 
										err := utils.BinaryDecoder(payload, &variableLen16)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return []DataField{}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
					finalLength = int(variableLen16)
 | 
										finalLength = int(variableLen16)
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					finalLength = int(variableLen8)
 | 
										finalLength = int(variableLen8)
 | 
				
			||||||
@@ -346,13 +363,19 @@ func DecodeMessage(payload *bytes.Buffer, templates NetFlowTemplateSystem) (inte
 | 
				
			|||||||
	binary.Read(payload, binary.BigEndian, &version)
 | 
						binary.Read(payload, binary.BigEndian, &version)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if version == 9 {
 | 
						if version == 9 {
 | 
				
			||||||
		utils.BinaryDecoder(payload, &packetNFv9.Count, &packetNFv9.SystemUptime, &packetNFv9.UnixSeconds, &packetNFv9.SequenceNumber, &packetNFv9.SourceId)
 | 
							err := utils.BinaryDecoder(payload, &packetNFv9.Count, &packetNFv9.SystemUptime, &packetNFv9.UnixSeconds, &packetNFv9.SequenceNumber, &packetNFv9.SourceId)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		size = packetNFv9.Count
 | 
							size = packetNFv9.Count
 | 
				
			||||||
		packetNFv9.Version = version
 | 
							packetNFv9.Version = version
 | 
				
			||||||
		returnItem = *(&packetNFv9)
 | 
							returnItem = *(&packetNFv9)
 | 
				
			||||||
		obsDomainId = packetNFv9.SourceId
 | 
							obsDomainId = packetNFv9.SourceId
 | 
				
			||||||
	} else if version == 10 {
 | 
						} else if version == 10 {
 | 
				
			||||||
		utils.BinaryDecoder(payload, &packetIPFIX.Length, &packetIPFIX.ExportTime, &packetIPFIX.SequenceNumber, &packetIPFIX.ObservationDomainId)
 | 
							err := utils.BinaryDecoder(payload, &packetIPFIX.Length, &packetIPFIX.ExportTime, &packetIPFIX.SequenceNumber, &packetIPFIX.ObservationDomainId)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		size = packetIPFIX.Length
 | 
							size = packetIPFIX.Length
 | 
				
			||||||
		packetIPFIX.Version = version
 | 
							packetIPFIX.Version = version
 | 
				
			||||||
		returnItem = *(&packetIPFIX)
 | 
							returnItem = *(&packetIPFIX)
 | 
				
			||||||
@@ -363,7 +386,9 @@ func DecodeMessage(payload *bytes.Buffer, templates NetFlowTemplateSystem) (inte
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	for i := 0; ((i < int(size) && version == 9) || version == 10) && payload.Len() > 0; i++ {
 | 
						for i := 0; ((i < int(size) && version == 9) || version == 10) && payload.Len() > 0; i++ {
 | 
				
			||||||
		fsheader := FlowSetHeader{}
 | 
							fsheader := FlowSetHeader{}
 | 
				
			||||||
		utils.BinaryDecoder(payload, &fsheader)
 | 
							if err := utils.BinaryDecoder(payload, &fsheader); err != nil {
 | 
				
			||||||
 | 
								return returnItem, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		nextrelpos := int(fsheader.Length) - binary.Size(fsheader)
 | 
							nextrelpos := int(fsheader.Length) - binary.Size(fsheader)
 | 
				
			||||||
		if nextrelpos < 0 {
 | 
							if nextrelpos < 0 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,10 @@ func (e *ErrorVersion) Error() string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func DecodeMessage(payload *bytes.Buffer) (interface{}, error) {
 | 
					func DecodeMessage(payload *bytes.Buffer) (interface{}, error) {
 | 
				
			||||||
	var version uint16
 | 
						var version uint16
 | 
				
			||||||
	utils.BinaryDecoder(payload, &version)
 | 
						err := utils.BinaryDecoder(payload, &version)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	packet := PacketNetFlowV5{}
 | 
						packet := PacketNetFlowV5{}
 | 
				
			||||||
	if version == 5 {
 | 
						if version == 5 {
 | 
				
			||||||
		packet.Version = version
 | 
							packet.Version = version
 | 
				
			||||||
@@ -42,7 +45,10 @@ func DecodeMessage(payload *bytes.Buffer) (interface{}, error) {
 | 
				
			|||||||
		packet.Records = make([]RecordsNetFlowV5, int(packet.Count))
 | 
							packet.Records = make([]RecordsNetFlowV5, int(packet.Count))
 | 
				
			||||||
		for i := 0; i < int(packet.Count) && payload.Len() >= 48; i++ {
 | 
							for i := 0; i < int(packet.Count) && payload.Len() >= 48; i++ {
 | 
				
			||||||
			record := RecordsNetFlowV5{}
 | 
								record := RecordsNetFlowV5{}
 | 
				
			||||||
			utils.BinaryDecoder(payload, &record)
 | 
								err := utils.BinaryDecoder(payload, &record)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return packet, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			packet.Records[i] = record
 | 
								packet.Records[i] = record
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,11 +81,17 @@ func DecodeCounterRecord(header *RecordHeader, payload *bytes.Buffer) (CounterRe
 | 
				
			|||||||
	switch (*header).DataFormat {
 | 
						switch (*header).DataFormat {
 | 
				
			||||||
	case 1:
 | 
						case 1:
 | 
				
			||||||
		ifCounters := IfCounters{}
 | 
							ifCounters := IfCounters{}
 | 
				
			||||||
		utils.BinaryDecoder(payload, &ifCounters)
 | 
							err := utils.BinaryDecoder(payload, &ifCounters)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return counterRecord, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		counterRecord.Data = ifCounters
 | 
							counterRecord.Data = ifCounters
 | 
				
			||||||
	case 2:
 | 
						case 2:
 | 
				
			||||||
		ethernetCounters := EthernetCounters{}
 | 
							ethernetCounters := EthernetCounters{}
 | 
				
			||||||
		utils.BinaryDecoder(payload, ðernetCounters)
 | 
							err := utils.BinaryDecoder(payload, ðernetCounters)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return counterRecord, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		counterRecord.Data = ethernetCounters
 | 
							counterRecord.Data = ethernetCounters
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return counterRecord, NewErrorDataFormat((*header).DataFormat)
 | 
							return counterRecord, NewErrorDataFormat((*header).DataFormat)
 | 
				
			||||||
@@ -96,7 +102,10 @@ func DecodeCounterRecord(header *RecordHeader, payload *bytes.Buffer) (CounterRe
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func DecodeIP(payload *bytes.Buffer) (uint32, []byte, error) {
 | 
					func DecodeIP(payload *bytes.Buffer) (uint32, []byte, error) {
 | 
				
			||||||
	var ipVersion uint32
 | 
						var ipVersion uint32
 | 
				
			||||||
	utils.BinaryDecoder(payload, &ipVersion)
 | 
						err := utils.BinaryDecoder(payload, &ipVersion)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	var ip []byte
 | 
						var ip []byte
 | 
				
			||||||
	if ipVersion == 1 {
 | 
						if ipVersion == 1 {
 | 
				
			||||||
		ip = make([]byte, 4)
 | 
							ip = make([]byte, 4)
 | 
				
			||||||
@@ -106,7 +115,10 @@ func DecodeIP(payload *bytes.Buffer) (uint32, []byte, error) {
 | 
				
			|||||||
		return ipVersion, ip, NewErrorIPVersion(ipVersion)
 | 
							return ipVersion, ip, NewErrorIPVersion(ipVersion)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if payload.Len() >= len(ip) {
 | 
						if payload.Len() >= len(ip) {
 | 
				
			||||||
		utils.BinaryDecoder(payload, &ip)
 | 
							err := utils.BinaryDecoder(payload, &ip)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return 0, nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		return ipVersion, ip, NewErrorDecodingSFlow(fmt.Sprintf("Not enough data: %v, needs %v.", payload.Len(), len(ip)))
 | 
							return ipVersion, ip, NewErrorDecodingSFlow(fmt.Sprintf("Not enough data: %v, needs %v.", payload.Len(), len(ip)))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -354,7 +366,10 @@ func DecodeMessage(payload *bytes.Buffer) (interface{}, error) {
 | 
				
			|||||||
		var ip []byte
 | 
							var ip []byte
 | 
				
			||||||
		if packetV5.IPVersion == 1 {
 | 
							if packetV5.IPVersion == 1 {
 | 
				
			||||||
			ip = make([]byte, 4)
 | 
								ip = make([]byte, 4)
 | 
				
			||||||
			utils.BinaryDecoder(payload, ip)
 | 
								err = utils.BinaryDecoder(payload, ip)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return packetV5, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		} else if packetV5.IPVersion == 2 {
 | 
							} else if packetV5.IPVersion == 2 {
 | 
				
			||||||
			ip = make([]byte, 16)
 | 
								ip = make([]byte, 16)
 | 
				
			||||||
			err = utils.BinaryDecoder(payload, ip)
 | 
								err = utils.BinaryDecoder(payload, ip)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user