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