Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/net/can/raw.c
26282 views
1
// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
2
/* raw.c - Raw sockets for protocol family CAN
3
*
4
* Copyright (c) 2002-2007 Volkswagen Group Electronic Research
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
* 3. Neither the name of Volkswagen nor the names of its contributors
16
* may be used to endorse or promote products derived from this software
17
* without specific prior written permission.
18
*
19
* Alternatively, provided that this notice is retained in full, this
20
* software may be distributed under the terms of the GNU General
21
* Public License ("GPL") version 2, in which case the provisions of the
22
* GPL apply INSTEAD OF those given above.
23
*
24
* The provided data structures and external interfaces from this code
25
* are not restricted to be used by modules with a GPL compatible license.
26
*
27
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
38
* DAMAGE.
39
*
40
*/
41
42
#include <linux/module.h>
43
#include <linux/init.h>
44
#include <linux/uio.h>
45
#include <linux/net.h>
46
#include <linux/slab.h>
47
#include <linux/netdevice.h>
48
#include <linux/socket.h>
49
#include <linux/if_arp.h>
50
#include <linux/skbuff.h>
51
#include <linux/can.h>
52
#include <linux/can/core.h>
53
#include <linux/can/dev.h> /* for can_is_canxl_dev_mtu() */
54
#include <linux/can/skb.h>
55
#include <linux/can/raw.h>
56
#include <net/sock.h>
57
#include <net/net_namespace.h>
58
59
MODULE_DESCRIPTION("PF_CAN raw protocol");
60
MODULE_LICENSE("Dual BSD/GPL");
61
MODULE_AUTHOR("Urs Thuermann <[email protected]>");
62
MODULE_ALIAS("can-proto-1");
63
64
#define RAW_MIN_NAMELEN CAN_REQUIRED_SIZE(struct sockaddr_can, can_ifindex)
65
66
#define MASK_ALL 0
67
68
/* A raw socket has a list of can_filters attached to it, each receiving
69
* the CAN frames matching that filter. If the filter list is empty,
70
* no CAN frames will be received by the socket. The default after
71
* opening the socket, is to have one filter which receives all frames.
72
* The filter list is allocated dynamically with the exception of the
73
* list containing only one item. This common case is optimized by
74
* storing the single filter in dfilter, to avoid using dynamic memory.
75
*/
76
77
struct uniqframe {
78
int skbcnt;
79
const struct sk_buff *skb;
80
unsigned int join_rx_count;
81
};
82
83
struct raw_sock {
84
struct sock sk;
85
int bound;
86
int ifindex;
87
struct net_device *dev;
88
netdevice_tracker dev_tracker;
89
struct list_head notifier;
90
int loopback;
91
int recv_own_msgs;
92
int fd_frames;
93
int xl_frames;
94
struct can_raw_vcid_options raw_vcid_opts;
95
canid_t tx_vcid_shifted;
96
canid_t rx_vcid_shifted;
97
canid_t rx_vcid_mask_shifted;
98
int join_filters;
99
int count; /* number of active filters */
100
struct can_filter dfilter; /* default/single filter */
101
struct can_filter *filter; /* pointer to filter(s) */
102
can_err_mask_t err_mask;
103
struct uniqframe __percpu *uniq;
104
};
105
106
static LIST_HEAD(raw_notifier_list);
107
static DEFINE_SPINLOCK(raw_notifier_lock);
108
static struct raw_sock *raw_busy_notifier;
109
110
/* Return pointer to store the extra msg flags for raw_recvmsg().
111
* We use the space of one unsigned int beyond the 'struct sockaddr_can'
112
* in skb->cb.
113
*/
114
static inline unsigned int *raw_flags(struct sk_buff *skb)
115
{
116
sock_skb_cb_check_size(sizeof(struct sockaddr_can) +
117
sizeof(unsigned int));
118
119
/* return pointer after struct sockaddr_can */
120
return (unsigned int *)(&((struct sockaddr_can *)skb->cb)[1]);
121
}
122
123
static inline struct raw_sock *raw_sk(const struct sock *sk)
124
{
125
return (struct raw_sock *)sk;
126
}
127
128
static void raw_rcv(struct sk_buff *oskb, void *data)
129
{
130
struct sock *sk = (struct sock *)data;
131
struct raw_sock *ro = raw_sk(sk);
132
enum skb_drop_reason reason;
133
struct sockaddr_can *addr;
134
struct sk_buff *skb;
135
unsigned int *pflags;
136
137
/* check the received tx sock reference */
138
if (!ro->recv_own_msgs && oskb->sk == sk)
139
return;
140
141
/* make sure to not pass oversized frames to the socket */
142
if (!ro->fd_frames && can_is_canfd_skb(oskb))
143
return;
144
145
if (can_is_canxl_skb(oskb)) {
146
struct canxl_frame *cxl = (struct canxl_frame *)oskb->data;
147
148
/* make sure to not pass oversized frames to the socket */
149
if (!ro->xl_frames)
150
return;
151
152
/* filter CAN XL VCID content */
153
if (ro->raw_vcid_opts.flags & CAN_RAW_XL_VCID_RX_FILTER) {
154
/* apply VCID filter if user enabled the filter */
155
if ((cxl->prio & ro->rx_vcid_mask_shifted) !=
156
(ro->rx_vcid_shifted & ro->rx_vcid_mask_shifted))
157
return;
158
} else {
159
/* no filter => do not forward VCID tagged frames */
160
if (cxl->prio & CANXL_VCID_MASK)
161
return;
162
}
163
}
164
165
/* eliminate multiple filter matches for the same skb */
166
if (this_cpu_ptr(ro->uniq)->skb == oskb &&
167
this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) {
168
if (!ro->join_filters)
169
return;
170
171
this_cpu_inc(ro->uniq->join_rx_count);
172
/* drop frame until all enabled filters matched */
173
if (this_cpu_ptr(ro->uniq)->join_rx_count < ro->count)
174
return;
175
} else {
176
this_cpu_ptr(ro->uniq)->skb = oskb;
177
this_cpu_ptr(ro->uniq)->skbcnt = can_skb_prv(oskb)->skbcnt;
178
this_cpu_ptr(ro->uniq)->join_rx_count = 1;
179
/* drop first frame to check all enabled filters? */
180
if (ro->join_filters && ro->count > 1)
181
return;
182
}
183
184
/* clone the given skb to be able to enqueue it into the rcv queue */
185
skb = skb_clone(oskb, GFP_ATOMIC);
186
if (!skb)
187
return;
188
189
/* Put the datagram to the queue so that raw_recvmsg() can get
190
* it from there. We need to pass the interface index to
191
* raw_recvmsg(). We pass a whole struct sockaddr_can in
192
* skb->cb containing the interface index.
193
*/
194
195
sock_skb_cb_check_size(sizeof(struct sockaddr_can));
196
addr = (struct sockaddr_can *)skb->cb;
197
memset(addr, 0, sizeof(*addr));
198
addr->can_family = AF_CAN;
199
addr->can_ifindex = skb->dev->ifindex;
200
201
/* add CAN specific message flags for raw_recvmsg() */
202
pflags = raw_flags(skb);
203
*pflags = 0;
204
if (oskb->sk)
205
*pflags |= MSG_DONTROUTE;
206
if (oskb->sk == sk)
207
*pflags |= MSG_CONFIRM;
208
209
if (sock_queue_rcv_skb_reason(sk, skb, &reason) < 0)
210
sk_skb_reason_drop(sk, skb, reason);
211
}
212
213
static int raw_enable_filters(struct net *net, struct net_device *dev,
214
struct sock *sk, struct can_filter *filter,
215
int count)
216
{
217
int err = 0;
218
int i;
219
220
for (i = 0; i < count; i++) {
221
err = can_rx_register(net, dev, filter[i].can_id,
222
filter[i].can_mask,
223
raw_rcv, sk, "raw", sk);
224
if (err) {
225
/* clean up successfully registered filters */
226
while (--i >= 0)
227
can_rx_unregister(net, dev, filter[i].can_id,
228
filter[i].can_mask,
229
raw_rcv, sk);
230
break;
231
}
232
}
233
234
return err;
235
}
236
237
static int raw_enable_errfilter(struct net *net, struct net_device *dev,
238
struct sock *sk, can_err_mask_t err_mask)
239
{
240
int err = 0;
241
242
if (err_mask)
243
err = can_rx_register(net, dev, 0, err_mask | CAN_ERR_FLAG,
244
raw_rcv, sk, "raw", sk);
245
246
return err;
247
}
248
249
static void raw_disable_filters(struct net *net, struct net_device *dev,
250
struct sock *sk, struct can_filter *filter,
251
int count)
252
{
253
int i;
254
255
for (i = 0; i < count; i++)
256
can_rx_unregister(net, dev, filter[i].can_id,
257
filter[i].can_mask, raw_rcv, sk);
258
}
259
260
static inline void raw_disable_errfilter(struct net *net,
261
struct net_device *dev,
262
struct sock *sk,
263
can_err_mask_t err_mask)
264
265
{
266
if (err_mask)
267
can_rx_unregister(net, dev, 0, err_mask | CAN_ERR_FLAG,
268
raw_rcv, sk);
269
}
270
271
static inline void raw_disable_allfilters(struct net *net,
272
struct net_device *dev,
273
struct sock *sk)
274
{
275
struct raw_sock *ro = raw_sk(sk);
276
277
raw_disable_filters(net, dev, sk, ro->filter, ro->count);
278
raw_disable_errfilter(net, dev, sk, ro->err_mask);
279
}
280
281
static int raw_enable_allfilters(struct net *net, struct net_device *dev,
282
struct sock *sk)
283
{
284
struct raw_sock *ro = raw_sk(sk);
285
int err;
286
287
err = raw_enable_filters(net, dev, sk, ro->filter, ro->count);
288
if (!err) {
289
err = raw_enable_errfilter(net, dev, sk, ro->err_mask);
290
if (err)
291
raw_disable_filters(net, dev, sk, ro->filter,
292
ro->count);
293
}
294
295
return err;
296
}
297
298
static void raw_notify(struct raw_sock *ro, unsigned long msg,
299
struct net_device *dev)
300
{
301
struct sock *sk = &ro->sk;
302
303
if (!net_eq(dev_net(dev), sock_net(sk)))
304
return;
305
306
if (ro->dev != dev)
307
return;
308
309
switch (msg) {
310
case NETDEV_UNREGISTER:
311
lock_sock(sk);
312
/* remove current filters & unregister */
313
if (ro->bound) {
314
raw_disable_allfilters(dev_net(dev), dev, sk);
315
netdev_put(dev, &ro->dev_tracker);
316
}
317
318
if (ro->count > 1)
319
kfree(ro->filter);
320
321
ro->ifindex = 0;
322
ro->bound = 0;
323
ro->dev = NULL;
324
ro->count = 0;
325
release_sock(sk);
326
327
sk->sk_err = ENODEV;
328
if (!sock_flag(sk, SOCK_DEAD))
329
sk_error_report(sk);
330
break;
331
332
case NETDEV_DOWN:
333
sk->sk_err = ENETDOWN;
334
if (!sock_flag(sk, SOCK_DEAD))
335
sk_error_report(sk);
336
break;
337
}
338
}
339
340
static int raw_notifier(struct notifier_block *nb, unsigned long msg,
341
void *ptr)
342
{
343
struct net_device *dev = netdev_notifier_info_to_dev(ptr);
344
345
if (dev->type != ARPHRD_CAN)
346
return NOTIFY_DONE;
347
if (msg != NETDEV_UNREGISTER && msg != NETDEV_DOWN)
348
return NOTIFY_DONE;
349
if (unlikely(raw_busy_notifier)) /* Check for reentrant bug. */
350
return NOTIFY_DONE;
351
352
spin_lock(&raw_notifier_lock);
353
list_for_each_entry(raw_busy_notifier, &raw_notifier_list, notifier) {
354
spin_unlock(&raw_notifier_lock);
355
raw_notify(raw_busy_notifier, msg, dev);
356
spin_lock(&raw_notifier_lock);
357
}
358
raw_busy_notifier = NULL;
359
spin_unlock(&raw_notifier_lock);
360
return NOTIFY_DONE;
361
}
362
363
static int raw_init(struct sock *sk)
364
{
365
struct raw_sock *ro = raw_sk(sk);
366
367
ro->bound = 0;
368
ro->ifindex = 0;
369
ro->dev = NULL;
370
371
/* set default filter to single entry dfilter */
372
ro->dfilter.can_id = 0;
373
ro->dfilter.can_mask = MASK_ALL;
374
ro->filter = &ro->dfilter;
375
ro->count = 1;
376
377
/* set default loopback behaviour */
378
ro->loopback = 1;
379
ro->recv_own_msgs = 0;
380
ro->fd_frames = 0;
381
ro->xl_frames = 0;
382
ro->join_filters = 0;
383
384
/* alloc_percpu provides zero'ed memory */
385
ro->uniq = alloc_percpu(struct uniqframe);
386
if (unlikely(!ro->uniq))
387
return -ENOMEM;
388
389
/* set notifier */
390
spin_lock(&raw_notifier_lock);
391
list_add_tail(&ro->notifier, &raw_notifier_list);
392
spin_unlock(&raw_notifier_lock);
393
394
return 0;
395
}
396
397
static int raw_release(struct socket *sock)
398
{
399
struct sock *sk = sock->sk;
400
struct raw_sock *ro;
401
struct net *net;
402
403
if (!sk)
404
return 0;
405
406
ro = raw_sk(sk);
407
net = sock_net(sk);
408
409
spin_lock(&raw_notifier_lock);
410
while (raw_busy_notifier == ro) {
411
spin_unlock(&raw_notifier_lock);
412
schedule_timeout_uninterruptible(1);
413
spin_lock(&raw_notifier_lock);
414
}
415
list_del(&ro->notifier);
416
spin_unlock(&raw_notifier_lock);
417
418
rtnl_lock();
419
lock_sock(sk);
420
421
/* remove current filters & unregister */
422
if (ro->bound) {
423
if (ro->dev) {
424
raw_disable_allfilters(dev_net(ro->dev), ro->dev, sk);
425
netdev_put(ro->dev, &ro->dev_tracker);
426
} else {
427
raw_disable_allfilters(net, NULL, sk);
428
}
429
}
430
431
if (ro->count > 1)
432
kfree(ro->filter);
433
434
ro->ifindex = 0;
435
ro->bound = 0;
436
ro->dev = NULL;
437
ro->count = 0;
438
free_percpu(ro->uniq);
439
440
sock_orphan(sk);
441
sock->sk = NULL;
442
443
release_sock(sk);
444
rtnl_unlock();
445
446
sock_prot_inuse_add(net, sk->sk_prot, -1);
447
sock_put(sk);
448
449
return 0;
450
}
451
452
static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
453
{
454
struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
455
struct sock *sk = sock->sk;
456
struct raw_sock *ro = raw_sk(sk);
457
struct net_device *dev = NULL;
458
int ifindex;
459
int err = 0;
460
int notify_enetdown = 0;
461
462
if (len < RAW_MIN_NAMELEN)
463
return -EINVAL;
464
if (addr->can_family != AF_CAN)
465
return -EINVAL;
466
467
rtnl_lock();
468
lock_sock(sk);
469
470
if (ro->bound && addr->can_ifindex == ro->ifindex)
471
goto out;
472
473
if (addr->can_ifindex) {
474
dev = dev_get_by_index(sock_net(sk), addr->can_ifindex);
475
if (!dev) {
476
err = -ENODEV;
477
goto out;
478
}
479
if (dev->type != ARPHRD_CAN) {
480
err = -ENODEV;
481
goto out_put_dev;
482
}
483
484
if (!(dev->flags & IFF_UP))
485
notify_enetdown = 1;
486
487
ifindex = dev->ifindex;
488
489
/* filters set by default/setsockopt */
490
err = raw_enable_allfilters(sock_net(sk), dev, sk);
491
if (err)
492
goto out_put_dev;
493
494
} else {
495
ifindex = 0;
496
497
/* filters set by default/setsockopt */
498
err = raw_enable_allfilters(sock_net(sk), NULL, sk);
499
}
500
501
if (!err) {
502
if (ro->bound) {
503
/* unregister old filters */
504
if (ro->dev) {
505
raw_disable_allfilters(dev_net(ro->dev),
506
ro->dev, sk);
507
/* drop reference to old ro->dev */
508
netdev_put(ro->dev, &ro->dev_tracker);
509
} else {
510
raw_disable_allfilters(sock_net(sk), NULL, sk);
511
}
512
}
513
ro->ifindex = ifindex;
514
ro->bound = 1;
515
/* bind() ok -> hold a reference for new ro->dev */
516
ro->dev = dev;
517
if (ro->dev)
518
netdev_hold(ro->dev, &ro->dev_tracker, GFP_KERNEL);
519
}
520
521
out_put_dev:
522
/* remove potential reference from dev_get_by_index() */
523
dev_put(dev);
524
out:
525
release_sock(sk);
526
rtnl_unlock();
527
528
if (notify_enetdown) {
529
sk->sk_err = ENETDOWN;
530
if (!sock_flag(sk, SOCK_DEAD))
531
sk_error_report(sk);
532
}
533
534
return err;
535
}
536
537
static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
538
int peer)
539
{
540
struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
541
struct sock *sk = sock->sk;
542
struct raw_sock *ro = raw_sk(sk);
543
544
if (peer)
545
return -EOPNOTSUPP;
546
547
memset(addr, 0, RAW_MIN_NAMELEN);
548
addr->can_family = AF_CAN;
549
addr->can_ifindex = ro->ifindex;
550
551
return RAW_MIN_NAMELEN;
552
}
553
554
static int raw_setsockopt(struct socket *sock, int level, int optname,
555
sockptr_t optval, unsigned int optlen)
556
{
557
struct sock *sk = sock->sk;
558
struct raw_sock *ro = raw_sk(sk);
559
struct can_filter *filter = NULL; /* dyn. alloc'ed filters */
560
struct can_filter sfilter; /* single filter */
561
struct net_device *dev = NULL;
562
can_err_mask_t err_mask = 0;
563
int fd_frames;
564
int count = 0;
565
int err = 0;
566
567
if (level != SOL_CAN_RAW)
568
return -EINVAL;
569
570
switch (optname) {
571
case CAN_RAW_FILTER:
572
if (optlen % sizeof(struct can_filter) != 0)
573
return -EINVAL;
574
575
if (optlen > CAN_RAW_FILTER_MAX * sizeof(struct can_filter))
576
return -EINVAL;
577
578
count = optlen / sizeof(struct can_filter);
579
580
if (count > 1) {
581
/* filter does not fit into dfilter => alloc space */
582
filter = memdup_sockptr(optval, optlen);
583
if (IS_ERR(filter))
584
return PTR_ERR(filter);
585
} else if (count == 1) {
586
if (copy_from_sockptr(&sfilter, optval, sizeof(sfilter)))
587
return -EFAULT;
588
}
589
590
rtnl_lock();
591
lock_sock(sk);
592
593
dev = ro->dev;
594
if (ro->bound && dev) {
595
if (dev->reg_state != NETREG_REGISTERED) {
596
if (count > 1)
597
kfree(filter);
598
err = -ENODEV;
599
goto out_fil;
600
}
601
}
602
603
if (ro->bound) {
604
/* (try to) register the new filters */
605
if (count == 1)
606
err = raw_enable_filters(sock_net(sk), dev, sk,
607
&sfilter, 1);
608
else
609
err = raw_enable_filters(sock_net(sk), dev, sk,
610
filter, count);
611
if (err) {
612
if (count > 1)
613
kfree(filter);
614
goto out_fil;
615
}
616
617
/* remove old filter registrations */
618
raw_disable_filters(sock_net(sk), dev, sk, ro->filter,
619
ro->count);
620
}
621
622
/* remove old filter space */
623
if (ro->count > 1)
624
kfree(ro->filter);
625
626
/* link new filters to the socket */
627
if (count == 1) {
628
/* copy filter data for single filter */
629
ro->dfilter = sfilter;
630
filter = &ro->dfilter;
631
}
632
ro->filter = filter;
633
ro->count = count;
634
635
out_fil:
636
release_sock(sk);
637
rtnl_unlock();
638
639
break;
640
641
case CAN_RAW_ERR_FILTER:
642
if (optlen != sizeof(err_mask))
643
return -EINVAL;
644
645
if (copy_from_sockptr(&err_mask, optval, optlen))
646
return -EFAULT;
647
648
err_mask &= CAN_ERR_MASK;
649
650
rtnl_lock();
651
lock_sock(sk);
652
653
dev = ro->dev;
654
if (ro->bound && dev) {
655
if (dev->reg_state != NETREG_REGISTERED) {
656
err = -ENODEV;
657
goto out_err;
658
}
659
}
660
661
/* remove current error mask */
662
if (ro->bound) {
663
/* (try to) register the new err_mask */
664
err = raw_enable_errfilter(sock_net(sk), dev, sk,
665
err_mask);
666
667
if (err)
668
goto out_err;
669
670
/* remove old err_mask registration */
671
raw_disable_errfilter(sock_net(sk), dev, sk,
672
ro->err_mask);
673
}
674
675
/* link new err_mask to the socket */
676
ro->err_mask = err_mask;
677
678
out_err:
679
release_sock(sk);
680
rtnl_unlock();
681
682
break;
683
684
case CAN_RAW_LOOPBACK:
685
if (optlen != sizeof(ro->loopback))
686
return -EINVAL;
687
688
if (copy_from_sockptr(&ro->loopback, optval, optlen))
689
return -EFAULT;
690
691
break;
692
693
case CAN_RAW_RECV_OWN_MSGS:
694
if (optlen != sizeof(ro->recv_own_msgs))
695
return -EINVAL;
696
697
if (copy_from_sockptr(&ro->recv_own_msgs, optval, optlen))
698
return -EFAULT;
699
700
break;
701
702
case CAN_RAW_FD_FRAMES:
703
if (optlen != sizeof(fd_frames))
704
return -EINVAL;
705
706
if (copy_from_sockptr(&fd_frames, optval, optlen))
707
return -EFAULT;
708
709
/* Enabling CAN XL includes CAN FD */
710
if (ro->xl_frames && !fd_frames)
711
return -EINVAL;
712
713
ro->fd_frames = fd_frames;
714
break;
715
716
case CAN_RAW_XL_FRAMES:
717
if (optlen != sizeof(ro->xl_frames))
718
return -EINVAL;
719
720
if (copy_from_sockptr(&ro->xl_frames, optval, optlen))
721
return -EFAULT;
722
723
/* Enabling CAN XL includes CAN FD */
724
if (ro->xl_frames)
725
ro->fd_frames = ro->xl_frames;
726
break;
727
728
case CAN_RAW_XL_VCID_OPTS:
729
if (optlen != sizeof(ro->raw_vcid_opts))
730
return -EINVAL;
731
732
if (copy_from_sockptr(&ro->raw_vcid_opts, optval, optlen))
733
return -EFAULT;
734
735
/* prepare 32 bit values for handling in hot path */
736
ro->tx_vcid_shifted = ro->raw_vcid_opts.tx_vcid << CANXL_VCID_OFFSET;
737
ro->rx_vcid_shifted = ro->raw_vcid_opts.rx_vcid << CANXL_VCID_OFFSET;
738
ro->rx_vcid_mask_shifted = ro->raw_vcid_opts.rx_vcid_mask << CANXL_VCID_OFFSET;
739
break;
740
741
case CAN_RAW_JOIN_FILTERS:
742
if (optlen != sizeof(ro->join_filters))
743
return -EINVAL;
744
745
if (copy_from_sockptr(&ro->join_filters, optval, optlen))
746
return -EFAULT;
747
748
break;
749
750
default:
751
return -ENOPROTOOPT;
752
}
753
return err;
754
}
755
756
static int raw_getsockopt(struct socket *sock, int level, int optname,
757
char __user *optval, int __user *optlen)
758
{
759
struct sock *sk = sock->sk;
760
struct raw_sock *ro = raw_sk(sk);
761
int len;
762
void *val;
763
764
if (level != SOL_CAN_RAW)
765
return -EINVAL;
766
if (get_user(len, optlen))
767
return -EFAULT;
768
if (len < 0)
769
return -EINVAL;
770
771
switch (optname) {
772
case CAN_RAW_FILTER: {
773
int err = 0;
774
775
lock_sock(sk);
776
if (ro->count > 0) {
777
int fsize = ro->count * sizeof(struct can_filter);
778
779
/* user space buffer to small for filter list? */
780
if (len < fsize) {
781
/* return -ERANGE and needed space in optlen */
782
err = -ERANGE;
783
if (put_user(fsize, optlen))
784
err = -EFAULT;
785
} else {
786
if (len > fsize)
787
len = fsize;
788
if (copy_to_user(optval, ro->filter, len))
789
err = -EFAULT;
790
}
791
} else {
792
len = 0;
793
}
794
release_sock(sk);
795
796
if (!err)
797
err = put_user(len, optlen);
798
return err;
799
}
800
case CAN_RAW_ERR_FILTER:
801
if (len > sizeof(can_err_mask_t))
802
len = sizeof(can_err_mask_t);
803
val = &ro->err_mask;
804
break;
805
806
case CAN_RAW_LOOPBACK:
807
if (len > sizeof(int))
808
len = sizeof(int);
809
val = &ro->loopback;
810
break;
811
812
case CAN_RAW_RECV_OWN_MSGS:
813
if (len > sizeof(int))
814
len = sizeof(int);
815
val = &ro->recv_own_msgs;
816
break;
817
818
case CAN_RAW_FD_FRAMES:
819
if (len > sizeof(int))
820
len = sizeof(int);
821
val = &ro->fd_frames;
822
break;
823
824
case CAN_RAW_XL_FRAMES:
825
if (len > sizeof(int))
826
len = sizeof(int);
827
val = &ro->xl_frames;
828
break;
829
830
case CAN_RAW_XL_VCID_OPTS: {
831
int err = 0;
832
833
/* user space buffer to small for VCID opts? */
834
if (len < sizeof(ro->raw_vcid_opts)) {
835
/* return -ERANGE and needed space in optlen */
836
err = -ERANGE;
837
if (put_user(sizeof(ro->raw_vcid_opts), optlen))
838
err = -EFAULT;
839
} else {
840
if (len > sizeof(ro->raw_vcid_opts))
841
len = sizeof(ro->raw_vcid_opts);
842
if (copy_to_user(optval, &ro->raw_vcid_opts, len))
843
err = -EFAULT;
844
}
845
if (!err)
846
err = put_user(len, optlen);
847
return err;
848
}
849
case CAN_RAW_JOIN_FILTERS:
850
if (len > sizeof(int))
851
len = sizeof(int);
852
val = &ro->join_filters;
853
break;
854
855
default:
856
return -ENOPROTOOPT;
857
}
858
859
if (put_user(len, optlen))
860
return -EFAULT;
861
if (copy_to_user(optval, val, len))
862
return -EFAULT;
863
return 0;
864
}
865
866
static void raw_put_canxl_vcid(struct raw_sock *ro, struct sk_buff *skb)
867
{
868
struct canxl_frame *cxl = (struct canxl_frame *)skb->data;
869
870
/* sanitize non CAN XL bits */
871
cxl->prio &= (CANXL_PRIO_MASK | CANXL_VCID_MASK);
872
873
/* clear VCID in CAN XL frame if pass through is disabled */
874
if (!(ro->raw_vcid_opts.flags & CAN_RAW_XL_VCID_TX_PASS))
875
cxl->prio &= CANXL_PRIO_MASK;
876
877
/* set VCID in CAN XL frame if enabled */
878
if (ro->raw_vcid_opts.flags & CAN_RAW_XL_VCID_TX_SET) {
879
cxl->prio &= CANXL_PRIO_MASK;
880
cxl->prio |= ro->tx_vcid_shifted;
881
}
882
}
883
884
static unsigned int raw_check_txframe(struct raw_sock *ro, struct sk_buff *skb, int mtu)
885
{
886
/* Classical CAN -> no checks for flags and device capabilities */
887
if (can_is_can_skb(skb))
888
return CAN_MTU;
889
890
/* CAN FD -> needs to be enabled and a CAN FD or CAN XL device */
891
if (ro->fd_frames && can_is_canfd_skb(skb) &&
892
(mtu == CANFD_MTU || can_is_canxl_dev_mtu(mtu)))
893
return CANFD_MTU;
894
895
/* CAN XL -> needs to be enabled and a CAN XL device */
896
if (ro->xl_frames && can_is_canxl_skb(skb) &&
897
can_is_canxl_dev_mtu(mtu))
898
return CANXL_MTU;
899
900
return 0;
901
}
902
903
static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
904
{
905
struct sock *sk = sock->sk;
906
struct raw_sock *ro = raw_sk(sk);
907
struct sockcm_cookie sockc;
908
struct sk_buff *skb;
909
struct net_device *dev;
910
unsigned int txmtu;
911
int ifindex;
912
int err = -EINVAL;
913
914
/* check for valid CAN frame sizes */
915
if (size < CANXL_HDR_SIZE + CANXL_MIN_DLEN || size > CANXL_MTU)
916
return -EINVAL;
917
918
if (msg->msg_name) {
919
DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
920
921
if (msg->msg_namelen < RAW_MIN_NAMELEN)
922
return -EINVAL;
923
924
if (addr->can_family != AF_CAN)
925
return -EINVAL;
926
927
ifindex = addr->can_ifindex;
928
} else {
929
ifindex = ro->ifindex;
930
}
931
932
dev = dev_get_by_index(sock_net(sk), ifindex);
933
if (!dev)
934
return -ENXIO;
935
936
skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv),
937
msg->msg_flags & MSG_DONTWAIT, &err);
938
if (!skb)
939
goto put_dev;
940
941
can_skb_reserve(skb);
942
can_skb_prv(skb)->ifindex = dev->ifindex;
943
can_skb_prv(skb)->skbcnt = 0;
944
945
/* fill the skb before testing for valid CAN frames */
946
err = memcpy_from_msg(skb_put(skb, size), msg, size);
947
if (err < 0)
948
goto free_skb;
949
950
err = -EINVAL;
951
952
/* check for valid CAN (CC/FD/XL) frame content */
953
txmtu = raw_check_txframe(ro, skb, dev->mtu);
954
if (!txmtu)
955
goto free_skb;
956
957
/* only CANXL: clear/forward/set VCID value */
958
if (txmtu == CANXL_MTU)
959
raw_put_canxl_vcid(ro, skb);
960
961
sockcm_init(&sockc, sk);
962
if (msg->msg_controllen) {
963
err = sock_cmsg_send(sk, msg, &sockc);
964
if (unlikely(err))
965
goto free_skb;
966
}
967
968
skb->dev = dev;
969
skb->priority = sockc.priority;
970
skb->mark = sockc.mark;
971
skb->tstamp = sockc.transmit_time;
972
973
skb_setup_tx_timestamp(skb, &sockc);
974
975
err = can_send(skb, ro->loopback);
976
977
dev_put(dev);
978
979
if (err)
980
goto send_failed;
981
982
return size;
983
984
free_skb:
985
kfree_skb(skb);
986
put_dev:
987
dev_put(dev);
988
send_failed:
989
return err;
990
}
991
992
static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
993
int flags)
994
{
995
struct sock *sk = sock->sk;
996
struct sk_buff *skb;
997
int err = 0;
998
999
if (flags & MSG_ERRQUEUE)
1000
return sock_recv_errqueue(sk, msg, size,
1001
SOL_CAN_RAW, SCM_CAN_RAW_ERRQUEUE);
1002
1003
skb = skb_recv_datagram(sk, flags, &err);
1004
if (!skb)
1005
return err;
1006
1007
if (size < skb->len)
1008
msg->msg_flags |= MSG_TRUNC;
1009
else
1010
size = skb->len;
1011
1012
err = memcpy_to_msg(msg, skb->data, size);
1013
if (err < 0) {
1014
skb_free_datagram(sk, skb);
1015
return err;
1016
}
1017
1018
sock_recv_cmsgs(msg, sk, skb);
1019
1020
if (msg->msg_name) {
1021
__sockaddr_check_size(RAW_MIN_NAMELEN);
1022
msg->msg_namelen = RAW_MIN_NAMELEN;
1023
memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
1024
}
1025
1026
/* assign the flags that have been recorded in raw_rcv() */
1027
msg->msg_flags |= *(raw_flags(skb));
1028
1029
skb_free_datagram(sk, skb);
1030
1031
return size;
1032
}
1033
1034
static int raw_sock_no_ioctlcmd(struct socket *sock, unsigned int cmd,
1035
unsigned long arg)
1036
{
1037
/* no ioctls for socket layer -> hand it down to NIC layer */
1038
return -ENOIOCTLCMD;
1039
}
1040
1041
static const struct proto_ops raw_ops = {
1042
.family = PF_CAN,
1043
.release = raw_release,
1044
.bind = raw_bind,
1045
.connect = sock_no_connect,
1046
.socketpair = sock_no_socketpair,
1047
.accept = sock_no_accept,
1048
.getname = raw_getname,
1049
.poll = datagram_poll,
1050
.ioctl = raw_sock_no_ioctlcmd,
1051
.gettstamp = sock_gettstamp,
1052
.listen = sock_no_listen,
1053
.shutdown = sock_no_shutdown,
1054
.setsockopt = raw_setsockopt,
1055
.getsockopt = raw_getsockopt,
1056
.sendmsg = raw_sendmsg,
1057
.recvmsg = raw_recvmsg,
1058
.mmap = sock_no_mmap,
1059
};
1060
1061
static struct proto raw_proto __read_mostly = {
1062
.name = "CAN_RAW",
1063
.owner = THIS_MODULE,
1064
.obj_size = sizeof(struct raw_sock),
1065
.init = raw_init,
1066
};
1067
1068
static const struct can_proto raw_can_proto = {
1069
.type = SOCK_RAW,
1070
.protocol = CAN_RAW,
1071
.ops = &raw_ops,
1072
.prot = &raw_proto,
1073
};
1074
1075
static struct notifier_block canraw_notifier = {
1076
.notifier_call = raw_notifier
1077
};
1078
1079
static __init int raw_module_init(void)
1080
{
1081
int err;
1082
1083
pr_info("can: raw protocol\n");
1084
1085
err = register_netdevice_notifier(&canraw_notifier);
1086
if (err)
1087
return err;
1088
1089
err = can_proto_register(&raw_can_proto);
1090
if (err < 0) {
1091
pr_err("can: registration of raw protocol failed\n");
1092
goto register_proto_failed;
1093
}
1094
1095
return 0;
1096
1097
register_proto_failed:
1098
unregister_netdevice_notifier(&canraw_notifier);
1099
return err;
1100
}
1101
1102
static __exit void raw_module_exit(void)
1103
{
1104
can_proto_unregister(&raw_can_proto);
1105
unregister_netdevice_notifier(&canraw_notifier);
1106
}
1107
1108
module_init(raw_module_init);
1109
module_exit(raw_module_exit);
1110
1111