Documentation ¶
Index ¶
- Constants
- Variables
- func FreeBytes(b []byte)
- func FreeConnKeyArg(p unsafe.Pointer)
- func GetConnKeyVal(p unsafe.Pointer) uint32
- func GetSyncMapLen(m sync.Map) int
- func IPAddrATON(cp string, addr *C.struct_ip_addr)
- func IPAddrNTOA(ipaddr C.struct_ip_addr) string
- func Input(pkt []byte) (int, error)
- func NewBytes(size int) []byte
- func NewConnKeyArg() unsafe.Pointer
- func NewLWIPError(code int) error
- func Output(p *C.struct_pbuf) C.err_t
- func ParseTCPAddr(addr string, port uint16) net.Addr
- func ParseUDPAddr(addr string, port uint16) net.Addr
- func RegisterOutputFn(fn func([]byte) (int, error))
- func RegisterTCPConnectionHandler(h ConnectionHandler)
- func RegisterUDPConnectionHandler(h ConnectionHandler)
- func SetBufferPool(p *sync.Pool)
- func SetConnKeyVal(p unsafe.Pointer, val uint32)
- func SetTCPAcceptCallback(pcb *C.struct_tcp_pcb)
- func SetTCPErrCallback(pcb *C.struct_tcp_pcb)
- func SetTCPPollCallback(pcb *C.struct_tcp_pcb, interval C.u8_t)
- func SetTCPRecvCallback(pcb *C.struct_tcp_pcb)
- func SetTCPSentCallback(pcb *C.struct_tcp_pcb)
- func SetUDPRecvCallback(pcb *C.struct_udp_pcb, recvArg unsafe.Pointer)
- func TCPAcceptFn(arg unsafe.Pointer, newpcb *C.struct_tcp_pcb, err C.err_t) C.err_t
- func TCPErrFn(arg unsafe.Pointer, err C.err_t)
- func TCPPollFn(arg unsafe.Pointer, tpcb *C.struct_tcp_pcb) C.err_t
- func TCPRecvFn(arg unsafe.Pointer, tpcb *C.struct_tcp_pcb, p *C.struct_pbuf, err C.err_t) C.err_t
- func TCPSentFn(arg unsafe.Pointer, tpcb *C.struct_tcp_pcb, len C.u16_t) C.err_t
- func UDPRecvFn(arg unsafe.Pointer, pcb *C.struct_udp_pcb, p *C.struct_pbuf, addr *C.ip_addr_t, ...)
- type Connection
- type ConnectionHandler
- type LWIPStack
Constants ¶
const ( LWIP_ERR_OK int = iota LWIP_ERR_ABRT )
const BufSize = 2 * 1024
const CHECK_TIMEOUTS_INTERVAL = 250 // in millisecond
const TCP_POLL_INTERVAL = 2 * (float32(1000) / CHECK_TIMEOUTS_INTERVAL) // poll every 2 seconds
Variables ¶
var OutputFn func([]byte) (int, error)
Functions ¶
func FreeConnKeyArg ¶
func GetConnKeyVal ¶
func GetSyncMapLen ¶
func IPAddrATON ¶
func IPAddrATON(cp string, addr *C.struct_ip_addr)
func IPAddrNTOA ¶
func IPAddrNTOA(ipaddr C.struct_ip_addr) string
ipaddr_ntoa() is using a global static buffer to return result, reentrants are not allowed, caller is required to lock lwipMutex.
func NewConnKeyArg ¶
We need such a key-value mechanism because when passing a Go pointer to C, the Go pointer will only be valid during the call. If we pass a Go pointer to tcp_arg(), this pointer will not be usable in subsequent callbacks (e.g.: tcp_recv(), tcp_err()).
Instead we need to pass a C pointer to tcp_arg(), we manually allocate the memory in C and return its pointer to Go code. After the connection end, the memory should be freed manually.
func NewLWIPError ¶
func RegisterOutputFn ¶
func RegisterTCPConnectionHandler ¶
func RegisterTCPConnectionHandler(h ConnectionHandler)
func RegisterUDPConnectionHandler ¶
func RegisterUDPConnectionHandler(h ConnectionHandler)
func SetBufferPool ¶
func SetConnKeyVal ¶
func SetTCPAcceptCallback ¶
func SetTCPAcceptCallback(pcb *C.struct_tcp_pcb)
func SetTCPErrCallback ¶
func SetTCPErrCallback(pcb *C.struct_tcp_pcb)
func SetTCPPollCallback ¶
func SetTCPPollCallback(pcb *C.struct_tcp_pcb, interval C.u8_t)
func SetTCPRecvCallback ¶
func SetTCPRecvCallback(pcb *C.struct_tcp_pcb)
func SetTCPSentCallback ¶
func SetTCPSentCallback(pcb *C.struct_tcp_pcb)
func SetUDPRecvCallback ¶
func SetUDPRecvCallback(pcb *C.struct_udp_pcb, recvArg unsafe.Pointer)
func TCPAcceptFn ¶
Types ¶
type Connection ¶
type Connection interface { // RemoteAddr returns the destination network address. RemoteAddr() net.Addr // LocalAddr returns the local client network address. LocalAddr() net.Addr // Receive receives data from TUN. Receive(data []byte) error // Write writes data to TUN. Write(data []byte) (int, error) // Sent will be called when sent data has been acknowledged by clients (TCP only). Sent(len uint16) error // Close closes the connection (TCP only). Close() error // Abort aborts the connection to client by sending a RST segment (TCP only). Abort() // Err will be called when a fatal error has occurred on the connection (TCP only). Err(err error) // LocalDidClose will be called when local client has close the connection (TCP only). LocalDidClose() error // Poll will be periodically called by timers (TCP only). Poll() error }
Connection abstracts a TCP/UDP connection comming from TUN. This connection should be handled by a registered TCP/UDP proxy handler.
func NewTCPConnection ¶
func NewTCPConnection(pcb *C.struct_tcp_pcb, handler ConnectionHandler, connKey uint32, connKeyArg unsafe.Pointer) (Connection, error)
func NewUDPConnection ¶
func NewUDPConnection(pcb *C.struct_udp_pcb, handler ConnectionHandler, localIP, remoteIP C.ip_addr_t, localPort, remotePort C.u16_t) (Connection, error)
type ConnectionHandler ¶
type ConnectionHandler interface { // Connect connects the proxy server. Connect(conn Connection, target net.Addr) error // DidReceive will be called when data arrives from TUN. DidReceive(conn Connection, data []byte) error // DidSend will be called when sent data has been acknowledged by local clients. DidSend(conn Connection, len uint16) // DidClose will be called when the connection has been closed. DidClose(conn Connection) // LocalDidClose will be called when local client has close the connection. LocalDidClose(conn Connection) }
ConnectionHandler handles connections comming from TUN.