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