@@ -19,13 +19,14 @@ package packetinjector
1919
2020import (
2121 "fmt"
22+ "math"
2223 "math/rand"
2324 "net"
24- "strings"
2525 "time"
2626
2727 "github.com/google/gopacket"
2828 "github.com/google/gopacket/layers"
29+ "github.com/skydive-project/skydive/api/types"
2930 "github.com/skydive-project/skydive/common"
3031 "github.com/skydive-project/skydive/flow"
3132 "github.com/skydive-project/skydive/logging"
@@ -47,7 +48,7 @@ type ForgedPacketGenerator struct {
4748 close chan bool
4849}
4950
50- func forgePacket (packetType string , layerType gopacket.LayerType , srcMAC , dstMAC net.HardwareAddr , TTL uint8 , srcIP , dstIP net.IP , srcPort , dstPort uint16 , ID uint64 , data string ) ([]byte , gopacket.Packet , error ) {
51+ func forgePacket (packetType string , layerType gopacket.LayerType , srcMAC , dstMAC net.HardwareAddr , TTL uint8 , srcIP , dstIP net.IP , srcPort , dstPort uint16 , ID uint16 , data string ) ([]byte , gopacket.Packet , error ) {
5152 var l []gopacket.SerializableLayer
5253
5354 payload := gopacket .Payload ([]byte (data ))
@@ -68,19 +69,19 @@ func forgePacket(packetType string, layerType gopacket.LayerType, srcMAC, dstMAC
6869 ipLayer := & layers.IPv4 {Version : 4 , SrcIP : srcIP , DstIP : dstIP , Protocol : layers .IPProtocolICMPv4 , TTL : TTL }
6970 icmpLayer := & layers.ICMPv4 {
7071 TypeCode : layers .CreateICMPv4TypeCode (layers .ICMPv4TypeEchoRequest , 0 ),
71- Id : uint16 ( ID ) ,
72+ Id : ID ,
7273 }
7374 l = append (l , ipLayer , icmpLayer )
7475 case "icmp6" :
7576 ipLayer := & layers.IPv6 {Version : 6 , SrcIP : srcIP , DstIP : dstIP , NextHeader : layers .IPProtocolICMPv6 }
7677 icmpLayer := & layers.ICMPv6 {
7778 TypeCode : layers .CreateICMPv6TypeCode (layers .ICMPv6TypeEchoRequest , 0 ),
78- TypeBytes : []byte {byte (ID & uint64 (0xFF00 ) >> 8 ), byte (ID & uint64 (0xFF )), 0 , 0 },
79+ TypeBytes : []byte {byte (ID & uint16 (0xFF00 ) >> 8 ), byte (ID & uint16 (0xFF )), 0 , 0 },
7980 }
8081 icmpLayer .SetNetworkLayerForChecksum (ipLayer )
8182
8283 echoLayer := & layers.ICMPv6Echo {
83- Identifier : uint16 ( ID ) ,
84+ Identifier : ID ,
8485 }
8586 l = append (l , ipLayer , icmpLayer , echoLayer )
8687 case "tcp4" :
@@ -147,22 +148,29 @@ func (f *ForgedPacketGenerator) PacketSource() chan *Packet {
147148 f .Count = 1
148149 }
149150
150- for i := uint64 (0 ); i < f .Count ; i ++ {
151- id := uint64 (f .ICMPID )
152- if strings .HasPrefix (f .Type , "icmp" ) && f .Increment {
153- id += i
154- }
151+ id := f .ICMPID
152+ srcPort := f .SrcPort
155153
156- if f .IncrementPayload > 0 {
157- payload = payload + common .RandString (int (f .IncrementPayload ))
154+ for i := uint64 (0 ); i < f .Count ; i ++ {
155+ if f .Mode == types .PIModeRandom {
156+ switch f .Type {
157+ case types .PiTypeICMP4 , types .PiTypeICMP6 :
158+ id = uint16 (rand .Intn (math .MaxUint16 - 1 ) + 1 )
159+ default :
160+ srcPort = uint16 (rand .Intn (math .MaxUint16 - 1 ) + 1 )
161+ }
158162 }
159163
160- packetData , packet , err := forgePacket (f .Type , f .LayerType , f .SrcMAC , f .DstMAC , f .TTL , f .SrcIP , f .DstIP , f . SrcPort , f .DstPort , id , payload )
164+ packetData , packet , err := forgePacket (f .Type , f .LayerType , f .SrcMAC , f .DstMAC , f .TTL , f .SrcIP , f .DstIP , srcPort , f .DstPort , id , payload )
161165 if err != nil {
162166 logging .GetLogger ().Error (err )
163167 return
164168 }
165169
170+ if f .IncrementPayload > 0 {
171+ payload = payload + common .RandString (int (f .IncrementPayload ))
172+ }
173+
166174 select {
167175 case <- f .close :
168176 return
0 commit comments