common);
        list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list)
                fib6_info_hw_flags_set(mlxsw_sp_net(mlxsw_sp), mlxsw_sp_rt6->rt,
-                                      should_offload, !should_offload);
+                                      should_offload, !should_offload, false);
 }
 #else
 static void
                                  common);
        list_for_each_entry(mlxsw_sp_rt6, &fib6_entry->rt6_list, list)
                fib6_info_hw_flags_set(mlxsw_sp_net(mlxsw_sp), mlxsw_sp_rt6->rt,
-                                      false, false);
+                                      false, false, false);
 }
 #else
 static void
 
        struct nsim_fib6_rt_nh *fib6_rt_nh;
 
        list_for_each_entry(fib6_rt_nh, &fib6_rt->nh_list, list)
-               fib6_info_hw_flags_set(net, fib6_rt_nh->rt, false, trap);
+               fib6_info_hw_flags_set(net, fib6_rt_nh->rt, false, trap, false);
 }
 #else
 static void nsim_fib6_rt_hw_flags_set(struct nsim_fib_data *data,
 
                                        fib6_destroying:1,
                                        offload:1,
                                        trap:1,
-                                       unused:2;
+                                       offload_failed:1,
+                                       unused:1;
 
        struct rcu_head                 rcu;
        struct nexthop                  *nh;
        return !!(f6i->fib6_metrics->metrics[RTAX_LOCK - 1] & (1 << metric));
 }
 void fib6_info_hw_flags_set(struct net *net, struct fib6_info *f6i,
-                           bool offload, bool trap);
+                           bool offload, bool trap, bool offload_failed);
 
 #if IS_BUILTIN(CONFIG_IPV6) && defined(CONFIG_BPF_SYSCALL)
 struct bpf_iter__ipv6_route {
 
                        rtm->rtm_flags |= RTM_F_OFFLOAD;
                if (rt->trap)
                        rtm->rtm_flags |= RTM_F_TRAP;
+               if (rt->offload_failed)
+                       rtm->rtm_flags |= RTM_F_OFFLOAD_FAILED;
        }
 
        if (rtnl_put_cacheinfo(skb, dst, 0, expires, dst ? dst->error : 0) < 0)
 }
 
 void fib6_info_hw_flags_set(struct net *net, struct fib6_info *f6i,
-                           bool offload, bool trap)
+                           bool offload, bool trap, bool offload_failed)
 {
        struct sk_buff *skb;
        int err;
 
-       if (f6i->offload == offload && f6i->trap == trap)
+       if (f6i->offload == offload && f6i->trap == trap &&
+           f6i->offload_failed == offload_failed)
                return;
 
        f6i->offload = offload;
        f6i->trap = trap;
+       f6i->offload_failed = offload_failed;
 
        if (!rcu_access_pointer(f6i->fib6_node))
                /* The route was removed from the tree, do not send