@@ -117,41 +117,29 @@ func (f *icmpForwarder) reply4(id stack.TransportEndpointID, pkt *stack.PacketBu
117117 if ! f .h .Ping (data , src , dst ) { // unreachable
118118 err = f .icmpErr4 (pkt , header .ICMPv4DstUnreachable , header .ICMPv4HostUnreachable )
119119 } else { // reachable
120- newOptions := f .ipOpts (pkt , ipHdr )
121-
122- // Correct IP header length (IHL in 32-bit words).
123- replyHeaderLength := uint8 (header .IPv4MinimumSize + len (newOptions ))
124- replyIPHdrView := buffer .NewView (int (replyHeaderLength ))
125- replyIPHdrView .Write (ipHdr [:header .IPv4MinimumSize ])
126- replyIPHdrView .Write (newOptions )
127-
128- replyIPHdr := header .IPv4 (replyIPHdrView .AsSlice ())
129- replyIPHdr .SetHeaderLength (replyHeaderLength >> 2 ) // IHL in 32-bit words.
130- replyIPHdr .SetSourceAddress (route .LocalAddress ())
131- replyIPHdr .SetDestinationAddress (route .RemoteAddress ())
132- replyIPHdr .SetTTL (route .DefaultTTL ())
133- replyIPHdr .SetTotalLength (uint16 (len (replyIPHdr ) + len (replyData .AsSlice ())))
134- replyIPHdr .SetChecksum (0 )
135- replyIPHdr .SetChecksum (^ replyIPHdr .CalculateChecksum ())
136-
137- replyICMPHdr := header .ICMPv4 (replyData .AsSlice ())
120+ originRef := replyData .AsSlice ()
121+ replyBuf := buffer .NewViewSize (len (originRef ))
122+ replyRef := replyBuf .AsSlice ()
123+
124+ copy (replyRef [4 :], originRef [4 :])
125+ replyICMPHdr := header .ICMPv4 (replyRef )
138126 replyICMPHdr .SetType (header .ICMPv4EchoReply )
139127 replyICMPHdr .SetCode (0 ) // EchoReply must have Code=0.
140- replyICMPHdr .SetChecksum (0 )
141- replyICMPHdr .SetChecksum (^ checksum .Checksum (replyData .AsSlice (), 0 ))
128+ replyICMPHdr .SetChecksum (^ checksum .Checksum (replyRef , 0 ))
142129
143- replyBuf := buffer .MakeWithView (replyIPHdrView )
144- replyBuf .Append (replyData .Clone ())
145130 replyPkt := stack .NewPacketBuffer (stack.PacketBufferOptions {
146131 ReserveHeaderBytes : int (route .MaxHeaderLength ()),
147- Payload : replyBuf ,
132+ Payload : buffer . MakeWithView ( replyBuf ) ,
148133 })
149134
150135 log .D ("icmp: v4: %s: ok type %v/%v sz[%d] from %v <= %v" ,
151136 f .o , replyICMPHdr .Type (), replyICMPHdr .Code (), len (replyICMPHdr ), src , dst )
152137
153138 // github.com/google/gvisor/blob/738e1d995f/pkg/tcpip/network/ipv4/icmp.go#L794
154- err = route .WriteHeaderIncludedPacket (replyPkt )
139+ err = route .WritePacket (stack.NetworkHeaderParams {
140+ Protocol : header .ICMPv4ProtocolNumber ,
141+ TTL : route .DefaultTTL (),
142+ }, replyPkt )
155143 }
156144 loge (err )("icmp: v4: %s: wrote reply to tun; err? %v" , f .o , err )
157145 })
0 commit comments