diff --git a/core/device/iobased/endpoint.go b/core/device/iobased/endpoint.go index ab012e2..2a4d33e 100644 --- a/core/device/iobased/endpoint.go +++ b/core/device/iobased/endpoint.go @@ -73,9 +73,9 @@ func (e *Endpoint) dispatchLoop() { switch header.IPVersion(packet) { case header.IPv4Version: - e.dispatcher.DeliverNetworkPacket("", "", header.IPv4ProtocolNumber, pkb) + e.dispatcher.DeliverNetworkPacket(header.IPv4ProtocolNumber, pkb) case header.IPv6Version: - e.dispatcher.DeliverNetworkPacket("", "", header.IPv6ProtocolNumber, pkb) + e.dispatcher.DeliverNetworkPacket(header.IPv6ProtocolNumber, pkb) } } } @@ -89,13 +89,8 @@ func (e *Endpoint) writePacket(pkt *stack.PacketBuffer) tcpip.Error { return nil } -// WritePacket writes packet back into io.ReadWriter. -func (e *Endpoint) WritePacket(_ stack.RouteInfo, _ tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) tcpip.Error { - return e.writePacket(pkt) -} - // WritePackets writes packets back into io.ReadWriter. -func (e *Endpoint) WritePackets(_ stack.RouteInfo, pkts stack.PacketBufferList, _ tcpip.NetworkProtocolNumber) (int, tcpip.Error) { +func (e *Endpoint) WritePackets(pkts stack.PacketBufferList) (int, tcpip.Error) { n := 0 for pkt := pkts.Front(); pkt != nil; pkt = pkt.Next() { if err := e.writePacket(pkt); err != nil { @@ -106,10 +101,6 @@ func (e *Endpoint) WritePackets(_ stack.RouteInfo, pkts stack.PacketBufferList, return n, nil } -func (e *Endpoint) WriteRawPacket(packetBuffer *stack.PacketBuffer) tcpip.Error { - return &tcpip.ErrNotSupported{} -} - // MTU implements stack.LinkEndpoint.MTU. func (e *Endpoint) MTU() uint32 { return e.mtu @@ -137,8 +128,7 @@ func (*Endpoint) ARPHardwareType() header.ARPHardwareType { } // AddHeader implements stack.LinkEndpoint.AddHeader. -func (e *Endpoint) AddHeader(tcpip.LinkAddress, tcpip.LinkAddress, tcpip.NetworkProtocolNumber, *stack.PacketBuffer) { -} +func (e *Endpoint) AddHeader(*stack.PacketBuffer) {} // Wait implements stack.LinkEndpoint.Wait. func (e *Endpoint) Wait() {} diff --git a/core/device/tun/tun_gvisor.go b/core/device/tun/tun_netstack.go similarity index 82% rename from core/device/tun/tun_gvisor.go rename to core/device/tun/tun_netstack.go index c57a05e..4752a95 100644 --- a/core/device/tun/tun_gvisor.go +++ b/core/device/tun/tun_netstack.go @@ -49,10 +49,18 @@ func Open(name string, mtu uint32) (device.Device, error) { t.mtu = _mtu ep, err := fdbased.New(&fdbased.Options{ - MTU: t.mtu, FDs: []int{fd}, - // TUN only + MTU: t.mtu, + // TUN only, ignore ethernet header. EthernetHeader: false, + // SYS_READV support only for TUN fd. + PacketDispatchMode: fdbased.Readv, + // TODO: set this field to zero in the future. + // it's a only temporary hack to avoid `socket operation + // on non-socket` error caused by SYS_SENDMMSG syscall. + // + // Ref: https://github.com/google/gvisor/issues/7125 + MaxSyscallHeaderBytes: 0x40, }) if err != nil { return nil, fmt.Errorf("create endpoint: %w", err) diff --git a/go.mod b/go.mod index c3a9996..72146e4 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 golang.zx2c4.com/wireguard v0.0.0-20220117163742-e0b8f11489c5 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b - gvisor.dev/gvisor v0.0.0-20211124014810-d07633871257 + gvisor.dev/gvisor v0.0.0-20220129032118-ed00636ef990 ) require ( diff --git a/go.sum b/go.sum index 044f901..27d3b7c 100644 --- a/go.sum +++ b/go.sum @@ -60,5 +60,5 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gvisor.dev/gvisor v0.0.0-20211124014810-d07633871257 h1:WWhBINX/PcQgzjVV/is9b/nClBCXcOUMvMGsgLJx90M= -gvisor.dev/gvisor v0.0.0-20211124014810-d07633871257/go.mod h1:Pd3Ini/+F15mWIiBZQM0YFeIYsPYl1cV2PCdoFJVVYU= +gvisor.dev/gvisor v0.0.0-20220129032118-ed00636ef990 h1:fTgWAYpliP19U3FX8+tI2TZGXnnk45g18frOuZxKay4= +gvisor.dev/gvisor v0.0.0-20220129032118-ed00636ef990/go.mod h1:vmN0Pug/s8TJmpnt30DvrEfZ5vDl52psGLU04tFuK2U=