summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_rx.c6
-rw-r--r--net/core/rtnetlink.c4
-rw-r--r--samples/bpf/xdp1_kern.c12
-rw-r--r--samples/bpf/xdp2_kern.c14
4 files changed, 21 insertions, 15 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index 11d88c817137..a02dec6fb256 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -535,9 +535,11 @@ void mlx4_en_destroy_rx_ring(struct mlx4_en_priv *priv,
{
struct mlx4_en_dev *mdev = priv->mdev;
struct mlx4_en_rx_ring *ring = *pring;
+ struct bpf_prog *old_prog;
- if (ring->xdp_prog)
- bpf_prog_put(ring->xdp_prog);
+ old_prog = READ_ONCE(ring->xdp_prog);
+ if (old_prog)
+ bpf_prog_put(old_prog);
mlx4_free_hwq_res(mdev->dev, &ring->wqres, size * stride + TXBB_SIZE);
vfree(ring->rx_info);
ring->rx_info = NULL;
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index eba2b8260dbd..189cc78c77eb 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -2109,6 +2109,10 @@ static int do_setlink(const struct sk_buff *skb,
if (err < 0)
goto errout;
+ if (xdp[IFLA_XDP_ATTACHED]) {
+ err = -EINVAL;
+ goto errout;
+ }
if (xdp[IFLA_XDP_FD]) {
err = dev_change_xdp_fd(dev,
nla_get_s32(xdp[IFLA_XDP_FD]));
diff --git a/samples/bpf/xdp1_kern.c b/samples/bpf/xdp1_kern.c
index e7dd8ac40d12..219742106bfd 100644
--- a/samples/bpf/xdp1_kern.c
+++ b/samples/bpf/xdp1_kern.c
@@ -14,7 +14,7 @@
#include <linux/ipv6.h>
#include "bpf_helpers.h"
-struct bpf_map_def SEC("maps") dropcnt = {
+struct bpf_map_def SEC("maps") rxcnt = {
.type = BPF_MAP_TYPE_PERCPU_ARRAY,
.key_size = sizeof(u32),
.value_size = sizeof(long),
@@ -49,7 +49,7 @@ int xdp_prog1(struct xdp_md *ctx)
long *value;
u16 h_proto;
u64 nh_off;
- u32 index;
+ u32 ipproto;
nh_off = sizeof(*eth);
if (data + nh_off > data_end)
@@ -77,13 +77,13 @@ int xdp_prog1(struct xdp_md *ctx)
}
if (h_proto == htons(ETH_P_IP))
- index = parse_ipv4(data, nh_off, data_end);
+ ipproto = parse_ipv4(data, nh_off, data_end);
else if (h_proto == htons(ETH_P_IPV6))
- index = parse_ipv6(data, nh_off, data_end);
+ ipproto = parse_ipv6(data, nh_off, data_end);
else
- index = 0;
+ ipproto = 0;
- value = bpf_map_lookup_elem(&dropcnt, &index);
+ value = bpf_map_lookup_elem(&rxcnt, &ipproto);
if (value)
*value += 1;
diff --git a/samples/bpf/xdp2_kern.c b/samples/bpf/xdp2_kern.c
index 38fe7e1d0db4..e01288867d15 100644
--- a/samples/bpf/xdp2_kern.c
+++ b/samples/bpf/xdp2_kern.c
@@ -14,7 +14,7 @@
#include <linux/ipv6.h>
#include "bpf_helpers.h"
-struct bpf_map_def SEC("maps") dropcnt = {
+struct bpf_map_def SEC("maps") rxcnt = {
.type = BPF_MAP_TYPE_PERCPU_ARRAY,
.key_size = sizeof(u32),
.value_size = sizeof(long),
@@ -65,7 +65,7 @@ int xdp_prog1(struct xdp_md *ctx)
long *value;
u16 h_proto;
u64 nh_off;
- u32 index;
+ u32 ipproto;
nh_off = sizeof(*eth);
if (data + nh_off > data_end)
@@ -93,17 +93,17 @@ int xdp_prog1(struct xdp_md *ctx)
}
if (h_proto == htons(ETH_P_IP))
- index = parse_ipv4(data, nh_off, data_end);
+ ipproto = parse_ipv4(data, nh_off, data_end);
else if (h_proto == htons(ETH_P_IPV6))
- index = parse_ipv6(data, nh_off, data_end);
+ ipproto = parse_ipv6(data, nh_off, data_end);
else
- index = 0;
+ ipproto = 0;
- value = bpf_map_lookup_elem(&dropcnt, &index);
+ value = bpf_map_lookup_elem(&rxcnt, &ipproto);
if (value)
*value += 1;
- if (index == 17) {
+ if (ipproto == IPPROTO_UDP) {
swap_src_dst_mac(data);
rc = XDP_TX;
}