Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/can/af_can.c
15109 views
1
/*
2
* af_can.c - Protocol family CAN core module
3
* (used by different CAN protocol modules)
4
*
5
* Copyright (c) 2002-2007 Volkswagen Group Electronic Research
6
* All rights reserved.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
10
* are met:
11
* 1. Redistributions of source code must retain the above copyright
12
* notice, this list of conditions and the following disclaimer.
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
16
* 3. Neither the name of Volkswagen nor the names of its contributors
17
* may be used to endorse or promote products derived from this software
18
* without specific prior written permission.
19
*
20
* Alternatively, provided that this notice is retained in full, this
21
* software may be distributed under the terms of the GNU General
22
* Public License ("GPL") version 2, in which case the provisions of the
23
* GPL apply INSTEAD OF those given above.
24
*
25
* The provided data structures and external interfaces from this code
26
* are not restricted to be used by modules with a GPL compatible license.
27
*
28
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
39
* DAMAGE.
40
*
41
* Send feedback to <[email protected]>
42
*
43
*/
44
45
#include <linux/module.h>
46
#include <linux/init.h>
47
#include <linux/kmod.h>
48
#include <linux/slab.h>
49
#include <linux/list.h>
50
#include <linux/spinlock.h>
51
#include <linux/rcupdate.h>
52
#include <linux/uaccess.h>
53
#include <linux/net.h>
54
#include <linux/netdevice.h>
55
#include <linux/socket.h>
56
#include <linux/if_ether.h>
57
#include <linux/if_arp.h>
58
#include <linux/skbuff.h>
59
#include <linux/can.h>
60
#include <linux/can/core.h>
61
#include <net/net_namespace.h>
62
#include <net/sock.h>
63
64
#include "af_can.h"
65
66
static __initdata const char banner[] = KERN_INFO
67
"can: controller area network core (" CAN_VERSION_STRING ")\n";
68
69
MODULE_DESCRIPTION("Controller Area Network PF_CAN core");
70
MODULE_LICENSE("Dual BSD/GPL");
71
MODULE_AUTHOR("Urs Thuermann <[email protected]>, "
72
"Oliver Hartkopp <[email protected]>");
73
74
MODULE_ALIAS_NETPROTO(PF_CAN);
75
76
static int stats_timer __read_mostly = 1;
77
module_param(stats_timer, int, S_IRUGO);
78
MODULE_PARM_DESC(stats_timer, "enable timer for statistics (default:on)");
79
80
/* receive filters subscribed for 'all' CAN devices */
81
struct dev_rcv_lists can_rx_alldev_list;
82
static DEFINE_SPINLOCK(can_rcvlists_lock);
83
84
static struct kmem_cache *rcv_cache __read_mostly;
85
86
/* table of registered CAN protocols */
87
static const struct can_proto *proto_tab[CAN_NPROTO] __read_mostly;
88
static DEFINE_MUTEX(proto_tab_lock);
89
90
struct timer_list can_stattimer; /* timer for statistics update */
91
struct s_stats can_stats; /* packet statistics */
92
struct s_pstats can_pstats; /* receive list statistics */
93
94
/*
95
* af_can socket functions
96
*/
97
98
int can_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
99
{
100
struct sock *sk = sock->sk;
101
102
switch (cmd) {
103
104
case SIOCGSTAMP:
105
return sock_get_timestamp(sk, (struct timeval __user *)arg);
106
107
default:
108
return -ENOIOCTLCMD;
109
}
110
}
111
EXPORT_SYMBOL(can_ioctl);
112
113
static void can_sock_destruct(struct sock *sk)
114
{
115
skb_queue_purge(&sk->sk_receive_queue);
116
}
117
118
static const struct can_proto *can_get_proto(int protocol)
119
{
120
const struct can_proto *cp;
121
122
rcu_read_lock();
123
cp = rcu_dereference(proto_tab[protocol]);
124
if (cp && !try_module_get(cp->prot->owner))
125
cp = NULL;
126
rcu_read_unlock();
127
128
return cp;
129
}
130
131
static inline void can_put_proto(const struct can_proto *cp)
132
{
133
module_put(cp->prot->owner);
134
}
135
136
static int can_create(struct net *net, struct socket *sock, int protocol,
137
int kern)
138
{
139
struct sock *sk;
140
const struct can_proto *cp;
141
int err = 0;
142
143
sock->state = SS_UNCONNECTED;
144
145
if (protocol < 0 || protocol >= CAN_NPROTO)
146
return -EINVAL;
147
148
if (!net_eq(net, &init_net))
149
return -EAFNOSUPPORT;
150
151
cp = can_get_proto(protocol);
152
153
#ifdef CONFIG_MODULES
154
if (!cp) {
155
/* try to load protocol module if kernel is modular */
156
157
err = request_module("can-proto-%d", protocol);
158
159
/*
160
* In case of error we only print a message but don't
161
* return the error code immediately. Below we will
162
* return -EPROTONOSUPPORT
163
*/
164
if (err && printk_ratelimit())
165
printk(KERN_ERR "can: request_module "
166
"(can-proto-%d) failed.\n", protocol);
167
168
cp = can_get_proto(protocol);
169
}
170
#endif
171
172
/* check for available protocol and correct usage */
173
174
if (!cp)
175
return -EPROTONOSUPPORT;
176
177
if (cp->type != sock->type) {
178
err = -EPROTOTYPE;
179
goto errout;
180
}
181
182
sock->ops = cp->ops;
183
184
sk = sk_alloc(net, PF_CAN, GFP_KERNEL, cp->prot);
185
if (!sk) {
186
err = -ENOMEM;
187
goto errout;
188
}
189
190
sock_init_data(sock, sk);
191
sk->sk_destruct = can_sock_destruct;
192
193
if (sk->sk_prot->init)
194
err = sk->sk_prot->init(sk);
195
196
if (err) {
197
/* release sk on errors */
198
sock_orphan(sk);
199
sock_put(sk);
200
}
201
202
errout:
203
can_put_proto(cp);
204
return err;
205
}
206
207
/*
208
* af_can tx path
209
*/
210
211
/**
212
* can_send - transmit a CAN frame (optional with local loopback)
213
* @skb: pointer to socket buffer with CAN frame in data section
214
* @loop: loopback for listeners on local CAN sockets (recommended default!)
215
*
216
* Due to the loopback this routine must not be called from hardirq context.
217
*
218
* Return:
219
* 0 on success
220
* -ENETDOWN when the selected interface is down
221
* -ENOBUFS on full driver queue (see net_xmit_errno())
222
* -ENOMEM when local loopback failed at calling skb_clone()
223
* -EPERM when trying to send on a non-CAN interface
224
* -EINVAL when the skb->data does not contain a valid CAN frame
225
*/
226
int can_send(struct sk_buff *skb, int loop)
227
{
228
struct sk_buff *newskb = NULL;
229
struct can_frame *cf = (struct can_frame *)skb->data;
230
int err;
231
232
if (skb->len != sizeof(struct can_frame) || cf->can_dlc > 8) {
233
kfree_skb(skb);
234
return -EINVAL;
235
}
236
237
if (skb->dev->type != ARPHRD_CAN) {
238
kfree_skb(skb);
239
return -EPERM;
240
}
241
242
if (!(skb->dev->flags & IFF_UP)) {
243
kfree_skb(skb);
244
return -ENETDOWN;
245
}
246
247
skb->protocol = htons(ETH_P_CAN);
248
skb_reset_network_header(skb);
249
skb_reset_transport_header(skb);
250
251
if (loop) {
252
/* local loopback of sent CAN frames */
253
254
/* indication for the CAN driver: do loopback */
255
skb->pkt_type = PACKET_LOOPBACK;
256
257
/*
258
* The reference to the originating sock may be required
259
* by the receiving socket to check whether the frame is
260
* its own. Example: can_raw sockopt CAN_RAW_RECV_OWN_MSGS
261
* Therefore we have to ensure that skb->sk remains the
262
* reference to the originating sock by restoring skb->sk
263
* after each skb_clone() or skb_orphan() usage.
264
*/
265
266
if (!(skb->dev->flags & IFF_ECHO)) {
267
/*
268
* If the interface is not capable to do loopback
269
* itself, we do it here.
270
*/
271
newskb = skb_clone(skb, GFP_ATOMIC);
272
if (!newskb) {
273
kfree_skb(skb);
274
return -ENOMEM;
275
}
276
277
newskb->sk = skb->sk;
278
newskb->ip_summed = CHECKSUM_UNNECESSARY;
279
newskb->pkt_type = PACKET_BROADCAST;
280
}
281
} else {
282
/* indication for the CAN driver: no loopback required */
283
skb->pkt_type = PACKET_HOST;
284
}
285
286
/* send to netdevice */
287
err = dev_queue_xmit(skb);
288
if (err > 0)
289
err = net_xmit_errno(err);
290
291
if (err) {
292
kfree_skb(newskb);
293
return err;
294
}
295
296
if (newskb)
297
netif_rx_ni(newskb);
298
299
/* update statistics */
300
can_stats.tx_frames++;
301
can_stats.tx_frames_delta++;
302
303
return 0;
304
}
305
EXPORT_SYMBOL(can_send);
306
307
/*
308
* af_can rx path
309
*/
310
311
static struct dev_rcv_lists *find_dev_rcv_lists(struct net_device *dev)
312
{
313
if (!dev)
314
return &can_rx_alldev_list;
315
else
316
return (struct dev_rcv_lists *)dev->ml_priv;
317
}
318
319
/**
320
* find_rcv_list - determine optimal filterlist inside device filter struct
321
* @can_id: pointer to CAN identifier of a given can_filter
322
* @mask: pointer to CAN mask of a given can_filter
323
* @d: pointer to the device filter struct
324
*
325
* Description:
326
* Returns the optimal filterlist to reduce the filter handling in the
327
* receive path. This function is called by service functions that need
328
* to register or unregister a can_filter in the filter lists.
329
*
330
* A filter matches in general, when
331
*
332
* <received_can_id> & mask == can_id & mask
333
*
334
* so every bit set in the mask (even CAN_EFF_FLAG, CAN_RTR_FLAG) describe
335
* relevant bits for the filter.
336
*
337
* The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can
338
* filter for error frames (CAN_ERR_FLAG bit set in mask). For error frames
339
* there is a special filterlist and a special rx path filter handling.
340
*
341
* Return:
342
* Pointer to optimal filterlist for the given can_id/mask pair.
343
* Constistency checked mask.
344
* Reduced can_id to have a preprocessed filter compare value.
345
*/
346
static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask,
347
struct dev_rcv_lists *d)
348
{
349
canid_t inv = *can_id & CAN_INV_FILTER; /* save flag before masking */
350
351
/* filter for error frames in extra filterlist */
352
if (*mask & CAN_ERR_FLAG) {
353
/* clear CAN_ERR_FLAG in filter entry */
354
*mask &= CAN_ERR_MASK;
355
return &d->rx[RX_ERR];
356
}
357
358
/* with cleared CAN_ERR_FLAG we have a simple mask/value filterpair */
359
360
#define CAN_EFF_RTR_FLAGS (CAN_EFF_FLAG | CAN_RTR_FLAG)
361
362
/* ensure valid values in can_mask for 'SFF only' frame filtering */
363
if ((*mask & CAN_EFF_FLAG) && !(*can_id & CAN_EFF_FLAG))
364
*mask &= (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS);
365
366
/* reduce condition testing at receive time */
367
*can_id &= *mask;
368
369
/* inverse can_id/can_mask filter */
370
if (inv)
371
return &d->rx[RX_INV];
372
373
/* mask == 0 => no condition testing at receive time */
374
if (!(*mask))
375
return &d->rx[RX_ALL];
376
377
/* extra filterlists for the subscription of a single non-RTR can_id */
378
if (((*mask & CAN_EFF_RTR_FLAGS) == CAN_EFF_RTR_FLAGS) &&
379
!(*can_id & CAN_RTR_FLAG)) {
380
381
if (*can_id & CAN_EFF_FLAG) {
382
if (*mask == (CAN_EFF_MASK | CAN_EFF_RTR_FLAGS)) {
383
/* RFC: a future use-case for hash-tables? */
384
return &d->rx[RX_EFF];
385
}
386
} else {
387
if (*mask == (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS))
388
return &d->rx_sff[*can_id];
389
}
390
}
391
392
/* default: filter via can_id/can_mask */
393
return &d->rx[RX_FIL];
394
}
395
396
/**
397
* can_rx_register - subscribe CAN frames from a specific interface
398
* @dev: pointer to netdevice (NULL => subcribe from 'all' CAN devices list)
399
* @can_id: CAN identifier (see description)
400
* @mask: CAN mask (see description)
401
* @func: callback function on filter match
402
* @data: returned parameter for callback function
403
* @ident: string for calling module indentification
404
*
405
* Description:
406
* Invokes the callback function with the received sk_buff and the given
407
* parameter 'data' on a matching receive filter. A filter matches, when
408
*
409
* <received_can_id> & mask == can_id & mask
410
*
411
* The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can
412
* filter for error frames (CAN_ERR_FLAG bit set in mask).
413
*
414
* The provided pointer to the sk_buff is guaranteed to be valid as long as
415
* the callback function is running. The callback function must *not* free
416
* the given sk_buff while processing it's task. When the given sk_buff is
417
* needed after the end of the callback function it must be cloned inside
418
* the callback function with skb_clone().
419
*
420
* Return:
421
* 0 on success
422
* -ENOMEM on missing cache mem to create subscription entry
423
* -ENODEV unknown device
424
*/
425
int can_rx_register(struct net_device *dev, canid_t can_id, canid_t mask,
426
void (*func)(struct sk_buff *, void *), void *data,
427
char *ident)
428
{
429
struct receiver *r;
430
struct hlist_head *rl;
431
struct dev_rcv_lists *d;
432
int err = 0;
433
434
/* insert new receiver (dev,canid,mask) -> (func,data) */
435
436
if (dev && dev->type != ARPHRD_CAN)
437
return -ENODEV;
438
439
r = kmem_cache_alloc(rcv_cache, GFP_KERNEL);
440
if (!r)
441
return -ENOMEM;
442
443
spin_lock(&can_rcvlists_lock);
444
445
d = find_dev_rcv_lists(dev);
446
if (d) {
447
rl = find_rcv_list(&can_id, &mask, d);
448
449
r->can_id = can_id;
450
r->mask = mask;
451
r->matches = 0;
452
r->func = func;
453
r->data = data;
454
r->ident = ident;
455
456
hlist_add_head_rcu(&r->list, rl);
457
d->entries++;
458
459
can_pstats.rcv_entries++;
460
if (can_pstats.rcv_entries_max < can_pstats.rcv_entries)
461
can_pstats.rcv_entries_max = can_pstats.rcv_entries;
462
} else {
463
kmem_cache_free(rcv_cache, r);
464
err = -ENODEV;
465
}
466
467
spin_unlock(&can_rcvlists_lock);
468
469
return err;
470
}
471
EXPORT_SYMBOL(can_rx_register);
472
473
/*
474
* can_rx_delete_receiver - rcu callback for single receiver entry removal
475
*/
476
static void can_rx_delete_receiver(struct rcu_head *rp)
477
{
478
struct receiver *r = container_of(rp, struct receiver, rcu);
479
480
kmem_cache_free(rcv_cache, r);
481
}
482
483
/**
484
* can_rx_unregister - unsubscribe CAN frames from a specific interface
485
* @dev: pointer to netdevice (NULL => unsubcribe from 'all' CAN devices list)
486
* @can_id: CAN identifier
487
* @mask: CAN mask
488
* @func: callback function on filter match
489
* @data: returned parameter for callback function
490
*
491
* Description:
492
* Removes subscription entry depending on given (subscription) values.
493
*/
494
void can_rx_unregister(struct net_device *dev, canid_t can_id, canid_t mask,
495
void (*func)(struct sk_buff *, void *), void *data)
496
{
497
struct receiver *r = NULL;
498
struct hlist_head *rl;
499
struct hlist_node *next;
500
struct dev_rcv_lists *d;
501
502
if (dev && dev->type != ARPHRD_CAN)
503
return;
504
505
spin_lock(&can_rcvlists_lock);
506
507
d = find_dev_rcv_lists(dev);
508
if (!d) {
509
printk(KERN_ERR "BUG: receive list not found for "
510
"dev %s, id %03X, mask %03X\n",
511
DNAME(dev), can_id, mask);
512
goto out;
513
}
514
515
rl = find_rcv_list(&can_id, &mask, d);
516
517
/*
518
* Search the receiver list for the item to delete. This should
519
* exist, since no receiver may be unregistered that hasn't
520
* been registered before.
521
*/
522
523
hlist_for_each_entry_rcu(r, next, rl, list) {
524
if (r->can_id == can_id && r->mask == mask &&
525
r->func == func && r->data == data)
526
break;
527
}
528
529
/*
530
* Check for bugs in CAN protocol implementations:
531
* If no matching list item was found, the list cursor variable next
532
* will be NULL, while r will point to the last item of the list.
533
*/
534
535
if (!next) {
536
printk(KERN_ERR "BUG: receive list entry not found for "
537
"dev %s, id %03X, mask %03X\n",
538
DNAME(dev), can_id, mask);
539
r = NULL;
540
goto out;
541
}
542
543
hlist_del_rcu(&r->list);
544
d->entries--;
545
546
if (can_pstats.rcv_entries > 0)
547
can_pstats.rcv_entries--;
548
549
/* remove device structure requested by NETDEV_UNREGISTER */
550
if (d->remove_on_zero_entries && !d->entries) {
551
kfree(d);
552
dev->ml_priv = NULL;
553
}
554
555
out:
556
spin_unlock(&can_rcvlists_lock);
557
558
/* schedule the receiver item for deletion */
559
if (r)
560
call_rcu(&r->rcu, can_rx_delete_receiver);
561
}
562
EXPORT_SYMBOL(can_rx_unregister);
563
564
static inline void deliver(struct sk_buff *skb, struct receiver *r)
565
{
566
r->func(skb, r->data);
567
r->matches++;
568
}
569
570
static int can_rcv_filter(struct dev_rcv_lists *d, struct sk_buff *skb)
571
{
572
struct receiver *r;
573
struct hlist_node *n;
574
int matches = 0;
575
struct can_frame *cf = (struct can_frame *)skb->data;
576
canid_t can_id = cf->can_id;
577
578
if (d->entries == 0)
579
return 0;
580
581
if (can_id & CAN_ERR_FLAG) {
582
/* check for error frame entries only */
583
hlist_for_each_entry_rcu(r, n, &d->rx[RX_ERR], list) {
584
if (can_id & r->mask) {
585
deliver(skb, r);
586
matches++;
587
}
588
}
589
return matches;
590
}
591
592
/* check for unfiltered entries */
593
hlist_for_each_entry_rcu(r, n, &d->rx[RX_ALL], list) {
594
deliver(skb, r);
595
matches++;
596
}
597
598
/* check for can_id/mask entries */
599
hlist_for_each_entry_rcu(r, n, &d->rx[RX_FIL], list) {
600
if ((can_id & r->mask) == r->can_id) {
601
deliver(skb, r);
602
matches++;
603
}
604
}
605
606
/* check for inverted can_id/mask entries */
607
hlist_for_each_entry_rcu(r, n, &d->rx[RX_INV], list) {
608
if ((can_id & r->mask) != r->can_id) {
609
deliver(skb, r);
610
matches++;
611
}
612
}
613
614
/* check filterlists for single non-RTR can_ids */
615
if (can_id & CAN_RTR_FLAG)
616
return matches;
617
618
if (can_id & CAN_EFF_FLAG) {
619
hlist_for_each_entry_rcu(r, n, &d->rx[RX_EFF], list) {
620
if (r->can_id == can_id) {
621
deliver(skb, r);
622
matches++;
623
}
624
}
625
} else {
626
can_id &= CAN_SFF_MASK;
627
hlist_for_each_entry_rcu(r, n, &d->rx_sff[can_id], list) {
628
deliver(skb, r);
629
matches++;
630
}
631
}
632
633
return matches;
634
}
635
636
static int can_rcv(struct sk_buff *skb, struct net_device *dev,
637
struct packet_type *pt, struct net_device *orig_dev)
638
{
639
struct dev_rcv_lists *d;
640
struct can_frame *cf = (struct can_frame *)skb->data;
641
int matches;
642
643
if (!net_eq(dev_net(dev), &init_net))
644
goto drop;
645
646
if (WARN_ONCE(dev->type != ARPHRD_CAN ||
647
skb->len != sizeof(struct can_frame) ||
648
cf->can_dlc > 8,
649
"PF_CAN: dropped non conform skbuf: "
650
"dev type %d, len %d, can_dlc %d\n",
651
dev->type, skb->len, cf->can_dlc))
652
goto drop;
653
654
/* update statistics */
655
can_stats.rx_frames++;
656
can_stats.rx_frames_delta++;
657
658
rcu_read_lock();
659
660
/* deliver the packet to sockets listening on all devices */
661
matches = can_rcv_filter(&can_rx_alldev_list, skb);
662
663
/* find receive list for this device */
664
d = find_dev_rcv_lists(dev);
665
if (d)
666
matches += can_rcv_filter(d, skb);
667
668
rcu_read_unlock();
669
670
/* consume the skbuff allocated by the netdevice driver */
671
consume_skb(skb);
672
673
if (matches > 0) {
674
can_stats.matches++;
675
can_stats.matches_delta++;
676
}
677
678
return NET_RX_SUCCESS;
679
680
drop:
681
kfree_skb(skb);
682
return NET_RX_DROP;
683
}
684
685
/*
686
* af_can protocol functions
687
*/
688
689
/**
690
* can_proto_register - register CAN transport protocol
691
* @cp: pointer to CAN protocol structure
692
*
693
* Return:
694
* 0 on success
695
* -EINVAL invalid (out of range) protocol number
696
* -EBUSY protocol already in use
697
* -ENOBUF if proto_register() fails
698
*/
699
int can_proto_register(const struct can_proto *cp)
700
{
701
int proto = cp->protocol;
702
int err = 0;
703
704
if (proto < 0 || proto >= CAN_NPROTO) {
705
printk(KERN_ERR "can: protocol number %d out of range\n",
706
proto);
707
return -EINVAL;
708
}
709
710
err = proto_register(cp->prot, 0);
711
if (err < 0)
712
return err;
713
714
mutex_lock(&proto_tab_lock);
715
716
if (proto_tab[proto]) {
717
printk(KERN_ERR "can: protocol %d already registered\n",
718
proto);
719
err = -EBUSY;
720
} else
721
rcu_assign_pointer(proto_tab[proto], cp);
722
723
mutex_unlock(&proto_tab_lock);
724
725
if (err < 0)
726
proto_unregister(cp->prot);
727
728
return err;
729
}
730
EXPORT_SYMBOL(can_proto_register);
731
732
/**
733
* can_proto_unregister - unregister CAN transport protocol
734
* @cp: pointer to CAN protocol structure
735
*/
736
void can_proto_unregister(const struct can_proto *cp)
737
{
738
int proto = cp->protocol;
739
740
mutex_lock(&proto_tab_lock);
741
BUG_ON(proto_tab[proto] != cp);
742
rcu_assign_pointer(proto_tab[proto], NULL);
743
mutex_unlock(&proto_tab_lock);
744
745
synchronize_rcu();
746
747
proto_unregister(cp->prot);
748
}
749
EXPORT_SYMBOL(can_proto_unregister);
750
751
/*
752
* af_can notifier to create/remove CAN netdevice specific structs
753
*/
754
static int can_notifier(struct notifier_block *nb, unsigned long msg,
755
void *data)
756
{
757
struct net_device *dev = (struct net_device *)data;
758
struct dev_rcv_lists *d;
759
760
if (!net_eq(dev_net(dev), &init_net))
761
return NOTIFY_DONE;
762
763
if (dev->type != ARPHRD_CAN)
764
return NOTIFY_DONE;
765
766
switch (msg) {
767
768
case NETDEV_REGISTER:
769
770
/* create new dev_rcv_lists for this device */
771
d = kzalloc(sizeof(*d), GFP_KERNEL);
772
if (!d) {
773
printk(KERN_ERR
774
"can: allocation of receive list failed\n");
775
return NOTIFY_DONE;
776
}
777
BUG_ON(dev->ml_priv);
778
dev->ml_priv = d;
779
780
break;
781
782
case NETDEV_UNREGISTER:
783
spin_lock(&can_rcvlists_lock);
784
785
d = dev->ml_priv;
786
if (d) {
787
if (d->entries)
788
d->remove_on_zero_entries = 1;
789
else {
790
kfree(d);
791
dev->ml_priv = NULL;
792
}
793
} else
794
printk(KERN_ERR "can: notifier: receive list not "
795
"found for dev %s\n", dev->name);
796
797
spin_unlock(&can_rcvlists_lock);
798
799
break;
800
}
801
802
return NOTIFY_DONE;
803
}
804
805
/*
806
* af_can module init/exit functions
807
*/
808
809
static struct packet_type can_packet __read_mostly = {
810
.type = cpu_to_be16(ETH_P_CAN),
811
.dev = NULL,
812
.func = can_rcv,
813
};
814
815
static const struct net_proto_family can_family_ops = {
816
.family = PF_CAN,
817
.create = can_create,
818
.owner = THIS_MODULE,
819
};
820
821
/* notifier block for netdevice event */
822
static struct notifier_block can_netdev_notifier __read_mostly = {
823
.notifier_call = can_notifier,
824
};
825
826
static __init int can_init(void)
827
{
828
printk(banner);
829
830
memset(&can_rx_alldev_list, 0, sizeof(can_rx_alldev_list));
831
832
rcv_cache = kmem_cache_create("can_receiver", sizeof(struct receiver),
833
0, 0, NULL);
834
if (!rcv_cache)
835
return -ENOMEM;
836
837
if (stats_timer) {
838
/* the statistics are updated every second (timer triggered) */
839
setup_timer(&can_stattimer, can_stat_update, 0);
840
mod_timer(&can_stattimer, round_jiffies(jiffies + HZ));
841
} else
842
can_stattimer.function = NULL;
843
844
can_init_proc();
845
846
/* protocol register */
847
sock_register(&can_family_ops);
848
register_netdevice_notifier(&can_netdev_notifier);
849
dev_add_pack(&can_packet);
850
851
return 0;
852
}
853
854
static __exit void can_exit(void)
855
{
856
struct net_device *dev;
857
858
if (stats_timer)
859
del_timer(&can_stattimer);
860
861
can_remove_proc();
862
863
/* protocol unregister */
864
dev_remove_pack(&can_packet);
865
unregister_netdevice_notifier(&can_netdev_notifier);
866
sock_unregister(PF_CAN);
867
868
/* remove created dev_rcv_lists from still registered CAN devices */
869
rcu_read_lock();
870
for_each_netdev_rcu(&init_net, dev) {
871
if (dev->type == ARPHRD_CAN && dev->ml_priv){
872
873
struct dev_rcv_lists *d = dev->ml_priv;
874
875
BUG_ON(d->entries);
876
kfree(d);
877
dev->ml_priv = NULL;
878
}
879
}
880
rcu_read_unlock();
881
882
rcu_barrier(); /* Wait for completion of call_rcu()'s */
883
884
kmem_cache_destroy(rcv_cache);
885
}
886
887
module_init(can_init);
888
module_exit(can_exit);
889
890