chiark / gitweb /
sd-rtnl: never treat broadcasts as replies
authorTom Gundersen <teg@jklm.no>
Sun, 16 Mar 2014 12:02:16 +0000 (13:02 +0100)
committerTom Gundersen <teg@jklm.no>
Sun, 16 Mar 2014 12:05:04 +0000 (13:05 +0100)
Otherwise the sequence number of a broadcast may match the sequence number of a
pending unicast message and cause confusion.

src/libsystemd/sd-rtnl/rtnl-message.c
src/libsystemd/sd-rtnl/sd-rtnl.c
src/systemd/sd-rtnl.h

index 7ea68f18ae4fed56a8420abf8d0ac3acd11b6926..e243c7b07554b2559c74e54f2388f1bea696189f 100644 (file)
@@ -295,6 +295,12 @@ int sd_rtnl_message_get_type(sd_rtnl_message *m, uint16_t *type) {
         return 0;
 }
 
+int sd_rtnl_message_is_broadcast(sd_rtnl_message *m) {
+        assert_return(m, -EINVAL);
+
+        return !m->hdr->nlmsg_pid;
+}
+
 int sd_rtnl_message_link_get_ifindex(sd_rtnl_message *m, int *ifindex) {
         struct ifinfomsg *ifi;
 
index 1b9f58372690197851530b8217fa2e62512555bd..1c2c8902f95140efc2c169cdf3f1cb426b78edd2 100644 (file)
@@ -277,6 +277,9 @@ static int process_reply(sd_rtnl *rtnl, sd_rtnl_message *m) {
         assert(rtnl);
         assert(m);
 
+        if (sd_rtnl_message_is_broadcast(m))
+                return 0;
+
         serial = rtnl_message_get_serial(m);
         c = hashmap_remove(rtnl->reply_callbacks, &serial);
         if (!c)
index a171978bcf65e15da540e39aa389b0ec9586ba66..0a24873519ed9d3a37070ea1fb16301df3c23063 100644 (file)
@@ -78,6 +78,7 @@ sd_rtnl_message *sd_rtnl_message_unref(sd_rtnl_message *m);
 
 int sd_rtnl_message_get_errno(sd_rtnl_message *m);
 int sd_rtnl_message_get_type(sd_rtnl_message *m, uint16_t *type);
+int sd_rtnl_message_is_broadcast(sd_rtnl_message *m);
 
 int sd_rtnl_message_addr_set_prefixlen(sd_rtnl_message *m, unsigned char prefixlen);
 int sd_rtnl_message_addr_set_scope(sd_rtnl_message *m, unsigned char scope);