mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Populate EgressRoute, GSO, Netproto in NIC
fdbased and qdisc layers expect these fields to already be populated before being reached. PiperOrigin-RevId: 353099492
This commit is contained in:
committed by
gVisor bot
parent
1005a88491
commit
0ca4cf7698
@@ -165,12 +165,15 @@ func (e *endpoint) WritePacket(r stack.RouteInfo, gso *stack.GSO, protocol tcpip
|
||||
}
|
||||
|
||||
// WritePackets implements stack.LinkEndpoint.WritePackets.
|
||||
//
|
||||
// Being a batch API, each packet in pkts should have the following
|
||||
// fields populated:
|
||||
// - pkt.EgressRoute
|
||||
// - pkt.GSOOptions
|
||||
// - pkt.NetworkProtocolNumber
|
||||
func (e *endpoint) WritePackets(r stack.RouteInfo, gso *stack.GSO, pkts stack.PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
enqueued := 0
|
||||
for pkt := pkts.Front(); pkt != nil; {
|
||||
pkt.EgressRoute = r
|
||||
pkt.GSOOptions = gso
|
||||
pkt.NetworkProtocolNumber = protocol
|
||||
d := e.dispatchers[int(pkt.Hash)%len(e.dispatchers)]
|
||||
nxt := pkt.Next()
|
||||
if !d.q.enqueue(pkt) {
|
||||
|
||||
+11
-1
@@ -344,6 +344,9 @@ func (n *NIC) writePacket(r RouteInfo, gso *GSO, protocol tcpip.NetworkProtocolN
|
||||
// WritePacket takes ownership of pkt, calculate numBytes first.
|
||||
numBytes := pkt.Size()
|
||||
|
||||
pkt.EgressRoute = r
|
||||
pkt.GSOOptions = gso
|
||||
pkt.NetworkProtocolNumber = protocol
|
||||
if err := n.LinkEndpoint.WritePacket(r, gso, protocol, pkt); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -357,7 +360,14 @@ func (n *NIC) writePacket(r RouteInfo, gso *GSO, protocol tcpip.NetworkProtocolN
|
||||
func (n *NIC) WritePackets(r *Route, gso *GSO, pkts PacketBufferList, protocol tcpip.NetworkProtocolNumber) (int, *tcpip.Error) {
|
||||
// TODO(gvisor.dev/issue/4458): Queue packets whie link address resolution
|
||||
// is being peformed like WritePacket.
|
||||
writtenPackets, err := n.LinkEndpoint.WritePackets(r.Fields(), gso, pkts, protocol)
|
||||
routeInfo := r.Fields()
|
||||
for pkt := pkts.Front(); pkt != nil; pkt = pkt.Next() {
|
||||
pkt.EgressRoute = routeInfo
|
||||
pkt.GSOOptions = gso
|
||||
pkt.NetworkProtocolNumber = protocol
|
||||
}
|
||||
|
||||
writtenPackets, err := n.LinkEndpoint.WritePackets(routeInfo, gso, pkts, protocol)
|
||||
n.stats.Tx.Packets.IncrementBy(uint64(writtenPackets))
|
||||
writtenBytes := 0
|
||||
for i, pb := 0, pkts.Front(); i < writtenPackets && pb != nil; i, pb = i+1, pb.Next() {
|
||||
|
||||
Reference in New Issue
Block a user