From: Jianbo Liu <jian...@mellanox.com>

Currently the driver restores only IPv4 tunnel headers.
Add support for restoring IPv6 tunnel header.

Fixes: b8ce90370977 ("net/mlx5e: Restore tunnel metadata on miss")
Signed-off-by: Jianbo Liu <jian...@mellanox.com>
Reviewed-by: Roi Dayan <r...@mellanox.com>
Reviewed-by: Oz Shlomo <o...@mellanox.com>
Signed-off-by: Saeed Mahameed <sae...@mellanox.com>
---
 .../ethernet/mellanox/mlx5/core/en/rep/tc.c   | 30 +++++++++++++------
 1 file changed, 21 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c
index eefeb1cdc2ee5..245a99f69641d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c
@@ -551,19 +551,31 @@ static bool mlx5e_restore_tunnel(struct mlx5e_priv *priv, 
struct sk_buff *skb,
                }
        }
 
-       tun_dst = tun_rx_dst(enc_opts.key.len);
+       if (key.enc_control.addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) {
+               tun_dst = __ip_tun_set_dst(key.enc_ipv4.src, key.enc_ipv4.dst,
+                                          key.enc_ip.tos, key.enc_ip.ttl,
+                                          key.enc_tp.dst, TUNNEL_KEY,
+                                          
key32_to_tunnel_id(key.enc_key_id.keyid),
+                                          enc_opts.key.len);
+       } else if (key.enc_control.addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) {
+               tun_dst = __ipv6_tun_set_dst(&key.enc_ipv6.src, 
&key.enc_ipv6.dst,
+                                            key.enc_ip.tos, key.enc_ip.ttl,
+                                            key.enc_tp.dst, 0, TUNNEL_KEY,
+                                            
key32_to_tunnel_id(key.enc_key_id.keyid),
+                                            enc_opts.key.len);
+       } else {
+               netdev_dbg(priv->netdev,
+                          "Couldn't restore tunnel, unsupported addr_type: 
%d\n",
+                          key.enc_control.addr_type);
+               return false;
+       }
+
        if (!tun_dst) {
-               WARN_ON_ONCE(true);
+               netdev_dbg(priv->netdev, "Couldn't restore tunnel, no 
tun_dst\n");
                return false;
        }
 
-       ip_tunnel_key_init(&tun_dst->u.tun_info.key,
-                          key.enc_ipv4.src, key.enc_ipv4.dst,
-                          key.enc_ip.tos, key.enc_ip.ttl,
-                          0, /* label */
-                          key.enc_tp.src, key.enc_tp.dst,
-                          key32_to_tunnel_id(key.enc_key_id.keyid),
-                          TUNNEL_KEY);
+       tun_dst->u.tun_info.key.tp_src = key.enc_tp.src;
 
        if (enc_opts.key.len)
                ip_tunnel_info_opts_set(&tun_dst->u.tun_info,
-- 
2.26.2

Reply via email to