drm/i915: Move DPLL HW readout/sanitize fns to intel_dpll_mgr.c
[linux-2.6-microblaze.git] / net / netrom / nr_route.c
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
37 static unsigned int nr_neigh_no = 1;
38
39 static HLIST_HEAD(nr_node_list);
40 static DEFINE_SPINLOCK(nr_node_list_lock);
41 static HLIST_HEAD(nr_neigh_list);
42 static DEFINE_SPINLOCK(nr_neigh_list_lock);
43
44 static 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
60 static 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
78 static void nr_remove_neigh(struct nr_neigh *);
79
80 /*      re-sort the routes in quality order.    */
81 static 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  */
97 static 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
286 static 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
295 static 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
302 static 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
311 static 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  */
322 static 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  */
381 static 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  */
429 static 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  */
452 static 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  */
508 void 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  */
553 static 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  */
570 struct 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  */
590 struct 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;
603 out:
604         rcu_read_unlock();
605         return dev;
606 }
607
608 static 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  */
630 int 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  */
706 void 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  */
747 int 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
840 static 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
846 static 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
851 static void nr_node_stop(struct seq_file *seq, void *v)
852 {
853         spin_unlock_bh(&nr_node_list_lock);
854 }
855
856 static 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
888 const 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
895 static 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
901 static 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
906 static void nr_neigh_stop(struct seq_file *seq, void *v)
907 {
908         spin_unlock_bh(&nr_neigh_list_lock);
909 }
910
911 static 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
942 const 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  */
953 void 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 }