From nobody Thu Jul 3 20:39:45 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1528979625143904.5379974693196; Thu, 14 Jun 2018 05:33:45 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A6A953084054; Thu, 14 Jun 2018 12:33:43 +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 B57608FBE0; Thu, 14 Jun 2018 12:33:42 +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 5F1B818037ED; Thu, 14 Jun 2018 12:33:42 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w5ECXMXY008758 for ; Thu, 14 Jun 2018 08:33:22 -0400 Received: by smtp.corp.redhat.com (Postfix) id 039462024CBC; Thu, 14 Jun 2018 12:33:22 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id 789922024CBB; Thu, 14 Jun 2018 12:33:21 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Thu, 14 Jun 2018 13:33:00 +0100 Message-Id: <20180614123309.15659-12-berrange@redhat.com> In-Reply-To: <20180614123309.15659-1-berrange@redhat.com> References: <20180614123309.15659-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v3 11/20] nwfilter: convert IP address learning code to virNWFilterBindingDefPtr 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: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Thu, 14 Jun 2018 12:33:44 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Use the virNWFilterBindingDefPTr struct in the IP address learning code directly. Reviewed-by: John Ferlan Signed-off-by: Daniel P. Berrang=C3=A9 --- src/nwfilter/nwfilter_gentech_driver.c | 7 +- src/nwfilter/nwfilter_learnipaddr.c | 106 +++++++------------------ src/nwfilter/nwfilter_learnipaddr.h | 7 +- 3 files changed, 32 insertions(+), 88 deletions(-) diff --git a/src/nwfilter/nwfilter_gentech_driver.c b/src/nwfilter/nwfilter= _gentech_driver.c index 23e9998f53..ce45587a44 100644 --- a/src/nwfilter/nwfilter_gentech_driver.c +++ b/src/nwfilter/nwfilter_gentech_driver.c @@ -626,12 +626,9 @@ virNWFilterDoInstantiate(virNWFilterTechDriverPtr tech= driver, } else if (STRCASEEQ(learning, "any")) { if (!virNWFilterHasLearnReq(ifindex)) { rc =3D virNWFilterLearnIPAddress(techdriver, - binding->portdevname, + binding, ifindex, - binding->linkdevname, - &binding->mac, - filter->name, - binding->filterparams, = driver, + driver, DETECT_DHCP|DETECT_STAT= IC); } goto err_exit; diff --git a/src/nwfilter/nwfilter_learnipaddr.c b/src/nwfilter/nwfilter_le= arnipaddr.c index d76d13d8d4..55ed0bfc09 100644 --- a/src/nwfilter/nwfilter_learnipaddr.c +++ b/src/nwfilter/nwfilter_learnipaddr.c @@ -138,12 +138,8 @@ typedef struct _virNWFilterIPAddrLearnReq virNWFilterI= PAddrLearnReq; typedef virNWFilterIPAddrLearnReq *virNWFilterIPAddrLearnReqPtr; struct _virNWFilterIPAddrLearnReq { virNWFilterTechDriverPtr techdriver; - char ifname[IF_NAMESIZE]; int ifindex; - char linkdev[IF_NAMESIZE]; - virMacAddr macaddr; - char *filtername; - virHashTablePtr filterparams; + virNWFilterBindingDefPtr binding; virNWFilterDriverStatePtr driver; int howDetect; /* bitmask of enum howDetect */ =20 @@ -233,8 +229,7 @@ virNWFilterIPAddrLearnReqFree(virNWFilterIPAddrLearnReq= Ptr req) if (!req) return; =20 - VIR_FREE(req->filtername); - virHashFree(req->filterparams); + virNWFilterBindingDefFree(req->binding); =20 VIR_FREE(req); } @@ -405,8 +400,9 @@ learnIPAddressThread(void *arg) virNWFilterIPAddrLearnReqPtr req =3D arg; uint32_t vmaddr =3D 0, bcastaddr =3D 0; unsigned int ethHdrSize; - char *listen_if =3D (strlen(req->linkdev) !=3D 0) ? req->linkdev - : req->ifname; + char *listen_if =3D (req->binding->linkdevname ? + req->binding->linkdevname : + req->binding->portdevname); int dhcp_opts_len; char macaddr[VIR_MAC_STRING_BUFLEN]; virBuffer buf =3D VIR_BUFFER_INITIALIZER; @@ -417,13 +413,13 @@ learnIPAddressThread(void *arg) virNWFilterTechDriverPtr techdriver =3D req->techdriver; struct pollfd fds[1]; =20 - if (virNWFilterLockIface(req->ifname) < 0) + if (virNWFilterLockIface(req->binding->portdevname) < 0) goto err_no_lock; =20 req->status =3D 0; =20 /* anything change to the VM's interface -- check at least once */ - if (virNetDevValidateConfig(req->ifname, NULL, req->ifindex) <=3D 0) { + if (virNetDevValidateConfig(req->binding->portdevname, NULL, req->ifin= dex) <=3D 0) { virResetLastError(); req->status =3D ENODEV; goto done; @@ -440,11 +436,11 @@ learnIPAddressThread(void *arg) fds[0].fd =3D pcap_fileno(handle); fds[0].events =3D POLLIN | POLLERR; =20 - virMacAddrFormat(&req->macaddr, macaddr); + virMacAddrFormat(&req->binding->mac, macaddr); =20 if (req->howDetect =3D=3D DETECT_DHCP) { - if (techdriver->applyDHCPOnlyRules(req->ifname, - &req->macaddr, + if (techdriver->applyDHCPOnlyRules(req->binding->portdevname, + &req->binding->mac, NULL, false) < 0) { VIR_DEBUG("Unable to apply DHCP only rules"); req->status =3D EINVAL; @@ -452,8 +448,8 @@ learnIPAddressThread(void *arg) } virBufferAddLit(&buf, "src port 67 and dst port 68"); } else { - if (techdriver->applyBasicRules(req->ifname, - &req->macaddr) < 0) { + if (techdriver->applyBasicRules(req->binding->portdevname, + &req->binding->mac) < 0) { VIR_DEBUG("Unable to apply basic rules"); req->status =3D EINVAL; goto done; @@ -524,7 +520,7 @@ learnIPAddressThread(void *arg) } =20 /* Again, already handled above, but lets be sure */ - if (virNetDevValidateConfig(req->ifname, NULL, req->ifindex) <= =3D 0) { + if (virNetDevValidateConfig(req->binding->portdevname, NULL, r= eq->ifindex) <=3D 0) { virResetLastError(); req->status =3D ENODEV; showError =3D false; @@ -556,7 +552,7 @@ learnIPAddressThread(void *arg) continue; } =20 - if (virMacAddrCmpRaw(&req->macaddr, ether_hdr->ether_shost) = =3D=3D 0) { + if (virMacAddrCmpRaw(&req->binding->mac, ether_hdr->ether_shos= t) =3D=3D 0) { /* packets from the VM */ =20 if (etherType =3D=3D ETHERTYPE_IP && @@ -595,7 +591,7 @@ learnIPAddressThread(void *arg) break; } } - } else if (virMacAddrCmpRaw(&req->macaddr, + } else if (virMacAddrCmpRaw(&req->binding->mac, ether_hdr->ether_dhost) =3D=3D 0 || /* allow Broadcast replies from DHCP server */ virMacAddrIsBroadcastRaw(ether_hdr->ether_dhost)) { @@ -625,7 +621,7 @@ learnIPAddressThread(void *arg) ((char *)udphdr + sizeof(udphdr)); if (dhcp->op =3D=3D 2 /* BOOTREPLY */ && virMacAddrCmpRaw( - &req->macaddr, + &req->binding->mac, &dhcp->chaddr[0]) =3D=3D 0) { dhcp_opts_len =3D header.len - (ethHdrSize + iphdr->ihl * 4 + @@ -669,28 +665,19 @@ learnIPAddressThread(void *arg) * Also it is safe to unlock interface here because we stopped * capturing and applied necessary rules on the interface, while * instantiating a new filter doesn't require a locked interface.*/ - virNWFilterUnlockIface(req->ifname); + virNWFilterUnlockIface(req->binding->portdevname); =20 if ((inetaddr =3D virSocketAddrFormat(&sa)) !=3D NULL) { - virNWFilterBindingDef binding =3D { - .portdevname =3D req->ifname, - .linkdevname =3D req->linkdev, - .mac =3D req->macaddr, - .filter =3D req->filtername, - .filterparams =3D req->filterparams, - .ownername =3D NULL, - .owneruuid =3D {0}, - }; - if (virNWFilterIPAddrMapAddIPAddr(req->ifname, inetaddr) < 0) { + if (virNWFilterIPAddrMapAddIPAddr(req->binding->portdevname, i= netaddr) < 0) { VIR_ERROR(_("Failed to add IP address %s to IP address " - "cache for interface %s"), inetaddr, req->ifname= ); + "cache for interface %s"), inetaddr, req->bindin= g->portdevname); } =20 ret =3D virNWFilterInstantiateFilterLate(req->driver, - &binding, + req->binding, req->ifindex); VIR_DEBUG("Result from applying firewall rules on " - "%s with IP addr %s : %d", req->ifname, inetaddr, re= t); + "%s with IP addr %s : %d", req->binding->portdevname= , inetaddr, ret); VIR_FREE(inetaddr); } } else { @@ -698,13 +685,13 @@ learnIPAddressThread(void *arg) virReportSystemError(req->status, _("encountered an error on interface %s " "index %d"), - req->ifname, req->ifindex); + req->binding->portdevname, req->ifindex); =20 - techdriver->applyDropAllRules(req->ifname); - virNWFilterUnlockIface(req->ifname); + techdriver->applyDropAllRules(req->binding->portdevname); + virNWFilterUnlockIface(req->binding->portdevname); } =20 - VIR_DEBUG("pcap thread terminating for interface %s", req->ifname); + VIR_DEBUG("pcap thread terminating for interface %s", req->binding->po= rtdevname); =20 =20 err_no_lock: @@ -737,19 +724,14 @@ learnIPAddressThread(void *arg) */ int virNWFilterLearnIPAddress(virNWFilterTechDriverPtr techdriver, - const char *ifname, + virNWFilterBindingDefPtr binding, int ifindex, - const char *linkdev, - const virMacAddr *macaddr, - const char *filtername, - virHashTablePtr filterparams, virNWFilterDriverStatePtr driver, int howDetect) { int rc; virThread thread; virNWFilterIPAddrLearnReqPtr req =3D NULL; - virHashTablePtr ht =3D NULL; =20 if (howDetect =3D=3D 0) return -1; @@ -765,37 +747,11 @@ virNWFilterLearnIPAddress(virNWFilterTechDriverPtr te= chdriver, if (VIR_ALLOC(req) < 0) goto err_no_req; =20 - ht =3D virNWFilterHashTableCreate(0); - if (ht =3D=3D NULL) + if (!(req->binding =3D virNWFilterBindingDefCopy(binding))) goto err_free_req; =20 - if (virNWFilterHashTablePutAll(filterparams, ht) < 0) - goto err_free_ht; - - if (VIR_STRDUP(req->filtername, filtername) < 0) - goto err_free_ht; - - if (virStrcpyStatic(req->ifname, ifname) =3D=3D NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Destination buffer for ifname ('%s') " - "not large enough"), ifname); - goto err_free_ht; - } - - if (linkdev) { - if (virStrcpyStatic(req->linkdev, linkdev) =3D=3D NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Destination buffer for linkdev ('%s') " - "not large enough"), linkdev); - goto err_free_ht; - } - } - req->ifindex =3D ifindex; - virMacAddrSet(&req->macaddr, macaddr); req->driver =3D driver; - req->filterparams =3D ht; - ht =3D NULL; req->howDetect =3D howDetect; req->techdriver =3D techdriver; =20 @@ -814,8 +770,6 @@ virNWFilterLearnIPAddress(virNWFilterTechDriverPtr tech= driver, =20 err_dereg_req: virNWFilterDeregisterLearnReq(ifindex); - err_free_ht: - virHashFree(ht); err_free_req: virNWFilterIPAddrLearnReqFree(req); err_no_req: @@ -826,12 +780,8 @@ virNWFilterLearnIPAddress(virNWFilterTechDriverPtr tec= hdriver, =20 int virNWFilterLearnIPAddress(virNWFilterTechDriverPtr techdriver ATTRIBUTE_UN= USED, - const char *ifname ATTRIBUTE_UNUSED, + virNWFilterBindingDefPtr binding ATTRIBUTE_UNUSE= D, int ifindex ATTRIBUTE_UNUSED, - const char *linkdev ATTRIBUTE_UNUSED, - const virMacAddr *macaddr ATTRIBUTE_UNUSED, - const char *filtername ATTRIBUTE_UNUSED, - virHashTablePtr filterparams ATTRIBUTE_UNUSED, virNWFilterDriverStatePtr driver ATTRIBUTE_UNUSE= D, int howDetect ATTRIBUTE_UNUSED) { diff --git a/src/nwfilter/nwfilter_learnipaddr.h b/src/nwfilter/nwfilter_le= arnipaddr.h index 753aabc594..7f17244100 100644 --- a/src/nwfilter/nwfilter_learnipaddr.h +++ b/src/nwfilter/nwfilter_learnipaddr.h @@ -28,6 +28,7 @@ =20 # include "conf/nwfilter_params.h" # include "nwfilter_tech_driver.h" +# include "virnwfilterbindingdef.h" # include =20 enum howDetect { @@ -36,12 +37,8 @@ enum howDetect { }; =20 int virNWFilterLearnIPAddress(virNWFilterTechDriverPtr techdriver, - const char *ifname, + virNWFilterBindingDefPtr binding, int ifindex, - const char *linkdev, - const virMacAddr *macaddr, - const char *filtername, - virHashTablePtr filterparams, virNWFilterDriverStatePtr driver, int howDetect); =20 --=20 2.17.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list