Linux Audio

Check our new training course

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}
v5.14.15
  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		nr_neigh_put(nr_neigh);
212		return 0;
213	}
214	nr_node_lock(nr_node);
215
216	if (quality != 0)
217		strcpy(nr_node->mnemonic, mnemonic);
218
219	for (found = 0, i = 0; i < nr_node->count; i++) {
220		if (nr_node->routes[i].neighbour == nr_neigh) {
221			nr_node->routes[i].quality   = quality;
222			nr_node->routes[i].obs_count = obs_count;
223			found = 1;
224			break;
225		}
226	}
227
228	if (!found) {
229		/* We have space at the bottom, slot it in */
230		if (nr_node->count < 3) {
231			nr_node->routes[2] = nr_node->routes[1];
232			nr_node->routes[1] = nr_node->routes[0];
233
234			nr_node->routes[0].quality   = quality;
235			nr_node->routes[0].obs_count = obs_count;
236			nr_node->routes[0].neighbour = nr_neigh;
237
238			nr_node->which++;
239			nr_node->count++;
240			nr_neigh_hold(nr_neigh);
241			nr_neigh->count++;
242		} else {
243			/* It must be better than the worst */
244			if (quality > nr_node->routes[2].quality) {
245				nr_node->routes[2].neighbour->count--;
246				nr_neigh_put(nr_node->routes[2].neighbour);
247
248				if (nr_node->routes[2].neighbour->count == 0 && !nr_node->routes[2].neighbour->locked)
249					nr_remove_neigh(nr_node->routes[2].neighbour);
250
251				nr_node->routes[2].quality   = quality;
252				nr_node->routes[2].obs_count = obs_count;
253				nr_node->routes[2].neighbour = nr_neigh;
254
255				nr_neigh_hold(nr_neigh);
256				nr_neigh->count++;
257			}
258		}
259	}
260
261	/* Now re-sort the routes in quality order */
262	switch (nr_node->count) {
263	case 3:
264		re_sort_routes(nr_node, 0, 1);
265		re_sort_routes(nr_node, 1, 2);
266		fallthrough;
267	case 2:
268		re_sort_routes(nr_node, 0, 1);
269		break;
270	case 1:
271		break;
272	}
273
274	for (i = 0; i < nr_node->count; i++) {
275		if (nr_node->routes[i].neighbour == nr_neigh) {
276			if (i < nr_node->which)
277				nr_node->which = i;
278			break;
279		}
280	}
281
282	nr_neigh_put(nr_neigh);
283	nr_node_unlock(nr_node);
284	nr_node_put(nr_node);
285	return 0;
286}
287
288static inline void __nr_remove_node(struct nr_node *nr_node)
289{
290	hlist_del_init(&nr_node->node_node);
291	nr_node_put(nr_node);
292}
293
294#define nr_remove_node_locked(__node) \
295	__nr_remove_node(__node)
296
297static void nr_remove_node(struct nr_node *nr_node)
298{
299	spin_lock_bh(&nr_node_list_lock);
300	__nr_remove_node(nr_node);
301	spin_unlock_bh(&nr_node_list_lock);
302}
303
304static inline void __nr_remove_neigh(struct nr_neigh *nr_neigh)
305{
306	hlist_del_init(&nr_neigh->neigh_node);
307	nr_neigh_put(nr_neigh);
308}
309
310#define nr_remove_neigh_locked(__neigh) \
311	__nr_remove_neigh(__neigh)
312
313static void nr_remove_neigh(struct nr_neigh *nr_neigh)
314{
315	spin_lock_bh(&nr_neigh_list_lock);
316	__nr_remove_neigh(nr_neigh);
317	spin_unlock_bh(&nr_neigh_list_lock);
318}
319
320/*
321 *	"Delete" a node. Strictly speaking remove a route to a node. The node
322 *	is only deleted if no routes are left to it.
323 */
324static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct net_device *dev)
325{
326	struct nr_node  *nr_node;
327	struct nr_neigh *nr_neigh;
328	int i;
329
330	nr_node = nr_node_get(callsign);
331
332	if (nr_node == NULL)
333		return -EINVAL;
334
335	nr_neigh = nr_neigh_get_dev(neighbour, dev);
336
337	if (nr_neigh == NULL) {
338		nr_node_put(nr_node);
339		return -EINVAL;
340	}
341
342	nr_node_lock(nr_node);
343	for (i = 0; i < nr_node->count; i++) {
344		if (nr_node->routes[i].neighbour == nr_neigh) {
345			nr_neigh->count--;
346			nr_neigh_put(nr_neigh);
347
348			if (nr_neigh->count == 0 && !nr_neigh->locked)
349				nr_remove_neigh(nr_neigh);
350			nr_neigh_put(nr_neigh);
351
352			nr_node->count--;
353
354			if (nr_node->count == 0) {
355				nr_remove_node(nr_node);
356			} else {
357				switch (i) {
358				case 0:
359					nr_node->routes[0] = nr_node->routes[1];
360					fallthrough;
361				case 1:
362					nr_node->routes[1] = nr_node->routes[2];
363					fallthrough;
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 */
384static 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 */
432static 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 */
455static 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					break;
488				case 2:
489					break;
490				}
491				break;
492
493			default:
494				s->routes[i].obs_count--;
495				break;
496
497			}
498		}
499
500		if (s->count <= 0)
501			nr_remove_node_locked(s);
502		nr_node_unlock(s);
503	}
504	spin_unlock_bh(&nr_node_list_lock);
505
506	return 0;
507}
508
509/*
510 *	A device has been removed. Remove its routes and neighbours.
511 */
512void nr_rt_device_down(struct net_device *dev)
513{
514	struct nr_neigh *s;
515	struct hlist_node *nodet, *node2t;
516	struct nr_node  *t;
517	int i;
518
519	spin_lock_bh(&nr_neigh_list_lock);
520	nr_neigh_for_each_safe(s, nodet, &nr_neigh_list) {
521		if (s->dev == dev) {
522			spin_lock_bh(&nr_node_list_lock);
523			nr_node_for_each_safe(t, node2t, &nr_node_list) {
524				nr_node_lock(t);
525				for (i = 0; i < t->count; i++) {
526					if (t->routes[i].neighbour == s) {
527						t->count--;
528
529						switch (i) {
530						case 0:
531							t->routes[0] = t->routes[1];
532							fallthrough;
533						case 1:
534							t->routes[1] = t->routes[2];
535							break;
536						case 2:
537							break;
538						}
539					}
540				}
541
542				if (t->count <= 0)
543					nr_remove_node_locked(t);
544				nr_node_unlock(t);
545			}
546			spin_unlock_bh(&nr_node_list_lock);
547
548			nr_remove_neigh_locked(s);
549		}
550	}
551	spin_unlock_bh(&nr_neigh_list_lock);
552}
553
554/*
555 *	Check that the device given is a valid AX.25 interface that is "up".
556 *	Or a valid ethernet interface with an AX.25 callsign binding.
557 */
558static struct net_device *nr_ax25_dev_get(char *devname)
559{
560	struct net_device *dev;
561
562	if ((dev = dev_get_by_name(&init_net, devname)) == NULL)
563		return NULL;
564
565	if ((dev->flags & IFF_UP) && dev->type == ARPHRD_AX25)
566		return dev;
567
568	dev_put(dev);
569	return NULL;
570}
571
572/*
573 *	Find the first active NET/ROM device, usually "nr0".
574 */
575struct net_device *nr_dev_first(void)
576{
577	struct net_device *dev, *first = NULL;
578
579	rcu_read_lock();
580	for_each_netdev_rcu(&init_net, dev) {
581		if ((dev->flags & IFF_UP) && dev->type == ARPHRD_NETROM)
582			if (first == NULL || strncmp(dev->name, first->name, 3) < 0)
583				first = dev;
584	}
585	if (first)
586		dev_hold(first);
587	rcu_read_unlock();
588
589	return first;
590}
591
592/*
593 *	Find the NET/ROM device for the given callsign.
594 */
595struct net_device *nr_dev_get(ax25_address *addr)
596{
597	struct net_device *dev;
598
599	rcu_read_lock();
600	for_each_netdev_rcu(&init_net, dev) {
601		if ((dev->flags & IFF_UP) && dev->type == ARPHRD_NETROM &&
602		    ax25cmp(addr, (ax25_address *)dev->dev_addr) == 0) {
603			dev_hold(dev);
604			goto out;
605		}
606	}
607	dev = NULL;
608out:
609	rcu_read_unlock();
610	return dev;
611}
612
613static ax25_digi *nr_call_to_digi(ax25_digi *digi, int ndigis,
614	ax25_address *digipeaters)
615{
616	int i;
617
618	if (ndigis == 0)
619		return NULL;
620
621	for (i = 0; i < ndigis; i++) {
622		digi->calls[i]    = digipeaters[i];
623		digi->repeated[i] = 0;
624	}
625
626	digi->ndigi      = ndigis;
627	digi->lastrepeat = -1;
628
629	return digi;
630}
631
632/*
633 *	Handle the ioctls that control the routing functions.
634 */
635int nr_rt_ioctl(unsigned int cmd, void __user *arg)
636{
637	struct nr_route_struct nr_route;
638	struct net_device *dev;
639	ax25_digi digi;
640	int ret;
641
642	switch (cmd) {
643	case SIOCADDRT:
644		if (copy_from_user(&nr_route, arg, sizeof(struct nr_route_struct)))
645			return -EFAULT;
646		if (nr_route.ndigis > AX25_MAX_DIGIS)
647			return -EINVAL;
648		if ((dev = nr_ax25_dev_get(nr_route.device)) == NULL)
649			return -EINVAL;
650		switch (nr_route.type) {
651		case NETROM_NODE:
652			if (strnlen(nr_route.mnemonic, 7) == 7) {
653				ret = -EINVAL;
654				break;
655			}
656
657			ret = nr_add_node(&nr_route.callsign,
658				nr_route.mnemonic,
659				&nr_route.neighbour,
660				nr_call_to_digi(&digi, nr_route.ndigis,
661						nr_route.digipeaters),
662				dev, nr_route.quality,
663				nr_route.obs_count);
664			break;
665		case NETROM_NEIGH:
666			ret = nr_add_neigh(&nr_route.callsign,
667				nr_call_to_digi(&digi, nr_route.ndigis,
668						nr_route.digipeaters),
669				dev, nr_route.quality);
670			break;
671		default:
672			ret = -EINVAL;
673		}
674		dev_put(dev);
675		return ret;
676
677	case SIOCDELRT:
678		if (copy_from_user(&nr_route, arg, sizeof(struct nr_route_struct)))
679			return -EFAULT;
680		if ((dev = nr_ax25_dev_get(nr_route.device)) == NULL)
681			return -EINVAL;
682		switch (nr_route.type) {
683		case NETROM_NODE:
684			ret = nr_del_node(&nr_route.callsign,
685				&nr_route.neighbour, dev);
686			break;
687		case NETROM_NEIGH:
688			ret = nr_del_neigh(&nr_route.callsign,
689				dev, nr_route.quality);
690			break;
691		default:
692			ret = -EINVAL;
693		}
694		dev_put(dev);
695		return ret;
696
697	case SIOCNRDECOBS:
698		return nr_dec_obs();
699
700	default:
701		return -EINVAL;
702	}
703
704	return 0;
705}
706
707/*
708 * 	A level 2 link has timed out, therefore it appears to be a poor link,
709 *	then don't use that neighbour until it is reset.
710 */
711void nr_link_failed(ax25_cb *ax25, int reason)
712{
713	struct nr_neigh *s, *nr_neigh = NULL;
714	struct nr_node  *nr_node = NULL;
715
716	spin_lock_bh(&nr_neigh_list_lock);
717	nr_neigh_for_each(s, &nr_neigh_list) {
718		if (s->ax25 == ax25) {
719			nr_neigh_hold(s);
720			nr_neigh = s;
721			break;
722		}
723	}
724	spin_unlock_bh(&nr_neigh_list_lock);
725
726	if (nr_neigh == NULL)
727		return;
728
729	nr_neigh->ax25 = NULL;
730	ax25_cb_put(ax25);
731
732	if (++nr_neigh->failed < sysctl_netrom_link_fails_count) {
733		nr_neigh_put(nr_neigh);
734		return;
735	}
736	spin_lock_bh(&nr_node_list_lock);
737	nr_node_for_each(nr_node, &nr_node_list) {
738		nr_node_lock(nr_node);
739		if (nr_node->which < nr_node->count &&
740		    nr_node->routes[nr_node->which].neighbour == nr_neigh)
741			nr_node->which++;
742		nr_node_unlock(nr_node);
743	}
744	spin_unlock_bh(&nr_node_list_lock);
745	nr_neigh_put(nr_neigh);
746}
747
748/*
749 *	Route a frame to an appropriate AX.25 connection. A NULL ax25_cb
750 *	indicates an internally generated frame.
751 */
752int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
753{
754	ax25_address *nr_src, *nr_dest;
755	struct nr_neigh *nr_neigh;
756	struct nr_node  *nr_node;
757	struct net_device *dev;
758	unsigned char *dptr;
759	ax25_cb *ax25s;
760	int ret;
761	struct sk_buff *skbn;
762
763
764	nr_src  = (ax25_address *)(skb->data + 0);
765	nr_dest = (ax25_address *)(skb->data + 7);
766
767	if (ax25 != NULL) {
768		ret = nr_add_node(nr_src, "", &ax25->dest_addr, ax25->digipeat,
769				  ax25->ax25_dev->dev, 0,
770				  sysctl_netrom_obsolescence_count_initialiser);
771		if (ret)
772			return ret;
773	}
774
775	if ((dev = nr_dev_get(nr_dest)) != NULL) {	/* Its for me */
776		if (ax25 == NULL)			/* Its from me */
777			ret = nr_loopback_queue(skb);
778		else
779			ret = nr_rx_frame(skb, dev);
780		dev_put(dev);
781		return ret;
782	}
783
784	if (!sysctl_netrom_routing_control && ax25 != NULL)
785		return 0;
786
787	/* Its Time-To-Live has expired */
788	if (skb->data[14] == 1) {
789		return 0;
790	}
791
792	nr_node = nr_node_get(nr_dest);
793	if (nr_node == NULL)
794		return 0;
795	nr_node_lock(nr_node);
796
797	if (nr_node->which >= nr_node->count) {
798		nr_node_unlock(nr_node);
799		nr_node_put(nr_node);
800		return 0;
801	}
802
803	nr_neigh = nr_node->routes[nr_node->which].neighbour;
804
805	if ((dev = nr_dev_first()) == NULL) {
806		nr_node_unlock(nr_node);
807		nr_node_put(nr_node);
808		return 0;
809	}
810
811	/* We are going to change the netrom headers so we should get our
812	   own skb, we also did not know until now how much header space
813	   we had to reserve... - RXQ */
814	if ((skbn=skb_copy_expand(skb, dev->hard_header_len, 0, GFP_ATOMIC)) == NULL) {
815		nr_node_unlock(nr_node);
816		nr_node_put(nr_node);
817		dev_put(dev);
818		return 0;
819	}
820	kfree_skb(skb);
821	skb=skbn;
822	skb->data[14]--;
823
824	dptr  = skb_push(skb, 1);
825	*dptr = AX25_P_NETROM;
826
827	ax25s = nr_neigh->ax25;
828	nr_neigh->ax25 = ax25_send_frame(skb, 256,
829					 (ax25_address *)dev->dev_addr,
830					 &nr_neigh->callsign,
831					 nr_neigh->digipeat, nr_neigh->dev);
832	if (ax25s)
833		ax25_cb_put(ax25s);
834
835	dev_put(dev);
836	ret = (nr_neigh->ax25 != NULL);
837	nr_node_unlock(nr_node);
838	nr_node_put(nr_node);
839
840	return ret;
841}
842
843#ifdef CONFIG_PROC_FS
844
845static void *nr_node_start(struct seq_file *seq, loff_t *pos)
846	__acquires(&nr_node_list_lock)
847{
848	spin_lock_bh(&nr_node_list_lock);
849	return seq_hlist_start_head(&nr_node_list, *pos);
850}
851
852static void *nr_node_next(struct seq_file *seq, void *v, loff_t *pos)
853{
854	return seq_hlist_next(v, &nr_node_list, pos);
855}
856
857static void nr_node_stop(struct seq_file *seq, void *v)
858	__releases(&nr_node_list_lock)
859{
860	spin_unlock_bh(&nr_node_list_lock);
861}
862
863static int nr_node_show(struct seq_file *seq, void *v)
864{
865	char buf[11];
866	int i;
867
868	if (v == SEQ_START_TOKEN)
869		seq_puts(seq,
870			 "callsign  mnemonic w n qual obs neigh qual obs neigh qual obs neigh\n");
871	else {
872		struct nr_node *nr_node = hlist_entry(v, struct nr_node,
873						      node_node);
874
875		nr_node_lock(nr_node);
876		seq_printf(seq, "%-9s %-7s  %d %d",
877			ax2asc(buf, &nr_node->callsign),
878			(nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic,
879			nr_node->which + 1,
880			nr_node->count);
881
882		for (i = 0; i < nr_node->count; i++) {
883			seq_printf(seq, "  %3d   %d %05d",
884				nr_node->routes[i].quality,
885				nr_node->routes[i].obs_count,
886				nr_node->routes[i].neighbour->number);
887		}
888		nr_node_unlock(nr_node);
889
890		seq_puts(seq, "\n");
891	}
892	return 0;
893}
894
895const struct seq_operations nr_node_seqops = {
896	.start = nr_node_start,
897	.next = nr_node_next,
898	.stop = nr_node_stop,
899	.show = nr_node_show,
900};
901
902static void *nr_neigh_start(struct seq_file *seq, loff_t *pos)
903	__acquires(&nr_neigh_list_lock)
904{
905	spin_lock_bh(&nr_neigh_list_lock);
906	return seq_hlist_start_head(&nr_neigh_list, *pos);
907}
908
909static void *nr_neigh_next(struct seq_file *seq, void *v, loff_t *pos)
910{
911	return seq_hlist_next(v, &nr_neigh_list, pos);
912}
913
914static void nr_neigh_stop(struct seq_file *seq, void *v)
915	__releases(&nr_neigh_list_lock)
916{
917	spin_unlock_bh(&nr_neigh_list_lock);
918}
919
920static int nr_neigh_show(struct seq_file *seq, void *v)
921{
922	char buf[11];
923	int i;
924
925	if (v == SEQ_START_TOKEN)
926		seq_puts(seq, "addr  callsign  dev  qual lock count failed digipeaters\n");
927	else {
928		struct nr_neigh *nr_neigh;
929
930		nr_neigh = hlist_entry(v, struct nr_neigh, neigh_node);
931		seq_printf(seq, "%05d %-9s %-4s  %3d    %d   %3d    %3d",
932			nr_neigh->number,
933			ax2asc(buf, &nr_neigh->callsign),
934			nr_neigh->dev ? nr_neigh->dev->name : "???",
935			nr_neigh->quality,
936			nr_neigh->locked,
937			nr_neigh->count,
938			nr_neigh->failed);
939
940		if (nr_neigh->digipeat != NULL) {
941			for (i = 0; i < nr_neigh->digipeat->ndigi; i++)
942				seq_printf(seq, " %s",
943					   ax2asc(buf, &nr_neigh->digipeat->calls[i]));
944		}
945
946		seq_puts(seq, "\n");
947	}
948	return 0;
949}
950
951const struct seq_operations nr_neigh_seqops = {
952	.start = nr_neigh_start,
953	.next = nr_neigh_next,
954	.stop = nr_neigh_stop,
955	.show = nr_neigh_show,
956};
957#endif
958
959/*
960 *	Free all memory associated with the nodes and routes lists.
961 */
962void nr_rt_free(void)
963{
964	struct nr_neigh *s = NULL;
965	struct nr_node  *t = NULL;
966	struct hlist_node *nodet;
967
968	spin_lock_bh(&nr_neigh_list_lock);
969	spin_lock_bh(&nr_node_list_lock);
970	nr_node_for_each_safe(t, nodet, &nr_node_list) {
971		nr_node_lock(t);
972		nr_remove_node_locked(t);
973		nr_node_unlock(t);
974	}
975	nr_neigh_for_each_safe(s, nodet, &nr_neigh_list) {
976		while(s->count) {
977			s->count--;
978			nr_neigh_put(s);
979		}
980		nr_remove_neigh_locked(s);
981	}
982	spin_unlock_bh(&nr_node_list_lock);
983	spin_unlock_bh(&nr_neigh_list_lock);
984}