123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- // Copyright 2011 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package net
- import "errors"
- var (
- errInvalidInterface = errors.New("invalid network interface")
- errInvalidInterfaceIndex = errors.New("invalid network interface index")
- errInvalidInterfaceName = errors.New("invalid network interface name")
- errNoSuchInterface = errors.New("no such network interface")
- errNoSuchMulticastInterface = errors.New("no such multicast network interface")
- )
- // Interface represents a mapping between network interface name
- // and index. It also represents network interface facility
- // information.
- type Interface struct {
- Index int // positive integer that starts at one, zero is never used
- MTU int // maximum transmission unit
- Name string // e.g., "en0", "lo0", "eth0.100"
- HardwareAddr HardwareAddr // IEEE MAC-48, EUI-48 and EUI-64 form
- Flags Flags // e.g., FlagUp, FlagLoopback, FlagMulticast
- }
- type Flags uint
- const (
- FlagUp Flags = 1 << iota // interface is up
- FlagBroadcast // interface supports broadcast access capability
- FlagLoopback // interface is a loopback interface
- FlagPointToPoint // interface belongs to a point-to-point link
- FlagMulticast // interface supports multicast access capability
- )
- var flagNames = []string{
- "up",
- "broadcast",
- "loopback",
- "pointtopoint",
- "multicast",
- }
- func (f Flags) String() string {
- s := ""
- for i, name := range flagNames {
- if f&(1<<uint(i)) != 0 {
- if s != "" {
- s += "|"
- }
- s += name
- }
- }
- if s == "" {
- s = "0"
- }
- return s
- }
- // Addrs returns interface addresses for a specific interface.
- func (ifi *Interface) Addrs() ([]Addr, error) {
- if ifi == nil {
- return nil, errInvalidInterface
- }
- return interfaceAddrTable(ifi)
- }
- // MulticastAddrs returns multicast, joined group addresses for
- // a specific interface.
- func (ifi *Interface) MulticastAddrs() ([]Addr, error) {
- if ifi == nil {
- return nil, errInvalidInterface
- }
- return interfaceMulticastAddrTable(ifi)
- }
- // Interfaces returns a list of the system's network interfaces.
- func Interfaces() ([]Interface, error) {
- return interfaceTable(0)
- }
- // InterfaceAddrs returns a list of the system's network interface
- // addresses.
- func InterfaceAddrs() ([]Addr, error) {
- return interfaceAddrTable(nil)
- }
- // InterfaceByIndex returns the interface specified by index.
- func InterfaceByIndex(index int) (*Interface, error) {
- if index <= 0 {
- return nil, errInvalidInterfaceIndex
- }
- ift, err := interfaceTable(index)
- if err != nil {
- return nil, err
- }
- return interfaceByIndex(ift, index)
- }
- func interfaceByIndex(ift []Interface, index int) (*Interface, error) {
- for _, ifi := range ift {
- if index == ifi.Index {
- return &ifi, nil
- }
- }
- return nil, errNoSuchInterface
- }
- // InterfaceByName returns the interface specified by name.
- func InterfaceByName(name string) (*Interface, error) {
- if name == "" {
- return nil, errInvalidInterfaceName
- }
- ift, err := interfaceTable(0)
- if err != nil {
- return nil, err
- }
- for _, ifi := range ift {
- if name == ifi.Name {
- return &ifi, nil
- }
- }
- return nil, errNoSuchInterface
- }
|