From 976bd8de7d8167e548320e1dd74e0b0f494577dd Mon Sep 17 00:00:00 2001 From: Jordan Rife Date: Tue, 8 Oct 2024 09:54:40 -0700 Subject: [PATCH] Add support for IFLA_NETKIT_SCRUB and IFLA_NETKIT_PEER_SCRUB Link: https://lore.kernel.org/bpf/20241004101335.117711-1-daniel@iogearbox.net/T/#u --- link.go | 34 ++++++++++++++++++++++++---------- link_linux.go | 8 ++++++++ link_test.go | 17 +++++++++++++++++ nl/link_linux.go | 2 ++ 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/link.go b/link.go index f820cdb..e09a6cf 100644 --- a/link.go +++ b/link.go @@ -377,6 +377,13 @@ const ( NETKIT_POLICY_BLACKHOLE NetkitPolicy = 2 ) +type NetkitScrub int + +const ( + NETKIT_SCRUB_NONE NetkitScrub = 0 + NETKIT_SCRUB_DEFAULT NetkitScrub = 1 +) + func (n *Netkit) IsPrimary() bool { return n.isPrimary } @@ -391,6 +398,9 @@ type Netkit struct { Mode NetkitMode Policy NetkitPolicy PeerPolicy NetkitPolicy + Scrub NetkitScrub + PeerScrub NetkitScrub + supportsScrub bool isPrimary bool peerLinkAttrs LinkAttrs } @@ -403,6 +413,10 @@ func (n *Netkit) Type() string { return "netkit" } +func (n *Netkit) SupportsScrub() bool { + return n.supportsScrub +} + // Veth devices must specify PeerName on create type Veth struct { LinkAttrs @@ -761,19 +775,19 @@ const ( ) var bondXmitHashPolicyToString = map[BondXmitHashPolicy]string{ - BOND_XMIT_HASH_POLICY_LAYER2: "layer2", - BOND_XMIT_HASH_POLICY_LAYER3_4: "layer3+4", - BOND_XMIT_HASH_POLICY_LAYER2_3: "layer2+3", - BOND_XMIT_HASH_POLICY_ENCAP2_3: "encap2+3", - BOND_XMIT_HASH_POLICY_ENCAP3_4: "encap3+4", + BOND_XMIT_HASH_POLICY_LAYER2: "layer2", + BOND_XMIT_HASH_POLICY_LAYER3_4: "layer3+4", + BOND_XMIT_HASH_POLICY_LAYER2_3: "layer2+3", + BOND_XMIT_HASH_POLICY_ENCAP2_3: "encap2+3", + BOND_XMIT_HASH_POLICY_ENCAP3_4: "encap3+4", BOND_XMIT_HASH_POLICY_VLAN_SRCMAC: "vlan+srcmac", } var StringToBondXmitHashPolicyMap = map[string]BondXmitHashPolicy{ - "layer2": BOND_XMIT_HASH_POLICY_LAYER2, - "layer3+4": BOND_XMIT_HASH_POLICY_LAYER3_4, - "layer2+3": BOND_XMIT_HASH_POLICY_LAYER2_3, - "encap2+3": BOND_XMIT_HASH_POLICY_ENCAP2_3, - "encap3+4": BOND_XMIT_HASH_POLICY_ENCAP3_4, + "layer2": BOND_XMIT_HASH_POLICY_LAYER2, + "layer3+4": BOND_XMIT_HASH_POLICY_LAYER3_4, + "layer2+3": BOND_XMIT_HASH_POLICY_LAYER2_3, + "encap2+3": BOND_XMIT_HASH_POLICY_ENCAP2_3, + "encap3+4": BOND_XMIT_HASH_POLICY_ENCAP3_4, "vlan+srcmac": BOND_XMIT_HASH_POLICY_VLAN_SRCMAC, } diff --git a/link_linux.go b/link_linux.go index dca2616..52491c5 100644 --- a/link_linux.go +++ b/link_linux.go @@ -2676,6 +2676,8 @@ func addNetkitAttrs(nk *Netkit, linkInfo *nl.RtAttr, flag int) error { data.AddRtAttr(nl.IFLA_NETKIT_MODE, nl.Uint32Attr(uint32(nk.Mode))) data.AddRtAttr(nl.IFLA_NETKIT_POLICY, nl.Uint32Attr(uint32(nk.Policy))) data.AddRtAttr(nl.IFLA_NETKIT_PEER_POLICY, nl.Uint32Attr(uint32(nk.PeerPolicy))) + data.AddRtAttr(nl.IFLA_NETKIT_SCRUB, nl.Uint32Attr(uint32(nk.Scrub))) + data.AddRtAttr(nl.IFLA_NETKIT_PEER_SCRUB, nl.Uint32Attr(uint32(nk.PeerScrub))) if (flag & unix.NLM_F_EXCL) == 0 { // Modifying peer link attributes will not take effect @@ -2736,6 +2738,12 @@ func parseNetkitData(link Link, data []syscall.NetlinkRouteAttr) { netkit.Policy = NetkitPolicy(native.Uint32(datum.Value[0:4])) case nl.IFLA_NETKIT_PEER_POLICY: netkit.PeerPolicy = NetkitPolicy(native.Uint32(datum.Value[0:4])) + case nl.IFLA_NETKIT_SCRUB: + netkit.supportsScrub = true + netkit.Scrub = NetkitScrub(native.Uint32(datum.Value[0:4])) + case nl.IFLA_NETKIT_PEER_SCRUB: + netkit.supportsScrub = true + netkit.PeerScrub = NetkitScrub(native.Uint32(datum.Value[0:4])) } } } diff --git a/link_test.go b/link_test.go index eb7bd22..6b4a7b7 100644 --- a/link_test.go +++ b/link_test.go @@ -80,6 +80,12 @@ func testLinkAddDel(t *testing.T, link Link) { if resultPrimary.Mode != inputPrimary.Mode { t.Fatalf("Mode is %d, should be %d", int(resultPrimary.Mode), int(inputPrimary.Mode)) } + if resultPrimary.SupportsScrub() && resultPrimary.Scrub != inputPrimary.Scrub { + t.Fatalf("Scrub is %d, should be %d", int(resultPrimary.Scrub), int(inputPrimary.Scrub)) + } + if resultPrimary.SupportsScrub() && resultPrimary.PeerScrub != inputPrimary.PeerScrub { + t.Fatalf("Peer Scrub is %d, should be %d", int(resultPrimary.PeerScrub), int(inputPrimary.PeerScrub)) + } if inputPrimary.peerLinkAttrs.Name != "" { var resultPeer *Netkit @@ -102,6 +108,15 @@ func testLinkAddDel(t *testing.T, link Link) { if resultPrimary.IsPrimary() == resultPeer.IsPrimary() { t.Fatalf("Both primary and peer device has the same value in IsPrimary() %t", resultPrimary.IsPrimary()) } + if resultPrimary.SupportsScrub() != resultPeer.SupportsScrub() { + t.Fatalf("Peer SupportsScrub() should return %v", resultPrimary.SupportsScrub()) + } + if resultPrimary.PeerScrub != resultPeer.Scrub { + t.Fatalf("Scrub from peer is %d, should be %d", int(resultPeer.Scrub), int(resultPrimary.PeerScrub)) + } + if resultPrimary.Scrub != resultPeer.PeerScrub { + t.Fatalf("PeerScrub from peer is %d, should be %d", int(resultPeer.PeerScrub), int(resultPrimary.Scrub)) + } } } @@ -1051,6 +1066,8 @@ func TestLinkAddDelNetkit(t *testing.T) { Mode: NETKIT_MODE_L2, Policy: NETKIT_POLICY_FORWARD, PeerPolicy: NETKIT_POLICY_BLACKHOLE, + Scrub: NETKIT_SCRUB_DEFAULT, + PeerScrub: NETKIT_SCRUB_NONE, } peerAttr := &LinkAttrs{ Name: "bar", diff --git a/nl/link_linux.go b/nl/link_linux.go index 0b5be47..6dfa16c 100644 --- a/nl/link_linux.go +++ b/nl/link_linux.go @@ -38,6 +38,8 @@ const ( IFLA_NETKIT_POLICY IFLA_NETKIT_PEER_POLICY IFLA_NETKIT_MODE + IFLA_NETKIT_SCRUB + IFLA_NETKIT_PEER_SCRUB IFLA_NETKIT_MAX = IFLA_NETKIT_MODE )