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

     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.
     4  
     5  // +build darwin dragonfly freebsd netbsd openbsd windows
     6  
     7  package ipv4
     8  
     9  import "net"
    10  
    11  func setIPMreqInterface(mreq *sysIPMreq, ifi *net.Interface) error {
    12  	if ifi == nil {
    13  		return nil
    14  	}
    15  	ifat, err := ifi.Addrs()
    16  	if err != nil {
    17  		return err
    18  	}
    19  	for _, ifa := range ifat {
    20  		switch ifa := ifa.(type) {
    21  		case *net.IPAddr:
    22  			if ip := ifa.IP.To4(); ip != nil {
    23  				copy(mreq.Interface[:], ip)
    24  				return nil
    25  			}
    26  		case *net.IPNet:
    27  			if ip := ifa.IP.To4(); ip != nil {
    28  				copy(mreq.Interface[:], ip)
    29  				return nil
    30  			}
    31  		}
    32  	}
    33  	return errNoSuchInterface
    34  }
    35  
    36  func netIP4ToInterface(ip net.IP) (*net.Interface, error) {
    37  	ift, err := net.Interfaces()
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  	for _, ifi := range ift {
    42  		ifat, err := ifi.Addrs()
    43  		if err != nil {
    44  			return nil, err
    45  		}
    46  		for _, ifa := range ifat {
    47  			switch ifa := ifa.(type) {
    48  			case *net.IPAddr:
    49  				if ip.Equal(ifa.IP) {
    50  					return &ifi, nil
    51  				}
    52  			case *net.IPNet:
    53  				if ip.Equal(ifa.IP) {
    54  					return &ifi, nil
    55  				}
    56  			}
    57  		}
    58  	}
    59  	return nil, errNoSuchInterface
    60  }
    61  
    62  func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) {
    63  	if ifi == nil {
    64  		return net.IPv4zero.To4(), nil
    65  	}
    66  	ifat, err := ifi.Addrs()
    67  	if err != nil {
    68  		return nil, err
    69  	}
    70  	for _, ifa := range ifat {
    71  		switch ifa := ifa.(type) {
    72  		case *net.IPAddr:
    73  			if ip := ifa.IP.To4(); ip != nil {
    74  				return ip, nil
    75  			}
    76  		case *net.IPNet:
    77  			if ip := ifa.IP.To4(); ip != nil {
    78  				return ip, nil
    79  			}
    80  		}
    81  	}
    82  	return nil, errNoSuchInterface
    83  }