@@ -101,20 +101,22 @@ func (d *Destination) loopRead() {
101101 continue
102102 }
103103 icmpHdr := header .ICMPv4 (ipHdr .Payload ())
104- if icmpHdr .Type () != header .ICMPv4EchoReply {
105- continue
106- }
107- var requestExists bool
108- request := pingRequest {Source : ipHdr .DestinationAddr (), Destination : ipHdr .SourceAddr (), Identifier : icmpHdr .Ident (), Sequence : icmpHdr .Sequence ()}
109- d .requestAccess .Lock ()
110- _ , loaded := d .requests [request ]
111- if loaded {
112- requestExists = true
113- delete (d .requests , request )
114- }
115- d .requestAccess .Unlock ()
116- if ! requestExists {
117- continue
104+ if d .needFilter () {
105+ if icmpHdr .Type () != header .ICMPv4EchoReply {
106+ continue
107+ }
108+ var requestExists bool
109+ request := pingRequest {Source : ipHdr .DestinationAddr (), Destination : ipHdr .SourceAddr (), Identifier : icmpHdr .Ident (), Sequence : icmpHdr .Sequence ()}
110+ d .requestAccess .Lock ()
111+ _ , loaded := d .requests [request ]
112+ if loaded {
113+ requestExists = true
114+ delete (d .requests , request )
115+ }
116+ d .requestAccess .Unlock ()
117+ if ! requestExists {
118+ continue
119+ }
118120 }
119121 d .logger .TraceContext (d .ctx , "read ICMPv4 echo reply from " , ipHdr .SourceAddr (), " to " , ipHdr .DestinationAddr (), " id " , icmpHdr .Ident (), " seq " , icmpHdr .Sequence ())
120122 } else {
@@ -128,20 +130,22 @@ func (d *Destination) loopRead() {
128130 continue
129131 }
130132 icmpHdr := header .ICMPv6 (ipHdr .Payload ())
131- if icmpHdr .Type () != header .ICMPv6EchoReply {
132- continue
133- }
134- var requestExists bool
135- request := pingRequest {Source : ipHdr .DestinationAddr (), Destination : ipHdr .SourceAddr (), Identifier : icmpHdr .Ident (), Sequence : icmpHdr .Sequence ()}
136- d .requestAccess .Lock ()
137- _ , loaded := d .requests [request ]
138- if loaded {
139- requestExists = true
140- delete (d .requests , request )
141- }
142- d .requestAccess .Unlock ()
143- if ! requestExists {
144- continue
133+ if d .needFilter () {
134+ if icmpHdr .Type () != header .ICMPv6EchoReply {
135+ continue
136+ }
137+ var requestExists bool
138+ request := pingRequest {Source : ipHdr .DestinationAddr (), Destination : ipHdr .SourceAddr (), Identifier : icmpHdr .Ident (), Sequence : icmpHdr .Sequence ()}
139+ d .requestAccess .Lock ()
140+ _ , loaded := d .requests [request ]
141+ if loaded {
142+ requestExists = true
143+ delete (d .requests , request )
144+ }
145+ d .requestAccess .Unlock ()
146+ if ! requestExists {
147+ continue
148+ }
145149 }
146150 d .logger .TraceContext (d .ctx , "read ICMPv6 echo reply from " , ipHdr .SourceAddr (), " to " , ipHdr .DestinationAddr (), " id " , icmpHdr .Ident (), " seq " , icmpHdr .Sequence ())
147151 }
@@ -163,7 +167,9 @@ func (d *Destination) WritePacket(packet *buf.Buffer) error {
163167 return E .New ("invalid ICMPv4 header" )
164168 }
165169 icmpHdr := header .ICMPv4 (ipHdr .Payload ())
166- d .registerRequest (pingRequest {Source : ipHdr .SourceAddr (), Destination : ipHdr .DestinationAddr (), Identifier : icmpHdr .Ident (), Sequence : icmpHdr .Sequence ()})
170+ if d .needFilter () {
171+ d .registerRequest (pingRequest {Source : ipHdr .SourceAddr (), Destination : ipHdr .DestinationAddr (), Identifier : icmpHdr .Ident (), Sequence : icmpHdr .Sequence ()})
172+ }
167173 d .logger .TraceContext (d .ctx , "write ICMPv4 echo request from " , ipHdr .SourceAddr (), " to " , ipHdr .DestinationAddr (), " id " , icmpHdr .Ident (), " seq " , icmpHdr .Sequence ())
168174 } else {
169175 ipHdr := header .IPv6 (packet .Bytes ())
@@ -174,12 +180,18 @@ func (d *Destination) WritePacket(packet *buf.Buffer) error {
174180 return E .New ("invalid ICMPv6 header" )
175181 }
176182 icmpHdr := header .ICMPv6 (ipHdr .Payload ())
177- d .registerRequest (pingRequest {Source : ipHdr .SourceAddr (), Destination : ipHdr .DestinationAddr (), Identifier : icmpHdr .Ident (), Sequence : icmpHdr .Sequence ()})
183+ if d .needFilter () {
184+ d .registerRequest (pingRequest {Source : ipHdr .SourceAddr (), Destination : ipHdr .DestinationAddr (), Identifier : icmpHdr .Ident (), Sequence : icmpHdr .Sequence ()})
185+ }
178186 d .logger .TraceContext (d .ctx , "write ICMPv6 echo request from " , ipHdr .SourceAddr (), " to " , ipHdr .DestinationAddr (), " id " , icmpHdr .Ident (), " seq " , icmpHdr .Sequence ())
179187 }
180188 return d .conn .WriteIP (packet )
181189}
182190
191+ func (d * Destination ) needFilter () bool {
192+ return runtime .GOOS != "windows" && ! d .conn .isLinuxUnprivileged ()
193+ }
194+
183195func (d * Destination ) registerRequest (request pingRequest ) {
184196 const requestsLimit = 1024
185197 d .requestAccess .Lock ()
0 commit comments