-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilter2.go
67 lines (55 loc) · 1.03 KB
/
filter2.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
package netfilter
import (
"code.google.com/p/gopacket"
"code.google.com/p/gopacket/layers"
)
const (
FILTER_READ_LEN = 512
)
type stateFn2 func(*Filter2) stateFn2
type Filter2 struct {
In chan []byte
quit chan bool
buf *Buffer
eth layers.Ethernet
ip4 layers.IPv4
ip6 layers.IPv6
tcp layers.TCP
udp layers.UDP
payload gopacket.Payload
parser gopacket.Parser
}
func NewFilter2() *Filter2 {
b, _ := NewBuffer()
return &Filter2{
In: make(chan []byte),
quit: make(chan bool),
buf: b,
}
}
func (filter *Filter2) startState() stateFn2 {
return stateRead
}
func (filter *Filter2) Stop() {
filter.quit <- true
}
func (filter *Filter2) Run() {
for state := filter.startState(); state != nil; {
state = state(filter)
}
}
func stateRead(filter *Filter2) stateFn {
select {
case data := <-filter.In:
filter.buf.Write(data)
return stateDecode
case quit := <-filter.quit:
if quit {
return nil
}
}
return nil
}
func stateDecode(filter *Filter2) stateFn {
data := filter.buf.Next(64)
}