chiark / gitweb /
networkd: Begin with serial number 1 for netlink requests
authorRichard Maw <richard.maw@codethink.co.uk>
Thu, 12 Mar 2015 18:14:58 +0000 (18:14 +0000)
committerTom Gundersen <teg@jklm.no>
Thu, 12 Mar 2015 18:34:35 +0000 (19:34 +0100)
"Notifications are of informal nature and no reply is expected, therefore the
sequence number is typically set to 0."[1]

If networkd is started soon after recent netlink activity, then there
will be messages with sequence number 0 in the buffer.

The first thing networkd does is to request a dump of all the links. If
it uses sequence number 0 for this, then it may confuse the dump request's
response with that of a notification.

This will result in it failing to properly enumerate all the links,
but more importantly, when it comes to enumerate all the addresses, it
will still have the link dump in progress, so the address enumeration
will fail with -EBUSY.

[1]: http://www.infradead.org/~tgr/libnl/doc/core.html#core_msg_types

[tomegun: sequence -> serial]

src/libsystemd/sd-rtnl/sd-rtnl.c

index ae49c77e018f4e023c11b519453e4de01c4d6b38..7cdcc5d96a10d818620b13bd241bdc73c8da687c 100644 (file)
@@ -61,6 +61,11 @@ static int sd_rtnl_new(sd_rtnl **ret) {
                             sizeof(struct nlmsghdr), sizeof(uint8_t)))
                 return -ENOMEM;
 
+        /* Change notification responses have sequence 0, so we must
+         * start our request sequence numbers at 1, or we may confuse our
+         * responses with notifications from the kernel */
+        rtnl->serial = 1;
+
         *ret = rtnl;
         rtnl = NULL;