Skip to content

Commit 8dec82d

Browse files
committed
netstack/icmp: Generate against ptr to icmp header
1 parent 89ccd1d commit 8dec82d

1 file changed

Lines changed: 17 additions & 20 deletions

File tree

intra/netstack/icmpecho.go

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)