Commit 4f91da26 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by Daniel Borkmann

xdp: add per mode attributes for attached programs

In preparation for support of simultaneous driver and hardware XDP
support add per-mode attributes.  The catch-all IFLA_XDP_PROG_ID
will still be reported, but user space can now also access the
program ID in a new IFLA_XDP_<mode>_PROG_ID attribute.
Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarQuentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 9c48b1d1
...@@ -928,6 +928,9 @@ enum { ...@@ -928,6 +928,9 @@ enum {
IFLA_XDP_ATTACHED, IFLA_XDP_ATTACHED,
IFLA_XDP_FLAGS, IFLA_XDP_FLAGS,
IFLA_XDP_PROG_ID, IFLA_XDP_PROG_ID,
IFLA_XDP_DRV_PROG_ID,
IFLA_XDP_SKB_PROG_ID,
IFLA_XDP_HW_PROG_ID,
__IFLA_XDP_MAX, __IFLA_XDP_MAX,
}; };
......
...@@ -964,7 +964,8 @@ static size_t rtnl_xdp_size(void) ...@@ -964,7 +964,8 @@ static size_t rtnl_xdp_size(void)
{ {
size_t xdp_size = nla_total_size(0) + /* nest IFLA_XDP */ size_t xdp_size = nla_total_size(0) + /* nest IFLA_XDP */
nla_total_size(1) + /* XDP_ATTACHED */ nla_total_size(1) + /* XDP_ATTACHED */
nla_total_size(4); /* XDP_PROG_ID */ nla_total_size(4) + /* XDP_PROG_ID */
nla_total_size(4); /* XDP_<mode>_PROG_ID */
return xdp_size; return xdp_size;
} }
...@@ -1378,16 +1379,17 @@ static u8 rtnl_xdp_attached_mode(struct net_device *dev, u32 *prog_id) ...@@ -1378,16 +1379,17 @@ static u8 rtnl_xdp_attached_mode(struct net_device *dev, u32 *prog_id)
static int rtnl_xdp_fill(struct sk_buff *skb, struct net_device *dev) static int rtnl_xdp_fill(struct sk_buff *skb, struct net_device *dev)
{ {
u32 prog_attr, prog_id;
struct nlattr *xdp; struct nlattr *xdp;
u32 prog_id;
int err; int err;
u8 mode;
xdp = nla_nest_start(skb, IFLA_XDP); xdp = nla_nest_start(skb, IFLA_XDP);
if (!xdp) if (!xdp)
return -EMSGSIZE; return -EMSGSIZE;
err = nla_put_u8(skb, IFLA_XDP_ATTACHED, mode = rtnl_xdp_attached_mode(dev, &prog_id);
rtnl_xdp_attached_mode(dev, &prog_id)); err = nla_put_u8(skb, IFLA_XDP_ATTACHED, mode);
if (err) if (err)
goto err_cancel; goto err_cancel;
...@@ -1395,6 +1397,26 @@ static int rtnl_xdp_fill(struct sk_buff *skb, struct net_device *dev) ...@@ -1395,6 +1397,26 @@ static int rtnl_xdp_fill(struct sk_buff *skb, struct net_device *dev)
err = nla_put_u32(skb, IFLA_XDP_PROG_ID, prog_id); err = nla_put_u32(skb, IFLA_XDP_PROG_ID, prog_id);
if (err) if (err)
goto err_cancel; goto err_cancel;
switch (mode) {
case XDP_ATTACHED_DRV:
prog_attr = IFLA_XDP_DRV_PROG_ID;
break;
case XDP_ATTACHED_SKB:
prog_attr = IFLA_XDP_SKB_PROG_ID;
break;
case XDP_ATTACHED_HW:
prog_attr = IFLA_XDP_HW_PROG_ID;
break;
case XDP_ATTACHED_NONE:
default:
err = -EINVAL;
goto err_cancel;
}
err = nla_put_u32(skb, prog_attr, prog_id);
if (err)
goto err_cancel;
} }
nla_nest_end(skb, xdp); nla_nest_end(skb, xdp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment