diff options
| author | Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> | 2018-07-05 22:49:00 -0400 |
|---|---|---|
| committer | Alexei Starovoitov <ast@kernel.org> | 2018-07-07 18:25:35 -0400 |
| commit | d8d7218ad842e18fc6976b87c08ed749e8d56313 (patch) | |
| tree | 57cdc7f8d2c55996b0ca1b6e74a8de8fa997b29f /kernel | |
| parent | 4fb126cbcbd6870851f0b3ba503e8ec0e66b9dd5 (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')
| -rw-r--r-- | kernel/bpf/devmap.c | 7 |
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; |
