struct mlx5e_tc_flow_parse_attr *parse_attr;
        struct mlx5_flow_attr *attr = flow->attr;
        struct mlx5_esw_flow_attr *esw_attr;
+       struct net_device *filter_dev;
        int err;
 
        err = flow_action_supported(flow_action, extack);
 
        esw_attr = attr->esw_attr;
        parse_attr = attr->parse_attr;
+       filter_dev = parse_attr->filter_dev;
        parse_state = &parse_attr->parse_state;
        mlx5e_tc_act_init_parse_state(parse_state, flow, flow_action, extack);
        parse_state->ct_priv = get_ct_priv(priv);
                return err;
 
        /* Forward to/from internal port can only have 1 dest */
-       if ((netif_is_ovs_master(parse_attr->filter_dev) || esw_attr->dest_int_port) &&
+       if ((netif_is_ovs_master(filter_dev) || esw_attr->dest_int_port) &&
            esw_attr->out_count > 1) {
                NL_SET_ERR_MSG_MOD(extack,
                                   "Rules with internal port can have only one destination");
                return -EOPNOTSUPP;
        }
 
+       /* Forward from tunnel/internal port to internal port is not supported */
+       if ((mlx5e_get_tc_tun(filter_dev) || netif_is_ovs_master(filter_dev)) &&
+           esw_attr->dest_int_port) {
+               NL_SET_ERR_MSG_MOD(extack,
+                                  "Forwarding from tunnel/internal port to internal port is not supported");
+               return -EOPNOTSUPP;
+       }
+
        err = actions_prepare_mod_hdr_actions(priv, flow, attr, extack);
        if (err)
                return err;