]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: allow specifying both src and dst pid in virNetlinkCommand
authorLaine Stump <laine@laine.org>
Fri, 4 May 2012 16:58:36 +0000 (12:58 -0400)
committerCole Robinson <crobinso@redhat.com>
Thu, 14 Jun 2012 15:31:24 +0000 (11:31 -0400)
Until now, virNetlinkCommand has assumed that the nl_pid in the source
address of outgoing netlink messages should always be the return value
of getpid(). In most cases it actually doesn't matter, but in the case
of communication with lldpad, lldpad saves this info and later uses it
to send netlink messages back to libvirt. A recent patch to fix Bug
816465 changed the order of the universe such that the netlink event
service socket is no longer bound with nl_pid == getpid(), so lldpad
could no longer send unsolicited messages to libvirtd. Adding src_pid
as an argument to virNetlinkCommand() is the first step in notifying
lldpad of the proper address of the netlink event service socket.
(cherry picked from commit cca7bb1fb583459824f7a42be0406d0833a80593)

src/util/virnetdev.c
src/util/virnetdevmacvlan.c
src/util/virnetdevvportprofile.c
src/util/virnetlink.c
src/util/virnetlink.h

index 460aa837d64cbbeeb45bd829de369c1d75647129..72af3cd778e928ee49ef5104de69d872520a000c 100644 (file)
@@ -1288,7 +1288,7 @@ virNetDevLinkDump(const char *ifname, int ifindex,
         }
     }
 
-    if (virNetlinkCommand(nl_msg, recvbuf, &recvbuflen, pid) < 0)
+    if (virNetlinkCommand(nl_msg, recvbuf, &recvbuflen, 0, pid) < 0)
         goto cleanup;
 
     if (recvbuflen < NLMSG_LENGTH(0) || *recvbuf == NULL)
@@ -1416,7 +1416,7 @@ virNetDevSetVfConfig(const char *ifname, int ifindex, int vf,
         }
     }
 
-    if (virNetlinkCommand(nl_msg, &recvbuf, &recvbuflen, pid) < 0)
+    if (virNetlinkCommand(nl_msg, &recvbuf, &recvbuflen, 0, pid) < 0)
         goto cleanup;
 
     if (recvbuflen < NLMSG_LENGTH(0) || recvbuf == NULL)
index 879d846e8522217dd3159021866d4a2dfa16a532..ef9e052dddfb8d929ff4692c9dbf70c2989af6bd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 Red Hat, Inc.
+ * Copyright (C) 2010-2012 Red Hat, Inc.
  * Copyright (C) 2010-2012 IBM Corporation
  *
  * This library is free software; you can redistribute it and/or
@@ -154,7 +154,7 @@ virNetDevMacVLanCreate(const char *ifname,
 
     nla_nest_end(nl_msg, linkinfo);
 
-    if (virNetlinkCommand(nl_msg, &recvbuf, &recvbuflen, 0) < 0) {
+    if (virNetlinkCommand(nl_msg, &recvbuf, &recvbuflen, 0, 0) < 0) {
         goto cleanup;
     }
 
@@ -242,7 +242,7 @@ int virNetDevMacVLanDelete(const char *ifname)
     if (nla_put(nl_msg, IFLA_IFNAME, strlen(ifname)+1, ifname) < 0)
         goto buffer_too_small;
 
-    if (virNetlinkCommand(nl_msg, &recvbuf, &recvbuflen, 0) < 0) {
+    if (virNetlinkCommand(nl_msg, &recvbuf, &recvbuflen, 0, 0) < 0) {
         goto cleanup;
     }
 
index 5b562be44bfb6805e516e9a048afd6c3fbb2e2b1..def5c620314473f327ae097184272354da28ed22 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2011 Red Hat, Inc.
+ * Copyright (C) 2009-2012 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -395,7 +395,7 @@ virNetDevVPortProfileOpSetLink(const char *ifname, int ifindex,
             goto cleanup;
     }
 
-    if (virNetlinkCommand(nl_msg, &recvbuf, &recvbuflen, pid) < 0)
+    if (virNetlinkCommand(nl_msg, &recvbuf, &recvbuflen, 0, pid) < 0)
         goto cleanup;
 
     if (recvbuflen < NLMSG_LENGTH(0) || recvbuf == NULL)
index 3577ecc9da1a36507254fce73b8d8dd85d43f41b..9bf5a76b027c625501d709c39040dd488f47a529 100644 (file)
@@ -158,12 +158,12 @@ virNetlinkShutdown(void)
  */
 int virNetlinkCommand(struct nl_msg *nl_msg,
                       unsigned char **respbuf, unsigned int *respbuflen,
-                      int nl_pid)
+                      uint32_t src_pid, uint32_t dst_pid)
 {
     int rc = 0;
     struct sockaddr_nl nladdr = {
             .nl_family = AF_NETLINK,
-            .nl_pid    = nl_pid,
+            .nl_pid    = dst_pid,
             .nl_groups = 0,
     };
     ssize_t nbytes;
@@ -191,7 +191,7 @@ int virNetlinkCommand(struct nl_msg *nl_msg,
 
     nlmsg_set_dst(nl_msg, &nladdr);
 
-    nlmsg->nlmsg_pid = getpid();
+    nlmsg->nlmsg_pid = src_pid ? src_pid : getpid();
 
     nbytes = nl_send_auto_complete(nlhandle, nl_msg);
     if (nbytes < 0) {
@@ -602,9 +602,10 @@ virNetlinkShutdown(void)
 }
 
 int virNetlinkCommand(struct nl_msg *nl_msg ATTRIBUTE_UNUSED,
-           unsigned char **respbuf ATTRIBUTE_UNUSED,
-           unsigned int *respbuflen ATTRIBUTE_UNUSED,
-           int nl_pid ATTRIBUTE_UNUSED)
+                      unsigned char **respbuf ATTRIBUTE_UNUSED,
+                      unsigned int *respbuflen ATTRIBUTE_UNUSED,
+                      uint32_t src_pid ATTRIBUTE_UNUSED,
+                      uint32_t dst_pid ATTRIBUTE_UNUSED)
 {
     netlinkError(VIR_ERR_INTERNAL_ERROR, "%s", _(unsupported));
     return -1;
index 93df59ad821aba81d315d0cead6673f1cce5035e..c57be821ffdfdd3908cd1a4eacbe9f20a900afb7 100644 (file)
@@ -40,7 +40,7 @@ void virNetlinkShutdown(void);
 
 int virNetlinkCommand(struct nl_msg *nl_msg,
                       unsigned char **respbuf, unsigned int *respbuflen,
-                      int nl_pid);
+                      uint32_t src_port, uint32_t dst_port);
 
 typedef void (*virNetlinkEventHandleCallback)(unsigned char *msg, int length, struct sockaddr_nl *peer, bool *handled, void *opaque);