ipmr: Make MFC fib notifiers common
authorYuval Mintz <yuvalm@mellanox.com>
Mon, 26 Mar 2018 12:01:32 +0000 (15:01 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 26 Mar 2018 17:14:42 +0000 (13:14 -0400)
Like vif notifications, move the notifier struct for MFC as well as its
helpers into a common file; Currently they're only used by ipmr.

Signed-off-by: Yuval Mintz <yuvalm@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
include/linux/mroute.h
include/linux/mroute_base.h
net/ipv4/ipmr.c

index 921bd1075edfff74241785779b39e3e8ada7e9ae..8d067de924cff9790a1d0ffaacfc8bc74abf7cb5 100644 (file)
@@ -5391,7 +5391,9 @@ static int mlxsw_sp_router_fibmr_add(struct mlxsw_sp *mlxsw_sp,
        if (IS_ERR(vr))
                return PTR_ERR(vr);
 
-       return mlxsw_sp_mr_route4_add(vr->mr4_table, men_info->mfc, replace);
+       return mlxsw_sp_mr_route4_add(vr->mr4_table,
+                                     (struct mfc_cache *) men_info->mfc,
+                                     replace);
 }
 
 static void mlxsw_sp_router_fibmr_del(struct mlxsw_sp *mlxsw_sp,
@@ -5406,7 +5408,8 @@ static void mlxsw_sp_router_fibmr_del(struct mlxsw_sp *mlxsw_sp,
        if (WARN_ON(!vr))
                return;
 
-       mlxsw_sp_mr_route4_del(vr->mr4_table, men_info->mfc);
+       mlxsw_sp_mr_route4_del(vr->mr4_table,
+                              (struct mfc_cache *) men_info->mfc);
        mlxsw_sp_vr_put(mlxsw_sp, vr);
 }
 
@@ -5682,11 +5685,11 @@ static void mlxsw_sp_router_fibmr_event_work(struct work_struct *work)
                                                replace);
                if (err)
                        mlxsw_sp_router_fib_abort(mlxsw_sp);
-               ipmr_cache_put(fib_work->men_info.mfc);
+               ipmr_cache_put((struct mfc_cache *) fib_work->men_info.mfc);
                break;
        case FIB_EVENT_ENTRY_DEL:
                mlxsw_sp_router_fibmr_del(mlxsw_sp, &fib_work->men_info);
-               ipmr_cache_put(fib_work->men_info.mfc);
+               ipmr_cache_put((struct mfc_cache *) fib_work->men_info.mfc);
                break;
        case FIB_EVENT_VIF_ADD:
                err = mlxsw_sp_router_fibmr_vif_add(mlxsw_sp,
@@ -5766,7 +5769,7 @@ mlxsw_sp_router_fibmr_event(struct mlxsw_sp_fib_event_work *fib_work,
        case FIB_EVENT_ENTRY_ADD: /* fall through */
        case FIB_EVENT_ENTRY_DEL:
                memcpy(&fib_work->men_info, info, sizeof(fib_work->men_info));
-               ipmr_cache_hold(fib_work->men_info.mfc);
+               ipmr_cache_hold((struct mfc_cache *) fib_work->men_info.mfc);
                break;
        case FIB_EVENT_VIF_ADD: /* fall through */
        case FIB_EVENT_VIF_DEL:
index 3f70a04a5879bdd18af9de6ecaed6c5e1eee0090..c855d80b51f7d517904c52cf7b0553d2ba4bc4d2 100644 (file)
@@ -80,12 +80,6 @@ struct mfc_cache {
        };
 };
 
-struct mfc_entry_notifier_info {
-       struct fib_notifier_info info;
-       struct mfc_cache *mfc;
-       u32 tb_id;
-};
-
 struct rtmsg;
 int ipmr_get_route(struct net *net, struct sk_buff *skb,
                   __be32 saddr, __be32 daddr,
index 23326f5402f3c4f30d3462469b52d6d5be1608da..2c594686c05e6b95e796f6cf89326f5fdde604b6 100644 (file)
@@ -152,6 +152,50 @@ struct mr_mfc {
        struct rcu_head rcu;
 };
 
+struct mfc_entry_notifier_info {
+       struct fib_notifier_info info;
+       struct mr_mfc *mfc;
+       u32 tb_id;
+};
+
+static inline int mr_call_mfc_notifier(struct notifier_block *nb,
+                                      struct net *net,
+                                      unsigned short family,
+                                      enum fib_event_type event_type,
+                                      struct mr_mfc *mfc, u32 tb_id)
+{
+       struct mfc_entry_notifier_info info = {
+               .info = {
+                       .family = family,
+                       .net = net,
+               },
+               .mfc = mfc,
+               .tb_id = tb_id
+       };
+
+       return call_fib_notifier(nb, net, event_type, &info.info);
+}
+
+static inline int mr_call_mfc_notifiers(struct net *net,
+                                       unsigned short family,
+                                       enum fib_event_type event_type,
+                                       struct mr_mfc *mfc, u32 tb_id,
+                                       unsigned int *ipmr_seq)
+{
+       struct mfc_entry_notifier_info info = {
+               .info = {
+                       .family = family,
+                       .net = net,
+               },
+               .mfc = mfc,
+               .tb_id = tb_id
+       };
+
+       ASSERT_RTNL();
+       (*ipmr_seq)++;
+       return call_fib_notifiers(net, event_type, &info.info);
+}
+
 struct mr_table;
 
 /**
index bb1a0655f8e4f4a399ceef5b008ddb80c5f75e93..470956d2d8ad96ec08042a641772987c4e3f6a0b 100644 (file)
@@ -669,34 +669,16 @@ static int call_ipmr_mfc_entry_notifier(struct notifier_block *nb,
                                        enum fib_event_type event_type,
                                        struct mfc_cache *mfc, u32 tb_id)
 {
-       struct mfc_entry_notifier_info info = {
-               .info = {
-                       .family = RTNL_FAMILY_IPMR,
-                       .net = net,
-               },
-               .mfc = mfc,
-               .tb_id = tb_id
-       };
-
-       return call_fib_notifier(nb, net, event_type, &info.info);
+       return mr_call_mfc_notifier(nb, net, RTNL_FAMILY_IPMR,
+                                   event_type, &mfc->_c, tb_id);
 }
 
 static int call_ipmr_mfc_entry_notifiers(struct net *net,
                                         enum fib_event_type event_type,
                                         struct mfc_cache *mfc, u32 tb_id)
 {
-       struct mfc_entry_notifier_info info = {
-               .info = {
-                       .family = RTNL_FAMILY_IPMR,
-                       .net = net,
-               },
-               .mfc = mfc,
-               .tb_id = tb_id
-       };
-
-       ASSERT_RTNL();
-       net->ipv4.ipmr_seq++;
-       return call_fib_notifiers(net, event_type, &info.info);
+       return mr_call_mfc_notifiers(net, RTNL_FAMILY_IPMR, event_type,
+                                    &mfc->_c, tb_id, &net->ipv4.ipmr_seq);
 }
 
 /**