summaryrefslogtreecommitdiffstats
path: root/net/ipv4/icmp.c
diff options
context:
space:
mode:
authorNikolay Aleksandrov <nikolay@cumulusnetworks.com>2017-03-16 09:28:00 -0400
committerDavid S. Miller <davem@davemloft.net>2017-03-21 18:27:19 -0400
commitbf4e0a3db97eb882368fd82980b3b1fa0b5b9778 (patch)
treef1e5a3fd90d22fc603bc5a6780fc1c716684ad94 /net/ipv4/icmp.c
parent88997e4208aea117627898e5f6f9801cf3cd42d2 (diff)
net: ipv4: add support for ECMP hash policy choice
This patch adds support for ECMP hash policy choice via a new sysctl called fib_multipath_hash_policy and also adds support for L4 hashes. The current values for fib_multipath_hash_policy are: 0 - layer 3 (default) 1 - layer 4 If there's an skb hash already set and it matches the chosen policy then it will be used instead of being calculated (currently only for L4). In L3 mode we always calculate the hash due to the ICMP error special case, the flow dissector's field consistentification should handle the address order thus we can remove the address reversals. If the skb is provided we always use it for the hash calculation, otherwise we fallback to fl4, that is if skb is NULL fl4 has to be set. Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/icmp.c')
-rw-r--r--net/ipv4/icmp.c19
1 files changed, 1 insertions, 18 deletions
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index fc310db2708b..43318b5f5647 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -464,22 +464,6 @@ out_bh_enable:
464 local_bh_enable(); 464 local_bh_enable();
465} 465}
466 466
467#ifdef CONFIG_IP_ROUTE_MULTIPATH
468
469/* Source and destination is swapped. See ip_multipath_icmp_hash */
470static int icmp_multipath_hash_skb(const struct sk_buff *skb)
471{
472 const struct iphdr *iph = ip_hdr(skb);
473
474 return fib_multipath_hash(iph->daddr, iph->saddr);
475}
476
477#else
478
479#define icmp_multipath_hash_skb(skb) (-1)
480
481#endif
482
483static struct rtable *icmp_route_lookup(struct net *net, 467static struct rtable *icmp_route_lookup(struct net *net,
484 struct flowi4 *fl4, 468 struct flowi4 *fl4,
485 struct sk_buff *skb_in, 469 struct sk_buff *skb_in,
@@ -505,8 +489,7 @@ static struct rtable *icmp_route_lookup(struct net *net,
505 fl4->flowi4_oif = l3mdev_master_ifindex(skb_dst(skb_in)->dev); 489 fl4->flowi4_oif = l3mdev_master_ifindex(skb_dst(skb_in)->dev);
506 490
507 security_skb_classify_flow(skb_in, flowi4_to_flowi(fl4)); 491 security_skb_classify_flow(skb_in, flowi4_to_flowi(fl4));
508 rt = __ip_route_output_key_hash(net, fl4, 492 rt = __ip_route_output_key_hash(net, fl4, skb_in);
509 icmp_multipath_hash_skb(skb_in));
510 if (IS_ERR(rt)) 493 if (IS_ERR(rt))
511 return rt; 494 return rt;
512 495