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