Commit 8d1c802b authored by David Ahern's avatar David Ahern Committed by 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: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 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,7 +136,7 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, struct flowi6 *fl6); ...@@ -136,7 +136,7 @@ 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);
...@@ -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;
......
This diff is collapsed.
...@@ -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;
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment