/
inject.go
104 lines (98 loc) · 2.3 KB
/
inject.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package finscan
import (
"github.com/google/gopacket"
"github.com/pkg/errors"
"github.com/yaklang/yaklang/common/log"
"github.com/yaklang/yaklang/common/utils"
"time"
)
func (s *Scanner) sleepRateLimit() {
if s == nil {
return
}
if s.delayMs <= 0 {
return
}
time.Sleep(time.Duration(s.delayMs*1000) * time.Microsecond)
}
//func (s *Scanner) sendService() {
// var counter int
// var total int64
// for {
// if s.delayMs > 0 && s.delayGapCount >= 0 {
// if counter > s.delayGapCount {
// counter = 0
// //fmt.Printf("rate limit trigger! for %vms\n", s.delayMs)
// s.sleepRateLimit()
// }
// }
// select {
// case localPackets, ok := <-s.localHandlerWriteChan:
// if !ok {
// continue
// }
//
// err := s.localHandler.WritePacketData(localPackets)
//
// total++
// counter++
//
// if err != nil {
// log.Errorf("loopback handler write failed: %s", err)
// }
// case packets, ok := <-s.handlerWriteChan:
// if !ok {
// continue
// }
//
// failedCount := 0
// RETRY_WRITE_IF:
// // 5-15 us (每秒可以开到 1000 * 200 个包最快)
// err := s.handler.WritePacketData(packets)
//
// total++
// counter++
//
// if err != nil {
// switch true {
// case utils.IContains(err.Error(), "no buffer space available"):
// if failedCount > 10 {
// log.Errorf("write device failed: for %v", err.Error())
// break
// }
// if s.delayMs > 0 {
// s.sleepRateLimit()
// } else {
// time.Sleep(time.Millisecond * 10)
// }
// failedCount++
// goto RETRY_WRITE_IF
// default:
// log.Errorf("iface: %v handler write failed: %s: retry", s.iface, err)
// }
// }
// case <-s.ctx.Done():
// return
// }
// }
//}
func (s *Scanner) inject(loopback bool, l ...gopacket.SerializableLayer) error {
defer func() {
if err := recover(); err != nil {
log.Errorf("serialize layer or send to chan failed: %s", err)
}
}()
buf := gopacket.NewSerializeBuffer()
if err := gopacket.SerializeLayers(buf, s.opts, l...); err != nil {
return errors.Errorf("serialize failed: %s", err)
}
ret := buf.Bytes()
if !loopback && s.handlerIsAlive.IsSet() {
s.handlerWriteChan <- ret
} else if loopback && s.localHandlerIsAlive.IsSet() {
s.localHandlerWriteChan <- ret
} else {
return utils.Error("no handler available")
}
return nil
}