From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: passt.top; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=e7uAM/ch; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by passt.top (Postfix) with ESMTPS id 5FA295A0626 for ; Fri, 26 Jun 2026 04:45:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782441938; h=from:from: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; bh=NsRrE1Obush/pjNO24sr14WCXPb4ZvyQyKlaNW/Be6c=; b=e7uAM/chfwmSreMeH9rjpB4EUI6YkKElZG4zZT0+N0D3vnhIjGaN/OUTyvT5LvWvIC2su9 nH+HUE5JwJ8QghdyxAp8hwHlU6IV71BEJq0LTMlEQSPWD1lzCv2CPLGzHew7Inr2WFbM6o 6jnNUQo5meFXK4cwAPEtmG2iS4O20fo= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-600-7dYXB3A8McSmPdSMY1sG9w-1; Thu, 25 Jun 2026 22:45:35 -0400 X-MC-Unique: 7dYXB3A8McSmPdSMY1sG9w-1 X-Mimecast-MFC-AGG-ID: 7dYXB3A8McSmPdSMY1sG9w_1782441934 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 203091955DAC; Fri, 26 Jun 2026 02:45:34 +0000 (UTC) Received: from jmaloy-thinkpadp16vgen1.rmtcaqc.csb (unknown [10.22.88.44]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 673D5195608F; Fri, 26 Jun 2026 02:45:33 +0000 (UTC) From: Jon Maloy To: sbrivio@redhat.com, david@gibson.dropbear.id.au, jmaloy@redhat.com, passt-dev@passt.top Subject: [PATCH v8 11/14] dhcp: Select address for DHCP distribution Date: Thu, 25 Jun 2026 22:45:16 -0400 Message-ID: <20260626024519.3701556-12-jmaloy@redhat.com> In-Reply-To: <20260626024519.3701556-1-jmaloy@redhat.com> References: <20260626024519.3701556-1-jmaloy@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: -wKi6rBk-h_NaZr_BvvUn1yTg25PNT9o9YVr48I6-wU_1782441934 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit content-type: text/plain; charset="US-ASCII"; x-default=true Message-ID-Hash: CGJ7274NBALMZ2Y6B7J3XZMX2F3WHEXN X-Message-ID-Hash: CGJ7274NBALMZ2Y6B7J3XZMX2F3WHEXN X-MailFrom: jmaloy@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: We introduce a CONF_ADDR_DHCPOFFER flag to mark if an added address is eligible for DHCP advertisement. By doing this once and for all in the fwd_set_addr() function, the DHCP code only needs to check for this flag to know that all criteria for advertisement are fulfilled. Hence, we update the code in dhcp.c correspondingly. We also let the conf_print() function use this flag to determine and print the selected address. Signed-off-by: Jon Maloy --- v6: -Split off from a commit handling both DHCP and DHCPv6 v7: -Modified DHCP advertisement eligibility criteria IPv4 addresses: We now permit link-local addresses to be eligible if they were configured by the user. -Adapted to previous changes in this series v8: - Adapted to previous changes in this series - Simplified DHCP eligibility branch in fwd_set_addr() (David) - Moved this commit to earlier in the series to avoid a technical migration protocol change (David). - Renamed CONF_ADDR_DHCP to CONF_ADDR_DHCPOFFER (Stefano) --- conf.c | 5 +++-- dhcp.c | 12 ++++++------ fwd.c | 9 +++++++++ passt.h | 1 + 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/conf.c b/conf.c index 69c1c439..f30c238e 100644 --- a/conf.c +++ b/conf.c @@ -47,6 +47,7 @@ #include "lineread.h" #include "isolation.h" #include "log.h" +#include "fwd.h" #include "vhost_user.h" #include "epoll_ctl.h" #include "conf.h" @@ -832,8 +833,8 @@ static void conf_print(const struct ctx *c) inet_ntop(AF_INET, &c->ip4.map_host_loopback, buf, sizeof(buf))); - a = fwd_get_addr(c, AF_INET, CONF_ADDR_ANY, 0); - if (a && !c->no_dhcp) { + a = fwd_get_addr(c, AF_INET, CONF_ADDR_DHCPOFFER, 0); + if (a) { uint32_t mask; int plen = 0; diff --git a/dhcp.c b/dhcp.c index 727485f7..a7a9765a 100644 --- a/dhcp.c +++ b/dhcp.c @@ -31,6 +31,8 @@ #include "passt.h" #include "tap.h" #include "log.h" +#include "fwd.h" +#include "conf.h" #include "dhcp.h" /** @@ -302,19 +304,18 @@ static void opt_set_dns_search(const struct ctx *c, size_t max_len) */ int dhcp(const struct ctx *c, struct iov_tail *data) { + struct in_addr addr, mask, dst; char macstr[ETH_ADDRSTRLEN]; const struct guest_addr *a; size_t mlen, dlen, opt_len; - struct in_addr mask, dst; struct ethhdr eh_storage; struct iphdr iph_storage; struct udphdr uh_storage; + const struct udphdr *uh; const struct ethhdr *eh; const struct iphdr *iph; - const struct udphdr *uh; struct msg m_storage; struct msg const *m; - struct in_addr addr; struct msg reply; unsigned int i; int plen; @@ -347,9 +348,8 @@ int dhcp(const struct ctx *c, struct iov_tail *data) m->op != BOOTREQUEST) return -1; - a = fwd_get_addr(c, AF_INET, CONF_ADDR_USER, 0); - if (!a) - a = fwd_get_addr(c, AF_INET, CONF_ADDR_ANY, 0); + /* Select address to offer */ + a = fwd_get_addr(c, AF_INET, CONF_ADDR_DHCPOFFER, 0); if (!a) return -1; diff --git a/fwd.c b/fwd.c index e4090f4d..669fc237 100644 --- a/fwd.c +++ b/fwd.c @@ -292,6 +292,15 @@ void fwd_set_addr(struct ctx *c, const union inany_addr *addr, return; } + /* Determine advertisement eligibility */ + if ((flags & CONF_ADDR_USER) || + (flags & CONF_ADDR_HOST && !(flags & CONF_ADDR_LINKLOCAL))) { + if (inany_v4(addr)) { + if (!c->no_dhcp) + flags |= CONF_ADDR_DHCPOFFER; + } + } + /* Add to head or tail, depending on flag */ if (flags & CONF_ADDR_OBSERVED) { memmove(&head[1], &head[0], c->addr_count * sizeof(*a)); diff --git a/passt.h b/passt.h index 005f7631..b323bd48 100644 --- a/passt.h +++ b/passt.h @@ -82,6 +82,7 @@ struct guest_addr { #define CONF_ADDR_GENERATED BIT(2) /* Generated by PASST/PASTA */ #define CONF_ADDR_LINKLOCAL BIT(3) /* Link-local address */ #define CONF_ADDR_OBSERVED BIT(4) /* Seen in guest traffic */ +#define CONF_ADDR_DHCPOFFER BIT(5) /* Advertise via DHCP (IPv4) */ #define CONF_ADDR_ANY 0xff /* Match any flag */ }; -- 2.52.0