Skip to content
Snippets Groups Projects
Commit 3c915f5f authored by Maxim Menshikov's avatar Maxim Menshikov
Browse files

Parse QoS dscp_pcp as list of dscp_min[-dscp_max],pcp pairs

parent ac03b7c2
No related branches found
No related tags found
1 merge request!285QoS: switch to [dscp_min,dscp_max]->pcp pairs instead of explicit 64-byte dscp-pcp map
Pipeline #124656 passed
...@@ -127,7 +127,7 @@ static int cntlr_config_get_qos_rule_dscp_pcp(struct controller_config *cc, ...@@ -127,7 +127,7 @@ static int cntlr_config_get_qos_rule_dscp_pcp(struct controller_config *cc,
const struct uci_parse_option opts[] = { const struct uci_parse_option opts[] = {
[QOS_RULE_DSCP_PCP_DSCP_PCP] = { [QOS_RULE_DSCP_PCP_DSCP_PCP] = {
.name = "dscp_pcp", .name = "dscp_pcp",
.type = UCI_TYPE_STRING .type = UCI_TYPE_LIST
}, },
}; };
struct uci_option *tb[NUM_QOS_RULE_DSCP_PCP_ATTRS]; struct uci_option *tb[NUM_QOS_RULE_DSCP_PCP_ATTRS];
...@@ -138,15 +138,33 @@ static int cntlr_config_get_qos_rule_dscp_pcp(struct controller_config *cc, ...@@ -138,15 +138,33 @@ static int cntlr_config_get_qos_rule_dscp_pcp(struct controller_config *cc,
if (tb[QOS_RULE_DSCP_PCP_DSCP_PCP]) { if (tb[QOS_RULE_DSCP_PCP_DSCP_PCP]) {
const char *str = tb[QOS_RULE_DSCP_PCP_DSCP_PCP]->v.string; struct uci_element *x;
int val;
size_t idx = 0; uci_foreach_element(&tb[QOS_RULE_DSCP_PCP_DSCP_PCP]->v.list, x) {
int dscp_min = 0;
while (str != NULL && sscanf(str, "%d", &val) == 1) { int dscp_max = 0;
dscp_pcp->dscp_pcp[idx++] = val; int pcp = 0;
str = strstr(str, ",");
if (str != NULL) if (sscanf(x->name, "%d-%d,%d", &dscp_min, &dscp_max, &pcp) == 3) {
str++; if (pcp <= 7 && pcp >= 0 && dscp_min >= 0 && dscp_max >= 0 &&
dscp_min < dscp_max &&
dscp_min < (sizeof(dscp_pcp->dscp_pcp) /
sizeof(dscp_pcp->dscp_pcp[0])) &&
dscp_max < (sizeof(dscp_pcp->dscp_pcp) /
sizeof(dscp_pcp->dscp_pcp[0]))) {
uint8_t dscp;
for (dscp = dscp_min; dscp <= dscp_max; ++dscp) {
dscp_pcp->dscp_pcp[dscp] = pcp;
}
}
} else if (sscanf(x->name, "%d,%d", &dscp_min, &pcp) == 2) {
if (pcp <= 7 && pcp >= 0 && dscp_min >= 0 &&
dscp_min < (sizeof(dscp_pcp->dscp_pcp) /
sizeof(dscp_pcp->dscp_pcp[0]))) {
dscp_pcp->dscp_pcp[dscp_min] = pcp;
}
}
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment