net: Align ip_multipath_l3_keys and ip6_multipath_l3_keys
Symmetry is good and allows easy comparison that ipv4 and ipv6 are doing the same thing. To that end, change ip_multipath_l3_keys to set addresses at the end after the icmp compares, and move the initialization of ipv6 flow keys to rt6_multipath_hash. Signed-off-by: David Ahern <dsahern@gmail.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Reviewed-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
7efc0b6b66
Коммит
6f74b6c259
|
@ -1748,37 +1748,39 @@ static void ip_multipath_l3_keys(const struct sk_buff *skb,
|
|||
struct flow_keys *hash_keys)
|
||||
{
|
||||
const struct iphdr *outer_iph = ip_hdr(skb);
|
||||
const struct iphdr *key_iph = outer_iph;
|
||||
const struct iphdr *inner_iph;
|
||||
const struct icmphdr *icmph;
|
||||
struct iphdr _inner_iph;
|
||||
struct icmphdr _icmph;
|
||||
|
||||
hash_keys->addrs.v4addrs.src = outer_iph->saddr;
|
||||
hash_keys->addrs.v4addrs.dst = outer_iph->daddr;
|
||||
if (likely(outer_iph->protocol != IPPROTO_ICMP))
|
||||
return;
|
||||
goto out;
|
||||
|
||||
if (unlikely((outer_iph->frag_off & htons(IP_OFFSET)) != 0))
|
||||
return;
|
||||
goto out;
|
||||
|
||||
icmph = skb_header_pointer(skb, outer_iph->ihl * 4, sizeof(_icmph),
|
||||
&_icmph);
|
||||
if (!icmph)
|
||||
return;
|
||||
goto out;
|
||||
|
||||
if (icmph->type != ICMP_DEST_UNREACH &&
|
||||
icmph->type != ICMP_REDIRECT &&
|
||||
icmph->type != ICMP_TIME_EXCEEDED &&
|
||||
icmph->type != ICMP_PARAMETERPROB)
|
||||
return;
|
||||
goto out;
|
||||
|
||||
inner_iph = skb_header_pointer(skb,
|
||||
outer_iph->ihl * 4 + sizeof(_icmph),
|
||||
sizeof(_inner_iph), &_inner_iph);
|
||||
if (!inner_iph)
|
||||
return;
|
||||
hash_keys->addrs.v4addrs.src = inner_iph->saddr;
|
||||
hash_keys->addrs.v4addrs.dst = inner_iph->daddr;
|
||||
goto out;
|
||||
|
||||
key_iph = inner_iph;
|
||||
out:
|
||||
hash_keys->addrs.v4addrs.src = key_iph->saddr;
|
||||
hash_keys->addrs.v4addrs.dst = key_iph->daddr;
|
||||
}
|
||||
|
||||
/* if skb is set it will be used and fl4 can be NULL */
|
||||
|
|
|
@ -1815,8 +1815,6 @@ static void ip6_multipath_l3_keys(const struct sk_buff *skb,
|
|||
key_iph = inner_iph;
|
||||
_flkeys = NULL;
|
||||
out:
|
||||
memset(keys, 0, sizeof(*keys));
|
||||
keys->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
|
||||
if (_flkeys) {
|
||||
keys->addrs.v6addrs.src = _flkeys->addrs.v6addrs.src;
|
||||
keys->addrs.v6addrs.dst = _flkeys->addrs.v6addrs.dst;
|
||||
|
@ -1837,6 +1835,8 @@ u32 rt6_multipath_hash(const struct flowi6 *fl6, const struct sk_buff *skb,
|
|||
struct flow_keys hash_keys;
|
||||
|
||||
if (skb) {
|
||||
memset(&hash_keys, 0, sizeof(hash_keys));
|
||||
hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
|
||||
ip6_multipath_l3_keys(skb, &hash_keys, flkeys);
|
||||
return flow_hash_from_keys(&hash_keys) >> 1;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче