mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Update WritePacket* API to take ownership of packets to be written.
Updates #2404. PiperOrigin-RevId: 313834784
This commit is contained in:
@@ -1304,13 +1304,16 @@ func (n *NIC) forwardPacket(r *Route, protocol tcpip.NetworkProtocolNumber, pkt
|
||||
pkt.Header = buffer.NewPrependable(linkHeaderLen)
|
||||
}
|
||||
|
||||
// WritePacket takes ownership of pkt, calculate numBytes first.
|
||||
numBytes := pkt.Header.UsedLength() + pkt.Data.Size()
|
||||
|
||||
if err := n.linkEP.WritePacket(r, nil /* gso */, protocol, pkt); err != nil {
|
||||
r.Stats().IP.OutgoingPacketErrors.Increment()
|
||||
return
|
||||
}
|
||||
|
||||
n.stats.Tx.Packets.Increment()
|
||||
n.stats.Tx.Bytes.IncrementBy(uint64(pkt.Header.UsedLength() + pkt.Data.Size()))
|
||||
n.stats.Tx.Bytes.IncrementBy(uint64(numBytes))
|
||||
}
|
||||
|
||||
// DeliverTransportPacket delivers the packets to the appropriate transport
|
||||
|
||||
@@ -240,16 +240,17 @@ type NetworkEndpoint interface {
|
||||
MaxHeaderLength() uint16
|
||||
|
||||
// WritePacket writes a packet to the given destination address and
|
||||
// protocol. It sets pkt.NetworkHeader. pkt.TransportHeader must have
|
||||
// already been set.
|
||||
// protocol. It takes ownership of pkt. pkt.TransportHeader must have already
|
||||
// been set.
|
||||
WritePacket(r *Route, gso *GSO, params NetworkHeaderParams, pkt PacketBuffer) *tcpip.Error
|
||||
|
||||
// WritePackets writes packets to the given destination address and
|
||||
// protocol. pkts must not be zero length.
|
||||
// protocol. pkts must not be zero length. It takes ownership of pkts and
|
||||
// underlying packets.
|
||||
WritePackets(r *Route, gso *GSO, pkts PacketBufferList, params NetworkHeaderParams) (int, *tcpip.Error)
|
||||
|
||||
// WriteHeaderIncludedPacket writes a packet that includes a network
|
||||
// header to the given destination address.
|
||||
// header to the given destination address. It takes ownership of pkt.
|
||||
WriteHeaderIncludedPacket(r *Route, pkt PacketBuffer) *tcpip.Error
|
||||
|
||||
// ID returns the network protocol endpoint ID.
|
||||
@@ -382,9 +383,8 @@ type LinkEndpoint interface {
|
||||
LinkAddress() tcpip.LinkAddress
|
||||
|
||||
// WritePacket writes a packet with the given protocol through the
|
||||
// given route. It sets pkt.LinkHeader if a link layer header exists.
|
||||
// pkt.NetworkHeader and pkt.TransportHeader must have already been
|
||||
// set.
|
||||
// given route. It takes ownership of pkt. pkt.NetworkHeader and
|
||||
// pkt.TransportHeader must have already been set.
|
||||
//
|
||||
// To participate in transparent bridging, a LinkEndpoint implementation
|
||||
// should call eth.Encode with header.EthernetFields.SrcAddr set to
|
||||
@@ -392,7 +392,8 @@ type LinkEndpoint interface {
|
||||
WritePacket(r *Route, gso *GSO, protocol tcpip.NetworkProtocolNumber, pkt PacketBuffer) *tcpip.Error
|
||||
|
||||
// WritePackets writes packets with the given protocol through the
|
||||
// given route. pkts must not be zero length.
|
||||
// given route. pkts must not be zero length. It takes ownership of pkts and
|
||||
// underlying packets.
|
||||
//
|
||||
// Right now, WritePackets is used only when the software segmentation
|
||||
// offload is enabled. If it will be used for something else, it may
|
||||
@@ -400,7 +401,7 @@ type LinkEndpoint interface {
|
||||
WritePackets(r *Route, gso *GSO, pkts PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error)
|
||||
|
||||
// WriteRawPacket writes a packet directly to the link. The packet
|
||||
// should already have an ethernet header.
|
||||
// should already have an ethernet header. It takes ownership of vv.
|
||||
WriteRawPacket(vv buffer.VectorisedView) *tcpip.Error
|
||||
|
||||
// Attach attaches the data link layer endpoint to the network-layer
|
||||
|
||||
@@ -158,12 +158,15 @@ func (r *Route) WritePacket(gso *GSO, params NetworkHeaderParams, pkt PacketBuff
|
||||
return tcpip.ErrInvalidEndpointState
|
||||
}
|
||||
|
||||
// WritePacket takes ownership of pkt, calculate numBytes first.
|
||||
numBytes := pkt.Header.UsedLength() + pkt.Data.Size()
|
||||
|
||||
err := r.ref.ep.WritePacket(r, gso, params, pkt)
|
||||
if err != nil {
|
||||
r.Stats().IP.OutgoingPacketErrors.Increment()
|
||||
} else {
|
||||
r.ref.nic.stats.Tx.Packets.Increment()
|
||||
r.ref.nic.stats.Tx.Bytes.IncrementBy(uint64(pkt.Header.UsedLength() + pkt.Data.Size()))
|
||||
r.ref.nic.stats.Tx.Bytes.IncrementBy(uint64(numBytes))
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -175,9 +178,12 @@ func (r *Route) WritePackets(gso *GSO, pkts PacketBufferList, params NetworkHead
|
||||
return 0, tcpip.ErrInvalidEndpointState
|
||||
}
|
||||
|
||||
// WritePackets takes ownership of pkt, calculate length first.
|
||||
numPkts := pkts.Len()
|
||||
|
||||
n, err := r.ref.ep.WritePackets(r, gso, pkts, params)
|
||||
if err != nil {
|
||||
r.Stats().IP.OutgoingPacketErrors.IncrementBy(uint64(pkts.Len() - n))
|
||||
r.Stats().IP.OutgoingPacketErrors.IncrementBy(uint64(numPkts - n))
|
||||
}
|
||||
r.ref.nic.stats.Tx.Packets.IncrementBy(uint64(n))
|
||||
|
||||
@@ -198,12 +204,15 @@ func (r *Route) WriteHeaderIncludedPacket(pkt PacketBuffer) *tcpip.Error {
|
||||
return tcpip.ErrInvalidEndpointState
|
||||
}
|
||||
|
||||
// WriteHeaderIncludedPacket takes ownership of pkt, calculate numBytes first.
|
||||
numBytes := pkt.Data.Size()
|
||||
|
||||
if err := r.ref.ep.WriteHeaderIncludedPacket(r, pkt); err != nil {
|
||||
r.Stats().IP.OutgoingPacketErrors.Increment()
|
||||
return err
|
||||
}
|
||||
r.ref.nic.stats.Tx.Packets.Increment()
|
||||
r.ref.nic.stats.Tx.Bytes.IncrementBy(uint64(pkt.Data.Size()))
|
||||
r.ref.nic.stats.Tx.Bytes.IncrementBy(uint64(numBytes))
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user