• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/net/rose/
1/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
6 *
7 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
8 * Copyright (C) Terry Dawson VK2KTJ (terry@animats.net)
9 */
10#include <linux/errno.h>
11#include <linux/types.h>
12#include <linux/socket.h>
13#include <linux/in.h>
14#include <linux/kernel.h>
15#include <linux/timer.h>
16#include <linux/string.h>
17#include <linux/sockios.h>
18#include <linux/net.h>
19#include <linux/slab.h>
20#include <net/ax25.h>
21#include <linux/inet.h>
22#include <linux/netdevice.h>
23#include <net/arp.h>
24#include <linux/if_arp.h>
25#include <linux/skbuff.h>
26#include <net/sock.h>
27#include <net/tcp_states.h>
28#include <asm/system.h>
29#include <asm/uaccess.h>
30#include <linux/fcntl.h>
31#include <linux/termios.h>	/* For TIOCINQ/OUTQ */
32#include <linux/mm.h>
33#include <linux/interrupt.h>
34#include <linux/notifier.h>
35#include <linux/netfilter.h>
36#include <linux/init.h>
37#include <net/rose.h>
38#include <linux/seq_file.h>
39
40static unsigned int rose_neigh_no = 1;
41
42static struct rose_node  *rose_node_list;
43static DEFINE_SPINLOCK(rose_node_list_lock);
44static struct rose_neigh *rose_neigh_list;
45static DEFINE_SPINLOCK(rose_neigh_list_lock);
46static struct rose_route *rose_route_list;
47static DEFINE_SPINLOCK(rose_route_list_lock);
48
49struct rose_neigh *rose_loopback_neigh;
50
51/*
52 *	Add a new route to a node, and in the process add the node and the
53 *	neighbour if it is new.
54 */
55static int __must_check rose_add_node(struct rose_route_struct *rose_route,
56	struct net_device *dev)
57{
58	struct rose_node  *rose_node, *rose_tmpn, *rose_tmpp;
59	struct rose_neigh *rose_neigh;
60	int i, res = 0;
61
62	spin_lock_bh(&rose_node_list_lock);
63	spin_lock_bh(&rose_neigh_list_lock);
64
65	rose_node = rose_node_list;
66	while (rose_node != NULL) {
67		if ((rose_node->mask == rose_route->mask) &&
68		    (rosecmpm(&rose_route->address, &rose_node->address,
69			      rose_route->mask) == 0))
70			break;
71		rose_node = rose_node->next;
72	}
73
74	if (rose_node != NULL && rose_node->loopback) {
75		res = -EINVAL;
76		goto out;
77	}
78
79	rose_neigh = rose_neigh_list;
80	while (rose_neigh != NULL) {
81		if (ax25cmp(&rose_route->neighbour,
82			    &rose_neigh->callsign) == 0 &&
83		    rose_neigh->dev == dev)
84			break;
85		rose_neigh = rose_neigh->next;
86	}
87
88	if (rose_neigh == NULL) {
89		rose_neigh = kmalloc(sizeof(*rose_neigh), GFP_ATOMIC);
90		if (rose_neigh == NULL) {
91			res = -ENOMEM;
92			goto out;
93		}
94
95		rose_neigh->callsign  = rose_route->neighbour;
96		rose_neigh->digipeat  = NULL;
97		rose_neigh->ax25      = NULL;
98		rose_neigh->dev       = dev;
99		rose_neigh->count     = 0;
100		rose_neigh->use       = 0;
101		rose_neigh->dce_mode  = 0;
102		rose_neigh->loopback  = 0;
103		rose_neigh->number    = rose_neigh_no++;
104		rose_neigh->restarted = 0;
105
106		skb_queue_head_init(&rose_neigh->queue);
107
108		init_timer(&rose_neigh->ftimer);
109		init_timer(&rose_neigh->t0timer);
110
111		if (rose_route->ndigis != 0) {
112			rose_neigh->digipeat =
113				kmalloc(sizeof(ax25_digi), GFP_ATOMIC);
114			if (rose_neigh->digipeat == NULL) {
115				kfree(rose_neigh);
116				res = -ENOMEM;
117				goto out;
118			}
119
120			rose_neigh->digipeat->ndigi      = rose_route->ndigis;
121			rose_neigh->digipeat->lastrepeat = -1;
122
123			for (i = 0; i < rose_route->ndigis; i++) {
124				rose_neigh->digipeat->calls[i]    =
125					rose_route->digipeaters[i];
126				rose_neigh->digipeat->repeated[i] = 0;
127			}
128		}
129
130		rose_neigh->next = rose_neigh_list;
131		rose_neigh_list  = rose_neigh;
132	}
133
134	/*
135	 * This is a new node to be inserted into the list. Find where it needs
136	 * to be inserted into the list, and insert it. We want to be sure
137	 * to order the list in descending order of mask size to ensure that
138	 * later when we are searching this list the first match will be the
139	 * best match.
140	 */
141	if (rose_node == NULL) {
142		rose_tmpn = rose_node_list;
143		rose_tmpp = NULL;
144
145		while (rose_tmpn != NULL) {
146			if (rose_tmpn->mask > rose_route->mask) {
147				rose_tmpp = rose_tmpn;
148				rose_tmpn = rose_tmpn->next;
149			} else {
150				break;
151			}
152		}
153
154		/* create new node */
155		rose_node = kmalloc(sizeof(*rose_node), GFP_ATOMIC);
156		if (rose_node == NULL) {
157			res = -ENOMEM;
158			goto out;
159		}
160
161		rose_node->address      = rose_route->address;
162		rose_node->mask         = rose_route->mask;
163		rose_node->count        = 1;
164		rose_node->loopback     = 0;
165		rose_node->neighbour[0] = rose_neigh;
166
167		if (rose_tmpn == NULL) {
168			if (rose_tmpp == NULL) {	/* Empty list */
169				rose_node_list  = rose_node;
170				rose_node->next = NULL;
171			} else {
172				rose_tmpp->next = rose_node;
173				rose_node->next = NULL;
174			}
175		} else {
176			if (rose_tmpp == NULL) {	/* 1st node */
177				rose_node->next = rose_node_list;
178				rose_node_list  = rose_node;
179			} else {
180				rose_tmpp->next = rose_node;
181				rose_node->next = rose_tmpn;
182			}
183		}
184		rose_neigh->count++;
185
186		goto out;
187	}
188
189	/* We have space, slot it in */
190	if (rose_node->count < 3) {
191		rose_node->neighbour[rose_node->count] = rose_neigh;
192		rose_node->count++;
193		rose_neigh->count++;
194	}
195
196out:
197	spin_unlock_bh(&rose_neigh_list_lock);
198	spin_unlock_bh(&rose_node_list_lock);
199
200	return res;
201}
202
203/*
204 * Caller is holding rose_node_list_lock.
205 */
206static void rose_remove_node(struct rose_node *rose_node)
207{
208	struct rose_node *s;
209
210	if ((s = rose_node_list) == rose_node) {
211		rose_node_list = rose_node->next;
212		kfree(rose_node);
213		return;
214	}
215
216	while (s != NULL && s->next != NULL) {
217		if (s->next == rose_node) {
218			s->next = rose_node->next;
219			kfree(rose_node);
220			return;
221		}
222
223		s = s->next;
224	}
225}
226
227/*
228 * Caller is holding rose_neigh_list_lock.
229 */
230static void rose_remove_neigh(struct rose_neigh *rose_neigh)
231{
232	struct rose_neigh *s;
233
234	rose_stop_ftimer(rose_neigh);
235	rose_stop_t0timer(rose_neigh);
236
237	skb_queue_purge(&rose_neigh->queue);
238
239	if ((s = rose_neigh_list) == rose_neigh) {
240		rose_neigh_list = rose_neigh->next;
241		if (rose_neigh->ax25)
242			ax25_cb_put(rose_neigh->ax25);
243		kfree(rose_neigh->digipeat);
244		kfree(rose_neigh);
245		return;
246	}
247
248	while (s != NULL && s->next != NULL) {
249		if (s->next == rose_neigh) {
250			s->next = rose_neigh->next;
251			if (rose_neigh->ax25)
252				ax25_cb_put(rose_neigh->ax25);
253			kfree(rose_neigh->digipeat);
254			kfree(rose_neigh);
255			return;
256		}
257
258		s = s->next;
259	}
260}
261
262/*
263 * Caller is holding rose_route_list_lock.
264 */
265static void rose_remove_route(struct rose_route *rose_route)
266{
267	struct rose_route *s;
268
269	if (rose_route->neigh1 != NULL)
270		rose_route->neigh1->use--;
271
272	if (rose_route->neigh2 != NULL)
273		rose_route->neigh2->use--;
274
275	if ((s = rose_route_list) == rose_route) {
276		rose_route_list = rose_route->next;
277		kfree(rose_route);
278		return;
279	}
280
281	while (s != NULL && s->next != NULL) {
282		if (s->next == rose_route) {
283			s->next = rose_route->next;
284			kfree(rose_route);
285			return;
286		}
287
288		s = s->next;
289	}
290}
291
292/*
293 *	"Delete" a node. Strictly speaking remove a route to a node. The node
294 *	is only deleted if no routes are left to it.
295 */
296static int rose_del_node(struct rose_route_struct *rose_route,
297	struct net_device *dev)
298{
299	struct rose_node  *rose_node;
300	struct rose_neigh *rose_neigh;
301	int i, err = 0;
302
303	spin_lock_bh(&rose_node_list_lock);
304	spin_lock_bh(&rose_neigh_list_lock);
305
306	rose_node = rose_node_list;
307	while (rose_node != NULL) {
308		if ((rose_node->mask == rose_route->mask) &&
309		    (rosecmpm(&rose_route->address, &rose_node->address,
310			      rose_route->mask) == 0))
311			break;
312		rose_node = rose_node->next;
313	}
314
315	if (rose_node == NULL || rose_node->loopback) {
316		err = -EINVAL;
317		goto out;
318	}
319
320	rose_neigh = rose_neigh_list;
321	while (rose_neigh != NULL) {
322		if (ax25cmp(&rose_route->neighbour,
323			    &rose_neigh->callsign) == 0 &&
324		    rose_neigh->dev == dev)
325			break;
326		rose_neigh = rose_neigh->next;
327	}
328
329	if (rose_neigh == NULL) {
330		err = -EINVAL;
331		goto out;
332	}
333
334	for (i = 0; i < rose_node->count; i++) {
335		if (rose_node->neighbour[i] == rose_neigh) {
336			rose_neigh->count--;
337
338			if (rose_neigh->count == 0 && rose_neigh->use == 0)
339				rose_remove_neigh(rose_neigh);
340
341			rose_node->count--;
342
343			if (rose_node->count == 0) {
344				rose_remove_node(rose_node);
345			} else {
346				switch (i) {
347				case 0:
348					rose_node->neighbour[0] =
349						rose_node->neighbour[1];
350				case 1:
351					rose_node->neighbour[1] =
352						rose_node->neighbour[2];
353				case 2:
354					break;
355				}
356			}
357			goto out;
358		}
359	}
360	err = -EINVAL;
361
362out:
363	spin_unlock_bh(&rose_neigh_list_lock);
364	spin_unlock_bh(&rose_node_list_lock);
365
366	return err;
367}
368
369/*
370 *	Add the loopback neighbour.
371 */
372void rose_add_loopback_neigh(void)
373{
374	struct rose_neigh *sn;
375
376	rose_loopback_neigh = kmalloc(sizeof(struct rose_neigh), GFP_KERNEL);
377	if (!rose_loopback_neigh)
378		return;
379	sn = rose_loopback_neigh;
380
381	sn->callsign  = null_ax25_address;
382	sn->digipeat  = NULL;
383	sn->ax25      = NULL;
384	sn->dev       = NULL;
385	sn->count     = 0;
386	sn->use       = 0;
387	sn->dce_mode  = 1;
388	sn->loopback  = 1;
389	sn->number    = rose_neigh_no++;
390	sn->restarted = 1;
391
392	skb_queue_head_init(&sn->queue);
393
394	init_timer(&sn->ftimer);
395	init_timer(&sn->t0timer);
396
397	spin_lock_bh(&rose_neigh_list_lock);
398	sn->next = rose_neigh_list;
399	rose_neigh_list           = sn;
400	spin_unlock_bh(&rose_neigh_list_lock);
401}
402
403/*
404 *	Add a loopback node.
405 */
406int rose_add_loopback_node(rose_address *address)
407{
408	struct rose_node *rose_node;
409	int err = 0;
410
411	spin_lock_bh(&rose_node_list_lock);
412
413	rose_node = rose_node_list;
414	while (rose_node != NULL) {
415		if ((rose_node->mask == 10) &&
416		     (rosecmpm(address, &rose_node->address, 10) == 0) &&
417		     rose_node->loopback)
418			break;
419		rose_node = rose_node->next;
420	}
421
422	if (rose_node != NULL)
423		goto out;
424
425	if ((rose_node = kmalloc(sizeof(*rose_node), GFP_ATOMIC)) == NULL) {
426		err = -ENOMEM;
427		goto out;
428	}
429
430	rose_node->address      = *address;
431	rose_node->mask         = 10;
432	rose_node->count        = 1;
433	rose_node->loopback     = 1;
434	rose_node->neighbour[0] = rose_loopback_neigh;
435
436	/* Insert at the head of list. Address is always mask=10 */
437	rose_node->next = rose_node_list;
438	rose_node_list  = rose_node;
439
440	rose_loopback_neigh->count++;
441
442out:
443	spin_unlock_bh(&rose_node_list_lock);
444
445	return err;
446}
447
448/*
449 *	Delete a loopback node.
450 */
451void rose_del_loopback_node(rose_address *address)
452{
453	struct rose_node *rose_node;
454
455	spin_lock_bh(&rose_node_list_lock);
456
457	rose_node = rose_node_list;
458	while (rose_node != NULL) {
459		if ((rose_node->mask == 10) &&
460		    (rosecmpm(address, &rose_node->address, 10) == 0) &&
461		    rose_node->loopback)
462			break;
463		rose_node = rose_node->next;
464	}
465
466	if (rose_node == NULL)
467		goto out;
468
469	rose_remove_node(rose_node);
470
471	rose_loopback_neigh->count--;
472
473out:
474	spin_unlock_bh(&rose_node_list_lock);
475}
476
477/*
478 *	A device has been removed. Remove its routes and neighbours.
479 */
480void rose_rt_device_down(struct net_device *dev)
481{
482	struct rose_neigh *s, *rose_neigh;
483	struct rose_node  *t, *rose_node;
484	int i;
485
486	spin_lock_bh(&rose_node_list_lock);
487	spin_lock_bh(&rose_neigh_list_lock);
488	rose_neigh = rose_neigh_list;
489	while (rose_neigh != NULL) {
490		s          = rose_neigh;
491		rose_neigh = rose_neigh->next;
492
493		if (s->dev != dev)
494			continue;
495
496		rose_node = rose_node_list;
497
498		while (rose_node != NULL) {
499			t         = rose_node;
500			rose_node = rose_node->next;
501
502			for (i = 0; i < t->count; i++) {
503				if (t->neighbour[i] != s)
504					continue;
505
506				t->count--;
507
508				switch (i) {
509				case 0:
510					t->neighbour[0] = t->neighbour[1];
511				case 1:
512					t->neighbour[1] = t->neighbour[2];
513				case 2:
514					break;
515				}
516			}
517
518			if (t->count <= 0)
519				rose_remove_node(t);
520		}
521
522		rose_remove_neigh(s);
523	}
524	spin_unlock_bh(&rose_neigh_list_lock);
525	spin_unlock_bh(&rose_node_list_lock);
526}
527
528
529/*
530 *	Clear all nodes and neighbours out, except for neighbours with
531 *	active connections going through them.
532 *  Do not clear loopback neighbour and nodes.
533 */
534static int rose_clear_routes(void)
535{
536	struct rose_neigh *s, *rose_neigh;
537	struct rose_node  *t, *rose_node;
538
539	spin_lock_bh(&rose_node_list_lock);
540	spin_lock_bh(&rose_neigh_list_lock);
541
542	rose_neigh = rose_neigh_list;
543	rose_node  = rose_node_list;
544
545	while (rose_node != NULL) {
546		t         = rose_node;
547		rose_node = rose_node->next;
548		if (!t->loopback)
549			rose_remove_node(t);
550	}
551
552	while (rose_neigh != NULL) {
553		s          = rose_neigh;
554		rose_neigh = rose_neigh->next;
555
556		if (s->use == 0 && !s->loopback) {
557			s->count = 0;
558			rose_remove_neigh(s);
559		}
560	}
561
562	spin_unlock_bh(&rose_neigh_list_lock);
563	spin_unlock_bh(&rose_node_list_lock);
564
565	return 0;
566}
567
568/*
569 *	Check that the device given is a valid AX.25 interface that is "up".
570 * 	called whith RTNL
571 */
572static struct net_device *rose_ax25_dev_find(char *devname)
573{
574	struct net_device *dev;
575
576	if ((dev = __dev_get_by_name(&init_net, devname)) == NULL)
577		return NULL;
578
579	if ((dev->flags & IFF_UP) && dev->type == ARPHRD_AX25)
580		return dev;
581
582	return NULL;
583}
584
585/*
586 *	Find the first active ROSE device, usually "rose0".
587 */
588struct net_device *rose_dev_first(void)
589{
590	struct net_device *dev, *first = NULL;
591
592	rcu_read_lock();
593	for_each_netdev_rcu(&init_net, dev) {
594		if ((dev->flags & IFF_UP) && dev->type == ARPHRD_ROSE)
595			if (first == NULL || strncmp(dev->name, first->name, 3) < 0)
596				first = dev;
597	}
598	rcu_read_unlock();
599
600	return first;
601}
602
603/*
604 *	Find the ROSE device for the given address.
605 */
606struct net_device *rose_dev_get(rose_address *addr)
607{
608	struct net_device *dev;
609
610	rcu_read_lock();
611	for_each_netdev_rcu(&init_net, dev) {
612		if ((dev->flags & IFF_UP) && dev->type == ARPHRD_ROSE && rosecmp(addr, (rose_address *)dev->dev_addr) == 0) {
613			dev_hold(dev);
614			goto out;
615		}
616	}
617	dev = NULL;
618out:
619	rcu_read_unlock();
620	return dev;
621}
622
623static int rose_dev_exists(rose_address *addr)
624{
625	struct net_device *dev;
626
627	rcu_read_lock();
628	for_each_netdev_rcu(&init_net, dev) {
629		if ((dev->flags & IFF_UP) && dev->type == ARPHRD_ROSE && rosecmp(addr, (rose_address *)dev->dev_addr) == 0)
630			goto out;
631	}
632	dev = NULL;
633out:
634	rcu_read_unlock();
635	return dev != NULL;
636}
637
638
639
640
641struct rose_route *rose_route_free_lci(unsigned int lci, struct rose_neigh *neigh)
642{
643	struct rose_route *rose_route;
644
645	for (rose_route = rose_route_list; rose_route != NULL; rose_route = rose_route->next)
646		if ((rose_route->neigh1 == neigh && rose_route->lci1 == lci) ||
647		    (rose_route->neigh2 == neigh && rose_route->lci2 == lci))
648			return rose_route;
649
650	return NULL;
651}
652
653/*
654 *	Find a neighbour or a route given a ROSE address.
655 */
656struct rose_neigh *rose_get_neigh(rose_address *addr, unsigned char *cause,
657	unsigned char *diagnostic, int new)
658{
659	struct rose_neigh *res = NULL;
660	struct rose_node *node;
661	int failed = 0;
662	int i;
663
664	if (!new) spin_lock_bh(&rose_node_list_lock);
665	for (node = rose_node_list; node != NULL; node = node->next) {
666		if (rosecmpm(addr, &node->address, node->mask) == 0) {
667			for (i = 0; i < node->count; i++) {
668				if (new) {
669					if (node->neighbour[i]->restarted) {
670						res = node->neighbour[i];
671						goto out;
672					}
673				}
674				else {
675					if (!rose_ftimer_running(node->neighbour[i])) {
676						res = node->neighbour[i];
677						goto out;
678					} else
679						failed = 1;
680				}
681			}
682		}
683	}
684
685	if (failed) {
686		*cause      = ROSE_OUT_OF_ORDER;
687		*diagnostic = 0;
688	} else {
689		*cause      = ROSE_NOT_OBTAINABLE;
690		*diagnostic = 0;
691	}
692
693out:
694	if (!new) spin_unlock_bh(&rose_node_list_lock);
695
696	return res;
697}
698
699/*
700 *	Handle the ioctls that control the routing functions.
701 */
702int rose_rt_ioctl(unsigned int cmd, void __user *arg)
703{
704	struct rose_route_struct rose_route;
705	struct net_device *dev;
706	int err;
707
708	switch (cmd) {
709	case SIOCADDRT:
710		if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
711			return -EFAULT;
712		if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
713			return -EINVAL;
714		if (rose_dev_exists(&rose_route.address)) /* Can't add routes to ourself */
715			return -EINVAL;
716		if (rose_route.mask > 10) /* Mask can't be more than 10 digits */
717			return -EINVAL;
718		if (rose_route.ndigis > AX25_MAX_DIGIS)
719			return -EINVAL;
720		err = rose_add_node(&rose_route, dev);
721		return err;
722
723	case SIOCDELRT:
724		if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
725			return -EFAULT;
726		if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
727			return -EINVAL;
728		err = rose_del_node(&rose_route, dev);
729		return err;
730
731	case SIOCRSCLRRT:
732		return rose_clear_routes();
733
734	default:
735		return -EINVAL;
736	}
737
738	return 0;
739}
740
741static void rose_del_route_by_neigh(struct rose_neigh *rose_neigh)
742{
743	struct rose_route *rose_route, *s;
744
745	rose_neigh->restarted = 0;
746
747	rose_stop_t0timer(rose_neigh);
748	rose_start_ftimer(rose_neigh);
749
750	skb_queue_purge(&rose_neigh->queue);
751
752	spin_lock_bh(&rose_route_list_lock);
753
754	rose_route = rose_route_list;
755
756	while (rose_route != NULL) {
757		if ((rose_route->neigh1 == rose_neigh && rose_route->neigh2 == rose_neigh) ||
758		    (rose_route->neigh1 == rose_neigh && rose_route->neigh2 == NULL)       ||
759		    (rose_route->neigh2 == rose_neigh && rose_route->neigh1 == NULL)) {
760			s = rose_route->next;
761			rose_remove_route(rose_route);
762			rose_route = s;
763			continue;
764		}
765
766		if (rose_route->neigh1 == rose_neigh) {
767			rose_route->neigh1->use--;
768			rose_route->neigh1 = NULL;
769			rose_transmit_clear_request(rose_route->neigh2, rose_route->lci2, ROSE_OUT_OF_ORDER, 0);
770		}
771
772		if (rose_route->neigh2 == rose_neigh) {
773			rose_route->neigh2->use--;
774			rose_route->neigh2 = NULL;
775			rose_transmit_clear_request(rose_route->neigh1, rose_route->lci1, ROSE_OUT_OF_ORDER, 0);
776		}
777
778		rose_route = rose_route->next;
779	}
780	spin_unlock_bh(&rose_route_list_lock);
781}
782
783/*
784 * 	A level 2 link has timed out, therefore it appears to be a poor link,
785 *	then don't use that neighbour until it is reset. Blow away all through
786 *	routes and connections using this route.
787 */
788void rose_link_failed(ax25_cb *ax25, int reason)
789{
790	struct rose_neigh *rose_neigh;
791
792	spin_lock_bh(&rose_neigh_list_lock);
793	rose_neigh = rose_neigh_list;
794	while (rose_neigh != NULL) {
795		if (rose_neigh->ax25 == ax25)
796			break;
797		rose_neigh = rose_neigh->next;
798	}
799
800	if (rose_neigh != NULL) {
801		rose_neigh->ax25 = NULL;
802		ax25_cb_put(ax25);
803
804		rose_del_route_by_neigh(rose_neigh);
805		rose_kill_by_neigh(rose_neigh);
806	}
807	spin_unlock_bh(&rose_neigh_list_lock);
808}
809
810/*
811 * 	A device has been "downed" remove its link status. Blow away all
812 *	through routes and connections that use this device.
813 */
814void rose_link_device_down(struct net_device *dev)
815{
816	struct rose_neigh *rose_neigh;
817
818	for (rose_neigh = rose_neigh_list; rose_neigh != NULL; rose_neigh = rose_neigh->next) {
819		if (rose_neigh->dev == dev) {
820			rose_del_route_by_neigh(rose_neigh);
821			rose_kill_by_neigh(rose_neigh);
822		}
823	}
824}
825
826/*
827 *	Route a frame to an appropriate AX.25 connection.
828 */
829int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
830{
831	struct rose_neigh *rose_neigh, *new_neigh;
832	struct rose_route *rose_route;
833	struct rose_facilities_struct facilities;
834	rose_address *src_addr, *dest_addr;
835	struct sock *sk;
836	unsigned short frametype;
837	unsigned int lci, new_lci;
838	unsigned char cause, diagnostic;
839	struct net_device *dev;
840	int len, res = 0;
841	char buf[11];
842
843
844	frametype = skb->data[2];
845	lci = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 0x0FF);
846	src_addr  = (rose_address *)(skb->data + 9);
847	dest_addr = (rose_address *)(skb->data + 4);
848
849	spin_lock_bh(&rose_neigh_list_lock);
850	spin_lock_bh(&rose_route_list_lock);
851
852	rose_neigh = rose_neigh_list;
853	while (rose_neigh != NULL) {
854		if (ax25cmp(&ax25->dest_addr, &rose_neigh->callsign) == 0 &&
855		    ax25->ax25_dev->dev == rose_neigh->dev)
856			break;
857		rose_neigh = rose_neigh->next;
858	}
859
860	if (rose_neigh == NULL) {
861		printk("rose_route : unknown neighbour or device %s\n",
862		       ax2asc(buf, &ax25->dest_addr));
863		goto out;
864	}
865
866	/*
867	 *	Obviously the link is working, halt the ftimer.
868	 */
869	rose_stop_ftimer(rose_neigh);
870
871	/*
872	 *	LCI of zero is always for us, and its always a restart
873	 * 	frame.
874	 */
875	if (lci == 0) {
876		rose_link_rx_restart(skb, rose_neigh, frametype);
877		goto out;
878	}
879
880	/*
881	 *	Find an existing socket.
882	 */
883	if ((sk = rose_find_socket(lci, rose_neigh)) != NULL) {
884		if (frametype == ROSE_CALL_REQUEST) {
885			struct rose_sock *rose = rose_sk(sk);
886
887			/* Remove an existing unused socket */
888			rose_clear_queues(sk);
889			rose->cause	 = ROSE_NETWORK_CONGESTION;
890			rose->diagnostic = 0;
891			rose->neighbour->use--;
892			rose->neighbour	 = NULL;
893			rose->lci	 = 0;
894			rose->state	 = ROSE_STATE_0;
895			sk->sk_state	 = TCP_CLOSE;
896			sk->sk_err	 = 0;
897			sk->sk_shutdown	 |= SEND_SHUTDOWN;
898			if (!sock_flag(sk, SOCK_DEAD)) {
899				sk->sk_state_change(sk);
900				sock_set_flag(sk, SOCK_DEAD);
901			}
902		}
903		else {
904			skb_reset_transport_header(skb);
905			res = rose_process_rx_frame(sk, skb);
906			goto out;
907		}
908	}
909
910	/*
911	 *	Is is a Call Request and is it for us ?
912	 */
913	if (frametype == ROSE_CALL_REQUEST)
914		if ((dev = rose_dev_get(dest_addr)) != NULL) {
915			res = rose_rx_call_request(skb, dev, rose_neigh, lci);
916			dev_put(dev);
917			goto out;
918		}
919
920	if (!sysctl_rose_routing_control) {
921		rose_transmit_clear_request(rose_neigh, lci, ROSE_NOT_OBTAINABLE, 0);
922		goto out;
923	}
924
925	/*
926	 *	Route it to the next in line if we have an entry for it.
927	 */
928	rose_route = rose_route_list;
929	while (rose_route != NULL) {
930		if (rose_route->lci1 == lci &&
931		    rose_route->neigh1 == rose_neigh) {
932			if (frametype == ROSE_CALL_REQUEST) {
933				/* F6FBB - Remove an existing unused route */
934				rose_remove_route(rose_route);
935				break;
936			} else if (rose_route->neigh2 != NULL) {
937				skb->data[0] &= 0xF0;
938				skb->data[0] |= (rose_route->lci2 >> 8) & 0x0F;
939				skb->data[1]  = (rose_route->lci2 >> 0) & 0xFF;
940				rose_transmit_link(skb, rose_route->neigh2);
941				if (frametype == ROSE_CLEAR_CONFIRMATION)
942					rose_remove_route(rose_route);
943				res = 1;
944				goto out;
945			} else {
946				if (frametype == ROSE_CLEAR_CONFIRMATION)
947					rose_remove_route(rose_route);
948				goto out;
949			}
950		}
951		if (rose_route->lci2 == lci &&
952		    rose_route->neigh2 == rose_neigh) {
953			if (frametype == ROSE_CALL_REQUEST) {
954				/* F6FBB - Remove an existing unused route */
955				rose_remove_route(rose_route);
956				break;
957			} else if (rose_route->neigh1 != NULL) {
958				skb->data[0] &= 0xF0;
959				skb->data[0] |= (rose_route->lci1 >> 8) & 0x0F;
960				skb->data[1]  = (rose_route->lci1 >> 0) & 0xFF;
961				rose_transmit_link(skb, rose_route->neigh1);
962				if (frametype == ROSE_CLEAR_CONFIRMATION)
963					rose_remove_route(rose_route);
964				res = 1;
965				goto out;
966			} else {
967				if (frametype == ROSE_CLEAR_CONFIRMATION)
968					rose_remove_route(rose_route);
969				goto out;
970			}
971		}
972		rose_route = rose_route->next;
973	}
974
975	/*
976	 *	We know that:
977	 *	1. The frame isn't for us,
978	 *	2. It isn't "owned" by any existing route.
979	 */
980	if (frametype != ROSE_CALL_REQUEST) {
981		res = 0;
982		goto out;
983	}
984
985	len  = (((skb->data[3] >> 4) & 0x0F) + 1) >> 1;
986	len += (((skb->data[3] >> 0) & 0x0F) + 1) >> 1;
987
988	memset(&facilities, 0x00, sizeof(struct rose_facilities_struct));
989
990	if (!rose_parse_facilities(skb->data + len + 4, &facilities)) {
991		rose_transmit_clear_request(rose_neigh, lci, ROSE_INVALID_FACILITY, 76);
992		goto out;
993	}
994
995	/*
996	 *	Check for routing loops.
997	 */
998	rose_route = rose_route_list;
999	while (rose_route != NULL) {
1000		if (rose_route->rand == facilities.rand &&
1001		    rosecmp(src_addr, &rose_route->src_addr) == 0 &&
1002		    ax25cmp(&facilities.dest_call, &rose_route->src_call) == 0 &&
1003		    ax25cmp(&facilities.source_call, &rose_route->dest_call) == 0) {
1004			rose_transmit_clear_request(rose_neigh, lci, ROSE_NOT_OBTAINABLE, 120);
1005			goto out;
1006		}
1007		rose_route = rose_route->next;
1008	}
1009
1010	if ((new_neigh = rose_get_neigh(dest_addr, &cause, &diagnostic, 1)) == NULL) {
1011		rose_transmit_clear_request(rose_neigh, lci, cause, diagnostic);
1012		goto out;
1013	}
1014
1015	if ((new_lci = rose_new_lci(new_neigh)) == 0) {
1016		rose_transmit_clear_request(rose_neigh, lci, ROSE_NETWORK_CONGESTION, 71);
1017		goto out;
1018	}
1019
1020	if ((rose_route = kmalloc(sizeof(*rose_route), GFP_ATOMIC)) == NULL) {
1021		rose_transmit_clear_request(rose_neigh, lci, ROSE_NETWORK_CONGESTION, 120);
1022		goto out;
1023	}
1024
1025	rose_route->lci1      = lci;
1026	rose_route->src_addr  = *src_addr;
1027	rose_route->dest_addr = *dest_addr;
1028	rose_route->src_call  = facilities.dest_call;
1029	rose_route->dest_call = facilities.source_call;
1030	rose_route->rand      = facilities.rand;
1031	rose_route->neigh1    = rose_neigh;
1032	rose_route->lci2      = new_lci;
1033	rose_route->neigh2    = new_neigh;
1034
1035	rose_route->neigh1->use++;
1036	rose_route->neigh2->use++;
1037
1038	rose_route->next = rose_route_list;
1039	rose_route_list  = rose_route;
1040
1041	skb->data[0] &= 0xF0;
1042	skb->data[0] |= (rose_route->lci2 >> 8) & 0x0F;
1043	skb->data[1]  = (rose_route->lci2 >> 0) & 0xFF;
1044
1045	rose_transmit_link(skb, rose_route->neigh2);
1046	res = 1;
1047
1048out:
1049	spin_unlock_bh(&rose_route_list_lock);
1050	spin_unlock_bh(&rose_neigh_list_lock);
1051
1052	return res;
1053}
1054
1055#ifdef CONFIG_PROC_FS
1056
1057static void *rose_node_start(struct seq_file *seq, loff_t *pos)
1058	__acquires(rose_node_list_lock)
1059{
1060	struct rose_node *rose_node;
1061	int i = 1;
1062
1063	spin_lock_bh(&rose_node_list_lock);
1064	if (*pos == 0)
1065		return SEQ_START_TOKEN;
1066
1067	for (rose_node = rose_node_list; rose_node && i < *pos;
1068	     rose_node = rose_node->next, ++i);
1069
1070	return (i == *pos) ? rose_node : NULL;
1071}
1072
1073static void *rose_node_next(struct seq_file *seq, void *v, loff_t *pos)
1074{
1075	++*pos;
1076
1077	return (v == SEQ_START_TOKEN) ? rose_node_list
1078		: ((struct rose_node *)v)->next;
1079}
1080
1081static void rose_node_stop(struct seq_file *seq, void *v)
1082	__releases(rose_node_list_lock)
1083{
1084	spin_unlock_bh(&rose_node_list_lock);
1085}
1086
1087static int rose_node_show(struct seq_file *seq, void *v)
1088{
1089	char rsbuf[11];
1090	int i;
1091
1092	if (v == SEQ_START_TOKEN)
1093		seq_puts(seq, "address    mask n neigh neigh neigh\n");
1094	else {
1095		const struct rose_node *rose_node = v;
1096		/* if (rose_node->loopback) {
1097			seq_printf(seq, "%-10s %04d 1 loopback\n",
1098				   rose2asc(rsbuf, &rose_node->address),
1099				   rose_node->mask);
1100		} else { */
1101			seq_printf(seq, "%-10s %04d %d",
1102				   rose2asc(rsbuf, &rose_node->address),
1103				   rose_node->mask,
1104				   rose_node->count);
1105
1106			for (i = 0; i < rose_node->count; i++)
1107				seq_printf(seq, " %05d",
1108					rose_node->neighbour[i]->number);
1109
1110			seq_puts(seq, "\n");
1111		/* } */
1112	}
1113	return 0;
1114}
1115
1116static const struct seq_operations rose_node_seqops = {
1117	.start = rose_node_start,
1118	.next = rose_node_next,
1119	.stop = rose_node_stop,
1120	.show = rose_node_show,
1121};
1122
1123static int rose_nodes_open(struct inode *inode, struct file *file)
1124{
1125	return seq_open(file, &rose_node_seqops);
1126}
1127
1128const struct file_operations rose_nodes_fops = {
1129	.owner = THIS_MODULE,
1130	.open = rose_nodes_open,
1131	.read = seq_read,
1132	.llseek = seq_lseek,
1133	.release = seq_release,
1134};
1135
1136static void *rose_neigh_start(struct seq_file *seq, loff_t *pos)
1137	__acquires(rose_neigh_list_lock)
1138{
1139	struct rose_neigh *rose_neigh;
1140	int i = 1;
1141
1142	spin_lock_bh(&rose_neigh_list_lock);
1143	if (*pos == 0)
1144		return SEQ_START_TOKEN;
1145
1146	for (rose_neigh = rose_neigh_list; rose_neigh && i < *pos;
1147	     rose_neigh = rose_neigh->next, ++i);
1148
1149	return (i == *pos) ? rose_neigh : NULL;
1150}
1151
1152static void *rose_neigh_next(struct seq_file *seq, void *v, loff_t *pos)
1153{
1154	++*pos;
1155
1156	return (v == SEQ_START_TOKEN) ? rose_neigh_list
1157		: ((struct rose_neigh *)v)->next;
1158}
1159
1160static void rose_neigh_stop(struct seq_file *seq, void *v)
1161	__releases(rose_neigh_list_lock)
1162{
1163	spin_unlock_bh(&rose_neigh_list_lock);
1164}
1165
1166static int rose_neigh_show(struct seq_file *seq, void *v)
1167{
1168	char buf[11];
1169	int i;
1170
1171	if (v == SEQ_START_TOKEN)
1172		seq_puts(seq,
1173			 "addr  callsign  dev  count use mode restart  t0  tf digipeaters\n");
1174	else {
1175		struct rose_neigh *rose_neigh = v;
1176
1177		/* if (!rose_neigh->loopback) { */
1178		seq_printf(seq, "%05d %-9s %-4s   %3d %3d  %3s     %3s %3lu %3lu",
1179			   rose_neigh->number,
1180			   (rose_neigh->loopback) ? "RSLOOP-0" : ax2asc(buf, &rose_neigh->callsign),
1181			   rose_neigh->dev ? rose_neigh->dev->name : "???",
1182			   rose_neigh->count,
1183			   rose_neigh->use,
1184			   (rose_neigh->dce_mode) ? "DCE" : "DTE",
1185			   (rose_neigh->restarted) ? "yes" : "no",
1186			   ax25_display_timer(&rose_neigh->t0timer) / HZ,
1187			   ax25_display_timer(&rose_neigh->ftimer)  / HZ);
1188
1189		if (rose_neigh->digipeat != NULL) {
1190			for (i = 0; i < rose_neigh->digipeat->ndigi; i++)
1191				seq_printf(seq, " %s", ax2asc(buf, &rose_neigh->digipeat->calls[i]));
1192		}
1193
1194		seq_puts(seq, "\n");
1195	}
1196	return 0;
1197}
1198
1199
1200static const struct seq_operations rose_neigh_seqops = {
1201	.start = rose_neigh_start,
1202	.next = rose_neigh_next,
1203	.stop = rose_neigh_stop,
1204	.show = rose_neigh_show,
1205};
1206
1207static int rose_neigh_open(struct inode *inode, struct file *file)
1208{
1209	return seq_open(file, &rose_neigh_seqops);
1210}
1211
1212const struct file_operations rose_neigh_fops = {
1213	.owner = THIS_MODULE,
1214	.open = rose_neigh_open,
1215	.read = seq_read,
1216	.llseek = seq_lseek,
1217	.release = seq_release,
1218};
1219
1220
1221static void *rose_route_start(struct seq_file *seq, loff_t *pos)
1222	__acquires(rose_route_list_lock)
1223{
1224	struct rose_route *rose_route;
1225	int i = 1;
1226
1227	spin_lock_bh(&rose_route_list_lock);
1228	if (*pos == 0)
1229		return SEQ_START_TOKEN;
1230
1231	for (rose_route = rose_route_list; rose_route && i < *pos;
1232	     rose_route = rose_route->next, ++i);
1233
1234	return (i == *pos) ? rose_route : NULL;
1235}
1236
1237static void *rose_route_next(struct seq_file *seq, void *v, loff_t *pos)
1238{
1239	++*pos;
1240
1241	return (v == SEQ_START_TOKEN) ? rose_route_list
1242		: ((struct rose_route *)v)->next;
1243}
1244
1245static void rose_route_stop(struct seq_file *seq, void *v)
1246	__releases(rose_route_list_lock)
1247{
1248	spin_unlock_bh(&rose_route_list_lock);
1249}
1250
1251static int rose_route_show(struct seq_file *seq, void *v)
1252{
1253	char buf[11], rsbuf[11];
1254
1255	if (v == SEQ_START_TOKEN)
1256		seq_puts(seq,
1257			 "lci  address     callsign   neigh  <-> lci  address     callsign   neigh\n");
1258	else {
1259		struct rose_route *rose_route = v;
1260
1261		if (rose_route->neigh1)
1262			seq_printf(seq,
1263				   "%3.3X  %-10s  %-9s  %05d      ",
1264				   rose_route->lci1,
1265				   rose2asc(rsbuf, &rose_route->src_addr),
1266				   ax2asc(buf, &rose_route->src_call),
1267				   rose_route->neigh1->number);
1268		else
1269			seq_puts(seq,
1270				 "000  *           *          00000      ");
1271
1272		if (rose_route->neigh2)
1273			seq_printf(seq,
1274				   "%3.3X  %-10s  %-9s  %05d\n",
1275				   rose_route->lci2,
1276				   rose2asc(rsbuf, &rose_route->dest_addr),
1277				   ax2asc(buf, &rose_route->dest_call),
1278				   rose_route->neigh2->number);
1279		 else
1280			 seq_puts(seq,
1281				  "000  *           *          00000\n");
1282		}
1283	return 0;
1284}
1285
1286static const struct seq_operations rose_route_seqops = {
1287	.start = rose_route_start,
1288	.next = rose_route_next,
1289	.stop = rose_route_stop,
1290	.show = rose_route_show,
1291};
1292
1293static int rose_route_open(struct inode *inode, struct file *file)
1294{
1295	return seq_open(file, &rose_route_seqops);
1296}
1297
1298const struct file_operations rose_routes_fops = {
1299	.owner = THIS_MODULE,
1300	.open = rose_route_open,
1301	.read = seq_read,
1302	.llseek = seq_lseek,
1303	.release = seq_release,
1304};
1305
1306#endif /* CONFIG_PROC_FS */
1307
1308/*
1309 *	Release all memory associated with ROSE routing structures.
1310 */
1311void __exit rose_rt_free(void)
1312{
1313	struct rose_neigh *s, *rose_neigh = rose_neigh_list;
1314	struct rose_node  *t, *rose_node  = rose_node_list;
1315	struct rose_route *u, *rose_route = rose_route_list;
1316
1317	while (rose_neigh != NULL) {
1318		s          = rose_neigh;
1319		rose_neigh = rose_neigh->next;
1320
1321		rose_remove_neigh(s);
1322	}
1323
1324	while (rose_node != NULL) {
1325		t         = rose_node;
1326		rose_node = rose_node->next;
1327
1328		rose_remove_node(t);
1329	}
1330
1331	while (rose_route != NULL) {
1332		u          = rose_route;
1333		rose_route = rose_route->next;
1334
1335		rose_remove_route(u);
1336	}
1337}
1338