xref: /openbmc/linux/net/netrom/nr_route.c (revision 6d99a79c)
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 Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
8  * Copyright Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
9  * Copyright Tomi Manninen OH2BNS (oh2bns@sral.fi)
10  */
11 #include <linux/errno.h>
12 #include <linux/types.h>
13 #include <linux/socket.h>
14 #include <linux/in.h>
15 #include <linux/kernel.h>
16 #include <linux/timer.h>
17 #include <linux/string.h>
18 #include <linux/sockios.h>
19 #include <linux/net.h>
20 #include <linux/slab.h>
21 #include <net/ax25.h>
22 #include <linux/inet.h>
23 #include <linux/netdevice.h>
24 #include <net/arp.h>
25 #include <linux/if_arp.h>
26 #include <linux/skbuff.h>
27 #include <net/sock.h>
28 #include <linux/uaccess.h>
29 #include <linux/fcntl.h>
30 #include <linux/termios.h>	/* For TIOCINQ/OUTQ */
31 #include <linux/mm.h>
32 #include <linux/interrupt.h>
33 #include <linux/notifier.h>
34 #include <linux/init.h>
35 #include <linux/spinlock.h>
36 #include <net/netrom.h>
37 #include <linux/seq_file.h>
38 #include <linux/export.h>
39 
40 static unsigned int nr_neigh_no = 1;
41 
42 static HLIST_HEAD(nr_node_list);
43 static DEFINE_SPINLOCK(nr_node_list_lock);
44 static HLIST_HEAD(nr_neigh_list);
45 static DEFINE_SPINLOCK(nr_neigh_list_lock);
46 
47 static struct nr_node *nr_node_get(ax25_address *callsign)
48 {
49 	struct nr_node *found = NULL;
50 	struct nr_node *nr_node;
51 
52 	spin_lock_bh(&nr_node_list_lock);
53 	nr_node_for_each(nr_node, &nr_node_list)
54 		if (ax25cmp(callsign, &nr_node->callsign) == 0) {
55 			nr_node_hold(nr_node);
56 			found = nr_node;
57 			break;
58 		}
59 	spin_unlock_bh(&nr_node_list_lock);
60 	return found;
61 }
62 
63 static struct nr_neigh *nr_neigh_get_dev(ax25_address *callsign,
64 					 struct net_device *dev)
65 {
66 	struct nr_neigh *found = NULL;
67 	struct nr_neigh *nr_neigh;
68 
69 	spin_lock_bh(&nr_neigh_list_lock);
70 	nr_neigh_for_each(nr_neigh, &nr_neigh_list)
71 		if (ax25cmp(callsign, &nr_neigh->callsign) == 0 &&
72 		    nr_neigh->dev == dev) {
73 			nr_neigh_hold(nr_neigh);
74 			found = nr_neigh;
75 			break;
76 		}
77 	spin_unlock_bh(&nr_neigh_list_lock);
78 	return found;
79 }
80 
81 static void nr_remove_neigh(struct nr_neigh *);
82 
83 /*      re-sort the routes in quality order.    */
84 static void re_sort_routes(struct nr_node *nr_node, int x, int y)
85 {
86 	if (nr_node->routes[y].quality > nr_node->routes[x].quality) {
87 		if (nr_node->which == x)
88 			nr_node->which = y;
89 		else if (nr_node->which == y)
90 			nr_node->which = x;
91 
92 		swap(nr_node->routes[x], nr_node->routes[y]);
93 	}
94 }
95 
96 /*
97  *	Add a new route to a node, and in the process add the node and the
98  *	neighbour if it is new.
99  */
100 static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
101 	ax25_address *ax25, ax25_digi *ax25_digi, struct net_device *dev,
102 	int quality, int obs_count)
103 {
104 	struct nr_node  *nr_node;
105 	struct nr_neigh *nr_neigh;
106 	int i, found;
107 	struct net_device *odev;
108 
109 	if ((odev=nr_dev_get(nr)) != NULL) {	/* Can't add routes to ourself */
110 		dev_put(odev);
111 		return -EINVAL;
112 	}
113 
114 	nr_node = nr_node_get(nr);
115 
116 	nr_neigh = nr_neigh_get_dev(ax25, dev);
117 
118 	/*
119 	 * The L2 link to a neighbour has failed in the past
120 	 * and now a frame comes from this neighbour. We assume
121 	 * it was a temporary trouble with the link and reset the
122 	 * routes now (and not wait for a node broadcast).
123 	 */
124 	if (nr_neigh != NULL && nr_neigh->failed != 0 && quality == 0) {
125 		struct nr_node *nr_nodet;
126 
127 		spin_lock_bh(&nr_node_list_lock);
128 		nr_node_for_each(nr_nodet, &nr_node_list) {
129 			nr_node_lock(nr_nodet);
130 			for (i = 0; i < nr_nodet->count; i++)
131 				if (nr_nodet->routes[i].neighbour == nr_neigh)
132 					if (i < nr_nodet->which)
133 						nr_nodet->which = i;
134 			nr_node_unlock(nr_nodet);
135 		}
136 		spin_unlock_bh(&nr_node_list_lock);
137 	}
138 
139 	if (nr_neigh != NULL)
140 		nr_neigh->failed = 0;
141 
142 	if (quality == 0 && nr_neigh != NULL && nr_node != NULL) {
143 		nr_neigh_put(nr_neigh);
144 		nr_node_put(nr_node);
145 		return 0;
146 	}
147 
148 	if (nr_neigh == NULL) {
149 		if ((nr_neigh = kmalloc(sizeof(*nr_neigh), GFP_ATOMIC)) == NULL) {
150 			if (nr_node)
151 				nr_node_put(nr_node);
152 			return -ENOMEM;
153 		}
154 
155 		nr_neigh->callsign = *ax25;
156 		nr_neigh->digipeat = NULL;
157 		nr_neigh->ax25     = NULL;
158 		nr_neigh->dev      = dev;
159 		nr_neigh->quality  = sysctl_netrom_default_path_quality;
160 		nr_neigh->locked   = 0;
161 		nr_neigh->count    = 0;
162 		nr_neigh->number   = nr_neigh_no++;
163 		nr_neigh->failed   = 0;
164 		refcount_set(&nr_neigh->refcount, 1);
165 
166 		if (ax25_digi != NULL && ax25_digi->ndigi > 0) {
167 			nr_neigh->digipeat = kmemdup(ax25_digi,
168 						     sizeof(*ax25_digi),
169 						     GFP_KERNEL);
170 			if (nr_neigh->digipeat == NULL) {
171 				kfree(nr_neigh);
172 				if (nr_node)
173 					nr_node_put(nr_node);
174 				return -ENOMEM;
175 			}
176 		}
177 
178 		spin_lock_bh(&nr_neigh_list_lock);
179 		hlist_add_head(&nr_neigh->neigh_node, &nr_neigh_list);
180 		nr_neigh_hold(nr_neigh);
181 		spin_unlock_bh(&nr_neigh_list_lock);
182 	}
183 
184 	if (quality != 0 && ax25cmp(nr, ax25) == 0 && !nr_neigh->locked)
185 		nr_neigh->quality = quality;
186 
187 	if (nr_node == NULL) {
188 		if ((nr_node = kmalloc(sizeof(*nr_node), GFP_ATOMIC)) == NULL) {
189 			if (nr_neigh)
190 				nr_neigh_put(nr_neigh);
191 			return -ENOMEM;
192 		}
193 
194 		nr_node->callsign = *nr;
195 		strcpy(nr_node->mnemonic, mnemonic);
196 
197 		nr_node->which = 0;
198 		nr_node->count = 1;
199 		refcount_set(&nr_node->refcount, 1);
200 		spin_lock_init(&nr_node->node_lock);
201 
202 		nr_node->routes[0].quality   = quality;
203 		nr_node->routes[0].obs_count = obs_count;
204 		nr_node->routes[0].neighbour = nr_neigh;
205 
206 		nr_neigh_hold(nr_neigh);
207 		nr_neigh->count++;
208 
209 		spin_lock_bh(&nr_node_list_lock);
210 		hlist_add_head(&nr_node->node_node, &nr_node_list);
211 		/* refcount initialized at 1 */
212 		spin_unlock_bh(&nr_node_list_lock);
213 
214 		return 0;
215 	}
216 	nr_node_lock(nr_node);
217 
218 	if (quality != 0)
219 		strcpy(nr_node->mnemonic, mnemonic);
220 
221 	for (found = 0, i = 0; i < nr_node->count; i++) {
222 		if (nr_node->routes[i].neighbour == nr_neigh) {
223 			nr_node->routes[i].quality   = quality;
224 			nr_node->routes[i].obs_count = obs_count;
225 			found = 1;
226 			break;
227 		}
228 	}
229 
230 	if (!found) {
231 		/* We have space at the bottom, slot it in */
232 		if (nr_node->count < 3) {
233 			nr_node->routes[2] = nr_node->routes[1];
234 			nr_node->routes[1] = nr_node->routes[0];
235 
236 			nr_node->routes[0].quality   = quality;
237 			nr_node->routes[0].obs_count = obs_count;
238 			nr_node->routes[0].neighbour = nr_neigh;
239 
240 			nr_node->which++;
241 			nr_node->count++;
242 			nr_neigh_hold(nr_neigh);
243 			nr_neigh->count++;
244 		} else {
245 			/* It must be better than the worst */
246 			if (quality > nr_node->routes[2].quality) {
247 				nr_node->routes[2].neighbour->count--;
248 				nr_neigh_put(nr_node->routes[2].neighbour);
249 
250 				if (nr_node->routes[2].neighbour->count == 0 && !nr_node->routes[2].neighbour->locked)
251 					nr_remove_neigh(nr_node->routes[2].neighbour);
252 
253 				nr_node->routes[2].quality   = quality;
254 				nr_node->routes[2].obs_count = obs_count;
255 				nr_node->routes[2].neighbour = nr_neigh;
256 
257 				nr_neigh_hold(nr_neigh);
258 				nr_neigh->count++;
259 			}
260 		}
261 	}
262 
263 	/* Now re-sort the routes in quality order */
264 	switch (nr_node->count) {
265 	case 3:
266 		re_sort_routes(nr_node, 0, 1);
267 		re_sort_routes(nr_node, 1, 2);
268 		/* fall through */
269 	case 2:
270 		re_sort_routes(nr_node, 0, 1);
271 	case 1:
272 		break;
273 	}
274 
275 	for (i = 0; i < nr_node->count; i++) {
276 		if (nr_node->routes[i].neighbour == nr_neigh) {
277 			if (i < nr_node->which)
278 				nr_node->which = i;
279 			break;
280 		}
281 	}
282 
283 	nr_neigh_put(nr_neigh);
284 	nr_node_unlock(nr_node);
285 	nr_node_put(nr_node);
286 	return 0;
287 }
288 
289 static inline void __nr_remove_node(struct nr_node *nr_node)
290 {
291 	hlist_del_init(&nr_node->node_node);
292 	nr_node_put(nr_node);
293 }
294 
295 #define nr_remove_node_locked(__node) \
296 	__nr_remove_node(__node)
297 
298 static void nr_remove_node(struct nr_node *nr_node)
299 {
300 	spin_lock_bh(&nr_node_list_lock);
301 	__nr_remove_node(nr_node);
302 	spin_unlock_bh(&nr_node_list_lock);
303 }
304 
305 static inline void __nr_remove_neigh(struct nr_neigh *nr_neigh)
306 {
307 	hlist_del_init(&nr_neigh->neigh_node);
308 	nr_neigh_put(nr_neigh);
309 }
310 
311 #define nr_remove_neigh_locked(__neigh) \
312 	__nr_remove_neigh(__neigh)
313 
314 static void nr_remove_neigh(struct nr_neigh *nr_neigh)
315 {
316 	spin_lock_bh(&nr_neigh_list_lock);
317 	__nr_remove_neigh(nr_neigh);
318 	spin_unlock_bh(&nr_neigh_list_lock);
319 }
320 
321 /*
322  *	"Delete" a node. Strictly speaking remove a route to a node. The node
323  *	is only deleted if no routes are left to it.
324  */
325 static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct net_device *dev)
326 {
327 	struct nr_node  *nr_node;
328 	struct nr_neigh *nr_neigh;
329 	int i;
330 
331 	nr_node = nr_node_get(callsign);
332 
333 	if (nr_node == NULL)
334 		return -EINVAL;
335 
336 	nr_neigh = nr_neigh_get_dev(neighbour, dev);
337 
338 	if (nr_neigh == NULL) {
339 		nr_node_put(nr_node);
340 		return -EINVAL;
341 	}
342 
343 	nr_node_lock(nr_node);
344 	for (i = 0; i < nr_node->count; i++) {
345 		if (nr_node->routes[i].neighbour == nr_neigh) {
346 			nr_neigh->count--;
347 			nr_neigh_put(nr_neigh);
348 
349 			if (nr_neigh->count == 0 && !nr_neigh->locked)
350 				nr_remove_neigh(nr_neigh);
351 			nr_neigh_put(nr_neigh);
352 
353 			nr_node->count--;
354 
355 			if (nr_node->count == 0) {
356 				nr_remove_node(nr_node);
357 			} else {
358 				switch (i) {
359 				case 0:
360 					nr_node->routes[0] = nr_node->routes[1];
361 					/* fall through */
362 				case 1:
363 					nr_node->routes[1] = nr_node->routes[2];
364 				case 2:
365 					break;
366 				}
367 				nr_node_put(nr_node);
368 			}
369 			nr_node_unlock(nr_node);
370 
371 			return 0;
372 		}
373 	}
374 	nr_neigh_put(nr_neigh);
375 	nr_node_unlock(nr_node);
376 	nr_node_put(nr_node);
377 
378 	return -EINVAL;
379 }
380 
381 /*
382  *	Lock a neighbour with a quality.
383  */
384 static int __must_check nr_add_neigh(ax25_address *callsign,
385 	ax25_digi *ax25_digi, struct net_device *dev, unsigned int quality)
386 {
387 	struct nr_neigh *nr_neigh;
388 
389 	nr_neigh = nr_neigh_get_dev(callsign, dev);
390 	if (nr_neigh) {
391 		nr_neigh->quality = quality;
392 		nr_neigh->locked  = 1;
393 		nr_neigh_put(nr_neigh);
394 		return 0;
395 	}
396 
397 	if ((nr_neigh = kmalloc(sizeof(*nr_neigh), GFP_ATOMIC)) == NULL)
398 		return -ENOMEM;
399 
400 	nr_neigh->callsign = *callsign;
401 	nr_neigh->digipeat = NULL;
402 	nr_neigh->ax25     = NULL;
403 	nr_neigh->dev      = dev;
404 	nr_neigh->quality  = quality;
405 	nr_neigh->locked   = 1;
406 	nr_neigh->count    = 0;
407 	nr_neigh->number   = nr_neigh_no++;
408 	nr_neigh->failed   = 0;
409 	refcount_set(&nr_neigh->refcount, 1);
410 
411 	if (ax25_digi != NULL && ax25_digi->ndigi > 0) {
412 		nr_neigh->digipeat = kmemdup(ax25_digi, sizeof(*ax25_digi),
413 					     GFP_KERNEL);
414 		if (nr_neigh->digipeat == NULL) {
415 			kfree(nr_neigh);
416 			return -ENOMEM;
417 		}
418 	}
419 
420 	spin_lock_bh(&nr_neigh_list_lock);
421 	hlist_add_head(&nr_neigh->neigh_node, &nr_neigh_list);
422 	/* refcount is initialized at 1 */
423 	spin_unlock_bh(&nr_neigh_list_lock);
424 
425 	return 0;
426 }
427 
428 /*
429  *	"Delete" a neighbour. The neighbour is only removed if the number
430  *	of nodes that may use it is zero.
431  */
432 static int nr_del_neigh(ax25_address *callsign, struct net_device *dev, unsigned int quality)
433 {
434 	struct nr_neigh *nr_neigh;
435 
436 	nr_neigh = nr_neigh_get_dev(callsign, dev);
437 
438 	if (nr_neigh == NULL) return -EINVAL;
439 
440 	nr_neigh->quality = quality;
441 	nr_neigh->locked  = 0;
442 
443 	if (nr_neigh->count == 0)
444 		nr_remove_neigh(nr_neigh);
445 	nr_neigh_put(nr_neigh);
446 
447 	return 0;
448 }
449 
450 /*
451  *	Decrement the obsolescence count by one. If a route is reduced to a
452  *	count of zero, remove it. Also remove any unlocked neighbours with
453  *	zero nodes routing via it.
454  */
455 static int nr_dec_obs(void)
456 {
457 	struct nr_neigh *nr_neigh;
458 	struct nr_node  *s;
459 	struct hlist_node *nodet;
460 	int i;
461 
462 	spin_lock_bh(&nr_node_list_lock);
463 	nr_node_for_each_safe(s, nodet, &nr_node_list) {
464 		nr_node_lock(s);
465 		for (i = 0; i < s->count; i++) {
466 			switch (s->routes[i].obs_count) {
467 			case 0:		/* A locked entry */
468 				break;
469 
470 			case 1:		/* From 1 -> 0 */
471 				nr_neigh = s->routes[i].neighbour;
472 
473 				nr_neigh->count--;
474 				nr_neigh_put(nr_neigh);
475 
476 				if (nr_neigh->count == 0 && !nr_neigh->locked)
477 					nr_remove_neigh(nr_neigh);
478 
479 				s->count--;
480 
481 				switch (i) {
482 				case 0:
483 					s->routes[0] = s->routes[1];
484 					/* Fallthrough */
485 				case 1:
486 					s->routes[1] = s->routes[2];
487 				case 2:
488 					break;
489 				}
490 				break;
491 
492 			default:
493 				s->routes[i].obs_count--;
494 				break;
495 
496 			}
497 		}
498 
499 		if (s->count <= 0)
500 			nr_remove_node_locked(s);
501 		nr_node_unlock(s);
502 	}
503 	spin_unlock_bh(&nr_node_list_lock);
504 
505 	return 0;
506 }
507 
508 /*
509  *	A device has been removed. Remove its routes and neighbours.
510  */
511 void nr_rt_device_down(struct net_device *dev)
512 {
513 	struct nr_neigh *s;
514 	struct hlist_node *nodet, *node2t;
515 	struct nr_node  *t;
516 	int i;
517 
518 	spin_lock_bh(&nr_neigh_list_lock);
519 	nr_neigh_for_each_safe(s, nodet, &nr_neigh_list) {
520 		if (s->dev == dev) {
521 			spin_lock_bh(&nr_node_list_lock);
522 			nr_node_for_each_safe(t, node2t, &nr_node_list) {
523 				nr_node_lock(t);
524 				for (i = 0; i < t->count; i++) {
525 					if (t->routes[i].neighbour == s) {
526 						t->count--;
527 
528 						switch (i) {
529 						case 0:
530 							t->routes[0] = t->routes[1];
531 							/* fall through */
532 						case 1:
533 							t->routes[1] = t->routes[2];
534 						case 2:
535 							break;
536 						}
537 					}
538 				}
539 
540 				if (t->count <= 0)
541 					nr_remove_node_locked(t);
542 				nr_node_unlock(t);
543 			}
544 			spin_unlock_bh(&nr_node_list_lock);
545 
546 			nr_remove_neigh_locked(s);
547 		}
548 	}
549 	spin_unlock_bh(&nr_neigh_list_lock);
550 }
551 
552 /*
553  *	Check that the device given is a valid AX.25 interface that is "up".
554  *	Or a valid ethernet interface with an AX.25 callsign binding.
555  */
556 static struct net_device *nr_ax25_dev_get(char *devname)
557 {
558 	struct net_device *dev;
559 
560 	if ((dev = dev_get_by_name(&init_net, devname)) == NULL)
561 		return NULL;
562 
563 	if ((dev->flags & IFF_UP) && dev->type == ARPHRD_AX25)
564 		return dev;
565 
566 	dev_put(dev);
567 	return NULL;
568 }
569 
570 /*
571  *	Find the first active NET/ROM device, usually "nr0".
572  */
573 struct net_device *nr_dev_first(void)
574 {
575 	struct net_device *dev, *first = NULL;
576 
577 	rcu_read_lock();
578 	for_each_netdev_rcu(&init_net, dev) {
579 		if ((dev->flags & IFF_UP) && dev->type == ARPHRD_NETROM)
580 			if (first == NULL || strncmp(dev->name, first->name, 3) < 0)
581 				first = dev;
582 	}
583 	if (first)
584 		dev_hold(first);
585 	rcu_read_unlock();
586 
587 	return first;
588 }
589 
590 /*
591  *	Find the NET/ROM device for the given callsign.
592  */
593 struct net_device *nr_dev_get(ax25_address *addr)
594 {
595 	struct net_device *dev;
596 
597 	rcu_read_lock();
598 	for_each_netdev_rcu(&init_net, dev) {
599 		if ((dev->flags & IFF_UP) && dev->type == ARPHRD_NETROM &&
600 		    ax25cmp(addr, (ax25_address *)dev->dev_addr) == 0) {
601 			dev_hold(dev);
602 			goto out;
603 		}
604 	}
605 	dev = NULL;
606 out:
607 	rcu_read_unlock();
608 	return dev;
609 }
610 
611 static ax25_digi *nr_call_to_digi(ax25_digi *digi, int ndigis,
612 	ax25_address *digipeaters)
613 {
614 	int i;
615 
616 	if (ndigis == 0)
617 		return NULL;
618 
619 	for (i = 0; i < ndigis; i++) {
620 		digi->calls[i]    = digipeaters[i];
621 		digi->repeated[i] = 0;
622 	}
623 
624 	digi->ndigi      = ndigis;
625 	digi->lastrepeat = -1;
626 
627 	return digi;
628 }
629 
630 /*
631  *	Handle the ioctls that control the routing functions.
632  */
633 int nr_rt_ioctl(unsigned int cmd, void __user *arg)
634 {
635 	struct nr_route_struct nr_route;
636 	struct net_device *dev;
637 	ax25_digi digi;
638 	int ret;
639 
640 	switch (cmd) {
641 	case SIOCADDRT:
642 		if (copy_from_user(&nr_route, arg, sizeof(struct nr_route_struct)))
643 			return -EFAULT;
644 		if (nr_route.ndigis > AX25_MAX_DIGIS)
645 			return -EINVAL;
646 		if ((dev = nr_ax25_dev_get(nr_route.device)) == NULL)
647 			return -EINVAL;
648 		switch (nr_route.type) {
649 		case NETROM_NODE:
650 			if (strnlen(nr_route.mnemonic, 7) == 7) {
651 				ret = -EINVAL;
652 				break;
653 			}
654 
655 			ret = nr_add_node(&nr_route.callsign,
656 				nr_route.mnemonic,
657 				&nr_route.neighbour,
658 				nr_call_to_digi(&digi, nr_route.ndigis,
659 						nr_route.digipeaters),
660 				dev, nr_route.quality,
661 				nr_route.obs_count);
662 			break;
663 		case NETROM_NEIGH:
664 			ret = nr_add_neigh(&nr_route.callsign,
665 				nr_call_to_digi(&digi, nr_route.ndigis,
666 						nr_route.digipeaters),
667 				dev, nr_route.quality);
668 			break;
669 		default:
670 			ret = -EINVAL;
671 		}
672 		dev_put(dev);
673 		return ret;
674 
675 	case SIOCDELRT:
676 		if (copy_from_user(&nr_route, arg, sizeof(struct nr_route_struct)))
677 			return -EFAULT;
678 		if ((dev = nr_ax25_dev_get(nr_route.device)) == NULL)
679 			return -EINVAL;
680 		switch (nr_route.type) {
681 		case NETROM_NODE:
682 			ret = nr_del_node(&nr_route.callsign,
683 				&nr_route.neighbour, dev);
684 			break;
685 		case NETROM_NEIGH:
686 			ret = nr_del_neigh(&nr_route.callsign,
687 				dev, nr_route.quality);
688 			break;
689 		default:
690 			ret = -EINVAL;
691 		}
692 		dev_put(dev);
693 		return ret;
694 
695 	case SIOCNRDECOBS:
696 		return nr_dec_obs();
697 
698 	default:
699 		return -EINVAL;
700 	}
701 
702 	return 0;
703 }
704 
705 /*
706  * 	A level 2 link has timed out, therefore it appears to be a poor link,
707  *	then don't use that neighbour until it is reset.
708  */
709 void nr_link_failed(ax25_cb *ax25, int reason)
710 {
711 	struct nr_neigh *s, *nr_neigh = NULL;
712 	struct nr_node  *nr_node = NULL;
713 
714 	spin_lock_bh(&nr_neigh_list_lock);
715 	nr_neigh_for_each(s, &nr_neigh_list) {
716 		if (s->ax25 == ax25) {
717 			nr_neigh_hold(s);
718 			nr_neigh = s;
719 			break;
720 		}
721 	}
722 	spin_unlock_bh(&nr_neigh_list_lock);
723 
724 	if (nr_neigh == NULL)
725 		return;
726 
727 	nr_neigh->ax25 = NULL;
728 	ax25_cb_put(ax25);
729 
730 	if (++nr_neigh->failed < sysctl_netrom_link_fails_count) {
731 		nr_neigh_put(nr_neigh);
732 		return;
733 	}
734 	spin_lock_bh(&nr_node_list_lock);
735 	nr_node_for_each(nr_node, &nr_node_list) {
736 		nr_node_lock(nr_node);
737 		if (nr_node->which < nr_node->count &&
738 		    nr_node->routes[nr_node->which].neighbour == nr_neigh)
739 			nr_node->which++;
740 		nr_node_unlock(nr_node);
741 	}
742 	spin_unlock_bh(&nr_node_list_lock);
743 	nr_neigh_put(nr_neigh);
744 }
745 
746 /*
747  *	Route a frame to an appropriate AX.25 connection. A NULL ax25_cb
748  *	indicates an internally generated frame.
749  */
750 int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
751 {
752 	ax25_address *nr_src, *nr_dest;
753 	struct nr_neigh *nr_neigh;
754 	struct nr_node  *nr_node;
755 	struct net_device *dev;
756 	unsigned char *dptr;
757 	ax25_cb *ax25s;
758 	int ret;
759 	struct sk_buff *skbn;
760 
761 
762 	nr_src  = (ax25_address *)(skb->data + 0);
763 	nr_dest = (ax25_address *)(skb->data + 7);
764 
765 	if (ax25 != NULL) {
766 		ret = nr_add_node(nr_src, "", &ax25->dest_addr, ax25->digipeat,
767 				  ax25->ax25_dev->dev, 0,
768 				  sysctl_netrom_obsolescence_count_initialiser);
769 		if (ret)
770 			return ret;
771 	}
772 
773 	if ((dev = nr_dev_get(nr_dest)) != NULL) {	/* Its for me */
774 		if (ax25 == NULL)			/* Its from me */
775 			ret = nr_loopback_queue(skb);
776 		else
777 			ret = nr_rx_frame(skb, dev);
778 		dev_put(dev);
779 		return ret;
780 	}
781 
782 	if (!sysctl_netrom_routing_control && ax25 != NULL)
783 		return 0;
784 
785 	/* Its Time-To-Live has expired */
786 	if (skb->data[14] == 1) {
787 		return 0;
788 	}
789 
790 	nr_node = nr_node_get(nr_dest);
791 	if (nr_node == NULL)
792 		return 0;
793 	nr_node_lock(nr_node);
794 
795 	if (nr_node->which >= nr_node->count) {
796 		nr_node_unlock(nr_node);
797 		nr_node_put(nr_node);
798 		return 0;
799 	}
800 
801 	nr_neigh = nr_node->routes[nr_node->which].neighbour;
802 
803 	if ((dev = nr_dev_first()) == NULL) {
804 		nr_node_unlock(nr_node);
805 		nr_node_put(nr_node);
806 		return 0;
807 	}
808 
809 	/* We are going to change the netrom headers so we should get our
810 	   own skb, we also did not know until now how much header space
811 	   we had to reserve... - RXQ */
812 	if ((skbn=skb_copy_expand(skb, dev->hard_header_len, 0, GFP_ATOMIC)) == NULL) {
813 		nr_node_unlock(nr_node);
814 		nr_node_put(nr_node);
815 		dev_put(dev);
816 		return 0;
817 	}
818 	kfree_skb(skb);
819 	skb=skbn;
820 	skb->data[14]--;
821 
822 	dptr  = skb_push(skb, 1);
823 	*dptr = AX25_P_NETROM;
824 
825 	ax25s = nr_neigh->ax25;
826 	nr_neigh->ax25 = ax25_send_frame(skb, 256,
827 					 (ax25_address *)dev->dev_addr,
828 					 &nr_neigh->callsign,
829 					 nr_neigh->digipeat, nr_neigh->dev);
830 	if (ax25s)
831 		ax25_cb_put(ax25s);
832 
833 	dev_put(dev);
834 	ret = (nr_neigh->ax25 != NULL);
835 	nr_node_unlock(nr_node);
836 	nr_node_put(nr_node);
837 
838 	return ret;
839 }
840 
841 #ifdef CONFIG_PROC_FS
842 
843 static void *nr_node_start(struct seq_file *seq, loff_t *pos)
844 {
845 	spin_lock_bh(&nr_node_list_lock);
846 	return seq_hlist_start_head(&nr_node_list, *pos);
847 }
848 
849 static void *nr_node_next(struct seq_file *seq, void *v, loff_t *pos)
850 {
851 	return seq_hlist_next(v, &nr_node_list, pos);
852 }
853 
854 static void nr_node_stop(struct seq_file *seq, void *v)
855 {
856 	spin_unlock_bh(&nr_node_list_lock);
857 }
858 
859 static int nr_node_show(struct seq_file *seq, void *v)
860 {
861 	char buf[11];
862 	int i;
863 
864 	if (v == SEQ_START_TOKEN)
865 		seq_puts(seq,
866 			 "callsign  mnemonic w n qual obs neigh qual obs neigh qual obs neigh\n");
867 	else {
868 		struct nr_node *nr_node = hlist_entry(v, struct nr_node,
869 						      node_node);
870 
871 		nr_node_lock(nr_node);
872 		seq_printf(seq, "%-9s %-7s  %d %d",
873 			ax2asc(buf, &nr_node->callsign),
874 			(nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic,
875 			nr_node->which + 1,
876 			nr_node->count);
877 
878 		for (i = 0; i < nr_node->count; i++) {
879 			seq_printf(seq, "  %3d   %d %05d",
880 				nr_node->routes[i].quality,
881 				nr_node->routes[i].obs_count,
882 				nr_node->routes[i].neighbour->number);
883 		}
884 		nr_node_unlock(nr_node);
885 
886 		seq_puts(seq, "\n");
887 	}
888 	return 0;
889 }
890 
891 const struct seq_operations nr_node_seqops = {
892 	.start = nr_node_start,
893 	.next = nr_node_next,
894 	.stop = nr_node_stop,
895 	.show = nr_node_show,
896 };
897 
898 static void *nr_neigh_start(struct seq_file *seq, loff_t *pos)
899 {
900 	spin_lock_bh(&nr_neigh_list_lock);
901 	return seq_hlist_start_head(&nr_neigh_list, *pos);
902 }
903 
904 static void *nr_neigh_next(struct seq_file *seq, void *v, loff_t *pos)
905 {
906 	return seq_hlist_next(v, &nr_neigh_list, pos);
907 }
908 
909 static void nr_neigh_stop(struct seq_file *seq, void *v)
910 {
911 	spin_unlock_bh(&nr_neigh_list_lock);
912 }
913 
914 static int nr_neigh_show(struct seq_file *seq, void *v)
915 {
916 	char buf[11];
917 	int i;
918 
919 	if (v == SEQ_START_TOKEN)
920 		seq_puts(seq, "addr  callsign  dev  qual lock count failed digipeaters\n");
921 	else {
922 		struct nr_neigh *nr_neigh;
923 
924 		nr_neigh = hlist_entry(v, struct nr_neigh, neigh_node);
925 		seq_printf(seq, "%05d %-9s %-4s  %3d    %d   %3d    %3d",
926 			nr_neigh->number,
927 			ax2asc(buf, &nr_neigh->callsign),
928 			nr_neigh->dev ? nr_neigh->dev->name : "???",
929 			nr_neigh->quality,
930 			nr_neigh->locked,
931 			nr_neigh->count,
932 			nr_neigh->failed);
933 
934 		if (nr_neigh->digipeat != NULL) {
935 			for (i = 0; i < nr_neigh->digipeat->ndigi; i++)
936 				seq_printf(seq, " %s",
937 					   ax2asc(buf, &nr_neigh->digipeat->calls[i]));
938 		}
939 
940 		seq_puts(seq, "\n");
941 	}
942 	return 0;
943 }
944 
945 const struct seq_operations nr_neigh_seqops = {
946 	.start = nr_neigh_start,
947 	.next = nr_neigh_next,
948 	.stop = nr_neigh_stop,
949 	.show = nr_neigh_show,
950 };
951 #endif
952 
953 /*
954  *	Free all memory associated with the nodes and routes lists.
955  */
956 void __exit nr_rt_free(void)
957 {
958 	struct nr_neigh *s = NULL;
959 	struct nr_node  *t = NULL;
960 	struct hlist_node *nodet;
961 
962 	spin_lock_bh(&nr_neigh_list_lock);
963 	spin_lock_bh(&nr_node_list_lock);
964 	nr_node_for_each_safe(t, nodet, &nr_node_list) {
965 		nr_node_lock(t);
966 		nr_remove_node_locked(t);
967 		nr_node_unlock(t);
968 	}
969 	nr_neigh_for_each_safe(s, nodet, &nr_neigh_list) {
970 		while(s->count) {
971 			s->count--;
972 			nr_neigh_put(s);
973 		}
974 		nr_remove_neigh_locked(s);
975 	}
976 	spin_unlock_bh(&nr_node_list_lock);
977 	spin_unlock_bh(&nr_neigh_list_lock);
978 }
979