bpf: reuse dev_is_mac_header_xmit for redirect
authorDaniel Borkmann <daniel@iogearbox.net>
Sat, 26 Nov 2016 00:28:06 +0000 (01:28 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Nov 2016 01:38:47 +0000 (20:38 -0500)
Commit dcf800344a91 ("net/sched: act_mirred: Refactor detection whether
dev needs xmit at mac header") added dev_is_mac_header_xmit(); since it's
also useful elsewhere, move it to if_arp.h and reuse it for BPF.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/if_arp.h
net/core/filter.c
net/sched/act_mirred.c

index f563907ed7767fdf231558e2e042e670b5d62c1d..3355efc8978164cd56c0b77c862511bb11122a2e 100644 (file)
@@ -44,4 +44,20 @@ static inline int arp_hdr_len(struct net_device *dev)
                return sizeof(struct arphdr) + (dev->addr_len + sizeof(u32)) * 2;
        }
 }
+
+static inline bool dev_is_mac_header_xmit(const struct net_device *dev)
+{
+       switch (dev->type) {
+       case ARPHRD_TUNNEL:
+       case ARPHRD_TUNNEL6:
+       case ARPHRD_SIT:
+       case ARPHRD_IPGRE:
+       case ARPHRD_VOID:
+       case ARPHRD_NONE:
+               return false;
+       default:
+               return true;
+       }
+}
+
 #endif /* _LINUX_IF_ARP_H */
index ea315af56511aa64d26aaa3c5f2a79d13df07a68..698a262b8ebbb1150706055ac8386a778d1140d5 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/inet.h>
 #include <linux/netdevice.h>
 #include <linux/if_packet.h>
+#include <linux/if_arp.h>
 #include <linux/gfp.h>
 #include <net/ip.h>
 #include <net/protocol.h>
@@ -1696,17 +1697,10 @@ static int __bpf_redirect_common(struct sk_buff *skb, struct net_device *dev,
 static int __bpf_redirect(struct sk_buff *skb, struct net_device *dev,
                          u32 flags)
 {
-       switch (dev->type) {
-       case ARPHRD_TUNNEL:
-       case ARPHRD_TUNNEL6:
-       case ARPHRD_SIT:
-       case ARPHRD_IPGRE:
-       case ARPHRD_VOID:
-       case ARPHRD_NONE:
-               return __bpf_redirect_no_mac(skb, dev, flags);
-       default:
+       if (dev_is_mac_header_xmit(dev))
                return __bpf_redirect_common(skb, dev, flags);
-       }
+       else
+               return __bpf_redirect_no_mac(skb, dev, flags);
 }
 
 BPF_CALL_3(bpf_clone_redirect, struct sk_buff *, skb, u32, ifindex, u64, flags)
index b2d417b8f46cdee99d8f2c4153314bc2160cb882..1af7baa732a362ad1bbe107039c93ed91f0f73f9 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/gfp.h>
+#include <linux/if_arp.h>
 #include <net/net_namespace.h>
 #include <net/netlink.h>
 #include <net/pkt_sched.h>
@@ -73,20 +74,6 @@ static const struct nla_policy mirred_policy[TCA_MIRRED_MAX + 1] = {
 static unsigned int mirred_net_id;
 static struct tc_action_ops act_mirred_ops;
 
-static bool dev_is_mac_header_xmit(const struct net_device *dev)
-{
-       switch (dev->type) {
-       case ARPHRD_TUNNEL:
-       case ARPHRD_TUNNEL6:
-       case ARPHRD_SIT:
-       case ARPHRD_IPGRE:
-       case ARPHRD_VOID:
-       case ARPHRD_NONE:
-               return false;
-       }
-       return true;
-}
-
 static int tcf_mirred_init(struct net *net, struct nlattr *nla,
                           struct nlattr *est, struct tc_action **a, int ovr,
                           int bind)