MCPcopy
hub / github.com/google/gvisor / DeepCopyForForwarding

Method DeepCopyForForwarding

pkg/tcpip/stack/packet_buffer.go:444–472  ·  view source on GitHub ↗

DeepCopyForForwarding creates a deep copy of the packet buffer for forwarding. The returned packet buffer will have the network and transport headers set if the original packet buffer did.

(reservedHeaderBytes int)

Source from the content-addressed store, hash-verified

442// The returned packet buffer will have the network and transport headers
443// set if the original packet buffer did.
444func (pk *PacketBuffer) DeepCopyForForwarding(reservedHeaderBytes int) *PacketBuffer {
445 payload := BufferSince(pk.NetworkHeader())
446 defer payload.Release()
447 newPk := NewPacketBuffer(PacketBufferOptions{
448 ReserveHeaderBytes: reservedHeaderBytes,
449 Payload: payload.DeepClone(),
450 IsForwardedPacket: true,
451 })
452
453 {
454 consumeBytes := len(pk.NetworkHeader().Slice())
455 if _, consumed := newPk.NetworkHeader().Consume(consumeBytes); !consumed {
456 panic(fmt.Sprintf("expected to consume network header %d bytes from new packet", consumeBytes))
457 }
458 newPk.NetworkProtocolNumber = pk.NetworkProtocolNumber
459 }
460
461 {
462 consumeBytes := len(pk.TransportHeader().Slice())
463 if _, consumed := newPk.TransportHeader().Consume(consumeBytes); !consumed {
464 panic(fmt.Sprintf("expected to consume transport header %d bytes from new packet", consumeBytes))
465 }
466 newPk.TransportProtocolNumber = pk.TransportProtocolNumber
467 }
468
469 newPk.tuple = pk.tuple
470
471 return newPk
472}
473
474// IsConnTrackConfigured returns whether connection tracking is configured for this packet.
475func (pk *PacketBuffer) IsConnTrackConfigured() bool {

Callers 2

Calls 8

NetworkHeaderMethod · 0.95
TransportHeaderMethod · 0.95
BufferSinceFunction · 0.85
NewPacketBufferFunction · 0.85
DeepCloneMethod · 0.80
ReleaseMethod · 0.65
SliceMethod · 0.45
ConsumeMethod · 0.45

Tested by

no test coverage detected