chiark / gitweb /
sd-rtnl: improve detection of broadcast messages
authorTom Gundersen <teg@jklm.no>
Fri, 13 Mar 2015 15:12:57 +0000 (16:12 +0100)
committerTom Gundersen <teg@jklm.no>
Fri, 13 Mar 2015 15:12:57 +0000 (16:12 +0100)
Do not rely on nl_pid == 0, but check the groups instead. We currently avoid using
nl_pid == 0 for unicast anyway, so this should be redundant, but let's try to be
correct.

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

index a192198419e76525695ec9535b1b6f2fcd74c832..05b88b1ad863387a8f6a6be5ba3e56ffe0f866dc 100644 (file)
@@ -109,6 +109,7 @@ struct sd_rtnl_message {
         size_t *rta_offset_tb[RTNL_CONTAINER_DEPTH];
         unsigned short rta_tb_size[RTNL_CONTAINER_DEPTH];
         bool sealed:1;
+        bool broadcast:1;
 
         sd_rtnl_message *next; /* next in a chain of multi-part messages */
 };
index 8bb7bcdd05750209df1d439074ef5c702157f9e0..d24769b4b99905b05094d782dff6fe48bb1ed31d 100644 (file)
@@ -654,7 +654,7 @@ int sd_rtnl_message_get_family(sd_rtnl_message *m, int *family) {
 int sd_rtnl_message_is_broadcast(sd_rtnl_message *m) {
         assert_return(m, -EINVAL);
 
-        return !m->hdr->nlmsg_pid;
+        return m->broadcast;
 }
 
 int sd_rtnl_message_link_get_ifindex(sd_rtnl_message *m, int *ifindex) {
@@ -1577,6 +1577,8 @@ int socket_read_message(sd_rtnl *rtnl) {
                 if (r < 0)
                         return r;
 
+                m->broadcast = !!group;
+
                 m->hdr = memdup(new_msg, new_msg->nlmsg_len);
                 if (!m->hdr)
                         return -ENOMEM;
index f483af991bc2f8e46861c77641703047d06249bb..c7a36b9efbcbf68252dd89f54efa1a289ccb2004 100644 (file)
@@ -262,6 +262,8 @@ static void rtnl_seal_message(sd_rtnl *rtnl, sd_rtnl_message *m) {
         assert(m);
         assert(m->hdr);
 
+        /* don't use seq == 0, as that is used for broadcasts, so we
+           would get confused by replies to such messages */
         m->hdr->nlmsg_seq = rtnl->serial++ ? : rtnl->serial++;
 
         rtnl_message_seal(m);