ipv6: report NLM_F_CREATE and NLM_F_EXCL flags in RTM_NEWROUTE events
Since commit 37a1d3611c
("ipv6: include NLM_F_REPLACE in route
replace notifications"), RTM_NEWROUTE notifications have their
NLM_F_REPLACE flag set if the new route replaced a preexisting one.
However, other flags aren't set.
This patch reports the missing NLM_F_CREATE and NLM_F_EXCL flag bits.
NLM_F_APPEND is not reported, because in ipv6 a NLM_F_CREATE request
is interpreted as an append request (contrary to ipv4, "prepend" is not
supported, so if NLM_F_EXCL is not set then NLM_F_APPEND is implicit).
As a result, the possible flag combination can now be reported
(iproute2's terminology into parentheses):
* NLM_F_CREATE | NLM_F_EXCL: route didn't exist, exclusive creation
("add").
* NLM_F_CREATE: route did already exist, new route added after
preexisting ones ("append").
* NLM_F_REPLACE: route did already exist, new route replaced the
first preexisting one ("change").
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b93e1fa710
commit
73483c1289
|
@ -743,6 +743,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
|
||||||
(info->nlh->nlmsg_flags & NLM_F_CREATE));
|
(info->nlh->nlmsg_flags & NLM_F_CREATE));
|
||||||
int found = 0;
|
int found = 0;
|
||||||
bool rt_can_ecmp = rt6_qualify_for_ecmp(rt);
|
bool rt_can_ecmp = rt6_qualify_for_ecmp(rt);
|
||||||
|
u16 nlflags = NLM_F_EXCL;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
ins = &fn->leaf;
|
ins = &fn->leaf;
|
||||||
|
@ -759,6 +760,8 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
|
||||||
if (info->nlh &&
|
if (info->nlh &&
|
||||||
(info->nlh->nlmsg_flags & NLM_F_EXCL))
|
(info->nlh->nlmsg_flags & NLM_F_EXCL))
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
|
|
||||||
|
nlflags &= ~NLM_F_EXCL;
|
||||||
if (replace) {
|
if (replace) {
|
||||||
if (rt_can_ecmp == rt6_qualify_for_ecmp(iter)) {
|
if (rt_can_ecmp == rt6_qualify_for_ecmp(iter)) {
|
||||||
found++;
|
found++;
|
||||||
|
@ -856,6 +859,7 @@ next_iter:
|
||||||
pr_warn("NLM_F_CREATE should be set when creating new route\n");
|
pr_warn("NLM_F_CREATE should be set when creating new route\n");
|
||||||
|
|
||||||
add:
|
add:
|
||||||
|
nlflags |= NLM_F_CREATE;
|
||||||
err = fib6_commit_metrics(&rt->dst, mxc);
|
err = fib6_commit_metrics(&rt->dst, mxc);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
@ -864,7 +868,7 @@ add:
|
||||||
*ins = rt;
|
*ins = rt;
|
||||||
rt->rt6i_node = fn;
|
rt->rt6i_node = fn;
|
||||||
atomic_inc(&rt->rt6i_ref);
|
atomic_inc(&rt->rt6i_ref);
|
||||||
inet6_rt_notify(RTM_NEWROUTE, rt, info, 0);
|
inet6_rt_notify(RTM_NEWROUTE, rt, info, nlflags);
|
||||||
info->nl_net->ipv6.rt6_stats->fib_rt_entries++;
|
info->nl_net->ipv6.rt6_stats->fib_rt_entries++;
|
||||||
|
|
||||||
if (!(fn->fn_flags & RTN_RTINFO)) {
|
if (!(fn->fn_flags & RTN_RTINFO)) {
|
||||||
|
|
Loading…
Reference in a new issue