Hi folks,
Thanks to the community colleagues that participated to the call earlier today.
Apologies for not CC-ing all the 9 attendants, as I don't have the email
address for all of them.
We had a good meeting, I think we agreed on a good solution that will also
simplify the API proposal.
Recap on the problem statement:
1. How do we decide on the input color for the current packet in a
deterministic (implementation independent) way?
2. Multiple choices possible for a given packet: The same packet might contain
multiple headers that can provide the input color. Examples: VLAN (the PCP and
DEI fields), IP (DSCP field), others. Some headers of same type may show up in
the same packet (e.g. outer/inner header).
3. Some of the possible choices might not be available for a given packet:
Different packets may contain different headers.
Proposed solution:
1. Configure which protocols to enable. Example: we might want to consider
Outer VLAN and Outer IP, but disable Inner VLAN and inner IP.
2. Configure on the priority of each of the enabled protocols (0 = highest
priority). Example: If the current packet has an Outer VLAN header, but not an
Outer IP header, then we get the input color from the Outer VLAN header; same,
if there is an Outer IP header, but no Outer VLAN header, we get the priority
from the Outer IP header. But what if the packet has both an Outer VLAN and an
Outer IP header? In this case we need to consider the priority and pick the
input color from the highest priority header.
3. Configure the default input color. What happens if the packet does not have
an Outer VLAN header, nor an Outer IP header? Then the default input color is
picked.
API guideline:
enum rte_mtr_color_in_protocol {
RTE_MTR_COLOR_IN_OUTER_VLAN,
RTE_MTR_COLOR_IN_INNER_VLAN,
RTE_MTR_COLOR_IN_OUTER_IP,
RTE_MTR_COLOR_IN_INNER_IP,
//more to add as needed. Per Ori's comment, we can add a reunion of the
two protocols as well when needed, e.g. RTE_MTR_COLOR_IN_OUTER_VLAN_OUTER_IP
that has a (4+6)-bit index (PCI, DEI, DSCP).
}
int
rte_mtr_color_in_protocol_priority_set(enum rte_mtr_color_in_protocol proto,
uint32_t priority); //0 is highest priority
Regards,
Cristian