Patchwork [RESUBMITTED,net-next,1/2] IPv6 - support for NLM_F_* flags at IPv6 routing requests

mail settings
Submitter Matti Vaittinen
Date Nov. 10, 2011, 10:06 a.m.
Message ID <1320919619.17667.0.camel@hakki>
Download mbox | patch
Permalink /patch/124834/
State Changes Requested
Delegated to: David Miller
Headers show


Matti Vaittinen - Nov. 10, 2011, 10:06 a.m.
The support for NLM_F_* flags at IPv6 routing requests.

If NLM_F_CREATE flag is not defined for RTM_NEWROUTE request,
warning is printed, but no error is returned. Instead new route is

Exception is when NLM_F_REPLACE flag is given without NLM_F_CREATE, and
no matching route is found. In this case it should be safe to assume
that the request issuer is familiar with NLM_F_* flags, and does really
not want route to be created.

Specifying NLM_F_REPLACE flag will now make the kernel to search for
matching route, and replace it with new one. If no route is found and
NLM_F_CREATE is specified as well, then new route is created.

Also, specifying NLM_F_EXCL will yield returning of error if matching
is found.

Patch created against linux-3.2-rc1

Signed-off-by: Matti Vaittinen <>
David Miller - Nov. 14, 2011, 5:44 a.m.
The subject lines are completely identical in patches #1 and #2.

How in the world is someone scanning the commit header lines going to
be able to tell what's different about one change vs. the other?

Please correc this and resubmit.
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to
More majordomo info at


diff -uNr Linux-3.2-rc1.orig/net/ipv6/route.c
--- Linux-3.2-rc1.orig/net/ipv6/route.c	2011-11-10 08:44:18.000000000 +0200
+++	2011-11-10 08:46:15.000000000 +0200
@@ -1230,9 +1230,18 @@ 
 	if (cfg->fc_metric == 0)
 		cfg->fc_metric = IP6_RT_PRIO_USER;
-	table = fib6_new_table(net, cfg->fc_table);
+	err = -ENOBUFS;
+	if (NULL != cfg->fc_nlinfo.nlh &&
+	    !(cfg->fc_nlinfo.nlh->nlmsg_flags&NLM_F_CREATE)) {
+		table = fib6_get_table(net, cfg->fc_table);
+		if (table == NULL) {
+			printk(KERN_WARNING "NLM_F_CREATE should be specified when creating new rt\n");
+			table = fib6_new_table(net, cfg->fc_table);
+		}
+	} else {
+		table = fib6_new_table(net, cfg->fc_table);
+	}
 	if (table == NULL) {
-		err = -ENOBUFS;
 		goto out;