ethdev: add packet integrity check flow rules
authorOri Kam <orika@nvidia.com>
Mon, 19 Apr 2021 12:44:30 +0000 (15:44 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 19 Apr 2021 17:05:17 +0000 (19:05 +0200)
Currently, DPDK application can offload the checksum check,
and report it in the mbuf.

However, as more and more applications are offloading some or all
logic and action to the HW, there is a need to check the packet
integrity so the right decision can be taken.

The application logic can be positive meaning if the packet is
valid jump / do  actions, or negative if packet is not valid
jump to SW / do actions (like drop) and add default flow
(match all in low priority) that will direct the miss packet
to the miss path.

Since currently rte_flow works in positive way the assumption is
that the positive way will be the common way in this case also.

When thinking what is the best API to implement such feature,
we need to consider the following (in no specific order):
1. API breakage.
2. Simplicity.
3. Performance.
4. HW capabilities.
5. rte_flow limitation.
6. Flexibility.

First option: Add integrity flags to each of the items.
For example add checksum_ok to IPv4 item.

Pros:
1. No new rte_flow item.
2. Simple in the way that on each item the app can see
what checks are available.

Cons:
1. API breakage.
2. Increase number of flows, since app can't add global rule and must
   have dedicated flow for each of the flow combinations, for example
   matching on ICMP traffic or UDP/TCP  traffic with IPv4 / IPv6 will
   result in 5 flows.

Second option: dedicated item

Pros:
1. No API breakage, and there will be no for some time due to having
   extra space. (by using bits)
2. Just one flow to support the ICMP or UDP/TCP traffic with IPv4 /
   IPv6.
3. Simplicity application can just look at one place to see all possible
   checks.
4. Allow future support for more tests.

Cons:
1. New item, that holds number of fields from different items.

For starter the following bits are suggested:
1. packet_ok - means that all HW checks depending on packet layer have
   passed. This may mean that in some HW such flow should be split to
   number of flows or fail.
2. l2_ok - all check for layer 2 have passed.
3. l3_ok - all check for layer 3 have passed. If packet doesn't have
   L3 layer this check should fail.
4. l4_ok - all check for layer 4 have passed. If packet doesn't
   have L4 layer this check should fail.
5. l2_crc_ok - the layer 2 CRC is O.K.
6. ipv4_csum_ok - IPv4 checksum is O.K. It is possible that the
   IPv4 checksum will be O.K. but the l3_ok will be 0. It is not
   possible that checksum will be 0 and the l3_ok will be 1.
7. l4_csum_ok - layer 4 checksum is O.K.
8. l3_len_OK - check that the reported layer 3 length is smaller than the
   frame length.

Example of usage:
1. Check packets from all possible layers for integrity.
   flow create integrity spec packet_ok = 1 mask packet_ok = 1 .....

2. Check only packet with layer 4 (UDP / TCP)
   flow create integrity spec l3_ok = 1, l4_ok = 1 mask l3_ok = 1
   l4_ok = 1

Signed-off-by: Ori Kam <orika@nvidia.com>
Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
doc/guides/prog_guide/rte_flow.rst
doc/guides/rel_notes/release_21_05.rst
lib/ethdev/rte_flow.h

index 4b54588..c564547 100644 (file)
@@ -1398,6 +1398,28 @@ Matches a eCPRI header.
 - ``hdr``: eCPRI header definition (``rte_ecpri.h``).
 - Default ``mask`` matches nothing, for all eCPRI messages.
 
+Item: ``PACKET_INTEGRITY_CHECKS``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Matches packet integrity.
+For some devices application needs to enable integration checks in HW
+before using this item.
+
+- ``level``: the encapsulation level that should be checked:
+   - ``level == 0`` means the default PMD mode (can be inner most / outermost).
+   - ``level == 1`` means outermost header.
+   - ``level > 1``  means inner header. See also RSS level.
+- ``packet_ok``: All HW packet integrity checks have passed based on the
+  topmost network layer. For example, for ICMP packet the topmost network
+  layer is L3 and for TCP or UDP packet the topmost network layer is L4.
+- ``l2_ok``: all layer 2 HW integrity checks passed.
+- ``l3_ok``: all layer 3 HW integrity checks passed.
+- ``l4_ok``: all layer 4 HW integrity checks passed.
+- ``l2_crc_ok``: layer 2 CRC check passed.
+- ``ipv4_csum_ok``: IPv4 checksum check passed.
+- ``l4_csum_ok``: layer 4 checksum check passed.
+- ``l3_len_ok``: the layer 3 length is smaller than the frame length.
+
 Actions
 ~~~~~~~
 
index 4e427a7..9f54ba4 100644 (file)
@@ -94,6 +94,11 @@ New Features
   to support metering traffic by packet per second (PPS),
   in addition to the initial bytes per second (BPS) mode (value 0).
 
+* **Added packet integrity match to flow rules.**
+
+  * Added ``RTE_FLOW_ITEM_TYPE_INTEGRITY`` flow item.
+  * Added ``rte_flow_item_integrity`` data structure.
+
 * **Updated Arkville PMD driver.**
 
   Updated Arkville net driver with new features and improvements, including:
index 0447d36..25e20f5 100644 (file)
@@ -551,6 +551,17 @@ enum rte_flow_item_type {
         * See struct rte_flow_item_geneve_opt
         */
        RTE_FLOW_ITEM_TYPE_GENEVE_OPT,
+
+       /**
+        * [META]
+        *
+        * Matches on packet integrity.
+        * For some devices application needs to enable integration checks in HW
+        * before using this item.
+        *
+        * @see struct rte_flow_item_integrity.
+        */
+       RTE_FLOW_ITEM_TYPE_INTEGRITY,
 };
 
 /**
@@ -1685,6 +1696,45 @@ rte_flow_item_geneve_opt_mask = {
 };
 #endif
 
+struct rte_flow_item_integrity {
+       /**< Tunnel encapsulation level the item should apply to.
+        * @see rte_flow_action_rss
+        */
+       uint32_t level;
+       RTE_STD_C11
+       union {
+               __extension__
+               struct {
+                       /**< The packet is valid after passing all HW checks. */
+                       uint64_t packet_ok:1;
+                       /**< L2 layer is valid after passing all HW checks. */
+                       uint64_t l2_ok:1;
+                       /**< L3 layer is valid after passing all HW checks. */
+                       uint64_t l3_ok:1;
+                       /**< L4 layer is valid after passing all HW checks. */
+                       uint64_t l4_ok:1;
+                       /**< L2 layer CRC is valid. */
+                       uint64_t l2_crc_ok:1;
+                       /**< IPv4 layer checksum is valid. */
+                       uint64_t ipv4_csum_ok:1;
+                       /**< L4 layer checksum is valid. */
+                       uint64_t l4_csum_ok:1;
+                       /**< The l3 length is smaller than the frame length. */
+                       uint64_t l3_len_ok:1;
+                       uint64_t reserved:56;
+               };
+               uint64_t value;
+       };
+};
+
+#ifndef __cplusplus
+static const struct rte_flow_item_integrity
+rte_flow_item_integrity_mask = {
+       .level = 0,
+       .value = 0,
+};
+#endif
+
 /**
  * Matching pattern item definition.
  *