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>
diff --git a/ipv4/helper.go b/ipv4/helper.go
index 5f747a4..a5052e3 100644
--- a/ipv4/helper.go
+++ b/ipv4/helper.go
@@ -43,3 +43,21 @@
 	}
 	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
+}
diff --git a/ipv4/packet_go1_9.go b/ipv4/packet_go1_9.go
index 285fdb0..082c36d 100644
--- a/ipv4/packet_go1_9.go
+++ b/ipv4/packet_go1_9.go
@@ -61,7 +61,7 @@
 	}
 	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
 }
diff --git a/ipv4/payload_cmsg_go1_8.go b/ipv4/payload_cmsg_go1_8.go
index 0a9c33a..d26ccd9 100644
--- a/ipv4/payload_cmsg_go1_8.go
+++ b/ipv4/payload_cmsg_go1_8.go
@@ -53,7 +53,7 @@
 	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
 }
diff --git a/ipv4/payload_cmsg_go1_9.go b/ipv4/payload_cmsg_go1_9.go
index e697f35..2f19311 100644
--- a/ipv4/payload_cmsg_go1_9.go
+++ b/ipv4/payload_cmsg_go1_9.go
@@ -61,7 +61,7 @@
 	}
 	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
 }