From 579b48366c91a985f5944edc25d849f18afcebce Mon Sep 17 00:00:00 2001 From: Jordan Rife Date: Sat, 22 Feb 2025 17:28:57 -0800 Subject: [PATCH] netkit: Allow setting MAC address in L2 mode Signed-off-by: Jordan Rife --- link_linux.go | 7 +++++-- link_test.go | 16 ++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/link_linux.go b/link_linux.go index 14dea596..889ce643 100644 --- a/link_linux.go +++ b/link_linux.go @@ -2671,8 +2671,8 @@ func (h *Handle) LinkSetGroup(link Link, group int) error { } func addNetkitAttrs(nk *Netkit, linkInfo *nl.RtAttr, flag int) error { - if nk.peerLinkAttrs.HardwareAddr != nil || nk.HardwareAddr != nil { - return fmt.Errorf("netkit doesn't support setting Ethernet") + if nk.Mode != NETKIT_MODE_L2 && (nk.LinkAttrs.HardwareAddr != nil || nk.peerLinkAttrs.HardwareAddr != nil) { + return fmt.Errorf("netkit only allows setting Ethernet in L2 mode") } data := linkInfo.AddRtAttr(nl.IFLA_INFO_DATA, nil) @@ -2724,6 +2724,9 @@ func addNetkitAttrs(nk *Netkit, linkInfo *nl.RtAttr, flag int) error { peer.AddRtAttr(unix.IFLA_NET_NS_FD, nl.Uint32Attr(uint32(ns))) } } + if nk.peerLinkAttrs.HardwareAddr != nil { + peer.AddRtAttr(unix.IFLA_ADDRESS, []byte(nk.peerLinkAttrs.HardwareAddr)) + } return nil } diff --git a/link_test.go b/link_test.go index 6b4a7b7c..425148ad 100644 --- a/link_test.go +++ b/link_test.go @@ -86,6 +86,11 @@ func testLinkAddDel(t *testing.T, link Link) { if resultPrimary.SupportsScrub() && resultPrimary.PeerScrub != inputPrimary.PeerScrub { t.Fatalf("Peer Scrub is %d, should be %d", int(resultPrimary.PeerScrub), int(inputPrimary.PeerScrub)) } + if inputPrimary.Mode == NETKIT_MODE_L2 && inputPrimary.HardwareAddr != nil { + if inputPrimary.HardwareAddr.String() != resultPrimary.HardwareAddr.String() { + t.Fatalf("Hardware address is %s, should be %s", resultPrimary.HardwareAddr.String(), inputPrimary.HardwareAddr.String()) + } + } if inputPrimary.peerLinkAttrs.Name != "" { var resultPeer *Netkit @@ -117,6 +122,11 @@ func testLinkAddDel(t *testing.T, link Link) { if resultPrimary.Scrub != resultPeer.PeerScrub { t.Fatalf("PeerScrub from peer is %d, should be %d", int(resultPeer.PeerScrub), int(resultPrimary.Scrub)) } + if inputPrimary.Mode == NETKIT_MODE_L2 && inputPrimary.peerLinkAttrs.HardwareAddr != nil { + if inputPrimary.peerLinkAttrs.HardwareAddr.String() != resultPeer.HardwareAddr.String() { + t.Fatalf("Peer hardware address is %s, should be %s", resultPeer.HardwareAddr.String(), inputPrimary.peerLinkAttrs.HardwareAddr.String()) + } + } } } @@ -1061,7 +1071,8 @@ func TestLinkAddDelNetkit(t *testing.T) { netkit := &Netkit{ LinkAttrs: LinkAttrs{ - Name: "foo", + Name: "foo", + HardwareAddr: net.HardwareAddr{0x00, 0x11, 0x22, 0x33, 0x44, 0x55}, }, Mode: NETKIT_MODE_L2, Policy: NETKIT_POLICY_FORWARD, @@ -1070,7 +1081,8 @@ func TestLinkAddDelNetkit(t *testing.T) { PeerScrub: NETKIT_SCRUB_NONE, } peerAttr := &LinkAttrs{ - Name: "bar", + Name: "bar", + HardwareAddr: net.HardwareAddr{0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB}, } netkit.SetPeerAttrs(peerAttr) testLinkAddDel(t, netkit)