Commit fe400799 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller

ipv6: fib: Provide offload indication using nexthop flags

IPv6 routes currently lack nexthop flags as in IPv4. This has several
implications.

In the forwarding path, it requires us to check the carrier state of the
nexthop device and potentially ignore a linkdown route, instead of
checking for RTNH_F_LINKDOWN.

It also requires capable drivers to use the user facing IPv6-specific
route flags to provide offload indication, instead of using the nexthop
flags as in IPv4.

Add nexthop flags to IPv6 routes in the 40 bytes hole and use it to
provide offload indication instead of the RTF_OFFLOAD flag, which is
removed while it's still not part of any official kernel release.

In the near future we would like to use the field for the
RTNH_F_{LINKDOWN,DEAD} flags, but this change is more involved and might
not be ready in time for the current cycle.
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Acked-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 26d15948
...@@ -2397,7 +2397,7 @@ mlxsw_sp_fib6_entry_offload_set(struct mlxsw_sp_fib_entry *fib_entry) ...@@ -2397,7 +2397,7 @@ mlxsw_sp_fib6_entry_offload_set(struct mlxsw_sp_fib_entry *fib_entry)
if (fib_entry->type == MLXSW_SP_FIB_ENTRY_TYPE_LOCAL) { if (fib_entry->type == MLXSW_SP_FIB_ENTRY_TYPE_LOCAL) {
list_first_entry(&fib6_entry->rt6_list, struct mlxsw_sp_rt6, list_first_entry(&fib6_entry->rt6_list, struct mlxsw_sp_rt6,
list)->rt->rt6i_flags |= RTF_OFFLOAD; list)->rt->rt6i_nh_flags |= RTNH_F_OFFLOAD;
return; return;
} }
...@@ -2407,9 +2407,9 @@ mlxsw_sp_fib6_entry_offload_set(struct mlxsw_sp_fib_entry *fib_entry) ...@@ -2407,9 +2407,9 @@ mlxsw_sp_fib6_entry_offload_set(struct mlxsw_sp_fib_entry *fib_entry)
nh = mlxsw_sp_rt6_nexthop(nh_grp, mlxsw_sp_rt6); nh = mlxsw_sp_rt6_nexthop(nh_grp, mlxsw_sp_rt6);
if (nh && nh->offloaded) if (nh && nh->offloaded)
mlxsw_sp_rt6->rt->rt6i_flags |= RTF_OFFLOAD; mlxsw_sp_rt6->rt->rt6i_nh_flags |= RTNH_F_OFFLOAD;
else else
mlxsw_sp_rt6->rt->rt6i_flags &= ~RTF_OFFLOAD; mlxsw_sp_rt6->rt->rt6i_nh_flags &= ~RTNH_F_OFFLOAD;
} }
} }
...@@ -2424,7 +2424,7 @@ mlxsw_sp_fib6_entry_offload_unset(struct mlxsw_sp_fib_entry *fib_entry) ...@@ -2424,7 +2424,7 @@ mlxsw_sp_fib6_entry_offload_unset(struct mlxsw_sp_fib_entry *fib_entry)
list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list) { list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list) {
struct rt6_info *rt = mlxsw_sp_rt6->rt; struct rt6_info *rt = mlxsw_sp_rt6->rt;
rt->rt6i_flags &= ~RTF_OFFLOAD; rt->rt6i_nh_flags &= ~RTNH_F_OFFLOAD;
} }
} }
......
...@@ -120,6 +120,8 @@ struct rt6_info { ...@@ -120,6 +120,8 @@ struct rt6_info {
atomic_t rt6i_ref; atomic_t rt6i_ref;
unsigned int rt6i_nh_flags;
/* These are in a separate cache line. */ /* These are in a separate cache line. */
struct rt6key rt6i_dst ____cacheline_aligned_in_smp; struct rt6key rt6i_dst ____cacheline_aligned_in_smp;
u32 rt6i_flags; u32 rt6i_flags;
......
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
#define RTF_PREF(pref) ((pref) << 27) #define RTF_PREF(pref) ((pref) << 27)
#define RTF_PREF_MASK 0x18000000 #define RTF_PREF_MASK 0x18000000
#define RTF_OFFLOAD 0x20000000 /* offloaded route */
#define RTF_PCPU 0x40000000 /* read-only: can not be set by user */ #define RTF_PCPU 0x40000000 /* read-only: can not be set by user */
#define RTF_LOCAL 0x80000000 #define RTF_LOCAL 0x80000000
......
...@@ -1820,11 +1820,6 @@ static struct rt6_info *ip6_route_info_create(struct fib6_config *cfg, ...@@ -1820,11 +1820,6 @@ static struct rt6_info *ip6_route_info_create(struct fib6_config *cfg,
goto out; goto out;
} }
if (cfg->fc_flags & RTF_OFFLOAD) {
NL_SET_ERR_MSG(extack, "Userspace can not set RTF_OFFLOAD");
goto out;
}
if (cfg->fc_dst_len > 128) { if (cfg->fc_dst_len > 128) {
NL_SET_ERR_MSG(extack, "Invalid prefix length"); NL_SET_ERR_MSG(extack, "Invalid prefix length");
goto out; goto out;
...@@ -3335,7 +3330,7 @@ static int rt6_nexthop_info(struct sk_buff *skb, struct rt6_info *rt, ...@@ -3335,7 +3330,7 @@ static int rt6_nexthop_info(struct sk_buff *skb, struct rt6_info *rt,
goto nla_put_failure; goto nla_put_failure;
} }
if (rt->rt6i_flags & RTF_OFFLOAD) if (rt->rt6i_nh_flags & RTNH_F_OFFLOAD)
*flags |= RTNH_F_OFFLOAD; *flags |= RTNH_F_OFFLOAD;
/* not needed for multipath encoding b/c it has a rtnexthop struct */ /* not needed for multipath encoding b/c it has a rtnexthop struct */
......
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