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
}