github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/ipv4/sys_darwin.go (about)

     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.
     4  
     5  package ipv4
     6  
     7  import (
     8  	"net"
     9  	"syscall"
    10  	"unsafe"
    11  )
    12  
    13  type sysSockoptLen int32
    14  
    15  var (
    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},
    20  	}
    21  
    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  		ssoStripHeader:        {sysIP_STRIPHDR, ssoTypeInt},
    33  		ssoJoinGroup:          {sysIP_ADD_MEMBERSHIP, ssoTypeIPMreq},
    34  		ssoLeaveGroup:         {sysIP_DROP_MEMBERSHIP, ssoTypeIPMreq},
    35  	}
    36  )
    37  
    38  func init() {
    39  	// Seems like kern.osreldate is veiled on latest OS X. We use
    40  	// kern.osrelease instead.
    41  	osver, err := syscall.Sysctl("kern.osrelease")
    42  	if err != nil {
    43  		return
    44  	}
    45  	var i int
    46  	for i = range osver {
    47  		if osver[i] == '.' {
    48  			break
    49  		}
    50  	}
    51  	// The IP_PKTINFO and protocol-independent multicast API were
    52  	// introduced in OS X 10.7 (Darwin 11.0.0). But it looks like
    53  	// those features require OS X 10.8 (Darwin 12.0.0) and above.
    54  	// See http://support.apple.com/kb/HT1633.
    55  	if i > 2 || i == 2 && osver[0] >= '1' && osver[1] >= '2' {
    56  		ctlOpts[ctlPacketInfo].name = sysIP_PKTINFO
    57  		ctlOpts[ctlPacketInfo].length = sysSizeofInetPktinfo
    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
    75  	}
    76  }
    77  
    78  func (pi *sysInetPktinfo) setIfindex(i int) {
    79  	pi.Ifindex = uint32(i)
    80  }
    81  
    82  func (gr *sysGroupReq) setGroup(grp net.IP) {
    83  	sa := (*sysSockaddrInet)(unsafe.Pointer(&gr.Pad_cgo_0[0]))
    84  	sa.Len = sysSizeofSockaddrInet
    85  	sa.Family = syscall.AF_INET
    86  	copy(sa.Addr[:], grp)
    87  }
    88  
    89  func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) {
    90  	sa := (*sysSockaddrInet)(unsafe.Pointer(&gsr.Pad_cgo_0[0]))
    91  	sa.Len = sysSizeofSockaddrInet
    92  	sa.Family = syscall.AF_INET
    93  	copy(sa.Addr[:], grp)
    94  	sa = (*sysSockaddrInet)(unsafe.Pointer(&gsr.Pad_cgo_1[0]))
    95  	sa.Len = sysSizeofSockaddrInet
    96  	sa.Family = syscall.AF_INET
    97  	copy(sa.Addr[:], src)
    98  }