ECN in IP Header Modification
ECN field in the IPv4/IPv6 header can now be modified using the modify field action which now can be modified in the meter policy.
Users can set the ECN field to 3 with the below command:
testpmd> flow create 0 ingress pattern eth / ipv4 / end actions modify_field op set dst_type ipv4_ecn src_type value src_value 0x03 witdh 2 / queue index 0 / end
Users can also use the modify field action in the meter as below:
testpmd> add port meter profile srtcm_rfc2697 0 11 100 100 0 1
testpmd> add port meter policy 0 21 g_actions port_id id 1 / end y_actions end r_actions drop / end
testpmd> add port meter policy 0 21 g_actions modify_field op set dst_type ipv4_ecn src_type value src_value 3 width 2 / port_id id 1 / end y_actions end r_actions drop / end
testpmd> flow create 0 ingress transfer pattern eth / ipv4 / end actions meter mtr_id 1 / end
struct rte_flow_attr attr;
struct rte_flow_error error;
struct rte_flow_item pattern[MAX_PATTERN_NUM];
struct rte_flow_action action[MAX_ACTION_NUM];
struct rte_flow_action_queue queue = { .index = 1 };
memset(&attr, 0, sizeof(struct rte_flow_attr));
attr.ingress = 1;
attr.group = 1;
attr.priority = 1;
pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;
pattern[1].type = RTE_FLOW_ITEM_TYPE_IPV4;
pattern[2].type = RTE_FLOW_ITEM_TYPE_END;
struct rte_flow_action_modify_field modify_field = {
.opreation = RTE_FLOW_MODIFY_SET,
.dst = {
.field = RTE_FLOW_FIELD_IPV4_ECN,
};
.src = {
.field = RTE_FLOW_FIELD_VALUE,
.value = 3,
},
.width = 2,
};
action[0].type = RTE_FLOW_ACTION_TYPE_MODIFY_FIELD;
action[0].conf = &modify_field;
action[1].type = RTE_FLOW_ACTION_TYPE_QUEUE;
action[1].conf = &queue;
action[2].type = RTE_FLOW_ACTION_TYPE_END;
res = rte_flow_validate(port_id, &attr, pattern, action, &error);
if (!res)
flow = rte_flow_create(port_id, &attr, pattern, action, &error);
return flow;