1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38#include <linux/module.h>
39#include <linux/moduleparam.h>
40
41#include <linux/uaccess.h>
42#include <linux/bitops.h>
43#include <linux/string.h>
44#include <linux/tty.h>
45#include <linux/errno.h>
46#include <linux/netdevice.h>
47#include <linux/skbuff.h>
48#include <linux/rtnetlink.h>
49#include <linux/if_arp.h>
50#include <linux/if_ether.h>
51#include <linux/sched.h>
52#include <linux/delay.h>
53#include <linux/init.h>
54#include <linux/kernel.h>
55#include <linux/workqueue.h>
56#include <linux/can.h>
57#include <linux/can/skb.h>
58
59MODULE_ALIAS_LDISC(N_SLCAN);
60MODULE_DESCRIPTION("serial line CAN interface");
61MODULE_LICENSE("GPL");
62MODULE_AUTHOR("Oliver Hartkopp <socketcan@hartkopp.net>");
63
64#define SLCAN_MAGIC 0x53CA
65
66static int maxdev = 10;
67
68
69module_param(maxdev, int, 0);
70MODULE_PARM_DESC(maxdev, "Maximum number of slcan interfaces");
71
72
73#define SLC_MTU (sizeof("T1111222281122334455667788EA5F\r")+1)
74
75#define SLC_CMD_LEN 1
76#define SLC_SFF_ID_LEN 3
77#define SLC_EFF_ID_LEN 8
78
79struct slcan {
80 int magic;
81
82
83 struct tty_struct *tty;
84 struct net_device *dev;
85 spinlock_t lock;
86 struct work_struct tx_work;
87
88
89 unsigned char rbuff[SLC_MTU];
90 int rcount;
91 unsigned char xbuff[SLC_MTU];
92 unsigned char *xhead;
93 int xleft;
94
95 unsigned long flags;
96#define SLF_INUSE 0
97#define SLF_ERROR 1
98};
99
100static struct net_device **slcan_devs;
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142static void slc_bump(struct slcan *sl)
143{
144 struct sk_buff *skb;
145 struct can_frame cf;
146 int i, tmp;
147 u32 tmpid;
148 char *cmd = sl->rbuff;
149
150 cf.can_id = 0;
151
152 switch (*cmd) {
153 case 'r':
154 cf.can_id = CAN_RTR_FLAG;
155
156 case 't':
157
158 cf.can_dlc = sl->rbuff[SLC_CMD_LEN + SLC_SFF_ID_LEN];
159 sl->rbuff[SLC_CMD_LEN + SLC_SFF_ID_LEN] = 0;
160
161 cmd += SLC_CMD_LEN + SLC_SFF_ID_LEN + 1;
162 break;
163 case 'R':
164 cf.can_id = CAN_RTR_FLAG;
165
166 case 'T':
167 cf.can_id |= CAN_EFF_FLAG;
168
169 cf.can_dlc = sl->rbuff[SLC_CMD_LEN + SLC_EFF_ID_LEN];
170 sl->rbuff[SLC_CMD_LEN + SLC_EFF_ID_LEN] = 0;
171
172 cmd += SLC_CMD_LEN + SLC_EFF_ID_LEN + 1;
173 break;
174 default:
175 return;
176 }
177
178 if (kstrtou32(sl->rbuff + SLC_CMD_LEN, 16, &tmpid))
179 return;
180
181 cf.can_id |= tmpid;
182
183
184 if (cf.can_dlc >= '0' && cf.can_dlc < '9')
185 cf.can_dlc -= '0';
186 else
187 return;
188
189 *(u64 *) (&cf.data) = 0;
190
191
192 if (!(cf.can_id & CAN_RTR_FLAG)) {
193 for (i = 0; i < cf.can_dlc; i++) {
194 tmp = hex_to_bin(*cmd++);
195 if (tmp < 0)
196 return;
197 cf.data[i] = (tmp << 4);
198 tmp = hex_to_bin(*cmd++);
199 if (tmp < 0)
200 return;
201 cf.data[i] |= tmp;
202 }
203 }
204
205 skb = dev_alloc_skb(sizeof(struct can_frame) +
206 sizeof(struct can_skb_priv));
207 if (!skb)
208 return;
209
210 skb->dev = sl->dev;
211 skb->protocol = htons(ETH_P_CAN);
212 skb->pkt_type = PACKET_BROADCAST;
213 skb->ip_summed = CHECKSUM_UNNECESSARY;
214
215 can_skb_reserve(skb);
216 can_skb_prv(skb)->ifindex = sl->dev->ifindex;
217 can_skb_prv(skb)->skbcnt = 0;
218
219 skb_put_data(skb, &cf, sizeof(struct can_frame));
220
221 sl->dev->stats.rx_packets++;
222 sl->dev->stats.rx_bytes += cf.can_dlc;
223 netif_rx_ni(skb);
224}
225
226
227static void slcan_unesc(struct slcan *sl, unsigned char s)
228{
229 if ((s == '\r') || (s == '\a')) {
230 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) &&
231 (sl->rcount > 4)) {
232 slc_bump(sl);
233 }
234 sl->rcount = 0;
235 } else {
236 if (!test_bit(SLF_ERROR, &sl->flags)) {
237 if (sl->rcount < SLC_MTU) {
238 sl->rbuff[sl->rcount++] = s;
239 return;
240 } else {
241 sl->dev->stats.rx_over_errors++;
242 set_bit(SLF_ERROR, &sl->flags);
243 }
244 }
245 }
246}
247
248
249
250
251
252
253static void slc_encaps(struct slcan *sl, struct can_frame *cf)
254{
255 int actual, i;
256 unsigned char *pos;
257 unsigned char *endpos;
258 canid_t id = cf->can_id;
259
260 pos = sl->xbuff;
261
262 if (cf->can_id & CAN_RTR_FLAG)
263 *pos = 'R';
264 else
265 *pos = 'T';
266
267
268 if (cf->can_id & CAN_EFF_FLAG) {
269 id &= CAN_EFF_MASK;
270 endpos = pos + SLC_EFF_ID_LEN;
271 } else {
272 *pos |= 0x20;
273 id &= CAN_SFF_MASK;
274 endpos = pos + SLC_SFF_ID_LEN;
275 }
276
277
278 pos++;
279 while (endpos >= pos) {
280 *endpos-- = hex_asc_upper[id & 0xf];
281 id >>= 4;
282 }
283
284 pos += (cf->can_id & CAN_EFF_FLAG) ? SLC_EFF_ID_LEN : SLC_SFF_ID_LEN;
285
286 *pos++ = cf->can_dlc + '0';
287
288
289 if (!(cf->can_id & CAN_RTR_FLAG)) {
290 for (i = 0; i < cf->can_dlc; i++)
291 pos = hex_byte_pack_upper(pos, cf->data[i]);
292 }
293
294 *pos++ = '\r';
295
296
297
298
299
300
301
302
303
304 set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
305 actual = sl->tty->ops->write(sl->tty, sl->xbuff, pos - sl->xbuff);
306 sl->xleft = (pos - sl->xbuff) - actual;
307 sl->xhead = sl->xbuff + actual;
308 sl->dev->stats.tx_bytes += cf->can_dlc;
309}
310
311
312static void slcan_transmit(struct work_struct *work)
313{
314 struct slcan *sl = container_of(work, struct slcan, tx_work);
315 int actual;
316
317 spin_lock_bh(&sl->lock);
318
319 if (!sl->tty || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev)) {
320 spin_unlock_bh(&sl->lock);
321 return;
322 }
323
324 if (sl->xleft <= 0) {
325
326
327 sl->dev->stats.tx_packets++;
328 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
329 spin_unlock_bh(&sl->lock);
330 netif_wake_queue(sl->dev);
331 return;
332 }
333
334 actual = sl->tty->ops->write(sl->tty, sl->xhead, sl->xleft);
335 sl->xleft -= actual;
336 sl->xhead += actual;
337 spin_unlock_bh(&sl->lock);
338}
339
340
341
342
343
344static void slcan_write_wakeup(struct tty_struct *tty)
345{
346 struct slcan *sl = tty->disc_data;
347
348 schedule_work(&sl->tx_work);
349}
350
351
352static netdev_tx_t slc_xmit(struct sk_buff *skb, struct net_device *dev)
353{
354 struct slcan *sl = netdev_priv(dev);
355
356 if (skb->len != CAN_MTU)
357 goto out;
358
359 spin_lock(&sl->lock);
360 if (!netif_running(dev)) {
361 spin_unlock(&sl->lock);
362 printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name);
363 goto out;
364 }
365 if (sl->tty == NULL) {
366 spin_unlock(&sl->lock);
367 goto out;
368 }
369
370 netif_stop_queue(sl->dev);
371 slc_encaps(sl, (struct can_frame *) skb->data);
372 spin_unlock(&sl->lock);
373
374out:
375 kfree_skb(skb);
376 return NETDEV_TX_OK;
377}
378
379
380
381
382
383
384
385static int slc_close(struct net_device *dev)
386{
387 struct slcan *sl = netdev_priv(dev);
388
389 spin_lock_bh(&sl->lock);
390 if (sl->tty) {
391
392 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
393 }
394 netif_stop_queue(dev);
395 sl->rcount = 0;
396 sl->xleft = 0;
397 spin_unlock_bh(&sl->lock);
398
399 return 0;
400}
401
402
403static int slc_open(struct net_device *dev)
404{
405 struct slcan *sl = netdev_priv(dev);
406
407 if (sl->tty == NULL)
408 return -ENODEV;
409
410 sl->flags &= (1 << SLF_INUSE);
411 netif_start_queue(dev);
412 return 0;
413}
414
415
416static void slc_free_netdev(struct net_device *dev)
417{
418 int i = dev->base_addr;
419
420 slcan_devs[i] = NULL;
421}
422
423static int slcan_change_mtu(struct net_device *dev, int new_mtu)
424{
425 return -EINVAL;
426}
427
428static const struct net_device_ops slc_netdev_ops = {
429 .ndo_open = slc_open,
430 .ndo_stop = slc_close,
431 .ndo_start_xmit = slc_xmit,
432 .ndo_change_mtu = slcan_change_mtu,
433};
434
435static void slc_setup(struct net_device *dev)
436{
437 dev->netdev_ops = &slc_netdev_ops;
438 dev->needs_free_netdev = true;
439 dev->priv_destructor = slc_free_netdev;
440
441 dev->hard_header_len = 0;
442 dev->addr_len = 0;
443 dev->tx_queue_len = 10;
444
445 dev->mtu = CAN_MTU;
446 dev->type = ARPHRD_CAN;
447
448
449 dev->flags = IFF_NOARP;
450 dev->features = NETIF_F_HW_CSUM;
451}
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466static void slcan_receive_buf(struct tty_struct *tty,
467 const unsigned char *cp, char *fp, int count)
468{
469 struct slcan *sl = (struct slcan *) tty->disc_data;
470
471 if (!sl || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev))
472 return;
473
474
475 while (count--) {
476 if (fp && *fp++) {
477 if (!test_and_set_bit(SLF_ERROR, &sl->flags))
478 sl->dev->stats.rx_errors++;
479 cp++;
480 continue;
481 }
482 slcan_unesc(sl, *cp++);
483 }
484}
485
486
487
488
489
490
491static void slc_sync(void)
492{
493 int i;
494 struct net_device *dev;
495 struct slcan *sl;
496
497 for (i = 0; i < maxdev; i++) {
498 dev = slcan_devs[i];
499 if (dev == NULL)
500 break;
501
502 sl = netdev_priv(dev);
503 if (sl->tty)
504 continue;
505 if (dev->flags & IFF_UP)
506 dev_close(dev);
507 }
508}
509
510
511static struct slcan *slc_alloc(dev_t line)
512{
513 int i;
514 char name[IFNAMSIZ];
515 struct net_device *dev = NULL;
516 struct slcan *sl;
517
518 for (i = 0; i < maxdev; i++) {
519 dev = slcan_devs[i];
520 if (dev == NULL)
521 break;
522
523 }
524
525
526 if (i >= maxdev)
527 return NULL;
528
529 sprintf(name, "slcan%d", i);
530 dev = alloc_netdev(sizeof(*sl), name, NET_NAME_UNKNOWN, slc_setup);
531 if (!dev)
532 return NULL;
533
534 dev->base_addr = i;
535 sl = netdev_priv(dev);
536
537
538 sl->magic = SLCAN_MAGIC;
539 sl->dev = dev;
540 spin_lock_init(&sl->lock);
541 INIT_WORK(&sl->tx_work, slcan_transmit);
542 slcan_devs[i] = dev;
543
544 return sl;
545}
546
547
548
549
550
551
552
553
554
555
556
557static int slcan_open(struct tty_struct *tty)
558{
559 struct slcan *sl;
560 int err;
561
562 if (!capable(CAP_NET_ADMIN))
563 return -EPERM;
564
565 if (tty->ops->write == NULL)
566 return -EOPNOTSUPP;
567
568
569
570
571
572 rtnl_lock();
573
574
575 slc_sync();
576
577 sl = tty->disc_data;
578
579 err = -EEXIST;
580
581 if (sl && sl->magic == SLCAN_MAGIC)
582 goto err_exit;
583
584
585 err = -ENFILE;
586 sl = slc_alloc(tty_devnum(tty));
587 if (sl == NULL)
588 goto err_exit;
589
590 sl->tty = tty;
591 tty->disc_data = sl;
592
593 if (!test_bit(SLF_INUSE, &sl->flags)) {
594
595 sl->rcount = 0;
596 sl->xleft = 0;
597
598 set_bit(SLF_INUSE, &sl->flags);
599
600 err = register_netdevice(sl->dev);
601 if (err)
602 goto err_free_chan;
603 }
604
605
606 rtnl_unlock();
607 tty->receive_room = 65536;
608
609
610 return 0;
611
612err_free_chan:
613 sl->tty = NULL;
614 tty->disc_data = NULL;
615 clear_bit(SLF_INUSE, &sl->flags);
616
617err_exit:
618 rtnl_unlock();
619
620
621 return err;
622}
623
624
625
626
627
628
629
630
631
632static void slcan_close(struct tty_struct *tty)
633{
634 struct slcan *sl = (struct slcan *) tty->disc_data;
635
636
637 if (!sl || sl->magic != SLCAN_MAGIC || sl->tty != tty)
638 return;
639
640 spin_lock_bh(&sl->lock);
641 tty->disc_data = NULL;
642 sl->tty = NULL;
643 spin_unlock_bh(&sl->lock);
644
645 flush_work(&sl->tx_work);
646
647
648 unregister_netdev(sl->dev);
649
650}
651
652static int slcan_hangup(struct tty_struct *tty)
653{
654 slcan_close(tty);
655 return 0;
656}
657
658
659static int slcan_ioctl(struct tty_struct *tty, struct file *file,
660 unsigned int cmd, unsigned long arg)
661{
662 struct slcan *sl = (struct slcan *) tty->disc_data;
663 unsigned int tmp;
664
665
666 if (!sl || sl->magic != SLCAN_MAGIC)
667 return -EINVAL;
668
669 switch (cmd) {
670 case SIOCGIFNAME:
671 tmp = strlen(sl->dev->name) + 1;
672 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
673 return -EFAULT;
674 return 0;
675
676 case SIOCSIFHWADDR:
677 return -EINVAL;
678
679 default:
680 return tty_mode_ioctl(tty, file, cmd, arg);
681 }
682}
683
684static struct tty_ldisc_ops slc_ldisc = {
685 .owner = THIS_MODULE,
686 .magic = TTY_LDISC_MAGIC,
687 .name = "slcan",
688 .open = slcan_open,
689 .close = slcan_close,
690 .hangup = slcan_hangup,
691 .ioctl = slcan_ioctl,
692 .receive_buf = slcan_receive_buf,
693 .write_wakeup = slcan_write_wakeup,
694};
695
696static int __init slcan_init(void)
697{
698 int status;
699
700 if (maxdev < 4)
701 maxdev = 4;
702
703 pr_info("slcan: serial line CAN interface driver\n");
704 pr_info("slcan: %d dynamic interface channels.\n", maxdev);
705
706 slcan_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
707 if (!slcan_devs)
708 return -ENOMEM;
709
710
711 status = tty_register_ldisc(N_SLCAN, &slc_ldisc);
712 if (status) {
713 printk(KERN_ERR "slcan: can't register line discipline\n");
714 kfree(slcan_devs);
715 }
716 return status;
717}
718
719static void __exit slcan_exit(void)
720{
721 int i;
722 struct net_device *dev;
723 struct slcan *sl;
724 unsigned long timeout = jiffies + HZ;
725 int busy = 0;
726
727 if (slcan_devs == NULL)
728 return;
729
730
731
732 do {
733 if (busy)
734 msleep_interruptible(100);
735
736 busy = 0;
737 for (i = 0; i < maxdev; i++) {
738 dev = slcan_devs[i];
739 if (!dev)
740 continue;
741 sl = netdev_priv(dev);
742 spin_lock_bh(&sl->lock);
743 if (sl->tty) {
744 busy++;
745 tty_hangup(sl->tty);
746 }
747 spin_unlock_bh(&sl->lock);
748 }
749 } while (busy && time_before(jiffies, timeout));
750
751
752
753
754 for (i = 0; i < maxdev; i++) {
755 dev = slcan_devs[i];
756 if (!dev)
757 continue;
758 slcan_devs[i] = NULL;
759
760 sl = netdev_priv(dev);
761 if (sl->tty) {
762 printk(KERN_ERR "%s: tty discipline still running\n",
763 dev->name);
764 }
765
766 unregister_netdev(dev);
767 }
768
769 kfree(slcan_devs);
770 slcan_devs = NULL;
771
772 i = tty_unregister_ldisc(N_SLCAN);
773 if (i)
774 printk(KERN_ERR "slcan: can't unregister ldisc (err %d)\n", i);
775}
776
777module_init(slcan_init);
778module_exit(slcan_exit);
779