mirror of
https://github.com/p4gefau1t/trojan-go.git
synced 2024-04-21 12:21:34 +00:00
* Chore: check Go modules before test & update dependencies * Chore: run go fmt to format code
71 lines
1.3 KiB
Go
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")
|
|
}
|
|
}
|