-
Notifications
You must be signed in to change notification settings - Fork 13
/
packet_dispatcher.go
63 lines (48 loc) · 1.11 KB
/
packet_dispatcher.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
package main
import (
"net"
"github.com/polevpn/elog"
"github.com/polevpn/netstack/tcpip/header"
)
const (
IPV4_PROTOCOL = 4
IPV6_PROTOCOL = 6
)
type PacketDispatcher struct {
connmgr *ConnMgr
routermgr *RouterMgr
}
func NewPacketDispatcher() *PacketDispatcher {
return &PacketDispatcher{}
}
func (p *PacketDispatcher) SetConnMgr(connmgr *ConnMgr) {
p.connmgr = connmgr
}
func (p *PacketDispatcher) SetRouterMgr(routermgr *RouterMgr) {
p.routermgr = routermgr
}
func (p *PacketDispatcher) Dispatch(pkt []byte) {
ver := pkt[0]
ver = ver >> 4
if ver != IPV4_PROTOCOL {
return
}
ipv4pkt := header.IPv4(pkt)
ip := ipv4pkt.DestinationAddress().To4()
ipstr := ip.String()
conn := p.connmgr.GetConnByIP(ipstr)
if conn == nil {
gw := p.routermgr.FindRoute(net.IP(ip))
conn = p.connmgr.GetConnByIP(gw)
}
if conn == nil {
elog.Debug("connmgr can't find wsconn for ", ipstr)
return
}
buf := make([]byte, len(pkt)+POLE_PACKET_HEADER_LEN)
copy(buf[POLE_PACKET_HEADER_LEN:], pkt)
resppkt := PolePacket(buf)
resppkt.SetLen(uint16(len(buf)))
resppkt.SetCmd(CMD_S2C_IPDATA)
conn.Send(resppkt)
}