Skip to content

Commit 05351bc

Browse files
committed
first commit
0 parents  commit 05351bc

File tree

12 files changed

+646
-0
lines changed

12 files changed

+646
-0
lines changed

flowgen/flowgen.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package main
2+
3+
func main() {
4+
5+
}

flowgen/logger.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package main

flowgen/options.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package main
2+
3+
type Options struct {
4+
}
5+
6+
func getOpts() {
7+
8+
}
9+
10+
func getFlag() {
11+
12+
}

flowgen/stats.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package main
2+
3+
// record sys state
4+
type Stats struct {
5+
}

go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module flow-generator
2+
3+
go 1.14
4+
5+
require github.com/google/gopacket v1.1.19

go.sum

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
2+
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
3+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
4+
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
5+
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
6+
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
7+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
8+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
9+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
10+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
11+
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
12+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
13+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
14+
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
15+
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

log/logger.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package log
2+
3+
import "log"
4+
5+
var logger log.Logger
6+
7+
func init() {
8+
logger.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.LUTC)
9+
logger.SetPrefix("flowgen")
10+
}
11+
12+
func Print(v ...interface{}) {
13+
logger.Print(v)
14+
}
15+
func Println(v ...interface{}) {
16+
logger.Println(v)
17+
}
18+
19+
func Panicf(formatString string, v ...interface{}) {
20+
logger.Panicf(formatString, v)
21+
}
22+
23+
func Panic(v ...interface{}) {
24+
logger.Panic(v)
25+
}
26+
27+
func Fatal(v ...interface{}) {
28+
logger.Fatal(v)
29+
}
30+
31+
func Fatalf(formatString string, v ...interface{}) {
32+
logger.Fatalf(formatString, v)
33+
}

