aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikio Hara <mikioh.mikioh@gmail.com>2015-06-18 12:02:03 +0900
committerMikio Hara <mikioh.mikioh@gmail.com>2015-06-19 01:28:11 +0000
commit4d302b6b446f7a5d2b73cad083959f7bf27b4181 (patch)
treefe876cc0da3847149dd32dd5ce82b9ac336419dd
parent933937213561306ee71d265fb8a2913f20a55123 (diff)
downloadnet-4d302b6b446f7a5d2b73cad083959f7bf27b4181.tar.gz
ipv4: fix multicast socket options on freebsd/386 on amd64
Change-Id: I59d627d85d6df089595037681cecb85db73955a9 Reviewed-on: https://go-review.googlesource.com/11225 Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--ipv4/sockopt_ssmreq_unix.go32
-rw-r--r--ipv4/sys_freebsd.go11
2 files changed, 41 insertions, 2 deletions
diff --git a/ipv4/sockopt_ssmreq_unix.go b/ipv4/sockopt_ssmreq_unix.go
index 08a6eaa..6f647bc 100644
--- a/ipv4/sockopt_ssmreq_unix.go
+++ b/ipv4/sockopt_ssmreq_unix.go
@@ -14,13 +14,28 @@ import (
"golang.org/x/net/internal/iana"
)
+var freebsd32o64 bool
+
func setsockoptGroupReq(fd, name int, ifi *net.Interface, grp net.IP) error {
var gr sysGroupReq
if ifi != nil {
gr.Interface = uint32(ifi.Index)
}
gr.setGroup(grp)
- return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&gr), sysSizeofGroupReq))
+ var p unsafe.Pointer
+ var l sysSockoptLen
+ if freebsd32o64 {
+ var d [sysSizeofGroupReq + 4]byte
+ s := (*[sysSizeofGroupReq]byte)(unsafe.Pointer(&gr))
+ copy(d[:4], s[:4])
+ copy(d[8:], s[4:])
+ p = unsafe.Pointer(&d[0])
+ l = sysSizeofGroupReq + 4
+ } else {
+ p = unsafe.Pointer(&gr)
+ l = sysSizeofGroupReq
+ }
+ return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, p, l))
}
func setsockoptGroupSourceReq(fd, name int, ifi *net.Interface, grp, src net.IP) error {
@@ -29,5 +44,18 @@ func setsockoptGroupSourceReq(fd, name int, ifi *net.Interface, grp, src net.IP)
gsr.Interface = uint32(ifi.Index)
}
gsr.setSourceGroup(grp, src)
- return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&gsr), sysSizeofGroupSourceReq))
+ var p unsafe.Pointer
+ var l sysSockoptLen
+ if freebsd32o64 {
+ var d [sysSizeofGroupSourceReq + 4]byte
+ s := (*[sysSizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))
+ copy(d[:4], s[:4])
+ copy(d[8:], s[4:])
+ p = unsafe.Pointer(&d[0])
+ l = sysSizeofGroupSourceReq + 4
+ } else {
+ p = unsafe.Pointer(&gsr)
+ l = sysSizeofGroupSourceReq
+ }
+ return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, p, l))
}
diff --git a/ipv4/sys_freebsd.go b/ipv4/sys_freebsd.go
index 7df658c..a60f95b 100644
--- a/ipv4/sys_freebsd.go
+++ b/ipv4/sys_freebsd.go
@@ -6,6 +6,8 @@ package ipv4
import (
"net"
+ "runtime"
+ "strings"
"syscall"
"unsafe"
)
@@ -43,6 +45,15 @@ func init() {
if freebsdVersion >= 1000000 {
sockOpts[ssoMulticastInterface].typ = ssoTypeIPMreqn
}
+ if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
+ archs, _ := syscall.Sysctl("kern.supported_archs")
+ for _, s := range strings.Split(archs, " ") {
+ if strings.TrimSpace(s) == "amd64" {
+ freebsd32o64 = true
+ break
+ }
+ }
+ }
}
func (gr *sysGroupReq) setGroup(grp net.IP) {