From nobody Sat Aug 23 00:11:28 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4c7yCP0TgHz65RqL; Sat, 23 Aug 2025 00:11:29 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4c7yCN4j5cz3Zqx; Sat, 23 Aug 2025 00:11:28 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1755907888; 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; bh=En2b4M4dD6IUQRJ6gXEqwYhb+mOfqvlMz/2MwjIu9Fk=; b=e0ICf9ALuPEWF9PW+myXiM/gtG0FsCk0PuTuWqrwDcjWYCT/6opbWy+7QiK4p0NoYTgkKr y+Zql2bUJHZuo+oOMyMr/gmhLI2E13XVM3tHdK6XNNWPGhdHmFcjLlUxocqdC6ctRWubWT yRe/kZ1N6YAkgSB9Z4w5TxpgAZQox9ytXuLvDCGOppMjzoJaljOjwzz9GWo17Er4TBPpC0 9OanbnlabqqBt9LPDgxBRrjD5okGBM4dQcPndMxjlj5RSzNo2PIwlI2c/TPGO4+UoJdWCD ycK+7ZSBTO2lkyupB84pQkb2EsKSxd0wcwrIJUwEH12aoxp4PBIwBHlF3i/RUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1755907888; 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; bh=En2b4M4dD6IUQRJ6gXEqwYhb+mOfqvlMz/2MwjIu9Fk=; b=f30fn4WVdQlBekWengY8jor4aL259+CsQJMcgevVMN82CS36mn5KuvB5bMiqz1BnHFyG1U 3+hwXAa2e/U3EiVpZv+i/IRttk9LcIn1Z7QEuEGjam6hOEi/h4EOAtrh+O0cNd75tT+3z1 MAeLPpFotfksNtzBQMtYcesfQ1iKrCCQrvlvAwz8m9Ua60ljKQlOvIK/VyBbDpqOQu3ntn otTdfjIrmiptTsC6OCZrysmVc2iSq+nlT3qXyh0YolPSS8Bv3n/sb44UZk828Oc2Zj7hGg QysK9/9izmWxUTFH5Gf+lTQCwYVaGLiOz1VNl3JDvumk7Y0re9U1vjRXWgpFQg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1755907888; a=rsa-sha256; cv=none; b=Auxkp5BRYK/4C9LmUiWL4C4pt300fWkmy5u6Yf3WO0vqxlaWTuZ5w2DQiire8KzV5up3df 2VWrMljvLxahh0/YHMYfJk45rgNmp6VE8Xgscg99pCY3CZRhpzGgChzKp7epI+hKMqGUO8 ZwVG2Lsf3Q4FcNplcRfCdmri+MB4MJVGffGoJaba0QtDaGk7+/sBrltl9e4V0zCPIEXSxU D2ik1Y+XcV2xRRukLBs+PcqvWEeDCSwaH9wzx71lY7QrNp3wfH5+UbvEhCYKWSxnw/pLl3 nQnP4Aerow0iMoYiahGhWWVFQpOUV6kN15/zqvAwibbhjaUcu7GgjBNa4lVbaQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4c7yCN4Jjyz17PY; Sat, 23 Aug 2025 00:11:28 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 57N0BSfI099924; Sat, 23 Aug 2025 00:11:28 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 57N0BSHg099921; Sat, 23 Aug 2025 00:11:28 GMT (envelope-from git) Date: Sat, 23 Aug 2025 00:11:28 GMT Message-Id: <202508230011.57N0BSHg099921@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Lexi Winter Subject: git: c064ee9d7d97 - stable/14 - ifconfig: Support VLAN ID in static/deladdr List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: ivy X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: c064ee9d7d974d5626e43f7817db940cefe9dead Auto-Submitted: auto-generated The branch stable/14 has been updated by ivy: URL: https://cgit.FreeBSD.org/src/commit/?id=c064ee9d7d974d5626e43f7817db940cefe9dead commit c064ee9d7d974d5626e43f7817db940cefe9dead Author: Lexi Winter AuthorDate: 2025-07-31 15:56:51 +0000 Commit: Lexi Winter CommitDate: 2025-08-23 00:10:15 +0000 ifconfig: Support VLAN ID in static/deladdr Add an optional "vlan " argument to the bridge static and deladdr commands to allow addresses to be added to / removed from a particular vlan. No changes to if_bridge are required as the kernel API already supports this, it just wasn't exposed in ifconfig. Add tests for the new functionality, and improve the test for the existing "static" command. Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D51243 (cherry picked from commit 3650722abf2922893540361a1369b54abc5ff8d2) --- sbin/ifconfig/ifbridge.c | 71 +++++++++++++++++++++++++++++++---------- sbin/ifconfig/ifconfig.8 | 18 ++++++++--- tests/sys/net/if_bridge_test.sh | 70 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 136 insertions(+), 23 deletions(-) diff --git a/sbin/ifconfig/ifbridge.c b/sbin/ifconfig/ifbridge.c index 973c4f9cfe6e..9d3296ea6a3e 100644 --- a/sbin/ifconfig/ifbridge.c +++ b/sbin/ifconfig/ifbridge.c @@ -401,43 +401,80 @@ setbridge_flushall(if_ctx *ctx, const char *val __unused, int dummy __unused) err(1, "BRDGFLUSH"); } -static void -setbridge_static(if_ctx *ctx, const char *val, const char *mac) +static int +setbridge_static(if_ctx *ctx, int argc, const char *const *argv) { struct ifbareq req; struct ether_addr *ea; + int arg; + + if (argc < 2) + errx(1, "usage: static
[vlan ]"); + arg = 0; memset(&req, 0, sizeof(req)); - strlcpy(req.ifba_ifsname, val, sizeof(req.ifba_ifsname)); + req.ifba_flags = IFBAF_STATIC; - ea = ether_aton(mac); - if (ea == NULL) - errx(1, "%s: invalid address: %s", val, mac); + strlcpy(req.ifba_ifsname, argv[arg], sizeof(req.ifba_ifsname)); + ++arg; + ea = ether_aton(argv[arg]); + if (ea == NULL) + errx(1, "invalid address: %s", argv[arg]); memcpy(req.ifba_dst, ea->octet, sizeof(req.ifba_dst)); - req.ifba_flags = IFBAF_STATIC; - req.ifba_vlan = 0; /* XXX allow user to specify */ + ++arg; + + req.ifba_vlan = 0; + if (argc > 2 && strcmp(argv[arg], "vlan") == 0) { + if (argc < 3) + errx(1, "usage: static
" + "[vlan ]"); + ++arg; + + if (get_vlan_id(argv[arg], &req.ifba_vlan) < 0) + errx(1, "invalid vlan id: %s", argv[arg]); + ++arg; + } if (do_cmd(ctx, BRDGSADDR, &req, sizeof(req), 1) < 0) - err(1, "BRDGSADDR %s", val); + err(1, "BRDGSADDR"); + return arg; } -static void -setbridge_deladdr(if_ctx *ctx, const char *val, int dummy __unused) +static int +setbridge_deladdr(if_ctx *ctx, int argc, const char *const *argv) { struct ifbareq req; struct ether_addr *ea; + int arg; + + if (argc < 1) + errx(1, "usage: deladdr
[vlan ]"); + arg = 0; memset(&req, 0, sizeof(req)); - ea = ether_aton(val); + ea = ether_aton(argv[arg]); if (ea == NULL) - errx(1, "invalid address: %s", val); - + errx(1, "invalid address: %s", argv[arg]); memcpy(req.ifba_dst, ea->octet, sizeof(req.ifba_dst)); + ++arg; + + req.ifba_vlan = 0; + if (argc >= 2 && strcmp(argv[arg], "vlan") == 0) { + if (argc < 3) + errx(1, "usage: deladdr
[vlan ]"); + ++arg; + + if (get_vlan_id(argv[arg], &req.ifba_vlan) < 0) + errx(1, "invalid vlan id: %s", argv[arg]); + ++arg; + } if (do_cmd(ctx, BRDGDADDR, &req, sizeof(req), 1) < 0) - err(1, "BRDGDADDR %s", val); + err(1, "BRDGDADDR"); + + return arg; } static void @@ -660,8 +697,8 @@ static struct cmd bridge_cmds[] = { DEF_CMD_ARG("-autoptp", unsetbridge_autoptp), DEF_CMD("flush", 0, setbridge_flush), DEF_CMD("flushall", 0, setbridge_flushall), - DEF_CMD_ARG2("static", setbridge_static), - DEF_CMD_ARG("deladdr", setbridge_deladdr), + DEF_CMD_VARG("static", setbridge_static), + DEF_CMD_VARG("deladdr", setbridge_deladdr), DEF_CMD("addr", 1, setbridge_addr), DEF_CMD_ARG("maxaddr", setbridge_maxaddr), DEF_CMD_ARG("hellotime", setbridge_hellotime), diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8 index ce15e3a68abc..85dad643f588 100644 --- a/sbin/ifconfig/ifconfig.8 +++ b/sbin/ifconfig/ifconfig.8 @@ -28,7 +28,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd July 11, 2025 +.Dd July 30, 2025 .Dt IFCONFIG 8 .Os .Sh NAME @@ -2521,15 +2521,23 @@ is zero, then address cache entries will not be expired. The default is 1200 seconds. .It Cm addr Display the addresses that have been learned by the bridge. -.It Cm static Ar interface-name Ar address -Add a static entry into the address cache pointing to +.It Cm static Ar interface-name Ar address Op Cm vlan Ar vlan-id +Add a static entry into the address cache for pointing to .Ar interface-name . +If +.Ar vlan-id +is specified, the entry is added for that VLAN, otherwise it is added +for VLAN 0. +.Pp Static entries are never aged out of the cache or re-placed, even if the address is seen on a different interface. -.It Cm deladdr Ar address +.It Cm deladdr Ar address Op Cm vlan Ar vlan-id Delete .Ar address -from the address cache. +from the address cache. If +.Ar vlan-id +is specified, the entry is deleted from that VLAN's address table, +otherwise it is deleted from the VLAN 0 address table. .It Cm flush Delete all dynamically-learned addresses from the address cache. .It Cm flushall diff --git a/tests/sys/net/if_bridge_test.sh b/tests/sys/net/if_bridge_test.sh index 5438f67cf637..264a8986fcf9 100755 --- a/tests/sys/net/if_bridge_test.sh +++ b/tests/sys/net/if_bridge_test.sh @@ -245,7 +245,8 @@ static_body() jexec one ifconfig ${bridge} static ${epair}a 00:01:02:03:04:05 # List addresses - atf_check -s exit:0 -o ignore \ + atf_check -s exit:0 \ + -o match:"00:01:02:03:04:05 Vlan0 ${epair}a 0 flags=1" \ jexec one ifconfig ${bridge} addr # Delete with bad address format @@ -266,6 +267,72 @@ static_cleanup() vnet_cleanup } +atf_test_case "vstatic" "cleanup" +vstatic_head() +{ + atf_set descr 'Bridge VLAN static address test' + atf_set require.user root +} + +vstatic_body() +{ + vnet_init + vnet_init_bridge + + epair=$(vnet_mkepair) + bridge=$(vnet_mkbridge) + + vnet_mkjail one ${bridge} ${epair}a + + ifconfig ${epair}b up + + jexec one ifconfig ${bridge} up + jexec one ifconfig ${epair}a up + jexec one ifconfig ${bridge} addm ${epair}a + + # Wrong interface + atf_check -s exit:1 -o ignore -e ignore jexec one \ + ifconfig ${bridge} static ${epair}b 00:01:02:03:04:05 vlan 10 + + # Bad address format + atf_check -s exit:1 -o ignore -e ignore jexec one \ + ifconfig ${bridge} static ${epair}a 00:01:02:03:04 vlan 10 + + # Invalid VLAN ID + atf_check -s exit:1 -o ignore -e ignore jexec one \ + ifconfig ${bridge} static ${epair}a 00:01:02:03:04:05 vlan 5000 + + # Correct add + atf_check -s exit:0 -o ignore jexec one \ + ifconfig ${bridge} static ${epair}a 00:01:02:03:04:05 vlan 10 + + # List addresses + atf_check -s exit:0 \ + -o match:"00:01:02:03:04:05 Vlan10 ${epair}a 0 flags=1" \ + jexec one ifconfig ${bridge} addr + + # Delete with bad address format + atf_check -s exit:1 -o ignore -e ignore jexec one \ + ifconfig ${bridge} deladdr 00:01:02:03:04 vlan 10 + + # Delete with unlisted address + atf_check -s exit:1 -o ignore -e ignore jexec one \ + ifconfig ${bridge} deladdr 00:01:02:03:04:06 vlan 10 + + # Delete with wrong vlan id + atf_check -s exit:1 -o ignore -e ignore jexec one \ + ifconfig ${bridge} deladdr 00:01:02:03:04:05 vlan 20 + + # Correct delete + atf_check -s exit:0 -o ignore jexec one \ + ifconfig ${bridge} deladdr 00:01:02:03:04:05 vlan 10 +} + +vstatic_cleanup() +{ + vnet_cleanup +} + atf_test_case "span" "cleanup" span_head() { @@ -835,6 +902,7 @@ atf_init_test_cases() atf_add_test_case "stp" atf_add_test_case "stp_vlan" atf_add_test_case "static" + atf_add_test_case "vstatic" atf_add_test_case "span" atf_add_test_case "inherit_mac" atf_add_test_case "delete_with_members"