@@ -75,9 +75,7 @@ static int stats_timer __read_mostly = 1;
75
75
module_param (stats_timer , int , S_IRUGO );
76
76
MODULE_PARM_DESC (stats_timer , "enable timer for statistics (default:on)" );
77
77
78
- /* receive filters subscribed for 'all' CAN devices */
79
- struct dev_rcv_lists can_rx_alldev_list ;
80
- static DEFINE_SPINLOCK (can_rcvlists_lock );
78
+ static int can_net_id ;
81
79
82
80
static struct kmem_cache * rcv_cache __read_mostly ;
83
81
@@ -145,9 +143,6 @@ static int can_create(struct net *net, struct socket *sock, int protocol,
145
143
if (protocol < 0 || protocol >= CAN_NPROTO )
146
144
return - EINVAL ;
147
145
148
- if (!net_eq (net , & init_net ))
149
- return - EAFNOSUPPORT ;
150
-
151
146
cp = can_get_proto (protocol );
152
147
153
148
#ifdef CONFIG_MODULES
@@ -331,10 +326,11 @@ EXPORT_SYMBOL(can_send);
331
326
* af_can rx path
332
327
*/
333
328
334
- static struct dev_rcv_lists * find_dev_rcv_lists (struct net_device * dev )
329
+ static struct dev_rcv_lists * find_dev_rcv_lists (struct net * net ,
330
+ struct net_device * dev )
335
331
{
336
332
if (!dev )
337
- return & can_rx_alldev_list ;
333
+ return net -> can . can_rx_alldev_list ;
338
334
else
339
335
return (struct dev_rcv_lists * )dev -> ml_priv ;
340
336
}
@@ -467,9 +463,9 @@ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask,
467
463
* -ENOMEM on missing cache mem to create subscription entry
468
464
* -ENODEV unknown device
469
465
*/
470
- int can_rx_register (struct net_device * dev , canid_t can_id , canid_t mask ,
471
- void (* func )(struct sk_buff * , void * ), void * data ,
472
- char * ident , struct sock * sk )
466
+ int can_rx_register (struct net * net , struct net_device * dev , canid_t can_id ,
467
+ canid_t mask , void (* func )(struct sk_buff * , void * ),
468
+ void * data , char * ident , struct sock * sk )
473
469
{
474
470
struct receiver * r ;
475
471
struct hlist_head * rl ;
@@ -481,13 +477,16 @@ int can_rx_register(struct net_device *dev, canid_t can_id, canid_t mask,
481
477
if (dev && dev -> type != ARPHRD_CAN )
482
478
return - ENODEV ;
483
479
480
+ if (dev && !net_eq (net , dev_net (dev )))
481
+ return - ENODEV ;
482
+
484
483
r = kmem_cache_alloc (rcv_cache , GFP_KERNEL );
485
484
if (!r )
486
485
return - ENOMEM ;
487
486
488
- spin_lock (& can_rcvlists_lock );
487
+ spin_lock (& net -> can . can_rcvlists_lock );
489
488
490
- d = find_dev_rcv_lists (dev );
489
+ d = find_dev_rcv_lists (net , dev );
491
490
if (d ) {
492
491
rl = find_rcv_list (& can_id , & mask , d );
493
492
@@ -510,7 +509,7 @@ int can_rx_register(struct net_device *dev, canid_t can_id, canid_t mask,
510
509
err = - ENODEV ;
511
510
}
512
511
513
- spin_unlock (& can_rcvlists_lock );
512
+ spin_unlock (& net -> can . can_rcvlists_lock );
514
513
515
514
return err ;
516
515
}
@@ -540,8 +539,9 @@ static void can_rx_delete_receiver(struct rcu_head *rp)
540
539
* Description:
541
540
* Removes subscription entry depending on given (subscription) values.
542
541
*/
543
- void can_rx_unregister (struct net_device * dev , canid_t can_id , canid_t mask ,
544
- void (* func )(struct sk_buff * , void * ), void * data )
542
+ void can_rx_unregister (struct net * net , struct net_device * dev , canid_t can_id ,
543
+ canid_t mask , void (* func )(struct sk_buff * , void * ),
544
+ void * data )
545
545
{
546
546
struct receiver * r = NULL ;
547
547
struct hlist_head * rl ;
@@ -550,9 +550,12 @@ void can_rx_unregister(struct net_device *dev, canid_t can_id, canid_t mask,
550
550
if (dev && dev -> type != ARPHRD_CAN )
551
551
return ;
552
552
553
- spin_lock (& can_rcvlists_lock );
553
+ if (dev && !net_eq (net , dev_net (dev )))
554
+ return ;
554
555
555
- d = find_dev_rcv_lists (dev );
556
+ spin_lock (& net -> can .can_rcvlists_lock );
557
+
558
+ d = find_dev_rcv_lists (net , dev );
556
559
if (!d ) {
557
560
pr_err ("BUG: receive list not found for "
558
561
"dev %s, id %03X, mask %03X\n" ,
@@ -598,7 +601,7 @@ void can_rx_unregister(struct net_device *dev, canid_t can_id, canid_t mask,
598
601
}
599
602
600
603
out :
601
- spin_unlock (& can_rcvlists_lock );
604
+ spin_unlock (& net -> can . can_rcvlists_lock );
602
605
603
606
/* schedule the receiver item for deletion */
604
607
if (r ) {
@@ -696,10 +699,10 @@ static void can_receive(struct sk_buff *skb, struct net_device *dev)
696
699
rcu_read_lock ();
697
700
698
701
/* deliver the packet to sockets listening on all devices */
699
- matches = can_rcv_filter (& can_rx_alldev_list , skb );
702
+ matches = can_rcv_filter (dev_net ( dev ) -> can . can_rx_alldev_list , skb );
700
703
701
704
/* find receive list for this device */
702
- d = find_dev_rcv_lists (dev );
705
+ d = find_dev_rcv_lists (dev_net ( dev ), dev );
703
706
if (d )
704
707
matches += can_rcv_filter (d , skb );
705
708
@@ -719,9 +722,6 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
719
722
{
720
723
struct canfd_frame * cfd = (struct canfd_frame * )skb -> data ;
721
724
722
- if (unlikely (!net_eq (dev_net (dev ), & init_net )))
723
- goto drop ;
724
-
725
725
if (WARN_ONCE (dev -> type != ARPHRD_CAN ||
726
726
skb -> len != CAN_MTU ||
727
727
cfd -> len > CAN_MAX_DLEN ,
@@ -743,9 +743,6 @@ static int canfd_rcv(struct sk_buff *skb, struct net_device *dev,
743
743
{
744
744
struct canfd_frame * cfd = (struct canfd_frame * )skb -> data ;
745
745
746
- if (unlikely (!net_eq (dev_net (dev ), & init_net )))
747
- goto drop ;
748
-
749
746
if (WARN_ONCE (dev -> type != ARPHRD_CAN ||
750
747
skb -> len != CANFD_MTU ||
751
748
cfd -> len > CANFD_MAX_DLEN ,
@@ -835,9 +832,6 @@ static int can_notifier(struct notifier_block *nb, unsigned long msg,
835
832
struct net_device * dev = netdev_notifier_info_to_dev (ptr );
836
833
struct dev_rcv_lists * d ;
837
834
838
- if (!net_eq (dev_net (dev ), & init_net ))
839
- return NOTIFY_DONE ;
840
-
841
835
if (dev -> type != ARPHRD_CAN )
842
836
return NOTIFY_DONE ;
843
837
@@ -855,7 +849,7 @@ static int can_notifier(struct notifier_block *nb, unsigned long msg,
855
849
break ;
856
850
857
851
case NETDEV_UNREGISTER :
858
- spin_lock (& can_rcvlists_lock );
852
+ spin_lock (& dev_net ( dev ) -> can . can_rcvlists_lock );
859
853
860
854
d = dev -> ml_priv ;
861
855
if (d ) {
@@ -869,14 +863,48 @@ static int can_notifier(struct notifier_block *nb, unsigned long msg,
869
863
pr_err ("can: notifier: receive list not found for dev "
870
864
"%s\n" , dev -> name );
871
865
872
- spin_unlock (& can_rcvlists_lock );
866
+ spin_unlock (& dev_net ( dev ) -> can . can_rcvlists_lock );
873
867
874
868
break ;
875
869
}
876
870
877
871
return NOTIFY_DONE ;
878
872
}
879
873
874
+ static int can_pernet_init (struct net * net )
875
+ {
876
+ net -> can .can_rcvlists_lock =
877
+ __SPIN_LOCK_UNLOCKED (net -> can .can_rcvlists_lock );
878
+ net -> can .can_rx_alldev_list =
879
+ kzalloc (sizeof (struct dev_rcv_lists ), GFP_KERNEL );
880
+
881
+ if (IS_ENABLED (CONFIG_PROC_FS ))
882
+ can_init_proc (net );
883
+
884
+ return 0 ;
885
+ }
886
+
887
+ static void can_pernet_exit (struct net * net )
888
+ {
889
+ struct net_device * dev ;
890
+
891
+ if (IS_ENABLED (CONFIG_PROC_FS ))
892
+ can_remove_proc (net );
893
+
894
+ /* remove created dev_rcv_lists from still registered CAN devices */
895
+ rcu_read_lock ();
896
+ for_each_netdev_rcu (net , dev ) {
897
+ if (dev -> type == ARPHRD_CAN && dev -> ml_priv ) {
898
+ struct dev_rcv_lists * d = dev -> ml_priv ;
899
+
900
+ BUG_ON (d -> entries );
901
+ kfree (d );
902
+ dev -> ml_priv = NULL ;
903
+ }
904
+ }
905
+ rcu_read_unlock ();
906
+ }
907
+
880
908
/*
881
909
* af_can module init/exit functions
882
910
*/
@@ -902,6 +930,13 @@ static struct notifier_block can_netdev_notifier __read_mostly = {
902
930
.notifier_call = can_notifier ,
903
931
};
904
932
933
+ static struct pernet_operations can_pernet_ops __read_mostly = {
934
+ .init = can_pernet_init ,
935
+ .exit = can_pernet_exit ,
936
+ .id = & can_net_id ,
937
+ .size = 0 ,
938
+ };
939
+
905
940
static __init int can_init (void )
906
941
{
907
942
/* check for correct padding to be able to use the structs similarly */
@@ -912,8 +947,6 @@ static __init int can_init(void)
912
947
913
948
pr_info ("can: controller area network core (" CAN_VERSION_STRING ")\n" );
914
949
915
- memset (& can_rx_alldev_list , 0 , sizeof (can_rx_alldev_list ));
916
-
917
950
rcv_cache = kmem_cache_create ("can_receiver" , sizeof (struct receiver ),
918
951
0 , 0 , NULL );
919
952
if (!rcv_cache )
@@ -925,9 +958,10 @@ static __init int can_init(void)
925
958
setup_timer (& can_stattimer , can_stat_update , 0 );
926
959
mod_timer (& can_stattimer , round_jiffies (jiffies + HZ ));
927
960
}
928
- can_init_proc ();
929
961
}
930
962
963
+ register_pernet_subsys (& can_pernet_ops );
964
+
931
965
/* protocol register */
932
966
sock_register (& can_family_ops );
933
967
register_netdevice_notifier (& can_netdev_notifier );
@@ -939,13 +973,9 @@ static __init int can_init(void)
939
973
940
974
static __exit void can_exit (void )
941
975
{
942
- struct net_device * dev ;
943
-
944
976
if (IS_ENABLED (CONFIG_PROC_FS )) {
945
977
if (stats_timer )
946
978
del_timer_sync (& can_stattimer );
947
-
948
- can_remove_proc ();
949
979
}
950
980
951
981
/* protocol unregister */
@@ -954,19 +984,7 @@ static __exit void can_exit(void)
954
984
unregister_netdevice_notifier (& can_netdev_notifier );
955
985
sock_unregister (PF_CAN );
956
986
957
- /* remove created dev_rcv_lists from still registered CAN devices */
958
- rcu_read_lock ();
959
- for_each_netdev_rcu (& init_net , dev ) {
960
- if (dev -> type == ARPHRD_CAN && dev -> ml_priv ) {
961
-
962
- struct dev_rcv_lists * d = dev -> ml_priv ;
963
-
964
- BUG_ON (d -> entries );
965
- kfree (d );
966
- dev -> ml_priv = NULL ;
967
- }
968
- }
969
- rcu_read_unlock ();
987
+ unregister_pernet_subsys (& can_pernet_ops );
970
988
971
989
rcu_barrier (); /* Wait for completion of call_rcu()'s */
972
990
0 commit comments