code: func (t *UDPv4) readLoop(unhandled chan<- ReadPacket) {
  	defer t.wg.Done()
  	if unhandled != nil {
  		defer close(unhandled)
  	}
  
  	buf := make([]byte, maxPacketSize)
  	for {
  		nbytes, from, err := t.conn.ReadFromUDP(buf)
  		if netutil.IsTemporaryError(err) {
  			// Ignore temporary read errors.
  			t.log.Debug("Temporary UDP read error", "err", err)
  			continue
  		} else if err != nil {
  			// Shut down the loop for permament errors.
  			if err != io.EOF {
  				t.log.Debug("UDP read error", "err", err)
  			}
  			return
  		}
  		if t.handlePacket(from, buf[:nbytes]) != nil && unhandled != nil {
  			select {
  			case unhandled <- ReadPacket{buf[:nbytes], from}:
  			default:
  			}
  		}
  	}
  }
docs: // readLoop runs in its own goroutine. it handles incoming UDP packets.