code: func (t *udp) readLoop() {
  	defer t.conn.Close()
  	// Discovery packets are defined to be no larger than 1280 bytes.
  	// Packets larger than this size will be cut at the end and treated
  	// as invalid because their hash won't match.
  	buf := make([]byte, 1280)
  	for {
  		nbytes, from, err := t.conn.ReadFromUDP(buf)
  		ingressTrafficMeter.Mark(int64(nbytes))
  		if netutil.IsTemporaryError(err) {
  			// Ignore temporary read errors.
  			log.Debug(fmt.Sprintf("Temporary read error: %v", err))
  			continue
  		} else if err != nil {
  			// Shut down the loop for permament errors.
  			log.Debug(fmt.Sprintf("Read error: %v", err))
  			return
  		}
  		t.handlePacket(from, buf[:nbytes])
  	}
  }
docs: // readLoop runs in its own goroutine. it injects ingress UDP packets
  // into the network loop.