return f;
 }
 
+static struct tcf_exts *fl_get_exts(const struct tcf_proto *tp, u32 handle)
+{
+       struct cls_fl_head *head = rcu_dereference_bh(tp->root);
+       struct cls_fl_filter *f;
+
+       f = idr_find(&head->handle_idr, handle);
+       return f ? &f->exts : NULL;
+}
+
 static int __fl_delete(struct tcf_proto *tp, struct cls_fl_filter *f,
                       bool *last, bool rtnl_held,
                       struct netlink_ext_ack *extack)
        }
        fnew->handle = handle;
 
-       err = tcf_exts_init(&fnew->exts, net, TCA_FLOWER_ACT, 0);
+       err = tcf_exts_init_ex(&fnew->exts, net, TCA_FLOWER_ACT, 0, tp, handle,
+                              !tc_skip_hw(fnew->flags));
        if (err < 0)
                goto errout_idr;
 
        .tmplt_create   = fl_tmplt_create,
        .tmplt_destroy  = fl_tmplt_destroy,
        .tmplt_dump     = fl_tmplt_dump,
+       .get_exts       = fl_get_exts,
        .owner          = THIS_MODULE,
        .flags          = TCF_PROTO_OPS_DOIT_UNLOCKED,
 };