sfc: introduce pedit add actions on the ipv4 ttl field
authorPieter Jansen van Vuuren <pieter.jansen-van-vuuren@amd.com>
Thu, 24 Aug 2023 11:28:41 +0000 (12:28 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 27 Aug 2023 05:56:54 +0000 (06:56 +0100)
Introduce pedit add actions and use it to achieve decrement ttl offload.
Decrement ttl can be achieved by adding 0xff to the ttl field.

Co-developed-by: Edward Cree <ecree.xilinx@gmail.com>
Signed-off-by: Edward Cree <ecree.xilinx@gmail.com>
Signed-off-by: Pieter Jansen van Vuuren <pieter.jansen-van-vuuren@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/sfc/tc.c

index 354c635..dfe3a8b 100644 (file)
@@ -1054,6 +1054,47 @@ static int efx_tc_complete_mac_mangle(struct efx_nic *efx,
        return 0;
 }
 
+static int efx_tc_pedit_add(struct efx_nic *efx, struct efx_tc_action_set *act,
+                           const struct flow_action_entry *fa,
+                           struct netlink_ext_ack *extack)
+{
+       switch (fa->mangle.htype) {
+       case FLOW_ACT_MANGLE_HDR_TYPE_IP4:
+               switch (fa->mangle.offset) {
+               case offsetof(struct iphdr, ttl):
+                       /* check that pedit applies to ttl only */
+                       if (fa->mangle.mask != ~EFX_TC_HDR_TYPE_TTL_MASK)
+                               break;
+
+                       /* Adding 0xff is equivalent to decrementing the ttl.
+                        * Other added values are not supported.
+                        */
+                       if ((fa->mangle.val & EFX_TC_HDR_TYPE_TTL_MASK) != U8_MAX)
+                               break;
+
+                       /* check that we do not decrement ttl twice */
+                       if (!efx_tc_flower_action_order_ok(act,
+                                                          EFX_TC_AO_DEC_TTL)) {
+                               NL_SET_ERR_MSG_MOD(extack, "Unsupported: multiple dec ttl");
+                               return -EOPNOTSUPP;
+                       }
+                       act->do_ttl_dec = 1;
+                       return 0;
+               default:
+                       break;
+               }
+               break;
+       default:
+               break;
+       }
+
+       NL_SET_ERR_MSG_FMT_MOD(extack,
+                              "Unsupported: ttl add action type %x %x %x/%x",
+                              fa->mangle.htype, fa->mangle.offset,
+                              fa->mangle.val, fa->mangle.mask);
+       return -EOPNOTSUPP;
+}
+
 /**
  * efx_tc_mangle() - handle a single 32-bit (or less) pedit
  * @efx:       NIC we're installing a flow rule on
@@ -2014,6 +2055,11 @@ static int efx_tc_flower_replace(struct efx_nic *efx,
                        act->vlan_proto[act->vlan_push] = fa->vlan.proto;
                        act->vlan_push++;
                        break;
+               case FLOW_ACTION_ADD:
+                       rc = efx_tc_pedit_add(efx, act, fa, extack);
+                       if (rc < 0)
+                               goto release;
+                       break;
                case FLOW_ACTION_MANGLE:
                        rc = efx_tc_mangle(efx, act, fa, &mung, extack, &match);
                        if (rc < 0)