Skip to content

Commit cd3cb2e

Browse files
ajmmmaboch
authored andcommitted
link_linux: Add generic Headroom and Tailroom attributes.
Introduce generic IFLA_HEADROOM and IFLA_TAILROOM values that are appropriately deserialised when querying link details via RTNL. Netkit-specific variables that allow setting of driver-specific attributes have been renamed to avoid ambiguity. Signed-off-by: Alasdair McWilliam <[email protected]>
1 parent d07ce5b commit cd3cb2e

File tree

3 files changed

+56
-43
lines changed

3 files changed

+56
-43
lines changed

link.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ type LinkAttrs struct {
2929
HardwareAddr net.HardwareAddr
3030
Flags net.Flags
3131
RawFlags uint32
32+
Headroom uint16 // Query only
33+
Tailroom uint16 // Query only
3234
ParentIndex int // index of the parent link device
3335
MasterIndex int // must be the index of a bridge
3436
Namespace interface{} // nil | NsPid | NsFd
@@ -405,16 +407,16 @@ func (n *Netkit) SetPeerAttrs(Attrs *LinkAttrs) {
405407

406408
type Netkit struct {
407409
LinkAttrs
408-
Mode NetkitMode
409-
Policy NetkitPolicy
410-
PeerPolicy NetkitPolicy
411-
Scrub NetkitScrub
412-
PeerScrub NetkitScrub
413-
Headroom uint16
414-
Tailroom uint16
415-
supportsScrub bool
416-
isPrimary bool
417-
peerLinkAttrs LinkAttrs
410+
Mode NetkitMode
411+
Policy NetkitPolicy
412+
PeerPolicy NetkitPolicy
413+
Scrub NetkitScrub
414+
PeerScrub NetkitScrub
415+
DesiredHeadroom uint16 // Named due to presence of Headroom in LinkAttrs
416+
DesiredTailroom uint16 // Named due to presence of Tailroom in LinkAttrs
417+
supportsScrub bool
418+
isPrimary bool
419+
peerLinkAttrs LinkAttrs
418420
}
419421

420422
func (n *Netkit) Attrs() *LinkAttrs {

link_linux.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ const (
3535
TUNTAP_MULTI_QUEUE_DEFAULTS TuntapFlag = TUNTAP_MULTI_QUEUE | TUNTAP_NO_PI
3636
)
3737

38+
// Temporary, until merged into kernel and golang-sys picks them up. See net-next commit:
39+
// https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=b73b8146d7ff68e245525adb944a4c998d423d59
40+
const (
41+
IFLA_HEADROOM = 0x44
42+
IFLA_TAILROOM = 0x45
43+
)
44+
3845
var StringToTuntapModeMap = map[string]TuntapMode{
3946
"tun": TUNTAP_MODE_TUN,
4047
"tap": TUNTAP_MODE_TAP,
@@ -2426,6 +2433,10 @@ func LinkDeserialize(hdr *unix.NlMsghdr, m []byte) (Link, error) {
24262433
base.ParentDev = string(attr.Value[:len(attr.Value)-1])
24272434
case unix.IFLA_PARENT_DEV_BUS_NAME:
24282435
base.ParentDevBus = string(attr.Value[:len(attr.Value)-1])
2436+
case IFLA_HEADROOM:
2437+
base.Headroom = native.Uint16(attr.Value[0:2])
2438+
case IFLA_TAILROOM:
2439+
base.Tailroom = native.Uint16(attr.Value[0:2])
24292440
}
24302441
}
24312442

@@ -2881,11 +2892,11 @@ func addNetkitAttrs(nk *Netkit, linkInfo *nl.RtAttr, flag int) error {
28812892

28822893
// Any headroom or tailroom set on the primary device attributes will result in
28832894
// the kernel carrying them over into the peer device attributes for us.
2884-
if nk.Headroom > 0 {
2885-
data.AddRtAttr(nl.IFLA_NETKIT_HEADROOM, nl.Uint16Attr(nk.Headroom))
2895+
if nk.DesiredHeadroom > 0 {
2896+
data.AddRtAttr(nl.IFLA_NETKIT_HEADROOM, nl.Uint16Attr(nk.DesiredHeadroom))
28862897
}
2887-
if nk.Tailroom > 0 {
2888-
data.AddRtAttr(nl.IFLA_NETKIT_TAILROOM, nl.Uint16Attr(nk.Tailroom))
2898+
if nk.DesiredTailroom > 0 {
2899+
data.AddRtAttr(nl.IFLA_NETKIT_TAILROOM, nl.Uint16Attr(nk.DesiredTailroom))
28892900
}
28902901

28912902
if (flag & unix.NLM_F_EXCL) == 0 {
@@ -2957,9 +2968,9 @@ func parseNetkitData(link Link, data []syscall.NetlinkRouteAttr) {
29572968
netkit.supportsScrub = true
29582969
netkit.PeerScrub = NetkitScrub(native.Uint32(datum.Value[0:4]))
29592970
case nl.IFLA_NETKIT_HEADROOM:
2960-
netkit.Headroom = native.Uint16(datum.Value[0:2])
2971+
netkit.DesiredHeadroom = native.Uint16(datum.Value[0:2])
29612972
case nl.IFLA_NETKIT_TAILROOM:
2962-
netkit.Tailroom = native.Uint16(datum.Value[0:2])
2973+
netkit.DesiredTailroom = native.Uint16(datum.Value[0:2])
29632974
}
29642975
}
29652976
}

link_test.go

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,11 @@ func testLinkAddDel(t *testing.T, link Link) {
8989
if resultPrimary.SupportsScrub() && resultPrimary.PeerScrub != inputPrimary.PeerScrub {
9090
t.Fatalf("Peer Scrub is %d, should be %d", int(resultPrimary.PeerScrub), int(inputPrimary.PeerScrub))
9191
}
92-
if resultPrimary.Headroom != inputPrimary.Headroom {
93-
t.Fatalf("Headroom is %d, should be %d", resultPrimary.Headroom, inputPrimary.Headroom)
92+
if resultPrimary.DesiredHeadroom != inputPrimary.DesiredHeadroom {
93+
t.Fatalf("DesiredHeadroom is %d, should be %d", resultPrimary.DesiredHeadroom, inputPrimary.DesiredHeadroom)
9494
}
95-
if resultPrimary.Tailroom != inputPrimary.Tailroom {
96-
t.Fatalf("Tailroom is %d, should be %d", resultPrimary.Tailroom, inputPrimary.Tailroom)
95+
if resultPrimary.DesiredTailroom != inputPrimary.DesiredTailroom {
96+
t.Fatalf("DesiredTailroom is %d, should be %d", resultPrimary.DesiredTailroom, inputPrimary.DesiredTailroom)
9797
}
9898
if inputPrimary.Mode == NETKIT_MODE_L2 && inputPrimary.HardwareAddr != nil {
9999
if inputPrimary.HardwareAddr.String() != resultPrimary.HardwareAddr.String() {
@@ -131,11 +131,11 @@ func testLinkAddDel(t *testing.T, link Link) {
131131
if resultPrimary.Scrub != resultPeer.PeerScrub {
132132
t.Fatalf("PeerScrub from peer is %d, should be %d", int(resultPeer.PeerScrub), int(resultPrimary.Scrub))
133133
}
134-
if resultPrimary.Headroom != resultPeer.Headroom {
135-
t.Fatalf("Headroom from peer is %d, should be %d", resultPeer.Headroom, resultPeer.Headroom)
134+
if resultPrimary.DesiredHeadroom != resultPeer.DesiredHeadroom {
135+
t.Fatalf("DesiredHeadroom from peer is %d, should be %d", resultPeer.DesiredHeadroom, resultPrimary.DesiredHeadroom)
136136
}
137-
if resultPrimary.Tailroom != resultPeer.Tailroom {
138-
t.Fatalf("Tailroom from peer is %d, should be %d", resultPeer.Tailroom, resultPeer.Tailroom)
137+
if resultPrimary.DesiredTailroom != resultPeer.DesiredTailroom {
138+
t.Fatalf("DesiredTailroom from peer is %d, should be %d", resultPeer.DesiredTailroom, resultPrimary.DesiredTailroom)
139139
}
140140
if inputPrimary.Mode == NETKIT_MODE_L2 && inputPrimary.peerLinkAttrs.HardwareAddr != nil {
141141
if inputPrimary.peerLinkAttrs.HardwareAddr.String() != resultPeer.HardwareAddr.String() {
@@ -1285,12 +1285,12 @@ func TestLinkAddDelNetkitWithHeadroom(t *testing.T) {
12851285
Name: "foo",
12861286
HardwareAddr: net.HardwareAddr{0x00, 0x11, 0x22, 0x33, 0x44, 0x55},
12871287
},
1288-
Mode: NETKIT_MODE_L2,
1289-
Policy: NETKIT_POLICY_FORWARD,
1290-
PeerPolicy: NETKIT_POLICY_BLACKHOLE,
1291-
Scrub: NETKIT_SCRUB_DEFAULT,
1292-
PeerScrub: NETKIT_SCRUB_NONE,
1293-
Headroom: testHeadroom,
1288+
Mode: NETKIT_MODE_L2,
1289+
Policy: NETKIT_POLICY_FORWARD,
1290+
PeerPolicy: NETKIT_POLICY_BLACKHOLE,
1291+
Scrub: NETKIT_SCRUB_DEFAULT,
1292+
PeerScrub: NETKIT_SCRUB_NONE,
1293+
DesiredHeadroom: testHeadroom,
12941294
}
12951295
peerAttr := &LinkAttrs{
12961296
Name: "bar",
@@ -1310,12 +1310,12 @@ func TestLinkAddDelNetkitWithTailroom(t *testing.T) {
13101310
Name: "foo",
13111311
HardwareAddr: net.HardwareAddr{0x00, 0x11, 0x22, 0x33, 0x44, 0x55},
13121312
},
1313-
Mode: NETKIT_MODE_L2,
1314-
Policy: NETKIT_POLICY_FORWARD,
1315-
PeerPolicy: NETKIT_POLICY_BLACKHOLE,
1316-
Scrub: NETKIT_SCRUB_DEFAULT,
1317-
PeerScrub: NETKIT_SCRUB_NONE,
1318-
Tailroom: testTailroom,
1313+
Mode: NETKIT_MODE_L2,
1314+
Policy: NETKIT_POLICY_FORWARD,
1315+
PeerPolicy: NETKIT_POLICY_BLACKHOLE,
1316+
Scrub: NETKIT_SCRUB_DEFAULT,
1317+
PeerScrub: NETKIT_SCRUB_NONE,
1318+
DesiredTailroom: testTailroom,
13191319
}
13201320
peerAttr := &LinkAttrs{
13211321
Name: "bar",
@@ -1335,13 +1335,13 @@ func TestLinkAddDelNetkitWithHeadAndTailroom(t *testing.T) {
13351335
Name: "foo",
13361336
HardwareAddr: net.HardwareAddr{0x00, 0x11, 0x22, 0x33, 0x44, 0x55},
13371337
},
1338-
Mode: NETKIT_MODE_L2,
1339-
Policy: NETKIT_POLICY_FORWARD,
1340-
PeerPolicy: NETKIT_POLICY_BLACKHOLE,
1341-
Scrub: NETKIT_SCRUB_DEFAULT,
1342-
PeerScrub: NETKIT_SCRUB_NONE,
1343-
Headroom: testHeadroom,
1344-
Tailroom: testTailroom,
1338+
Mode: NETKIT_MODE_L2,
1339+
Policy: NETKIT_POLICY_FORWARD,
1340+
PeerPolicy: NETKIT_POLICY_BLACKHOLE,
1341+
Scrub: NETKIT_SCRUB_DEFAULT,
1342+
PeerScrub: NETKIT_SCRUB_NONE,
1343+
DesiredHeadroom: testHeadroom,
1344+
DesiredTailroom: testTailroom,
13451345
}
13461346
peerAttr := &LinkAttrs{
13471347
Name: "bar",

0 commit comments

Comments
 (0)