net/mlx5e: CT: Support restore ipv6 tunnel
authorJianbo Liu <jianbol@mellanox.com>
Mon, 20 Jul 2020 01:36:45 +0000 (01:36 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 31 Jul 2020 01:53:47 +0000 (18:53 -0700)
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 <jianbol@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c

index eefeb1c..245a99f 100644 (file)
@@ -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,