From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: passt.top; dkim=pass (2048-bit key; secure) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.a=rsa-sha256 header.s=202602 header.b=a0WQQBso; dkim-atps=neutral Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id A781C5A0652 for ; Tue, 21 Apr 2026 06:42:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202602; t=1776746539; bh=JLjb6jzasLnqbg4kWpg5TGqQzMxUVE+hh3wK/0AXmEs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=a0WQQBsoGzSHKKhY8TwihSGP7g8sCv4HT0mUz2VUtO9XzXiCrPCwlIiycbfcFtPii 984ZgfzuIOBLEsZd+JL3j95f8rv5hfzdJqQiBngpnDQNm5neOx2NODpMtn07D5Yuuv TAkLb+hNviUxVodRy9VjQOqpWLz1thkm5f2f4xH1NNaEJgB+8uh1HQMzLPL9CCrWcn QE5yUEfLtgEu4OHiPZ3K84lpgSMOW/8lJdWYM8RMHQ482FtcI8ke8V/gDBr3i1zsep KYjlz/radMUElPS1QjewC/3LV+ZjUyxC0nMmKpenVi5aqnQLLXljPvUb5nvjDG4SQa TklbUwgtOL/2A== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4g08pg3q1Vz4wJ3; Tue, 21 Apr 2026 14:42:19 +1000 (AEST) From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH v4 05/17] fwd: Generalise fwd_rules_info() Date: Tue, 21 Apr 2026 14:42:05 +1000 Message-ID: <20260421044217.2500314-6-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260421044217.2500314-1-david@gibson.dropbear.id.au> References: <20260421044217.2500314-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: 73XT4AIVTUKJUJK3W77RBHA4BEZ3XE2S X-Message-ID-Hash: 73XT4AIVTUKJUJK3W77RBHA4BEZ3XE2S X-MailFrom: dgibson@gandalf.ozlabs.org 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 CC: David Gibson , Laurent Vivier 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: fwd_rules_info() is used to print a full table of forwarding rules for debugging or the like. Currently it has one caller, and uses info() to dump the messages. However for the upcoming configuration client, we're going to want to dump the rules in some similar, but not quite identical ways. For example, at different severity levels, or to stdout instead of stderr / system log / logfile. So, generalise fwd_rules_info() to fwd_rules_dump() which takes a printing function as a parameter. Because we want this to work with "functions" like info, which is actually a macro, we have to convert fwd_rules_dump() to a macro as well. We also allow the prefix and suffix for each rule / line to be provided as a parameter. Signed-off-by: David Gibson Reviewed-by: Laurent Vivier --- conf.c | 3 ++- fwd_rule.c | 16 ---------------- fwd_rule.h | 20 +++++++++++++++++++- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/conf.c b/conf.c index 5aacfe0f..05861072 100644 --- a/conf.c +++ b/conf.c @@ -902,7 +902,8 @@ dns6: dir = "Inbound"; info("%s forwarding rules (%s):", dir, pif_name(i)); - fwd_rules_info(c->fwd[i]->rules, c->fwd[i]->count); + fwd_rules_dump(info, c->fwd[i]->rules, c->fwd[i]->count, + " ", ""); } } diff --git a/fwd_rule.c b/fwd_rule.c index 1413584f..777282da 100644 --- a/fwd_rule.c +++ b/fwd_rule.c @@ -124,7 +124,6 @@ const union inany_addr *fwd_rule_addr(const struct fwd_rule *rule) */ __attribute__((noinline)) #endif -/* cppcheck-suppress staticFunction */ const char *fwd_rule_fmt(const struct fwd_rule *rule, char *dst, size_t size) { const char *percent = *rule->ifname ? "%" : ""; @@ -158,21 +157,6 @@ const char *fwd_rule_fmt(const struct fwd_rule *rule, char *dst, size_t size) return dst; } -/** - * fwd_rules_info() - Print forwarding rules for debugging - * @fwd: Table to print - */ -void fwd_rules_info(const struct fwd_rule *rules, size_t count) -{ - unsigned i; - - for (i = 0; i < count; i++) { - char buf[FWD_RULE_STRLEN]; - - info(" %s", fwd_rule_fmt(&rules[i], buf, sizeof(buf))); - } -} - /** * fwd_rule_conflicts() - Test if two rules conflict with each other * @a, @b: Rules to test diff --git a/fwd_rule.h b/fwd_rule.h index f0f4efda..58551382 100644 --- a/fwd_rule.h +++ b/fwd_rule.h @@ -97,7 +97,25 @@ void fwd_probe_ephemeral(void); const union inany_addr *fwd_rule_addr(const struct fwd_rule *rule); const char *fwd_rule_fmt(const struct fwd_rule *rule, char *dst, size_t size); -void fwd_rules_info(const struct fwd_rule *rules, size_t count); void fwd_rule_parse(char optname, const char *optarg, struct fwd_table *fwd); +/** + * fwd_rules_dump() - Dump forwarding rules + * @fn: Printing/logging function to call + * @rules: Array of rules to dump + * @count: Number of rules to dump + * @prefix: String to print at the start of each rule + * @suffix: String to print at the end of each rule + */ +#define fwd_rules_dump(fn, rules, count, prefix, suffix) \ + do { \ + unsigned i_; \ + for (i_ = 0; i_ < (count); i_++) { \ + char buf_[FWD_RULE_STRLEN]; \ + fn("%s%s%s", prefix, \ + fwd_rule_fmt(&(rules)[i_], buf_, sizeof(buf_)), \ + suffix); \ + } \ + } while (0) + #endif /* FWD_RULE_H */ -- 2.53.0