mirror of
https://git.kernel.org/pub/scm/network/iproute2/iproute2.git
synced 2024-11-15 14:05:22 +08:00
lib: Extract from iplink_vlan a helper to parse key:value arrays
VLAN netdevices have two similar attributes: ingress-qos-map and egress-qos-map. These attributes can be configured with a series of 802.1-priority-to-skb-priority (and vice versa) mappings. A reusable helper along those lines will be handy for configuration of various priority-to-tc, tc-to-algorithm, and other arrays in DCB. Therefore extract the logic to a function parse_mapping(), move to utils.c, and dispatch to utils.c from iplink_vlan.c. That necessitates extraction of a VLAN-specific parse_qos_mapping(). Do that, and propagate addattr_l() return value up, unlike the original. Signed-off-by: Petr Machata <me@pmachata.org> Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
parent
6dd778e837
commit
28e663ee65
@ -329,4 +329,8 @@ int parse_one_of(const char *msg, const char *realval, const char * const *list,
|
||||
size_t len, int *p_err);
|
||||
bool parse_on_off(const char *msg, const char *realval, int *p_err);
|
||||
|
||||
int parse_mapping(int *argcp, char ***argvp,
|
||||
int (*mapping_cb)(__u32 key, char *value, void *data),
|
||||
void *mapping_cb_data);
|
||||
|
||||
#endif /* __UTILS_H__ */
|
||||
|
@ -49,36 +49,30 @@ static int on_off(const char *msg, const char *arg)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int parse_qos_mapping(__u32 key, char *value, void *data)
|
||||
{
|
||||
struct nlmsghdr *n = data;
|
||||
struct ifla_vlan_qos_mapping m = {
|
||||
.from = key,
|
||||
};
|
||||
|
||||
if (get_u32(&m.to, value, 0))
|
||||
return 1;
|
||||
|
||||
return addattr_l(n, 1024, IFLA_VLAN_QOS_MAPPING, &m, sizeof(m));
|
||||
}
|
||||
|
||||
static int vlan_parse_qos_map(int *argcp, char ***argvp, struct nlmsghdr *n,
|
||||
int attrtype)
|
||||
{
|
||||
int argc = *argcp;
|
||||
char **argv = *argvp;
|
||||
struct ifla_vlan_qos_mapping m;
|
||||
struct rtattr *tail;
|
||||
|
||||
tail = addattr_nest(n, 1024, attrtype);
|
||||
|
||||
while (argc > 0) {
|
||||
char *colon = strchr(*argv, ':');
|
||||
|
||||
if (!colon)
|
||||
break;
|
||||
*colon = '\0';
|
||||
|
||||
if (get_u32(&m.from, *argv, 0))
|
||||
return 1;
|
||||
if (get_u32(&m.to, colon + 1, 0))
|
||||
return 1;
|
||||
argc--, argv++;
|
||||
|
||||
addattr_l(n, 1024, IFLA_VLAN_QOS_MAPPING, &m, sizeof(m));
|
||||
}
|
||||
if (parse_mapping(argcp, argvp, &parse_qos_mapping, n))
|
||||
return 1;
|
||||
|
||||
addattr_nest_end(n, tail);
|
||||
|
||||
*argcp = argc;
|
||||
*argvp = argv;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
28
lib/utils.c
28
lib/utils.c
@ -1763,3 +1763,31 @@ bool parse_on_off(const char *msg, const char *realval, int *p_err)
|
||||
|
||||
return parse_one_of(msg, realval, values_on_off, ARRAY_SIZE(values_on_off), p_err);
|
||||
}
|
||||
|
||||
int parse_mapping(int *argcp, char ***argvp,
|
||||
int (*mapping_cb)(__u32 key, char *value, void *data),
|
||||
void *mapping_cb_data)
|
||||
{
|
||||
int argc = *argcp;
|
||||
char **argv = *argvp;
|
||||
|
||||
while (argc > 0) {
|
||||
char *colon = strchr(*argv, ':');
|
||||
__u32 key;
|
||||
|
||||
if (!colon)
|
||||
break;
|
||||
*colon = '\0';
|
||||
|
||||
if (get_u32(&key, *argv, 0))
|
||||
return 1;
|
||||
if (mapping_cb(key, colon + 1, mapping_cb_data))
|
||||
return 1;
|
||||
|
||||
argc--, argv++;
|
||||
}
|
||||
|
||||
*argcp = argc;
|
||||
*argvp = argv;
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user