tc: flower: provide generic masked u8 parser helper
Provide generic masked u8 paser helper and use it to parse arp operations. Also consistently use __u8 rather than uint8_t, in keeping with the pervasive style in the file. Signed-off-by: Simon Horman <simon.horman@netronome.com>
This commit is contained in:
parent
cad5493448
commit
180136e540
|
|
@ -309,33 +309,30 @@ static int flower_parse_arp_ip_addr(char *str, __be16 eth_type,
|
||||||
TCA_FLOWER_UNSPEC, TCA_FLOWER_UNSPEC, n);
|
TCA_FLOWER_UNSPEC, TCA_FLOWER_UNSPEC, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int flower_parse_arp_op(char *str, __be16 eth_type,
|
static int flower_parse_u8(char *str, int value_type, int mask_type,
|
||||||
int op_type, int mask_type,
|
int (*value_from_name)(const char *str,
|
||||||
struct nlmsghdr *n)
|
__u8 *value),
|
||||||
|
bool (*value_validate)(__u8 value),
|
||||||
|
struct nlmsghdr *n)
|
||||||
{
|
{
|
||||||
char *slash;
|
char *slash;
|
||||||
int ret, err = -1;
|
int ret, err = -1;
|
||||||
uint8_t value, mask;
|
__u8 value, mask;
|
||||||
|
|
||||||
slash = strchr(str, '/');
|
slash = strchr(str, '/');
|
||||||
if (slash)
|
if (slash)
|
||||||
*slash = '\0';
|
*slash = '\0';
|
||||||
|
|
||||||
if (!flower_eth_type_arp(eth_type))
|
ret = value_from_name ? value_from_name(str, &value) : -1;
|
||||||
goto err;
|
if (ret < 0) {
|
||||||
|
|
||||||
if (!strcmp(str, "request")) {
|
|
||||||
value = ARPOP_REQUEST;
|
|
||||||
} else if (!strcmp(str, "reply")) {
|
|
||||||
value = ARPOP_REPLY;
|
|
||||||
} else {
|
|
||||||
ret = get_u8(&value, str, 10);
|
ret = get_u8(&value, str, 10);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
if (value && value != ARPOP_REQUEST && value != ARPOP_REPLY)
|
|
||||||
goto err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (value_validate && !value_validate(value))
|
||||||
|
goto err;
|
||||||
|
|
||||||
if (slash) {
|
if (slash) {
|
||||||
ret = get_u8(&mask, slash + 1, 10);
|
ret = get_u8(&mask, slash + 1, 10);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
@ -345,7 +342,7 @@ static int flower_parse_arp_op(char *str, __be16 eth_type,
|
||||||
mask = UINT8_MAX;
|
mask = UINT8_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
addattr8(n, MAX_MSG, op_type, value);
|
addattr8(n, MAX_MSG, value_type, value);
|
||||||
addattr8(n, MAX_MSG, mask_type, mask);
|
addattr8(n, MAX_MSG, mask_type, mask);
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
|
|
@ -355,6 +352,34 @@ err:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int flower_arp_op_from_name(const char *name, __u8 *op)
|
||||||
|
{
|
||||||
|
if (!strcmp(name, "request"))
|
||||||
|
*op = ARPOP_REQUEST;
|
||||||
|
else if (!strcmp(name, "reply"))
|
||||||
|
*op = ARPOP_REPLY;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool flow_arp_op_validate(__u8 op)
|
||||||
|
{
|
||||||
|
return !op || op == ARPOP_REQUEST || op == ARPOP_REPLY;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int flower_parse_arp_op(char *str, __be16 eth_type,
|
||||||
|
int op_type, int mask_type,
|
||||||
|
struct nlmsghdr *n)
|
||||||
|
{
|
||||||
|
if (!flower_eth_type_arp(eth_type))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return flower_parse_u8(str, op_type, mask_type, flower_arp_op_from_name,
|
||||||
|
flow_arp_op_validate, n);
|
||||||
|
}
|
||||||
|
|
||||||
static int flower_icmp_attr_type(__be16 eth_type, __u8 ip_proto,
|
static int flower_icmp_attr_type(__be16 eth_type, __u8 ip_proto,
|
||||||
enum flower_icmp_field field)
|
enum flower_icmp_field field)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue