1 // Copyright 2012 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.
5 // +build darwin dragonfly freebsd netbsd openbsd solaris windows
13 "golang.org/x/net/internal/socket"
16 func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
17 mreq := ipMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
18 if err := setIPMreqInterface(&mreq, ifi); err != nil {
21 b := (*[sizeofIPMreq]byte)(unsafe.Pointer(&mreq))[:sizeofIPMreq]
25 func (so *sockOpt) getMulticastIf(c *socket.Conn) (*net.Interface, error) {
27 if _, err := so.Get(c, b[:]); err != nil {
30 ifi, err := netIP4ToInterface(net.IPv4(b[0], b[1], b[2], b[3]))
37 func (so *sockOpt) setMulticastIf(c *socket.Conn, ifi *net.Interface) error {
38 ip, err := netInterfaceToIP4(ifi)
44 return so.Set(c, b[:])
47 func setIPMreqInterface(mreq *ipMreq, ifi *net.Interface) error {
51 ifat, err := ifi.Addrs()
55 for _, ifa := range ifat {
56 switch ifa := ifa.(type) {
58 if ip := ifa.IP.To4(); ip != nil {
59 copy(mreq.Interface[:], ip)
63 if ip := ifa.IP.To4(); ip != nil {
64 copy(mreq.Interface[:], ip)
69 return errNoSuchInterface
72 func netIP4ToInterface(ip net.IP) (*net.Interface, error) {
73 ift, err := net.Interfaces()
77 for _, ifi := range ift {
78 ifat, err := ifi.Addrs()
82 for _, ifa := range ifat {
83 switch ifa := ifa.(type) {
95 return nil, errNoSuchInterface
98 func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) {
100 return net.IPv4zero.To4(), nil
102 ifat, err := ifi.Addrs()
106 for _, ifa := range ifat {
107 switch ifa := ifa.(type) {
109 if ip := ifa.IP.To4(); ip != nil {
113 if ip := ifa.IP.To4(); ip != nil {
118 return nil, errNoSuchInterface