Skip to content

Commit

Permalink
ip link: Fix vlan proto, closes 8261 and 11638
Browse files Browse the repository at this point in the history
The proto has to be passed in network byte-order.
While at it allow for
 ip link add link eth0 name eth0.2.24 type vlan proto 802.1ad id 24
 ip link del link eth0 name eth0.2.24 type vlan proto 802.1ad id 24
The del was lacking a dev_str and thus errored out. Fix by using
name/dev counterpart as fallback.

The proto identifier 802.1Q was not recognized, just it's lowercase
variant, fix that too.

function                                             old     new   delta
do_add_or_delete                                    1275    1376    +101
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 101/0)             Total: 101 bytes

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
  • Loading branch information
aldot authored and Denys Vlasenko committed Feb 14, 2019
1 parent 7f8f207 commit 8296334
Showing 1 changed file with 11 additions and 5 deletions.
16 changes: 11 additions & 5 deletions networking/libiproute/iplink.c
Expand Up @@ -518,11 +518,11 @@ static void vlan_parse_opt(char **argv, struct nlmsghdr *n, unsigned int size)
id = get_u16(*argv, "id");
addattr_l(n, size, IFLA_VLAN_ID, &id, sizeof(id));
} else if (arg == ARG_protocol) {
arg = index_in_substrings(protocols, *argv);
arg = index_in_substrings(protocols, str_tolower(*argv));
if (arg == PROTO_8021Q)
proto = ETH_P_8021Q;
proto = htons(ETH_P_8021Q);
else if (arg == PROTO_8021AD)
proto = ETH_P_8021AD;
proto = htons(ETH_P_8021AD);
else
bb_error_msg_and_die("unknown VLAN encapsulation protocol '%s'",
*argv);
Expand Down Expand Up @@ -673,13 +673,19 @@ static int do_add_or_delete(char **argv, const unsigned rtm)

linkinfo->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)linkinfo;
}
/* Allow "ip link add dev" and "ip link add name" */
if (!name_str)
name_str = dev_str;
else if (!dev_str)
dev_str = name_str;
/* else if (!strcmp(name_str, dev_str))
name_str = dev_str; */

if (rtm != RTM_NEWLINK) {
if (!dev_str)
return 1; /* Need a device to delete */
req.i.ifi_index = xll_name_to_index(dev_str);
} else {
if (!name_str)
name_str = dev_str;
if (link_str) {
int idx = xll_name_to_index(link_str);
addattr_l(&req.n, sizeof(req), IFLA_LINK, &idx, 4);
Expand Down

0 comments on commit 8296334

Please sign in to comment.