producer/random_packet_generator.go

Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,270 @@
1+
package producer
2+
3+
import (
4+
"flow-generator/util"
5+
"fmt"
6+
"github.com/google/gopacket"
7+
"github.com/google/gopacket/layers"
8+
"github.com/google/gopacket/pcap"
9+
"log"
10+
"net"
11+
"sync"
12+
"sync/atomic"
13+
"time"
14+
)
15+
16+
type WorkStatus int
17+
18+
const (
19+
WorkStatusStop = iota
20+
WorkStatusRunning
21+
)
22+
23+
var (
24+
wg sync.WaitGroup
25+
)
26+
27+
type RandPktGenerator struct {
28+
workers []*worker
29+
sender *sender
30+
runningStatus WorkStatus
31+
defaultPacket *randomPacketLayer
32+
speed uint64
33+
}
34+
35+
type randomPacketLayer struct {
36+
ether *layers.Ethernet
37+
ipv4 *layers.IPv4
38+
tcp *layers.TCP
39+
}
40+
41+
func (r *RandPktGenerator) Run() {
42+
r.init()
43+
r.sender.Run()
44+
for i := range r.workers {
45+
r.workers[i].Run()
46+
}
47+
48+
wg.Wait()
49+
}
50+
51+
func defaultConfig() map[string]int {
52+
return map[string]int{
53+
"default_worker_count": 10,
54+
}
55+
}
56+
57+
func defaultPacketConfig() *randomPacketLayer {
58+
return &randomPacketLayer{
59+
ether: &layers.Ethernet{
60+
EthernetType: layers.EthernetTypeIPv4,
61+
SrcMAC: net.HardwareAddr{0xFB, 0xBA, 0xFA, 0xAA, 0xF6, 0xAA},
62+
DstMAC: net.HardwareAddr{0x2F, 0xFF, 0x4F, 0xF6, 0x3F, 0xF0},
63+
},
64+
ipv4: &layers.IPv4{
65+
Protocol: layers.IPProtocolTCP,
66+
Flags: 0x0000,
67+
IHL: 0x45, //version + header length
68+
TTL: 0x80,
69+
Id: 0x1234,
70+
Length: 0x014e,
71+
SrcIP: net.IP{12, 13, 11, 10},
72+
DstIP: net.IP{44, 33, 55, 88},
73+
},
74+
tcp: &layers.TCP{
75+
Seq: 0x1234,
76+
Ack: 0x1235,
77+
SrcPort: layers.TCPPort(68),
78+
DstPort: layers.TCPPort(67),
79+
SYN: true,
80+
DataOffset: 0x5,
81+
},
82+
}
83+
}
84+
85+
//初始化流信息和worker信息
86+
func (r *RandPktGenerator) init() {
87+
config := defaultConfig()
88+
var (
89+
workerCount int
90+
)
91+
//set worker count
92+
if v, ok := config["default_worker_count"]; ok {
93+
workerCount = v
94+
} else {
95+
workerCount = 10
96+
}
97+
//init default packet config
98+
r.defaultPacket = defaultPacketConfig()
99+
//init sender
100+
r.sender = new(sender)
101+
r.sender.Init()
102+
//init workers
103+
r.workers = nil
104+
for i := 0; i < workerCount; i++ {
105+
w := new(worker)
106+
w.Init(r.sender.dsChan)
107+
r.workers = append(r.workers, w)
108+
}
109+
}
110+
111+
//
112+
func (r *RandPktGenerator) Stop() {
113+
for i := range r.workers {
114+
r.workers[i].Stop()
115+
}
116+
r.sender.Stop()
117+
}
118+
119+
func randPktConfig() randomPacketLayer {
120+
return randomPacketLayer{
121+
ether: &layers.Ethernet{
122+
EthernetType: layers.EthernetTypeIPv4,
123+
SrcMAC: util.RandomMac(),
124+
DstMAC: util.RandomMac(),
125+
},
126+
ipv4: &layers.IPv4{
127+
Protocol: layers.IPProtocolTCP,
128+
Flags: 0x0000,
129+
IHL: 0x45, //version + header length
130+
TTL: 0x80,
131+
Id: 0x1234,
132+
//Length: 0x014e,
133+
SrcIP: util.RandomIPv4(),
134+
DstIP: util.RandomIPv4(),
135+
},
136+
tcp: &layers.TCP{
137+
Seq: util.RandomSequence(),
138+
Ack: util.RandomSequence(),
139+
SrcPort: layers.TCPPort(util.RandomPort()),
140+
DstPort: layers.TCPPort(util.RandomPort()),
141+
SYN: true,
142+
DataOffset: 0x5,
143+
},
144+
}
145+
}
146+
147+
type worker struct {
148+
runningStatus WorkStatus
149+
exportChan chan []byte
150+
}
151+
152+
func (w *worker) Init(exportChan chan []byte) {
153+
w.runningStatus = WorkStatusStop
154+
w.exportChan = exportChan
155+
}
156+
157+
func (w *worker) Run() {
158+
w.runningStatus = WorkStatusRunning
159+
wg.Add(1)
160+
go func() {
161+
defer wg.Done()
162+
stopTicker := time.NewTicker(time.Second * 5)
163+
defer stopTicker.Stop()
164+
for w.runningStatus == WorkStatusRunning {
165+
select {
166+
case <-stopTicker.C:
167+
default: //do rand update
168+
lyrs := randPktConfig()
169+
buffer := gopacket.NewSerializeBuffer()
170+
gopacket.SerializeLayers(buffer, gopacket.SerializeOptions{},
171+
lyrs.ether,
172+
lyrs.ipv4,
173+
lyrs.tcp,
174+
gopacket.Payload(util.RandomBytes(util.RandomInt(0, 1000))),
175+
)
176+
w.exportChan <- buffer.Bytes()
177+
}
178+
}
179+
}()
180+
}
181+
func (w *worker) Stop() {
182+
w.runningStatus = WorkStatusStop
183+
}
184+
185+
type sender struct {
186+
dsChan chan []byte
187+
running WorkStatus
188+
handler *pcap.Handle
189+
sts statics
190+
}
191+
192+
func (s *sender) Init() {
193+
s.dsChan = make(chan []byte, 100*1000)
194+
s.running = WorkStatusStop
195+
//get handler
196+
var (
197+
snapshot_len int32 = 65535
198+
promiscuous bool = false
199+
err error
200+
timeout time.Duration = 30 * time.Second
201+
)
202+
203+
devices, err := pcap.FindAllDevs()
204+
if err != nil {
205+
log.Fatal(err)
206+
}
207+
208+
for _, value := range devices {
209+
if value.Description == "Realtek Gaming GbE Family Controller" {
210+
//Open device
211+
s.handler, err = pcap.OpenLive(value.Name, snapshot_len, promiscuous, timeout)
212+
if err != nil {
213+
log.Fatal(err)
214+
}
215+
}
216+
fmt.Println(value.Description, value.Name)
217+
}
218+
if s.handler == nil {
219+
log.Panic("Init handle in sender is nil")
220+
}
221+
}
222+
223+
func (s *sender) Run() {
224+
s.running = WorkStatusRunning
225+
wg.Add(1)
226+
go func() {
227+
defer wg.Done()
228+
defer s.handler.Close()
229+
230+
stopTicker := time.NewTicker(time.Second * 5)
231+
logTicker := time.NewTicker(time.Second * 1)
232+
defer stopTicker.Stop()
233+
for s.running == WorkStatusRunning {
234+
select {
235+
case <-stopTicker.C: //do nothing
236+
case <-logTicker.C:
237+
log.Printf("[sender]chan.len()=%d,pps=%d", len(s.dsChan), s.sts.CountLoad())
238+
s.sts.CountClear()
239+
case v, ok := <-s.dsChan:
240+
if !ok {
241+
continue
242+
}
243+
err := s.handler.WritePacketData(v)
244+
s.sts.CountAdd()
245+
if err != nil {
246+
log.Panic(err)
247+
}
248+
}
249+
}
250+
s.running = WorkStatusStop
251+
252+
}()
253+
}
254+
func (s *sender) Stop() {
255+
s.running = WorkStatusStop
256+
}
257+
258+
type statics struct {
259+
countPerS uint64
260+
}
261+
262+
func (s *statics) CountAdd() {
263+
atomic.AddUint64(&s.countPerS, 1)
264+
}
265+
func (s *statics) CountLoad() uint64 {
266+
return atomic.LoadUint64(&s.countPerS)
267+
}
268+
func (s *statics) CountClear() {
269+
atomic.StoreUint64(&s.countPerS, 0)
270+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package producer
2+
3+
import "testing"
4+
5+
func TestRandPktGenerator_Run(t *testing.T) {
6+
gen := RandPktGenerator{}
7+
gen.Run()
8+
}

0 commit comments

Comments
 (0)