// SPDX-License-Identifier: GPL-2.0-or-later /* PASST - Plug A Simple Socket Transport * for qemu/UNIX domain socket mode * * PASTA - Pack A Subtle Tap Abstraction * for network namespace/tap device mode * * PESTO - Programmable Extensible Socket Translation Orchestrator * front-end for passt(1) and pasta(1) forwarding configuration * * fwd_rule.c - Helpers for working with forwarding rule specifications * * Copyright Red Hat * Author: David Gibson */ #include #include "fwd_rule.h" /** * fwd_rule_addr() - Return match address for a rule * @rule: Forwarding rule * * Return: matching address for rule, NULL if it matches all addresses */ const union inany_addr *fwd_rule_addr(const struct fwd_rule *rule) { if (rule->flags & FWD_DUAL_STACK_ANY) return NULL; return &rule->addr; } /** * fwd_rule_ntop() - Format forwarding rule as a string * @rule: Rule to format * @dst: Buffer to store output (should have FWD_RULE_STRLEN bytes) * @size: Size of @dst */ const char *fwd_rule_ntop(const struct fwd_rule *rule, char *dst, size_t size) { const char *percent = *rule->ifname ? "%" : ""; const char *weak = "", *scan = ""; char addr[INANY_ADDRSTRLEN]; int len; inany_ntop(fwd_rule_addr(rule), addr, sizeof(addr)); if (rule->flags & FWD_WEAK) weak = " (best effort)"; if (rule->flags & FWD_SCAN) scan = " (auto-scan)"; if (rule->first == rule->last) { len = snprintf(dst, size, "%s [%s]%s%s:%hu => %hu %s%s", ipproto_name(rule->proto), addr, percent, rule->ifname, rule->first, rule->to, weak, scan); } else { in_port_t tolast = rule->last - rule->first + rule->to; len = snprintf(dst, size, "%s [%s]%s%s:%hu-%hu => %hu-%hu %s%s", ipproto_name(rule->proto), addr, percent, rule->ifname, rule->first, rule->last, rule->to, tolast, weak, scan); } if (len < 0 || (size_t)len >= size) return NULL; return dst; }