Add new protocol header match support as below RTE_FLOW_ITEM_TYPE_ARP - match IPv4 ARP header. RTE_FLOW_ITEM_TYPE_EXT_HDR_ANY - match any IPv6 extension header. RTE_FLOW_ITEM_TYPE_ICMPV6 - match IPv6 ICMP header. RTE_FLOW_ITEM_TYPE_ICMPV6_TGT_ADDR - match IPv6 ICMP Target address RTE_FLOW_ITEM_TYPE_ICMPV6_SSL - match IPv6 ICMP Source Link-layer address RTE_FLOW_ITEM_TYPE_ICMPV6_TTL - match IPv6 ICMP Target Link-layer address
Signed-off-by: Qi Zhang <qi.z.zh...@intel.com> --- lib/librte_ether/rte_flow.h | 156 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h index e09e07f..4ee2b62 100644 --- a/lib/librte_ether/rte_flow.h +++ b/lib/librte_ether/rte_flow.h @@ -348,6 +348,49 @@ enum rte_flow_item_type { * See struct rte_flow_item_esp. */ RTE_FLOW_ITEM_TYPE_ESP, + + /** + * Matches ARP IPv4 header. + * + * See struct rte_flow_item_arp. + */ + RTE_FLOW_ITEM_TYPE_ARP, + + /** + * Matches any IPv6 Extension header. + * + * See struct rte_flow_item_ipv6_ext_any. + */ + RTE_FLOW_ITEM_TYPE_IPV6_EXT_HDR_ANY, + + /** + * Matches ICMPv6 header. + * + * See struct rte_flow_item_icmpv6 + */ + RTE_FLOW_ITEM_TYPE_ICMPV6, + + /** + * Match ICMPv6 target address. + * + * See struct rte_flow_item_icmpv6_tgt_addr. + */ + RTE_FLOW_ITEM_TYPE_ICMPV6_TGT_ADDR, + + /** + * Match ICMPv6 Source Link-Layer Address. + * + * See struct rte_flow_item_icmpv6_sll. + */ + RTE_FLOW_ITEM_TYPE_ICMPV6_SLL, + + /** + * Match ICMPv6 Source Link-Layer Address. + * + * See struct rte_flow_item_icmpv6_tll. + */ + RTE_FLOW_ITEM_TYPE_ICMPV6_TLL, + }; /** @@ -817,6 +860,119 @@ static const struct rte_flow_item_esp rte_flow_item_esp_mask = { #endif /** + * RTE_FLOW_ITEM_TYPE_ARP + * + * Matches IPv4 ARP packet header + */ +struct rte_flow_item_arp { + struct arp_hdr hdr; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_ARP. */ +#ifndef __cplusplus +static const struct rte_flow_item_arp rte_flow_item_arp_mask = { + .hdr = { + .arp_data = { + .arp_sha = { + .addr_bytes = "\xff\xff\xff\xff\xff\xff", + }, + .arp_sip = RTE_BE32(0xffffffff), + .arp_tha = { + .addr_bytes = "\xff\xff\xff\xff\xff\xff", + }, + .arp_tip = RTE_BE32(0xffffffff), + }, + }, +}; +#endif + +/** + * RTE_FLOW_ITEM_TYPE_IPV6_EXT_HDR_ANY + * + * Matches any IPv6 extension header. + */ +struct rte_flow_item_ipv6_ext_hdr_any { + uint8_t next_hdr; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_IPV6_EXT_HDR_ANY. */ +#ifndef __cplusplus +static const struct rte_flow_item_ipv6_ext_hdr_any rte_flow_item_ipv6_ext_any_mask = { + .next_hdr = 0xff, +}; +#endif + +/** + * RTE_FLOW_ITEM_TYPE_ICMPV6 + * + * Matches ICMPv6 header. + */ +struct rte_flow_item_icmpv6 { + uint8_t type; + uint8_t code; + uint16_t checksum; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_ICMPV6 */ +#ifndef __cplusplus +static const struct rte_flow_item_icmpv6 rte_flow_item_icmpv6_mask = { + .type = 0xff, + .code = 0xff, + .checksum = RTE_BE16(0xffff), +}; +#endif + +/** + * RTE_FLOW_ITEM_TYPE_ICMPV6_TGT_ADDR + * + * Matches ICMPv6's Target Address. + */ +struct rte_flow_item_icmpv6_tgt_addr { + uint8_t addr[16]; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_ICMPV6_TGT_ADDR */ +#ifndef __cplusplus +static const struct rte_flow_item_icmpv6_tgt_addr rte_flow_item_icmpv6_tgt_addr_mask = { + .addr = "\xff\xff\xff\xff", +}; +#endif + +/** + * RTE_FLOW_ITEM_TYPE_ICPMV6_SLL. + * + * Matches ICMPv6 Source Link-Layer address. + */ +struct rte_flow_item_icmpv6_sll { + struct ether_addr addr; +}; +/** Default mask for RTE_FLOW_ITEM_TYPE_ICMPV6_SLL */ +#ifndef __cplusplus +static const struct rte_flow_item_icmpv6_sll rte_flow_item_icmpv6_sll_mask = { + .addr = { + .addr_bytes = "\xff\xff\xff\xff\xff\xff", + } +}; +#endif + +/** + * RTE_FLOW_ITEM_TYPE_ICMPV6_TLL. + * + * Matches ICMPv6 Target Link-Layer address. + */ +struct rte_flow_item_icmpv6_tll { + struct ether_addr addr; +}; +/** Default mask for RTE_FLOW_ITEM_TYPE_ICMPV6_TLL */ +#ifndef __cplusplus +static const struct rte_flow_item_icmpv6_tll rte_flow_item_icmpv6_tll_mask = { + .addr = { + .addr_bytes = "\xff\xff\xff\xff\xff\xff", + } +}; +#endif + +/** * Matching pattern item definition. * * A pattern is formed by stacking items starting from the lowest protocol -- 2.7.4