*/
        *route_dev = dev;
        if (!netdev_port_same_parent_id(priv->netdev, real_dev) ||
-           dst_is_lag_dev || is_vlan_dev(*route_dev))
+           dst_is_lag_dev || is_vlan_dev(*route_dev) ||
+           netif_is_ovs_master(*route_dev))
                *out_dev = uplink_dev;
        else if (mlx5e_eswitch_rep(dev) &&
                 mlx5e_is_valid_eswitch_fwd_dev(priv, dev))
 
        MLX5E_ROUTE_ENTRY_VALID     = BIT(0),
 };
 
+static int mlx5e_set_int_port_tunnel(struct mlx5e_priv *priv,
+                                    struct mlx5_flow_attr *attr,
+                                    struct mlx5e_encap_entry *e,
+                                    int out_index)
+{
+       struct net_device *route_dev;
+       int err = 0;
+
+       route_dev = dev_get_by_index(dev_net(e->out_dev), e->route_dev_ifindex);
+
+       if (!route_dev || !netif_is_ovs_master(route_dev))
+               goto out;
+
+       err = mlx5e_set_fwd_to_int_port_actions(priv, attr, e->route_dev_ifindex,
+                                               MLX5E_TC_INT_PORT_EGRESS,
+                                               &attr->action, out_index);
+
+out:
+       if (route_dev)
+               dev_put(route_dev);
+
+       return err;
+}
+
 struct mlx5e_route_key {
        int ip_version;
        union {
        if (err)
                goto out_err;
 
+       err = mlx5e_set_int_port_tunnel(priv, attr, e, out_index);
+       if (err == -EOPNOTSUPP) {
+               /* If device doesn't support int port offload,
+                * redirect to uplink vport.
+                */
+               mlx5_core_dbg(priv->mdev, "attaching int port as encap dev not supported, using uplink\n");
+               err = 0;
+       } else if (err) {
+               goto out_err;
+       }
+
        flow->encaps[out_index].e = e;
        list_add(&flow->encaps[out_index].list, &e->flows);
        flow->encaps[out_index].index = out_index;
 
                        goto err_out;
 
                if (esw_attr->dests[out_index].flags &
-                   MLX5_ESW_DEST_CHAIN_WITH_SRC_PORT_CHANGE)
+                   MLX5_ESW_DEST_CHAIN_WITH_SRC_PORT_CHANGE &&
+                   !esw_attr->dest_int_port)
                        vf_tun = true;
                out_priv = netdev_priv(encap_dev);
                rpriv = out_priv->ppriv;
 
        for (out_index = 0; out_index < MLX5_MAX_FLOW_FWD_VPORTS; out_index++) {
                if (esw_attr->dests[out_index].flags &
-                   MLX5_ESW_DEST_CHAIN_WITH_SRC_PORT_CHANGE)
+                   MLX5_ESW_DEST_CHAIN_WITH_SRC_PORT_CHANGE &&
+                   !esw_attr->dest_int_port)
                        vf_tun = true;
                if (esw_attr->dests[out_index].flags & MLX5_ESW_DEST_ENCAP) {
                        mlx5e_detach_encap(priv, flow, out_index);