diff options
| author | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2022-01-17 09:30:26 +0000 |
|---|---|---|
| committer | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2022-01-17 09:35:15 +0000 |
| commit | 779fd05344662aeec79c29470258bf657318eab3 (patch) | |
| tree | 14787bb97771c92a20b4a09fd12f4294cbf889b7 | |
| parent | b1f7154cb12517162a51d19ae19ec3f2dee88e11 (diff) | |
ifconfig: improve vlan options parsing
PR: 261136
Reported by: Daniel O'Connor
MFC after: 2 weeks
| -rw-r--r-- | sbin/ifconfig/ifvlan.c | 21 |
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 |
