Source file src/pkg/net/interface.go
1
2
3
4
5 package net
6
7 import "errors"
8
9 var (
10 errInvalidInterface = errors.New("net: invalid interface")
11 errInvalidInterfaceIndex = errors.New("net: invalid interface index")
12 errInvalidInterfaceName = errors.New("net: invalid interface name")
13 errNoSuchInterface = errors.New("net: no such interface")
14 errNoSuchMulticastInterface = errors.New("net: no such multicast interface")
15 )
16
17
18
19
20 type Interface struct {
21 Index int
22 MTU int
23 Name string
24 HardwareAddr HardwareAddr
25 Flags Flags
26 }
27
28 type Flags uint
29
30 const (
31 FlagUp Flags = 1 << iota
32 FlagBroadcast
33 FlagLoopback
34 FlagPointToPoint
35 FlagMulticast
36 )
37
38 var flagNames = []string{
39 "up",
40 "broadcast",
41 "loopback",
42 "pointtopoint",
43 "multicast",
44 }
45
46 func (f Flags) String() string {
47 s := ""
48 for i, name := range flagNames {
49 if f&(1<<uint(i)) != 0 {
50 if s != "" {
51 s += "|"
52 }
53 s += name
54 }
55 }
56 if s == "" {
57 s = "0"
58 }
59 return s
60 }
61
62
63 func (ifi *Interface) Addrs() ([]Addr, error) {
64 if ifi == nil {
65 return nil, errInvalidInterface
66 }
67 return interfaceAddrTable(ifi)
68 }
69
70
71
72 func (ifi *Interface) MulticastAddrs() ([]Addr, error) {
73 if ifi == nil {
74 return nil, errInvalidInterface
75 }
76 return interfaceMulticastAddrTable(ifi)
77 }
78
79
80 func Interfaces() ([]Interface, error) {
81 return interfaceTable(0)
82 }
83
84
85
86 func InterfaceAddrs() ([]Addr, error) {
87 return interfaceAddrTable(nil)
88 }
89
90
91 func InterfaceByIndex(index int) (*Interface, error) {
92 if index <= 0 {
93 return nil, errInvalidInterfaceIndex
94 }
95 ift, err := interfaceTable(index)
96 if err != nil {
97 return nil, err
98 }
99 return interfaceByIndex(ift, index)
100 }
101
102 func interfaceByIndex(ift []Interface, index int) (*Interface, error) {
103 for _, ifi := range ift {
104 if index == ifi.Index {
105 return &ifi, nil
106 }
107 }
108 return nil, errNoSuchInterface
109 }
110
111
112 func InterfaceByName(name string) (*Interface, error) {
113 if name == "" {
114 return nil, errInvalidInterfaceName
115 }
116 ift, err := interfaceTable(0)
117 if err != nil {
118 return nil, err
119 }
120 for _, ifi := range ift {
121 if name == ifi.Name {
122 return &ifi, nil
123 }
124 }
125 return nil, errNoSuchInterface
126 }
View as plain text