@@ -93,8 +93,8 @@ func (r *icmpResponder) handle(b buffer.Buffer) (handled bool) {
9393 // feeding them back into netstack.
9494 if parsed .IPProto != wire .ICMPv4 && parsed .IPProto != wire .ICMPv6 {
9595 if settings .Debug {
96- log .VV ("icmp: responder: unsupported proto: %d / echo: %t; h: %s; content: %x" ,
97- parsed .IPProto , parsed .IsEchoRequest (), parsed .ICMPHeaderString (), parsed .Buffer ())
96+ log .VV ("icmp: responder: unsupported proto: %d / echo: %t @ %d ; h: %s; content: %x" ,
97+ parsed .IPProto , parsed .IsEchoRequest (), parsed .EchoIDSeq (), parsed . ICMPHeaderString (), parsed .Buffer ())
9898 }
9999 wire .Pool .Put (parsed )
100100 return
@@ -146,17 +146,17 @@ func (r *icmpResponder) process(h GICMPHandler, pkt *wire.Parsed, src, dst netip
146146 icmpMsg := pkt .Transport ()
147147 payload , truncated := pkt .Payload ()
148148 if truncated || len (icmpMsg ) <= 0 {
149- log .E ("icmp: responder: truncated? %t or missing? %t ICMPv%d; %s => %s; h: %s; sz: %d" ,
150- truncated , len (icmpMsg ) <= 0 , pkt .IPVersion , src , dst , pkt .ICMPHeaderString (), len (payload ))
149+ log .E ("icmp: responder: truncated? %t or missing? %t ICMPv%d; %s => %s; id: %d; h: %s; sz: %d" ,
150+ truncated , len (icmpMsg ) <= 0 , pkt .IPVersion , src , dst , pkt .EchoIDSeq (), pkt . ICMPHeaderString (), len (payload ))
151151 return
152152 }
153153
154154 pinged := h .Ping (icmpMsg , src , dst )
155155
156156 resp , proto , err := r .echoReply (pkt , payload , pinged )
157157 if err != nil || len (resp ) == 0 {
158- log .W ("icmp: responder: reply %s <= %s (sz: %d); ping? %t; err? %v" ,
159- src , dst , len (resp ), pinged , err )
158+ log .W ("icmp: responder: reply %s <= %s (sz: %d / id: %d ); ping? %t; err? %v" ,
159+ src , dst , len (resp ), pkt . EchoIDSeq (), pinged , err )
160160 return
161161 }
162162
@@ -167,25 +167,22 @@ func (r *icmpResponder) echoReply(pkt *wire.Parsed, d []byte, ok bool) ([]byte,
167167 // github.com/tailscale/tailscale/blob/7de1b0b33082cc/wgengine/netstack/netstack.go#L1201-L1212
168168 switch pkt .IPVersion {
169169 case 4 :
170- ipHdr := pkt .IP4Header ()
170+ icmpHdr := pkt .ICMP4Header ()
171+ icmpHdr .ToResponse ()
171172 if ! ok {
172- ipHdr .ToResponse ()
173- icmpHdr := wire.ICMP4Header {IP4Header : ipHdr , Type : wire .ICMP4Unreachable , Code : wire .ICMP4HostUnreachable }
174- return wire .Generate (icmpHdr , d ), header .IPv4ProtocolNumber , nil
173+ icmpHdr .Type = wire .ICMP4Unreachable
174+ icmpHdr .Code = wire .ICMP4HostUnreachable
175175 }
176- icmpHdr := wire.ICMP4Header {IP4Header : ipHdr }
177- icmpHdr .ToResponse ()
178- return wire .Generate (icmpHdr , d ), header .IPv4ProtocolNumber , nil
176+ return wire .Generate (& icmpHdr , d ), header .IPv4ProtocolNumber , nil
179177 case 6 :
180- ipHdr := pkt .IP6Header ()
178+ icmpHdr := pkt .ICMP6Header ()
179+ icmpHdr .ToResponse ()
181180 if ! ok {
182- ipHdr .ToResponse ()
183- icmpHdr := wire.ICMP6Header {IP6Header : ipHdr , Type : wire .ICMP6Unreachable , Code : wire .ICMP6NoRoute }
184- return wire .Generate (icmpHdr , d ), header .IPv6ProtocolNumber , nil
181+ icmpHdr .Type = wire .ICMP6Unreachable
182+ icmpHdr .Code = wire .ICMP6NoRoute
185183 }
186- icmpHdr := wire.ICMP6Header {IP6Header : ipHdr }
187- icmpHdr .ToResponse ()
188- return wire .Generate (icmpHdr , d ), header .IPv6ProtocolNumber , nil
184+ // github.com/tailscale/tailscale/blob/7de1b0b33082cc/wgengine/userspace.go#L577
185+ return wire .Generate (& icmpHdr , d ), header .IPv6ProtocolNumber , nil
189186 default :
190187 return nil , 0 , fmt .Errorf ("unsupported ip version: %d" , pkt .IPVersion )
191188 }
0 commit comments