@@ -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
3333type 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+
185195func (d * Destination ) Close () error {
186196 return d .conn .Close ()
187197}
0 commit comments