Skip to content

Commit d375fa3

Browse files
committed
ipv6: fix multicast socket options on freebsd/386 on amd64
Change-Id: Ifdd525f27a8ed35bda240c08f379014d03fd2201 Reviewed-on: https://go-review.googlesource.com/11226 Reviewed-by: Ian Lance Taylor <iant@golang.org>
1 parent 4d302b6 commit d375fa3

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

ipv6/sockopt_ssmreq_unix.go

+30-2
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,28 @@ import (
1212
"unsafe"
1313
)
1414

15+
var freebsd32o64 bool
16+
1517
func setsockoptGroupReq(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error {
1618
var gr sysGroupReq
1719
if ifi != nil {
1820
gr.Interface = uint32(ifi.Index)
1921
}
2022
gr.setGroup(grp)
21-
return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&gr), sysSizeofGroupReq))
23+
var p unsafe.Pointer
24+
var l sysSockoptLen
25+
if freebsd32o64 {
26+
var d [sysSizeofGroupReq + 4]byte
27+
s := (*[sysSizeofGroupReq]byte)(unsafe.Pointer(&gr))
28+
copy(d[:4], s[:4])
29+
copy(d[8:], s[4:])
30+
p = unsafe.Pointer(&d[0])
31+
l = sysSizeofGroupReq + 4
32+
} else {
33+
p = unsafe.Pointer(&gr)
34+
l = sysSizeofGroupReq
35+
}
36+
return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, p, l))
2237
}
2338

2439
func setsockoptGroupSourceReq(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error {
@@ -27,5 +42,18 @@ func setsockoptGroupSourceReq(fd int, opt *sockOpt, ifi *net.Interface, grp, src
2742
gsr.Interface = uint32(ifi.Index)
2843
}
2944
gsr.setSourceGroup(grp, src)
30-
return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&gsr), sysSizeofGroupSourceReq))
45+
var p unsafe.Pointer
46+
var l sysSockoptLen
47+
if freebsd32o64 {
48+
var d [sysSizeofGroupSourceReq + 4]byte
49+
s := (*[sysSizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))
50+
copy(d[:4], s[:4])
51+
copy(d[8:], s[4:])
52+
p = unsafe.Pointer(&d[0])
53+
l = sysSizeofGroupSourceReq + 4
54+
} else {
55+
p = unsafe.Pointer(&gsr)
56+
l = sysSizeofGroupSourceReq
57+
}
58+
return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, p, l))
3159
}

ipv6/sys_freebsd.go

+14
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ package ipv6
66

77
import (
88
"net"
9+
"runtime"
10+
"strings"
911
"syscall"
1012
"unsafe"
1113

@@ -45,6 +47,18 @@ var (
4547
}
4648
)
4749

50+
func init() {
51+
if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
52+
archs, _ := syscall.Sysctl("kern.supported_archs")
53+
for _, s := range strings.Split(archs, " ") {
54+
if strings.TrimSpace(s) == "amd64" {
55+
freebsd32o64 = true
56+
break
57+
}
58+
}
59+
}
60+
}
61+
4862
func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) {
4963
sa.Len = sysSizeofSockaddrInet6
5064
sa.Family = syscall.AF_INET6

0 commit comments

Comments
 (0)