blob: 2cc56bd42989b365cfc1f9075287b4e39b25347f [file] [log] [blame]
Mikio Harad2e5a122012-09-26 21:03:09 +09001// 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
5package ipv4
6
7import (
8 "errors"
9 "net"
10)
11
12var (
13 errNoSuchInterface = errors.New("no such interface")
14 errNoSuchMulticastInterface = errors.New("no such multicast interface")
15)
16
17func boolint(b bool) int {
18 if b {
19 return 1
20 }
21 return 0
22}
23
24func netAddrToIP4(a net.Addr) net.IP {
25 switch v := a.(type) {
26 case *net.UDPAddr:
27 if ip := v.IP.To4(); ip != nil {
28 return ip
29 }
30 case *net.IPAddr:
31 if ip := v.IP.To4(); ip != nil {
32 return ip
33 }
34 }
35 return nil
36}
37
38func netIP4ToInterface(ip net.IP) (*net.Interface, error) {
39 ift, err := net.Interfaces()
40 if err != nil {
41 return nil, err
42 }
43 for _, ifi := range ift {
44 ifat, err := ifi.Addrs()
45 if err != nil {
46 return nil, err
47 }
48 for _, ifa := range ifat {
49 switch v := ifa.(type) {
50 case *net.IPAddr:
51 if ip.Equal(v.IP) {
52 return &ifi, nil
53 }
54 case *net.IPNet:
55 if ip.Equal(v.IP) {
56 return &ifi, nil
57 }
58 }
59 }
60 }
61 return nil, errNoSuchInterface
62}
63
64func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) {
65 if ifi == nil {
66 return net.IPv4zero, nil
67 }
68 ifat, err := ifi.Addrs()
69 if err != nil {
70 return nil, err
71 }
72 for _, ifa := range ifat {
73 switch v := ifa.(type) {
74 case *net.IPAddr:
75 if v.IP.To4() != nil {
76 return v.IP, nil
77 }
78 case *net.IPNet:
79 if v.IP.To4() != nil {
80 return v.IP, nil
81 }
82 }
83 }
84 return nil, errNoSuchInterface
85}