mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
icmp: When setting TransportHeader, remove from the Data portion.
The current convention is when a header is set to pkt.XxxHeader field, it gets removed from pkt.Data. ICMP does not currently follow this convention. PiperOrigin-RevId: 320078606
This commit is contained in:
@@ -1358,16 +1358,19 @@ func (n *NIC) DeliverTransportPacket(r *Route, protocol tcpip.TransportProtocolN
|
||||
// TransportHeader is nil only when pkt is an ICMP packet or was reassembled
|
||||
// from fragments.
|
||||
if pkt.TransportHeader == nil {
|
||||
// TODO(gvisor.dev/issue/170): ICMP packets don't have their
|
||||
// TransportHeader fields set. See icmp/protocol.go:protocol.Parse for a
|
||||
// TODO(gvisor.dev/issue/170): ICMP packets don't have their TransportHeader
|
||||
// fields set yet, parse it here. See icmp/protocol.go:protocol.Parse for a
|
||||
// full explanation.
|
||||
if protocol == header.ICMPv4ProtocolNumber || protocol == header.ICMPv6ProtocolNumber {
|
||||
// ICMP packets may be longer, but until icmp.Parse is implemented, here
|
||||
// we parse it using the minimum size.
|
||||
transHeader, ok := pkt.Data.PullUp(transProto.MinimumPacketSize())
|
||||
if !ok {
|
||||
n.stack.stats.MalformedRcvdPackets.Increment()
|
||||
return
|
||||
}
|
||||
pkt.TransportHeader = transHeader
|
||||
pkt.Data.TrimFront(len(pkt.TransportHeader))
|
||||
} else {
|
||||
// This is either a bad packet or was re-assembled from fragments.
|
||||
transProto.Parse(pkt)
|
||||
|
||||
@@ -744,15 +744,15 @@ func (e *endpoint) HandlePacket(r *stack.Route, id stack.TransportEndpointID, pk
|
||||
// Only accept echo replies.
|
||||
switch e.NetProto {
|
||||
case header.IPv4ProtocolNumber:
|
||||
h, ok := pkt.Data.PullUp(header.ICMPv4MinimumSize)
|
||||
if !ok || header.ICMPv4(h).Type() != header.ICMPv4EchoReply {
|
||||
h := header.ICMPv4(pkt.TransportHeader)
|
||||
if len(h) < header.ICMPv4MinimumSize || h.Type() != header.ICMPv4EchoReply {
|
||||
e.stack.Stats().DroppedPackets.Increment()
|
||||
e.stats.ReceiveErrors.MalformedPacketsReceived.Increment()
|
||||
return
|
||||
}
|
||||
case header.IPv6ProtocolNumber:
|
||||
h, ok := pkt.Data.PullUp(header.ICMPv6MinimumSize)
|
||||
if !ok || header.ICMPv6(h).Type() != header.ICMPv6EchoReply {
|
||||
h := header.ICMPv6(pkt.TransportHeader)
|
||||
if len(h) < header.ICMPv6MinimumSize || h.Type() != header.ICMPv6EchoReply {
|
||||
e.stack.Stats().DroppedPackets.Increment()
|
||||
e.stats.ReceiveErrors.MalformedPacketsReceived.Increment()
|
||||
return
|
||||
@@ -786,7 +786,9 @@ func (e *endpoint) HandlePacket(r *stack.Route, id stack.TransportEndpointID, pk
|
||||
},
|
||||
}
|
||||
|
||||
packet.data = pkt.Data
|
||||
// ICMP socket's data includes ICMP header.
|
||||
packet.data = pkt.TransportHeader.ToVectorisedView()
|
||||
packet.data.Append(pkt.Data)
|
||||
|
||||
e.rcvList.PushBack(packet)
|
||||
e.rcvBufSize += packet.data.Size()
|
||||
|
||||
Reference in New Issue
Block a user