forked from eycorsican/go-tun2socks
-
Notifications
You must be signed in to change notification settings - Fork 7
/
udp_callback_export.go
54 lines (48 loc) · 1.07 KB
/
udp_callback_export.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
package core
/*
#cgo CFLAGS: -I./src/include
#include "lwip/udp.h"
*/
import "C"
import (
"unsafe"
)
//export UDPRecvFn
func UDPRecvFn(arg unsafe.Pointer, pcb *C.struct_udp_pcb, p *C.struct_pbuf, addr *C.ip_addr_t, port C.u16_t, destAddr *C.ip_addr_t, destPort C.u16_t) {
defer func() {
if p != nil {
C.pbuf_free(p)
}
}()
if pcb == nil {
return
}
srcAddr := ParseUDPAddr(IPAddrNTOA(*addr), uint16(port))
dstAddr := ParseUDPAddr(IPAddrNTOA(*destAddr), uint16(destPort))
if srcAddr == nil || dstAddr == nil {
panic("invalid UDP address")
}
connId := udpConnId{
src: srcAddr.String(),
dst: dstAddr.String(),
}
conn, found := udpConns.Load(connId)
if !found {
if udpConnectionHandler == nil {
panic("no registered UDP connection handlers found")
}
var err error
conn, err = NewUDPConnection(pcb,
udpConnectionHandler,
*addr,
*destAddr,
port,
destPort)
if err != nil {
return
}
udpConns.Store(connId, conn)
}
buf := (*[1 << 30]byte)(unsafe.Pointer(p.payload))[:int(p.tot_len):int(p.tot_len)]
conn.(Connection).Receive(buf)
}