|
|
@@ -458,6 +458,10 @@ func encodePacket(priv *ecdsa.PrivateKey, ptype byte, req interface{}) ([]byte,
|
|
|
return packet, nil
|
|
|
}
|
|
|
|
|
|
+type tempError interface {
|
|
|
+ Temporary() bool
|
|
|
+}
|
|
|
+
|
|
|
// readLoop runs in its own goroutine. it handles incoming UDP packets.
|
|
|
func (t *udp) readLoop() {
|
|
|
defer t.conn.Close()
|
|
|
@@ -467,7 +471,13 @@ func (t *udp) readLoop() {
|
|
|
buf := make([]byte, 1280)
|
|
|
for {
|
|
|
nbytes, from, err := t.conn.ReadFromUDP(buf)
|
|
|
- if err != nil {
|
|
|
+ if tempErr, ok := err.(tempError); ok && tempErr.Temporary() {
|
|
|
+ // Ignore temporary read errors.
|
|
|
+ glog.V(logger.Debug).Infof("Temporary read error: %v", err)
|
|
|
+ continue
|
|
|
+ } else if err != nil {
|
|
|
+ // Shut down the loop for permament errors.
|
|
|
+ glog.V(logger.Debug).Infof("Read error: %v", err)
|
|
|
return
|
|
|
}
|
|
|
t.handlePacket(from, buf[:nbytes])
|