X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fyggdrasil%2Ftcpip.go;h=9796686a3c6f58463a2dd634231134c5cfe4595c;hb=cf9363f956cb2d93a581c11ed65c5b02910d10d5;hp=ed3ddb8325e9519e2f251720e8b8740f2a592612;hpb=09d14cc39cce6710af382e3a178d215be268a0d7;p=nncp.git diff --git a/src/yggdrasil/tcpip.go b/src/yggdrasil/tcpip.go index ed3ddb8..9796686 100644 --- a/src/yggdrasil/tcpip.go +++ b/src/yggdrasil/tcpip.go @@ -3,7 +3,7 @@ /* NNCP -- Node to Node copy, utilities for store-and-forward data exchange -Copyright (C) 2016-2022 Sergey Matveev +Copyright (C) 2016-2023 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -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.PacketBufferPtr) tcpip.Error { + v := pkt.ToView() + n, err := v.Read(e.writeBuf) if err != nil { log.Println(err) return &tcpip.ErrAborted{} @@ -94,24 +89,19 @@ func (e *TCPIPEndpoint) WritePacket( return nil } -func (e *TCPIPEndpoint) WritePackets( - stack.RouteInfo, - *stack.GSO, - stack.PacketBufferList, - tcpip.NetworkProtocolNumber, -) (int, tcpip.Error) { - panic("not implemented") +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 (*TCPIPEndpoint) ARPHardwareType() header.ARPHardwareType { return header.ARPHardwareNone } -func (e *TCPIPEndpoint) AddHeader( - tcpip.LinkAddress, - tcpip.LinkAddress, - tcpip.NetworkProtocolNumber, - *stack.PacketBuffer, -) { -} +func (e *TCPIPEndpoint) AddHeader(stack.PacketBufferPtr) {} func convertToFullAddr(ip net.IP, port int) (tcpip.FullAddress, tcpip.NetworkProtocolNumber) { return tcpip.FullAddress{ @@ -164,7 +154,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 +181,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