]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/yggdrasil/tcpip.go
Use gvisor.dev/gvisor again instead of inet.af/netstack
[nncp.git] / src / yggdrasil / tcpip.go
index ed3ddb8325e9519e2f251720e8b8740f2a592612..a1a71acd3eab4fae041ad22e5a16d9c764bd4b4c 100644 (file)
@@ -31,9 +31,9 @@ import (
        iwt "github.com/Arceliar/ironwood/types"
        yaddr "github.com/yggdrasil-network/yggdrasil-go/src/address"
        "golang.org/x/crypto/ed25519"
+       "gvisor.dev/gvisor/pkg/bufferv2"
        "gvisor.dev/gvisor/pkg/tcpip"
        "gvisor.dev/gvisor/pkg/tcpip/adapters/gonet"
-       "gvisor.dev/gvisor/pkg/tcpip/buffer"
        "gvisor.dev/gvisor/pkg/tcpip/header"
        "gvisor.dev/gvisor/pkg/tcpip/network/ipv6"
        "gvisor.dev/gvisor/pkg/tcpip/stack"
@@ -68,14 +68,9 @@ func (*TCPIPEndpoint) LinkAddress() tcpip.LinkAddress { return "" }
 
 func (*TCPIPEndpoint) Wait() {}
 
-func (e *TCPIPEndpoint) WritePacket(
-       _ stack.RouteInfo,
-       _ *stack.GSO,
-       _ tcpip.NetworkProtocolNumber,
-       pkt *stack.PacketBuffer,
-) tcpip.Error {
-       vv := buffer.NewVectorisedView(pkt.Size(), pkt.Views())
-       n, err := vv.Read(e.writeBuf)
+func (e *TCPIPEndpoint) WritePacket(pkt *stack.PacketBuffer) tcpip.Error {
+       v := pkt.ToView()
+       n, err := v.Read(e.writeBuf)
        if err != nil {
                log.Println(err)
                return &tcpip.ErrAborted{}
@@ -94,24 +89,23 @@ func (e *TCPIPEndpoint) WritePacket(
        return nil
 }
 
-func (e *TCPIPEndpoint) WritePackets(
-       stack.RouteInfo,
-       *stack.GSO,
-       stack.PacketBufferList,
-       tcpip.NetworkProtocolNumber,
-) (int, tcpip.Error) {
+func (e *TCPIPEndpoint) WritePackets(pbs stack.PacketBufferList) (int, tcpip.Error) {
+       for i, pb := range pbs.AsSlice() {
+               err := e.WritePacket(pb)
+               if err != nil {
+                       return i + 1, err
+               }
+       }
+       return len(pbs.AsSlice()), nil
+}
+
+func (e *TCPIPEndpoint) WriteRawPacket(*stack.PacketBuffer) tcpip.Error {
        panic("not implemented")
 }
 
 func (*TCPIPEndpoint) ARPHardwareType() header.ARPHardwareType { return header.ARPHardwareNone }
 
-func (e *TCPIPEndpoint) AddHeader(
-       tcpip.LinkAddress,
-       tcpip.LinkAddress,
-       tcpip.NetworkProtocolNumber,
-       *stack.PacketBuffer,
-) {
-}
+func (e *TCPIPEndpoint) AddHeader(*stack.PacketBuffer) {}
 
 func convertToFullAddr(ip net.IP, port int) (tcpip.FullAddress, tcpip.NetworkProtocolNumber) {
        return tcpip.FullAddress{
@@ -164,7 +158,11 @@ func NewTCPIPEndpoint(
        if err := s.CreateNIC(1, &e); err != nil {
                return nil, fmt.Errorf("%+v", err)
        }
-       if err := s.AddAddress(1, ipv6.ProtocolNumber, tcpip.Address(ipOur)); err != nil {
+       protoAddr := tcpip.ProtocolAddress{
+               Protocol:          ipv6.ProtocolNumber,
+               AddressWithPrefix: tcpip.Address(ipOur).WithPrefix(),
+       }
+       if err := s.AddProtocolAddress(1, protoAddr, stack.AddressProperties{}); err != nil {
                return nil, fmt.Errorf("%+v", err)
        }
        s.AddRoute(tcpip.Route{Destination: header.IPv6EmptySubnet, NIC: 1})
@@ -187,11 +185,9 @@ func NewTCPIPEndpoint(
                                e.ipToAddr[ip] = from
                        }
                        pkb := stack.NewPacketBuffer(stack.PacketBufferOptions{
-                               Data: buffer.NewVectorisedView(n, []buffer.View{
-                                       buffer.NewViewFromBytes(e.readBuf[:n]),
-                               }),
+                               Payload: bufferv2.MakeWithData(e.readBuf[:n]),
                        })
-                       e.d.DeliverNetworkPacket("", "", ipv6.ProtocolNumber, pkb)
+                       e.d.DeliverNetworkPacket(ipv6.ProtocolNumber, pkb)
                }
        }()
        return &e, nil