interface.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package bridge
  2. import (
  3. "net"
  4. "github.com/vishvananda/netlink"
  5. )
  6. const (
  7. // DefaultBridgeName is the default name for the bridge interface managed
  8. // by the driver when unspecified by the caller.
  9. DefaultBridgeName = "docker0"
  10. )
  11. // Interface models the bridge network device.
  12. type bridgeInterface struct {
  13. Config *Configuration
  14. Link netlink.Link
  15. bridgeIPv4 *net.IPNet
  16. bridgeIPv6 *net.IPNet
  17. }
  18. // NewInterface creates a new bridge interface structure. It attempts to find
  19. // an already existing device identified by the Configuration BridgeName field,
  20. // or the default bridge name when unspecified), but doesn't attempt to create
  21. // on when missing
  22. func newInterface(config *Configuration) *bridgeInterface {
  23. i := &bridgeInterface{
  24. Config: config,
  25. }
  26. // Initialize the bridge name to the default if unspecified.
  27. if i.Config.BridgeName == "" {
  28. i.Config.BridgeName = DefaultBridgeName
  29. }
  30. // Attempt to find an existing bridge named with the specified name.
  31. i.Link, _ = netlink.LinkByName(i.Config.BridgeName)
  32. return i
  33. }
  34. // Exists indicates if the existing bridge interface exists on the system.
  35. func (i *bridgeInterface) exists() bool {
  36. return i.Link != nil
  37. }
  38. // Addresses returns a single IPv4 address and all IPv6 addresses for the
  39. // bridge interface.
  40. func (i *bridgeInterface) addresses() (netlink.Addr, []netlink.Addr, error) {
  41. v4addr, err := netlink.AddrList(i.Link, netlink.FAMILY_V4)
  42. if err != nil {
  43. return netlink.Addr{}, nil, err
  44. }
  45. v6addr, err := netlink.AddrList(i.Link, netlink.FAMILY_V6)
  46. if err != nil {
  47. return netlink.Addr{}, nil, err
  48. }
  49. if len(v4addr) == 0 {
  50. return netlink.Addr{}, v6addr, nil
  51. }
  52. return v4addr[0], v6addr, nil
  53. }