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:
parent
ad93fb8c9d
commit
a903c049be
@ -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] = {
|
||||
|
@ -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. */
|
||||
|
@ -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
|
||||
~~~~~~~
|
||||
|
||||
|
@ -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
|
||||
^^^^^^^^^^^^
|
||||
|
||||
|
@ -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. */
|
||||
|
@ -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.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user