Linux Audio

Check our new training course

Real-Time Linux with PREEMPT_RT training

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