ipv4: Use accessors for fib_info nexthop data
Use helpers to access fib_nh and fib_nhs fields of a fib_info. Drop the fib_dev macro which is an alias for the first nexthop. Replacements: fi->fib_dev --> fib_info_nh(fi, 0)->fib_nh_dev fi->fib_nh --> fib_info_nh(fi, 0) fi->fib_nh[i] --> fib_info_nh(fi, i) fi->fib_nhs --> fib_info_num_path(fi) where fib_info_nh(fi, i) returns fi->fib_nh[nhsel] and fib_info_num_path returns fi->fib_nhs. Move the existing fib_info_nhc to nexthop.h and define the new ones there. A later patch adds a check if a fib_info uses a nexthop object, and defining the helpers in nexthop.h avoid circular header dependencies. After this all remaining open coded references to fi->fib_nhs and fi->fib_nh are in: - fib_create_info and helpers used to lookup an existing fib_info entry, and - the netdev event functions fib_sync_down_dev and fib_sync_up. The latter two will not be reused for nexthops, and the fib_create_info will be updated to handle a nexthop in a fib_info. Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
7dd73168e2
commit
5481d73f81
@@ -1469,7 +1469,7 @@ found:
|
||||
}
|
||||
if (fi->fib_flags & RTNH_F_DEAD)
|
||||
continue;
|
||||
for (nhsel = 0; nhsel < fi->fib_nhs; nhsel++) {
|
||||
for (nhsel = 0; nhsel < fib_info_num_path(fi); nhsel++) {
|
||||
struct fib_nh_common *nhc = fib_info_nhc(fi, nhsel);
|
||||
|
||||
if (nhc->nhc_flags & RTNH_F_DEAD)
|
||||
@@ -2717,14 +2717,18 @@ static void fib_route_seq_stop(struct seq_file *seq, void *v)
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static unsigned int fib_flag_trans(int type, __be32 mask, const struct fib_info *fi)
|
||||
static unsigned int fib_flag_trans(int type, __be32 mask, struct fib_info *fi)
|
||||
{
|
||||
unsigned int flags = 0;
|
||||
|
||||
if (type == RTN_UNREACHABLE || type == RTN_PROHIBIT)
|
||||
flags = RTF_REJECT;
|
||||
if (fi && fi->fib_nh->fib_nh_gw4)
|
||||
flags |= RTF_GATEWAY;
|
||||
if (fi) {
|
||||
const struct fib_nh *nh = fib_info_nh(fi, 0);
|
||||
|
||||
if (nh->fib_nh_gw4)
|
||||
flags |= RTF_GATEWAY;
|
||||
}
|
||||
if (mask == htonl(0xFFFFFFFF))
|
||||
flags |= RTF_HOST;
|
||||
flags |= RTF_UP;
|
||||
@@ -2755,7 +2759,7 @@ static int fib_route_seq_show(struct seq_file *seq, void *v)
|
||||
prefix = htonl(l->key);
|
||||
|
||||
hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
|
||||
const struct fib_info *fi = fa->fa_info;
|
||||
struct fib_info *fi = fa->fa_info;
|
||||
__be32 mask = inet_make_mask(KEYLENGTH - fa->fa_slen);
|
||||
unsigned int flags = fib_flag_trans(fa->fa_type, mask, fi);
|
||||
|
||||
@@ -2768,26 +2772,28 @@ static int fib_route_seq_show(struct seq_file *seq, void *v)
|
||||
|
||||
seq_setwidth(seq, 127);
|
||||
|
||||
if (fi)
|
||||
if (fi) {
|
||||
struct fib_nh *nh = fib_info_nh(fi, 0);
|
||||
|
||||
seq_printf(seq,
|
||||
"%s\t%08X\t%08X\t%04X\t%d\t%u\t"
|
||||
"%d\t%08X\t%d\t%u\t%u",
|
||||
fi->fib_dev ? fi->fib_dev->name : "*",
|
||||
nh->fib_nh_dev ? nh->fib_nh_dev->name : "*",
|
||||
prefix,
|
||||
fi->fib_nh->fib_nh_gw4, flags, 0, 0,
|
||||
nh->fib_nh_gw4, flags, 0, 0,
|
||||
fi->fib_priority,
|
||||
mask,
|
||||
(fi->fib_advmss ?
|
||||
fi->fib_advmss + 40 : 0),
|
||||
fi->fib_window,
|
||||
fi->fib_rtt >> 3);
|
||||
else
|
||||
} else {
|
||||
seq_printf(seq,
|
||||
"*\t%08X\t%08X\t%04X\t%d\t%u\t"
|
||||
"%d\t%08X\t%d\t%u\t%u",
|
||||
prefix, 0, flags, 0, 0, 0,
|
||||
mask, 0, 0, 0);
|
||||
|
||||
}
|
||||
seq_pad(seq, '\n');
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user