aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/bpf/devmap.c
diff options
context:
space:
mode:
authorToshiaki Makita <makita.toshiaki@lab.ntt.co.jp>2018-07-05 22:49:00 -0400
committerAlexei Starovoitov <ast@kernel.org>2018-07-07 18:25:35 -0400
commitd8d7218ad842e18fc6976b87c08ed749e8d56313 (patch)
tree57cdc7f8d2c55996b0ca1b6e74a8de8fa997b29f /kernel/bpf/devmap.c
parent4fb126cbcbd6870851f0b3ba503e8ec0e66b9dd5 (diff)
xdp: XDP_REDIRECT should check IFF_UP and MTU
Otherwise we end up with attempting to send packets from down devices or to send oversized packets, which may cause unexpected driver/device behaviour. Generic XDP has already done this check, so reuse the logic in native XDP. Fixes: 814abfabef3c ("xdp: add bpf_redirect helper function") Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'kernel/bpf/devmap.c')
-rw-r--r--kernel/bpf/devmap.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c
index 642c97f6d1b8..d361fc1e3bf3 100644
--- a/kernel/bpf/devmap.c
+++ b/kernel/bpf/devmap.c
@@ -334,10 +334,15 @@ int dev_map_enqueue(struct bpf_dtab_netdev *dst, struct xdp_buff *xdp,
334{ 334{
335 struct net_device *dev = dst->dev; 335 struct net_device *dev = dst->dev;
336 struct xdp_frame *xdpf; 336 struct xdp_frame *xdpf;
337 int err;
337 338
338 if (!dev->netdev_ops->ndo_xdp_xmit) 339 if (!dev->netdev_ops->ndo_xdp_xmit)
339 return -EOPNOTSUPP; 340 return -EOPNOTSUPP;
340 341
342 err = xdp_ok_fwd_dev(dev, xdp->data_end - xdp->data);
343 if (unlikely(err))
344 return err;
345
341 xdpf = convert_to_xdp_frame(xdp); 346 xdpf = convert_to_xdp_frame(xdp);
342 if (unlikely(!xdpf)) 347 if (unlikely(!xdpf))
343 return -EOVERFLOW; 348 return -EOVERFLOW;
@@ -350,7 +355,7 @@ int dev_map_generic_redirect(struct bpf_dtab_netdev *dst, struct sk_buff *skb,
350{ 355{
351 int err; 356 int err;
352 357
353 err = __xdp_generic_ok_fwd_dev(skb, dst->dev); 358 err = xdp_ok_fwd_dev(dst->dev, skb->len);
354 if (unlikely(err)) 359 if (unlikely(err))
355 return err; 360 return err;
356 skb->dev = dst->dev; 361 skb->dev = dst->dev;