Browse Source

ipv4: report a destination address on write error

Change-Id: If48cad79ce060625db0c04ad80f6305fd8d4b338
Reviewed-on: https://go-review.googlesource.com/46232
Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Mikio Hara 8 years ago
parent
commit
a272b72a74
4 changed files with 21 additions and 3 deletions
  1. 18 0
      ipv4/helper.go
  2. 1 1
      ipv4/packet_go1_9.go
  3. 1 1
      ipv4/payload_cmsg_go1_8.go
  4. 1 1
      ipv4/payload_cmsg_go1_9.go

+ 18 - 0
ipv4/helper.go

@@ -43,3 +43,21 @@ func netAddrToIP4(a net.Addr) net.IP {
 	}
 	return nil
 }
+
+func opAddr(a net.Addr) net.Addr {
+	switch a.(type) {
+	case *net.TCPAddr:
+		if a == nil {
+			return nil
+		}
+	case *net.UDPAddr:
+		if a == nil {
+			return nil
+		}
+	case *net.IPAddr:
+		if a == nil {
+			return nil
+		}
+	}
+	return a
+}

+ 1 - 1
ipv4/packet_go1_9.go

@@ -61,7 +61,7 @@ func (c *packetHandler) writeTo(h *Header, p []byte, cm *ControlMessage) error {
 	}
 	m.Addr = dst
 	if err := c.SendMsg(&m, 0); err != nil {
-		return &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err}
+		return &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Addr: opAddr(dst), Err: err}
 	}
 	return nil
 }

+ 1 - 1
ipv4/payload_cmsg_go1_8.go

@@ -53,7 +53,7 @@ func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (n
 	case *net.IPConn:
 		n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr))
 	default:
-		return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Err: errInvalidConnType}
+		return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Addr: opAddr(dst), Err: errInvalidConnType}
 	}
 	return
 }

+ 1 - 1
ipv4/payload_cmsg_go1_9.go

@@ -61,7 +61,7 @@ func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (in
 	}
 	err := c.SendMsg(&m, 0)
 	if err != nil {
-		err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+		err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Addr: opAddr(dst), Err: err}
 	}
 	return m.N, err
 }