github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/ipv6/sys_linux.go (about) 1 // Copyright 2013 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 ipv6 6 7 import ( 8 "net" 9 "syscall" 10 "unsafe" 11 12 "golang.org/x/net/internal/iana" 13 ) 14 15 type sysSockoptLen int32 16 17 var ( 18 ctlOpts = [ctlMax]ctlOpt{ 19 ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, 20 ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, 21 ctlPacketInfo: {sysIPV6_PKTINFO, sysSizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, 22 ctlPathMTU: {sysIPV6_PATHMTU, sysSizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, 23 } 24 25 sockOpts = [ssoMax]sockOpt{ 26 ssoTrafficClass: {iana.ProtocolIPv6, sysIPV6_TCLASS, ssoTypeInt}, 27 ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, 28 ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, 29 ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, 30 ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, 31 ssoReceiveTrafficClass: {iana.ProtocolIPv6, sysIPV6_RECVTCLASS, ssoTypeInt}, 32 ssoReceiveHopLimit: {iana.ProtocolIPv6, sysIPV6_RECVHOPLIMIT, ssoTypeInt}, 33 ssoReceivePacketInfo: {iana.ProtocolIPv6, sysIPV6_RECVPKTINFO, ssoTypeInt}, 34 ssoReceivePathMTU: {iana.ProtocolIPv6, sysIPV6_RECVPATHMTU, ssoTypeInt}, 35 ssoPathMTU: {iana.ProtocolIPv6, sysIPV6_PATHMTU, ssoTypeMTUInfo}, 36 ssoChecksum: {iana.ProtocolReserved, sysIPV6_CHECKSUM, ssoTypeInt}, 37 ssoICMPFilter: {iana.ProtocolIPv6ICMP, sysICMPV6_FILTER, ssoTypeICMPFilter}, 38 ssoJoinGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_GROUP, ssoTypeGroupReq}, 39 ssoLeaveGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_GROUP, ssoTypeGroupReq}, 40 ssoJoinSourceGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq}, 41 ssoLeaveSourceGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq}, 42 ssoBlockSourceGroup: {iana.ProtocolIPv6, sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq}, 43 ssoUnblockSourceGroup: {iana.ProtocolIPv6, sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq}, 44 } 45 ) 46 47 func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { 48 sa.Family = syscall.AF_INET6 49 copy(sa.Addr[:], ip) 50 sa.Scope_id = uint32(i) 51 } 52 53 func (pi *sysInet6Pktinfo) setIfindex(i int) { 54 pi.Ifindex = int32(i) 55 } 56 57 func (mreq *sysIPv6Mreq) setIfindex(i int) { 58 mreq.Ifindex = int32(i) 59 } 60 61 func (gr *sysGroupReq) setGroup(grp net.IP) { 62 sa := (*sysSockaddrInet6)(unsafe.Pointer(&gr.Group)) 63 sa.Family = syscall.AF_INET6 64 copy(sa.Addr[:], grp) 65 } 66 67 func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { 68 sa := (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Group)) 69 sa.Family = syscall.AF_INET6 70 copy(sa.Addr[:], grp) 71 sa = (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Source)) 72 sa.Family = syscall.AF_INET6 73 copy(sa.Addr[:], src) 74 }