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=E9oHXjmx; 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 7D6ED5A0653 for ; Wed, 17 Dec 2025 09:50:30 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1765961429; 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:autocrypt:autocrypt; bh=gJ+Q5gj7QZjPD9j3T3P0CS2P+bFo1iXujvOTGLeOqtM=; b=E9oHXjmxc6pHTer3YU/eL0ULW7wCT9Li/VDBxKoNT4M6tBQB6mft34mgwCVq9Jnk5Ejgdg H9O85/4BH/1ASvZhJOa/SZK/XiZOSXieMB7v0qsDzwww42pG39VIhKR9l7mQ89MKiQhJYE j471Tczi/FJpVwyda17qINOF+cHhBeU= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-688-qT3emInaMLCaDwIVS8vGcA-1; Wed, 17 Dec 2025 03:50:26 -0500 X-MC-Unique: qT3emInaMLCaDwIVS8vGcA-1 X-Mimecast-MFC-AGG-ID: qT3emInaMLCaDwIVS8vGcA_1765961425 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4776079ada3so45690535e9.1 for ; Wed, 17 Dec 2025 00:50:26 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765961425; x=1766566225; h=content-transfer-encoding:in-reply-to:autocrypt:from :content-language:references:to:subject:user-agent:mime-version:date :message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=gJ+Q5gj7QZjPD9j3T3P0CS2P+bFo1iXujvOTGLeOqtM=; b=XrNTRTUcOXH7uCzTUYQRwfXzty40rzXIq7RUJ6hq1+h9ezzEEouDdyJ0lx82ipcnEr z/v4e4acDw7PlG8tDvDbvbCMv4EECvxy7CO0tEsxeQZxplzNBY9keXk3hLVeUnSJlDwR r21jOcFj0kAf41SrbfUhFiLO6yzReSFVqgHUKFlyJETPbrK9DXQQ8VbUyPQA3WdjSrId fcV9SDc9YuhoofiGgdRLZE+cFTmXnGH7Vkdk+IbCU2M8TGW+bnvkCAy/5k8u/OcrFn07 31Jk2euNGK6FiQaxeXEfChhKR7N40EfD7tBxdQ7FVHuqzm3+9V6HH082ziR7C5JHczHg X/qA== X-Forwarded-Encrypted: i=1; AJvYcCUMP2dRSNRPmlOl4lF1fgdtgM+ihB1pfkgGTJZQ7+gt2RxUifmJYFKmMBM2lJarnPzrQuz83y4Juj4=@passt.top X-Gm-Message-State: AOJu0YwqR4a28Na2JBpu08tHNo8js1Ta/QYcYervCHXdDBWk9Z2iJ6sr ulNQjW0f0n8kmbm8O5bzObZdZvRB/+9D+sfDWSZxUhjf9Jfku1KLTDZ2ZzW0ym1qX4E2vK2ivF0 Cxz2TeWyBbM4b9Dvap3lMRm9r3k6ObowsJWM6zCCGZmgs1KIl2paNyw== X-Gm-Gg: AY/fxX7RfZ/TKI6KUWt2b/gt55b6Cv7QhPQFfRmmkgBLO+bzSi9euMM+NAXpmAUC1Nx QMwx2Qf/NGseBJUAWqmSucTBG2qgujCpDKMfObMNZSIXzOeLulfV4EyP+JFSiYz8CS2yoCrjQUA L7a8tn29+zpl/UkEtkJetOBVhVkND0cXk+kiFp9uJrDjE5wkmK/vxVdEe9/1zY4qKVeoipsAMJA o1XVurz8Mj9EfT2BRjZhwgeayG03Rm5yIoO8OWt/3WDnH9A0UU44MGnW8I4DtVGPYv8X55UeYW/ v0xHZfL0FS9Mf+63HRfJDPANJDm4/178aqUl8OGivuvVHiU5U6ARGMtAvWXhzWT6DTPHbe0L8ED OSRP8MpDZR0TKBuWXrvNvJ5W8Vq7XMROkdyjFylKTjhKAFkQZ6wQRWg== X-Received: by 2002:a05:600c:1550:b0:477:6e02:54a5 with SMTP id 5b1f17b1804b1-47bd9c7d6e1mr36423225e9.18.1765961425300; Wed, 17 Dec 2025 00:50:25 -0800 (PST) X-Google-Smtp-Source: AGHT+IHC5yoeqLXKNgGy197v9+zAypANWAlhtm7M8qm0vo+hA7mD8xGamZBT9D4d/bGDYU7KmkvIrQ== X-Received: by 2002:a05:600c:1550:b0:477:6e02:54a5 with SMTP id 5b1f17b1804b1-47bd9c7d6e1mr36422885e9.18.1765961424705; Wed, 17 Dec 2025 00:50:24 -0800 (PST) Received: from ?IPV6:2a01:e0a:e10:ef90:8e19:3414:44f0:befd? ([2a01:e0a:e10:ef90:8e19:3414:44f0:befd]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47bd90e8bd9sm25975185e9.4.2025.12.17.00.50.23 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 17 Dec 2025 00:50:24 -0800 (PST) Message-ID: <37df2e6f-3eeb-4c34-8025-2515fc5a6a87@redhat.com> Date: Wed, 17 Dec 2025 09:50:23 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] conf: Support CIDR notation for -a/--address option To: Jon Maloy , sbrivio@redhat.com, dgibson@redhat.com, david@gibson.dropbear.id.au, passt-dev@passt.top References: <20251216230408.100976-1-jmaloy@redhat.com> From: Laurent Vivier Autocrypt: addr=lvivier@redhat.com; keydata= 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 In-Reply-To: <20251216230408.100976-1-jmaloy@redhat.com> X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: XbmWWQfVQxLZGR55N2aDPhE7ARfsvEhcpkuguR2q_K4_1765961425 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Message-ID-Hash: DQHENV72T5627YJZMK2AAUMYU7SMWQTH X-Message-ID-Hash: DQHENV72T5627YJZMK2AAUMYU7SMWQTH X-MailFrom: lvivier@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: On 12/17/25 00:04, Jon Maloy wrote: > We extend the -a/--address option to accept addresses in CIDR notation > (e.g., 192.168.1.1/24 or 2001:db8::1/64) as an alternative to using > separate -a and -n options. > > For IPv4, the prefix is stored in ip4.prefix_len when provided. The > CIDR prefix and -n/--netmask options are mutually exclusive - using > both results in an error. > > Also fix a bug in conf_ip4_prefix() that was incorrectly using the > global 'optarg' instead of its 'arg' parameter. > > Signed-off-by: Jon Maloy > --- > conf.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++--------- > 1 file changed, 84 insertions(+), 15 deletions(-) Reviewed-by: Laurent Vivier Note if you provide two IPv4 addresses with prefix (-a XXX/YY -a XXX/YY) the error reported will be "Can't use both -n and CIDR prefix" that is not the correct error. Thanks, Laurent> > diff --git a/conf.c b/conf.c > index 2942c8c..0f66c77 100644 > --- a/conf.c > +++ b/conf.c > @@ -682,7 +682,7 @@ static int conf_ip4_prefix(const char *arg) > return -1; > } else { > errno = 0; > - len = strtoul(optarg, NULL, 0); > + len = strtoul(arg, NULL, 0); > if (len > 32 || errno) > return -1; > } > @@ -690,6 +690,56 @@ static int conf_ip4_prefix(const char *arg) > return len; > } > > +/** > + * conf_addr_prefix() - Parse address with optional /prefix notation > + * @arg: Address string, optionally with /prefix > + * @addr4: Output for IPv4 address > + * @addr6: Output for IPv6 address > + * @prefix: Output for prefix length (0 if not specified) > + * > + * Return: AF_INET for IPv4, AF_INET6 for IPv6, -1 on error > + */ > +static int conf_addr_prefix(const char *arg, struct in_addr *addr4, > + struct in6_addr *addr6, int *prefix) > +{ > + char buf[INET6_ADDRSTRLEN + sizeof("/128")]; > + char *slash; > + > + *prefix = 0; > + > + if (snprintf(buf, sizeof(buf), "%s", arg) >= (int)sizeof(buf)) > + return -1; > + > + /* Check for /prefix suffix */ > + slash = strchr(buf, '/'); > + if (slash) { > + unsigned long len; > + char *end; > + > + *slash = '\0'; > + errno = 0; > + len = strtoul(slash + 1, &end, 10); > + if (errno || *end) > + return -1; > + > + *prefix = len; > + } > + > + if (inet_pton(AF_INET6, buf, addr6) == 1) { > + if (*prefix > 128) > + return -1; > + return AF_INET6; > + } > + > + if (inet_pton(AF_INET, buf, addr4) == 1) { > + if (*prefix > 32) > + return -1; > + return AF_INET; > + } > + > + return -1; > +} > + > /** > * conf_ip4() - Verify or detect IPv4 support, get relevant addresses > * @ifi: Host interface to attempt (0 to determine one) > @@ -896,7 +946,7 @@ static void usage(const char *name, FILE *f, int status) > " a zero value disables assignment\n" > " default: 65520: maximum 802.3 MTU minus 802.3 header\n" > " length, rounded to 32 bits (IPv4 words)\n" > - " -a, --address ADDR Assign IPv4 or IPv6 address ADDR\n" > + " -a, --address ADDR Assign IPv4 or IPv6 address ADDR[/PREFIX]\n" > " can be specified zero to two times (for IPv4 and IPv6)\n" > " default: use addresses from interface with default route\n" > " -n, --netmask MASK Assign IPv4 MASK, dot-decimal or bits\n" > @@ -1501,6 +1551,7 @@ void conf(struct ctx *c, int argc, char **argv) > bool copy_addrs_opt = false, copy_routes_opt = false; > enum fwd_ports_mode fwd_default = FWD_NONE; > bool v4_only = false, v6_only = false; > + bool prefix_explicit = false; > unsigned dns4_idx = 0, dns6_idx = 0; > unsigned long max_mtu = IP_MAX_MTU; > struct fqdn *dnss = c->dns_search; > @@ -1808,23 +1859,38 @@ void conf(struct ctx *c, int argc, char **argv) > c->mtu = mtu; > break; > } > - case 'a': > - if (inet_pton(AF_INET6, optarg, &c->ip6.addr) && > - !IN6_IS_ADDR_UNSPECIFIED(&c->ip6.addr) && > - !IN6_IS_ADDR_LOOPBACK(&c->ip6.addr) && > - !IN6_IS_ADDR_V4MAPPED(&c->ip6.addr) && > - !IN6_IS_ADDR_V4COMPAT(&c->ip6.addr) && > - !IN6_IS_ADDR_MULTICAST(&c->ip6.addr)) { > + case 'a': { > + struct in6_addr addr6; > + struct in_addr addr4; > + int prefix = 0; > + int af; > + > + af = conf_addr_prefix(optarg, &addr4, &addr6, &prefix); > + > + if (af == AF_INET6 && > + !IN6_IS_ADDR_UNSPECIFIED(&addr6) && > + !IN6_IS_ADDR_LOOPBACK(&addr6) && > + !IN6_IS_ADDR_V4MAPPED(&addr6) && > + !IN6_IS_ADDR_V4COMPAT(&addr6) && > + !IN6_IS_ADDR_MULTICAST(&addr6)) { > + c->ip6.addr = addr6; > if (c->mode == MODE_PASTA) > c->ip6.no_copy_addrs = true; > break; > } > > - if (inet_pton(AF_INET, optarg, &c->ip4.addr) && > - !IN4_IS_ADDR_UNSPECIFIED(&c->ip4.addr) && > - !IN4_IS_ADDR_BROADCAST(&c->ip4.addr) && > - !IN4_IS_ADDR_LOOPBACK(&c->ip4.addr) && > - !IN4_IS_ADDR_MULTICAST(&c->ip4.addr)) { > + if (af == AF_INET && > + !IN4_IS_ADDR_UNSPECIFIED(&addr4) && > + !IN4_IS_ADDR_BROADCAST(&addr4) && > + !IN4_IS_ADDR_LOOPBACK(&addr4) && > + !IN4_IS_ADDR_MULTICAST(&addr4)) { > + c->ip4.addr = addr4; > + if (prefix) { > + if (prefix_explicit) > + die("Can't use both -n and CIDR prefix"); > + c->ip4.prefix_len = prefix; > + prefix_explicit = true; > + } > if (c->mode == MODE_PASTA) > c->ip4.no_copy_addrs = true; > break; > @@ -1832,11 +1898,14 @@ void conf(struct ctx *c, int argc, char **argv) > > die("Invalid address: %s", optarg); > break; > + } > case 'n': > + if (prefix_explicit) > + die("Can't use both -n and CIDR prefix"); > c->ip4.prefix_len = conf_ip4_prefix(optarg); > if (c->ip4.prefix_len < 0) > die("Invalid netmask: %s", optarg); > - > + prefix_explicit = true; > break; > case 'M': > parse_mac(c->our_tap_mac, optarg);