ipv4: Attach FIB info to dst_default_metrics when possible
If there are no explicit metrics attached to a route, hook fi->fib_info up to dst_default_metrics. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9c150e82ac
commit
725d1e1b45
|
@ -97,6 +97,7 @@ struct dst_entry {
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old);
|
extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old);
|
||||||
|
extern const u32 dst_default_metrics[RTAX_MAX];
|
||||||
|
|
||||||
#define DST_METRICS_READ_ONLY 0x1UL
|
#define DST_METRICS_READ_ONLY 0x1UL
|
||||||
#define __DST_METRICS_PTR(Y) \
|
#define __DST_METRICS_PTR(Y) \
|
||||||
|
|
|
@ -164,7 +164,7 @@ int dst_discard(struct sk_buff *skb)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dst_discard);
|
EXPORT_SYMBOL(dst_discard);
|
||||||
|
|
||||||
static const u32 dst_default_metrics[RTAX_MAX];
|
const u32 dst_default_metrics[RTAX_MAX];
|
||||||
|
|
||||||
void *dst_alloc(struct dst_ops *ops)
|
void *dst_alloc(struct dst_ops *ops)
|
||||||
{
|
{
|
||||||
|
|
|
@ -152,7 +152,8 @@ static void free_fib_info_rcu(struct rcu_head *head)
|
||||||
{
|
{
|
||||||
struct fib_info *fi = container_of(head, struct fib_info, rcu);
|
struct fib_info *fi = container_of(head, struct fib_info, rcu);
|
||||||
|
|
||||||
kfree(fi->fib_metrics);
|
if (fi->fib_metrics != (u32 *) dst_default_metrics)
|
||||||
|
kfree(fi->fib_metrics);
|
||||||
kfree(fi);
|
kfree(fi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -743,9 +744,12 @@ struct fib_info *fib_create_info(struct fib_config *cfg)
|
||||||
fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL);
|
fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL);
|
||||||
if (fi == NULL)
|
if (fi == NULL)
|
||||||
goto failure;
|
goto failure;
|
||||||
fi->fib_metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
|
if (cfg->fc_mx) {
|
||||||
if (!fi->fib_metrics)
|
fi->fib_metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
|
||||||
goto failure;
|
if (!fi->fib_metrics)
|
||||||
|
goto failure;
|
||||||
|
} else
|
||||||
|
fi->fib_metrics = (u32 *) dst_default_metrics;
|
||||||
fib_info_cnt++;
|
fib_info_cnt++;
|
||||||
|
|
||||||
fi->fib_net = hold_net(net);
|
fi->fib_net = hold_net(net);
|
||||||
|
|
Loading…
Reference in New Issue