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 memcpy(skb_put(skb, sizeof(struct can_frame)),
220 &cf, sizeof(struct can_frame));
221
222 sl->dev->stats.rx_packets++;
223 sl->dev->stats.rx_bytes += cf.can_dlc;
224 netif_rx_ni(skb);
225}
226
227
228static void slcan_unesc(struct slcan *sl, unsigned char s)
229{
230 if ((s == '\r') || (s == '\a')) {
231 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) &&
232 (sl->rcount > 4)) {
233 slc_bump(sl);
234 }
235 sl->rcount = 0;
236 } else {
237 if (!test_bit(SLF_ERROR, &sl->flags)) {
238 if (sl->rcount < SLC_MTU) {
239 sl->rbuff[sl->rcount++] = s;
240 return;
241 } else {
242 sl->dev->stats.rx_over_errors++;
243 set_bit(SLF_ERROR, &sl->flags);
244 }
245 }
246 }
247}
248
249
250
251
252
253
254static void slc_encaps(struct slcan *sl, struct can_frame *cf)
255{
256 int actual, i;
257 unsigned char *pos;
258 unsigned char *endpos;
259 canid_t id = cf->can_id;
260
261 pos = sl->xbuff;
262
263 if (cf->can_id & CAN_RTR_FLAG)
264 *pos = 'R';
265 else
266 *pos = 'T';
267
268
269 if (cf->can_id & CAN_EFF_FLAG) {
270 id &= CAN_EFF_MASK;
271 endpos = pos + SLC_EFF_ID_LEN;
272 } else {
273 *pos |= 0x20;
274 id &= CAN_SFF_MASK;
275 endpos = pos + SLC_SFF_ID_LEN;
276 }
277
278
279 pos++;
280 while (endpos >= pos) {
281 *endpos-- = hex_asc_upper[id & 0xf];
282 id >>= 4;
283 }
284
285 pos += (cf->can_id & CAN_EFF_FLAG) ? SLC_EFF_ID_LEN : SLC_SFF_ID_LEN;
286
287 *pos++ = cf->can_dlc + '0';
288
289
290 if (!(cf->can_id & CAN_RTR_FLAG)) {
291 for (i = 0; i < cf->can_dlc; i++)
292 pos = hex_byte_pack_upper(pos, cf->data[i]);
293 }
294
295 *pos++ = '\r';
296
297
298
299
300
301
302
303
304
305 set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
306 actual = sl->tty->ops->write(sl->tty, sl->xbuff, pos - sl->xbuff);
307 sl->xleft = (pos - sl->xbuff) - actual;
308 sl->xhead = sl->xbuff + actual;
309 sl->dev->stats.tx_bytes += cf->can_dlc;
310}
311
312
313static void slcan_transmit(struct work_struct *work)
314{
315 struct slcan *sl = container_of(work, struct slcan, tx_work);
316 int actual;
317
318 spin_lock_bh(&sl->lock);
319
320 if (!sl->tty || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev)) {
321 spin_unlock_bh(&sl->lock);
322 return;
323 }
324
325 if (sl->xleft <= 0) {
326
327
328 sl->dev->stats.tx_packets++;
329 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
330 spin_unlock_bh(&sl->lock);
331 netif_wake_queue(sl->dev);
332 return;
333 }
334
335 actual = sl->tty->ops->write(sl->tty, sl->xhead, sl->xleft);
336 sl->xleft -= actual;
337 sl->xhead += actual;
338 spin_unlock_bh(&sl->lock);
339}
340
341
342
343
344
345static void slcan_write_wakeup(struct tty_struct *tty)
346{
347 struct slcan *sl = tty->disc_data;
348
349 schedule_work(&sl->tx_work);
350}
351
352
353static netdev_tx_t slc_xmit(struct sk_buff *skb, struct net_device *dev)
354{
355 struct slcan *sl = netdev_priv(dev);
356
357 if (skb->len != sizeof(struct can_frame))
358 goto out;
359
360 spin_lock(&sl->lock);
361 if (!netif_running(dev)) {
362 spin_unlock(&sl->lock);
363 printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name);
364 goto out;
365 }
366 if (sl->tty == NULL) {
367 spin_unlock(&sl->lock);
368 goto out;
369 }
370
371 netif_stop_queue(sl->dev);
372 slc_encaps(sl, (struct can_frame *) skb->data);
373 spin_unlock(&sl->lock);
374
375out:
376 kfree_skb(skb);
377 return NETDEV_TX_OK;
378}
379
380
381
382
383
384
385
386static int slc_close(struct net_device *dev)
387{
388 struct slcan *sl = netdev_priv(dev);
389
390 spin_lock_bh(&sl->lock);
391 if (sl->tty) {
392
393 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
394 }
395 netif_stop_queue(dev);
396 sl->rcount = 0;
397 sl->xleft = 0;
398 spin_unlock_bh(&sl->lock);
399
400 return 0;
401}
402
403
404static int slc_open(struct net_device *dev)
405{
406 struct slcan *sl = netdev_priv(dev);
407
408 if (sl->tty == NULL)
409 return -ENODEV;
410
411 sl->flags &= (1 << SLF_INUSE);
412 netif_start_queue(dev);
413 return 0;
414}
415
416
417static void slc_free_netdev(struct net_device *dev)
418{
419 int i = dev->base_addr;
420 free_netdev(dev);
421 slcan_devs[i] = NULL;
422}
423
424static int slcan_change_mtu(struct net_device *dev, int new_mtu)
425{
426 return -EINVAL;
427}
428
429static const struct net_device_ops slc_netdev_ops = {
430 .ndo_open = slc_open,
431 .ndo_stop = slc_close,
432 .ndo_start_xmit = slc_xmit,
433 .ndo_change_mtu = slcan_change_mtu,
434};
435
436static void slc_setup(struct net_device *dev)
437{
438 dev->netdev_ops = &slc_netdev_ops;
439 dev->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 = sizeof(struct can_frame);
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 dev->destructor = NULL;
766 }
767
768 unregister_netdev(dev);
769 }
770
771 kfree(slcan_devs);
772 slcan_devs = NULL;
773
774 i = tty_unregister_ldisc(N_SLCAN);
775 if (i)
776 printk(KERN_ERR "slcan: can't unregister ldisc (err %d)\n", i);
777}
778
779module_init(slcan_init);
780module_exit(slcan_exit);
781