Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/net/can/raw.c
29269 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
const struct sk_buff *skb;
79
int skbcnt;
80
unsigned int join_rx_count;
81
};
82
83
struct raw_sock {
84
struct sock sk;
85
struct net_device *dev;
86
netdevice_tracker dev_tracker;
87
struct list_head notifier;
88
int ifindex;
89
unsigned int bound:1;
90
unsigned int loopback:1;
91
unsigned int recv_own_msgs:1;
92
unsigned int fd_frames:1;
93
unsigned int xl_frames:1;
94
unsigned int join_filters:1;
95
struct can_raw_vcid_options raw_vcid_opts;
96
canid_t tx_vcid_shifted;
97
canid_t rx_vcid_shifted;
98
canid_t rx_vcid_mask_shifted;
99
can_err_mask_t err_mask;
100
int count; /* number of active filters */
101
struct can_filter dfilter; /* default/single filter */
102
struct can_filter *filter; /* pointer to filter(s) */
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 count = 0;
564
int flag;
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(flag))
686
return -EINVAL;
687
688
if (copy_from_sockptr(&flag, optval, optlen))
689
return -EFAULT;
690
691
ro->loopback = !!flag;
692
break;
693
694
case CAN_RAW_RECV_OWN_MSGS:
695
if (optlen != sizeof(flag))
696
return -EINVAL;
697
698
if (copy_from_sockptr(&flag, optval, optlen))
699
return -EFAULT;
700
701
ro->recv_own_msgs = !!flag;
702
break;
703
704
case CAN_RAW_FD_FRAMES:
705
if (optlen != sizeof(flag))
706
return -EINVAL;
707
708
if (copy_from_sockptr(&flag, optval, optlen))
709
return -EFAULT;
710
711
/* Enabling CAN XL includes CAN FD */
712
if (ro->xl_frames && !flag)
713
return -EINVAL;
714
715
ro->fd_frames = !!flag;
716
break;
717
718
case CAN_RAW_XL_FRAMES:
719
if (optlen != sizeof(flag))
720
return -EINVAL;
721
722
if (copy_from_sockptr(&flag, optval, optlen))
723
return -EFAULT;
724
725
ro->xl_frames = !!flag;
726
727
/* Enabling CAN XL includes CAN FD */
728
if (ro->xl_frames)
729
ro->fd_frames = ro->xl_frames;
730
break;
731
732
case CAN_RAW_XL_VCID_OPTS:
733
if (optlen != sizeof(ro->raw_vcid_opts))
734
return -EINVAL;
735
736
if (copy_from_sockptr(&ro->raw_vcid_opts, optval, optlen))
737
return -EFAULT;
738
739
/* prepare 32 bit values for handling in hot path */
740
ro->tx_vcid_shifted = ro->raw_vcid_opts.tx_vcid << CANXL_VCID_OFFSET;
741
ro->rx_vcid_shifted = ro->raw_vcid_opts.rx_vcid << CANXL_VCID_OFFSET;
742
ro->rx_vcid_mask_shifted = ro->raw_vcid_opts.rx_vcid_mask << CANXL_VCID_OFFSET;
743
break;
744
745
case CAN_RAW_JOIN_FILTERS:
746
if (optlen != sizeof(flag))
747
return -EINVAL;
748
749
if (copy_from_sockptr(&flag, optval, optlen))
750
return -EFAULT;
751
752
ro->join_filters = !!flag;
753
break;
754
755
default:
756
return -ENOPROTOOPT;
757
}
758
return err;
759
}
760
761
static int raw_getsockopt(struct socket *sock, int level, int optname,
762
char __user *optval, int __user *optlen)
763
{
764
struct sock *sk = sock->sk;
765
struct raw_sock *ro = raw_sk(sk);
766
int flag;
767
int len;
768
void *val;
769
770
if (level != SOL_CAN_RAW)
771
return -EINVAL;
772
if (get_user(len, optlen))
773
return -EFAULT;
774
if (len < 0)
775
return -EINVAL;
776
777
switch (optname) {
778
case CAN_RAW_FILTER: {
779
int err = 0;
780
781
lock_sock(sk);
782
if (ro->count > 0) {
783
int fsize = ro->count * sizeof(struct can_filter);
784
785
/* user space buffer to small for filter list? */
786
if (len < fsize) {
787
/* return -ERANGE and needed space in optlen */
788
err = -ERANGE;
789
if (put_user(fsize, optlen))
790
err = -EFAULT;
791
} else {
792
if (len > fsize)
793
len = fsize;
794
if (copy_to_user(optval, ro->filter, len))
795
err = -EFAULT;
796
}
797
} else {
798
len = 0;
799
}
800
release_sock(sk);
801
802
if (!err)
803
err = put_user(len, optlen);
804
return err;
805
}
806
case CAN_RAW_ERR_FILTER:
807
if (len > sizeof(can_err_mask_t))
808
len = sizeof(can_err_mask_t);
809
val = &ro->err_mask;
810
break;
811
812
case CAN_RAW_LOOPBACK:
813
if (len > sizeof(int))
814
len = sizeof(int);
815
flag = ro->loopback;
816
val = &flag;
817
break;
818
819
case CAN_RAW_RECV_OWN_MSGS:
820
if (len > sizeof(int))
821
len = sizeof(int);
822
flag = ro->recv_own_msgs;
823
val = &flag;
824
break;
825
826
case CAN_RAW_FD_FRAMES:
827
if (len > sizeof(int))
828
len = sizeof(int);
829
flag = ro->fd_frames;
830
val = &flag;
831
break;
832
833
case CAN_RAW_XL_FRAMES:
834
if (len > sizeof(int))
835
len = sizeof(int);
836
flag = ro->xl_frames;
837
val = &flag;
838
break;
839
840
case CAN_RAW_XL_VCID_OPTS: {
841
int err = 0;
842
843
/* user space buffer to small for VCID opts? */
844
if (len < sizeof(ro->raw_vcid_opts)) {
845
/* return -ERANGE and needed space in optlen */
846
err = -ERANGE;
847
if (put_user(sizeof(ro->raw_vcid_opts), optlen))
848
err = -EFAULT;
849
} else {
850
if (len > sizeof(ro->raw_vcid_opts))
851
len = sizeof(ro->raw_vcid_opts);
852
if (copy_to_user(optval, &ro->raw_vcid_opts, len))
853
err = -EFAULT;
854
}
855
if (!err)
856
err = put_user(len, optlen);
857
return err;
858
}
859
case CAN_RAW_JOIN_FILTERS:
860
if (len > sizeof(int))
861
len = sizeof(int);
862
flag = ro->join_filters;
863
val = &flag;
864
break;
865
866
default:
867
return -ENOPROTOOPT;
868
}
869
870
if (put_user(len, optlen))
871
return -EFAULT;
872
if (copy_to_user(optval, val, len))
873
return -EFAULT;
874
return 0;
875
}
876
877
static void raw_put_canxl_vcid(struct raw_sock *ro, struct sk_buff *skb)
878
{
879
struct canxl_frame *cxl = (struct canxl_frame *)skb->data;
880
881
/* sanitize non CAN XL bits */
882
cxl->prio &= (CANXL_PRIO_MASK | CANXL_VCID_MASK);
883
884
/* clear VCID in CAN XL frame if pass through is disabled */
885
if (!(ro->raw_vcid_opts.flags & CAN_RAW_XL_VCID_TX_PASS))
886
cxl->prio &= CANXL_PRIO_MASK;
887
888
/* set VCID in CAN XL frame if enabled */
889
if (ro->raw_vcid_opts.flags & CAN_RAW_XL_VCID_TX_SET) {
890
cxl->prio &= CANXL_PRIO_MASK;
891
cxl->prio |= ro->tx_vcid_shifted;
892
}
893
}
894
895
static unsigned int raw_check_txframe(struct raw_sock *ro, struct sk_buff *skb, int mtu)
896
{
897
/* Classical CAN -> no checks for flags and device capabilities */
898
if (can_is_can_skb(skb))
899
return CAN_MTU;
900
901
/* CAN FD -> needs to be enabled and a CAN FD or CAN XL device */
902
if (ro->fd_frames && can_is_canfd_skb(skb) &&
903
(mtu == CANFD_MTU || can_is_canxl_dev_mtu(mtu)))
904
return CANFD_MTU;
905
906
/* CAN XL -> needs to be enabled and a CAN XL device */
907
if (ro->xl_frames && can_is_canxl_skb(skb) &&
908
can_is_canxl_dev_mtu(mtu))
909
return CANXL_MTU;
910
911
return 0;
912
}
913
914
static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
915
{
916
struct sock *sk = sock->sk;
917
struct raw_sock *ro = raw_sk(sk);
918
struct sockcm_cookie sockc;
919
struct sk_buff *skb;
920
struct net_device *dev;
921
unsigned int txmtu;
922
int ifindex;
923
int err = -EINVAL;
924
925
/* check for valid CAN frame sizes */
926
if (size < CANXL_HDR_SIZE + CANXL_MIN_DLEN || size > CANXL_MTU)
927
return -EINVAL;
928
929
if (msg->msg_name) {
930
DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
931
932
if (msg->msg_namelen < RAW_MIN_NAMELEN)
933
return -EINVAL;
934
935
if (addr->can_family != AF_CAN)
936
return -EINVAL;
937
938
ifindex = addr->can_ifindex;
939
} else {
940
ifindex = ro->ifindex;
941
}
942
943
dev = dev_get_by_index(sock_net(sk), ifindex);
944
if (!dev)
945
return -ENXIO;
946
947
skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv),
948
msg->msg_flags & MSG_DONTWAIT, &err);
949
if (!skb)
950
goto put_dev;
951
952
can_skb_reserve(skb);
953
can_skb_prv(skb)->ifindex = dev->ifindex;
954
can_skb_prv(skb)->skbcnt = 0;
955
956
/* fill the skb before testing for valid CAN frames */
957
err = memcpy_from_msg(skb_put(skb, size), msg, size);
958
if (err < 0)
959
goto free_skb;
960
961
err = -EINVAL;
962
963
/* check for valid CAN (CC/FD/XL) frame content */
964
txmtu = raw_check_txframe(ro, skb, READ_ONCE(dev->mtu));
965
if (!txmtu)
966
goto free_skb;
967
968
/* only CANXL: clear/forward/set VCID value */
969
if (txmtu == CANXL_MTU)
970
raw_put_canxl_vcid(ro, skb);
971
972
sockcm_init(&sockc, sk);
973
if (msg->msg_controllen) {
974
err = sock_cmsg_send(sk, msg, &sockc);
975
if (unlikely(err))
976
goto free_skb;
977
}
978
979
skb->dev = dev;
980
skb->priority = sockc.priority;
981
skb->mark = sockc.mark;
982
skb->tstamp = sockc.transmit_time;
983
984
skb_setup_tx_timestamp(skb, &sockc);
985
986
err = can_send(skb, ro->loopback);
987
988
dev_put(dev);
989
990
if (err)
991
goto send_failed;
992
993
return size;
994
995
free_skb:
996
kfree_skb(skb);
997
put_dev:
998
dev_put(dev);
999
send_failed:
1000
return err;
1001
}
1002
1003
static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
1004
int flags)
1005
{
1006
struct sock *sk = sock->sk;
1007
struct sk_buff *skb;
1008
int err = 0;
1009
1010
if (flags & MSG_ERRQUEUE)
1011
return sock_recv_errqueue(sk, msg, size,
1012
SOL_CAN_RAW, SCM_CAN_RAW_ERRQUEUE);
1013
1014
skb = skb_recv_datagram(sk, flags, &err);
1015
if (!skb)
1016
return err;
1017
1018
if (size < skb->len)
1019
msg->msg_flags |= MSG_TRUNC;
1020
else
1021
size = skb->len;
1022
1023
err = memcpy_to_msg(msg, skb->data, size);
1024
if (err < 0) {
1025
skb_free_datagram(sk, skb);
1026
return err;
1027
}
1028
1029
sock_recv_cmsgs(msg, sk, skb);
1030
1031
if (msg->msg_name) {
1032
__sockaddr_check_size(RAW_MIN_NAMELEN);
1033
msg->msg_namelen = RAW_MIN_NAMELEN;
1034
memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
1035
}
1036
1037
/* assign the flags that have been recorded in raw_rcv() */
1038
msg->msg_flags |= *(raw_flags(skb));
1039
1040
skb_free_datagram(sk, skb);
1041
1042
return size;
1043
}
1044
1045
static int raw_sock_no_ioctlcmd(struct socket *sock, unsigned int cmd,
1046
unsigned long arg)
1047
{
1048
/* no ioctls for socket layer -> hand it down to NIC layer */
1049
return -ENOIOCTLCMD;
1050
}
1051
1052
static const struct proto_ops raw_ops = {
1053
.family = PF_CAN,
1054
.release = raw_release,
1055
.bind = raw_bind,
1056
.connect = sock_no_connect,
1057
.socketpair = sock_no_socketpair,
1058
.accept = sock_no_accept,
1059
.getname = raw_getname,
1060
.poll = datagram_poll,
1061
.ioctl = raw_sock_no_ioctlcmd,
1062
.gettstamp = sock_gettstamp,
1063
.listen = sock_no_listen,
1064
.shutdown = sock_no_shutdown,
1065
.setsockopt = raw_setsockopt,
1066
.getsockopt = raw_getsockopt,
1067
.sendmsg = raw_sendmsg,
1068
.recvmsg = raw_recvmsg,
1069
.mmap = sock_no_mmap,
1070
};
1071
1072
static struct proto raw_proto __read_mostly = {
1073
.name = "CAN_RAW",
1074
.owner = THIS_MODULE,
1075
.obj_size = sizeof(struct raw_sock),
1076
.init = raw_init,
1077
};
1078
1079
static const struct can_proto raw_can_proto = {
1080
.type = SOCK_RAW,
1081
.protocol = CAN_RAW,
1082
.ops = &raw_ops,
1083
.prot = &raw_proto,
1084
};
1085
1086
static struct notifier_block canraw_notifier = {
1087
.notifier_call = raw_notifier
1088
};
1089
1090
static __init int raw_module_init(void)
1091
{
1092
int err;
1093
1094
pr_info("can: raw protocol\n");
1095
1096
err = register_netdevice_notifier(&canraw_notifier);
1097
if (err)
1098
return err;
1099
1100
err = can_proto_register(&raw_can_proto);
1101
if (err < 0) {
1102
pr_err("can: registration of raw protocol failed\n");
1103
goto register_proto_failed;
1104
}
1105
1106
return 0;
1107
1108
register_proto_failed:
1109
unregister_netdevice_notifier(&canraw_notifier);
1110
return err;
1111
}
1112
1113
static __exit void raw_module_exit(void)
1114
{
1115
can_proto_unregister(&raw_can_proto);
1116
unregister_netdevice_notifier(&canraw_notifier);
1117
}
1118
1119
module_init(raw_module_init);
1120
module_exit(raw_module_exit);
1121
1122