diff options
Diffstat (limited to 'pkg/tcpip/sample')
-rw-r--r-- | pkg/tcpip/sample/wg_tunnel/gtun.go | 135 | ||||
-rw-r--r-- | pkg/tcpip/sample/wg_tunnel/main.go | 5 |
2 files changed, 3 insertions, 137 deletions
diff --git a/pkg/tcpip/sample/wg_tunnel/gtun.go b/pkg/tcpip/sample/wg_tunnel/gtun.go deleted file mode 100644 index d641fc42d..000000000 --- a/pkg/tcpip/sample/wg_tunnel/gtun.go +++ /dev/null @@ -1,135 +0,0 @@ -package main - -import ( - "context" - "fmt" - "os" - - "gvisor.dev/gvisor/pkg/tcpip" - "gvisor.dev/gvisor/pkg/tcpip/buffer" - "gvisor.dev/gvisor/pkg/tcpip/header" - "gvisor.dev/gvisor/pkg/tcpip/link/channel" - "gvisor.dev/gvisor/pkg/tcpip/stack" - wgtun "golang.zx2c4.com/wireguard/tun" -) - -type GoTun struct { - events chan wgtun.Event - ch *channel.Endpoint - stack *stack.Stack - ctx context.Context - cancel context.CancelFunc -} - -func (tun *GoTun) File() *os.File { - fmt.Println("File") - return nil -} - -func (tun *GoTun) Read(buff []byte, offset int) (int, error) { - fmt.Println("Read ", len(buff), offset) - - p, ok := tun.ch.ReadContext(tun.ctx) - if ok == false { - fmt.Println("Read error") - return 0, nil // FIXME error - } - vv := p.Pkt.Data - v := vv.ToView() - h := p.Pkt.Header.View() - fmt.Println("Read packet", vv.Size(), len(v), len(h), h) - - if len(buff) - offset < len(h) + len(v) { - fmt.Println("Short buffer") - return 0, nil // FIXME error - } - - copy(buff[offset:], h) - copy(buff[offset+len(h):], v) - return len(h)+len(v), nil -} - -func versionToProtocol(version int) tcpip.NetworkProtocolNumber { - switch version { - case header.IPv4Version: return header.IPv4ProtocolNumber - case header.IPv6Version: return header.IPv6ProtocolNumber - } - - return 0 -} - -func (tun *GoTun) Write(buff []byte, offset int) (int, error) { - size := len(buff) - offset - fmt.Println("Write ", len(buff), offset, size) - - if size < 1 { - return 0, nil // FIXME error - } - - buffSlice := buff[offset : offset+size] - - pkt := tcpip.PacketBuffer{ - Data: buffer.NewViewFromBytes(buffSlice).ToVectorisedView(), - } - //version := buff[offset] & 0x0f - protocol := versionToProtocol(header.IPVersion(buffSlice)) - netProto := tun.stack.NetworkProtocolInstance(protocol) - if netProto == nil { - fmt.Println("Write not ok") - return 0, nil - } - src, dst := netProto.ParseAddresses(pkt.Data.First()) - fmt.Println("Write ", src, dst) - // TODO change destination address - tun.ch.InjectInbound(protocol, pkt) // FIXME detect protocol number - - return size, nil -} - -func (tun *GoTun) Flush() error { - // TODO: can flushing be implemented by buffering and using sendmmsg? - fmt.Println("Flush") - return nil -} - -func (tun *GoTun) MTU() (int, error) { - fmt.Println("MTU") - return 1280, nil -} - -func (tun *GoTun) Name() (string, error) { - fmt.Println("Name") - return "foobar", nil -} - -func (tun *GoTun) Events() chan wgtun.Event { - fmt.Println("Events") - return tun.events -} - -func (tun *GoTun) Close() error { - fmt.Println("Close") - // TODO -// tun.cancel() - return nil -} - -func CreateGoTun(s *stack.Stack, ch *channel.Endpoint) (wgtun.Device, error) { - size := 16 - ctx, cancel := context.WithCancel(context.Background()) - tun := &GoTun{ - ch: ch, - events: make(chan wgtun.Event, size), - stack: s, - ctx: ctx, - cancel: cancel, - } - -// go func() { - fmt.Println("Post event") - tun.events <- wgtun.EventUp - fmt.Println("Posted event") -// }() - - return tun, nil -} diff --git a/pkg/tcpip/sample/wg_tunnel/main.go b/pkg/tcpip/sample/wg_tunnel/main.go index b859dff7a..1c87a09c2 100644 --- a/pkg/tcpip/sample/wg_tunnel/main.go +++ b/pkg/tcpip/sample/wg_tunnel/main.go @@ -44,6 +44,7 @@ import ( "gvisor.dev/gvisor/pkg/tcpip/link/loopback" "gvisor.dev/gvisor/pkg/tcpip/link/rawfile" "gvisor.dev/gvisor/pkg/tcpip/link/tun" + "gvisor.dev/gvisor/pkg/tcpip/link/wireguard" "gvisor.dev/gvisor/pkg/tcpip/network/arp" "gvisor.dev/gvisor/pkg/tcpip/network/ipv4" "gvisor.dev/gvisor/pkg/tcpip/network/ipv6" @@ -295,9 +296,9 @@ func addWgLink(s *stack.Stack, nic tcpip.NICID, interfaceName string, addr tcpip //mtu := 1500 // tun, err := wg_tun.CreateTUN(interfaceName, mtu) - tun, err := CreateGoTun(s, ep) + tun, err := wireguard.CreateWgTun(s, ep) if err != nil { - log.Fatal("CreateGoTun", err) + log.Fatal("CreateWgTun", err) } |