mlxsw: reg: Add support for rtdp_ipip6_pack()
authorAmit Cohen <amcohen@nvidia.com>
Thu, 23 Sep 2021 12:36:53 +0000 (15:36 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Sep 2021 09:26:51 +0000 (10:26 +0100)
The RTDP register is used for configuring the tunnel decapsulation
properties of NVE and IP-in-IP.

Linux tunnels verify packets before decapsulation based on the packet's
source IP, which must match tunnel remote IP.
RTDP is used to configure decapsulation so that it filters out packets that
are not IPv6 or have the wrong source IP or wrong GRE key.

For IP-in-IP entry, source IPv4 is saved as part of this register and
source IPv6 is saved by RIPS register and RTDP saves pointer to it.

Create common function for configuring both IPv4 and IPv6 and add
dedicated functions for each protocol.

Signed-off-by: Amit Cohen <amcohen@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/reg.h

index 22f5c26..f9f614e 100644 (file)
@@ -8187,19 +8187,40 @@ static inline void mlxsw_reg_rtdp_pack(char *payload,
 }
 
 static inline void
-mlxsw_reg_rtdp_ipip4_pack(char *payload, u16 irif,
-                         enum mlxsw_reg_rtdp_ipip_sip_check sip_check,
-                         unsigned int type_check, bool gre_key_check,
-                         u32 ipv4_usip, u32 expected_gre_key)
+mlxsw_reg_rtdp_ipip_pack(char *payload, u16 irif,
+                        enum mlxsw_reg_rtdp_ipip_sip_check sip_check,
+                        unsigned int type_check, bool gre_key_check,
+                        u32 expected_gre_key)
 {
        mlxsw_reg_rtdp_ipip_irif_set(payload, irif);
        mlxsw_reg_rtdp_ipip_sip_check_set(payload, sip_check);
        mlxsw_reg_rtdp_ipip_type_check_set(payload, type_check);
        mlxsw_reg_rtdp_ipip_gre_key_check_set(payload, gre_key_check);
-       mlxsw_reg_rtdp_ipip_ipv4_usip_set(payload, ipv4_usip);
        mlxsw_reg_rtdp_ipip_expected_gre_key_set(payload, expected_gre_key);
 }
 
+static inline void
+mlxsw_reg_rtdp_ipip4_pack(char *payload, u16 irif,
+                         enum mlxsw_reg_rtdp_ipip_sip_check sip_check,
+                         unsigned int type_check, bool gre_key_check,
+                         u32 ipv4_usip, u32 expected_gre_key)
+{
+       mlxsw_reg_rtdp_ipip_pack(payload, irif, sip_check, type_check,
+                                gre_key_check, expected_gre_key);
+       mlxsw_reg_rtdp_ipip_ipv4_usip_set(payload, ipv4_usip);
+}
+
+static inline void
+mlxsw_reg_rtdp_ipip6_pack(char *payload, u16 irif,
+                         enum mlxsw_reg_rtdp_ipip_sip_check sip_check,
+                         unsigned int type_check, bool gre_key_check,
+                         u32 ipv6_usip_ptr, u32 expected_gre_key)
+{
+       mlxsw_reg_rtdp_ipip_pack(payload, irif, sip_check, type_check,
+                                gre_key_check, expected_gre_key);
+       mlxsw_reg_rtdp_ipip_ipv6_usip_ptr_set(payload, ipv6_usip_ptr);
+}
+
 /* RIPS - Router IP version Six Register
  * -------------------------------------
  * The RIPS register is used to store IPv6 addresses for use by the NVE and