From: David Gibson <david@gibson.dropbear.id.au>
To: Jon Maloy <jmaloy@redhat.com>
Cc: sbrivio@redhat.com, dgibson@redhat.com, passt-dev@passt.top
Subject: Re: [PATCH v5 02/13] ip: Introduce for_each_addr() macro for address iteration
Date: Mon, 2 Mar 2026 21:29:16 +1100 [thread overview]
Message-ID: <aaVmfGp0No0Hw0Pr@zatzit> (raw)
In-Reply-To: <20260222174445.743845-3-jmaloy@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 2806 bytes --]
On Sun, Feb 22, 2026 at 12:44:34PM -0500, Jon Maloy wrote:
> Add the for_each_addr() macro to iterate over addresses in the unified
> array. The macro supports an address family filter parameter (AF_INET,
> AF_INET6, or 0 for all) using a _next_addr_idx() helper function to
> skip non-matching entries.
>
> Signed-off-by: Jon Maloy <jmaloy@redhat.com>
>
> ---
> v1: - Broke out as separate commit
> - I kept the third argument, despite David's comment, since I still
> find it practical. If we want to iterate the list without filter
Eh, ok. I'm kind of hoping it will go away eventually, once more of
the v4 and v6 paths are unified.
> we can just use AF_UNSPEC (== 0)
> ---
> passt.h | 34 ++++++++++++++++++++++++++++++++++
> 1 file changed, 34 insertions(+)
>
> diff --git a/passt.h b/passt.h
> index 1aa71f0..bb56998 100644
> --- a/passt.h
> +++ b/passt.h
> @@ -344,6 +344,40 @@ static inline int inany_prefix4(const struct inany_addr_entry *e)
> return e->prefix_len - 96;
> }
>
> +/**
> + * _next_addr_idx() - Find next address index matching family filter
> + * @c: Pointer to struct ctx
> + * @i: Starting index
> + * @af: Address family filter: AF_INET, AF_INET6, or 0 for all
> + *
> + * Return: next matching index, or addr_count if none found
> + */
> +static inline int _next_addr_idx(const struct ctx *c, int i, sa_family_t af)
> +{
> + for (; i < c->addr_count; i++) {
> + sa_family_t entry_af;
> +
> + entry_af = inany_v4(&c->addrs[i].addr) ? AF_INET : AF_INET6;
> +
> + if (!af || af == entry_af)
I'd prefer an explicit (af == AF_UNSPEC), rather than subtly relying
on AF_UNSPEC having value 0.
> + return i;
> + }
> + return i;
> +}
> +
> +/**
> + * for_each_addr() - Iterate over addresses in unified array
> + * @e: Pointer variable for current entry (struct inany_addr_entry *)
> + * @c: Pointer to struct ctx
> + * @af: Address family filter: AF_INET, AF_INET6, or 0 for all
> + *
> + * Note: @_i is the internal loop counter, uses _next_addr_idx() helper
> + */
> +#define for_each_addr(e, c, af) \
> + for (int _i = _next_addr_idx((c), 0, (af)); \
Huh. We haven't really used declarations within for previously, but
we do require C11 which allows them. There might be some other
foreach macros that can be improved by using this.
> + _i < (c)->addr_count && ((e) = &(c)->addrs[_i], true); \
> + _i = _next_addr_idx((c), _i + 1, (af)))
> +
> void proto_update_l2_buf(const unsigned char *eth_d);
>
> #endif /* PASST_H */
> --
> 2.52.0
>
--
David Gibson (he or they) | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you, not the other way
| around.
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2026-03-02 10:29 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-22 17:44 [PATCH v5 00/13] Introduce multiple addresses and late binding Jon Maloy
2026-02-22 17:44 ` [PATCH v5 01/13] ip: Introduce unified multi-address data structures Jon Maloy
2026-03-02 10:22 ` David Gibson
2026-02-22 17:44 ` [PATCH v5 02/13] ip: Introduce for_each_addr() macro for address iteration Jon Maloy
2026-03-02 10:29 ` David Gibson [this message]
2026-02-22 17:44 ` [PATCH v5 03/13] fwd: Unify guest accessibility checks with unified address array Jon Maloy
2026-03-02 10:33 ` David Gibson
2026-02-22 17:44 ` [PATCH v5 04/13] arp: Check all configured addresses in ARP filtering Jon Maloy
2026-03-02 10:41 ` David Gibson
2026-02-22 17:44 ` [PATCH v5 05/13] netlink: Return prefix length for IPv6 addresses in nl_addr_get() Jon Maloy
2026-03-02 10:43 ` David Gibson
2026-02-22 17:44 ` [PATCH v5 06/13] conf: Allow multiple -a/--address options per address family Jon Maloy
2026-03-02 10:51 ` David Gibson
2026-02-22 17:44 ` [PATCH v5 07/13] ip: Track observed guest IPv4 addresses in unified address array Jon Maloy
2026-03-03 1:40 ` David Gibson
2026-02-22 17:44 ` [PATCH v5 08/13] ip: Track observed guest IPv6 " Jon Maloy
2026-03-03 1:52 ` David Gibson
2026-02-22 17:44 ` [PATCH v5 09/13] migrate: Rename v1 address functions to v2 for clarity Jon Maloy
2026-03-03 1:53 ` David Gibson
2026-03-03 19:11 ` Stefano Brivio
2026-03-03 22:17 ` David Gibson
2026-03-03 22:56 ` David Gibson
2026-02-22 17:44 ` [PATCH v5 10/13] migrate: Update protocol to v3 for multi-address support Jon Maloy
2026-03-03 4:53 ` David Gibson
2026-02-22 17:44 ` [PATCH v5 11/13] dhcp, dhcpv6: Select addresses for DHCP distribution Jon Maloy
2026-03-03 5:26 ` David Gibson
2026-02-22 17:44 ` [PATCH v5 12/13] ndp: Support advertising multiple prefixes in Router Advertisement Jon Maloy
2026-02-22 17:44 ` [PATCH v5 13/13] netlink: Add host-side monitoring for late template interface binding Jon Maloy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aaVmfGp0No0Hw0Pr@zatzit \
--to=david@gibson.dropbear.id.au \
--cc=dgibson@redhat.com \
--cc=jmaloy@redhat.com \
--cc=passt-dev@passt.top \
--cc=sbrivio@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).