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