Add the deletion reason to rt6_fill_node() so that it can report it to
user space. All callers pass RTA_DEL_REASON_UNSPEC for now.

Signed-off-by: Yuyang Huang <[email protected]>
---
 net/ipv6/route.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index d2b9f9a899cf..b30becf3f56b 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -111,7 +111,7 @@ static int rt6_fill_node(struct net *net, struct sk_buff 
*skb,
                         struct fib6_info *rt, struct dst_entry *dst,
                         struct in6_addr *dest, struct in6_addr *src,
                         int iif, int type, u32 portid, u32 seq,
-                        unsigned int flags);
+                        unsigned int flags, enum rta_del_reason del_reason);
 static struct rt6_info *rt6_find_cached_rt(const struct fib6_result *res,
                                           const struct in6_addr *daddr,
                                           const struct in6_addr *saddr);
@@ -4035,7 +4035,8 @@ static int __ip6_del_rt_siblings(struct fib6_info *rt, 
struct fib6_config *cfg)
 
                        if (rt6_fill_node(net, skb, rt, NULL,
                                          NULL, NULL, 0, RTM_DELROUTE,
-                                         info->portid, seq, 0) < 0) {
+                                         info->portid, seq, 0,
+                                         RTA_DEL_REASON_UNSPEC) < 0) {
                                kfree_skb(skb);
                                skb = NULL;
                        } else
@@ -5784,7 +5785,7 @@ static int rt6_fill_node(struct net *net, struct sk_buff 
*skb,
                         struct fib6_info *rt, struct dst_entry *dst,
                         struct in6_addr *dest, struct in6_addr *src,
                         int iif, int type, u32 portid, u32 seq,
-                        unsigned int flags)
+                        unsigned int flags, enum rta_del_reason del_reason)
 {
        struct rt6_info *rt6 = dst_rt6_info(dst);
        struct rt6key *rt6_dst, *rt6_src;
@@ -6064,7 +6065,8 @@ static int rt6_nh_dump_exceptions(struct fib6_nh *nh, 
void *arg)
                                            &rt6_ex->rt6i->dst, NULL, NULL, 0,
                                            RTM_NEWROUTE,
                                            NETLINK_CB(dump->cb->skb).portid,
-                                           dump->cb->nlh->nlmsg_seq, w->flags);
+                                           dump->cb->nlh->nlmsg_seq, w->flags,
+                                           RTA_DEL_REASON_UNSPEC);
                        if (err)
                                return err;
 
@@ -6112,7 +6114,8 @@ int rt6_dump_route(struct fib6_info *rt, void *p_arg, 
unsigned int skip)
                        if (rt6_fill_node(net, arg->skb, rt, NULL, NULL, NULL,
                                          0, RTM_NEWROUTE,
                                          NETLINK_CB(arg->cb->skb).portid,
-                                         arg->cb->nlh->nlmsg_seq, flags)) {
+                                         arg->cb->nlh->nlmsg_seq, flags,
+                                         RTA_DEL_REASON_UNSPEC)) {
                                return 0;
                        }
                        count++;
@@ -6345,12 +6348,14 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, 
struct nlmsghdr *nlh,
                        err = rt6_fill_node(net, skb, from, NULL, NULL, NULL,
                                            iif, RTM_NEWROUTE,
                                            NETLINK_CB(in_skb).portid,
-                                           nlh->nlmsg_seq, 0);
+                                           nlh->nlmsg_seq, 0,
+                                           RTA_DEL_REASON_UNSPEC);
                else
                        err = rt6_fill_node(net, skb, from, dst, &fl6.daddr,
                                            &fl6.saddr, iif, RTM_NEWROUTE,
                                            NETLINK_CB(in_skb).portid,
-                                           nlh->nlmsg_seq, 0);
+                                           nlh->nlmsg_seq, 0,
+                                           RTA_DEL_REASON_UNSPEC);
        } else {
                err = -ENETUNREACH;
        }
@@ -6386,7 +6391,8 @@ void inet6_rt_notify(int event, struct fib6_info *rt, 
struct nl_info *info,
                goto errout;
 
        err = rt6_fill_node(net, skb, rt, NULL, NULL, NULL, 0,
-                           event, info->portid, seq, nlm_flags);
+                           event, info->portid, seq, nlm_flags,
+                           RTA_DEL_REASON_UNSPEC);
        if (err < 0) {
                kfree_skb(skb);
                /* -EMSGSIZE implies needed space grew under us. */
@@ -6419,7 +6425,8 @@ void fib6_rt_update(struct net *net, struct fib6_info *rt,
                goto errout;
 
        err = rt6_fill_node(net, skb, rt, NULL, NULL, NULL, 0,
-                           RTM_NEWROUTE, info->portid, seq, NLM_F_REPLACE);
+                           RTM_NEWROUTE, info->portid, seq, NLM_F_REPLACE,
+                           RTA_DEL_REASON_UNSPEC);
        if (err < 0) {
                /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
                WARN_ON(err == -EMSGSIZE);
@@ -6472,7 +6479,7 @@ void fib6_info_hw_flags_set(struct net *net, struct 
fib6_info *f6i,
        }
 
        err = rt6_fill_node(net, skb, f6i, NULL, NULL, NULL, 0, RTM_NEWROUTE, 0,
-                           0, 0);
+                           0, 0, RTA_DEL_REASON_UNSPEC);
        if (err < 0) {
                /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
                WARN_ON(err == -EMSGSIZE);
-- 
2.43.0


Reply via email to