提交 8d1c802b 编写于 作者: D David Ahern 提交者: David S. Miller

net/ipv6: Flip FIB entries to fib6_info

Convert all code paths referencing a FIB entry from
rt6_info to fib6_info.
Signed-off-by: NDavid Ahern <dsahern@gmail.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 93531c67
...@@ -442,7 +442,7 @@ struct mlxsw_sp_fib6_entry { ...@@ -442,7 +442,7 @@ struct mlxsw_sp_fib6_entry {
struct mlxsw_sp_rt6 { struct mlxsw_sp_rt6 {
struct list_head list; struct list_head list;
struct rt6_info *rt; struct fib6_info *rt;
}; };
struct mlxsw_sp_lpm_tree { struct mlxsw_sp_lpm_tree {
...@@ -3834,7 +3834,7 @@ mlxsw_sp_rt6_nexthop(struct mlxsw_sp_nexthop_group *nh_grp, ...@@ -3834,7 +3834,7 @@ mlxsw_sp_rt6_nexthop(struct mlxsw_sp_nexthop_group *nh_grp,
for (i = 0; i < nh_grp->count; i++) { for (i = 0; i < nh_grp->count; i++) {
struct mlxsw_sp_nexthop *nh = &nh_grp->nexthops[i]; struct mlxsw_sp_nexthop *nh = &nh_grp->nexthops[i];
struct rt6_info *rt = mlxsw_sp_rt6->rt; struct fib6_info *rt = mlxsw_sp_rt6->rt;
if (nh->rif && nh->rif->dev == rt->fib6_nh.nh_dev && if (nh->rif && nh->rif->dev == rt->fib6_nh.nh_dev &&
ipv6_addr_equal((const struct in6_addr *) &nh->gw_addr, ipv6_addr_equal((const struct in6_addr *) &nh->gw_addr,
...@@ -3920,7 +3920,7 @@ mlxsw_sp_fib6_entry_offload_unset(struct mlxsw_sp_fib_entry *fib_entry) ...@@ -3920,7 +3920,7 @@ mlxsw_sp_fib6_entry_offload_unset(struct mlxsw_sp_fib_entry *fib_entry)
fib6_entry = container_of(fib_entry, struct mlxsw_sp_fib6_entry, fib6_entry = container_of(fib_entry, struct mlxsw_sp_fib6_entry,
common); common);
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 fib6_info *rt = mlxsw_sp_rt6->rt;
rt->fib6_nh.nh_flags &= ~RTNH_F_OFFLOAD; rt->fib6_nh.nh_flags &= ~RTNH_F_OFFLOAD;
} }
...@@ -4699,7 +4699,7 @@ static void mlxsw_sp_router_fib4_del(struct mlxsw_sp *mlxsw_sp, ...@@ -4699,7 +4699,7 @@ static void mlxsw_sp_router_fib4_del(struct mlxsw_sp *mlxsw_sp,
mlxsw_sp_fib_node_put(mlxsw_sp, fib_node); mlxsw_sp_fib_node_put(mlxsw_sp, fib_node);
} }
static bool mlxsw_sp_fib6_rt_should_ignore(const struct rt6_info *rt) static bool mlxsw_sp_fib6_rt_should_ignore(const struct fib6_info *rt)
{ {
/* Packets with link-local destination IP arriving to the router /* Packets with link-local destination IP arriving to the router
* are trapped to the CPU, so no need to program specific routes * are trapped to the CPU, so no need to program specific routes
...@@ -4721,7 +4721,7 @@ static bool mlxsw_sp_fib6_rt_should_ignore(const struct rt6_info *rt) ...@@ -4721,7 +4721,7 @@ static bool mlxsw_sp_fib6_rt_should_ignore(const struct rt6_info *rt)
return false; return false;
} }
static struct mlxsw_sp_rt6 *mlxsw_sp_rt6_create(struct rt6_info *rt) static struct mlxsw_sp_rt6 *mlxsw_sp_rt6_create(struct fib6_info *rt)
{ {
struct mlxsw_sp_rt6 *mlxsw_sp_rt6; struct mlxsw_sp_rt6 *mlxsw_sp_rt6;
...@@ -4734,18 +4734,18 @@ static struct mlxsw_sp_rt6 *mlxsw_sp_rt6_create(struct rt6_info *rt) ...@@ -4734,18 +4734,18 @@ static struct mlxsw_sp_rt6 *mlxsw_sp_rt6_create(struct rt6_info *rt)
* memory. * memory.
*/ */
mlxsw_sp_rt6->rt = rt; mlxsw_sp_rt6->rt = rt;
rt6_hold(rt); fib6_info_hold(rt);
return mlxsw_sp_rt6; return mlxsw_sp_rt6;
} }
#if IS_ENABLED(CONFIG_IPV6) #if IS_ENABLED(CONFIG_IPV6)
static void mlxsw_sp_rt6_release(struct rt6_info *rt) static void mlxsw_sp_rt6_release(struct fib6_info *rt)
{ {
rt6_release(rt); fib6_info_release(rt);
} }
#else #else
static void mlxsw_sp_rt6_release(struct rt6_info *rt) static void mlxsw_sp_rt6_release(struct fib6_info *rt)
{ {
} }
#endif #endif
...@@ -4756,13 +4756,13 @@ static void mlxsw_sp_rt6_destroy(struct mlxsw_sp_rt6 *mlxsw_sp_rt6) ...@@ -4756,13 +4756,13 @@ static void mlxsw_sp_rt6_destroy(struct mlxsw_sp_rt6 *mlxsw_sp_rt6)
kfree(mlxsw_sp_rt6); kfree(mlxsw_sp_rt6);
} }
static bool mlxsw_sp_fib6_rt_can_mp(const struct rt6_info *rt) static bool mlxsw_sp_fib6_rt_can_mp(const struct fib6_info *rt)
{ {
/* RTF_CACHE routes are ignored */ /* RTF_CACHE routes are ignored */
return (rt->rt6i_flags & (RTF_GATEWAY | RTF_ADDRCONF)) == RTF_GATEWAY; return (rt->rt6i_flags & (RTF_GATEWAY | RTF_ADDRCONF)) == RTF_GATEWAY;
} }
static struct rt6_info * static struct fib6_info *
mlxsw_sp_fib6_entry_rt(const struct mlxsw_sp_fib6_entry *fib6_entry) mlxsw_sp_fib6_entry_rt(const struct mlxsw_sp_fib6_entry *fib6_entry)
{ {
return list_first_entry(&fib6_entry->rt6_list, struct mlxsw_sp_rt6, return list_first_entry(&fib6_entry->rt6_list, struct mlxsw_sp_rt6,
...@@ -4771,7 +4771,7 @@ mlxsw_sp_fib6_entry_rt(const struct mlxsw_sp_fib6_entry *fib6_entry) ...@@ -4771,7 +4771,7 @@ mlxsw_sp_fib6_entry_rt(const struct mlxsw_sp_fib6_entry *fib6_entry)
static struct mlxsw_sp_fib6_entry * static struct mlxsw_sp_fib6_entry *
mlxsw_sp_fib6_node_mp_entry_find(const struct mlxsw_sp_fib_node *fib_node, mlxsw_sp_fib6_node_mp_entry_find(const struct mlxsw_sp_fib_node *fib_node,
const struct rt6_info *nrt, bool replace) const struct fib6_info *nrt, bool replace)
{ {
struct mlxsw_sp_fib6_entry *fib6_entry; struct mlxsw_sp_fib6_entry *fib6_entry;
...@@ -4779,7 +4779,7 @@ mlxsw_sp_fib6_node_mp_entry_find(const struct mlxsw_sp_fib_node *fib_node, ...@@ -4779,7 +4779,7 @@ mlxsw_sp_fib6_node_mp_entry_find(const struct mlxsw_sp_fib_node *fib_node,
return NULL; return NULL;
list_for_each_entry(fib6_entry, &fib_node->entry_list, common.list) { list_for_each_entry(fib6_entry, &fib_node->entry_list, common.list) {
struct rt6_info *rt = mlxsw_sp_fib6_entry_rt(fib6_entry); struct fib6_info *rt = mlxsw_sp_fib6_entry_rt(fib6_entry);
/* RT6_TABLE_LOCAL and RT6_TABLE_MAIN share the same /* RT6_TABLE_LOCAL and RT6_TABLE_MAIN share the same
* virtual router. * virtual router.
...@@ -4802,7 +4802,7 @@ mlxsw_sp_fib6_node_mp_entry_find(const struct mlxsw_sp_fib_node *fib_node, ...@@ -4802,7 +4802,7 @@ mlxsw_sp_fib6_node_mp_entry_find(const struct mlxsw_sp_fib_node *fib_node,
static struct mlxsw_sp_rt6 * static struct mlxsw_sp_rt6 *
mlxsw_sp_fib6_entry_rt_find(const struct mlxsw_sp_fib6_entry *fib6_entry, mlxsw_sp_fib6_entry_rt_find(const struct mlxsw_sp_fib6_entry *fib6_entry,
const struct rt6_info *rt) const struct fib6_info *rt)
{ {
struct mlxsw_sp_rt6 *mlxsw_sp_rt6; struct mlxsw_sp_rt6 *mlxsw_sp_rt6;
...@@ -4815,7 +4815,7 @@ mlxsw_sp_fib6_entry_rt_find(const struct mlxsw_sp_fib6_entry *fib6_entry, ...@@ -4815,7 +4815,7 @@ mlxsw_sp_fib6_entry_rt_find(const struct mlxsw_sp_fib6_entry *fib6_entry,
} }
static bool mlxsw_sp_nexthop6_ipip_type(const struct mlxsw_sp *mlxsw_sp, static bool mlxsw_sp_nexthop6_ipip_type(const struct mlxsw_sp *mlxsw_sp,
const struct rt6_info *rt, const struct fib6_info *rt,
enum mlxsw_sp_ipip_type *ret) enum mlxsw_sp_ipip_type *ret)
{ {
return rt->fib6_nh.nh_dev && return rt->fib6_nh.nh_dev &&
...@@ -4825,7 +4825,7 @@ static bool mlxsw_sp_nexthop6_ipip_type(const struct mlxsw_sp *mlxsw_sp, ...@@ -4825,7 +4825,7 @@ static bool mlxsw_sp_nexthop6_ipip_type(const struct mlxsw_sp *mlxsw_sp,
static int mlxsw_sp_nexthop6_type_init(struct mlxsw_sp *mlxsw_sp, static int mlxsw_sp_nexthop6_type_init(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_nexthop_group *nh_grp, struct mlxsw_sp_nexthop_group *nh_grp,
struct mlxsw_sp_nexthop *nh, struct mlxsw_sp_nexthop *nh,
const struct rt6_info *rt) const struct fib6_info *rt)
{ {
const struct mlxsw_sp_ipip_ops *ipip_ops; const struct mlxsw_sp_ipip_ops *ipip_ops;
struct mlxsw_sp_ipip_entry *ipip_entry; struct mlxsw_sp_ipip_entry *ipip_entry;
...@@ -4870,7 +4870,7 @@ static void mlxsw_sp_nexthop6_type_fini(struct mlxsw_sp *mlxsw_sp, ...@@ -4870,7 +4870,7 @@ static void mlxsw_sp_nexthop6_type_fini(struct mlxsw_sp *mlxsw_sp,
static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp, static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_nexthop_group *nh_grp, struct mlxsw_sp_nexthop_group *nh_grp,
struct mlxsw_sp_nexthop *nh, struct mlxsw_sp_nexthop *nh,
const struct rt6_info *rt) const struct fib6_info *rt)
{ {
struct net_device *dev = rt->fib6_nh.nh_dev; struct net_device *dev = rt->fib6_nh.nh_dev;
...@@ -4897,7 +4897,7 @@ static void mlxsw_sp_nexthop6_fini(struct mlxsw_sp *mlxsw_sp, ...@@ -4897,7 +4897,7 @@ static void mlxsw_sp_nexthop6_fini(struct mlxsw_sp *mlxsw_sp,
} }
static bool mlxsw_sp_rt6_is_gateway(const struct mlxsw_sp *mlxsw_sp, static bool mlxsw_sp_rt6_is_gateway(const struct mlxsw_sp *mlxsw_sp,
const struct rt6_info *rt) const struct fib6_info *rt)
{ {
return rt->rt6i_flags & RTF_GATEWAY || return rt->rt6i_flags & RTF_GATEWAY ||
mlxsw_sp_nexthop6_ipip_type(mlxsw_sp, rt, NULL); mlxsw_sp_nexthop6_ipip_type(mlxsw_sp, rt, NULL);
...@@ -4928,7 +4928,7 @@ mlxsw_sp_nexthop6_group_create(struct mlxsw_sp *mlxsw_sp, ...@@ -4928,7 +4928,7 @@ mlxsw_sp_nexthop6_group_create(struct mlxsw_sp *mlxsw_sp,
nh_grp->gateway = mlxsw_sp_rt6_is_gateway(mlxsw_sp, mlxsw_sp_rt6->rt); nh_grp->gateway = mlxsw_sp_rt6_is_gateway(mlxsw_sp, mlxsw_sp_rt6->rt);
nh_grp->count = fib6_entry->nrt6; nh_grp->count = fib6_entry->nrt6;
for (i = 0; i < nh_grp->count; i++) { for (i = 0; i < nh_grp->count; i++) {
struct rt6_info *rt = mlxsw_sp_rt6->rt; struct fib6_info *rt = mlxsw_sp_rt6->rt;
nh = &nh_grp->nexthops[i]; nh = &nh_grp->nexthops[i];
err = mlxsw_sp_nexthop6_init(mlxsw_sp, nh_grp, nh, rt); err = mlxsw_sp_nexthop6_init(mlxsw_sp, nh_grp, nh, rt);
...@@ -5040,7 +5040,7 @@ mlxsw_sp_nexthop6_group_update(struct mlxsw_sp *mlxsw_sp, ...@@ -5040,7 +5040,7 @@ mlxsw_sp_nexthop6_group_update(struct mlxsw_sp *mlxsw_sp,
static int static int
mlxsw_sp_fib6_entry_nexthop_add(struct mlxsw_sp *mlxsw_sp, mlxsw_sp_fib6_entry_nexthop_add(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_fib6_entry *fib6_entry, struct mlxsw_sp_fib6_entry *fib6_entry,
struct rt6_info *rt) struct fib6_info *rt)
{ {
struct mlxsw_sp_rt6 *mlxsw_sp_rt6; struct mlxsw_sp_rt6 *mlxsw_sp_rt6;
int err; int err;
...@@ -5068,7 +5068,7 @@ mlxsw_sp_fib6_entry_nexthop_add(struct mlxsw_sp *mlxsw_sp, ...@@ -5068,7 +5068,7 @@ mlxsw_sp_fib6_entry_nexthop_add(struct mlxsw_sp *mlxsw_sp,
static void static void
mlxsw_sp_fib6_entry_nexthop_del(struct mlxsw_sp *mlxsw_sp, mlxsw_sp_fib6_entry_nexthop_del(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_fib6_entry *fib6_entry, struct mlxsw_sp_fib6_entry *fib6_entry,
struct rt6_info *rt) struct fib6_info *rt)
{ {
struct mlxsw_sp_rt6 *mlxsw_sp_rt6; struct mlxsw_sp_rt6 *mlxsw_sp_rt6;
...@@ -5084,7 +5084,7 @@ mlxsw_sp_fib6_entry_nexthop_del(struct mlxsw_sp *mlxsw_sp, ...@@ -5084,7 +5084,7 @@ mlxsw_sp_fib6_entry_nexthop_del(struct mlxsw_sp *mlxsw_sp,
static void mlxsw_sp_fib6_entry_type_set(struct mlxsw_sp *mlxsw_sp, static void mlxsw_sp_fib6_entry_type_set(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_fib_entry *fib_entry, struct mlxsw_sp_fib_entry *fib_entry,
const struct rt6_info *rt) const struct fib6_info *rt)
{ {
/* Packets hitting RTF_REJECT routes need to be discarded by the /* Packets hitting RTF_REJECT routes need to be discarded by the
* stack. We can rely on their destination device not having a * stack. We can rely on their destination device not having a
...@@ -5118,7 +5118,7 @@ mlxsw_sp_fib6_entry_rt_destroy_all(struct mlxsw_sp_fib6_entry *fib6_entry) ...@@ -5118,7 +5118,7 @@ mlxsw_sp_fib6_entry_rt_destroy_all(struct mlxsw_sp_fib6_entry *fib6_entry)
static struct mlxsw_sp_fib6_entry * static struct mlxsw_sp_fib6_entry *
mlxsw_sp_fib6_entry_create(struct mlxsw_sp *mlxsw_sp, mlxsw_sp_fib6_entry_create(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_fib_node *fib_node, struct mlxsw_sp_fib_node *fib_node,
struct rt6_info *rt) struct fib6_info *rt)
{ {
struct mlxsw_sp_fib6_entry *fib6_entry; struct mlxsw_sp_fib6_entry *fib6_entry;
struct mlxsw_sp_fib_entry *fib_entry; struct mlxsw_sp_fib_entry *fib_entry;
...@@ -5168,12 +5168,12 @@ static void mlxsw_sp_fib6_entry_destroy(struct mlxsw_sp *mlxsw_sp, ...@@ -5168,12 +5168,12 @@ static void mlxsw_sp_fib6_entry_destroy(struct mlxsw_sp *mlxsw_sp,
static struct mlxsw_sp_fib6_entry * static struct mlxsw_sp_fib6_entry *
mlxsw_sp_fib6_node_entry_find(const struct mlxsw_sp_fib_node *fib_node, mlxsw_sp_fib6_node_entry_find(const struct mlxsw_sp_fib_node *fib_node,
const struct rt6_info *nrt, bool replace) const struct fib6_info *nrt, bool replace)
{ {
struct mlxsw_sp_fib6_entry *fib6_entry, *fallback = NULL; struct mlxsw_sp_fib6_entry *fib6_entry, *fallback = NULL;
list_for_each_entry(fib6_entry, &fib_node->entry_list, common.list) { list_for_each_entry(fib6_entry, &fib_node->entry_list, common.list) {
struct rt6_info *rt = mlxsw_sp_fib6_entry_rt(fib6_entry); struct fib6_info *rt = mlxsw_sp_fib6_entry_rt(fib6_entry);
if (rt->rt6i_table->tb6_id > nrt->rt6i_table->tb6_id) if (rt->rt6i_table->tb6_id > nrt->rt6i_table->tb6_id)
continue; continue;
...@@ -5198,7 +5198,7 @@ mlxsw_sp_fib6_node_list_insert(struct mlxsw_sp_fib6_entry *new6_entry, ...@@ -5198,7 +5198,7 @@ mlxsw_sp_fib6_node_list_insert(struct mlxsw_sp_fib6_entry *new6_entry,
bool replace) bool replace)
{ {
struct mlxsw_sp_fib_node *fib_node = new6_entry->common.fib_node; struct mlxsw_sp_fib_node *fib_node = new6_entry->common.fib_node;
struct rt6_info *nrt = mlxsw_sp_fib6_entry_rt(new6_entry); struct fib6_info *nrt = mlxsw_sp_fib6_entry_rt(new6_entry);
struct mlxsw_sp_fib6_entry *fib6_entry; struct mlxsw_sp_fib6_entry *fib6_entry;
fib6_entry = mlxsw_sp_fib6_node_entry_find(fib_node, nrt, replace); fib6_entry = mlxsw_sp_fib6_node_entry_find(fib_node, nrt, replace);
...@@ -5213,7 +5213,7 @@ mlxsw_sp_fib6_node_list_insert(struct mlxsw_sp_fib6_entry *new6_entry, ...@@ -5213,7 +5213,7 @@ mlxsw_sp_fib6_node_list_insert(struct mlxsw_sp_fib6_entry *new6_entry,
struct mlxsw_sp_fib6_entry *last; struct mlxsw_sp_fib6_entry *last;
list_for_each_entry(last, &fib_node->entry_list, common.list) { list_for_each_entry(last, &fib_node->entry_list, common.list) {
struct rt6_info *rt = mlxsw_sp_fib6_entry_rt(last); struct fib6_info *rt = mlxsw_sp_fib6_entry_rt(last);
if (nrt->rt6i_table->tb6_id > rt->rt6i_table->tb6_id) if (nrt->rt6i_table->tb6_id > rt->rt6i_table->tb6_id)
break; break;
...@@ -5268,7 +5268,7 @@ mlxsw_sp_fib6_node_entry_unlink(struct mlxsw_sp *mlxsw_sp, ...@@ -5268,7 +5268,7 @@ mlxsw_sp_fib6_node_entry_unlink(struct mlxsw_sp *mlxsw_sp,
static struct mlxsw_sp_fib6_entry * static struct mlxsw_sp_fib6_entry *
mlxsw_sp_fib6_entry_lookup(struct mlxsw_sp *mlxsw_sp, mlxsw_sp_fib6_entry_lookup(struct mlxsw_sp *mlxsw_sp,
const struct rt6_info *rt) const struct fib6_info *rt)
{ {
struct mlxsw_sp_fib6_entry *fib6_entry; struct mlxsw_sp_fib6_entry *fib6_entry;
struct mlxsw_sp_fib_node *fib_node; struct mlxsw_sp_fib_node *fib_node;
...@@ -5287,7 +5287,7 @@ mlxsw_sp_fib6_entry_lookup(struct mlxsw_sp *mlxsw_sp, ...@@ -5287,7 +5287,7 @@ mlxsw_sp_fib6_entry_lookup(struct mlxsw_sp *mlxsw_sp,
return NULL; return NULL;
list_for_each_entry(fib6_entry, &fib_node->entry_list, common.list) { list_for_each_entry(fib6_entry, &fib_node->entry_list, common.list) {
struct rt6_info *iter_rt = mlxsw_sp_fib6_entry_rt(fib6_entry); struct fib6_info *iter_rt = mlxsw_sp_fib6_entry_rt(fib6_entry);
if (rt->rt6i_table->tb6_id == iter_rt->rt6i_table->tb6_id && if (rt->rt6i_table->tb6_id == iter_rt->rt6i_table->tb6_id &&
rt->rt6i_metric == iter_rt->rt6i_metric && rt->rt6i_metric == iter_rt->rt6i_metric &&
...@@ -5316,7 +5316,7 @@ static void mlxsw_sp_fib6_entry_replace(struct mlxsw_sp *mlxsw_sp, ...@@ -5316,7 +5316,7 @@ static void mlxsw_sp_fib6_entry_replace(struct mlxsw_sp *mlxsw_sp,
} }
static int mlxsw_sp_router_fib6_add(struct mlxsw_sp *mlxsw_sp, static int mlxsw_sp_router_fib6_add(struct mlxsw_sp *mlxsw_sp,
struct rt6_info *rt, bool replace) struct fib6_info *rt, bool replace)
{ {
struct mlxsw_sp_fib6_entry *fib6_entry; struct mlxsw_sp_fib6_entry *fib6_entry;
struct mlxsw_sp_fib_node *fib_node; struct mlxsw_sp_fib_node *fib_node;
...@@ -5373,7 +5373,7 @@ static int mlxsw_sp_router_fib6_add(struct mlxsw_sp *mlxsw_sp, ...@@ -5373,7 +5373,7 @@ static int mlxsw_sp_router_fib6_add(struct mlxsw_sp *mlxsw_sp,
} }
static void mlxsw_sp_router_fib6_del(struct mlxsw_sp *mlxsw_sp, static void mlxsw_sp_router_fib6_del(struct mlxsw_sp *mlxsw_sp,
struct rt6_info *rt) struct fib6_info *rt)
{ {
struct mlxsw_sp_fib6_entry *fib6_entry; struct mlxsw_sp_fib6_entry *fib6_entry;
struct mlxsw_sp_fib_node *fib_node; struct mlxsw_sp_fib_node *fib_node;
...@@ -5836,7 +5836,7 @@ static void mlxsw_sp_router_fib6_event(struct mlxsw_sp_fib_event_work *fib_work, ...@@ -5836,7 +5836,7 @@ static void mlxsw_sp_router_fib6_event(struct mlxsw_sp_fib_event_work *fib_work,
fen6_info = container_of(info, struct fib6_entry_notifier_info, fen6_info = container_of(info, struct fib6_entry_notifier_info,
info); info);
fib_work->fen6_info = *fen6_info; fib_work->fen6_info = *fen6_info;
rt6_hold(fib_work->fen6_info.rt); fib6_info_hold(fib_work->fen6_info.rt);
break; break;
} }
} }
......
...@@ -64,7 +64,7 @@ struct inet6_ifaddr { ...@@ -64,7 +64,7 @@ struct inet6_ifaddr {
struct delayed_work dad_work; struct delayed_work dad_work;
struct inet6_dev *idev; struct inet6_dev *idev;
struct rt6_info *rt; struct fib6_info *rt;
struct hlist_node addr_lst; struct hlist_node addr_lst;
struct list_head if_list; struct list_head if_list;
...@@ -144,7 +144,7 @@ struct ipv6_ac_socklist { ...@@ -144,7 +144,7 @@ struct ipv6_ac_socklist {
struct ifacaddr6 { struct ifacaddr6 {
struct in6_addr aca_addr; struct in6_addr aca_addr;
struct inet6_dev *aca_idev; struct inet6_dev *aca_idev;
struct rt6_info *aca_rt; struct fib6_info *aca_rt;
struct ifacaddr6 *aca_next; struct ifacaddr6 *aca_next;
int aca_users; int aca_users;
refcount_t aca_refcnt; refcount_t aca_refcnt;
......
...@@ -75,12 +75,12 @@ struct fib6_node { ...@@ -75,12 +75,12 @@ struct fib6_node {
#ifdef CONFIG_IPV6_SUBTREES #ifdef CONFIG_IPV6_SUBTREES
struct fib6_node __rcu *subtree; struct fib6_node __rcu *subtree;
#endif #endif
struct rt6_info __rcu *leaf; struct fib6_info __rcu *leaf;
__u16 fn_bit; /* bit key */ __u16 fn_bit; /* bit key */
__u16 fn_flags; __u16 fn_flags;
int fn_sernum; int fn_sernum;
struct rt6_info __rcu *rr_ptr; struct fib6_info __rcu *rr_ptr;
struct rcu_head rcu; struct rcu_head rcu;
}; };
...@@ -176,7 +176,7 @@ struct fib6_info { ...@@ -176,7 +176,7 @@ struct fib6_info {
struct rt6_info { struct rt6_info {
struct dst_entry dst; struct dst_entry dst;
struct rt6_info __rcu *rt6_next; struct rt6_info __rcu *rt6_next;
struct rt6_info *from; struct fib6_info *from;
/* /*
* Tail elements of dst_entry (__refcnt etc.) * Tail elements of dst_entry (__refcnt etc.)
...@@ -242,20 +242,20 @@ static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst) ...@@ -242,20 +242,20 @@ static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)
return ((struct rt6_info *)dst)->rt6i_idev; return ((struct rt6_info *)dst)->rt6i_idev;
} }
static inline void fib6_clean_expires(struct rt6_info *f6i) static inline void fib6_clean_expires(struct fib6_info *f6i)
{ {
f6i->rt6i_flags &= ~RTF_EXPIRES; f6i->rt6i_flags &= ~RTF_EXPIRES;
f6i->expires = 0; f6i->expires = 0;
} }
static inline void fib6_set_expires(struct rt6_info *f6i, static inline void fib6_set_expires(struct fib6_info *f6i,
unsigned long expires) unsigned long expires)
{ {
f6i->expires = expires; f6i->expires = expires;
f6i->rt6i_flags |= RTF_EXPIRES; f6i->rt6i_flags |= RTF_EXPIRES;
} }
static inline bool fib6_check_expired(const struct rt6_info *f6i) static inline bool fib6_check_expired(const struct fib6_info *f6i)
{ {
if (f6i->rt6i_flags & RTF_EXPIRES) if (f6i->rt6i_flags & RTF_EXPIRES)
return time_after(jiffies, f6i->expires); return time_after(jiffies, f6i->expires);
...@@ -288,7 +288,7 @@ static inline void rt6_update_expires(struct rt6_info *rt0, int timeout) ...@@ -288,7 +288,7 @@ static inline void rt6_update_expires(struct rt6_info *rt0, int timeout)
* Return true if we can get cookie safely * Return true if we can get cookie safely
* Return false if not * Return false if not
*/ */
static inline bool rt6_get_cookie_safe(const struct rt6_info *rt, static inline bool rt6_get_cookie_safe(const struct fib6_info *rt,
u32 *cookie) u32 *cookie)
{ {
struct fib6_node *fn; struct fib6_node *fn;
...@@ -330,15 +330,15 @@ static inline void ip6_rt_put(struct rt6_info *rt) ...@@ -330,15 +330,15 @@ static inline void ip6_rt_put(struct rt6_info *rt)
void rt6_free_pcpu(struct rt6_info *non_pcpu_rt); void rt6_free_pcpu(struct rt6_info *non_pcpu_rt);
struct rt6_info *fib6_info_alloc(gfp_t gfp_flags); struct fib6_info *fib6_info_alloc(gfp_t gfp_flags);
void fib6_info_destroy(struct rt6_info *f6i); void fib6_info_destroy(struct fib6_info *f6i);
static inline void fib6_info_hold(struct rt6_info *f6i) static inline void fib6_info_hold(struct fib6_info *f6i)
{ {
atomic_inc(&f6i->rt6i_ref); atomic_inc(&f6i->rt6i_ref);
} }
static inline void fib6_info_release(struct rt6_info *f6i) static inline void fib6_info_release(struct fib6_info *f6i)
{ {
if (f6i && atomic_dec_and_test(&f6i->rt6i_ref)) if (f6i && atomic_dec_and_test(&f6i->rt6i_ref))
fib6_info_destroy(f6i); fib6_info_destroy(f6i);
...@@ -371,7 +371,7 @@ enum fib6_walk_state { ...@@ -371,7 +371,7 @@ enum fib6_walk_state {
struct fib6_walker { struct fib6_walker {
struct list_head lh; struct list_head lh;
struct fib6_node *root, *node; struct fib6_node *root, *node;
struct rt6_info *leaf; struct fib6_info *leaf;
enum fib6_walk_state state; enum fib6_walk_state state;
unsigned int skip; unsigned int skip;
unsigned int count; unsigned int count;
...@@ -435,7 +435,7 @@ typedef struct rt6_info *(*pol_lookup_t)(struct net *, ...@@ -435,7 +435,7 @@ typedef struct rt6_info *(*pol_lookup_t)(struct net *,
struct fib6_entry_notifier_info { struct fib6_entry_notifier_info {
struct fib_notifier_info info; /* must be first */ struct fib_notifier_info info; /* must be first */
struct rt6_info *rt; struct fib6_info *rt;
}; };
/* /*
...@@ -457,14 +457,14 @@ struct fib6_node *fib6_locate(struct fib6_node *root, ...@@ -457,14 +457,14 @@ struct fib6_node *fib6_locate(struct fib6_node *root,
const struct in6_addr *saddr, int src_len, const struct in6_addr *saddr, int src_len,
bool exact_match); bool exact_match);
void fib6_clean_all(struct net *net, int (*func)(struct rt6_info *, void *arg), void fib6_clean_all(struct net *net, int (*func)(struct fib6_info *, void *arg),
void *arg); void *arg);
int fib6_add(struct fib6_node *root, struct rt6_info *rt, int fib6_add(struct fib6_node *root, struct fib6_info *rt,
struct nl_info *info, struct netlink_ext_ack *extack); struct nl_info *info, struct netlink_ext_ack *extack);
int fib6_del(struct rt6_info *rt, struct nl_info *info); int fib6_del(struct fib6_info *rt, struct nl_info *info);
void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info, void inet6_rt_notify(int event, struct fib6_info *rt, struct nl_info *info,
unsigned int flags); unsigned int flags);
void fib6_run_gc(unsigned long expires, struct net *net, bool force); void fib6_run_gc(unsigned long expires, struct net *net, bool force);
...@@ -487,11 +487,11 @@ void __net_exit fib6_notifier_exit(struct net *net); ...@@ -487,11 +487,11 @@ void __net_exit fib6_notifier_exit(struct net *net);
unsigned int fib6_tables_seq_read(struct net *net); unsigned int fib6_tables_seq_read(struct net *net);
int fib6_tables_dump(struct net *net, struct notifier_block *nb); int fib6_tables_dump(struct net *net, struct notifier_block *nb);
void fib6_update_sernum(struct net *net, struct rt6_info *rt); void fib6_update_sernum(struct net *net, struct fib6_info *rt);
void fib6_update_sernum_upto_root(struct net *net, struct rt6_info *rt); void fib6_update_sernum_upto_root(struct net *net, struct fib6_info *rt);
void fib6_metric_set(struct rt6_info *f6i, int metric, u32 val); void fib6_metric_set(struct fib6_info *f6i, int metric, u32 val);
static inline bool fib6_metric_locked(struct rt6_info *f6i, int metric) static inline bool fib6_metric_locked(struct fib6_info *f6i, int metric)
{ {
return !!(f6i->fib6_metrics->metrics[RTAX_LOCK - 1] & (1 << metric)); return !!(f6i->fib6_metrics->metrics[RTAX_LOCK - 1] & (1 << metric));
} }
......
...@@ -66,7 +66,7 @@ static inline bool rt6_need_strict(const struct in6_addr *daddr) ...@@ -66,7 +66,7 @@ static inline bool rt6_need_strict(const struct in6_addr *daddr)
(IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL | IPV6_ADDR_LOOPBACK); (IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL | IPV6_ADDR_LOOPBACK);
} }
static inline bool rt6_qualify_for_ecmp(const struct rt6_info *rt) static inline bool rt6_qualify_for_ecmp(const struct fib6_info *rt)
{ {
return (rt->rt6i_flags & (RTF_GATEWAY|RTF_ADDRCONF|RTF_DYNAMIC)) == return (rt->rt6i_flags & (RTF_GATEWAY|RTF_ADDRCONF|RTF_DYNAMIC)) ==
RTF_GATEWAY; RTF_GATEWAY;
...@@ -102,14 +102,14 @@ int ipv6_route_ioctl(struct net *net, unsigned int cmd, void __user *arg); ...@@ -102,14 +102,14 @@ int ipv6_route_ioctl(struct net *net, unsigned int cmd, void __user *arg);
int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags, int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
int ip6_ins_rt(struct net *net, struct rt6_info *rt); int ip6_ins_rt(struct net *net, struct fib6_info *rt);
int ip6_del_rt(struct net *net, struct rt6_info *rt); int ip6_del_rt(struct net *net, struct fib6_info *rt);
void rt6_flush_exceptions(struct rt6_info *rt); void rt6_flush_exceptions(struct fib6_info *rt);
void rt6_age_exceptions(struct rt6_info *rt, struct fib6_gc_args *gc_args, void rt6_age_exceptions(struct fib6_info *rt, struct fib6_gc_args *gc_args,
unsigned long now); unsigned long now);
static inline int ip6_route_get_saddr(struct net *net, struct rt6_info *rt, static inline int ip6_route_get_saddr(struct net *net, struct fib6_info *rt,
const struct in6_addr *daddr, const struct in6_addr *daddr,
unsigned int prefs, unsigned int prefs,
struct in6_addr *saddr) struct in6_addr *saddr)
...@@ -136,9 +136,9 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, struct flowi6 *fl6); ...@@ -136,9 +136,9 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, struct flowi6 *fl6);
void fib6_force_start_gc(struct net *net); void fib6_force_start_gc(struct net *net);
struct rt6_info *addrconf_dst_alloc(struct net *net, struct inet6_dev *idev, struct fib6_info *addrconf_dst_alloc(struct net *net, struct inet6_dev *idev,
const struct in6_addr *addr, bool anycast, const struct in6_addr *addr, bool anycast,
gfp_t gfp_flags); gfp_t gfp_flags);
struct rt6_info *ip6_dst_alloc(struct net *net, struct net_device *dev, struct rt6_info *ip6_dst_alloc(struct net *net, struct net_device *dev,
int flags); int flags);
...@@ -147,10 +147,10 @@ struct rt6_info *ip6_dst_alloc(struct net *net, struct net_device *dev, ...@@ -147,10 +147,10 @@ struct rt6_info *ip6_dst_alloc(struct net *net, struct net_device *dev,
* support functions for ND * support functions for ND
* *
*/ */
struct rt6_info *rt6_get_dflt_router(struct net *net, struct fib6_info *rt6_get_dflt_router(struct net *net,
const struct in6_addr *addr, const struct in6_addr *addr,
struct net_device *dev); struct net_device *dev);
struct rt6_info *rt6_add_dflt_router(struct net *net, struct fib6_info *rt6_add_dflt_router(struct net *net,
const struct in6_addr *gwaddr, const struct in6_addr *gwaddr,
struct net_device *dev, unsigned int pref); struct net_device *dev, unsigned int pref);
...@@ -176,14 +176,14 @@ struct rt6_rtnl_dump_arg { ...@@ -176,14 +176,14 @@ struct rt6_rtnl_dump_arg {
struct net *net; struct net *net;
}; };
int rt6_dump_route(struct rt6_info *rt, void *p_arg); int rt6_dump_route(struct fib6_info *rt, void *p_arg);
void rt6_mtu_change(struct net_device *dev, unsigned int mtu); void rt6_mtu_change(struct net_device *dev, unsigned int mtu);
void rt6_remove_prefsrc(struct inet6_ifaddr *ifp); void rt6_remove_prefsrc(struct inet6_ifaddr *ifp);
void rt6_clean_tohost(struct net *net, struct in6_addr *gateway); void rt6_clean_tohost(struct net *net, struct in6_addr *gateway);
void rt6_sync_up(struct net_device *dev, unsigned int nh_flags); void rt6_sync_up(struct net_device *dev, unsigned int nh_flags);
void rt6_disable_ip(struct net_device *dev, unsigned long event); void rt6_disable_ip(struct net_device *dev, unsigned long event);
void rt6_sync_down_dev(struct net_device *dev, unsigned long event); void rt6_sync_down_dev(struct net_device *dev, unsigned long event);
void rt6_multipath_rebalance(struct rt6_info *rt); void rt6_multipath_rebalance(struct fib6_info *rt);
void rt6_uncached_list_add(struct rt6_info *rt); void rt6_uncached_list_add(struct rt6_info *rt);
void rt6_uncached_list_del(struct rt6_info *rt); void rt6_uncached_list_del(struct rt6_info *rt);
...@@ -271,7 +271,7 @@ static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt, ...@@ -271,7 +271,7 @@ static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt,
return daddr; return daddr;
} }
static inline bool rt6_duplicate_nexthop(struct rt6_info *a, struct rt6_info *b) static inline bool rt6_duplicate_nexthop(struct fib6_info *a, struct fib6_info *b)
{ {
return a->fib6_nh.nh_dev == b->fib6_nh.nh_dev && return a->fib6_nh.nh_dev == b->fib6_nh.nh_dev &&
a->rt6i_idev == b->rt6i_idev && a->rt6i_idev == b->rt6i_idev &&
......
...@@ -60,7 +60,7 @@ struct netns_ipv6 { ...@@ -60,7 +60,7 @@ struct netns_ipv6 {
#endif #endif
struct xt_table *ip6table_nat; struct xt_table *ip6table_nat;
#endif #endif
struct rt6_info *fib6_null_entry; struct fib6_info *fib6_null_entry;
struct rt6_info *ip6_null_entry; struct rt6_info *ip6_null_entry;
struct rt6_statistics *rt6_stats; struct rt6_statistics *rt6_stats;
struct timer_list ip6_fib_timer; struct timer_list ip6_fib_timer;
......
...@@ -170,7 +170,7 @@ static void addrconf_type_change(struct net_device *dev, ...@@ -170,7 +170,7 @@ static void addrconf_type_change(struct net_device *dev,
unsigned long event); unsigned long event);
static int addrconf_ifdown(struct net_device *dev, int how); static int addrconf_ifdown(struct net_device *dev, int how);
static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx, static struct fib6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
int plen, int plen,
const struct net_device *dev, const struct net_device *dev,
u32 flags, u32 noflags); u32 flags, u32 noflags);
...@@ -994,7 +994,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, ...@@ -994,7 +994,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
gfp_t gfp_flags = can_block ? GFP_KERNEL : GFP_ATOMIC; gfp_t gfp_flags = can_block ? GFP_KERNEL : GFP_ATOMIC;
struct net *net = dev_net(idev->dev); struct net *net = dev_net(idev->dev);
struct inet6_ifaddr *ifa = NULL; struct inet6_ifaddr *ifa = NULL;
struct rt6_info *rt = NULL; struct fib6_info *rt = NULL;
int err = 0; int err = 0;
int addr_type = ipv6_addr_type(addr); int addr_type = ipv6_addr_type(addr);
...@@ -1178,7 +1178,7 @@ check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires) ...@@ -1178,7 +1178,7 @@ check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires)
static void static void
cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, bool del_rt) cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, bool del_rt)
{ {
struct rt6_info *rt; struct fib6_info *rt;
rt = addrconf_get_prefix_route(&ifp->addr, rt = addrconf_get_prefix_route(&ifp->addr,
ifp->prefix_len, ifp->prefix_len,
...@@ -2348,13 +2348,13 @@ addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev, ...@@ -2348,13 +2348,13 @@ addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev,
} }
static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx, static struct fib6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
int plen, int plen,
const struct net_device *dev, const struct net_device *dev,
u32 flags, u32 noflags) u32 flags, u32 noflags)
{ {
struct fib6_node *fn; struct fib6_node *fn;
struct rt6_info *rt = NULL; struct fib6_info *rt = NULL;
struct fib6_table *table; struct fib6_table *table;
u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_PREFIX; u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_PREFIX;
...@@ -2641,7 +2641,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao) ...@@ -2641,7 +2641,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao)
*/ */
if (pinfo->onlink) { if (pinfo->onlink) {
struct rt6_info *rt; struct fib6_info *rt;
unsigned long rt_expires; unsigned long rt_expires;
/* Avoid arithmetic overflow. Really, we could /* Avoid arithmetic overflow. Really, we could
...@@ -3346,7 +3346,7 @@ static int fixup_permanent_addr(struct net *net, ...@@ -3346,7 +3346,7 @@ static int fixup_permanent_addr(struct net *net,
* case regenerate the host route. * case regenerate the host route.
*/ */
if (!ifp->rt || !ifp->rt->rt6i_node) { if (!ifp->rt || !ifp->rt->rt6i_node) {
struct rt6_info *rt, *prev; struct fib6_info *rt, *prev;
rt = addrconf_dst_alloc(net, idev, &ifp->addr, false, rt = addrconf_dst_alloc(net, idev, &ifp->addr, false,
GFP_ATOMIC); GFP_ATOMIC);
...@@ -3713,7 +3713,7 @@ static int addrconf_ifdown(struct net_device *dev, int how) ...@@ -3713,7 +3713,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
keep_addr = (!how && _keep_addr > 0 && !idev->cnf.disable_ipv6); keep_addr = (!how && _keep_addr > 0 && !idev->cnf.disable_ipv6);
list_for_each_entry_safe(ifa, tmp, &idev->addr_list, if_list) { list_for_each_entry_safe(ifa, tmp, &idev->addr_list, if_list) {
struct rt6_info *rt = NULL; struct fib6_info *rt = NULL;
bool keep; bool keep;
addrconf_del_dad_work(ifa); addrconf_del_dad_work(ifa);
...@@ -5626,7 +5626,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) ...@@ -5626,7 +5626,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
addrconf_leave_anycast(ifp); addrconf_leave_anycast(ifp);
addrconf_leave_solict(ifp->idev, &ifp->addr); addrconf_leave_solict(ifp->idev, &ifp->addr);
if (!ipv6_addr_any(&ifp->peer_addr)) { if (!ipv6_addr_any(&ifp->peer_addr)) {
struct rt6_info *rt; struct fib6_info *rt;
rt = addrconf_get_prefix_route(&ifp->peer_addr, 128, rt = addrconf_get_prefix_route(&ifp->peer_addr, 128,
ifp->idev->dev, 0, 0); ifp->idev->dev, 0, 0);
...@@ -5982,7 +5982,7 @@ void addrconf_disable_policy_idev(struct inet6_dev *idev, int val) ...@@ -5982,7 +5982,7 @@ void addrconf_disable_policy_idev(struct inet6_dev *idev, int val)
list_for_each_entry(ifa, &idev->addr_list, if_list) { list_for_each_entry(ifa, &idev->addr_list, if_list) {
spin_lock(&ifa->lock); spin_lock(&ifa->lock);
if (ifa->rt) { if (ifa->rt) {
struct rt6_info *rt = ifa->rt; struct fib6_info *rt = ifa->rt;
int cpu; int cpu;
rcu_read_lock(); rcu_read_lock();
......
...@@ -218,7 +218,7 @@ static void aca_put(struct ifacaddr6 *ac) ...@@ -218,7 +218,7 @@ static void aca_put(struct ifacaddr6 *ac)
} }
} }
static struct ifacaddr6 *aca_alloc(struct rt6_info *rt, static struct ifacaddr6 *aca_alloc(struct fib6_info *rt,
const struct in6_addr *addr) const struct in6_addr *addr)
{ {
struct inet6_dev *idev = rt->rt6i_idev; struct inet6_dev *idev = rt->rt6i_idev;
...@@ -247,7 +247,7 @@ static struct ifacaddr6 *aca_alloc(struct rt6_info *rt, ...@@ -247,7 +247,7 @@ static struct ifacaddr6 *aca_alloc(struct rt6_info *rt,
int __ipv6_dev_ac_inc(struct inet6_dev *idev, const struct in6_addr *addr) int __ipv6_dev_ac_inc(struct inet6_dev *idev, const struct in6_addr *addr)
{ {
struct ifacaddr6 *aca; struct ifacaddr6 *aca;
struct rt6_info *rt; struct fib6_info *rt;
struct net *net; struct net *net;
int err; int err;
......
...@@ -43,7 +43,7 @@ static struct kmem_cache *fib6_node_kmem __read_mostly; ...@@ -43,7 +43,7 @@ static struct kmem_cache *fib6_node_kmem __read_mostly;
struct fib6_cleaner { struct fib6_cleaner {
struct fib6_walker w; struct fib6_walker w;
struct net *net; struct net *net;
int (*func)(struct rt6_info *, void *arg); int (*func)(struct fib6_info *, void *arg);
int sernum; int sernum;
void *arg; void *arg;
}; };
...@@ -54,7 +54,7 @@ struct fib6_cleaner { ...@@ -54,7 +54,7 @@ struct fib6_cleaner {
#define FWS_INIT FWS_L #define FWS_INIT FWS_L
#endif #endif
static struct rt6_info *fib6_find_prefix(struct net *net, static struct fib6_info *fib6_find_prefix(struct net *net,
struct fib6_table *table, struct fib6_table *table,
struct fib6_node *fn); struct fib6_node *fn);
static struct fib6_node *fib6_repair_tree(struct net *net, static struct fib6_node *fib6_repair_tree(struct net *net,
...@@ -105,7 +105,7 @@ enum { ...@@ -105,7 +105,7 @@ enum {
FIB6_NO_SERNUM_CHANGE = 0, FIB6_NO_SERNUM_CHANGE = 0,
}; };
void fib6_update_sernum(struct net *net, struct rt6_info *rt) void fib6_update_sernum(struct net *net, struct fib6_info *rt)
{ {
struct fib6_node *fn; struct fib6_node *fn;
...@@ -145,9 +145,9 @@ static __be32 addr_bit_set(const void *token, int fn_bit) ...@@ -145,9 +145,9 @@ static __be32 addr_bit_set(const void *token, int fn_bit)
addr[fn_bit >> 5]; addr[fn_bit >> 5];
} }
struct rt6_info *fib6_info_alloc(gfp_t gfp_flags) struct fib6_info *fib6_info_alloc(gfp_t gfp_flags)
{ {
struct rt6_info *f6i; struct fib6_info *f6i;
f6i = kzalloc(sizeof(*f6i), gfp_flags); f6i = kzalloc(sizeof(*f6i), gfp_flags);
if (!f6i) if (!f6i)
...@@ -167,7 +167,7 @@ struct rt6_info *fib6_info_alloc(gfp_t gfp_flags) ...@@ -167,7 +167,7 @@ struct rt6_info *fib6_info_alloc(gfp_t gfp_flags)
return f6i; return f6i;
} }
void fib6_info_destroy(struct rt6_info *f6i) void fib6_info_destroy(struct fib6_info *f6i)
{ {
struct rt6_exception_bucket *bucket; struct rt6_exception_bucket *bucket;
struct dst_metrics *m; struct dst_metrics *m;
...@@ -404,7 +404,7 @@ unsigned int fib6_tables_seq_read(struct net *net) ...@@ -404,7 +404,7 @@ unsigned int fib6_tables_seq_read(struct net *net)
static int call_fib6_entry_notifier(struct notifier_block *nb, struct net *net, static int call_fib6_entry_notifier(struct notifier_block *nb, struct net *net,
enum fib_event_type event_type, enum fib_event_type event_type,
struct rt6_info *rt) struct fib6_info *rt)
{ {
struct fib6_entry_notifier_info info = { struct fib6_entry_notifier_info info = {
.rt = rt, .rt = rt,
...@@ -415,7 +415,7 @@ static int call_fib6_entry_notifier(struct notifier_block *nb, struct net *net, ...@@ -415,7 +415,7 @@ static int call_fib6_entry_notifier(struct notifier_block *nb, struct net *net,
static int call_fib6_entry_notifiers(struct net *net, static int call_fib6_entry_notifiers(struct net *net,
enum fib_event_type event_type, enum fib_event_type event_type,
struct rt6_info *rt, struct fib6_info *rt,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct fib6_entry_notifier_info info = { struct fib6_entry_notifier_info info = {
...@@ -432,7 +432,7 @@ struct fib6_dump_arg { ...@@ -432,7 +432,7 @@ struct fib6_dump_arg {
struct notifier_block *nb; struct notifier_block *nb;
}; };
static void fib6_rt_dump(struct rt6_info *rt, struct fib6_dump_arg *arg) static void fib6_rt_dump(struct fib6_info *rt, struct fib6_dump_arg *arg)
{ {
if (rt == arg->net->ipv6.fib6_null_entry) if (rt == arg->net->ipv6.fib6_null_entry)
return; return;
...@@ -441,7 +441,7 @@ static void fib6_rt_dump(struct rt6_info *rt, struct fib6_dump_arg *arg) ...@@ -441,7 +441,7 @@ static void fib6_rt_dump(struct rt6_info *rt, struct fib6_dump_arg *arg)
static int fib6_node_dump(struct fib6_walker *w) static int fib6_node_dump(struct fib6_walker *w)
{ {
struct rt6_info *rt; struct fib6_info *rt;
for_each_fib6_walker_rt(w) for_each_fib6_walker_rt(w)
fib6_rt_dump(rt, w->args); fib6_rt_dump(rt, w->args);
...@@ -490,7 +490,7 @@ int fib6_tables_dump(struct net *net, struct notifier_block *nb) ...@@ -490,7 +490,7 @@ int fib6_tables_dump(struct net *net, struct notifier_block *nb)
static int fib6_dump_node(struct fib6_walker *w) static int fib6_dump_node(struct fib6_walker *w)
{ {
int res; int res;
struct rt6_info *rt; struct fib6_info *rt;
for_each_fib6_walker_rt(w) { for_each_fib6_walker_rt(w) {
res = rt6_dump_route(rt, w->args); res = rt6_dump_route(rt, w->args);
...@@ -507,7 +507,7 @@ static int fib6_dump_node(struct fib6_walker *w) ...@@ -507,7 +507,7 @@ static int fib6_dump_node(struct fib6_walker *w)
*/ */
if (rt->rt6i_nsiblings) if (rt->rt6i_nsiblings)
rt = list_last_entry(&rt->rt6i_siblings, rt = list_last_entry(&rt->rt6i_siblings,
struct rt6_info, struct fib6_info,
rt6i_siblings); rt6i_siblings);
} }
w->leaf = NULL; w->leaf = NULL;
...@@ -643,7 +643,7 @@ static int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) ...@@ -643,7 +643,7 @@ static int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
return res; return res;
} }
void fib6_metric_set(struct rt6_info *f6i, int metric, u32 val) void fib6_metric_set(struct fib6_info *f6i, int metric, u32 val)
{ {
if (!f6i) if (!f6i)
return; return;
...@@ -690,7 +690,7 @@ static struct fib6_node *fib6_add_1(struct net *net, ...@@ -690,7 +690,7 @@ static struct fib6_node *fib6_add_1(struct net *net,
fn = root; fn = root;
do { do {
struct rt6_info *leaf = rcu_dereference_protected(fn->leaf, struct fib6_info *leaf = rcu_dereference_protected(fn->leaf,
lockdep_is_held(&table->tb6_lock)); lockdep_is_held(&table->tb6_lock));
key = (struct rt6key *)((u8 *)leaf + offset); key = (struct rt6key *)((u8 *)leaf + offset);
...@@ -884,7 +884,7 @@ static struct fib6_node *fib6_add_1(struct net *net, ...@@ -884,7 +884,7 @@ static struct fib6_node *fib6_add_1(struct net *net,
return ln; return ln;
} }
static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn, static void fib6_purge_rt(struct fib6_info *rt, struct fib6_node *fn,
struct net *net) struct net *net)
{ {
struct fib6_table *table = rt->rt6i_table; struct fib6_table *table = rt->rt6i_table;
...@@ -897,9 +897,9 @@ static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn, ...@@ -897,9 +897,9 @@ static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn,
* to still alive ones. * to still alive ones.
*/ */
while (fn) { while (fn) {
struct rt6_info *leaf = rcu_dereference_protected(fn->leaf, struct fib6_info *leaf = rcu_dereference_protected(fn->leaf,
lockdep_is_held(&table->tb6_lock)); lockdep_is_held(&table->tb6_lock));
struct rt6_info *new_leaf; struct fib6_info *new_leaf;
if (!(fn->fn_flags & RTN_RTINFO) && leaf == rt) { if (!(fn->fn_flags & RTN_RTINFO) && leaf == rt) {
new_leaf = fib6_find_prefix(net, table, fn); new_leaf = fib6_find_prefix(net, table, fn);
atomic_inc(&new_leaf->rt6i_ref); atomic_inc(&new_leaf->rt6i_ref);
...@@ -936,15 +936,15 @@ static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn, ...@@ -936,15 +936,15 @@ static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn,
* Insert routing information in a node. * Insert routing information in a node.
*/ */
static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt,
struct nl_info *info, struct nl_info *info,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct rt6_info *leaf = rcu_dereference_protected(fn->leaf, struct fib6_info *leaf = rcu_dereference_protected(fn->leaf,
lockdep_is_held(&rt->rt6i_table->tb6_lock)); lockdep_is_held(&rt->rt6i_table->tb6_lock));
struct rt6_info *iter = NULL; struct fib6_info *iter = NULL;
struct rt6_info __rcu **ins; struct fib6_info __rcu **ins;
struct rt6_info __rcu **fallback_ins = NULL; struct fib6_info __rcu **fallback_ins = NULL;
int replace = (info->nlh && int replace = (info->nlh &&
(info->nlh->nlmsg_flags & NLM_F_REPLACE)); (info->nlh->nlmsg_flags & NLM_F_REPLACE));
int add = (!info->nlh || int add = (!info->nlh ||
...@@ -1035,7 +1035,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, ...@@ -1035,7 +1035,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
/* Link this route to others same route. */ /* Link this route to others same route. */
if (rt->rt6i_nsiblings) { if (rt->rt6i_nsiblings) {
unsigned int rt6i_nsiblings; unsigned int rt6i_nsiblings;
struct rt6_info *sibling, *temp_sibling; struct fib6_info *sibling, *temp_sibling;
/* Find the first route that have the same metric */ /* Find the first route that have the same metric */
sibling = leaf; sibling = leaf;
...@@ -1156,7 +1156,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, ...@@ -1156,7 +1156,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
return 0; return 0;
} }
static void fib6_start_gc(struct net *net, struct rt6_info *rt) static void fib6_start_gc(struct net *net, struct fib6_info *rt)
{ {
if (!timer_pending(&net->ipv6.ip6_fib_timer) && if (!timer_pending(&net->ipv6.ip6_fib_timer) &&
(rt->rt6i_flags & RTF_EXPIRES)) (rt->rt6i_flags & RTF_EXPIRES))
...@@ -1171,7 +1171,7 @@ void fib6_force_start_gc(struct net *net) ...@@ -1171,7 +1171,7 @@ void fib6_force_start_gc(struct net *net)
jiffies + net->ipv6.sysctl.ip6_rt_gc_interval); jiffies + net->ipv6.sysctl.ip6_rt_gc_interval);
} }
static void __fib6_update_sernum_upto_root(struct rt6_info *rt, static void __fib6_update_sernum_upto_root(struct fib6_info *rt,
int sernum) int sernum)
{ {
struct fib6_node *fn = rcu_dereference_protected(rt->rt6i_node, struct fib6_node *fn = rcu_dereference_protected(rt->rt6i_node,
...@@ -1186,7 +1186,7 @@ static void __fib6_update_sernum_upto_root(struct rt6_info *rt, ...@@ -1186,7 +1186,7 @@ static void __fib6_update_sernum_upto_root(struct rt6_info *rt,
} }
} }
void fib6_update_sernum_upto_root(struct net *net, struct rt6_info *rt) void fib6_update_sernum_upto_root(struct net *net, struct fib6_info *rt)
{ {
__fib6_update_sernum_upto_root(rt, fib6_new_sernum(net)); __fib6_update_sernum_upto_root(rt, fib6_new_sernum(net));
} }
...@@ -1198,7 +1198,7 @@ void fib6_update_sernum_upto_root(struct net *net, struct rt6_info *rt) ...@@ -1198,7 +1198,7 @@ void fib6_update_sernum_upto_root(struct net *net, struct rt6_info *rt)
* Need to own table->tb6_lock * Need to own table->tb6_lock
*/ */
int fib6_add(struct fib6_node *root, struct rt6_info *rt, int fib6_add(struct fib6_node *root, struct fib6_info *rt,
struct nl_info *info, struct netlink_ext_ack *extack) struct nl_info *info, struct netlink_ext_ack *extack)
{ {
struct fib6_table *table = rt->rt6i_table; struct fib6_table *table = rt->rt6i_table;
...@@ -1219,7 +1219,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, ...@@ -1219,7 +1219,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt,
fn = fib6_add_1(info->nl_net, table, root, fn = fib6_add_1(info->nl_net, table, root,
&rt->rt6i_dst.addr, rt->rt6i_dst.plen, &rt->rt6i_dst.addr, rt->rt6i_dst.plen,
offsetof(struct rt6_info, rt6i_dst), allow_create, offsetof(struct fib6_info, rt6i_dst), allow_create,
replace_required, extack); replace_required, extack);
if (IS_ERR(fn)) { if (IS_ERR(fn)) {
err = PTR_ERR(fn); err = PTR_ERR(fn);
...@@ -1260,7 +1260,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, ...@@ -1260,7 +1260,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt,
sn = fib6_add_1(info->nl_net, table, sfn, sn = fib6_add_1(info->nl_net, table, sfn,
&rt->rt6i_src.addr, rt->rt6i_src.plen, &rt->rt6i_src.addr, rt->rt6i_src.plen,
offsetof(struct rt6_info, rt6i_src), offsetof(struct fib6_info, rt6i_src),
allow_create, replace_required, extack); allow_create, replace_required, extack);
if (IS_ERR(sn)) { if (IS_ERR(sn)) {
...@@ -1279,7 +1279,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, ...@@ -1279,7 +1279,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt,
} else { } else {
sn = fib6_add_1(info->nl_net, table, FIB6_SUBTREE(fn), sn = fib6_add_1(info->nl_net, table, FIB6_SUBTREE(fn),
&rt->rt6i_src.addr, rt->rt6i_src.plen, &rt->rt6i_src.addr, rt->rt6i_src.plen,
offsetof(struct rt6_info, rt6i_src), offsetof(struct fib6_info, rt6i_src),
allow_create, replace_required, extack); allow_create, replace_required, extack);
if (IS_ERR(sn)) { if (IS_ERR(sn)) {
...@@ -1316,7 +1316,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, ...@@ -1316,7 +1316,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt,
* super-tree leaf node we have to find a new one for it. * super-tree leaf node we have to find a new one for it.
*/ */
if (pn != fn) { if (pn != fn) {
struct rt6_info *pn_leaf = struct fib6_info *pn_leaf =
rcu_dereference_protected(pn->leaf, rcu_dereference_protected(pn->leaf,
lockdep_is_held(&table->tb6_lock)); lockdep_is_held(&table->tb6_lock));
if (pn_leaf == rt) { if (pn_leaf == rt) {
...@@ -1365,7 +1365,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, ...@@ -1365,7 +1365,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt,
*/ */
struct lookup_args { struct lookup_args {
int offset; /* key offset on rt6_info */ int offset; /* key offset on fib6_info */
const struct in6_addr *addr; /* search key */ const struct in6_addr *addr; /* search key */
}; };
...@@ -1403,7 +1403,7 @@ static struct fib6_node *fib6_lookup_1(struct fib6_node *root, ...@@ -1403,7 +1403,7 @@ static struct fib6_node *fib6_lookup_1(struct fib6_node *root,
struct fib6_node *subtree = FIB6_SUBTREE(fn); struct fib6_node *subtree = FIB6_SUBTREE(fn);
if (subtree || fn->fn_flags & RTN_RTINFO) { if (subtree || fn->fn_flags & RTN_RTINFO) {
struct rt6_info *leaf = rcu_dereference(fn->leaf); struct fib6_info *leaf = rcu_dereference(fn->leaf);
struct rt6key *key; struct rt6key *key;
if (!leaf) if (!leaf)
...@@ -1443,12 +1443,12 @@ struct fib6_node *fib6_lookup(struct fib6_node *root, const struct in6_addr *dad ...@@ -1443,12 +1443,12 @@ struct fib6_node *fib6_lookup(struct fib6_node *root, const struct in6_addr *dad
struct fib6_node *fn; struct fib6_node *fn;
struct lookup_args args[] = { struct lookup_args args[] = {
{ {
.offset = offsetof(struct rt6_info, rt6i_dst), .offset = offsetof(struct fib6_info, rt6i_dst),
.addr = daddr, .addr = daddr,
}, },
#ifdef CONFIG_IPV6_SUBTREES #ifdef CONFIG_IPV6_SUBTREES
{ {
.offset = offsetof(struct rt6_info, rt6i_src), .offset = offsetof(struct fib6_info, rt6i_src),
.addr = saddr, .addr = saddr,
}, },
#endif #endif
...@@ -1484,7 +1484,7 @@ static struct fib6_node *fib6_locate_1(struct fib6_node *root, ...@@ -1484,7 +1484,7 @@ static struct fib6_node *fib6_locate_1(struct fib6_node *root,
struct fib6_node *fn, *prev = NULL; struct fib6_node *fn, *prev = NULL;
for (fn = root; fn ; ) { for (fn = root; fn ; ) {
struct rt6_info *leaf = rcu_dereference(fn->leaf); struct fib6_info *leaf = rcu_dereference(fn->leaf);
struct rt6key *key; struct rt6key *key;
/* This node is being deleted */ /* This node is being deleted */
...@@ -1533,7 +1533,7 @@ struct fib6_node *fib6_locate(struct fib6_node *root, ...@@ -1533,7 +1533,7 @@ struct fib6_node *fib6_locate(struct fib6_node *root,
struct fib6_node *fn; struct fib6_node *fn;
fn = fib6_locate_1(root, daddr, dst_len, fn = fib6_locate_1(root, daddr, dst_len,
offsetof(struct rt6_info, rt6i_dst), offsetof(struct fib6_info, rt6i_dst),
exact_match); exact_match);
#ifdef CONFIG_IPV6_SUBTREES #ifdef CONFIG_IPV6_SUBTREES
...@@ -1544,7 +1544,7 @@ struct fib6_node *fib6_locate(struct fib6_node *root, ...@@ -1544,7 +1544,7 @@ struct fib6_node *fib6_locate(struct fib6_node *root,
if (subtree) { if (subtree) {
fn = fib6_locate_1(subtree, saddr, src_len, fn = fib6_locate_1(subtree, saddr, src_len,
offsetof(struct rt6_info, rt6i_src), offsetof(struct fib6_info, rt6i_src),
exact_match); exact_match);
} }
} }
...@@ -1563,7 +1563,7 @@ struct fib6_node *fib6_locate(struct fib6_node *root, ...@@ -1563,7 +1563,7 @@ struct fib6_node *fib6_locate(struct fib6_node *root,
* *
*/ */
static struct rt6_info *fib6_find_prefix(struct net *net, static struct fib6_info *fib6_find_prefix(struct net *net,
struct fib6_table *table, struct fib6_table *table,
struct fib6_node *fn) struct fib6_node *fn)
{ {
...@@ -1622,11 +1622,11 @@ static struct fib6_node *fib6_repair_tree(struct net *net, ...@@ -1622,11 +1622,11 @@ static struct fib6_node *fib6_repair_tree(struct net *net,
lockdep_is_held(&table->tb6_lock)); lockdep_is_held(&table->tb6_lock));
struct fib6_node *pn_l = rcu_dereference_protected(pn->left, struct fib6_node *pn_l = rcu_dereference_protected(pn->left,
lockdep_is_held(&table->tb6_lock)); lockdep_is_held(&table->tb6_lock));
struct rt6_info *fn_leaf = rcu_dereference_protected(fn->leaf, struct fib6_info *fn_leaf = rcu_dereference_protected(fn->leaf,
lockdep_is_held(&table->tb6_lock)); lockdep_is_held(&table->tb6_lock));
struct rt6_info *pn_leaf = rcu_dereference_protected(pn->leaf, struct fib6_info *pn_leaf = rcu_dereference_protected(pn->leaf,
lockdep_is_held(&table->tb6_lock)); lockdep_is_held(&table->tb6_lock));
struct rt6_info *new_fn_leaf; struct fib6_info *new_fn_leaf;
RT6_TRACE("fixing tree: plen=%d iter=%d\n", fn->fn_bit, iter); RT6_TRACE("fixing tree: plen=%d iter=%d\n", fn->fn_bit, iter);
iter++; iter++;
...@@ -1717,10 +1717,10 @@ static struct fib6_node *fib6_repair_tree(struct net *net, ...@@ -1717,10 +1717,10 @@ static struct fib6_node *fib6_repair_tree(struct net *net,
} }
static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn, static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn,
struct rt6_info __rcu **rtp, struct nl_info *info) struct fib6_info __rcu **rtp, struct nl_info *info)
{ {
struct fib6_walker *w; struct fib6_walker *w;
struct rt6_info *rt = rcu_dereference_protected(*rtp, struct fib6_info *rt = rcu_dereference_protected(*rtp,
lockdep_is_held(&table->tb6_lock)); lockdep_is_held(&table->tb6_lock));
struct net *net = info->nl_net; struct net *net = info->nl_net;
...@@ -1741,7 +1741,7 @@ static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn, ...@@ -1741,7 +1741,7 @@ static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn,
/* Remove this entry from other siblings */ /* Remove this entry from other siblings */
if (rt->rt6i_nsiblings) { if (rt->rt6i_nsiblings) {
struct rt6_info *sibling, *next_sibling; struct fib6_info *sibling, *next_sibling;
list_for_each_entry_safe(sibling, next_sibling, list_for_each_entry_safe(sibling, next_sibling,
&rt->rt6i_siblings, rt6i_siblings) &rt->rt6i_siblings, rt6i_siblings)
...@@ -1785,14 +1785,14 @@ static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn, ...@@ -1785,14 +1785,14 @@ static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn,
} }
/* Need to own table->tb6_lock */ /* Need to own table->tb6_lock */
int fib6_del(struct rt6_info *rt, struct nl_info *info) int fib6_del(struct fib6_info *rt, struct nl_info *info)
{ {
struct fib6_node *fn = rcu_dereference_protected(rt->rt6i_node, struct fib6_node *fn = rcu_dereference_protected(rt->rt6i_node,
lockdep_is_held(&rt->rt6i_table->tb6_lock)); lockdep_is_held(&rt->rt6i_table->tb6_lock));
struct fib6_table *table = rt->rt6i_table; struct fib6_table *table = rt->rt6i_table;
struct net *net = info->nl_net; struct net *net = info->nl_net;
struct rt6_info __rcu **rtp; struct fib6_info __rcu **rtp;
struct rt6_info __rcu **rtp_next; struct fib6_info __rcu **rtp_next;
if (!fn || rt == net->ipv6.fib6_null_entry) if (!fn || rt == net->ipv6.fib6_null_entry)
return -ENOENT; return -ENOENT;
...@@ -1804,7 +1804,7 @@ int fib6_del(struct rt6_info *rt, struct nl_info *info) ...@@ -1804,7 +1804,7 @@ int fib6_del(struct rt6_info *rt, struct nl_info *info)
*/ */
for (rtp = &fn->leaf; *rtp; rtp = rtp_next) { for (rtp = &fn->leaf; *rtp; rtp = rtp_next) {
struct rt6_info *cur = rcu_dereference_protected(*rtp, struct fib6_info *cur = rcu_dereference_protected(*rtp,
lockdep_is_held(&table->tb6_lock)); lockdep_is_held(&table->tb6_lock));
if (rt == cur) { if (rt == cur) {
fib6_del_route(table, fn, rtp, info); fib6_del_route(table, fn, rtp, info);
...@@ -1948,7 +1948,7 @@ static int fib6_walk(struct net *net, struct fib6_walker *w) ...@@ -1948,7 +1948,7 @@ static int fib6_walk(struct net *net, struct fib6_walker *w)
static int fib6_clean_node(struct fib6_walker *w) static int fib6_clean_node(struct fib6_walker *w)
{ {
int res; int res;
struct rt6_info *rt; struct fib6_info *rt;
struct fib6_cleaner *c = container_of(w, struct fib6_cleaner, w); struct fib6_cleaner *c = container_of(w, struct fib6_cleaner, w);
struct nl_info info = { struct nl_info info = {
.nl_net = c->net, .nl_net = c->net,
...@@ -1983,7 +1983,7 @@ static int fib6_clean_node(struct fib6_walker *w) ...@@ -1983,7 +1983,7 @@ static int fib6_clean_node(struct fib6_walker *w)
if (WARN_ON(!rt->rt6i_nsiblings)) if (WARN_ON(!rt->rt6i_nsiblings))
continue; continue;
rt = list_last_entry(&rt->rt6i_siblings, rt = list_last_entry(&rt->rt6i_siblings,
struct rt6_info, rt6i_siblings); struct fib6_info, rt6i_siblings);
continue; continue;
} }
WARN_ON(res != 0); WARN_ON(res != 0);
...@@ -2002,7 +2002,7 @@ static int fib6_clean_node(struct fib6_walker *w) ...@@ -2002,7 +2002,7 @@ static int fib6_clean_node(struct fib6_walker *w)
*/ */
static void fib6_clean_tree(struct net *net, struct fib6_node *root, static void fib6_clean_tree(struct net *net, struct fib6_node *root,
int (*func)(struct rt6_info *, void *arg), int (*func)(struct fib6_info *, void *arg),
int sernum, void *arg) int sernum, void *arg)
{ {
struct fib6_cleaner c; struct fib6_cleaner c;
...@@ -2020,7 +2020,7 @@ static void fib6_clean_tree(struct net *net, struct fib6_node *root, ...@@ -2020,7 +2020,7 @@ static void fib6_clean_tree(struct net *net, struct fib6_node *root,
} }
static void __fib6_clean_all(struct net *net, static void __fib6_clean_all(struct net *net,
int (*func)(struct rt6_info *, void *), int (*func)(struct fib6_info *, void *),
int sernum, void *arg) int sernum, void *arg)
{ {
struct fib6_table *table; struct fib6_table *table;
...@@ -2040,7 +2040,7 @@ static void __fib6_clean_all(struct net *net, ...@@ -2040,7 +2040,7 @@ static void __fib6_clean_all(struct net *net,
rcu_read_unlock(); rcu_read_unlock();
} }
void fib6_clean_all(struct net *net, int (*func)(struct rt6_info *, void *), void fib6_clean_all(struct net *net, int (*func)(struct fib6_info *, void *),
void *arg) void *arg)
{ {
__fib6_clean_all(net, func, FIB6_NO_SERNUM_CHANGE, arg); __fib6_clean_all(net, func, FIB6_NO_SERNUM_CHANGE, arg);
...@@ -2057,7 +2057,7 @@ static void fib6_flush_trees(struct net *net) ...@@ -2057,7 +2057,7 @@ static void fib6_flush_trees(struct net *net)
* Garbage collection * Garbage collection
*/ */
static int fib6_age(struct rt6_info *rt, void *arg) static int fib6_age(struct fib6_info *rt, void *arg)
{ {
struct fib6_gc_args *gc_args = arg; struct fib6_gc_args *gc_args = arg;
unsigned long now = jiffies; unsigned long now = jiffies;
...@@ -2261,7 +2261,7 @@ struct ipv6_route_iter { ...@@ -2261,7 +2261,7 @@ struct ipv6_route_iter {
static int ipv6_route_seq_show(struct seq_file *seq, void *v) static int ipv6_route_seq_show(struct seq_file *seq, void *v)
{ {
struct rt6_info *rt = v; struct fib6_info *rt = v;
struct ipv6_route_iter *iter = seq->private; struct ipv6_route_iter *iter = seq->private;
const struct net_device *dev; const struct net_device *dev;
...@@ -2353,14 +2353,14 @@ static void ipv6_route_check_sernum(struct ipv6_route_iter *iter) ...@@ -2353,14 +2353,14 @@ static void ipv6_route_check_sernum(struct ipv6_route_iter *iter)
static void *ipv6_route_seq_next(struct seq_file *seq, void *v, loff_t *pos) static void *ipv6_route_seq_next(struct seq_file *seq, void *v, loff_t *pos)
{ {
int r; int r;
struct rt6_info *n; struct fib6_info *n;
struct net *net = seq_file_net(seq); struct net *net = seq_file_net(seq);
struct ipv6_route_iter *iter = seq->private; struct ipv6_route_iter *iter = seq->private;
if (!v) if (!v)
goto iter_table; goto iter_table;
n = rcu_dereference_bh(((struct rt6_info *)v)->rt6_next); n = rcu_dereference_bh(((struct fib6_info *)v)->rt6_next);
if (n) { if (n) {
++*pos; ++*pos;
return n; return n;
......
...@@ -1155,7 +1155,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) ...@@ -1155,7 +1155,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb); struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
struct neighbour *neigh = NULL; struct neighbour *neigh = NULL;
struct inet6_dev *in6_dev; struct inet6_dev *in6_dev;
struct rt6_info *rt = NULL; struct fib6_info *rt = NULL;
struct net *net; struct net *net;
int lifetime; int lifetime;
struct ndisc_options ndopts; struct ndisc_options ndopts;
......
...@@ -96,24 +96,24 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, ...@@ -96,24 +96,24 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
struct sk_buff *skb, u32 mtu); struct sk_buff *skb, u32 mtu);
static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk,
struct sk_buff *skb); struct sk_buff *skb);
static int rt6_score_route(struct rt6_info *rt, int oif, int strict); static int rt6_score_route(struct fib6_info *rt, int oif, int strict);
static size_t rt6_nlmsg_size(struct rt6_info *rt); static size_t rt6_nlmsg_size(struct fib6_info *rt);
static int rt6_fill_node(struct net *net, struct sk_buff *skb, static int rt6_fill_node(struct net *net, struct sk_buff *skb,
struct rt6_info *rt, struct dst_entry *dst, struct fib6_info *rt, struct dst_entry *dst,
struct in6_addr *dest, struct in6_addr *src, struct in6_addr *dest, struct in6_addr *src,
int iif, int type, u32 portid, u32 seq, int iif, int type, u32 portid, u32 seq,
unsigned int flags); unsigned int flags);
static struct rt6_info *rt6_find_cached_rt(struct rt6_info *rt, static struct rt6_info *rt6_find_cached_rt(struct fib6_info *rt,
struct in6_addr *daddr, struct in6_addr *daddr,
struct in6_addr *saddr); struct in6_addr *saddr);
#ifdef CONFIG_IPV6_ROUTE_INFO #ifdef CONFIG_IPV6_ROUTE_INFO
static struct rt6_info *rt6_add_route_info(struct net *net, static struct fib6_info *rt6_add_route_info(struct net *net,
const struct in6_addr *prefix, int prefixlen, const struct in6_addr *prefix, int prefixlen,
const struct in6_addr *gwaddr, const struct in6_addr *gwaddr,
struct net_device *dev, struct net_device *dev,
unsigned int pref); unsigned int pref);
static struct rt6_info *rt6_get_route_info(struct net *net, static struct fib6_info *rt6_get_route_info(struct net *net,
const struct in6_addr *prefix, int prefixlen, const struct in6_addr *prefix, int prefixlen,
const struct in6_addr *gwaddr, const struct in6_addr *gwaddr,
struct net_device *dev); struct net_device *dev);
...@@ -283,7 +283,7 @@ static const u32 ip6_template_metrics[RTAX_MAX] = { ...@@ -283,7 +283,7 @@ static const u32 ip6_template_metrics[RTAX_MAX] = {
[RTAX_HOPLIMIT - 1] = 0, [RTAX_HOPLIMIT - 1] = 0,
}; };
static const struct rt6_info fib6_null_entry_template = { static const struct fib6_info fib6_null_entry_template = {
.rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
.rt6i_protocol = RTPROT_KERNEL, .rt6i_protocol = RTPROT_KERNEL,
.rt6i_metric = ~(u32)0, .rt6i_metric = ~(u32)0,
...@@ -372,7 +372,7 @@ EXPORT_SYMBOL(ip6_dst_alloc); ...@@ -372,7 +372,7 @@ EXPORT_SYMBOL(ip6_dst_alloc);
static void ip6_dst_destroy(struct dst_entry *dst) static void ip6_dst_destroy(struct dst_entry *dst)
{ {
struct rt6_info *rt = (struct rt6_info *)dst; struct rt6_info *rt = (struct rt6_info *)dst;
struct rt6_info *from = rt->from; struct fib6_info *from = rt->from;
struct inet6_dev *idev; struct inet6_dev *idev;
dst_destroy_metrics_generic(dst); dst_destroy_metrics_generic(dst);
...@@ -425,13 +425,13 @@ static bool rt6_check_expired(const struct rt6_info *rt) ...@@ -425,13 +425,13 @@ static bool rt6_check_expired(const struct rt6_info *rt)
return false; return false;
} }
static struct rt6_info *rt6_multipath_select(const struct net *net, static struct fib6_info *rt6_multipath_select(const struct net *net,
struct rt6_info *match, struct fib6_info *match,
struct flowi6 *fl6, int oif, struct flowi6 *fl6, int oif,
const struct sk_buff *skb, const struct sk_buff *skb,
int strict) int strict)
{ {
struct rt6_info *sibling, *next_sibling; struct fib6_info *sibling, *next_sibling;
/* We might have already computed the hash for ICMPv6 errors. In such /* We might have already computed the hash for ICMPv6 errors. In such
* case it will always be non-zero. Otherwise now is the time to do it. * case it will always be non-zero. Otherwise now is the time to do it.
...@@ -462,14 +462,14 @@ static struct rt6_info *rt6_multipath_select(const struct net *net, ...@@ -462,14 +462,14 @@ static struct rt6_info *rt6_multipath_select(const struct net *net,
* Route lookup. rcu_read_lock() should be held. * Route lookup. rcu_read_lock() should be held.
*/ */
static inline struct rt6_info *rt6_device_match(struct net *net, static inline struct fib6_info *rt6_device_match(struct net *net,
struct rt6_info *rt, struct fib6_info *rt,
const struct in6_addr *saddr, const struct in6_addr *saddr,
int oif, int oif,
int flags) int flags)
{ {
struct rt6_info *local = NULL; struct fib6_info *local = NULL;
struct rt6_info *sprt; struct fib6_info *sprt;
if (!oif && ipv6_addr_any(saddr) && if (!oif && ipv6_addr_any(saddr) &&
!(rt->fib6_nh.nh_flags & RTNH_F_DEAD)) !(rt->fib6_nh.nh_flags & RTNH_F_DEAD))
...@@ -532,7 +532,7 @@ static void rt6_probe_deferred(struct work_struct *w) ...@@ -532,7 +532,7 @@ static void rt6_probe_deferred(struct work_struct *w)
kfree(work); kfree(work);
} }
static void rt6_probe(struct rt6_info *rt) static void rt6_probe(struct fib6_info *rt)
{ {
struct __rt6_probe_work *work; struct __rt6_probe_work *work;
const struct in6_addr *nh_gw; const struct in6_addr *nh_gw;
...@@ -585,7 +585,7 @@ static void rt6_probe(struct rt6_info *rt) ...@@ -585,7 +585,7 @@ static void rt6_probe(struct rt6_info *rt)
rcu_read_unlock_bh(); rcu_read_unlock_bh();
} }
#else #else
static inline void rt6_probe(struct rt6_info *rt) static inline void rt6_probe(struct fib6_info *rt)
{ {
} }
#endif #endif
...@@ -593,7 +593,7 @@ static inline void rt6_probe(struct rt6_info *rt) ...@@ -593,7 +593,7 @@ static inline void rt6_probe(struct rt6_info *rt)
/* /*
* Default Router Selection (RFC 2461 6.3.6) * Default Router Selection (RFC 2461 6.3.6)
*/ */
static inline int rt6_check_dev(struct rt6_info *rt, int oif) static inline int rt6_check_dev(struct fib6_info *rt, int oif)
{ {
const struct net_device *dev = rt->fib6_nh.nh_dev; const struct net_device *dev = rt->fib6_nh.nh_dev;
...@@ -605,7 +605,7 @@ static inline int rt6_check_dev(struct rt6_info *rt, int oif) ...@@ -605,7 +605,7 @@ static inline int rt6_check_dev(struct rt6_info *rt, int oif)
return 0; return 0;
} }
static inline enum rt6_nud_state rt6_check_neigh(struct rt6_info *rt) static inline enum rt6_nud_state rt6_check_neigh(struct fib6_info *rt)
{ {
enum rt6_nud_state ret = RT6_NUD_FAIL_HARD; enum rt6_nud_state ret = RT6_NUD_FAIL_HARD;
struct neighbour *neigh; struct neighbour *neigh;
...@@ -637,8 +637,7 @@ static inline enum rt6_nud_state rt6_check_neigh(struct rt6_info *rt) ...@@ -637,8 +637,7 @@ static inline enum rt6_nud_state rt6_check_neigh(struct rt6_info *rt)
return ret; return ret;
} }
static int rt6_score_route(struct rt6_info *rt, int oif, static int rt6_score_route(struct fib6_info *rt, int oif, int strict)
int strict)
{ {
int m; int m;
...@@ -656,8 +655,8 @@ static int rt6_score_route(struct rt6_info *rt, int oif, ...@@ -656,8 +655,8 @@ static int rt6_score_route(struct rt6_info *rt, int oif,
return m; return m;
} }
static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict, static struct fib6_info *find_match(struct fib6_info *rt, int oif, int strict,
int *mpri, struct rt6_info *match, int *mpri, struct fib6_info *match,
bool *do_rr) bool *do_rr)
{ {
int m; int m;
...@@ -696,13 +695,13 @@ static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict, ...@@ -696,13 +695,13 @@ static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict,
return match; return match;
} }
static struct rt6_info *find_rr_leaf(struct fib6_node *fn, static struct fib6_info *find_rr_leaf(struct fib6_node *fn,
struct rt6_info *leaf, struct fib6_info *leaf,
struct rt6_info *rr_head, struct fib6_info *rr_head,
u32 metric, int oif, int strict, u32 metric, int oif, int strict,
bool *do_rr) bool *do_rr)
{ {
struct rt6_info *rt, *match, *cont; struct fib6_info *rt, *match, *cont;
int mpri = -1; int mpri = -1;
match = NULL; match = NULL;
...@@ -735,11 +734,11 @@ static struct rt6_info *find_rr_leaf(struct fib6_node *fn, ...@@ -735,11 +734,11 @@ static struct rt6_info *find_rr_leaf(struct fib6_node *fn,
return match; return match;
} }
static struct rt6_info *rt6_select(struct net *net, struct fib6_node *fn, static struct fib6_info *rt6_select(struct net *net, struct fib6_node *fn,
int oif, int strict) int oif, int strict)
{ {
struct rt6_info *leaf = rcu_dereference(fn->leaf); struct fib6_info *leaf = rcu_dereference(fn->leaf);
struct rt6_info *match, *rt0; struct fib6_info *match, *rt0;
bool do_rr = false; bool do_rr = false;
int key_plen; int key_plen;
...@@ -767,7 +766,7 @@ static struct rt6_info *rt6_select(struct net *net, struct fib6_node *fn, ...@@ -767,7 +766,7 @@ static struct rt6_info *rt6_select(struct net *net, struct fib6_node *fn,
&do_rr); &do_rr);
if (do_rr) { if (do_rr) {
struct rt6_info *next = rcu_dereference(rt0->rt6_next); struct fib6_info *next = rcu_dereference(rt0->rt6_next);
/* no entries matched; do round-robin */ /* no entries matched; do round-robin */
if (!next || next->rt6i_metric != rt0->rt6i_metric) if (!next || next->rt6i_metric != rt0->rt6i_metric)
...@@ -785,7 +784,7 @@ static struct rt6_info *rt6_select(struct net *net, struct fib6_node *fn, ...@@ -785,7 +784,7 @@ static struct rt6_info *rt6_select(struct net *net, struct fib6_node *fn,
return match ? match : net->ipv6.fib6_null_entry; return match ? match : net->ipv6.fib6_null_entry;
} }
static bool rt6_is_gw_or_nonexthop(const struct rt6_info *rt) static bool rt6_is_gw_or_nonexthop(const struct fib6_info *rt)
{ {
return (rt->rt6i_flags & (RTF_NONEXTHOP | RTF_GATEWAY)); return (rt->rt6i_flags & (RTF_NONEXTHOP | RTF_GATEWAY));
} }
...@@ -799,7 +798,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len, ...@@ -799,7 +798,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
struct in6_addr prefix_buf, *prefix; struct in6_addr prefix_buf, *prefix;
unsigned int pref; unsigned int pref;
unsigned long lifetime; unsigned long lifetime;
struct rt6_info *rt; struct fib6_info *rt;
if (len < sizeof(struct route_info)) { if (len < sizeof(struct route_info)) {
return -EINVAL; return -EINVAL;
...@@ -871,7 +870,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len, ...@@ -871,7 +870,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
*/ */
/* called with rcu_lock held */ /* called with rcu_lock held */
static struct net_device *ip6_rt_get_dev_rcu(struct rt6_info *rt) static struct net_device *ip6_rt_get_dev_rcu(struct fib6_info *rt)
{ {
struct net_device *dev = rt->fib6_nh.nh_dev; struct net_device *dev = rt->fib6_nh.nh_dev;
...@@ -913,7 +912,7 @@ static int ip6_rt_type_to_error(u8 fib6_type) ...@@ -913,7 +912,7 @@ static int ip6_rt_type_to_error(u8 fib6_type)
return fib6_prop[fib6_type]; return fib6_prop[fib6_type];
} }
static unsigned short fib6_info_dst_flags(struct rt6_info *rt) static unsigned short fib6_info_dst_flags(struct fib6_info *rt)
{ {
unsigned short flags = 0; unsigned short flags = 0;
...@@ -927,7 +926,7 @@ static unsigned short fib6_info_dst_flags(struct rt6_info *rt) ...@@ -927,7 +926,7 @@ static unsigned short fib6_info_dst_flags(struct rt6_info *rt)
return flags; return flags;
} }
static void ip6_rt_init_dst_reject(struct rt6_info *rt, struct rt6_info *ort) static void ip6_rt_init_dst_reject(struct rt6_info *rt, struct fib6_info *ort)
{ {
rt->dst.error = ip6_rt_type_to_error(ort->fib6_type); rt->dst.error = ip6_rt_type_to_error(ort->fib6_type);
...@@ -949,7 +948,7 @@ static void ip6_rt_init_dst_reject(struct rt6_info *rt, struct rt6_info *ort) ...@@ -949,7 +948,7 @@ static void ip6_rt_init_dst_reject(struct rt6_info *rt, struct rt6_info *ort)
} }
} }
static void ip6_rt_init_dst(struct rt6_info *rt, struct rt6_info *ort) static void ip6_rt_init_dst(struct rt6_info *rt, struct fib6_info *ort)
{ {
rt->dst.flags |= fib6_info_dst_flags(ort); rt->dst.flags |= fib6_info_dst_flags(ort);
...@@ -977,7 +976,7 @@ static void ip6_rt_init_dst(struct rt6_info *rt, struct rt6_info *ort) ...@@ -977,7 +976,7 @@ static void ip6_rt_init_dst(struct rt6_info *rt, struct rt6_info *ort)
rt->dst.lastuse = jiffies; rt->dst.lastuse = jiffies;
} }
static void rt6_set_from(struct rt6_info *rt, struct rt6_info *from) static void rt6_set_from(struct rt6_info *rt, struct fib6_info *from)
{ {
rt->rt6i_flags &= ~RTF_EXPIRES; rt->rt6i_flags &= ~RTF_EXPIRES;
fib6_info_hold(from); fib6_info_hold(from);
...@@ -989,7 +988,7 @@ static void rt6_set_from(struct rt6_info *rt, struct rt6_info *from) ...@@ -989,7 +988,7 @@ static void rt6_set_from(struct rt6_info *rt, struct rt6_info *from)
} }
} }
static void ip6_rt_copy_init(struct rt6_info *rt, struct rt6_info *ort) static void ip6_rt_copy_init(struct rt6_info *rt, struct fib6_info *ort)
{ {
ip6_rt_init_dst(rt, ort); ip6_rt_init_dst(rt, ort);
...@@ -1045,7 +1044,7 @@ static bool ip6_hold_safe(struct net *net, struct rt6_info **prt, ...@@ -1045,7 +1044,7 @@ static bool ip6_hold_safe(struct net *net, struct rt6_info **prt,
} }
/* called with rcu_lock held */ /* called with rcu_lock held */
static struct rt6_info *ip6_create_rt_rcu(struct rt6_info *rt) static struct rt6_info *ip6_create_rt_rcu(struct fib6_info *rt)
{ {
unsigned short flags = fib6_info_dst_flags(rt); unsigned short flags = fib6_info_dst_flags(rt);
struct net_device *dev = rt->fib6_nh.nh_dev; struct net_device *dev = rt->fib6_nh.nh_dev;
...@@ -1064,7 +1063,7 @@ static struct rt6_info *ip6_pol_route_lookup(struct net *net, ...@@ -1064,7 +1063,7 @@ static struct rt6_info *ip6_pol_route_lookup(struct net *net,
const struct sk_buff *skb, const struct sk_buff *skb,
int flags) int flags)
{ {
struct rt6_info *f6i; struct fib6_info *f6i;
struct fib6_node *fn; struct fib6_node *fn;
struct rt6_info *rt; struct rt6_info *rt;
...@@ -1152,7 +1151,7 @@ EXPORT_SYMBOL(rt6_lookup); ...@@ -1152,7 +1151,7 @@ EXPORT_SYMBOL(rt6_lookup);
* Caller must hold dst before calling it. * Caller must hold dst before calling it.
*/ */
static int __ip6_ins_rt(struct rt6_info *rt, struct nl_info *info, static int __ip6_ins_rt(struct fib6_info *rt, struct nl_info *info,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
int err; int err;
...@@ -1166,14 +1165,14 @@ static int __ip6_ins_rt(struct rt6_info *rt, struct nl_info *info, ...@@ -1166,14 +1165,14 @@ static int __ip6_ins_rt(struct rt6_info *rt, struct nl_info *info,
return err; return err;
} }
int ip6_ins_rt(struct net *net, struct rt6_info *rt) int ip6_ins_rt(struct net *net, struct fib6_info *rt)
{ {
struct nl_info info = { .nl_net = net, }; struct nl_info info = { .nl_net = net, };
return __ip6_ins_rt(rt, &info, NULL); return __ip6_ins_rt(rt, &info, NULL);
} }
static struct rt6_info *ip6_rt_cache_alloc(struct rt6_info *ort, static struct rt6_info *ip6_rt_cache_alloc(struct fib6_info *ort,
const struct in6_addr *daddr, const struct in6_addr *daddr,
const struct in6_addr *saddr) const struct in6_addr *saddr)
{ {
...@@ -1213,7 +1212,7 @@ static struct rt6_info *ip6_rt_cache_alloc(struct rt6_info *ort, ...@@ -1213,7 +1212,7 @@ static struct rt6_info *ip6_rt_cache_alloc(struct rt6_info *ort,
return rt; return rt;
} }
static struct rt6_info *ip6_rt_pcpu_alloc(struct rt6_info *rt) static struct rt6_info *ip6_rt_pcpu_alloc(struct fib6_info *rt)
{ {
unsigned short flags = fib6_info_dst_flags(rt); unsigned short flags = fib6_info_dst_flags(rt);
struct net_device *dev; struct net_device *dev;
...@@ -1232,7 +1231,7 @@ static struct rt6_info *ip6_rt_pcpu_alloc(struct rt6_info *rt) ...@@ -1232,7 +1231,7 @@ static struct rt6_info *ip6_rt_pcpu_alloc(struct rt6_info *rt)
} }
/* It should be called with rcu_read_lock() acquired */ /* It should be called with rcu_read_lock() acquired */
static struct rt6_info *rt6_get_pcpu_route(struct rt6_info *rt) static struct rt6_info *rt6_get_pcpu_route(struct fib6_info *rt)
{ {
struct rt6_info *pcpu_rt, **p; struct rt6_info *pcpu_rt, **p;
...@@ -1246,7 +1245,7 @@ static struct rt6_info *rt6_get_pcpu_route(struct rt6_info *rt) ...@@ -1246,7 +1245,7 @@ static struct rt6_info *rt6_get_pcpu_route(struct rt6_info *rt)
} }
static struct rt6_info *rt6_make_pcpu_route(struct net *net, static struct rt6_info *rt6_make_pcpu_route(struct net *net,
struct rt6_info *rt) struct fib6_info *rt)
{ {
struct rt6_info *pcpu_rt, *prev, **p; struct rt6_info *pcpu_rt, *prev, **p;
...@@ -1390,7 +1389,7 @@ __rt6_find_exception_rcu(struct rt6_exception_bucket **bucket, ...@@ -1390,7 +1389,7 @@ __rt6_find_exception_rcu(struct rt6_exception_bucket **bucket,
return NULL; return NULL;
} }
static unsigned int fib6_mtu(const struct rt6_info *rt) static unsigned int fib6_mtu(const struct fib6_info *rt)
{ {
unsigned int mtu; unsigned int mtu;
...@@ -1401,7 +1400,7 @@ static unsigned int fib6_mtu(const struct rt6_info *rt) ...@@ -1401,7 +1400,7 @@ static unsigned int fib6_mtu(const struct rt6_info *rt)
} }
static int rt6_insert_exception(struct rt6_info *nrt, static int rt6_insert_exception(struct rt6_info *nrt,
struct rt6_info *ort) struct fib6_info *ort)
{ {
struct net *net = dev_net(nrt->dst.dev); struct net *net = dev_net(nrt->dst.dev);
struct rt6_exception_bucket *bucket; struct rt6_exception_bucket *bucket;
...@@ -1487,7 +1486,7 @@ static int rt6_insert_exception(struct rt6_info *nrt, ...@@ -1487,7 +1486,7 @@ static int rt6_insert_exception(struct rt6_info *nrt,
return err; return err;
} }
void rt6_flush_exceptions(struct rt6_info *rt) void rt6_flush_exceptions(struct fib6_info *rt)
{ {
struct rt6_exception_bucket *bucket; struct rt6_exception_bucket *bucket;
struct rt6_exception *rt6_ex; struct rt6_exception *rt6_ex;
...@@ -1517,7 +1516,7 @@ void rt6_flush_exceptions(struct rt6_info *rt) ...@@ -1517,7 +1516,7 @@ void rt6_flush_exceptions(struct rt6_info *rt)
/* Find cached rt in the hash table inside passed in rt /* Find cached rt in the hash table inside passed in rt
* Caller has to hold rcu_read_lock() * Caller has to hold rcu_read_lock()
*/ */
static struct rt6_info *rt6_find_cached_rt(struct rt6_info *rt, static struct rt6_info *rt6_find_cached_rt(struct fib6_info *rt,
struct in6_addr *daddr, struct in6_addr *daddr,
struct in6_addr *saddr) struct in6_addr *saddr)
{ {
...@@ -1550,7 +1549,7 @@ static struct rt6_info *rt6_find_cached_rt(struct rt6_info *rt, ...@@ -1550,7 +1549,7 @@ static struct rt6_info *rt6_find_cached_rt(struct rt6_info *rt,
static int rt6_remove_exception_rt(struct rt6_info *rt) static int rt6_remove_exception_rt(struct rt6_info *rt)
{ {
struct rt6_exception_bucket *bucket; struct rt6_exception_bucket *bucket;
struct rt6_info *from = rt->from; struct fib6_info *from = rt->from;
struct in6_addr *src_key = NULL; struct in6_addr *src_key = NULL;
struct rt6_exception *rt6_ex; struct rt6_exception *rt6_ex;
int err; int err;
...@@ -1595,7 +1594,7 @@ static int rt6_remove_exception_rt(struct rt6_info *rt) ...@@ -1595,7 +1594,7 @@ static int rt6_remove_exception_rt(struct rt6_info *rt)
static void rt6_update_exception_stamp_rt(struct rt6_info *rt) static void rt6_update_exception_stamp_rt(struct rt6_info *rt)
{ {
struct rt6_exception_bucket *bucket; struct rt6_exception_bucket *bucket;
struct rt6_info *from = rt->from; struct fib6_info *from = rt->from;
struct in6_addr *src_key = NULL; struct in6_addr *src_key = NULL;
struct rt6_exception *rt6_ex; struct rt6_exception *rt6_ex;
...@@ -1625,7 +1624,7 @@ static void rt6_update_exception_stamp_rt(struct rt6_info *rt) ...@@ -1625,7 +1624,7 @@ static void rt6_update_exception_stamp_rt(struct rt6_info *rt)
rcu_read_unlock(); rcu_read_unlock();
} }
static void rt6_exceptions_remove_prefsrc(struct rt6_info *rt) static void rt6_exceptions_remove_prefsrc(struct fib6_info *rt)
{ {
struct rt6_exception_bucket *bucket; struct rt6_exception_bucket *bucket;
struct rt6_exception *rt6_ex; struct rt6_exception *rt6_ex;
...@@ -1667,7 +1666,7 @@ static bool rt6_mtu_change_route_allowed(struct inet6_dev *idev, ...@@ -1667,7 +1666,7 @@ static bool rt6_mtu_change_route_allowed(struct inet6_dev *idev,
} }
static void rt6_exceptions_update_pmtu(struct inet6_dev *idev, static void rt6_exceptions_update_pmtu(struct inet6_dev *idev,
struct rt6_info *rt, int mtu) struct fib6_info *rt, int mtu)
{ {
struct rt6_exception_bucket *bucket; struct rt6_exception_bucket *bucket;
struct rt6_exception *rt6_ex; struct rt6_exception *rt6_ex;
...@@ -1697,7 +1696,7 @@ static void rt6_exceptions_update_pmtu(struct inet6_dev *idev, ...@@ -1697,7 +1696,7 @@ static void rt6_exceptions_update_pmtu(struct inet6_dev *idev,
#define RTF_CACHE_GATEWAY (RTF_GATEWAY | RTF_CACHE) #define RTF_CACHE_GATEWAY (RTF_GATEWAY | RTF_CACHE)
static void rt6_exceptions_clean_tohost(struct rt6_info *rt, static void rt6_exceptions_clean_tohost(struct fib6_info *rt,
struct in6_addr *gateway) struct in6_addr *gateway)
{ {
struct rt6_exception_bucket *bucket; struct rt6_exception_bucket *bucket;
...@@ -1776,7 +1775,7 @@ static void rt6_age_examine_exception(struct rt6_exception_bucket *bucket, ...@@ -1776,7 +1775,7 @@ static void rt6_age_examine_exception(struct rt6_exception_bucket *bucket,
gc_args->more++; gc_args->more++;
} }
void rt6_age_exceptions(struct rt6_info *rt, void rt6_age_exceptions(struct fib6_info *rt,
struct fib6_gc_args *gc_args, struct fib6_gc_args *gc_args,
unsigned long now) unsigned long now)
{ {
...@@ -1812,7 +1811,7 @@ struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, ...@@ -1812,7 +1811,7 @@ struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table,
const struct sk_buff *skb, int flags) const struct sk_buff *skb, int flags)
{ {
struct fib6_node *fn, *saved_fn; struct fib6_node *fn, *saved_fn;
struct rt6_info *f6i; struct fib6_info *f6i;
struct rt6_info *rt; struct rt6_info *rt;
int strict = 0; int strict = 0;
...@@ -2139,7 +2138,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori ...@@ -2139,7 +2138,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori
* Destination cache support functions * Destination cache support functions
*/ */
static bool fib6_check(struct rt6_info *f6i, u32 cookie) static bool fib6_check(struct fib6_info *f6i, u32 cookie)
{ {
u32 rt_cookie = 0; u32 rt_cookie = 0;
...@@ -2374,7 +2373,7 @@ static struct rt6_info *__ip6_route_redirect(struct net *net, ...@@ -2374,7 +2373,7 @@ static struct rt6_info *__ip6_route_redirect(struct net *net,
{ {
struct ip6rd_flowi *rdfl = (struct ip6rd_flowi *)fl6; struct ip6rd_flowi *rdfl = (struct ip6rd_flowi *)fl6;
struct rt6_info *ret = NULL, *rt_cache; struct rt6_info *ret = NULL, *rt_cache;
struct rt6_info *rt; struct fib6_info *rt;
struct fib6_node *fn; struct fib6_node *fn;
/* Get the "current" route for this destination and /* Get the "current" route for this destination and
...@@ -2620,7 +2619,7 @@ static int ip6_dst_gc(struct dst_ops *ops) ...@@ -2620,7 +2619,7 @@ static int ip6_dst_gc(struct dst_ops *ops)
return entries > rt_max_size; return entries > rt_max_size;
} }
static int ip6_convert_metrics(struct net *net, struct rt6_info *rt, static int ip6_convert_metrics(struct net *net, struct fib6_info *rt,
struct fib6_config *cfg) struct fib6_config *cfg)
{ {
int err = 0; int err = 0;
...@@ -2823,12 +2822,12 @@ static int ip6_validate_gw(struct net *net, struct fib6_config *cfg, ...@@ -2823,12 +2822,12 @@ static int ip6_validate_gw(struct net *net, struct fib6_config *cfg,
return err; return err;
} }
static struct rt6_info *ip6_route_info_create(struct fib6_config *cfg, static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
gfp_t gfp_flags, gfp_t gfp_flags,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *net = cfg->fc_nlinfo.nl_net; struct net *net = cfg->fc_nlinfo.nl_net;
struct rt6_info *rt = NULL; struct fib6_info *rt = NULL;
struct net_device *dev = NULL; struct net_device *dev = NULL;
struct inet6_dev *idev = NULL; struct inet6_dev *idev = NULL;
struct fib6_table *table; struct fib6_table *table;
...@@ -3047,7 +3046,7 @@ static struct rt6_info *ip6_route_info_create(struct fib6_config *cfg, ...@@ -3047,7 +3046,7 @@ static struct rt6_info *ip6_route_info_create(struct fib6_config *cfg,
int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags, int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct rt6_info *rt; struct fib6_info *rt;
int err; int err;
rt = ip6_route_info_create(cfg, gfp_flags, extack); rt = ip6_route_info_create(cfg, gfp_flags, extack);
...@@ -3060,7 +3059,7 @@ int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags, ...@@ -3060,7 +3059,7 @@ int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags,
return err; return err;
} }
static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info) static int __ip6_del_rt(struct fib6_info *rt, struct nl_info *info)
{ {
struct net *net = info->nl_net; struct net *net = info->nl_net;
struct fib6_table *table; struct fib6_table *table;
...@@ -3081,14 +3080,14 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info) ...@@ -3081,14 +3080,14 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)
return err; return err;
} }
int ip6_del_rt(struct net *net, struct rt6_info *rt) int ip6_del_rt(struct net *net, struct fib6_info *rt)
{ {
struct nl_info info = { .nl_net = net }; struct nl_info info = { .nl_net = net };
return __ip6_del_rt(rt, &info); return __ip6_del_rt(rt, &info);
} }
static int __ip6_del_rt_siblings(struct rt6_info *rt, struct fib6_config *cfg) static int __ip6_del_rt_siblings(struct fib6_info *rt, struct fib6_config *cfg)
{ {
struct nl_info *info = &cfg->fc_nlinfo; struct nl_info *info = &cfg->fc_nlinfo;
struct net *net = info->nl_net; struct net *net = info->nl_net;
...@@ -3102,7 +3101,7 @@ static int __ip6_del_rt_siblings(struct rt6_info *rt, struct fib6_config *cfg) ...@@ -3102,7 +3101,7 @@ static int __ip6_del_rt_siblings(struct rt6_info *rt, struct fib6_config *cfg)
spin_lock_bh(&table->tb6_lock); spin_lock_bh(&table->tb6_lock);
if (rt->rt6i_nsiblings && cfg->fc_delete_all_nh) { if (rt->rt6i_nsiblings && cfg->fc_delete_all_nh) {
struct rt6_info *sibling, *next_sibling; struct fib6_info *sibling, *next_sibling;
/* prefer to send a single notification with all hops */ /* prefer to send a single notification with all hops */
skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any()); skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any());
...@@ -3159,8 +3158,9 @@ static int ip6_del_cached_rt(struct rt6_info *rt, struct fib6_config *cfg) ...@@ -3159,8 +3158,9 @@ static int ip6_del_cached_rt(struct rt6_info *rt, struct fib6_config *cfg)
static int ip6_route_del(struct fib6_config *cfg, static int ip6_route_del(struct fib6_config *cfg,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct rt6_info *rt, *rt_cache; struct rt6_info *rt_cache;
struct fib6_table *table; struct fib6_table *table;
struct fib6_info *rt;
struct fib6_node *fn; struct fib6_node *fn;
int err = -ESRCH; int err = -ESRCH;
...@@ -3336,7 +3336,7 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu ...@@ -3336,7 +3336,7 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu
} }
#ifdef CONFIG_IPV6_ROUTE_INFO #ifdef CONFIG_IPV6_ROUTE_INFO
static struct rt6_info *rt6_get_route_info(struct net *net, static struct fib6_info *rt6_get_route_info(struct net *net,
const struct in6_addr *prefix, int prefixlen, const struct in6_addr *prefix, int prefixlen,
const struct in6_addr *gwaddr, const struct in6_addr *gwaddr,
struct net_device *dev) struct net_device *dev)
...@@ -3344,7 +3344,7 @@ static struct rt6_info *rt6_get_route_info(struct net *net, ...@@ -3344,7 +3344,7 @@ static struct rt6_info *rt6_get_route_info(struct net *net,
u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO; u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO;
int ifindex = dev->ifindex; int ifindex = dev->ifindex;
struct fib6_node *fn; struct fib6_node *fn;
struct rt6_info *rt = NULL; struct fib6_info *rt = NULL;
struct fib6_table *table; struct fib6_table *table;
table = fib6_get_table(net, tb_id); table = fib6_get_table(net, tb_id);
...@@ -3363,7 +3363,7 @@ static struct rt6_info *rt6_get_route_info(struct net *net, ...@@ -3363,7 +3363,7 @@ static struct rt6_info *rt6_get_route_info(struct net *net,
continue; continue;
if (!ipv6_addr_equal(&rt->fib6_nh.nh_gw, gwaddr)) if (!ipv6_addr_equal(&rt->fib6_nh.nh_gw, gwaddr))
continue; continue;
ip6_hold_safe(NULL, &rt, false); fib6_info_hold(rt);
break; break;
} }
out: out:
...@@ -3371,7 +3371,7 @@ static struct rt6_info *rt6_get_route_info(struct net *net, ...@@ -3371,7 +3371,7 @@ static struct rt6_info *rt6_get_route_info(struct net *net,
return rt; return rt;
} }
static struct rt6_info *rt6_add_route_info(struct net *net, static struct fib6_info *rt6_add_route_info(struct net *net,
const struct in6_addr *prefix, int prefixlen, const struct in6_addr *prefix, int prefixlen,
const struct in6_addr *gwaddr, const struct in6_addr *gwaddr,
struct net_device *dev, struct net_device *dev,
...@@ -3404,12 +3404,12 @@ static struct rt6_info *rt6_add_route_info(struct net *net, ...@@ -3404,12 +3404,12 @@ static struct rt6_info *rt6_add_route_info(struct net *net,
} }
#endif #endif
struct rt6_info *rt6_get_dflt_router(struct net *net, struct fib6_info *rt6_get_dflt_router(struct net *net,
const struct in6_addr *addr, const struct in6_addr *addr,
struct net_device *dev) struct net_device *dev)
{ {
u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_DFLT; u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_DFLT;
struct rt6_info *rt; struct fib6_info *rt;
struct fib6_table *table; struct fib6_table *table;
table = fib6_get_table(net, tb_id); table = fib6_get_table(net, tb_id);
...@@ -3424,12 +3424,12 @@ struct rt6_info *rt6_get_dflt_router(struct net *net, ...@@ -3424,12 +3424,12 @@ struct rt6_info *rt6_get_dflt_router(struct net *net,
break; break;
} }
if (rt) if (rt)
ip6_hold_safe(NULL, &rt, false); fib6_info_hold(rt);
rcu_read_unlock(); rcu_read_unlock();
return rt; return rt;
} }
struct rt6_info *rt6_add_dflt_router(struct net *net, struct fib6_info *rt6_add_dflt_router(struct net *net,
const struct in6_addr *gwaddr, const struct in6_addr *gwaddr,
struct net_device *dev, struct net_device *dev,
unsigned int pref) unsigned int pref)
...@@ -3463,7 +3463,7 @@ struct rt6_info *rt6_add_dflt_router(struct net *net, ...@@ -3463,7 +3463,7 @@ struct rt6_info *rt6_add_dflt_router(struct net *net,
static void __rt6_purge_dflt_routers(struct net *net, static void __rt6_purge_dflt_routers(struct net *net,
struct fib6_table *table) struct fib6_table *table)
{ {
struct rt6_info *rt; struct fib6_info *rt;
restart: restart:
rcu_read_lock(); rcu_read_lock();
...@@ -3614,14 +3614,14 @@ static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff ...@@ -3614,14 +3614,14 @@ static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff
* Allocate a dst for local (unicast / anycast) address. * Allocate a dst for local (unicast / anycast) address.
*/ */
struct rt6_info *addrconf_dst_alloc(struct net *net, struct fib6_info *addrconf_dst_alloc(struct net *net,
struct inet6_dev *idev, struct inet6_dev *idev,
const struct in6_addr *addr, const struct in6_addr *addr,
bool anycast, gfp_t gfp_flags) bool anycast, gfp_t gfp_flags)
{ {
u32 tb_id; u32 tb_id;
struct net_device *dev = idev->dev; struct net_device *dev = idev->dev;
struct rt6_info *rt; struct fib6_info *rt;
rt = fib6_info_alloc(gfp_flags); rt = fib6_info_alloc(gfp_flags);
if (!rt) if (!rt)
...@@ -3661,7 +3661,7 @@ struct arg_dev_net_ip { ...@@ -3661,7 +3661,7 @@ struct arg_dev_net_ip {
struct in6_addr *addr; struct in6_addr *addr;
}; };
static int fib6_remove_prefsrc(struct rt6_info *rt, void *arg) static int fib6_remove_prefsrc(struct fib6_info *rt, void *arg)
{ {
struct net_device *dev = ((struct arg_dev_net_ip *)arg)->dev; struct net_device *dev = ((struct arg_dev_net_ip *)arg)->dev;
struct net *net = ((struct arg_dev_net_ip *)arg)->net; struct net *net = ((struct arg_dev_net_ip *)arg)->net;
...@@ -3694,7 +3694,7 @@ void rt6_remove_prefsrc(struct inet6_ifaddr *ifp) ...@@ -3694,7 +3694,7 @@ void rt6_remove_prefsrc(struct inet6_ifaddr *ifp)
#define RTF_RA_ROUTER (RTF_ADDRCONF | RTF_DEFAULT | RTF_GATEWAY) #define RTF_RA_ROUTER (RTF_ADDRCONF | RTF_DEFAULT | RTF_GATEWAY)
/* Remove routers and update dst entries when gateway turn into host. */ /* Remove routers and update dst entries when gateway turn into host. */
static int fib6_clean_tohost(struct rt6_info *rt, void *arg) static int fib6_clean_tohost(struct fib6_info *rt, void *arg)
{ {
struct in6_addr *gateway = (struct in6_addr *)arg; struct in6_addr *gateway = (struct in6_addr *)arg;
...@@ -3725,9 +3725,9 @@ struct arg_netdev_event { ...@@ -3725,9 +3725,9 @@ struct arg_netdev_event {
}; };
}; };
static struct rt6_info *rt6_multipath_first_sibling(const struct rt6_info *rt) static struct fib6_info *rt6_multipath_first_sibling(const struct fib6_info *rt)
{ {
struct rt6_info *iter; struct fib6_info *iter;
struct fib6_node *fn; struct fib6_node *fn;
fn = rcu_dereference_protected(rt->rt6i_node, fn = rcu_dereference_protected(rt->rt6i_node,
...@@ -3745,7 +3745,7 @@ static struct rt6_info *rt6_multipath_first_sibling(const struct rt6_info *rt) ...@@ -3745,7 +3745,7 @@ static struct rt6_info *rt6_multipath_first_sibling(const struct rt6_info *rt)
return NULL; return NULL;
} }
static bool rt6_is_dead(const struct rt6_info *rt) static bool rt6_is_dead(const struct fib6_info *rt)
{ {
if (rt->fib6_nh.nh_flags & RTNH_F_DEAD || if (rt->fib6_nh.nh_flags & RTNH_F_DEAD ||
(rt->fib6_nh.nh_flags & RTNH_F_LINKDOWN && (rt->fib6_nh.nh_flags & RTNH_F_LINKDOWN &&
...@@ -3755,9 +3755,9 @@ static bool rt6_is_dead(const struct rt6_info *rt) ...@@ -3755,9 +3755,9 @@ static bool rt6_is_dead(const struct rt6_info *rt)
return false; return false;
} }
static int rt6_multipath_total_weight(const struct rt6_info *rt) static int rt6_multipath_total_weight(const struct fib6_info *rt)
{ {
struct rt6_info *iter; struct fib6_info *iter;
int total = 0; int total = 0;
if (!rt6_is_dead(rt)) if (!rt6_is_dead(rt))
...@@ -3771,7 +3771,7 @@ static int rt6_multipath_total_weight(const struct rt6_info *rt) ...@@ -3771,7 +3771,7 @@ static int rt6_multipath_total_weight(const struct rt6_info *rt)
return total; return total;
} }
static void rt6_upper_bound_set(struct rt6_info *rt, int *weight, int total) static void rt6_upper_bound_set(struct fib6_info *rt, int *weight, int total)
{ {
int upper_bound = -1; int upper_bound = -1;
...@@ -3783,9 +3783,9 @@ static void rt6_upper_bound_set(struct rt6_info *rt, int *weight, int total) ...@@ -3783,9 +3783,9 @@ static void rt6_upper_bound_set(struct rt6_info *rt, int *weight, int total)
atomic_set(&rt->fib6_nh.nh_upper_bound, upper_bound); atomic_set(&rt->fib6_nh.nh_upper_bound, upper_bound);
} }
static void rt6_multipath_upper_bound_set(struct rt6_info *rt, int total) static void rt6_multipath_upper_bound_set(struct fib6_info *rt, int total)
{ {
struct rt6_info *iter; struct fib6_info *iter;
int weight = 0; int weight = 0;
rt6_upper_bound_set(rt, &weight, total); rt6_upper_bound_set(rt, &weight, total);
...@@ -3794,9 +3794,9 @@ static void rt6_multipath_upper_bound_set(struct rt6_info *rt, int total) ...@@ -3794,9 +3794,9 @@ static void rt6_multipath_upper_bound_set(struct rt6_info *rt, int total)
rt6_upper_bound_set(iter, &weight, total); rt6_upper_bound_set(iter, &weight, total);
} }
void rt6_multipath_rebalance(struct rt6_info *rt) void rt6_multipath_rebalance(struct fib6_info *rt)
{ {
struct rt6_info *first; struct fib6_info *first;
int total; int total;
/* In case the entire multipath route was marked for flushing, /* In case the entire multipath route was marked for flushing,
...@@ -3818,7 +3818,7 @@ void rt6_multipath_rebalance(struct rt6_info *rt) ...@@ -3818,7 +3818,7 @@ void rt6_multipath_rebalance(struct rt6_info *rt)
rt6_multipath_upper_bound_set(first, total); rt6_multipath_upper_bound_set(first, total);
} }
static int fib6_ifup(struct rt6_info *rt, void *p_arg) static int fib6_ifup(struct fib6_info *rt, void *p_arg)
{ {
const struct arg_netdev_event *arg = p_arg; const struct arg_netdev_event *arg = p_arg;
struct net *net = dev_net(arg->dev); struct net *net = dev_net(arg->dev);
...@@ -3847,10 +3847,10 @@ void rt6_sync_up(struct net_device *dev, unsigned int nh_flags) ...@@ -3847,10 +3847,10 @@ void rt6_sync_up(struct net_device *dev, unsigned int nh_flags)
fib6_clean_all(dev_net(dev), fib6_ifup, &arg); fib6_clean_all(dev_net(dev), fib6_ifup, &arg);
} }
static bool rt6_multipath_uses_dev(const struct rt6_info *rt, static bool rt6_multipath_uses_dev(const struct fib6_info *rt,
const struct net_device *dev) const struct net_device *dev)
{ {
struct rt6_info *iter; struct fib6_info *iter;
if (rt->fib6_nh.nh_dev == dev) if (rt->fib6_nh.nh_dev == dev)
return true; return true;
...@@ -3861,19 +3861,19 @@ static bool rt6_multipath_uses_dev(const struct rt6_info *rt, ...@@ -3861,19 +3861,19 @@ static bool rt6_multipath_uses_dev(const struct rt6_info *rt,
return false; return false;
} }
static void rt6_multipath_flush(struct rt6_info *rt) static void rt6_multipath_flush(struct fib6_info *rt)
{ {
struct rt6_info *iter; struct fib6_info *iter;
rt->should_flush = 1; rt->should_flush = 1;
list_for_each_entry(iter, &rt->rt6i_siblings, rt6i_siblings) list_for_each_entry(iter, &rt->rt6i_siblings, rt6i_siblings)
iter->should_flush = 1; iter->should_flush = 1;
} }
static unsigned int rt6_multipath_dead_count(const struct rt6_info *rt, static unsigned int rt6_multipath_dead_count(const struct fib6_info *rt,
const struct net_device *down_dev) const struct net_device *down_dev)
{ {
struct rt6_info *iter; struct fib6_info *iter;
unsigned int dead = 0; unsigned int dead = 0;
if (rt->fib6_nh.nh_dev == down_dev || if (rt->fib6_nh.nh_dev == down_dev ||
...@@ -3887,11 +3887,11 @@ static unsigned int rt6_multipath_dead_count(const struct rt6_info *rt, ...@@ -3887,11 +3887,11 @@ static unsigned int rt6_multipath_dead_count(const struct rt6_info *rt,
return dead; return dead;
} }
static void rt6_multipath_nh_flags_set(struct rt6_info *rt, static void rt6_multipath_nh_flags_set(struct fib6_info *rt,
const struct net_device *dev, const struct net_device *dev,
unsigned int nh_flags) unsigned int nh_flags)
{ {
struct rt6_info *iter; struct fib6_info *iter;
if (rt->fib6_nh.nh_dev == dev) if (rt->fib6_nh.nh_dev == dev)
rt->fib6_nh.nh_flags |= nh_flags; rt->fib6_nh.nh_flags |= nh_flags;
...@@ -3901,7 +3901,7 @@ static void rt6_multipath_nh_flags_set(struct rt6_info *rt, ...@@ -3901,7 +3901,7 @@ static void rt6_multipath_nh_flags_set(struct rt6_info *rt,
} }
/* called with write lock held for table with rt */ /* called with write lock held for table with rt */
static int fib6_ifdown(struct rt6_info *rt, void *p_arg) static int fib6_ifdown(struct fib6_info *rt, void *p_arg)
{ {
const struct arg_netdev_event *arg = p_arg; const struct arg_netdev_event *arg = p_arg;
const struct net_device *dev = arg->dev; const struct net_device *dev = arg->dev;
...@@ -3968,7 +3968,7 @@ struct rt6_mtu_change_arg { ...@@ -3968,7 +3968,7 @@ struct rt6_mtu_change_arg {
unsigned int mtu; unsigned int mtu;
}; };
static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg) static int rt6_mtu_change_route(struct fib6_info *rt, void *p_arg)
{ {
struct rt6_mtu_change_arg *arg = (struct rt6_mtu_change_arg *) p_arg; struct rt6_mtu_change_arg *arg = (struct rt6_mtu_change_arg *) p_arg;
struct inet6_dev *idev; struct inet6_dev *idev;
...@@ -4155,7 +4155,7 @@ static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -4155,7 +4155,7 @@ static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
} }
struct rt6_nh { struct rt6_nh {
struct rt6_info *rt6_info; struct fib6_info *fib6_info;
struct fib6_config r_cfg; struct fib6_config r_cfg;
struct list_head next; struct list_head next;
}; };
...@@ -4173,21 +4173,22 @@ static void ip6_print_replace_route_err(struct list_head *rt6_nh_list) ...@@ -4173,21 +4173,22 @@ static void ip6_print_replace_route_err(struct list_head *rt6_nh_list)
static int ip6_route_info_append(struct net *net, static int ip6_route_info_append(struct net *net,
struct list_head *rt6_nh_list, struct list_head *rt6_nh_list,
struct rt6_info *rt, struct fib6_config *r_cfg) struct fib6_info *rt,
struct fib6_config *r_cfg)
{ {
struct rt6_nh *nh; struct rt6_nh *nh;
int err = -EEXIST; int err = -EEXIST;
list_for_each_entry(nh, rt6_nh_list, next) { list_for_each_entry(nh, rt6_nh_list, next) {
/* check if rt6_info already exists */ /* check if fib6_info already exists */
if (rt6_duplicate_nexthop(nh->rt6_info, rt)) if (rt6_duplicate_nexthop(nh->fib6_info, rt))
return err; return err;
} }
nh = kzalloc(sizeof(*nh), GFP_KERNEL); nh = kzalloc(sizeof(*nh), GFP_KERNEL);
if (!nh) if (!nh)
return -ENOMEM; return -ENOMEM;
nh->rt6_info = rt; nh->fib6_info = rt;
err = ip6_convert_metrics(net, rt, r_cfg); err = ip6_convert_metrics(net, rt, r_cfg);
if (err) { if (err) {
kfree(nh); kfree(nh);
...@@ -4199,8 +4200,8 @@ static int ip6_route_info_append(struct net *net, ...@@ -4199,8 +4200,8 @@ static int ip6_route_info_append(struct net *net,
return 0; return 0;
} }
static void ip6_route_mpath_notify(struct rt6_info *rt, static void ip6_route_mpath_notify(struct fib6_info *rt,
struct rt6_info *rt_last, struct fib6_info *rt_last,
struct nl_info *info, struct nl_info *info,
__u16 nlflags) __u16 nlflags)
{ {
...@@ -4212,7 +4213,7 @@ static void ip6_route_mpath_notify(struct rt6_info *rt, ...@@ -4212,7 +4213,7 @@ static void ip6_route_mpath_notify(struct rt6_info *rt,
*/ */
if ((nlflags & NLM_F_APPEND) && rt_last && rt_last->rt6i_nsiblings) { if ((nlflags & NLM_F_APPEND) && rt_last && rt_last->rt6i_nsiblings) {
rt = list_first_entry(&rt_last->rt6i_siblings, rt = list_first_entry(&rt_last->rt6i_siblings,
struct rt6_info, struct fib6_info,
rt6i_siblings); rt6i_siblings);
} }
...@@ -4223,11 +4224,11 @@ static void ip6_route_mpath_notify(struct rt6_info *rt, ...@@ -4223,11 +4224,11 @@ static void ip6_route_mpath_notify(struct rt6_info *rt,
static int ip6_route_multipath_add(struct fib6_config *cfg, static int ip6_route_multipath_add(struct fib6_config *cfg,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct rt6_info *rt_notif = NULL, *rt_last = NULL; struct fib6_info *rt_notif = NULL, *rt_last = NULL;
struct nl_info *info = &cfg->fc_nlinfo; struct nl_info *info = &cfg->fc_nlinfo;
struct fib6_config r_cfg; struct fib6_config r_cfg;
struct rtnexthop *rtnh; struct rtnexthop *rtnh;
struct rt6_info *rt; struct fib6_info *rt;
struct rt6_nh *err_nh; struct rt6_nh *err_nh;
struct rt6_nh *nh, *nh_safe; struct rt6_nh *nh, *nh_safe;
__u16 nlflags; __u16 nlflags;
...@@ -4247,7 +4248,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg, ...@@ -4247,7 +4248,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
rtnh = (struct rtnexthop *)cfg->fc_mp; rtnh = (struct rtnexthop *)cfg->fc_mp;
/* Parse a Multipath Entry and build a list (rt6_nh_list) of /* Parse a Multipath Entry and build a list (rt6_nh_list) of
* rt6_info structs per nexthop * fib6_info structs per nexthop
*/ */
while (rtnh_ok(rtnh, remaining)) { while (rtnh_ok(rtnh, remaining)) {
memcpy(&r_cfg, cfg, sizeof(*cfg)); memcpy(&r_cfg, cfg, sizeof(*cfg));
...@@ -4297,16 +4298,16 @@ static int ip6_route_multipath_add(struct fib6_config *cfg, ...@@ -4297,16 +4298,16 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
err_nh = NULL; err_nh = NULL;
list_for_each_entry(nh, &rt6_nh_list, next) { list_for_each_entry(nh, &rt6_nh_list, next) {
rt_last = nh->rt6_info; rt_last = nh->fib6_info;
err = __ip6_ins_rt(nh->rt6_info, info, extack); err = __ip6_ins_rt(nh->fib6_info, info, extack);
fib6_info_release(nh->rt6_info); fib6_info_release(nh->fib6_info);
/* save reference to first route for notification */ /* save reference to first route for notification */
if (!rt_notif && !err) if (!rt_notif && !err)
rt_notif = nh->rt6_info; rt_notif = nh->fib6_info;
/* nh->rt6_info is used or freed at this point, reset to NULL*/ /* nh->fib6_info is used or freed at this point, reset to NULL*/
nh->rt6_info = NULL; nh->fib6_info = NULL;
if (err) { if (err) {
if (replace && nhn) if (replace && nhn)
ip6_print_replace_route_err(&rt6_nh_list); ip6_print_replace_route_err(&rt6_nh_list);
...@@ -4347,8 +4348,8 @@ static int ip6_route_multipath_add(struct fib6_config *cfg, ...@@ -4347,8 +4348,8 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
cleanup: cleanup:
list_for_each_entry_safe(nh, nh_safe, &rt6_nh_list, next) { list_for_each_entry_safe(nh, nh_safe, &rt6_nh_list, next) {
if (nh->rt6_info) if (nh->fib6_info)
fib6_info_release(nh->rt6_info); fib6_info_release(nh->fib6_info);
list_del(&nh->next); list_del(&nh->next);
kfree(nh); kfree(nh);
} }
...@@ -4428,7 +4429,7 @@ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -4428,7 +4429,7 @@ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh,
return ip6_route_add(&cfg, GFP_KERNEL, extack); return ip6_route_add(&cfg, GFP_KERNEL, extack);
} }
static size_t rt6_nlmsg_size(struct rt6_info *rt) static size_t rt6_nlmsg_size(struct fib6_info *rt)
{ {
int nexthop_len = 0; int nexthop_len = 0;
...@@ -4458,7 +4459,7 @@ static size_t rt6_nlmsg_size(struct rt6_info *rt) ...@@ -4458,7 +4459,7 @@ static size_t rt6_nlmsg_size(struct rt6_info *rt)
+ nexthop_len; + nexthop_len;
} }
static int rt6_nexthop_info(struct sk_buff *skb, struct rt6_info *rt, static int rt6_nexthop_info(struct sk_buff *skb, struct fib6_info *rt,
unsigned int *flags, bool skip_oif) unsigned int *flags, bool skip_oif)
{ {
if (rt->fib6_nh.nh_flags & RTNH_F_DEAD) if (rt->fib6_nh.nh_flags & RTNH_F_DEAD)
...@@ -4495,7 +4496,7 @@ static int rt6_nexthop_info(struct sk_buff *skb, struct rt6_info *rt, ...@@ -4495,7 +4496,7 @@ static int rt6_nexthop_info(struct sk_buff *skb, struct rt6_info *rt,
} }
/* add multipath next hop */ /* add multipath next hop */
static int rt6_add_nexthop(struct sk_buff *skb, struct rt6_info *rt) static int rt6_add_nexthop(struct sk_buff *skb, struct fib6_info *rt)
{ {
const struct net_device *dev = rt->fib6_nh.nh_dev; const struct net_device *dev = rt->fib6_nh.nh_dev;
struct rtnexthop *rtnh; struct rtnexthop *rtnh;
...@@ -4523,7 +4524,7 @@ static int rt6_add_nexthop(struct sk_buff *skb, struct rt6_info *rt) ...@@ -4523,7 +4524,7 @@ static int rt6_add_nexthop(struct sk_buff *skb, struct rt6_info *rt)
} }
static int rt6_fill_node(struct net *net, struct sk_buff *skb, static int rt6_fill_node(struct net *net, struct sk_buff *skb,
struct rt6_info *rt, struct dst_entry *dst, struct fib6_info *rt, struct dst_entry *dst,
struct in6_addr *dest, struct in6_addr *src, struct in6_addr *dest, struct in6_addr *src,
int iif, int type, u32 portid, u32 seq, int iif, int type, u32 portid, u32 seq,
unsigned int flags) unsigned int flags)
...@@ -4613,7 +4614,7 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb, ...@@ -4613,7 +4614,7 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb,
* each as a nexthop within RTA_MULTIPATH. * each as a nexthop within RTA_MULTIPATH.
*/ */
if (rt->rt6i_nsiblings) { if (rt->rt6i_nsiblings) {
struct rt6_info *sibling, *next_sibling; struct fib6_info *sibling, *next_sibling;
struct nlattr *mp; struct nlattr *mp;
mp = nla_nest_start(skb, RTA_MULTIPATH); mp = nla_nest_start(skb, RTA_MULTIPATH);
...@@ -4655,7 +4656,7 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb, ...@@ -4655,7 +4656,7 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb,
return -EMSGSIZE; return -EMSGSIZE;
} }
int rt6_dump_route(struct rt6_info *rt, void *p_arg) int rt6_dump_route(struct fib6_info *rt, void *p_arg)
{ {
struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg;
struct net *net = arg->net; struct net *net = arg->net;
...@@ -4800,7 +4801,7 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, ...@@ -4800,7 +4801,7 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
return err; return err;
} }
void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info, void inet6_rt_notify(int event, struct fib6_info *rt, struct nl_info *info,
unsigned int nlm_flags) unsigned int nlm_flags)
{ {
struct sk_buff *skb; struct sk_buff *skb;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册