37
39
// Seems like kern.osreldate is veiled on latest OS X. We use
38
40
// kern.osrelease instead.
39
osver, err := syscall.Sysctl("kern.osrelease")
41
s, err := syscall.Sysctl("kern.osrelease")
45
ss := strings.Split(s, ".")
49
49
// The IP_PKTINFO and protocol-independent multicast API were
50
// introduced in OS X 10.7 (Darwin 11.0.0). But it looks like
51
// those features require OS X 10.8 (Darwin 12.0.0) and above.
50
// introduced in OS X 10.7 (Darwin 11). But it looks like
51
// those features require OS X 10.8 (Darwin 12) or above.
52
52
// See http://support.apple.com/kb/HT1633.
53
if i > 2 || i == 2 && osver[0] >= '1' && osver[1] >= '2' {
54
ctlOpts[ctlPacketInfo].name = sysIP_PKTINFO
55
ctlOpts[ctlPacketInfo].length = sizeofInetPktinfo
56
ctlOpts[ctlPacketInfo].marshal = marshalPacketInfo
57
ctlOpts[ctlPacketInfo].parse = parsePacketInfo
58
sockOpts[ssoPacketInfo].name = sysIP_RECVPKTINFO
59
sockOpts[ssoPacketInfo].typ = ssoTypeInt
60
sockOpts[ssoMulticastInterface].typ = ssoTypeIPMreqn
61
sockOpts[ssoJoinGroup].name = sysMCAST_JOIN_GROUP
62
sockOpts[ssoJoinGroup].typ = ssoTypeGroupReq
63
sockOpts[ssoLeaveGroup].name = sysMCAST_LEAVE_GROUP
64
sockOpts[ssoLeaveGroup].typ = ssoTypeGroupReq
65
sockOpts[ssoJoinSourceGroup].name = sysMCAST_JOIN_SOURCE_GROUP
66
sockOpts[ssoJoinSourceGroup].typ = ssoTypeGroupSourceReq
67
sockOpts[ssoLeaveSourceGroup].name = sysMCAST_LEAVE_SOURCE_GROUP
68
sockOpts[ssoLeaveSourceGroup].typ = ssoTypeGroupSourceReq
69
sockOpts[ssoBlockSourceGroup].name = sysMCAST_BLOCK_SOURCE
70
sockOpts[ssoBlockSourceGroup].typ = ssoTypeGroupSourceReq
71
sockOpts[ssoUnblockSourceGroup].name = sysMCAST_UNBLOCK_SOURCE
72
sockOpts[ssoUnblockSourceGroup].typ = ssoTypeGroupSourceReq
53
if mjver, err := strconv.Atoi(ss[0]); err != nil || mjver < 12 {
56
ctlOpts[ctlPacketInfo].name = sysIP_PKTINFO
57
ctlOpts[ctlPacketInfo].length = sizeofInetPktinfo
58
ctlOpts[ctlPacketInfo].marshal = marshalPacketInfo
59
ctlOpts[ctlPacketInfo].parse = parsePacketInfo
60
sockOpts[ssoPacketInfo].name = sysIP_RECVPKTINFO
61
sockOpts[ssoPacketInfo].typ = ssoTypeInt
62
sockOpts[ssoMulticastInterface].typ = ssoTypeIPMreqn
63
sockOpts[ssoJoinGroup].name = sysMCAST_JOIN_GROUP
64
sockOpts[ssoJoinGroup].typ = ssoTypeGroupReq
65
sockOpts[ssoLeaveGroup].name = sysMCAST_LEAVE_GROUP
66
sockOpts[ssoLeaveGroup].typ = ssoTypeGroupReq
67
sockOpts[ssoJoinSourceGroup].name = sysMCAST_JOIN_SOURCE_GROUP
68
sockOpts[ssoJoinSourceGroup].typ = ssoTypeGroupSourceReq
69
sockOpts[ssoLeaveSourceGroup].name = sysMCAST_LEAVE_SOURCE_GROUP
70
sockOpts[ssoLeaveSourceGroup].typ = ssoTypeGroupSourceReq
71
sockOpts[ssoBlockSourceGroup].name = sysMCAST_BLOCK_SOURCE
72
sockOpts[ssoBlockSourceGroup].typ = ssoTypeGroupSourceReq
73
sockOpts[ssoUnblockSourceGroup].name = sysMCAST_UNBLOCK_SOURCE
74
sockOpts[ssoUnblockSourceGroup].typ = ssoTypeGroupSourceReq
76
77
func (pi *inetPktinfo) setIfindex(i int) {