aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2022-01-17 09:30:26 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2022-01-17 09:35:15 +0000
commit779fd05344662aeec79c29470258bf657318eab3 (patch)
tree14787bb97771c92a20b4a09fd12f4294cbf889b7
parentb1f7154cb12517162a51d19ae19ec3f2dee88e11 (diff)
ifconfig: improve vlan options parsing
PR: 261136 Reported by: Daniel O'Connor MFC after: 2 weeks
-rw-r--r--sbin/ifconfig/ifvlan.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/sbin/ifconfig/ifvlan.c b/sbin/ifconfig/ifvlan.c
index 60f97338ee27..1e74b504fc26 100644
--- a/sbin/ifconfig/ifvlan.c
+++ b/sbin/ifconfig/ifvlan.c
@@ -127,11 +127,6 @@ vlan_parse_ethervid(const char *name)
if ((cp = strrchr(ifname, '.')) == NULL)
return;
/*
- * Don't mix vlan/vlandev parameters with dot notation.
- */
- if (params.vlr_tag != NOTAG || params.vlr_parent[0] != '\0')
- errx(1, "ambiguous vlan specification");
- /*
* Derive params from interface name: "parent.vid".
*/
*cp++ = '\0';
@@ -144,8 +139,20 @@ vlan_parse_ethervid(const char *name)
if ((*cp != '\0') || (vid & ~0xFFF))
errx(1, "invalid vlan tag");
- strlcpy(params.vlr_parent, ifname, IFNAMSIZ);
- params.vlr_tag = (vid & 0xFFF);
+ /*
+ * allow "devX.Y vlandev devX vlan Y" syntax
+ */
+ if (params.vlr_tag == NOTAG || params.vlr_tag == vid)
+ params.vlr_tag = vid;
+ else
+ errx(1, "ambiguous vlan specification");
+
+ /* Restrict overriding interface name */
+ if (params.vlr_parent[0] == '\0' || !strcmp(params.vlr_parent, ifname))
+ strlcpy(params.vlr_parent, ifname, IFNAMSIZ);
+ else
+ errx(1, "ambiguous vlan specification");
+ printf("CR: %s %d\n", params.vlr_parent, params.vlr_tag);
}
static void