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  }