Skip to content

Commit 79e2d3b

Browse files
committed
ping: Clean old requests
1 parent e6c64e3 commit 79e2d3b

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

ping/destination.go

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type Destination struct {
2727
routeContext tun.DirectRouteContext
2828
timeout time.Duration
2929
requestAccess sync.Mutex
30-
requests map[pingRequest]bool
30+
requests map[pingRequest]time.Time
3131
}
3232

3333
type pingRequest struct {
@@ -68,7 +68,7 @@ func ConnectDestination(
6868
destination: destination,
6969
routeContext: routeContext,
7070
timeout: timeout,
71-
requests: make(map[pingRequest]bool),
71+
requests: make(map[pingRequest]time.Time),
7272
}
7373
go d.loopRead()
7474
return d, nil
@@ -107,7 +107,8 @@ func (d *Destination) loopRead() {
107107
var requestExists bool
108108
request := pingRequest{Source: ipHdr.DestinationAddr(), Destination: ipHdr.SourceAddr(), Identifier: icmpHdr.Ident(), Sequence: icmpHdr.Sequence()}
109109
d.requestAccess.Lock()
110-
if d.requests[request] {
110+
_, loaded := d.requests[request]
111+
if loaded {
111112
requestExists = true
112113
delete(d.requests, request)
113114
}
@@ -133,7 +134,8 @@ func (d *Destination) loopRead() {
133134
var requestExists bool
134135
request := pingRequest{Source: ipHdr.DestinationAddr(), Destination: ipHdr.SourceAddr(), Identifier: icmpHdr.Ident(), Sequence: icmpHdr.Sequence()}
135136
d.requestAccess.Lock()
136-
if d.requests[request] {
137+
_, loaded := d.requests[request]
138+
if loaded {
137139
requestExists = true
138140
delete(d.requests, request)
139141
}
@@ -161,9 +163,7 @@ func (d *Destination) WritePacket(packet *buf.Buffer) error {
161163
return E.New("invalid ICMPv4 header")
162164
}
163165
icmpHdr := header.ICMPv4(ipHdr.Payload())
164-
d.requestAccess.Lock()
165-
d.requests[pingRequest{Source: ipHdr.SourceAddr(), Destination: ipHdr.DestinationAddr(), Identifier: icmpHdr.Ident(), Sequence: icmpHdr.Sequence()}] = true
166-
d.requestAccess.Unlock()
166+
d.registerRequest(pingRequest{Source: ipHdr.SourceAddr(), Destination: ipHdr.DestinationAddr(), Identifier: icmpHdr.Ident(), Sequence: icmpHdr.Sequence()})
167167
d.logger.TraceContext(d.ctx, "write ICMPv4 echo request from ", ipHdr.SourceAddr(), " to ", ipHdr.DestinationAddr(), " id ", icmpHdr.Ident(), " seq ", icmpHdr.Sequence())
168168
} else {
169169
ipHdr := header.IPv6(packet.Bytes())
@@ -174,14 +174,24 @@ func (d *Destination) WritePacket(packet *buf.Buffer) error {
174174
return E.New("invalid ICMPv6 header")
175175
}
176176
icmpHdr := header.ICMPv6(ipHdr.Payload())
177-
d.requestAccess.Lock()
178-
d.requests[pingRequest{Source: ipHdr.SourceAddr(), Destination: ipHdr.DestinationAddr(), Identifier: icmpHdr.Ident(), Sequence: icmpHdr.Sequence()}] = true
179-
d.requestAccess.Unlock()
177+
d.registerRequest(pingRequest{Source: ipHdr.SourceAddr(), Destination: ipHdr.DestinationAddr(), Identifier: icmpHdr.Ident(), Sequence: icmpHdr.Sequence()})
180178
d.logger.TraceContext(d.ctx, "write ICMPv6 echo request from ", ipHdr.SourceAddr(), " to ", ipHdr.DestinationAddr(), " id ", icmpHdr.Ident(), " seq ", icmpHdr.Sequence())
181179
}
182180
return d.conn.WriteIP(packet)
183181
}
184182

183+
func (d *Destination) registerRequest(request pingRequest) {
184+
d.requestAccess.Lock()
185+
defer d.requestAccess.Unlock()
186+
now := time.Now()
187+
for oldRequest, createdAt := range d.requests {
188+
if now.Sub(createdAt) > d.timeout {
189+
delete(d.requests, oldRequest)
190+
}
191+
}
192+
d.requests[request] = time.Now()
193+
}
194+
185195
func (d *Destination) Close() error {
186196
return d.conn.Close()
187197
}

0 commit comments

Comments
 (0)