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