ipv6: report a destination address on write error

Change-Id: I226484f6edb0c299487b87fc0384e478969debdc
Reviewed-on: https://go-review.googlesource.com/46233
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/ipv6/helper.go b/ipv6/helper.go
index 80b0dd0..2597401 100644
--- a/ipv6/helper.go
+++ b/ipv6/helper.go
@@ -37,3 +37,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/ipv6/payload_cmsg_go1_8.go b/ipv6/payload_cmsg_go1_8.go
index 431cff4..fdc6c39 100644
--- a/ipv6/payload_cmsg_go1_8.go
+++ b/ipv6/payload_cmsg_go1_8.go
@@ -49,7 +49,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/ipv6/payload_cmsg_go1_9.go b/ipv6/payload_cmsg_go1_9.go
index 4072c58..8f6d02e 100644
--- a/ipv6/payload_cmsg_go1_9.go
+++ b/ipv6/payload_cmsg_go1_9.go
@@ -51,7 +51,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
 }