The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7290
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
From 6df3188088ce92474f6f2c370013ab7955501785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Fri, 1 May 2020 23:05:35 -0400 Subject: [PATCH] lxd/resources: Use permanent MAC when available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/resources/network.go | 2 +- lxd/resources/network_ethtool.go | 32 ++++++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/lxd/resources/network.go b/lxd/resources/network.go index 96330c823c..fb3d6a1a3c 100644 --- a/lxd/resources/network.go +++ b/lxd/resources/network.go @@ -144,7 +144,7 @@ func networkAddDeviceInfo(devicePath string, pciDB *pcidb.PCIDB, uname unix.Utsn } // Add MAC address - if sysfsExists(filepath.Join(interfacePath, "address")) { + if info.Address == "" && sysfsExists(filepath.Join(interfacePath, "address")) { address, err := ioutil.ReadFile(filepath.Join(interfacePath, "address")) if err != nil { return errors.Wrapf(err, "Failed to read \"%s\"", filepath.Join(interfacePath, "address")) diff --git a/lxd/resources/network_ethtool.go b/lxd/resources/network_ethtool.go index 1ff8ed5d44..ce3d00fb52 100644 --- a/lxd/resources/network_ethtool.go +++ b/lxd/resources/network_ethtool.go @@ -2,6 +2,7 @@ package resources import ( "bytes" + "net" "unsafe" "github.com/pkg/errors" @@ -105,6 +106,12 @@ type ethtoolDrvInfo struct { regDumpLen uint32 } +type ethtoolPermAddr struct { + cmd uint32 + size uint32 + data [32]byte +} + type ethtoolValue struct { cmd uint32 data uint32 @@ -145,17 +152,30 @@ func ethtoolAddPortInfo(info *api.ResourcesNetworkCardPort) error { } defer unix.Close(ethtoolFd) + // Prepare the request struct + req := ethtoolReq{} + copy(req.name[:], []byte(info.ID)) + + // Try to get MAC address + ethPermaddr := ethtoolPermAddr{ + cmd: 0x00000020, + size: 32, + } + req.data = uintptr(unsafe.Pointer(ðPermaddr)) + + _, _, errno := unix.Syscall(unix.SYS_IOCTL, uintptr(ethtoolFd), unix.SIOCETHTOOL, uintptr(unsafe.Pointer(&req))) + if errno == 0 { + hwaddr := net.HardwareAddr(ethPermaddr.data[0:ethPermaddr.size]) + info.Address = hwaddr.String() + } + // Link state ethGlink := ethtoolValue{ cmd: 0x0000000a, } + req.data = uintptr(unsafe.Pointer(ðGlink)) - req := ethtoolReq{ - data: uintptr(unsafe.Pointer(ðGlink)), - } - copy(req.name[:], []byte(info.ID)) - - _, _, errno := unix.Syscall(unix.SYS_IOCTL, uintptr(ethtoolFd), unix.SIOCETHTOOL, uintptr(unsafe.Pointer(&req))) + _, _, errno = unix.Syscall(unix.SYS_IOCTL, uintptr(ethtoolFd), unix.SIOCETHTOOL, uintptr(unsafe.Pointer(&req))) if errno != 0 { return errors.Wrap(unix.Errno(errno), "Failed to ETHTOOL_GLINK") }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel