Skip to content

Commit 89ccd1d

Browse files
committed
netstack/icmp: avoid 2x ipHdr.ToResponse() calls on echo replies
1 parent 11a6e2a commit 89ccd1d

1 file changed

Lines changed: 9 additions & 9 deletions

File tree

intra/netstack/icmpecho.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -153,39 +153,39 @@ func (r *icmpResponder) process(h GICMPHandler, pkt *wire.Parsed, src, dst netip
153153

154154
pinged := h.Ping(icmpMsg, src, dst)
155155

156-
resp, proto, err := r.makeReply(pkt, payload, pinged)
156+
resp, proto, err := r.echoReply(pkt, payload, pinged)
157157
if err != nil || len(resp) == 0 {
158158
log.W("icmp: responder: reply %s <= %s (sz: %d); ping? %t; err? %v",
159159
src, dst, len(resp), pinged, err)
160160
return
161161
}
162162

163-
// github.com/tailscale/tailscale/blob/7de1b0b33082cc/wgengine/netstack/netstack.go#L1201-L1212
164163
r.inject(proto, resp)
165164
}
166165

167-
func (r *icmpResponder) makeReply(pkt *wire.Parsed, payload []byte, ok bool) ([]byte, tcpip.NetworkProtocolNumber, error) {
166+
func (r *icmpResponder) echoReply(pkt *wire.Parsed, d []byte, ok bool) ([]byte, tcpip.NetworkProtocolNumber, error) {
167+
// github.com/tailscale/tailscale/blob/7de1b0b33082cc/wgengine/netstack/netstack.go#L1201-L1212
168168
switch pkt.IPVersion {
169169
case 4:
170170
ipHdr := pkt.IP4Header()
171-
ipHdr.ToResponse()
172171
if !ok {
172+
ipHdr.ToResponse()
173173
icmpHdr := wire.ICMP4Header{IP4Header: ipHdr, Type: wire.ICMP4Unreachable, Code: wire.ICMP4HostUnreachable}
174-
return wire.Generate(icmpHdr, payload), header.IPv4ProtocolNumber, nil
174+
return wire.Generate(icmpHdr, d), header.IPv4ProtocolNumber, nil
175175
}
176176
icmpHdr := wire.ICMP4Header{IP4Header: ipHdr}
177177
icmpHdr.ToResponse()
178-
return wire.Generate(icmpHdr, payload), header.IPv4ProtocolNumber, nil
178+
return wire.Generate(icmpHdr, d), header.IPv4ProtocolNumber, nil
179179
case 6:
180180
ipHdr := pkt.IP6Header()
181-
ipHdr.ToResponse()
182181
if !ok {
182+
ipHdr.ToResponse()
183183
icmpHdr := wire.ICMP6Header{IP6Header: ipHdr, Type: wire.ICMP6Unreachable, Code: wire.ICMP6NoRoute}
184-
return wire.Generate(icmpHdr, payload), header.IPv6ProtocolNumber, nil
184+
return wire.Generate(icmpHdr, d), header.IPv6ProtocolNumber, nil
185185
}
186186
icmpHdr := wire.ICMP6Header{IP6Header: ipHdr}
187187
icmpHdr.ToResponse()
188-
return wire.Generate(icmpHdr, payload), header.IPv6ProtocolNumber, nil
188+
return wire.Generate(icmpHdr, d), header.IPv6ProtocolNumber, nil
189189
default:
190190
return nil, 0, fmt.Errorf("unsupported ip version: %d", pkt.IPVersion)
191191
}

0 commit comments

Comments
 (0)