fri.type = fib4_entry->type;
        fri.offload = should_offload;
        fri.trap = !should_offload;
+       fri.offload_failed = false;
        fib_alias_hw_flags_set(mlxsw_sp_net(mlxsw_sp), &fri);
 }
 
        fri.type = fib4_entry->type;
        fri.offload = false;
        fri.trap = false;
+       fri.offload_failed = false;
        fib_alias_hw_flags_set(mlxsw_sp_net(mlxsw_sp), &fri);
 }
 
 
        fri.type = fib4_rt->type;
        fri.offload = false;
        fri.trap = trap;
+       fri.offload_failed = false;
        fib_alias_hw_flags_set(net, &fri);
 }
 
 
        u8                      type;
        u8                      offload:1,
                                trap:1,
-                               unused:6;
+                               offload_failed:1,
+                               unused:5;
 };
 
 struct fib_entry_notifier_info {
 
        s16                     fa_default;
        u8                      offload:1,
                                trap:1,
-                               unused:6;
+                               offload_failed:1,
+                               unused:5;
        struct rcu_head         rcu;
 };
 
 
        fri.type = fa->fa_type;
        fri.offload = fa->offload;
        fri.trap = fa->trap;
+       fri.offload_failed = fa->offload_failed;
        err = fib_dump_info(skb, info->portid, seq, event, &fri, nlm_flags);
        if (err < 0) {
                /* -EMSGSIZE implies BUG in fib_nlmsg_size() */
                rtm->rtm_flags |= RTM_F_OFFLOAD;
        if (fri->trap)
                rtm->rtm_flags |= RTM_F_TRAP;
+       if (fri->offload_failed)
+               rtm->rtm_flags |= RTM_F_OFFLOAD_FAILED;
 
        nlmsg_end(skb, nlh);
        return 0;
 
        if (!fa_match)
                goto out;
 
-       if (fa_match->offload == fri->offload && fa_match->trap == fri->trap)
+       if (fa_match->offload == fri->offload && fa_match->trap == fri->trap &&
+           fa_match->offload_failed == fri->offload_failed)
                goto out;
 
        fa_match->offload = fri->offload;
        fa_match->trap = fri->trap;
+       fa_match->offload_failed = fri->offload_failed;
 
        if (!net->ipv4.sysctl_fib_notify_on_flag_change)
                goto out;
                        new_fa->fa_default = -1;
                        new_fa->offload = 0;
                        new_fa->trap = 0;
+                       new_fa->offload_failed = 0;
 
                        hlist_replace_rcu(&fa->fa_list, &new_fa->fa_list);
 
        new_fa->fa_default = -1;
        new_fa->offload = 0;
        new_fa->trap = 0;
+       new_fa->offload_failed = 0;
 
        /* Insert new entry to the list. */
        err = fib_insert_alias(t, tp, l, new_fa, fa, key);
                                fri.type = fa->fa_type;
                                fri.offload = fa->offload;
                                fri.trap = fa->trap;
+                               fri.offload_failed = fa->offload_failed;
                                err = fib_dump_info(skb,
                                                    NETLINK_CB(cb->skb).portid,
                                                    cb->nlh->nlmsg_seq,
 
                fri.type = rt->rt_type;
                fri.offload = 0;
                fri.trap = 0;
+               fri.offload_failed = 0;
                if (res.fa_head) {
                        struct fib_alias *fa;