From nobody Sat Feb 7 06:35:58 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) client-ip=205.139.110.61; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) by mx.zohomail.com with SMTPS id 1580230168592658.3938767778088; Tue, 28 Jan 2020 08:49:28 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-32-56nkoXF9NoS6-19Uvb24uw-1; Tue, 28 Jan 2020 11:49:11 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7ACDD1005510; Tue, 28 Jan 2020 16:49:05 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4A90A4521; Tue, 28 Jan 2020 16:49:05 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id C15531803C37; Tue, 28 Jan 2020 16:49:04 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 00SGn3JP028284 for ; Tue, 28 Jan 2020 11:49:03 -0500 Received: by smtp.corp.redhat.com (Postfix) id 0D73AD1BCC; Tue, 28 Jan 2020 16:49:03 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0925363A70 for ; Tue, 28 Jan 2020 16:49:00 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A6B74185B0CA for ; Tue, 28 Jan 2020 16:49:00 +0000 (UTC) Received: from mail-qv1-f66.google.com (mail-qv1-f66.google.com [209.85.219.66]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-236-dxvJBlgmNLaTmFaUmCNc6Q-1; Tue, 28 Jan 2020 11:48:54 -0500 Received: by mail-qv1-f66.google.com with SMTP id m5so3436457qvv.4; Tue, 28 Jan 2020 08:48:54 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7cb:a9a6:59b3:4b4:e00c:2a48]) by smtp.gmail.com with ESMTPSA id n132sm13013505qke.58.2020.01.28.08.48.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jan 2020 08:48:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580230167; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=wIJKJwAirfUdLtgmYKdVR+j3CduyetcNPjHJONH4mtw=; b=RyHwk3LxxNGDbfwLmGEstexQ0iF89p1wwRjfb9pzy0rXqFrpJznyGW1oki2kD7w4A+9vVm jvi/G8uXHquZfvcrJIFIQAn/oM9YJjXNcyMfof0Xb6tLjVgSDRGM7JMaR2/IjuuWVCphYy IX/LPTAHIMaxBkGYHN0V5hBDdXBQdMc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+Vt9Bb2OFnDY8RdK+5heP3rOwv0C4jkLyuCq1YgV79k=; b=AhFd5pvpMaoIvcLx74b+VpsVySHY0JgKP+LuMNdBW7UiGyBkELecGNgZBdq/vd2yRW 0gbCvi5nB2IvFLYnhLWy3MYb+BcAspFuZPsnhF/qtE3xU+8dBxLsFciIla/CyRTFSD0+ G7Z6oq1xfGalTwjCxkXboH2pQguV4Rg0g02qdBFWuRUi2qp6d8wgxFpda7Lxu5ZVBb/O ly3VrdEFbi5qtNbIY7HiknyeB+RZsw+lSJpC1A9yO7NVpiYxdsctcwWpLCQCSQwxya+O bTkWWhkCQ5/hHyRWBmvDlWVykzMVbC7xSKXsOkpdw4A5G+0Xpkgz3uy7cxq810C8pPwj 8zEA== X-Gm-Message-State: APjAAAUDHKo3xlEWt7sSnptaDlhsAtTe5Awub89tXotbv+2l5qIGFa8h hKtiU5cmTsmV2Km/5lE88IUSFO/4 X-Google-Smtp-Source: APXvYqyLtAoBRvw9u/cy8GtLxybj4QSW89tIUUhEj5DLqVCTKfWYkNeFaL1a8/w6i+Xfw+FZik4AKw== X-Received: by 2002:ad4:5525:: with SMTP id ba5mr22371148qvb.117.1580230133237; Tue, 28 Jan 2020 08:48:53 -0800 (PST) From: Julio Faracco To: libvir-list@redhat.com Subject: [PATCH v2 1/4] lxc: refactor lxcNetworkParseData pointers to use new structures Date: Tue, 28 Jan 2020 13:48:20 -0300 Message-Id: <20200128164822.32047-2-jcfaracco@gmail.com> In-Reply-To: <20200128164822.32047-1-jcfaracco@gmail.com> References: <20200128164822.32047-1-jcfaracco@gmail.com> MIME-Version: 1.0 X-MC-Unique: dxvJBlgmNLaTmFaUmCNc6Q-1 X-MC-Unique: 56nkoXF9NoS6-19Uvb24uw-1 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 00SGn3JP028284 X-loop: libvir-list@redhat.com 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Struct lxcNetworkParseData is being used as a single pointer which iterates through LXC config lines. It means that it will be applied as a network each time that a new type appears. After, the same struct is used to populate a new network interface. This commit changes this logic to multiple lxcNetworkParseData to move this strcuture to an array. It makes more sense if we are using indexes to fill interface settings. This is better to improve code clarity. This commit still introduces *Legacy() functions to keep support of network old style definitions. Signed-off-by: Julio Faracco --- src/lxc/lxc_native.c | 129 +++++++++++++++++++++++-------------------- 1 file changed, 68 insertions(+), 61 deletions(-) diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index dd2345c324..b101848c09 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -411,7 +411,9 @@ lxcCreateHostdevDef(int mode, int type, const char *dat= a) return hostdev; } =20 -typedef struct { +typedef struct _lxcNetworkParseData lxcNetworkParseData; +typedef lxcNetworkParseData *lxcNetworkParseDataPtr; +struct _lxcNetworkParseData { virDomainDefPtr def; char *type; char *link; @@ -424,9 +426,14 @@ typedef struct { size_t nips; char *gateway_ipv4; char *gateway_ipv6; - bool privnet; - size_t networks; -} lxcNetworkParseData; + size_t index; +}; + +typedef struct { + size_t ndata; + lxcNetworkParseDataPtr *parseData; +} lxcNetworkParseDataArray; + =20 static int lxcAddNetworkRouteDefinition(const char *address, @@ -552,39 +559,6 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data) } =20 =20 -static int -lxcNetworkParseDataType(virConfValuePtr value, - lxcNetworkParseData *parseData) -{ - virDomainDefPtr def =3D parseData->def; - size_t networks =3D parseData->networks; - bool privnet =3D parseData->privnet; - int status; - - /* Store the previous NIC */ - status =3D lxcAddNetworkDefinition(parseData); - - if (status < 0) - return -1; - else if (status > 0) - networks++; - else if (parseData->type !=3D NULL && STREQ(parseData->type, "none")) - privnet =3D false; - - /* clean NIC to store a new one */ - memset(parseData, 0, sizeof(*parseData)); - - parseData->def =3D def; - parseData->networks =3D networks; - parseData->privnet =3D privnet; - - /* Keep the new value */ - parseData->type =3D value->str; - - return 0; -} - - static int lxcNetworkParseDataIPs(const char *name, virConfValuePtr value, @@ -633,8 +607,7 @@ lxcNetworkParseDataSuffix(const char *entry, =20 switch (elem) { case VIR_LXC_NETWORK_CONFIG_TYPE: - if (lxcNetworkParseDataType(value, parseData) < 0) - return -1; + parseData->type =3D value->str; break; case VIR_LXC_NETWORK_CONFIG_LINK: parseData->link =3D value->str; @@ -676,12 +649,40 @@ lxcNetworkParseDataSuffix(const char *entry, } =20 =20 +static lxcNetworkParseDataPtr +lxcNetworkGetParseDataByIndexLegacy(lxcNetworkParseDataArray *networks, + const char *entry) +{ + int elem =3D virLXCNetworkConfigEntryTypeFromString(entry); + size_t ndata =3D networks->ndata; + + if (elem =3D=3D VIR_LXC_NETWORK_CONFIG_TYPE) { + /* Index was not found. So, it is time to add new * + * interface and return this last position. */ + if (VIR_EXPAND_N(networks->parseData, networks->ndata, 1) < 0) + return NULL; + + networks->parseData[ndata] =3D g_new0(lxcNetworkParseData, 1); + networks->parseData[ndata]->index =3D networks->ndata; + + return networks->parseData[ndata]; + } + + /* Return last element added like a stack. */ + return networks->parseData[ndata - 1]; +} + + static int -lxcNetworkParseDataEntry(const char *name, - virConfValuePtr value, - lxcNetworkParseData *parseData) +lxcNetworkParseDataEntryLegacy(const char *name, + virConfValuePtr value, + lxcNetworkParseDataArray *networks) { const char *suffix =3D STRSKIP(name, "lxc.network."); + lxcNetworkParseData *parseData; + + if (!(parseData =3D lxcNetworkGetParseDataByIndexLegacy(networks, suff= ix))) + return -1; =20 return lxcNetworkParseDataSuffix(suffix, value, parseData); } @@ -690,10 +691,10 @@ lxcNetworkParseDataEntry(const char *name, static int lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data) { - lxcNetworkParseData *parseData =3D data; + lxcNetworkParseDataArray *networks =3D data; =20 if (STRPREFIX(name, "lxc.network.")) - return lxcNetworkParseDataEntry(name, value, parseData); + return lxcNetworkParseDataEntryLegacy(name, value, networks); =20 return 0; } @@ -702,35 +703,41 @@ static int lxcConvertNetworkSettings(virDomainDefPtr def, virConfPtr properties) { int status; - size_t i; - lxcNetworkParseData data =3D {def, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, 0, - NULL, NULL, true, 0}; + bool privnet =3D true; + size_t i, j; + lxcNetworkParseDataArray networks =3D {0, NULL}; + + networks.parseData =3D g_new0(lxcNetworkParseDataPtr, 1); =20 - if (virConfWalk(properties, lxcNetworkWalkCallback, &data) < 0) + if (virConfWalk(properties, lxcNetworkWalkCallback, &networks) < 0) goto error; =20 + for (i =3D 0; i < networks.ndata; i++) { + lxcNetworkParseDataPtr data =3D networks.parseData[i]; + data->def =3D def; =20 - /* Add the last network definition found */ - status =3D lxcAddNetworkDefinition(&data); + status =3D lxcAddNetworkDefinition(data); =20 - if (status < 0) - goto error; - else if (status > 0) - data.networks++; - else if (data.type !=3D NULL && STREQ(data.type, "none")) - data.privnet =3D false; + if (status < 0) + goto error; + else if (data->type !=3D NULL && STREQ(data->type, "none")) + privnet =3D false; + } =20 - if (data.networks =3D=3D 0 && data.privnet) { + if (networks.ndata =3D=3D 0 && privnet) { /* When no network type is provided LXC only adds loopback */ def->features[VIR_DOMAIN_FEATURE_PRIVNET] =3D VIR_TRISTATE_SWITCH_= ON; } return 0; =20 error: - for (i =3D 0; i < data.nips; i++) - VIR_FREE(data.ips[i]); - VIR_FREE(data.ips); + for (i =3D 0; i < networks.ndata; i++) { + lxcNetworkParseDataPtr data =3D networks.parseData[i]; + for (j =3D 0; j < data->nips; j++) + VIR_FREE(data->ips[j]); + VIR_FREE(data->ips); + } + VIR_FREE(networks.parseData); return -1; } =20 --=20 2.20.1