@@ -68,16 +68,6 @@ func (r *icmpResponder) respond(pkt *stack.PacketBuffer) (handled bool) {
6868 log .E ("icmp: responder: no handler" )
6969 return
7070 }
71- if useIcmpForwarder {
72- var id stack.TransportEndpointID
73- id .LocalAddress = pkt .Network ().SourceAddress ()
74- id .RemoteAddress = pkt .Network ().DestinationAddress ()
75- if settings .Debug {
76- log .VV ("icmp: responder: forward (sz: %d); src %s => dst %s" ,
77- pkt .Size (), id .RemoteAddress , id .LocalAddress )
78- }
79- return icmpForward2 (h , pkt , id )
80- }
8171 return r .handle (h , pkt .NICID , pkt )
8272}
8373
@@ -217,7 +207,7 @@ func (r *icmpResponder) process(h *icmpForwarder, nic tcpip.NICID, pkt *wire.Par
217207
218208 pinged := h .h .Ping (icmpMsg , src , dst )
219209
220- resp , proto , tag , err := r .echoReply (pkt , payload , pinged )
210+ resp , proto , l4proto , tag , err := r .echoReply (pkt , payload , pinged )
221211 notok = err != nil || len (resp ) == 0
222212
223213 if notok || settings .Debug {
@@ -229,10 +219,10 @@ func (r *icmpResponder) process(h *icmpForwarder, nic tcpip.NICID, pkt *wire.Par
229219 return
230220 }
231221
232- r .inject (nic , proto , resp )
222+ r .inject (nic , proto , l4proto , resp )
233223}
234224
235- func (r * icmpResponder ) echoReply (pkt * wire.Parsed , d []byte , ok bool ) ([]byte , tcpip.NetworkProtocolNumber , string , error ) {
225+ func (r * icmpResponder ) echoReply (pkt * wire.Parsed , d []byte , ok bool ) ([]byte , tcpip.NetworkProtocolNumber , tcpip. TransportProtocolNumber , string , error ) {
236226 // github.com/tailscale/tailscale/blob/7de1b0b33082cc/wgengine/netstack/netstack.go#L1201-L1212
237227 switch pkt .IPVersion {
238228 case 4 :
@@ -243,7 +233,7 @@ func (r *icmpResponder) echoReply(pkt *wire.Parsed, d []byte, ok bool) ([]byte,
243233 (& icmpHdr ).Code = wire .ICMP4HostUnreachable
244234 }
245235 tag := icmpHdr .Stringer ()
246- return wire .Generate (& icmpHdr , d ), header .IPv4ProtocolNumber , tag , nil
236+ return wire .Generate (& icmpHdr , d ), header .IPv4ProtocolNumber , header . ICMPv4ProtocolNumber , tag , nil
247237 case 6 :
248238 icmpHdr := pkt .ICMP6Header ()
249239 (& icmpHdr ).ToResponse ()
@@ -253,13 +243,13 @@ func (r *icmpResponder) echoReply(pkt *wire.Parsed, d []byte, ok bool) ([]byte,
253243 }
254244 tag := icmpHdr .Stringer ()
255245 // github.com/tailscale/tailscale/blob/7de1b0b33082cc/wgengine/userspace.go#L577
256- return wire .Generate (& icmpHdr , d ), header .IPv6ProtocolNumber , tag , nil
246+ return wire .Generate (& icmpHdr , d ), header .IPv6ProtocolNumber , header . ICMPv6ProtocolNumber , tag , nil
257247 default :
258- return nil , 0 , "<nil>" , fmt .Errorf ("unsupported ip version: %d" , pkt .IPVersion )
248+ return nil , 0 , 0 , "<nil>" , fmt .Errorf ("unsupported ip version: %d" , pkt .IPVersion )
259249 }
260250}
261251
262- func (r * icmpResponder ) inject (nic tcpip.NICID , proto tcpip.NetworkProtocolNumber , packet []byte ) {
252+ func (r * icmpResponder ) inject (nic tcpip.NICID , proto tcpip.NetworkProtocolNumber , l4proto tcpip. TransportProtocolNumber , packet []byte ) {
263253 ep := r .ep
264254 if ep == nil || ! r .ok () {
265255 return
@@ -269,11 +259,12 @@ func (r *icmpResponder) inject(nic tcpip.NICID, proto tcpip.NetworkProtocolNumbe
269259 Payload : buffer .MakeWithData (packet ),
270260 })
271261 pkt .NICID = nic
272- defer pkt .DecRef ()
273-
274262 pkt .NetworkProtocolNumber = proto
263+ pkt .TransportProtocolNumber = l4proto
264+
275265 var list stack.PacketBufferList
276266 list .PushBack (pkt )
267+ defer list .DecRef ()
277268
278269 sz := pkt .Size ()
279270 n , err := ep .WritePackets (list )
0 commit comments