mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
ipv4: ICMP packet inspection for multipath
ICMP packets are inspected to let them route together with the flow they belong to, minimizing the chance that a problematic path will affect flows on other paths, and so that anycast environments can work with ECMP. Signed-off-by: Peter Nørlund <pch@ordbogen.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0e884c78ee
commit
79a131592d
3 changed files with 80 additions and 9 deletions
|
@ -440,6 +440,22 @@ out_unlock:
|
|||
icmp_xmit_unlock(sk);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IP_ROUTE_MULTIPATH
|
||||
|
||||
/* Source and destination is swapped. See ip_multipath_icmp_hash */
|
||||
static int icmp_multipath_hash_skb(const struct sk_buff *skb)
|
||||
{
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
|
||||
return fib_multipath_hash(iph->daddr, iph->saddr);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define icmp_multipath_hash_skb(skb) (-1)
|
||||
|
||||
#endif
|
||||
|
||||
static struct rtable *icmp_route_lookup(struct net *net,
|
||||
struct flowi4 *fl4,
|
||||
struct sk_buff *skb_in,
|
||||
|
@ -464,7 +480,8 @@ static struct rtable *icmp_route_lookup(struct net *net,
|
|||
fl4->flowi4_oif = l3mdev_master_ifindex(skb_in->dev);
|
||||
|
||||
security_skb_classify_flow(skb_in, flowi4_to_flowi(fl4));
|
||||
rt = __ip_route_output_key(net, fl4);
|
||||
rt = __ip_route_output_key_hash(net, fl4,
|
||||
icmp_multipath_hash_skb(skb_in));
|
||||
if (IS_ERR(rt))
|
||||
return rt;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue