summaryrefslogtreecommitdiff
path: root/net/core
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2018-07-12 06:36:38 +0300
committerDaniel Borkmann <daniel@iogearbox.net>2018-07-13 21:26:35 +0300
commit4f91da26c81145f255cb153152ffed70014b1c41 (patch)
treebaad6f18b9cbf7ecaf19831d3681dcaa7236fbb8 /net/core
parent9c48b1d116cd0ab44f1a4a55be84b2b3d4a11b9b (diff)
downloadlinux-4f91da26c81145f255cb153152ffed70014b1c41.tar.xz
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: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/rtnetlink.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 5ef61222fdef..b40242459907 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -964,7 +964,8 @@ static size_t rtnl_xdp_size(void)
{
size_t xdp_size = nla_total_size(0) + /* nest IFLA_XDP */
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;
}
@@ -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)
{
+ u32 prog_attr, prog_id;
struct nlattr *xdp;
- u32 prog_id;
int err;
+ u8 mode;
xdp = nla_nest_start(skb, IFLA_XDP);
if (!xdp)
return -EMSGSIZE;
- err = nla_put_u8(skb, IFLA_XDP_ATTACHED,
- rtnl_xdp_attached_mode(dev, &prog_id));
+ mode = rtnl_xdp_attached_mode(dev, &prog_id);
+ err = nla_put_u8(skb, IFLA_XDP_ATTACHED, mode);
if (err)
goto err_cancel;
@@ -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);
if (err)
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);