]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virGetinterface matching of MAC and interface name
authorLaine Stump <laine@laine.org>
Tue, 21 Jul 2009 13:37:20 +0000 (15:37 +0200)
committerDaniel Veillard <veillard@redhat.com>
Tue, 21 Jul 2009 13:37:20 +0000 (15:37 +0200)
MAC address of a particular interface may change over time, and the
reduced virInterface object (which contains just name and mac) needs
to reflect these changes. Since we can't modify the mac address of an
existing virInterface (some other thread may currently be using it) we
just create a new virInterface, and let the old one die a dignified
death when its refct goes to 0.
* src/datatypes.c: fix the matching and lifetime of virInterface object
  accordingly

src/datatypes.c

index a8bffd2e4b0d478232c1f1255b4b4e54c39d4a4a..5f90aad34d62444541b323032bb2262c4a0da903 100644 (file)
@@ -516,9 +516,10 @@ virUnrefNetwork(virNetworkPtr network) {
  * @mac: pointer to the mac
  *
  * Lookup if the interface is already registered for that connection,
- * if yes return a new pointer to it, if no allocate a new structure,
- * and register it in the table. In any case a corresponding call to
- * virUnrefInterface() is needed to not leak data.
+ * if yes return a new pointer to it (possibly updating the MAC
+ * address), if no allocate a new structure, and register it in the
+ * table. In any case a corresponding call to virUnrefInterface() is
+ * needed to not leak data.
  *
  * Returns a pointer to the interface, or NULL in case of failure
  */
@@ -532,11 +533,9 @@ virGetInterface(virConnectPtr conn, const char *name, const char *mac) {
     }
     virMutexLock(&conn->lock);
 
-    /* TODO search by MAC first as they are better differentiators */
-
     ret = (virInterfacePtr) virHashLookup(conn->interfaces, name);
-    /* TODO check the MAC */
-    if (ret == NULL) {
+
+    if ((ret == NULL) || STRCASENEQ(ret->mac, mac)) {
         if (VIR_ALLOC(ret) < 0) {
             virReportOOMError(conn);
             goto error;
@@ -593,7 +592,6 @@ virReleaseInterface(virInterfacePtr iface) {
     virConnectPtr conn = iface->conn;
     DEBUG("release interface %p %s", iface, iface->name);
 
-    /* TODO search by MAC first as they are better differenciators */
     if (virHashRemoveEntry(conn->interfaces, iface->name, NULL) < 0)
         virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
                         _("interface missing from connection hash table"));