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 }