net: Add extack to fib_notifier_info
authorDavid Ahern <dsahern@gmail.com>
Sat, 28 Oct 2017 00:37:13 +0000 (17:37 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 1 Nov 2017 02:50:43 +0000 (11:50 +0900)
Add extack to fib_notifier_info and plumb through stack to
call_fib_rule_notifiers, call_fib_entry_notifiers and
call_fib6_entry_notifiers. This allows notifer handlers to
return messages to user.

Signed-off-by: David Ahern <dsahern@gmail.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/fib_notifier.h
net/core/fib_rules.c
net/ipv4/fib_trie.c
net/ipv6/ip6_fib.c

index 54cd6b839d2f6659f2208e20608d577c6aee4061..c91ec732afd6230a647e461f3d3fe0b336b92235 100644 (file)
@@ -9,6 +9,7 @@
 struct fib_notifier_info {
        struct net *net;
        int family;
+       struct netlink_ext_ack  *extack;
 };
 
 enum fib_event_type {
index 9a6d97c1d8104eac629273337ca8999a86118533..fafd0a41e3f79b9ee19da5bd008d0732b51771bc 100644 (file)
@@ -314,10 +314,12 @@ static int call_fib_rule_notifier(struct notifier_block *nb, struct net *net,
 static int call_fib_rule_notifiers(struct net *net,
                                   enum fib_event_type event_type,
                                   struct fib_rule *rule,
-                                  struct fib_rules_ops *ops)
+                                  struct fib_rules_ops *ops,
+                                  struct netlink_ext_ack *extack)
 {
        struct fib_rule_notifier_info info = {
                .info.family = ops->family,
+               .info.extack = extack,
                .rule = rule,
        };
 
@@ -609,7 +611,7 @@ int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (rule->tun_id)
                ip_tunnel_need_metadata();
 
-       call_fib_rule_notifiers(net, FIB_EVENT_RULE_ADD, rule, ops);
+       call_fib_rule_notifiers(net, FIB_EVENT_RULE_ADD, rule, ops, extack);
        notify_rule_change(RTM_NEWRULE, rule, ops, nlh, NETLINK_CB(skb).portid);
        flush_route_cache(ops);
        rules_ops_put(ops);
@@ -749,7 +751,8 @@ int fib_nl_delrule(struct sk_buff *skb, struct nlmsghdr *nlh,
                        }
                }
 
-               call_fib_rule_notifiers(net, FIB_EVENT_RULE_DEL, rule, ops);
+               call_fib_rule_notifiers(net, FIB_EVENT_RULE_DEL, rule, ops,
+                                       NULL);
                notify_rule_change(RTM_DELRULE, rule, ops, nlh,
                                   NETLINK_CB(skb).portid);
                fib_rule_put(rule);
index aaa1ba09afaac5d7540b06c0ece39f18d30dddff..5ddc4aefff12f7cf5ad0228b97a95abf74a0b30e 100644 (file)
@@ -102,9 +102,11 @@ static int call_fib_entry_notifier(struct notifier_block *nb, struct net *net,
 
 static int call_fib_entry_notifiers(struct net *net,
                                    enum fib_event_type event_type, u32 dst,
-                                   int dst_len, struct fib_alias *fa)
+                                   int dst_len, struct fib_alias *fa,
+                                   struct netlink_ext_ack *extack)
 {
        struct fib_entry_notifier_info info = {
+               .info.extack = extack,
                .dst = dst,
                .dst_len = dst_len,
                .fi = fa->fa_info,
@@ -1214,7 +1216,7 @@ int fib_table_insert(struct net *net, struct fib_table *tb,
                        new_fa->fa_default = -1;
 
                        call_fib_entry_notifiers(net, FIB_EVENT_ENTRY_REPLACE,
-                                                key, plen, new_fa);
+                                                key, plen, new_fa, extack);
                        rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen,
                                  tb->tb_id, &cfg->fc_nlinfo, nlflags);
 
@@ -1269,7 +1271,7 @@ int fib_table_insert(struct net *net, struct fib_table *tb,
                tb->tb_num_default++;
 
        rt_cache_flush(cfg->fc_nlinfo.nl_net);
-       call_fib_entry_notifiers(net, event, key, plen, new_fa);
+       call_fib_entry_notifiers(net, event, key, plen, new_fa, extack);
        rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, new_fa->tb_id,
                  &cfg->fc_nlinfo, nlflags);
 succeeded:
@@ -1569,7 +1571,7 @@ int fib_table_delete(struct net *net, struct fib_table *tb,
                return -ESRCH;
 
        call_fib_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, key, plen,
-                                fa_to_delete);
+                                fa_to_delete, extack);
        rtmsg_fib(RTM_DELROUTE, htonl(key), fa_to_delete, plen, tb->tb_id,
                  &cfg->fc_nlinfo, 0);
 
@@ -1886,7 +1888,8 @@ int fib_table_flush(struct net *net, struct fib_table *tb)
 
                        call_fib_entry_notifiers(net, FIB_EVENT_ENTRY_DEL,
                                                 n->key,
-                                                KEYLENGTH - fa->fa_slen, fa);
+                                                KEYLENGTH - fa->fa_slen, fa,
+                                                NULL);
                        hlist_del_rcu(&fa->fa_list);
                        fib_release_info(fa->fa_info);
                        alias_free_mem_rcu(fa);
index 1ada9672d1986a704588a4884b953907368539eb..2e2804f5823e4ee0baeb42e0d7fdfce310397950 100644 (file)
@@ -353,9 +353,11 @@ static int call_fib6_entry_notifier(struct notifier_block *nb, struct net *net,
 
 static int call_fib6_entry_notifiers(struct net *net,
                                     enum fib_event_type event_type,
-                                    struct rt6_info *rt)
+                                    struct rt6_info *rt,
+                                    struct netlink_ext_ack *extack)
 {
        struct fib6_entry_notifier_info info = {
+               .info.extack = extack,
                .rt = rt,
        };
 
@@ -868,7 +870,8 @@ static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn,
  */
 
 static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
-                           struct nl_info *info, struct mx6_config *mxc)
+                           struct nl_info *info, struct mx6_config *mxc,
+                           struct netlink_ext_ack *extack)
 {
        struct rt6_info *leaf = rcu_dereference_protected(fn->leaf,
                                    lockdep_is_held(&rt->rt6i_table->tb6_lock));
@@ -1011,7 +1014,7 @@ add:
                rcu_assign_pointer(rt->rt6i_node, fn);
                rcu_assign_pointer(*ins, rt);
                call_fib6_entry_notifiers(info->nl_net, FIB_EVENT_ENTRY_ADD,
-                                         rt);
+                                         rt, extack);
                if (!info->skip_notify)
                        inet6_rt_notify(RTM_NEWROUTE, rt, info, nlflags);
                info->nl_net->ipv6.rt6_stats->fib_rt_entries++;
@@ -1040,7 +1043,7 @@ add:
                rt->dst.rt6_next = iter->dst.rt6_next;
                rcu_assign_pointer(*ins, rt);
                call_fib6_entry_notifiers(info->nl_net, FIB_EVENT_ENTRY_REPLACE,
-                                         rt);
+                                         rt, extack);
                if (!info->skip_notify)
                        inet6_rt_notify(RTM_NEWROUTE, rt, info, NLM_F_REPLACE);
                if (!(fn->fn_flags & RTN_RTINFO)) {
@@ -1225,7 +1228,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt,
        }
 #endif
 
-       err = fib6_add_rt2node(fn, rt, info, mxc);
+       err = fib6_add_rt2node(fn, rt, info, mxc, extack);
        if (!err) {
                fib6_update_sernum_upto_root(rt, sernum);
                fib6_start_gc(info->nl_net, rt);
@@ -1686,7 +1689,7 @@ static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn,
 
        fib6_purge_rt(rt, fn, net);
 
-       call_fib6_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, rt);
+       call_fib6_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, rt, NULL);
        if (!info->skip_notify)
                inet6_rt_notify(RTM_DELROUTE, rt, info, 0);
        rt6_release(rt);