]> www.infradead.org Git - users/hch/misc.git/commitdiff
rtnetlink: add needed_{head,tail}room attributes
authorAlasdair McWilliam <alasdair@mcwilliam.dev>
Wed, 17 Sep 2025 09:55:42 +0000 (10:55 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sat, 20 Sep 2025 00:21:55 +0000 (17:21 -0700)
Various network interface types make use of needed_{head,tail}room values
to efficiently reserve buffer space for additional encapsulation headers,
such as VXLAN, Geneve, IPSec, etc. However, it is not currently possible
to query these values in a generic way.

Introduce ability to query the needed_{head,tail}room values of a network
device via rtnetlink, such that applications that may wish to use these
values can do so.

For example, Cilium agent iterates over present devices based on user config
(direct routing, vxlan, geneve, wireguard etc.) and in future will configure
netkit in order to expose the needed_{head,tail}room into K8s pods. See
b9ed315d3c4c ("netkit: Allow for configuring needed_{head,tail}room").

Suggested-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Alasdair McWilliam <alasdair@mcwilliam.dev>
Reviewed-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://patch.msgid.link/20250917095543.14039-1-alasdair@mcwilliam.dev
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Documentation/netlink/specs/rt-link.yaml
include/uapi/linux/if_link.h
net/core/rtnetlink.c

index 6ab31f86854db3894ba7c05b398ad6f087facd19..2a23e9699c0b60ad5f9ea7cfb47fc8049c9b7011 100644 (file)
@@ -1057,6 +1057,12 @@ attribute-sets:
       -
         name: netns-immutable
         type: u8
+      -
+        name: headroom
+        type: u16
+      -
+        name: tailroom
+        type: u16
   -
     name: prop-list-link-attrs
     subset-of: link-attrs
index 45f56c9f95d90f8a8921b41f2c9b6355bd5058e8..3b491d96e52eb05b9f21965557b2d98583775cf7 100644 (file)
@@ -379,6 +379,8 @@ enum {
        IFLA_DPLL_PIN,
        IFLA_MAX_PACING_OFFLOAD_HORIZON,
        IFLA_NETNS_IMMUTABLE,
+       IFLA_HEADROOM,
+       IFLA_TAILROOM,
        __IFLA_MAX
 };
 
index 094b085cff20685f8a417ed276f3877f2a36a4af..d9e68ca849265bdddafa1c9309bc3be6b3312448 100644 (file)
@@ -1326,6 +1326,8 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,
               + rtnl_devlink_port_size(dev)
               + rtnl_dpll_pin_size(dev)
               + nla_total_size(8)  /* IFLA_MAX_PACING_OFFLOAD_HORIZON */
+              + nla_total_size(2)  /* IFLA_HEADROOM */
+              + nla_total_size(2)  /* IFLA_TAILROOM */
               + 0;
 }
 
@@ -2091,7 +2093,11 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
            nla_put_u32(skb, IFLA_CARRIER_UP_COUNT,
                        atomic_read(&dev->carrier_up_count)) ||
            nla_put_u32(skb, IFLA_CARRIER_DOWN_COUNT,
-                       atomic_read(&dev->carrier_down_count)))
+                       atomic_read(&dev->carrier_down_count)) ||
+           nla_put_u16(skb, IFLA_HEADROOM,
+                       READ_ONCE(dev->needed_headroom)) ||
+           nla_put_u16(skb, IFLA_TAILROOM,
+                       READ_ONCE(dev->needed_tailroom)))
                goto nla_put_failure;
 
        if (rtnl_fill_proto_down(skb, dev))
@@ -2243,6 +2249,8 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = {
        [IFLA_GSO_IPV4_MAX_SIZE]        = NLA_POLICY_MIN(NLA_U32, MAX_TCP_HEADER + 1),
        [IFLA_GRO_IPV4_MAX_SIZE]        = { .type = NLA_U32 },
        [IFLA_NETNS_IMMUTABLE]  = { .type = NLA_REJECT },
+       [IFLA_HEADROOM]         = { .type = NLA_REJECT },
+       [IFLA_TAILROOM]         = { .type = NLA_REJECT },
 };
 
 static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = {