Yellow Meter Hierarchy with Color Aware
Added a new color (yellow) to the meter hierarchy. The yellow action can also use the same meter as green action in a meter hierarchy, so both green/yellow packets will all go to the next meter. The color aware mode can be configured when creating the next meter, so the green/yellow packets can be distinguished by subsequent meters in hierarchy.
testpmd> add port meter profile srtcm_rfc4115 0
1
100000
100000
5000
50000
0
testpmd> add port meter policy 0
1
g_actions queue index 1
/ end y_actions queue index 2
/ end r_actions drop / end
testpmd> create port meter 0
1
1
1
yes 0xffff
0
1
testpmd> add port meter profile srtcm_rfc4115 0
2
200000
200000
5000
50000
0
testpmd> add port meter policy 0
2
g_actions meter mtr_id 1
/ end y_actions meter mtr_id 1
/ end r_actions drop / end
testpmd> create port meter 0
2
2
2
yes 0xffff
0
0
testpmd> flow create 0
priority 3
ingress group 0
pattern eth / end actions jump group 1
/ count / end
testpmd> flow create 0
priority 2
ingress group 1
pattern eth / end actions meter mtr_id 2
/ end
uint16_t port_id = 0
;
int
shared = 1
;
struct rte_mtr_error error;
// Create next meter with color aware enabled.
uint32_t next_profile_id = 1
;
uint32_t next_policy_id = 1
;
uint32_t next_mtr_id = 1
;
struct rte_mtr_params params = {};
params.meter_profile_id = next_profile_id;
params.use_prev_mtr_color = 1
;
params.meter_enable = 1
;
params.stats_mask = 0xffff
;
params.meter_policy_id = next_policy_id;
rte_mtr_create(port_id, next_mtr_id, params, shared, &error);
……
// Create hierarchy policy whose green/yellow both go to next meter
struct rte_mtr_meter_policy_params policy;
uint32_t policy_id = 2
;
int
ret;
struct rte_flow_action_meter next_meter = {.mtr_id = next_mtr_id};
struct rte_flow_action g_actions[] = {
{
.type = RTE_FLOW_ACTION_TYPE_METER,
.conf = &next_meter,
},
{
.type = RTE_FLOW_ACTION_TYPE_END,
},
};
struct rte_flow_action y_actions[] = {
{
.type = RTE_FLOW_ACTION_TYPE_METER,
.conf = &next_meter,
},
{
.type = RTE_FLOW_ACTION_TYPE_END,
},
};
struct rte_flow_action r_actions[] = {
{
.type = RTE_FLOW_ACTION_TYPE_DROP,
},
{
.type = RTE_FLOW_ACTION_TYPE_END,
},
};
policy.action[RTE_COLOR_GREEN] = g_actions;
policy.action[RTE_COLOR_YELLOW] = y_actions;
policy.action[RTE_COLOR_RED] = r_actions;
ret = rte_mtr_meter_policy_add(port_id, policy_id, &policy, &error);
if
(ret)
print_mtr_err_msg(&error);
…