github.com/cilium/cilium@v1.16.2/pkg/mac/mac_linux.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package mac
     5  
     6  import (
     7  	"errors"
     8  	"net"
     9  
    10  	"github.com/vishvananda/netlink"
    11  )
    12  
    13  // HasMacAddr returns true if the given network interface has L2 addr.
    14  func HasMacAddr(iface string) bool {
    15  	link, err := netlink.LinkByName(iface)
    16  	if err != nil {
    17  		return false
    18  	}
    19  	return LinkHasMacAddr(link)
    20  }
    21  
    22  // LinkHasMacAddr returns true if the given network interface has L2 addr.
    23  func LinkHasMacAddr(link netlink.Link) bool {
    24  	return len(link.Attrs().HardwareAddr) != 0
    25  }
    26  
    27  // ReplaceMacAddressWithLinkName replaces the MAC address of the given link
    28  func ReplaceMacAddressWithLinkName(ifName, macAddress string) error {
    29  	l, err := netlink.LinkByName(ifName)
    30  	if err != nil {
    31  		if errors.As(err, &netlink.LinkNotFoundError{}) {
    32  			return nil
    33  		}
    34  		return err
    35  	}
    36  	hw, err := net.ParseMAC(macAddress)
    37  	if err != nil {
    38  		return err
    39  	}
    40  	return netlink.LinkSetHardwareAddr(l, hw)
    41  }