Commit 3e453ca1 authored by Petr Machata's avatar Petr Machata Committed by Jakub Kicinski

net: ipv4,ipv6: Pass multipath hash computation through a helper

The following patches will add a sysctl to control multipath hash
seed. In order to centralize the hash computation, add a helper,
fib_multipath_hash_from_keys(), and have all IPv4 and IPv6 route.c
invocations of flow_hash_from_keys() go through this helper instead.
Signed-off-by: default avatarPetr Machata <petrm@nvidia.com>
Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Link: https://lore.kernel.org/r/20240607151357.421181-2-petrm@nvidia.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 32b06603
...@@ -521,6 +521,13 @@ void fib_nhc_update_mtu(struct fib_nh_common *nhc, u32 new, u32 orig); ...@@ -521,6 +521,13 @@ void fib_nhc_update_mtu(struct fib_nh_common *nhc, u32 new, u32 orig);
int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4, int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4,
const struct sk_buff *skb, struct flow_keys *flkeys); const struct sk_buff *skb, struct flow_keys *flkeys);
#endif #endif
static inline u32 fib_multipath_hash_from_keys(const struct net *net,
struct flow_keys *keys)
{
return flow_hash_from_keys(keys);
}
int fib_check_nh(struct net *net, struct fib_nh *nh, u32 table, u8 scope, int fib_check_nh(struct net *net, struct fib_nh *nh, u32 table, u8 scope,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
void fib_select_multipath(struct fib_result *res, int hash); void fib_select_multipath(struct fib_result *res, int hash);
......
...@@ -1923,7 +1923,7 @@ static u32 fib_multipath_custom_hash_outer(const struct net *net, ...@@ -1923,7 +1923,7 @@ static u32 fib_multipath_custom_hash_outer(const struct net *net,
hash_keys.ports.dst = keys.ports.dst; hash_keys.ports.dst = keys.ports.dst;
*p_has_inner = !!(keys.control.flags & FLOW_DIS_ENCAPSULATION); *p_has_inner = !!(keys.control.flags & FLOW_DIS_ENCAPSULATION);
return flow_hash_from_keys(&hash_keys); return fib_multipath_hash_from_keys(net, &hash_keys);
} }
static u32 fib_multipath_custom_hash_inner(const struct net *net, static u32 fib_multipath_custom_hash_inner(const struct net *net,
...@@ -1972,7 +1972,7 @@ static u32 fib_multipath_custom_hash_inner(const struct net *net, ...@@ -1972,7 +1972,7 @@ static u32 fib_multipath_custom_hash_inner(const struct net *net,
if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_DST_PORT) if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_DST_PORT)
hash_keys.ports.dst = keys.ports.dst; hash_keys.ports.dst = keys.ports.dst;
return flow_hash_from_keys(&hash_keys); return fib_multipath_hash_from_keys(net, &hash_keys);
} }
static u32 fib_multipath_custom_hash_skb(const struct net *net, static u32 fib_multipath_custom_hash_skb(const struct net *net,
...@@ -2009,7 +2009,7 @@ static u32 fib_multipath_custom_hash_fl4(const struct net *net, ...@@ -2009,7 +2009,7 @@ static u32 fib_multipath_custom_hash_fl4(const struct net *net,
if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_PORT) if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_PORT)
hash_keys.ports.dst = fl4->fl4_dport; hash_keys.ports.dst = fl4->fl4_dport;
return flow_hash_from_keys(&hash_keys); return fib_multipath_hash_from_keys(net, &hash_keys);
} }
/* if skb is set it will be used and fl4 can be NULL */ /* if skb is set it will be used and fl4 can be NULL */
...@@ -2030,7 +2030,7 @@ int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4, ...@@ -2030,7 +2030,7 @@ int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4,
hash_keys.addrs.v4addrs.src = fl4->saddr; hash_keys.addrs.v4addrs.src = fl4->saddr;
hash_keys.addrs.v4addrs.dst = fl4->daddr; hash_keys.addrs.v4addrs.dst = fl4->daddr;
} }
mhash = flow_hash_from_keys(&hash_keys); mhash = fib_multipath_hash_from_keys(net, &hash_keys);
break; break;
case 1: case 1:
/* skb is currently provided only when forwarding */ /* skb is currently provided only when forwarding */
...@@ -2064,7 +2064,7 @@ int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4, ...@@ -2064,7 +2064,7 @@ int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4,
hash_keys.ports.dst = fl4->fl4_dport; hash_keys.ports.dst = fl4->fl4_dport;
hash_keys.basic.ip_proto = fl4->flowi4_proto; hash_keys.basic.ip_proto = fl4->flowi4_proto;
} }
mhash = flow_hash_from_keys(&hash_keys); mhash = fib_multipath_hash_from_keys(net, &hash_keys);
break; break;
case 2: case 2:
memset(&hash_keys, 0, sizeof(hash_keys)); memset(&hash_keys, 0, sizeof(hash_keys));
...@@ -2095,7 +2095,7 @@ int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4, ...@@ -2095,7 +2095,7 @@ int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4,
hash_keys.addrs.v4addrs.src = fl4->saddr; hash_keys.addrs.v4addrs.src = fl4->saddr;
hash_keys.addrs.v4addrs.dst = fl4->daddr; hash_keys.addrs.v4addrs.dst = fl4->daddr;
} }
mhash = flow_hash_from_keys(&hash_keys); mhash = fib_multipath_hash_from_keys(net, &hash_keys);
break; break;
case 3: case 3:
if (skb) if (skb)
......
...@@ -2372,7 +2372,7 @@ static u32 rt6_multipath_custom_hash_outer(const struct net *net, ...@@ -2372,7 +2372,7 @@ static u32 rt6_multipath_custom_hash_outer(const struct net *net,
hash_keys.ports.dst = keys.ports.dst; hash_keys.ports.dst = keys.ports.dst;
*p_has_inner = !!(keys.control.flags & FLOW_DIS_ENCAPSULATION); *p_has_inner = !!(keys.control.flags & FLOW_DIS_ENCAPSULATION);
return flow_hash_from_keys(&hash_keys); return fib_multipath_hash_from_keys(net, &hash_keys);
} }
static u32 rt6_multipath_custom_hash_inner(const struct net *net, static u32 rt6_multipath_custom_hash_inner(const struct net *net,
...@@ -2421,7 +2421,7 @@ static u32 rt6_multipath_custom_hash_inner(const struct net *net, ...@@ -2421,7 +2421,7 @@ static u32 rt6_multipath_custom_hash_inner(const struct net *net,
if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_DST_PORT) if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_DST_PORT)
hash_keys.ports.dst = keys.ports.dst; hash_keys.ports.dst = keys.ports.dst;
return flow_hash_from_keys(&hash_keys); return fib_multipath_hash_from_keys(net, &hash_keys);
} }
static u32 rt6_multipath_custom_hash_skb(const struct net *net, static u32 rt6_multipath_custom_hash_skb(const struct net *net,
...@@ -2460,7 +2460,7 @@ static u32 rt6_multipath_custom_hash_fl6(const struct net *net, ...@@ -2460,7 +2460,7 @@ static u32 rt6_multipath_custom_hash_fl6(const struct net *net,
if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_PORT) if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_PORT)
hash_keys.ports.dst = fl6->fl6_dport; hash_keys.ports.dst = fl6->fl6_dport;
return flow_hash_from_keys(&hash_keys); return fib_multipath_hash_from_keys(net, &hash_keys);
} }
/* if skb is set it will be used and fl6 can be NULL */ /* if skb is set it will be used and fl6 can be NULL */
...@@ -2482,7 +2482,7 @@ u32 rt6_multipath_hash(const struct net *net, const struct flowi6 *fl6, ...@@ -2482,7 +2482,7 @@ u32 rt6_multipath_hash(const struct net *net, const struct flowi6 *fl6,
hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6); hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6);
hash_keys.basic.ip_proto = fl6->flowi6_proto; hash_keys.basic.ip_proto = fl6->flowi6_proto;
} }
mhash = flow_hash_from_keys(&hash_keys); mhash = fib_multipath_hash_from_keys(net, &hash_keys);
break; break;
case 1: case 1:
if (skb) { if (skb) {
...@@ -2514,7 +2514,7 @@ u32 rt6_multipath_hash(const struct net *net, const struct flowi6 *fl6, ...@@ -2514,7 +2514,7 @@ u32 rt6_multipath_hash(const struct net *net, const struct flowi6 *fl6,
hash_keys.ports.dst = fl6->fl6_dport; hash_keys.ports.dst = fl6->fl6_dport;
hash_keys.basic.ip_proto = fl6->flowi6_proto; hash_keys.basic.ip_proto = fl6->flowi6_proto;
} }
mhash = flow_hash_from_keys(&hash_keys); mhash = fib_multipath_hash_from_keys(net, &hash_keys);
break; break;
case 2: case 2:
memset(&hash_keys, 0, sizeof(hash_keys)); memset(&hash_keys, 0, sizeof(hash_keys));
...@@ -2551,7 +2551,7 @@ u32 rt6_multipath_hash(const struct net *net, const struct flowi6 *fl6, ...@@ -2551,7 +2551,7 @@ u32 rt6_multipath_hash(const struct net *net, const struct flowi6 *fl6,
hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6); hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6);
hash_keys.basic.ip_proto = fl6->flowi6_proto; hash_keys.basic.ip_proto = fl6->flowi6_proto;
} }
mhash = flow_hash_from_keys(&hash_keys); mhash = fib_multipath_hash_from_keys(net, &hash_keys);
break; break;
case 3: case 3:
if (skb) if (skb)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment