github.com/cloudfoundry-attic/garden-linux@v0.333.2-candidate/network/devices/bridge.go (about) 1 package devices 2 3 import ( 4 "fmt" 5 "net" 6 "sync" 7 8 "github.com/docker/libcontainer/netlink" 9 ) 10 11 // netlink is not thread-safe, all calls to netlink should be guarded by this mutex 12 var netlinkMu *sync.Mutex = new(sync.Mutex) 13 14 type Bridge struct{} 15 16 // Create creates a bridge device and returns the interface. 17 // If the device already exists, returns the existing interface. 18 func (Bridge) Create(name string, ip net.IP, subnet *net.IPNet) (intf *net.Interface, err error) { 19 netlinkMu.Lock() 20 defer netlinkMu.Unlock() 21 22 if err := netlink.NetworkLinkAdd(name, "bridge"); err != nil && err.Error() != "file exists" { 23 return nil, fmt.Errorf("devices: create bridge: %v", err) 24 } 25 26 if intf, err = net.InterfaceByName(name); err != nil { 27 return nil, fmt.Errorf("devices: look up created bridge interface: %v", err) 28 } 29 30 if err = netlink.NetworkLinkAddIp(intf, ip, subnet); err != nil && err.Error() != "file exists" { 31 return nil, fmt.Errorf("devices: add IP to bridge: %v", err) 32 } 33 return intf, nil 34 } 35 36 func (Bridge) Add(bridge, slave *net.Interface) error { 37 netlinkMu.Lock() 38 defer netlinkMu.Unlock() 39 40 return netlink.AddToBridge(slave, bridge) 41 } 42 43 func (Bridge) Destroy(bridge string) error { 44 netlinkMu.Lock() 45 defer netlinkMu.Unlock() 46 47 intfs, err := net.Interfaces() 48 if err != nil { 49 return err 50 } 51 52 for _, i := range intfs { 53 if i.Name == bridge { 54 return netlink.DeleteBridge(bridge) 55 } 56 } 57 58 return nil 59 }