Files
trojan-go/tunnel/tproxy/conn.go
T
LoyalsoldierandGitHub 2dc60f52e7 Chore: format code & update dependencies (#385)
* Chore: check Go modules before test & update dependencies
* Chore: run go fmt to format code
2021-09-14 15:41:24 +08:00

71 lines
1.3 KiB
Go

//go:build linux
// +build linux
package tproxy
import (
"context"
"net"
"github.com/p4gefau1t/trojan-go/common"
"github.com/p4gefau1t/trojan-go/tunnel"
)
type Conn struct {
net.Conn
metadata *tunnel.Metadata
}
func (c *Conn) Metadata() *tunnel.Metadata {
return c.metadata
}
type packetInfo struct {
metadata *tunnel.Metadata
payload []byte
}
type PacketConn struct {
net.PacketConn
input chan *packetInfo
output chan *packetInfo
src net.Addr
ctx context.Context
cancel context.CancelFunc
}
func (c *PacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
panic("implement me")
}
func (c *PacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
panic("implement me")
}
func (c *PacketConn) Close() error {
c.cancel()
return nil
}
func (c *PacketConn) WriteWithMetadata(p []byte, m *tunnel.Metadata) (int, error) {
select {
case c.output <- &packetInfo{
metadata: m,
payload: p,
}:
return len(p), nil
case <-c.ctx.Done():
return 0, common.NewError("socks packet conn closed")
}
}
func (c *PacketConn) ReadWithMetadata(p []byte) (int, *tunnel.Metadata, error) {
select {
case info := <-c.input:
n := copy(p, info.payload)
return n, info.metadata, nil
case <-c.ctx.Done():
return 0, nil, common.NewError("socks packet conn closed")
}
}