mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 09:02:06 +00:00
bpf: reuse dev_is_mac_header_xmit for redirect
Commit dcf800344a
("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>
This commit is contained in:
parent
55556dd59d
commit
c491680f8f
3 changed files with 21 additions and 24 deletions
|
@ -44,4 +44,20 @@ static inline int arp_hdr_len(struct net_device *dev)
|
||||||
return sizeof(struct arphdr) + (dev->addr_len + sizeof(u32)) * 2;
|
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 */
|
#endif /* _LINUX_IF_ARP_H */
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <linux/inet.h>
|
#include <linux/inet.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
#include <linux/if_packet.h>
|
#include <linux/if_packet.h>
|
||||||
|
#include <linux/if_arp.h>
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
#include <net/ip.h>
|
#include <net/ip.h>
|
||||||
#include <net/protocol.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,
|
static int __bpf_redirect(struct sk_buff *skb, struct net_device *dev,
|
||||||
u32 flags)
|
u32 flags)
|
||||||
{
|
{
|
||||||
switch (dev->type) {
|
if (dev_is_mac_header_xmit(dev))
|
||||||
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:
|
|
||||||
return __bpf_redirect_common(skb, dev, flags);
|
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)
|
BPF_CALL_3(bpf_clone_redirect, struct sk_buff *, skb, u32, ifindex, u64, flags)
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
|
#include <linux/if_arp.h>
|
||||||
#include <net/net_namespace.h>
|
#include <net/net_namespace.h>
|
||||||
#include <net/netlink.h>
|
#include <net/netlink.h>
|
||||||
#include <net/pkt_sched.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 unsigned int mirred_net_id;
|
||||||
static struct tc_action_ops act_mirred_ops;
|
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,
|
static int tcf_mirred_init(struct net *net, struct nlattr *nla,
|
||||||
struct nlattr *est, struct tc_action **a, int ovr,
|
struct nlattr *est, struct tc_action **a, int ovr,
|
||||||
int bind)
|
int bind)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue