Merge release-20201005.0-95-gdffa4c669 (automated)

This commit is contained in:
gVisor bot 2020-10-16 20:57:20 +00:00
commit 55f093bcb3
2 changed files with 20 additions and 5 deletions

View File

@ -23,7 +23,6 @@ import (
"gvisor.dev/gvisor/pkg/sleep"
"gvisor.dev/gvisor/pkg/sync"
"gvisor.dev/gvisor/pkg/tcpip"
"gvisor.dev/gvisor/pkg/tcpip/buffer"
"gvisor.dev/gvisor/pkg/tcpip/header"
)
@ -686,7 +685,9 @@ func (n *NIC) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protocol tcp
// packet to forward.
fwdPkt := NewPacketBuffer(PacketBufferOptions{
ReserveHeaderBytes: int(n.LinkEndpoint.MaxHeaderLength()),
Data: buffer.NewVectorisedView(pkt.Size(), pkt.Views()),
// We need to do a deep copy of the IP packet because WritePacket (and
// friends) take ownership of the packet buffer, but we do not own it.
Data: PayloadSince(pkt.NetworkHeader()).ToVectorisedView(),
})
// TODO(b/143425874) Decrease the TTL field in forwarded packets.

View File

@ -311,11 +311,25 @@ func (h PacketHeader) Consume(size int) (v buffer.View, consumed bool) {
}
// PayloadSince returns packet payload starting from and including a particular
// header. This method isn't optimized and should be used in test only.
// header.
//
// The returned View is owned by the caller - its backing buffer is separate
// from the packet header's underlying packet buffer.
func PayloadSince(h PacketHeader) buffer.View {
var v buffer.View
size := h.pk.Data.Size()
for _, hinfo := range h.pk.headers[h.typ:] {
size += len(hinfo.buf)
}
v := make(buffer.View, 0, size)
for _, hinfo := range h.pk.headers[h.typ:] {
v = append(v, hinfo.buf...)
}
return append(v, h.pk.Data.ToView()...)
for _, view := range h.pk.Data.Views() {
v = append(v, view...)
}
return v
}