ipv6: Add IPv6 multipath notifications for add / replace
authorIdo Schimmel <idosch@mellanox.com>
Tue, 18 Jun 2019 15:12:48 +0000 (18:12 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 18 Jun 2019 16:45:36 +0000 (09:45 -0700)
Emit a notification when a multipath routes is added or replace.

Note that unlike the replace notifications sent from fib6_add_rt2node(),
it is possible we are sending a 'FIB_EVENT_ENTRY_REPLACE' when a route
was merely added and not replaced.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/route.c

index f7257a56072a6bf39de06932f310e9d5029e9166..da504d36ce54d5bbc6a90d58aef8cac662f07214 100644 (file)
@@ -4965,6 +4965,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
 {
        struct fib6_info *rt_notif = NULL, *rt_last = NULL;
        struct nl_info *info = &cfg->fc_nlinfo;
+       enum fib_event_type event_type;
        struct fib6_config r_cfg;
        struct rtnexthop *rtnh;
        struct fib6_info *rt;
@@ -5042,6 +5043,11 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
         */
        info->skip_notify = 1;
 
+       /* For add and replace, send one notification with all nexthops. For
+        * append, send one notification with all appended nexthops.
+        */
+       info->skip_notify_kernel = 1;
+
        err_nh = NULL;
        list_for_each_entry(nh, &rt6_nh_list, next) {
                err = __ip6_ins_rt(nh->fib6_info, info, extack);
@@ -5078,6 +5084,15 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
                nhn++;
        }
 
+       event_type = replace ? FIB_EVENT_ENTRY_REPLACE : FIB_EVENT_ENTRY_ADD;
+       err = call_fib6_multipath_entry_notifiers(info->nl_net, event_type,
+                                                 rt_notif, nhn - 1, extack);
+       if (err) {
+               /* Delete all the siblings that were just added */
+               err_nh = NULL;
+               goto add_errout;
+       }
+
        /* success ... tell user about new route */
        ip6_route_mpath_notify(rt_notif, rt_last, info, nlflags);
        goto cleanup;