@@ -67,9 +67,7 @@ func (r *icmpResponder) handle(b buffer.Buffer) (handled bool) {
6767
6868 inSize := b .Size ()
6969 if inSize <= minICMPPacketSize {
70- if settings .Debug {
71- log .V ("icmp: responder: packet too small: %d" , inSize )
72- }
70+ // too verbose: log.VV("icmp: responder: packet too small: %d", inSize)
7371 // Too small to be a valid ICMP echo request.
7472 return
7573 }
@@ -81,7 +79,9 @@ func (r *icmpResponder) handle(b buffer.Buffer) (handled bool) {
8179 // flatten is expensive, so we avoid it if possible
8280 n , err := b .ReadToWriter (& w , expectedICMPPacketSize )
8381
84- logeif (err )("icmp: responder: read to writer (sz: %d / %d); h? %t, err? %v" , n , w .Len (), h != nil , err )
82+ if settings .Debug {
83+ logeif (err )("icmp: responder: read to writer (sz: %d / %d / %d); h? %t, err? %v" , n , w .Len (), inSize , h != nil , err )
84+ }
8585 if err != nil || n == 0 || h == nil || w .Len () == 0 {
8686 return
8787 }
@@ -91,9 +91,10 @@ func (r *icmpResponder) handle(b buffer.Buffer) (handled bool) {
9191
9292 // Only echo requests are handled; other ICMP packets are dropped to avoid
9393 // feeding them back into netstack.
94- if ( parsed .IPProto != wire .ICMPv4 && parsed .IPProto != wire .ICMPv6 ) || ! parsed . IsEchoRequest () {
94+ if parsed .IPProto != wire .ICMPv4 && parsed .IPProto != wire .ICMPv6 {
9595 if settings .Debug {
96- log .V ("icmp: responder: unsupported proto: %d" , parsed .IPProto )
96+ log .VV ("icmp: responder: unsupported proto: %d / echo: %t; content: %x" ,
97+ parsed .IPProto , parsed .IsEchoRequest (), parsed .Buffer ())
9798 }
9899 wire .Pool .Put (parsed )
99100 return
@@ -104,21 +105,30 @@ func (r *icmpResponder) handle(b buffer.Buffer) (handled bool) {
104105 dst := parsed .Dst
105106 has := parsed .HasTransportData ()
106107
107- logwv (! has )("icmp: responder: echo request ipv%d; %s => %s; ok? %t" , parsed .IPVersion , src , dst , has )
108+ logwv (! has )("icmp: responder: request ipv%d; %s => %s; ok? %t" , parsed .IPVersion , src , dst , has )
108109
109110 if ! has {
110111 wire .Pool .Put (parsed )
111112 return
112113 }
113114
114- if inSize > expectedICMPPacketSize {
115+ if inSize > int64 ( w . Len ()) {
115116 // There is more data beyond the minimum ICMP echo request.
116117 // Reconstruct the full packet.
117118 w .Reset ()
118119 b .ReadToWriter (& w , inSize )
119120 parsed .Decode (w .Copy ())
120121 }
121122
123+ if ! parsed .IsEchoRequest () {
124+ if settings .Debug {
125+ log .VV ("icmp: responder: not echo request ipv%d; %s => %s; type: %d" ,
126+ parsed .IPVersion , src , dst , parsed .IPProto )
127+ }
128+ wire .Pool .Put (parsed )
129+ return
130+ }
131+
122132 // Process asynchronously to avoid blocking the dispatcher loop.
123133 core .Go ("icmp.responder" , func () {
124134 r .process (h , parsed , src , dst )
0 commit comments