github.com/cloudfoundry-attic/garden-linux@v0.333.2-candidate/network/devices/link.go (about)

     1  package devices
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"net"
     7  	"path/filepath"
     8  	"strconv"
     9  	"strings"
    10  
    11  	"github.com/cloudfoundry-incubator/garden"
    12  	"github.com/docker/libcontainer/netlink"
    13  )
    14  
    15  type Link struct {
    16  	Name string
    17  }
    18  
    19  func (Link) AddIP(intf *net.Interface, ip net.IP, subnet *net.IPNet) error {
    20  	netlinkMu.Lock()
    21  	defer netlinkMu.Unlock()
    22  
    23  	return errF(netlink.NetworkLinkAddIp(intf, ip, subnet))
    24  }
    25  
    26  func (Link) AddDefaultGW(intf *net.Interface, ip net.IP) error {
    27  	netlinkMu.Lock()
    28  	defer netlinkMu.Unlock()
    29  
    30  	return errF(netlink.AddDefaultGw(ip.String(), intf.Name))
    31  }
    32  
    33  func (Link) SetUp(intf *net.Interface) error {
    34  	netlinkMu.Lock()
    35  	defer netlinkMu.Unlock()
    36  
    37  	return errF(netlink.NetworkLinkUp(intf))
    38  }
    39  
    40  func (Link) SetMTU(intf *net.Interface, mtu int) error {
    41  	netlinkMu.Lock()
    42  	defer netlinkMu.Unlock()
    43  
    44  	return errF(netlink.NetworkSetMTU(intf, mtu))
    45  }
    46  
    47  func (Link) SetNs(intf *net.Interface, ns int) error {
    48  	netlinkMu.Lock()
    49  	defer netlinkMu.Unlock()
    50  
    51  	return errF(netlink.NetworkSetNsPid(intf, ns))
    52  }
    53  
    54  func (Link) InterfaceByName(name string) (*net.Interface, bool, error) {
    55  	netlinkMu.Lock()
    56  	defer netlinkMu.Unlock()
    57  
    58  	intfs, err := net.Interfaces()
    59  	if err != nil {
    60  		return nil, false, errF(err)
    61  	}
    62  
    63  	for _, intf := range intfs {
    64  		if intf.Name == name {
    65  			return &intf, true, nil
    66  		}
    67  	}
    68  
    69  	return nil, false, nil
    70  }
    71  
    72  func (Link) List() (names []string, err error) {
    73  	netlinkMu.Lock()
    74  	defer netlinkMu.Unlock()
    75  
    76  	intfs, err := net.Interfaces()
    77  	if err != nil {
    78  		return nil, err
    79  	}
    80  
    81  	for _, i := range intfs {
    82  		names = append(names, i.Name)
    83  	}
    84  
    85  	return names, nil
    86  }
    87  
    88  func (l Link) Statistics() (stats garden.ContainerNetworkStat, err error) {
    89  	var RxBytes, TxBytes uint64
    90  
    91  	if RxBytes, err = intfStat(l.Name, "rx_bytes"); err != nil {
    92  		return stats, err
    93  	}
    94  
    95  	if TxBytes, err = intfStat(l.Name, "tx_bytes"); err != nil {
    96  		return stats, err
    97  	}
    98  
    99  	return garden.ContainerNetworkStat{
   100  		RxBytes: RxBytes,
   101  		TxBytes: TxBytes,
   102  	}, nil
   103  }
   104  
   105  func intfStat(intf, statFile string) (stat uint64, err error) {
   106  	data, err := ioutil.ReadFile(filepath.Join("/sys/class/net", intf, "statistics", statFile))
   107  	if err != nil {
   108  		return 0, err
   109  	}
   110  
   111  	stat, err = strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64)
   112  	if err != nil {
   113  		return 0, err
   114  	}
   115  
   116  	return stat, nil
   117  }
   118  
   119  func errF(err error) error {
   120  	if err == nil {
   121  		return err
   122  	}
   123  
   124  	return fmt.Errorf("devices: %v", err)
   125  }