diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 8e276e0192a1..bfa4be42afff 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -7983,8 +7983,10 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, | |||
7983 | query = flags & XDP_FLAGS_HW_MODE ? XDP_QUERY_PROG_HW : XDP_QUERY_PROG; | 7983 | query = flags & XDP_FLAGS_HW_MODE ? XDP_QUERY_PROG_HW : XDP_QUERY_PROG; |
7984 | 7984 | ||
7985 | bpf_op = bpf_chk = ops->ndo_bpf; | 7985 | bpf_op = bpf_chk = ops->ndo_bpf; |
7986 | if (!bpf_op && (flags & (XDP_FLAGS_DRV_MODE | XDP_FLAGS_HW_MODE))) | 7986 | if (!bpf_op && (flags & (XDP_FLAGS_DRV_MODE | XDP_FLAGS_HW_MODE))) { |
7987 | NL_SET_ERR_MSG(extack, "underlying driver does not support XDP in native mode"); | ||
7987 | return -EOPNOTSUPP; | 7988 | return -EOPNOTSUPP; |
7989 | } | ||
7988 | if (!bpf_op || (flags & XDP_FLAGS_SKB_MODE)) | 7990 | if (!bpf_op || (flags & XDP_FLAGS_SKB_MODE)) |
7989 | bpf_op = generic_xdp_install; | 7991 | bpf_op = generic_xdp_install; |
7990 | if (bpf_op == bpf_chk) | 7992 | if (bpf_op == bpf_chk) |
@@ -7992,11 +7994,15 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, | |||
7992 | 7994 | ||
7993 | if (fd >= 0) { | 7995 | if (fd >= 0) { |
7994 | if (__dev_xdp_query(dev, bpf_chk, XDP_QUERY_PROG) || | 7996 | if (__dev_xdp_query(dev, bpf_chk, XDP_QUERY_PROG) || |
7995 | __dev_xdp_query(dev, bpf_chk, XDP_QUERY_PROG_HW)) | 7997 | __dev_xdp_query(dev, bpf_chk, XDP_QUERY_PROG_HW)) { |
7998 | NL_SET_ERR_MSG(extack, "native and generic XDP can't be active at the same time"); | ||
7996 | return -EEXIST; | 7999 | return -EEXIST; |
8000 | } | ||
7997 | if ((flags & XDP_FLAGS_UPDATE_IF_NOEXIST) && | 8001 | if ((flags & XDP_FLAGS_UPDATE_IF_NOEXIST) && |
7998 | __dev_xdp_query(dev, bpf_op, query)) | 8002 | __dev_xdp_query(dev, bpf_op, query)) { |
8003 | NL_SET_ERR_MSG(extack, "XDP program already attached"); | ||
7999 | return -EBUSY; | 8004 | return -EBUSY; |
8005 | } | ||
8000 | 8006 | ||
8001 | prog = bpf_prog_get_type_dev(fd, BPF_PROG_TYPE_XDP, | 8007 | prog = bpf_prog_get_type_dev(fd, BPF_PROG_TYPE_XDP, |
8002 | bpf_op == ops->ndo_bpf); | 8008 | bpf_op == ops->ndo_bpf); |