From nobody Sun Feb 8 18:49:01 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.37 as permitted sender) client-ip=209.132.183.37; envelope-from=libvir-list-bounces@redhat.com; helo=mx5-phx2.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.37 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx5-phx2.redhat.com (mx5-phx2.redhat.com [209.132.183.37]) by mx.zohomail.com with SMTPS id 14886334608221.429721919782196; Sat, 4 Mar 2017 05:17:40 -0800 (PST) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx5-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v24DChoc056876; Sat, 4 Mar 2017 08:12:43 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v24DCftl029275 for ; Sat, 4 Mar 2017 08:12:41 -0500 Received: from localhost.localdomain.com (ovpn-116-78.phx2.redhat.com [10.3.116.78]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v24DCe03009154 for ; Sat, 4 Mar 2017 08:12:41 -0500 From: John Ferlan To: libvir-list@redhat.com Date: Sat, 4 Mar 2017 08:12:32 -0500 Message-Id: <20170304131235.2057-2-jferlan@redhat.com> In-Reply-To: <20170304131235.2057-1-jferlan@redhat.com> References: <20170304131235.2057-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 1/4] conf: Introduce virinterfaceobj X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Move all the InterfaceObj API's into their own module virinterfaceobj from the interface_conf Purely code motion at this point. Signed-off-by: John Ferlan --- po/POTFILES.in | 1 + src/Makefile.am | 3 +- src/conf/interface_conf.c | 166 -------------------------- src/conf/interface_conf.h | 45 ------- src/conf/virinterfaceobj.c | 201 ++++++++++++++++++++++++++++= ++++ src/conf/virinterfaceobj.h | 70 +++++++++++ src/interface/interface_backend_netcf.c | 1 + src/interface/interface_backend_udev.c | 1 + src/libvirt_private.syms | 19 +-- src/test/test_driver.c | 1 + 10 files changed, 288 insertions(+), 220 deletions(-) create mode 100644 src/conf/virinterfaceobj.c create mode 100644 src/conf/virinterfaceobj.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 7c7f530..50289a5 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -42,6 +42,7 @@ src/conf/snapshot_conf.c src/conf/storage_conf.c src/conf/virchrdev.c src/conf/virdomainobjlist.c +src/conf/virinterfaceobj.c src/conf/virnodedeviceobj.c src/conf/virsecretobj.c src/cpu/cpu.c diff --git a/src/Makefile.am b/src/Makefile.am index 7d42eac..c85927f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -381,7 +381,8 @@ STORAGE_CONF_SOURCES =3D = \ =20 # Interface driver generic impl APIs INTERFACE_CONF_SOURCES =3D \ - conf/interface_conf.c conf/interface_conf.h + conf/interface_conf.c conf/interface_conf.h \ + conf/virinterfaceobj.c conf/virinterfaceobj.h =20 # Secret driver generic impl APIs SECRET_CONF_SOURCES =3D \ diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c index e1e6a25..dc2ddd4 100644 --- a/src/conf/interface_conf.c +++ b/src/conf/interface_conf.c @@ -1114,169 +1114,3 @@ char *virInterfaceDefFormat(const virInterfaceDef *= def) } return virBufferContentAndReset(&buf); } - -/* virInterfaceObj manipulation */ - -void virInterfaceObjLock(virInterfaceObjPtr obj) -{ - virMutexLock(&obj->lock); -} - -void virInterfaceObjUnlock(virInterfaceObjPtr obj) -{ - virMutexUnlock(&obj->lock); -} - -void virInterfaceObjFree(virInterfaceObjPtr iface) -{ - if (!iface) - return; - - virInterfaceDefFree(iface->def); - virMutexDestroy(&iface->lock); - VIR_FREE(iface); -} - -/* virInterfaceObjList manipulation */ - -int virInterfaceFindByMACString(virInterfaceObjListPtr interfaces, - const char *mac, - virInterfaceObjPtr *matches, int maxmatche= s) -{ - size_t i; - unsigned int matchct =3D 0; - - for (i =3D 0; i < interfaces->count; i++) { - - virInterfaceObjLock(interfaces->objs[i]); - if (STRCASEEQ(interfaces->objs[i]->def->mac, mac)) { - matchct++; - if (matchct <=3D maxmatches) { - matches[matchct - 1] =3D interfaces->objs[i]; - /* keep the lock if we're returning object to caller */ - /* it is the caller's responsibility to unlock *all* match= es */ - continue; - } - } - virInterfaceObjUnlock(interfaces->objs[i]); - - } - return matchct; -} - -virInterfaceObjPtr virInterfaceFindByName(virInterfaceObjListPtr interface= s, - const char *name) -{ - size_t i; - - for (i =3D 0; i < interfaces->count; i++) { - virInterfaceObjLock(interfaces->objs[i]); - if (STREQ(interfaces->objs[i]->def->name, name)) - return interfaces->objs[i]; - virInterfaceObjUnlock(interfaces->objs[i]); - } - - return NULL; -} - -void virInterfaceObjListFree(virInterfaceObjListPtr interfaces) -{ - size_t i; - - for (i =3D 0; i < interfaces->count; i++) - virInterfaceObjFree(interfaces->objs[i]); - - VIR_FREE(interfaces->objs); - interfaces->count =3D 0; -} - -int virInterfaceObjListClone(virInterfaceObjListPtr src, - virInterfaceObjListPtr dest) -{ - int ret =3D -1; - size_t i; - unsigned int cnt; - - if (!src || !dest) - goto cleanup; - - virInterfaceObjListFree(dest); /* start with an empty list */ - cnt =3D src->count; - for (i =3D 0; i < cnt; i++) { - virInterfaceDefPtr def =3D src->objs[i]->def; - virInterfaceDefPtr backup; - virInterfaceObjPtr iface; - char *xml =3D virInterfaceDefFormat(def); - - if (!xml) - goto cleanup; - - if ((backup =3D virInterfaceDefParseString(xml)) =3D=3D NULL) { - VIR_FREE(xml); - goto cleanup; - } - - VIR_FREE(xml); - if ((iface =3D virInterfaceAssignDef(dest, backup)) =3D=3D NULL) - goto cleanup; - virInterfaceObjUnlock(iface); /* was locked by virInterfaceAssignD= ef */ - } - - ret =3D cnt; - cleanup: - if ((ret < 0) && dest) - virInterfaceObjListFree(dest); - return ret; -} - -virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces, - virInterfaceDefPtr def) -{ - virInterfaceObjPtr iface; - - if ((iface =3D virInterfaceFindByName(interfaces, def->name))) { - virInterfaceDefFree(iface->def); - iface->def =3D def; - - return iface; - } - - if (VIR_ALLOC(iface) < 0) - return NULL; - if (virMutexInit(&iface->lock) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("cannot initialize mutex")); - VIR_FREE(iface); - return NULL; - } - virInterfaceObjLock(iface); - - if (VIR_APPEND_ELEMENT_COPY(interfaces->objs, - interfaces->count, iface) < 0) { - virInterfaceObjFree(iface); - return NULL; - } - - iface->def =3D def; - return iface; - -} - -void virInterfaceRemove(virInterfaceObjListPtr interfaces, - virInterfaceObjPtr iface) -{ - size_t i; - - virInterfaceObjUnlock(iface); - for (i =3D 0; i < interfaces->count; i++) { - virInterfaceObjLock(interfaces->objs[i]); - if (interfaces->objs[i] =3D=3D iface) { - virInterfaceObjUnlock(interfaces->objs[i]); - virInterfaceObjFree(interfaces->objs[i]); - - VIR_DELETE_ELEMENT(interfaces->objs, i, interfaces->count); - break; - } - virInterfaceObjUnlock(interfaces->objs[i]); - } -} diff --git a/src/conf/interface_conf.h b/src/conf/interface_conf.h index 2523207..7325d65 100644 --- a/src/conf/interface_conf.h +++ b/src/conf/interface_conf.h @@ -161,46 +161,7 @@ struct _virInterfaceDef { virInterfaceProtocolDefPtr *protos; /* ptr to array of protos[nprotos]= */ }; =20 -typedef struct _virInterfaceObj virInterfaceObj; -typedef virInterfaceObj *virInterfaceObjPtr; -struct _virInterfaceObj { - virMutex lock; - - bool active; /* true if interface is active (up) */ - virInterfaceDefPtr def; /* The interface definition */ -}; - -typedef struct _virInterfaceObjList virInterfaceObjList; -typedef virInterfaceObjList *virInterfaceObjListPtr; -struct _virInterfaceObjList { - size_t count; - virInterfaceObjPtr *objs; -}; - -static inline bool -virInterfaceObjIsActive(const virInterfaceObj *iface) -{ - return iface->active; -} - -int virInterfaceFindByMACString(virInterfaceObjListPtr interfaces, - const char *mac, - virInterfaceObjPtr *matches, int maxmatche= s); -virInterfaceObjPtr virInterfaceFindByName(virInterfaceObjListPtr interface= s, - const char *name); - - void virInterfaceDefFree(virInterfaceDefPtr def); -void virInterfaceObjFree(virInterfaceObjPtr iface); -void virInterfaceObjListFree(virInterfaceObjListPtr vms); -int virInterfaceObjListClone(virInterfaceObjListPtr src, - virInterfaceObjListPtr dest); - - -virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces, - virInterfaceDefPtr def); -void virInterfaceRemove(virInterfaceObjListPtr interfaces, - virInterfaceObjPtr iface); =20 virInterfaceDefPtr virInterfaceDefParseString(const char *xmlStr); virInterfaceDefPtr virInterfaceDefParseFile(const char *filename); @@ -209,12 +170,6 @@ virInterfaceDefPtr virInterfaceDefParseNode(xmlDocPtr = xml, =20 char *virInterfaceDefFormat(const virInterfaceDef *def); =20 -void virInterfaceObjLock(virInterfaceObjPtr obj); -void virInterfaceObjUnlock(virInterfaceObjPtr obj); - -typedef bool (*virInterfaceObjListFilter)(virConnectPtr conn, - virInterfaceDefPtr def); - # define VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE \ (VIR_CONNECT_LIST_INTERFACES_ACTIVE | \ VIR_CONNECT_LIST_INTERFACES_INACTIVE) diff --git a/src/conf/virinterfaceobj.c b/src/conf/virinterfaceobj.c new file mode 100644 index 0000000..6c18911 --- /dev/null +++ b/src/conf/virinterfaceobj.c @@ -0,0 +1,201 @@ +/* + * virinterfaceobj.c: interface object handling + * (derived from interface_conf.c) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include + +#include "datatypes.h" +#include "interface_conf.h" + +#include "viralloc.h" +#include "virerror.h" +#include "virinterfaceobj.h" +#include "virlog.h" +#include "virstring.h" + +#define VIR_FROM_THIS VIR_FROM_INTERFACE + +VIR_LOG_INIT("conf.virinterfaceobj"); + + + +/* virInterfaceObj manipulation */ + +void virInterfaceObjLock(virInterfaceObjPtr obj) +{ + virMutexLock(&obj->lock); +} + +void virInterfaceObjUnlock(virInterfaceObjPtr obj) +{ + virMutexUnlock(&obj->lock); +} + +void virInterfaceObjFree(virInterfaceObjPtr iface) +{ + if (!iface) + return; + + virInterfaceDefFree(iface->def); + virMutexDestroy(&iface->lock); + VIR_FREE(iface); +} + +/* virInterfaceObjList manipulation */ + +int virInterfaceFindByMACString(virInterfaceObjListPtr interfaces, + const char *mac, + virInterfaceObjPtr *matches, int maxmatche= s) +{ + size_t i; + unsigned int matchct =3D 0; + + for (i =3D 0; i < interfaces->count; i++) { + + virInterfaceObjLock(interfaces->objs[i]); + if (STRCASEEQ(interfaces->objs[i]->def->mac, mac)) { + matchct++; + if (matchct <=3D maxmatches) { + matches[matchct - 1] =3D interfaces->objs[i]; + /* keep the lock if we're returning object to caller */ + /* it is the caller's responsibility to unlock *all* match= es */ + continue; + } + } + virInterfaceObjUnlock(interfaces->objs[i]); + + } + return matchct; +} + +virInterfaceObjPtr virInterfaceFindByName(virInterfaceObjListPtr interface= s, + const char *name) +{ + size_t i; + + for (i =3D 0; i < interfaces->count; i++) { + virInterfaceObjLock(interfaces->objs[i]); + if (STREQ(interfaces->objs[i]->def->name, name)) + return interfaces->objs[i]; + virInterfaceObjUnlock(interfaces->objs[i]); + } + + return NULL; +} + +void virInterfaceObjListFree(virInterfaceObjListPtr interfaces) +{ + size_t i; + + for (i =3D 0; i < interfaces->count; i++) + virInterfaceObjFree(interfaces->objs[i]); + + VIR_FREE(interfaces->objs); + interfaces->count =3D 0; +} + +int virInterfaceObjListClone(virInterfaceObjListPtr src, + virInterfaceObjListPtr dest) +{ + int ret =3D -1; + size_t i; + unsigned int cnt; + + if (!src || !dest) + goto cleanup; + + virInterfaceObjListFree(dest); /* start with an empty list */ + cnt =3D src->count; + for (i =3D 0; i < cnt; i++) { + virInterfaceDefPtr def =3D src->objs[i]->def; + virInterfaceDefPtr backup; + virInterfaceObjPtr iface; + char *xml =3D virInterfaceDefFormat(def); + + if (!xml) + goto cleanup; + + if ((backup =3D virInterfaceDefParseString(xml)) =3D=3D NULL) { + VIR_FREE(xml); + goto cleanup; + } + + VIR_FREE(xml); + if ((iface =3D virInterfaceAssignDef(dest, backup)) =3D=3D NULL) + goto cleanup; + virInterfaceObjUnlock(iface); /* was locked by virInterfaceAssignD= ef */ + } + + ret =3D cnt; + cleanup: + if ((ret < 0) && dest) + virInterfaceObjListFree(dest); + return ret; +} + +virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces, + virInterfaceDefPtr def) +{ + virInterfaceObjPtr iface; + + if ((iface =3D virInterfaceFindByName(interfaces, def->name))) { + virInterfaceDefFree(iface->def); + iface->def =3D def; + + return iface; + } + + if (VIR_ALLOC(iface) < 0) + return NULL; + if (virMutexInit(&iface->lock) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("cannot initialize mutex")); + VIR_FREE(iface); + return NULL; + } + virInterfaceObjLock(iface); + + if (VIR_APPEND_ELEMENT_COPY(interfaces->objs, + interfaces->count, iface) < 0) { + virInterfaceObjFree(iface); + return NULL; + } + + iface->def =3D def; + return iface; + +} + +void virInterfaceRemove(virInterfaceObjListPtr interfaces, + virInterfaceObjPtr iface) +{ + size_t i; + + virInterfaceObjUnlock(iface); + for (i =3D 0; i < interfaces->count; i++) { + virInterfaceObjLock(interfaces->objs[i]); + if (interfaces->objs[i] =3D=3D iface) { + virInterfaceObjUnlock(interfaces->objs[i]); + virInterfaceObjFree(interfaces->objs[i]); + + VIR_DELETE_ELEMENT(interfaces->objs, i, interfaces->count); + break; + } + virInterfaceObjUnlock(interfaces->objs[i]); + } +} diff --git a/src/conf/virinterfaceobj.h b/src/conf/virinterfaceobj.h new file mode 100644 index 0000000..51d7c75 --- /dev/null +++ b/src/conf/virinterfaceobj.h @@ -0,0 +1,70 @@ +/* + * virinterfaceobj.h: interface object handling entry points + * (derived from interface_conf.h) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#ifndef __VIRINTERFACEOBJ_H__ +# define __VIRINTERFACEOBJ_H__ + +# include "internal.h" + +typedef struct _virInterfaceObj virInterfaceObj; +typedef virInterfaceObj *virInterfaceObjPtr; +struct _virInterfaceObj { + virMutex lock; + + bool active; /* true if interface is active (up) */ + virInterfaceDefPtr def; /* The interface definition */ +}; + +typedef struct _virInterfaceObjList virInterfaceObjList; +typedef virInterfaceObjList *virInterfaceObjListPtr; +struct _virInterfaceObjList { + size_t count; + virInterfaceObjPtr *objs; +}; + +static inline bool +virInterfaceObjIsActive(const virInterfaceObj *iface) +{ + return iface->active; +} + +int virInterfaceFindByMACString(virInterfaceObjListPtr interfaces, + const char *mac, + virInterfaceObjPtr *matches, int maxmatche= s); +virInterfaceObjPtr virInterfaceFindByName(virInterfaceObjListPtr interface= s, + const char *name); + + +void virInterfaceObjFree(virInterfaceObjPtr iface); +void virInterfaceObjListFree(virInterfaceObjListPtr vms); +int virInterfaceObjListClone(virInterfaceObjListPtr src, + virInterfaceObjListPtr dest); + + +virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces, + virInterfaceDefPtr def); +void virInterfaceRemove(virInterfaceObjListPtr interfaces, + virInterfaceObjPtr iface); + +void virInterfaceObjLock(virInterfaceObjPtr obj); +void virInterfaceObjUnlock(virInterfaceObjPtr obj); + +typedef bool (*virInterfaceObjListFilter)(virConnectPtr conn, + virInterfaceDefPtr def); +#endif /* __VIRINTERFACEOBJ_H__ */ diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interf= ace_backend_netcf.c index 0181635..700a8a0 100644 --- a/src/interface/interface_backend_netcf.c +++ b/src/interface/interface_backend_netcf.c @@ -33,6 +33,7 @@ #include "virlog.h" #include "virstring.h" #include "viraccessapicheck.h" +#include "virinterfaceobj.h" =20 #define VIR_FROM_THIS VIR_FROM_INTERFACE =20 diff --git a/src/interface/interface_backend_udev.c b/src/interface/interfa= ce_backend_udev.c index 5d0fc64..18a45fa 100644 --- a/src/interface/interface_backend_udev.c +++ b/src/interface/interface_backend_udev.c @@ -34,6 +34,7 @@ #include "viralloc.h" #include "virstring.h" #include "viraccessapicheck.h" +#include "virinterfaceobj.h" #include "virnetdev.h" =20 #define VIR_FROM_THIS VIR_FROM_INTERFACE diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index aed1d3d..b39e17d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -594,19 +594,11 @@ virDomainConfVMNWFilterTeardown; =20 =20 # conf/interface_conf.h -virInterfaceAssignDef; virInterfaceDefFormat; virInterfaceDefFree; virInterfaceDefParseFile; virInterfaceDefParseNode; virInterfaceDefParseString; -virInterfaceFindByMACString; -virInterfaceFindByName; -virInterfaceObjListClone; -virInterfaceObjListFree; -virInterfaceObjLock; -virInterfaceObjUnlock; -virInterfaceRemove; =20 =20 # conf/netdev_bandwidth_conf.h @@ -948,6 +940,17 @@ virDomainObjListRemoveLocked; virDomainObjListRename; =20 =20 +# conf/virinterfaceobj.h +virInterfaceAssignDef; +virInterfaceFindByMACString; +virInterfaceFindByName; +virInterfaceObjListClone; +virInterfaceObjListFree; +virInterfaceObjLock; +virInterfaceObjUnlock; +virInterfaceRemove; + + # conf/virnodedeviceobj.h virNodeDeviceObjAssignDef; virNodeDeviceObjFindByName; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 61c82b9..e72a91f 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -64,6 +64,7 @@ #include "virauth.h" #include "viratomic.h" #include "virdomainobjlist.h" +#include "virinterfaceobj.h" #include "virhostcpu.h" =20 #define VIR_FROM_THIS VIR_FROM_TEST --=20 2.9.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list