ethdev: add neighbor discovery to flow API

- RTE_FLOW_ITEM_TYPE_ARP_ETH_IPV4: matches an ARP header for Ethernet/IPv4.

- RTE_FLOW_ITEM_TYPE_IPV6_EXT: matches the presence of any IPv6 extension
  header.

- RTE_FLOW_ITEM_TYPE_ICMP6: matches any ICMPv6 header.

- RTE_FLOW_ITEM_TYPE_ICMP6_ND_NS: matches an ICMPv6 neighbor discovery
  solicitation.

- RTE_FLOW_ITEM_TYPE_ICMP6_ND_NA: matches an ICMPv6 neighbor discovery
  advertisement.

- RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT: matches the presence of any ICMPv6
  neighbor discovery option.

- RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_ETH_SLA: matches an ICMPv6 neighbor
  discovery source Ethernet link-layer address option.

- RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_ETH_TLA: matches an ICMPv6 neighbor
  discovery target Ethernet link-layer address option.

Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
This commit is contained in:
Qi Zhang 2018-04-24 17:58:58 +02:00 committed by Ferruh Yigit
parent ad93fb8c9d
commit a903c049be
6 changed files with 665 additions and 2 deletions

View File

@ -156,6 +156,26 @@ enum index {
ITEM_GENEVE_PROTO,
ITEM_VXLAN_GPE,
ITEM_VXLAN_GPE_VNI,
ITEM_ARP_ETH_IPV4,
ITEM_ARP_ETH_IPV4_SHA,
ITEM_ARP_ETH_IPV4_SPA,
ITEM_ARP_ETH_IPV4_THA,
ITEM_ARP_ETH_IPV4_TPA,
ITEM_IPV6_EXT,
ITEM_IPV6_EXT_NEXT_HDR,
ITEM_ICMP6,
ITEM_ICMP6_TYPE,
ITEM_ICMP6_CODE,
ITEM_ICMP6_ND_NS,
ITEM_ICMP6_ND_NS_TARGET_ADDR,
ITEM_ICMP6_ND_NA,
ITEM_ICMP6_ND_NA_TARGET_ADDR,
ITEM_ICMP6_ND_OPT,
ITEM_ICMP6_ND_OPT_TYPE,
ITEM_ICMP6_ND_OPT_SLA_ETH,
ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
ITEM_ICMP6_ND_OPT_TLA_ETH,
ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
/* Validate/create actions. */
ACTIONS,
@ -473,6 +493,14 @@ static const enum index next_item[] = {
ITEM_GTPU,
ITEM_GENEVE,
ITEM_VXLAN_GPE,
ITEM_ARP_ETH_IPV4,
ITEM_IPV6_EXT,
ITEM_ICMP6,
ITEM_ICMP6_ND_NS,
ITEM_ICMP6_ND_NA,
ITEM_ICMP6_ND_OPT,
ITEM_ICMP6_ND_OPT_SLA_ETH,
ITEM_ICMP6_ND_OPT_TLA_ETH,
ZERO,
};
@ -635,6 +663,58 @@ static const enum index item_vxlan_gpe[] = {
ZERO,
};
static const enum index item_arp_eth_ipv4[] = {
ITEM_ARP_ETH_IPV4_SHA,
ITEM_ARP_ETH_IPV4_SPA,
ITEM_ARP_ETH_IPV4_THA,
ITEM_ARP_ETH_IPV4_TPA,
ITEM_NEXT,
ZERO,
};
static const enum index item_ipv6_ext[] = {
ITEM_IPV6_EXT_NEXT_HDR,
ITEM_NEXT,
ZERO,
};
static const enum index item_icmp6[] = {
ITEM_ICMP6_TYPE,
ITEM_ICMP6_CODE,
ITEM_NEXT,
ZERO,
};
static const enum index item_icmp6_nd_ns[] = {
ITEM_ICMP6_ND_NS_TARGET_ADDR,
ITEM_NEXT,
ZERO,
};
static const enum index item_icmp6_nd_na[] = {
ITEM_ICMP6_ND_NA_TARGET_ADDR,
ITEM_NEXT,
ZERO,
};
static const enum index item_icmp6_nd_opt[] = {
ITEM_ICMP6_ND_OPT_TYPE,
ITEM_NEXT,
ZERO,
};
static const enum index item_icmp6_nd_opt_sla_eth[] = {
ITEM_ICMP6_ND_OPT_SLA_ETH_SLA,
ITEM_NEXT,
ZERO,
};
static const enum index item_icmp6_nd_opt_tla_eth[] = {
ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
ITEM_NEXT,
ZERO,
};
static const enum index next_action[] = {
ACTION_END,
ACTION_VOID,
@ -1584,6 +1664,167 @@ static const struct token token_list[] = {
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_vxlan_gpe,
vni)),
},
[ITEM_ARP_ETH_IPV4] = {
.name = "arp_eth_ipv4",
.help = "match ARP header for Ethernet/IPv4",
.priv = PRIV_ITEM(ARP_ETH_IPV4,
sizeof(struct rte_flow_item_arp_eth_ipv4)),
.next = NEXT(item_arp_eth_ipv4),
.call = parse_vc,
},
[ITEM_ARP_ETH_IPV4_SHA] = {
.name = "sha",
.help = "sender hardware address",
.next = NEXT(item_arp_eth_ipv4, NEXT_ENTRY(MAC_ADDR),
item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_arp_eth_ipv4,
sha)),
},
[ITEM_ARP_ETH_IPV4_SPA] = {
.name = "spa",
.help = "sender IPv4 address",
.next = NEXT(item_arp_eth_ipv4, NEXT_ENTRY(IPV4_ADDR),
item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_arp_eth_ipv4,
spa)),
},
[ITEM_ARP_ETH_IPV4_THA] = {
.name = "tha",
.help = "target hardware address",
.next = NEXT(item_arp_eth_ipv4, NEXT_ENTRY(MAC_ADDR),
item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_arp_eth_ipv4,
tha)),
},
[ITEM_ARP_ETH_IPV4_TPA] = {
.name = "tpa",
.help = "target IPv4 address",
.next = NEXT(item_arp_eth_ipv4, NEXT_ENTRY(IPV4_ADDR),
item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_arp_eth_ipv4,
tpa)),
},
[ITEM_IPV6_EXT] = {
.name = "ipv6_ext",
.help = "match presence of any IPv6 extension header",
.priv = PRIV_ITEM(IPV6_EXT,
sizeof(struct rte_flow_item_ipv6_ext)),
.next = NEXT(item_ipv6_ext),
.call = parse_vc,
},
[ITEM_IPV6_EXT_NEXT_HDR] = {
.name = "next_hdr",
.help = "next header",
.next = NEXT(item_ipv6_ext, NEXT_ENTRY(UNSIGNED), item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv6_ext,
next_hdr)),
},
[ITEM_ICMP6] = {
.name = "icmp6",
.help = "match any ICMPv6 header",
.priv = PRIV_ITEM(ICMP6, sizeof(struct rte_flow_item_icmp6)),
.next = NEXT(item_icmp6),
.call = parse_vc,
},
[ITEM_ICMP6_TYPE] = {
.name = "type",
.help = "ICMPv6 type",
.next = NEXT(item_icmp6, NEXT_ENTRY(UNSIGNED), item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_icmp6,
type)),
},
[ITEM_ICMP6_CODE] = {
.name = "code",
.help = "ICMPv6 code",
.next = NEXT(item_icmp6, NEXT_ENTRY(UNSIGNED), item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_icmp6,
code)),
},
[ITEM_ICMP6_ND_NS] = {
.name = "icmp6_nd_ns",
.help = "match ICMPv6 neighbor discovery solicitation",
.priv = PRIV_ITEM(ICMP6_ND_NS,
sizeof(struct rte_flow_item_icmp6_nd_ns)),
.next = NEXT(item_icmp6_nd_ns),
.call = parse_vc,
},
[ITEM_ICMP6_ND_NS_TARGET_ADDR] = {
.name = "target_addr",
.help = "target address",
.next = NEXT(item_icmp6_nd_ns, NEXT_ENTRY(IPV6_ADDR),
item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_icmp6_nd_ns,
target_addr)),
},
[ITEM_ICMP6_ND_NA] = {
.name = "icmp6_nd_na",
.help = "match ICMPv6 neighbor discovery advertisement",
.priv = PRIV_ITEM(ICMP6_ND_NA,
sizeof(struct rte_flow_item_icmp6_nd_na)),
.next = NEXT(item_icmp6_nd_na),
.call = parse_vc,
},
[ITEM_ICMP6_ND_NA_TARGET_ADDR] = {
.name = "target_addr",
.help = "target address",
.next = NEXT(item_icmp6_nd_na, NEXT_ENTRY(IPV6_ADDR),
item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_icmp6_nd_na,
target_addr)),
},
[ITEM_ICMP6_ND_OPT] = {
.name = "icmp6_nd_opt",
.help = "match presence of any ICMPv6 neighbor discovery"
" option",
.priv = PRIV_ITEM(ICMP6_ND_OPT,
sizeof(struct rte_flow_item_icmp6_nd_opt)),
.next = NEXT(item_icmp6_nd_opt),
.call = parse_vc,
},
[ITEM_ICMP6_ND_OPT_TYPE] = {
.name = "type",
.help = "ND option type",
.next = NEXT(item_icmp6_nd_opt, NEXT_ENTRY(UNSIGNED),
item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_icmp6_nd_opt,
type)),
},
[ITEM_ICMP6_ND_OPT_SLA_ETH] = {
.name = "icmp6_nd_opt_sla_eth",
.help = "match ICMPv6 neighbor discovery source Ethernet"
" link-layer address option",
.priv = PRIV_ITEM
(ICMP6_ND_OPT_SLA_ETH,
sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
.next = NEXT(item_icmp6_nd_opt_sla_eth),
.call = parse_vc,
},
[ITEM_ICMP6_ND_OPT_SLA_ETH_SLA] = {
.name = "sla",
.help = "source Ethernet LLA",
.next = NEXT(item_icmp6_nd_opt_sla_eth, NEXT_ENTRY(MAC_ADDR),
item_param),
.args = ARGS(ARGS_ENTRY_HTON
(struct rte_flow_item_icmp6_nd_opt_sla_eth, sla)),
},
[ITEM_ICMP6_ND_OPT_TLA_ETH] = {
.name = "icmp6_nd_opt_tla_eth",
.help = "match ICMPv6 neighbor discovery target Ethernet"
" link-layer address option",
.priv = PRIV_ITEM
(ICMP6_ND_OPT_TLA_ETH,
sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
.next = NEXT(item_icmp6_nd_opt_tla_eth),
.call = parse_vc,
},
[ITEM_ICMP6_ND_OPT_TLA_ETH_TLA] = {
.name = "tla",
.help = "target Ethernet LLA",
.next = NEXT(item_icmp6_nd_opt_tla_eth, NEXT_ENTRY(MAC_ADDR),
item_param),
.args = ARGS(ARGS_ENTRY_HTON
(struct rte_flow_item_icmp6_nd_opt_tla_eth, tla)),
},
/* Validate/create actions. */
[ACTIONS] = {

View File

@ -1015,6 +1015,16 @@ static const struct {
MK_FLOW_ITEM(GTPU, sizeof(struct rte_flow_item_gtp)),
MK_FLOW_ITEM(GENEVE, sizeof(struct rte_flow_item_geneve)),
MK_FLOW_ITEM(VXLAN_GPE, sizeof(struct rte_flow_item_vxlan_gpe)),
MK_FLOW_ITEM(ARP_ETH_IPV4, sizeof(struct rte_flow_item_arp_eth_ipv4)),
MK_FLOW_ITEM(IPV6_EXT, sizeof(struct rte_flow_item_ipv6_ext)),
MK_FLOW_ITEM(ICMP6, sizeof(struct rte_flow_item_icmp6)),
MK_FLOW_ITEM(ICMP6_ND_NS, sizeof(struct rte_flow_item_icmp6_nd_ns)),
MK_FLOW_ITEM(ICMP6_ND_NA, sizeof(struct rte_flow_item_icmp6_nd_na)),
MK_FLOW_ITEM(ICMP6_ND_OPT, sizeof(struct rte_flow_item_icmp6_nd_opt)),
MK_FLOW_ITEM(ICMP6_ND_OPT_SLA_ETH,
sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
};
/** Pattern item specification types. */

View File

@ -874,7 +874,8 @@ Item: ``IPV6``
Matches an IPv6 header.
Note: IPv6 options are handled by dedicated pattern items.
Note: IPv6 options are handled by dedicated pattern items, see `Item:
IPV6_EXT`_.
- ``hdr``: IPv6 header definition (``rte_ip.h``).
- Default ``mask`` matches source and destination addresses only.
@ -1066,6 +1067,117 @@ Matches a VXLAN-GPE header (draft-ietf-nvo3-vxlan-gpe-05).
- ``rsvd1``: reserved, normally 0x00.
- Default ``mask`` matches VNI only.
Item: ``ARP_ETH_IPV4``
^^^^^^^^^^^^^^^^^^^^^^
Matches an ARP header for Ethernet/IPv4.
- ``hdr``: hardware type, normally 1.
- ``pro``: protocol type, normally 0x0800.
- ``hln``: hardware address length, normally 6.
- ``pln``: protocol address length, normally 4.
- ``op``: opcode (1 for request, 2 for reply).
- ``sha``: sender hardware address.
- ``spa``: sender IPv4 address.
- ``tha``: target hardware address.
- ``tpa``: target IPv4 address.
- Default ``mask`` matches SHA, SPA, THA and TPA.
Item: ``IPV6_EXT``
^^^^^^^^^^^^^^^^^^
Matches the presence of any IPv6 extension header.
- ``next_hdr``: next header.
- Default ``mask`` matches ``next_hdr``.
Normally preceded by any of:
- `Item: IPV6`_
- `Item: IPV6_EXT`_
Item: ``ICMP6``
^^^^^^^^^^^^^^^
Matches any ICMPv6 header.
- ``type``: ICMPv6 type.
- ``code``: ICMPv6 code.
- ``checksum``: ICMPv6 checksum.
- Default ``mask`` matches ``type`` and ``code``.
Item: ``ICMP6_ND_NS``
^^^^^^^^^^^^^^^^^^^^^
Matches an ICMPv6 neighbor discovery solicitation.
- ``type``: ICMPv6 type, normally 135.
- ``code``: ICMPv6 code, normally 0.
- ``checksum``: ICMPv6 checksum.
- ``reserved``: reserved, normally 0.
- ``target_addr``: target address.
- Default ``mask`` matches target address only.
Item: ``ICMP6_ND_NA``
^^^^^^^^^^^^^^^^^^^^^
Matches an ICMPv6 neighbor discovery advertisement.
- ``type``: ICMPv6 type, normally 136.
- ``code``: ICMPv6 code, normally 0.
- ``checksum``: ICMPv6 checksum.
- ``rso_reserved``: route flag (1b), solicited flag (1b), override flag
(1b), reserved (29b).
- ``target_addr``: target address.
- Default ``mask`` matches target address only.
Item: ``ICMP6_ND_OPT``
^^^^^^^^^^^^^^^^^^^^^^
Matches the presence of any ICMPv6 neighbor discovery option.
- ``type``: ND option type.
- ``length``: ND option length.
- Default ``mask`` matches type only.
Normally preceded by any of:
- `Item: ICMP6_ND_NA`_
- `Item: ICMP6_ND_NS`_
- `Item: ICMP6_ND_OPT`_
Item: ``ICMP6_ND_OPT_SLA_ETH``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Matches an ICMPv6 neighbor discovery source Ethernet link-layer address
option.
- ``type``: ND option type, normally 1.
- ``length``: ND option length, normally 1.
- ``sla``: source Ethernet LLA.
- Default ``mask`` matches source link-layer address only.
Normally preceded by any of:
- `Item: ICMP6_ND_NA`_
- `Item: ICMP6_ND_OPT`_
Item: ``ICMP6_ND_OPT_TLA_ETH``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Matches an ICMPv6 neighbor discovery target Ethernet link-layer address
option.
- ``type``: ND option type, normally 2.
- ``length``: ND option length, normally 1.
- ``tla``: target Ethernet LLA.
- Default ``mask`` matches target link-layer address only.
Normally preceded by any of:
- `Item: ICMP6_ND_NS`_
- `Item: ICMP6_ND_OPT`_
Actions
~~~~~~~

View File

@ -3338,6 +3338,44 @@ This section lists supported pattern items and their attributes, if any.
- ``vni {unsigned}``: VXLAN-GPE identifier.
- ``arp_eth_ipv4``: match ARP header for Ethernet/IPv4.
- ``sha {MAC-48}``: sender hardware address.
- ``spa {ipv4 address}``: sender IPv4 address.
- ``tha {MAC-48}``: target hardware address.
- ``tpa {ipv4 address}``: target IPv4 address.
- ``ipv6_ext``: match presence of any IPv6 extension header.
- ``next_hdr {unsigned}``: next header.
- ``icmp6``: match any ICMPv6 header.
- ``type {unsigned}``: ICMPv6 type.
- ``code {unsigned}``: ICMPv6 code.
- ``icmp6_nd_ns``: match ICMPv6 neighbor discovery solicitation.
- ``target_addr {ipv6 address}``: target address.
- ``icmp6_nd_na``: match ICMPv6 neighbor discovery advertisement.
- ``target_addr {ipv6 address}``: target address.
- ``icmp6_nd_opt``: match presence of any ICMPv6 neighbor discovery option.
- ``type {unsigned}``: ND option type.
- ``icmp6_nd_opt_sla_eth``: match ICMPv6 neighbor discovery source Ethernet
link-layer address option.
- ``sla {MAC-48}``: source Ethernet LLA.
- ``icmp6_nd_opt_sla_eth``: match ICMPv6 neighbor discovery target Ethernet
link-layer address option.
- ``tla {MAC-48}``: target Ethernet LLA.
Actions list
^^^^^^^^^^^^

View File

@ -56,6 +56,16 @@ static const struct rte_flow_desc_data rte_flow_desc_item[] = {
MK_FLOW_ITEM(NVGRE, sizeof(struct rte_flow_item_nvgre)),
MK_FLOW_ITEM(GENEVE, sizeof(struct rte_flow_item_geneve)),
MK_FLOW_ITEM(VXLAN_GPE, sizeof(struct rte_flow_item_vxlan_gpe)),
MK_FLOW_ITEM(ARP_ETH_IPV4, sizeof(struct rte_flow_item_arp_eth_ipv4)),
MK_FLOW_ITEM(IPV6_EXT, sizeof(struct rte_flow_item_ipv6_ext)),
MK_FLOW_ITEM(ICMP6, sizeof(struct rte_flow_item_icmp6)),
MK_FLOW_ITEM(ICMP6_ND_NS, sizeof(struct rte_flow_item_icmp6_nd_ns)),
MK_FLOW_ITEM(ICMP6_ND_NA, sizeof(struct rte_flow_item_icmp6_nd_na)),
MK_FLOW_ITEM(ICMP6_ND_OPT, sizeof(struct rte_flow_item_icmp6_nd_opt)),
MK_FLOW_ITEM(ICMP6_ND_OPT_SLA_ETH,
sizeof(struct rte_flow_item_icmp6_nd_opt_sla_eth)),
MK_FLOW_ITEM(ICMP6_ND_OPT_TLA_ETH,
sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
};
/** Generate flow_action[] entry. */

View File

@ -346,6 +346,64 @@ enum rte_flow_item_type {
* See struct rte_flow_item_vxlan_gpe.
*/
RTE_FLOW_ITEM_TYPE_VXLAN_GPE,
/**
* Matches an ARP header for Ethernet/IPv4.
*
* See struct rte_flow_item_arp_eth_ipv4.
*/
RTE_FLOW_ITEM_TYPE_ARP_ETH_IPV4,
/**
* Matches the presence of any IPv6 extension header.
*
* See struct rte_flow_item_ipv6_ext.
*/
RTE_FLOW_ITEM_TYPE_IPV6_EXT,
/**
* Matches any ICMPv6 header.
*
* See struct rte_flow_item_icmp6.
*/
RTE_FLOW_ITEM_TYPE_ICMP6,
/**
* Matches an ICMPv6 neighbor discovery solicitation.
*
* See struct rte_flow_item_icmp6_nd_ns.
*/
RTE_FLOW_ITEM_TYPE_ICMP6_ND_NS,
/**
* Matches an ICMPv6 neighbor discovery advertisement.
*
* See struct rte_flow_item_icmp6_nd_na.
*/
RTE_FLOW_ITEM_TYPE_ICMP6_ND_NA,
/**
* Matches the presence of any ICMPv6 neighbor discovery option.
*
* See struct rte_flow_item_icmp6_nd_opt.
*/
RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT,
/**
* Matches an ICMPv6 neighbor discovery source Ethernet link-layer
* address option.
*
* See struct rte_flow_item_icmp6_nd_opt_sla_eth.
*/
RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_SLA_ETH,
/**
* Matches an ICMPv6 neighbor discovery target Ethernet link-layer
* address option.
*
* See struct rte_flow_item_icmp6_nd_opt_tla_eth.
*/
RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_TLA_ETH,
};
/**
@ -571,7 +629,8 @@ static const struct rte_flow_item_ipv4 rte_flow_item_ipv4_mask = {
*
* Matches an IPv6 header.
*
* Note: IPv6 options are handled by dedicated pattern items.
* Note: IPv6 options are handled by dedicated pattern items, see
* RTE_FLOW_ITEM_TYPE_IPV6_EXT.
*/
struct rte_flow_item_ipv6 {
struct ipv6_hdr hdr; /**< IPv6 header definition. */
@ -894,6 +953,199 @@ static const struct rte_flow_item_vxlan_gpe rte_flow_item_vxlan_gpe_mask = {
};
#endif
/**
* RTE_FLOW_ITEM_TYPE_ARP_ETH_IPV4
*
* Matches an ARP header for Ethernet/IPv4.
*/
struct rte_flow_item_arp_eth_ipv4 {
rte_be16_t hrd; /**< Hardware type, normally 1. */
rte_be16_t pro; /**< Protocol type, normally 0x0800. */
uint8_t hln; /**< Hardware address length, normally 6. */
uint8_t pln; /**< Protocol address length, normally 4. */
rte_be16_t op; /**< Opcode (1 for request, 2 for reply). */
struct ether_addr sha; /**< Sender hardware address. */
rte_be32_t spa; /**< Sender IPv4 address. */
struct ether_addr tha; /**< Target hardware address. */
rte_be32_t tpa; /**< Target IPv4 address. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_ARP_ETH_IPV4. */
#ifndef __cplusplus
static const struct rte_flow_item_arp_eth_ipv4
rte_flow_item_arp_eth_ipv4_mask = {
.sha.addr_bytes = "\xff\xff\xff\xff\xff\xff",
.spa = RTE_BE32(0xffffffff),
.tha.addr_bytes = "\xff\xff\xff\xff\xff\xff",
.tpa = RTE_BE32(0xffffffff),
};
#endif
/**
* RTE_FLOW_ITEM_TYPE_IPV6_EXT
*
* Matches the presence of any IPv6 extension header.
*
* Normally preceded by any of:
*
* - RTE_FLOW_ITEM_TYPE_IPV6
* - RTE_FLOW_ITEM_TYPE_IPV6_EXT
*/
struct rte_flow_item_ipv6_ext {
uint8_t next_hdr; /**< Next header. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_IPV6_EXT. */
#ifndef __cplusplus
static const
struct rte_flow_item_ipv6_ext rte_flow_item_ipv6_ext_mask = {
.next_hdr = 0xff,
};
#endif
/**
* RTE_FLOW_ITEM_TYPE_ICMP6
*
* Matches any ICMPv6 header.
*/
struct rte_flow_item_icmp6 {
uint8_t type; /**< ICMPv6 type. */
uint8_t code; /**< ICMPv6 code. */
uint16_t checksum; /**< ICMPv6 checksum. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_ICMP6. */
#ifndef __cplusplus
static const struct rte_flow_item_icmp6 rte_flow_item_icmp6_mask = {
.type = 0xff,
.code = 0xff,
};
#endif
/**
* RTE_FLOW_ITEM_TYPE_ICMP6_ND_NS
*
* Matches an ICMPv6 neighbor discovery solicitation.
*/
struct rte_flow_item_icmp6_nd_ns {
uint8_t type; /**< ICMPv6 type, normally 135. */
uint8_t code; /**< ICMPv6 code, normally 0. */
rte_be16_t checksum; /**< ICMPv6 checksum. */
rte_be32_t reserved; /**< Reserved, normally 0. */
uint8_t target_addr[16]; /**< Target address. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_ICMP6_ND_NS. */
#ifndef __cplusplus
static const
struct rte_flow_item_icmp6_nd_ns rte_flow_item_icmp6_nd_ns_mask = {
.target_addr =
"\xff\xff\xff\xff\xff\xff\xff\xff"
"\xff\xff\xff\xff\xff\xff\xff\xff",
};
#endif
/**
* RTE_FLOW_ITEM_TYPE_ICMP6_ND_NA
*
* Matches an ICMPv6 neighbor discovery advertisement.
*/
struct rte_flow_item_icmp6_nd_na {
uint8_t type; /**< ICMPv6 type, normally 136. */
uint8_t code; /**< ICMPv6 code, normally 0. */
rte_be16_t checksum; /**< ICMPv6 checksum. */
/**
* Route flag (1b), solicited flag (1b), override flag (1b),
* reserved (29b).
*/
rte_be32_t rso_reserved;
uint8_t target_addr[16]; /**< Target address. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_ICMP6_ND_NA. */
#ifndef __cplusplus
static const
struct rte_flow_item_icmp6_nd_na rte_flow_item_icmp6_nd_na_mask = {
.target_addr =
"\xff\xff\xff\xff\xff\xff\xff\xff"
"\xff\xff\xff\xff\xff\xff\xff\xff",
};
#endif
/**
* RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT
*
* Matches the presence of any ICMPv6 neighbor discovery option.
*
* Normally preceded by any of:
*
* - RTE_FLOW_ITEM_TYPE_ICMP6_ND_NA
* - RTE_FLOW_ITEM_TYPE_ICMP6_ND_NS
* - RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT
*/
struct rte_flow_item_icmp6_nd_opt {
uint8_t type; /**< ND option type. */
uint8_t length; /**< ND option length. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT. */
#ifndef __cplusplus
static const struct rte_flow_item_icmp6_nd_opt
rte_flow_item_icmp6_nd_opt_mask = {
.type = 0xff,
};
#endif
/**
* RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_SLA_ETH
*
* Matches an ICMPv6 neighbor discovery source Ethernet link-layer address
* option.
*
* Normally preceded by any of:
*
* - RTE_FLOW_ITEM_TYPE_ICMP6_ND_NA
* - RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT
*/
struct rte_flow_item_icmp6_nd_opt_sla_eth {
uint8_t type; /**< ND option type, normally 1. */
uint8_t length; /**< ND option length, normally 1. */
struct ether_addr sla; /**< Source Ethernet LLA. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_SLA_ETH. */
#ifndef __cplusplus
static const struct rte_flow_item_icmp6_nd_opt_sla_eth
rte_flow_item_icmp6_nd_opt_sla_eth_mask = {
.sla.addr_bytes = "\xff\xff\xff\xff\xff\xff",
};
#endif
/**
* RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_TLA_ETH
*
* Matches an ICMPv6 neighbor discovery target Ethernet link-layer address
* option.
*
* Normally preceded by any of:
*
* - RTE_FLOW_ITEM_TYPE_ICMP6_ND_NS
* - RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT
*/
struct rte_flow_item_icmp6_nd_opt_tla_eth {
uint8_t type; /**< ND option type, normally 2. */
uint8_t length; /**< ND option length, normally 1. */
struct ether_addr tla; /**< Target Ethernet LLA. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_TLA_ETH. */
#ifndef __cplusplus
static const struct rte_flow_item_icmp6_nd_opt_tla_eth
rte_flow_item_icmp6_nd_opt_tla_eth_mask = {
.tla.addr_bytes = "\xff\xff\xff\xff\xff\xff",
};
#endif
/**
* Matching pattern item definition.
*