#include "core_acl_flex_keys.h"
 
 static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp,
-                                        struct net_device *dev,
+                                        struct net_device *dev, bool ingress,
                                         struct mlxsw_sp_acl_rule_info *rulei,
                                         struct tcf_exts *exts)
 {
                        err = mlxsw_sp_acl_rulei_act_trap(rulei);
                        if (err)
                                return err;
+               } else if (is_tcf_gact_goto_chain(a)) {
+                       u32 chain_index = tcf_gact_goto_chain_index(a);
+                       struct mlxsw_sp_acl_ruleset *ruleset;
+                       u16 group_id;
+
+                       ruleset = mlxsw_sp_acl_ruleset_lookup(mlxsw_sp, dev,
+                                                             ingress,
+                                                             chain_index,
+                                                             MLXSW_SP_ACL_PROFILE_FLOWER);
+                       if (IS_ERR(ruleset))
+                               return PTR_ERR(ruleset);
+
+                       group_id = mlxsw_sp_acl_ruleset_group_id(ruleset);
+                       mlxsw_sp_acl_rulei_act_jump(rulei, group_id);
                } else if (is_tcf_mirred_egress_redirect(a)) {
                        int ifindex = tcf_mirred_ifindex(a);
                        struct net_device *out_dev;
 }
 
 static int mlxsw_sp_flower_parse(struct mlxsw_sp *mlxsw_sp,
-                                struct net_device *dev,
+                                struct net_device *dev, bool ingress,
                                 struct mlxsw_sp_acl_rule_info *rulei,
                                 struct tc_cls_flower_offload *f)
 {
        if (err)
                return err;
 
-       return mlxsw_sp_flower_parse_actions(mlxsw_sp, dev, rulei, f->exts);
+       return mlxsw_sp_flower_parse_actions(mlxsw_sp, dev, ingress,
+                                            rulei, f->exts);
 }
 
 int mlxsw_sp_flower_replace(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
        }
 
        rulei = mlxsw_sp_acl_rule_rulei(rule);
-       err = mlxsw_sp_flower_parse(mlxsw_sp, dev, rulei, f);
+       err = mlxsw_sp_flower_parse(mlxsw_sp, dev, ingress, rulei, f);
        if (err)
                goto err_flower_parse;