| 287 | } |
| 288 | |
| 289 | func (s *Sender) monitorIcmp(conn net.PacketConn) { |
| 290 | buf := make([]byte, 128) |
| 291 | for { |
| 292 | select { |
| 293 | case <-s.icmpDone: |
| 294 | return |
| 295 | default: |
| 296 | if err := conn.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { |
| 297 | log.Debugf("icmp set deadline error: %v", err) |
| 298 | return |
| 299 | } |
| 300 | n, rAddr, err := conn.ReadFrom(buf) |
| 301 | if err != nil { |
| 302 | var netErr net.Error |
| 303 | if errors.As(err, &netErr) && netErr.Timeout() { |
| 304 | continue |
| 305 | } |
| 306 | log.Debugf("icmp listener error: %v", err) |
| 307 | continue |
| 308 | } |
| 309 | s.handleIcmpPacket(buf, n, rAddr) |
| 310 | } |
| 311 | } |
| 312 | } |
| 313 | |
| 314 | // handleIcmpPacket is a handler which gets called every time icmp packets arrive |
| 315 | func (s *Sender) handleIcmpPacket(rawPacket []byte, l int, rAddr net.Addr) { |