1// Copyright 2011 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 net 6 7import "errors" 8 9var ( 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// Interface represents a mapping between network interface name 18// and index. It also represents network interface facility 19// information. 20type Interface struct { 21 Index int // positive integer that starts at one, zero is never used 22 MTU int // maximum transmission unit 23 Name string // e.g., "en0", "lo0", "eth0.100" 24 HardwareAddr HardwareAddr // IEEE MAC-48, EUI-48 and EUI-64 form 25 Flags Flags // e.g., FlagUp, FlagLoopback, FlagMulticast 26} 27 28type Flags uint 29 30const ( 31 FlagUp Flags = 1 << iota // interface is up 32 FlagBroadcast // interface supports broadcast access capability 33 FlagLoopback // interface is a loopback interface 34 FlagPointToPoint // interface belongs to a point-to-point link 35 FlagMulticast // interface supports multicast access capability 36) 37 38var flagNames = []string{ 39 "up", 40 "broadcast", 41 "loopback", 42 "pointtopoint", 43 "multicast", 44} 45 46func (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// Addrs returns interface addresses for a specific interface. 63func (ifi *Interface) Addrs() ([]Addr, error) { 64 if ifi == nil { 65 return nil, errInvalidInterface 66 } 67 return interfaceAddrTable(ifi) 68} 69 70// MulticastAddrs returns multicast, joined group addresses for 71// a specific interface. 72func (ifi *Interface) MulticastAddrs() ([]Addr, error) { 73 if ifi == nil { 74 return nil, errInvalidInterface 75 } 76 return interfaceMulticastAddrTable(ifi) 77} 78 79// Interfaces returns a list of the system's network interfaces. 80func Interfaces() ([]Interface, error) { 81 return interfaceTable(0) 82} 83 84// InterfaceAddrs returns a list of the system's network interface 85// addresses. 86func InterfaceAddrs() ([]Addr, error) { 87 return interfaceAddrTable(nil) 88} 89 90// InterfaceByIndex returns the interface specified by index. 91func 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 102func 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// InterfaceByName returns the interface specified by name. 112func 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} 127