route: Add multipath_hash in flowi_common to make user-define hash
Current fib_multipath_hash_policy can make hash based on the L3 or L4. But it only work on the outer IP. So a specific tunnel always has the same hash value. But a specific tunnel may contain so many inner connections. This patch provide a generic multipath_hash in floi_common. It can make a user-define hash which can mix with L3 or L4 hash. Signed-off-by: wenxu <wenxu@ucloud.cn> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -578,7 +578,7 @@ static int gre_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
|
||||
key = &info->key;
|
||||
ip_tunnel_init_flow(&fl4, IPPROTO_GRE, key->u.ipv4.dst, key->u.ipv4.src,
|
||||
tunnel_id_to_key32(key->tun_id), key->tos, 0,
|
||||
skb->mark);
|
||||
skb->mark, skb_get_hash(skb));
|
||||
rt = ip_route_output_key(dev_net(dev), &fl4);
|
||||
if (IS_ERR(rt))
|
||||
return PTR_ERR(rt);
|
||||
|
@@ -310,7 +310,7 @@ static int ip_tunnel_bind_dev(struct net_device *dev)
|
||||
ip_tunnel_init_flow(&fl4, iph->protocol, iph->daddr,
|
||||
iph->saddr, tunnel->parms.o_key,
|
||||
RT_TOS(iph->tos), tunnel->parms.link,
|
||||
tunnel->fwmark);
|
||||
tunnel->fwmark, 0);
|
||||
rt = ip_route_output_key(tunnel->net, &fl4);
|
||||
|
||||
if (!IS_ERR(rt)) {
|
||||
@@ -584,7 +584,7 @@ void ip_md_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
}
|
||||
ip_tunnel_init_flow(&fl4, proto, key->u.ipv4.dst, key->u.ipv4.src,
|
||||
tunnel_id_to_key32(key->tun_id), RT_TOS(tos),
|
||||
0, skb->mark);
|
||||
0, skb->mark, skb_get_hash(skb));
|
||||
if (tunnel->encap.type != TUNNEL_ENCAP_NONE)
|
||||
goto tx_error;
|
||||
|
||||
@@ -744,7 +744,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
|
||||
ip_tunnel_init_flow(&fl4, protocol, dst, tnl_params->saddr,
|
||||
tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.link,
|
||||
tunnel->fwmark);
|
||||
tunnel->fwmark, skb_get_hash(skb));
|
||||
|
||||
if (ip_tunnel_encap(skb, tunnel, &protocol, &fl4) < 0)
|
||||
goto tx_error;
|
||||
|
@@ -1820,6 +1820,7 @@ out:
|
||||
int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4,
|
||||
const struct sk_buff *skb, struct flow_keys *flkeys)
|
||||
{
|
||||
u32 multipath_hash = fl4->flowi4_multipath_hash;
|
||||
struct flow_keys hash_keys;
|
||||
u32 mhash;
|
||||
|
||||
@@ -1870,6 +1871,9 @@ int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4,
|
||||
}
|
||||
mhash = flow_hash_from_keys(&hash_keys);
|
||||
|
||||
if (multipath_hash)
|
||||
mhash = jhash_2words(mhash, multipath_hash, 0);
|
||||
|
||||
return mhash >> 1;
|
||||
}
|
||||
#endif /* CONFIG_IP_ROUTE_MULTIPATH */
|
||||
|
Reference in New Issue
Block a user