1
// Copyright 2014 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
13
type sysSockoptLen int32
16
ctlOpts = [ctlMax]ctlOpt{
17
ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL},
18
ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst},
19
ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface},
22
sockOpts = [ssoMax]sockOpt{
23
ssoTOS: {sysIP_TOS, ssoTypeInt},
24
ssoTTL: {sysIP_TTL, ssoTypeInt},
25
ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeByte},
26
ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface},
27
ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeInt},
28
ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt},
29
ssoReceiveDst: {sysIP_RECVDSTADDR, ssoTypeInt},
30
ssoReceiveInterface: {sysIP_RECVIF, ssoTypeInt},
31
ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt},
32
ssoJoinGroup: {sysMCAST_JOIN_GROUP, ssoTypeGroupReq},
33
ssoLeaveGroup: {sysMCAST_LEAVE_GROUP, ssoTypeGroupReq},
34
ssoJoinSourceGroup: {sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq},
35
ssoLeaveSourceGroup: {sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq},
36
ssoBlockSourceGroup: {sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq},
37
ssoUnblockSourceGroup: {sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq},
42
freebsdVersion, _ = syscall.SysctlUint32("kern.osreldate")
43
if freebsdVersion >= 1000000 {
44
sockOpts[ssoMulticastInterface].typ = ssoTypeIPMreqn
48
func (gr *sysGroupReq) setGroup(grp net.IP) {
49
sa := (*sysSockaddrInet)(unsafe.Pointer(&gr.Group))
50
sa.Len = sysSizeofSockaddrInet
51
sa.Family = syscall.AF_INET
55
func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) {
56
sa := (*sysSockaddrInet)(unsafe.Pointer(&gsr.Group))
57
sa.Len = sysSizeofSockaddrInet
58
sa.Family = syscall.AF_INET
60
sa = (*sysSockaddrInet)(unsafe.Pointer(&gsr.Source))
61
sa.Len = sysSizeofSockaddrInet
62
sa.Family = syscall.AF_INET