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 }