func sflowFlowSampleSerialize(sf *layers.SFlowFlowSample, packets *[][]byte) []byte { bufRec := new(bytes.Buffer) for _, record := range sf.Records { rec := record.(layers.SFlowRawPacketFlowRecord) for _, payload := range *packets { bufRec.Write(sflowRawPacketFlowRecordSerialize(&rec, &payload)) } } sf.SampleLength = uint32(bufRec.Len()) + 32 sf.RecordCount = uint32(len(*packets)) buf := new(bytes.Buffer) binary.Write(buf, binary.BigEndian, ((uint32(sf.EnterpriseID) << 12) | (uint32(sf.Format)))) binary.Write(buf, binary.BigEndian, sf.SampleLength) binary.Write(buf, binary.BigEndian, sf.SequenceNumber) binary.Write(buf, binary.BigEndian, ((uint32(sf.SourceIDClass) << 30) | (uint32(sf.SourceIDIndex)))) binary.Write(buf, binary.BigEndian, sf.SamplingRate) binary.Write(buf, binary.BigEndian, sf.SamplePool) binary.Write(buf, binary.BigEndian, sf.Dropped) binary.Write(buf, binary.BigEndian, sf.InputInterface) binary.Write(buf, binary.BigEndian, sf.OutputInterface) binary.Write(buf, binary.BigEndian, sf.RecordCount) buf.Write(bufRec.Bytes()) return buf.Bytes() }
func SFlowPackets(packets *[][]byte) []byte { NbSFlowMsg++ sfraw := layers.SFlowRawPacketFlowRecord{ SFlowBaseFlowRecord: layers.SFlowBaseFlowRecord{ EnterpriseID: layers.SFlowStandard, Format: layers.SFlowTypeRawPacketFlow, // FlowDataLength uint32 }, HeaderProtocol: layers.SFlowProtoEthernet, // FrameLength uint32 PayloadRemoved: 0, // HeaderLength uint32 // Header gopacket.NewPacket } SFlowSampleSeq++ sf := layers.SFlowFlowSample{ EnterpriseID: layers.SFlowStandard, Format: layers.SFlowTypeFlowSample, // SampleLength uint32 SequenceNumber: uint32(SFlowSampleSeq), SourceIDClass: layers.SFlowTypeSingleInterface, SourceIDIndex: layers.SFlowSourceValue(47), SamplingRate: 300, SamplePool: 0x12345, Dropped: 0, InputInterface: 48, OutputInterface: 47, // RecordCount: 1, // Records: } sf.Records = append(sf.Records, sfraw) sf.RecordCount = uint32(len(sf.Records)) SFlowSeq++ sflowLayer := &layers.SFlowDatagram{ DatagramVersion: 5, AgentAddress: net.IP{127, 0, 0, 3}, SubAgentID: 0, SequenceNumber: uint32(SFlowSeq), AgentUptime: 2294190, // SampleCount: count, // FlowSamples: sflowsamples, // CounterSamples []SFlowCounterSample } sflowLayer.FlowSamples = append(sflowLayer.FlowSamples, sf) sflowLayer.SampleCount = uint32(len(sflowLayer.FlowSamples)) rawBytes := SFlowDatagramSerialize(sflowLayer, packets) return rawBytes }