aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c12
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);