@@ -71,6 +71,8 @@ struct mlxsw_sp_router {
71
71
bool aborted ;
72
72
struct notifier_block fib_nb ;
73
73
struct notifier_block netevent_nb ;
74
+ struct notifier_block inetaddr_nb ;
75
+ struct notifier_block inet6addr_nb ;
74
76
const struct mlxsw_sp_rif_ops * * rif_ops_arr ;
75
77
const struct mlxsw_sp_ipip_ops * * ipip_ops_arr ;
76
78
};
@@ -6778,28 +6780,25 @@ static int __mlxsw_sp_inetaddr_event(struct mlxsw_sp *mlxsw_sp,
6778
6780
return 0 ;
6779
6781
}
6780
6782
6781
- int mlxsw_sp_inetaddr_event (struct notifier_block * unused ,
6782
- unsigned long event , void * ptr )
6783
+ static int mlxsw_sp_inetaddr_event (struct notifier_block * nb ,
6784
+ unsigned long event , void * ptr )
6783
6785
{
6784
6786
struct in_ifaddr * ifa = (struct in_ifaddr * ) ptr ;
6785
6787
struct net_device * dev = ifa -> ifa_dev -> dev ;
6786
- struct mlxsw_sp * mlxsw_sp ;
6788
+ struct mlxsw_sp_router * router ;
6787
6789
struct mlxsw_sp_rif * rif ;
6788
6790
int err = 0 ;
6789
6791
6790
6792
/* NETDEV_UP event is handled by mlxsw_sp_inetaddr_valid_event */
6791
6793
if (event == NETDEV_UP )
6792
6794
goto out ;
6793
6795
6794
- mlxsw_sp = mlxsw_sp_lower_get (dev );
6795
- if (!mlxsw_sp )
6796
- goto out ;
6797
-
6798
- rif = mlxsw_sp_rif_find_by_dev (mlxsw_sp , dev );
6796
+ router = container_of (nb , struct mlxsw_sp_router , inetaddr_nb );
6797
+ rif = mlxsw_sp_rif_find_by_dev (router -> mlxsw_sp , dev );
6799
6798
if (!mlxsw_sp_rif_should_config (rif , dev , event ))
6800
6799
goto out ;
6801
6800
6802
- err = __mlxsw_sp_inetaddr_event (mlxsw_sp , dev , event , NULL );
6801
+ err = __mlxsw_sp_inetaddr_event (router -> mlxsw_sp , dev , event , NULL );
6803
6802
out :
6804
6803
return notifier_from_errno (err );
6805
6804
}
@@ -6833,6 +6832,7 @@ int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused,
6833
6832
6834
6833
struct mlxsw_sp_inet6addr_event_work {
6835
6834
struct work_struct work ;
6835
+ struct mlxsw_sp * mlxsw_sp ;
6836
6836
struct net_device * dev ;
6837
6837
unsigned long event ;
6838
6838
};
@@ -6841,15 +6841,12 @@ static void mlxsw_sp_inet6addr_event_work(struct work_struct *work)
6841
6841
{
6842
6842
struct mlxsw_sp_inet6addr_event_work * inet6addr_work =
6843
6843
container_of (work , struct mlxsw_sp_inet6addr_event_work , work );
6844
+ struct mlxsw_sp * mlxsw_sp = inet6addr_work -> mlxsw_sp ;
6844
6845
struct net_device * dev = inet6addr_work -> dev ;
6845
6846
unsigned long event = inet6addr_work -> event ;
6846
- struct mlxsw_sp * mlxsw_sp ;
6847
6847
struct mlxsw_sp_rif * rif ;
6848
6848
6849
6849
rtnl_lock ();
6850
- mlxsw_sp = mlxsw_sp_lower_get (dev );
6851
- if (!mlxsw_sp )
6852
- goto out ;
6853
6850
6854
6851
rif = mlxsw_sp_rif_find_by_dev (mlxsw_sp , dev );
6855
6852
if (!mlxsw_sp_rif_should_config (rif , dev , event ))
@@ -6863,25 +6860,25 @@ static void mlxsw_sp_inet6addr_event_work(struct work_struct *work)
6863
6860
}
6864
6861
6865
6862
/* Called with rcu_read_lock() */
6866
- int mlxsw_sp_inet6addr_event (struct notifier_block * unused ,
6867
- unsigned long event , void * ptr )
6863
+ static int mlxsw_sp_inet6addr_event (struct notifier_block * nb ,
6864
+ unsigned long event , void * ptr )
6868
6865
{
6869
6866
struct inet6_ifaddr * if6 = (struct inet6_ifaddr * ) ptr ;
6870
6867
struct mlxsw_sp_inet6addr_event_work * inet6addr_work ;
6871
6868
struct net_device * dev = if6 -> idev -> dev ;
6869
+ struct mlxsw_sp_router * router ;
6872
6870
6873
6871
/* NETDEV_UP event is handled by mlxsw_sp_inet6addr_valid_event */
6874
6872
if (event == NETDEV_UP )
6875
6873
return NOTIFY_DONE ;
6876
6874
6877
- if (!mlxsw_sp_port_dev_lower_find_rcu (dev ))
6878
- return NOTIFY_DONE ;
6879
-
6880
6875
inet6addr_work = kzalloc (sizeof (* inet6addr_work ), GFP_ATOMIC );
6881
6876
if (!inet6addr_work )
6882
6877
return NOTIFY_BAD ;
6883
6878
6879
+ router = container_of (nb , struct mlxsw_sp_router , inet6addr_nb );
6884
6880
INIT_WORK (& inet6addr_work -> work , mlxsw_sp_inet6addr_event_work );
6881
+ inet6addr_work -> mlxsw_sp = router -> mlxsw_sp ;
6885
6882
inet6addr_work -> dev = dev ;
6886
6883
inet6addr_work -> event = event ;
6887
6884
dev_hold (dev );
@@ -7657,6 +7654,16 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp)
7657
7654
mlxsw_sp -> router = router ;
7658
7655
router -> mlxsw_sp = mlxsw_sp ;
7659
7656
7657
+ router -> inetaddr_nb .notifier_call = mlxsw_sp_inetaddr_event ;
7658
+ err = register_inetaddr_notifier (& router -> inetaddr_nb );
7659
+ if (err )
7660
+ goto err_register_inetaddr_notifier ;
7661
+
7662
+ router -> inet6addr_nb .notifier_call = mlxsw_sp_inet6addr_event ;
7663
+ err = register_inet6addr_notifier (& router -> inet6addr_nb );
7664
+ if (err )
7665
+ goto err_register_inet6addr_notifier ;
7666
+
7660
7667
INIT_LIST_HEAD (& mlxsw_sp -> router -> nexthop_neighs_list );
7661
7668
err = __mlxsw_sp_router_init (mlxsw_sp );
7662
7669
if (err )
@@ -7742,6 +7749,10 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp)
7742
7749
err_rifs_init :
7743
7750
__mlxsw_sp_router_fini (mlxsw_sp );
7744
7751
err_router_init :
7752
+ unregister_inet6addr_notifier (& router -> inet6addr_nb );
7753
+ err_register_inet6addr_notifier :
7754
+ unregister_inetaddr_notifier (& router -> inetaddr_nb );
7755
+ err_register_inetaddr_notifier :
7745
7756
kfree (mlxsw_sp -> router );
7746
7757
return err ;
7747
7758
}
@@ -7759,5 +7770,7 @@ void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
7759
7770
mlxsw_sp_ipips_fini (mlxsw_sp );
7760
7771
mlxsw_sp_rifs_fini (mlxsw_sp );
7761
7772
__mlxsw_sp_router_fini (mlxsw_sp );
7773
+ unregister_inet6addr_notifier (& mlxsw_sp -> router -> inet6addr_nb );
7774
+ unregister_inetaddr_notifier (& mlxsw_sp -> router -> inetaddr_nb );
7762
7775
kfree (mlxsw_sp -> router );
7763
7776
}
0 commit comments