ip link: Fix vlan proto, closes 8261 and 11638
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>
This commit is contained in:
parent
f50faf8408
commit
414be6c111
@ -518,11 +518,11 @@ static void vlan_parse_opt(char **argv, struct nlmsghdr *n, unsigned int size)
|
|||||||
id = get_u16(*argv, "id");
|
id = get_u16(*argv, "id");
|
||||||
addattr_l(n, size, IFLA_VLAN_ID, &id, sizeof(id));
|
addattr_l(n, size, IFLA_VLAN_ID, &id, sizeof(id));
|
||||||
} else if (arg == ARG_protocol) {
|
} else if (arg == ARG_protocol) {
|
||||||
arg = index_in_substrings(protocols, *argv);
|
arg = index_in_substrings(protocols, str_tolower(*argv));
|
||||||
if (arg == PROTO_8021Q)
|
if (arg == PROTO_8021Q)
|
||||||
proto = ETH_P_8021Q;
|
proto = htons(ETH_P_8021Q);
|
||||||
else if (arg == PROTO_8021AD)
|
else if (arg == PROTO_8021AD)
|
||||||
proto = ETH_P_8021AD;
|
proto = htons(ETH_P_8021AD);
|
||||||
else
|
else
|
||||||
bb_error_msg_and_die("unknown VLAN encapsulation protocol '%s'",
|
bb_error_msg_and_die("unknown VLAN encapsulation protocol '%s'",
|
||||||
*argv);
|
*argv);
|
||||||
@ -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;
|
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 (rtm != RTM_NEWLINK) {
|
||||||
if (!dev_str)
|
if (!dev_str)
|
||||||
return 1; /* Need a device to delete */
|
return 1; /* Need a device to delete */
|
||||||
req.i.ifi_index = xll_name_to_index(dev_str);
|
req.i.ifi_index = xll_name_to_index(dev_str);
|
||||||
} else {
|
} else {
|
||||||
if (!name_str)
|
|
||||||
name_str = dev_str;
|
|
||||||
if (link_str) {
|
if (link_str) {
|
||||||
int idx = xll_name_to_index(link_str);
|
int idx = xll_name_to_index(link_str);
|
||||||
addattr_l(&req.n, sizeof(req), IFLA_LINK, &idx, 4);
|
addattr_l(&req.n, sizeof(req), IFLA_LINK, &idx, 4);
|
||||||
|
Loading…
Reference in New Issue
Block a user