diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index df7637733e3c..a91572aa73d5 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -6934,8 +6934,7 @@ int dev_change_proto_down(struct net_device *dev, bool proto_down) | |||
6934 | } | 6934 | } |
6935 | EXPORT_SYMBOL(dev_change_proto_down); | 6935 | EXPORT_SYMBOL(dev_change_proto_down); |
6936 | 6936 | ||
6937 | bool __dev_xdp_attached(struct net_device *dev, xdp_op_t xdp_op, | 6937 | u8 __dev_xdp_attached(struct net_device *dev, xdp_op_t xdp_op, u32 *prog_id) |
6938 | u32 *prog_id) | ||
6939 | { | 6938 | { |
6940 | struct netdev_xdp xdp; | 6939 | struct netdev_xdp xdp; |
6941 | 6940 | ||
@@ -6951,14 +6950,18 @@ bool __dev_xdp_attached(struct net_device *dev, xdp_op_t xdp_op, | |||
6951 | } | 6950 | } |
6952 | 6951 | ||
6953 | static int dev_xdp_install(struct net_device *dev, xdp_op_t xdp_op, | 6952 | static int dev_xdp_install(struct net_device *dev, xdp_op_t xdp_op, |
6954 | struct netlink_ext_ack *extack, | 6953 | struct netlink_ext_ack *extack, u32 flags, |
6955 | struct bpf_prog *prog) | 6954 | struct bpf_prog *prog) |
6956 | { | 6955 | { |
6957 | struct netdev_xdp xdp; | 6956 | struct netdev_xdp xdp; |
6958 | 6957 | ||
6959 | memset(&xdp, 0, sizeof(xdp)); | 6958 | memset(&xdp, 0, sizeof(xdp)); |
6960 | xdp.command = XDP_SETUP_PROG; | 6959 | if (flags & XDP_FLAGS_HW_MODE) |
6960 | xdp.command = XDP_SETUP_PROG_HW; | ||
6961 | else | ||
6962 | xdp.command = XDP_SETUP_PROG; | ||
6961 | xdp.extack = extack; | 6963 | xdp.extack = extack; |
6964 | xdp.flags = flags; | ||
6962 | xdp.prog = prog; | 6965 | xdp.prog = prog; |
6963 | 6966 | ||
6964 | return xdp_op(dev, &xdp); | 6967 | return xdp_op(dev, &xdp); |
@@ -6984,7 +6987,7 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, | |||
6984 | ASSERT_RTNL(); | 6987 | ASSERT_RTNL(); |
6985 | 6988 | ||
6986 | xdp_op = xdp_chk = ops->ndo_xdp; | 6989 | xdp_op = xdp_chk = ops->ndo_xdp; |
6987 | if (!xdp_op && (flags & XDP_FLAGS_DRV_MODE)) | 6990 | if (!xdp_op && (flags & (XDP_FLAGS_DRV_MODE | XDP_FLAGS_HW_MODE))) |
6988 | return -EOPNOTSUPP; | 6991 | return -EOPNOTSUPP; |
6989 | if (!xdp_op || (flags & XDP_FLAGS_SKB_MODE)) | 6992 | if (!xdp_op || (flags & XDP_FLAGS_SKB_MODE)) |
6990 | xdp_op = generic_xdp_install; | 6993 | xdp_op = generic_xdp_install; |
@@ -7003,7 +7006,7 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, | |||
7003 | return PTR_ERR(prog); | 7006 | return PTR_ERR(prog); |
7004 | } | 7007 | } |
7005 | 7008 | ||
7006 | err = dev_xdp_install(dev, xdp_op, extack, prog); | 7009 | err = dev_xdp_install(dev, xdp_op, extack, flags, prog); |
7007 | if (err < 0 && prog) | 7010 | if (err < 0 && prog) |
7008 | bpf_prog_put(prog); | 7011 | bpf_prog_put(prog); |
7009 | 7012 | ||