setup_device.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package bridge
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "net"
  6. log "github.com/Sirupsen/logrus"
  7. "github.com/docker/docker/pkg/parsers/kernel"
  8. "github.com/vishvananda/netlink"
  9. )
  10. // SetupDevice create a new bridge interface/
  11. func SetupDevice(i *Interface) error {
  12. // We only attempt to create the bridge when the requested device name is
  13. // the default one.
  14. if i.Config.BridgeName != DefaultBridgeName {
  15. return fmt.Errorf("bridge device with non default name %q must be created manually", i.Config.BridgeName)
  16. }
  17. // Set the Interface netlink.Bridge.
  18. i.Link = &netlink.Bridge{
  19. LinkAttrs: netlink.LinkAttrs{
  20. Name: i.Config.BridgeName,
  21. },
  22. }
  23. // Only set the bridge's MAC address if the kernel version is > 3.3, as it
  24. // was not supported before that.
  25. kv, err := kernel.GetKernelVersion()
  26. if err == nil && (kv.Kernel >= 3 && kv.Major >= 3) {
  27. i.Link.Attrs().HardwareAddr = generateRandomMAC()
  28. log.Debugf("Setting bridge mac address to %s", i.Link.Attrs().HardwareAddr)
  29. }
  30. // Call out to netlink to create the device.
  31. return netlink.LinkAdd(i.Link)
  32. }
  33. // SetupDeviceUp ups the given bridge interface.
  34. func SetupDeviceUp(i *Interface) error {
  35. err := netlink.LinkSetUp(i.Link)
  36. if err != nil {
  37. return err
  38. }
  39. // Attempt to update the bridge interface to refresh the flags status,
  40. // ignoring any failure to do so.
  41. if lnk, err := netlink.LinkByName(i.Config.BridgeName); err == nil {
  42. i.Link = lnk
  43. }
  44. return nil
  45. }
  46. func generateRandomMAC() net.HardwareAddr {
  47. hw := make(net.HardwareAddr, 6)
  48. for i := 0; i < 6; i++ {
  49. hw[i] = byte(rand.Intn(255))
  50. }
  51. hw[0] &^= 0x1 // clear multicast bit
  52. hw[0] |= 0x2 // set local assignment bit (IEEE802)
  53. return hw
  54. }