Linux 3.2.102
[pandora-kernel.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 ((dev = nr_ax25_dev_get(nr_route.device)) == NULL)
674                         return -EINVAL;
675                 if (nr_route.ndigis < 0 || nr_route.ndigis > AX25_MAX_DIGIS) {
676                         dev_put(dev);
677                         return -EINVAL;
678                 }
679                 switch (nr_route.type) {
680                 case NETROM_NODE:
681                         ret = nr_add_node(&nr_route.callsign,
682                                 nr_route.mnemonic,
683                                 &nr_route.neighbour,
684                                 nr_call_to_digi(&digi, nr_route.ndigis,
685                                                 nr_route.digipeaters),
686                                 dev, nr_route.quality,
687                                 nr_route.obs_count);
688                         break;
689                 case NETROM_NEIGH:
690                         ret = nr_add_neigh(&nr_route.callsign,
691                                 nr_call_to_digi(&digi, nr_route.ndigis,
692                                                 nr_route.digipeaters),
693                                 dev, nr_route.quality);
694                         break;
695                 default:
696                         ret = -EINVAL;
697                 }
698                 dev_put(dev);
699                 return ret;
700
701         case SIOCDELRT:
702                 if (copy_from_user(&nr_route, arg, sizeof(struct nr_route_struct)))
703                         return -EFAULT;
704                 if ((dev = nr_ax25_dev_get(nr_route.device)) == NULL)
705                         return -EINVAL;
706                 switch (nr_route.type) {
707                 case NETROM_NODE:
708                         ret = nr_del_node(&nr_route.callsign,
709                                 &nr_route.neighbour, dev);
710                         break;
711                 case NETROM_NEIGH:
712                         ret = nr_del_neigh(&nr_route.callsign,
713                                 dev, nr_route.quality);
714                         break;
715                 default:
716                         ret = -EINVAL;
717                 }
718                 dev_put(dev);
719                 return ret;
720
721         case SIOCNRDECOBS:
722                 return nr_dec_obs();
723
724         default:
725                 return -EINVAL;
726         }
727
728         return 0;
729 }
730
731 /*
732  *      A level 2 link has timed out, therefore it appears to be a poor link,
733  *      then don't use that neighbour until it is reset.
734  */
735 void nr_link_failed(ax25_cb *ax25, int reason)
736 {
737         struct nr_neigh *s, *nr_neigh = NULL;
738         struct hlist_node *node;
739         struct nr_node  *nr_node = NULL;
740
741         spin_lock_bh(&nr_neigh_list_lock);
742         nr_neigh_for_each(s, node, &nr_neigh_list) {
743                 if (s->ax25 == ax25) {
744                         nr_neigh_hold(s);
745                         nr_neigh = s;
746                         break;
747                 }
748         }
749         spin_unlock_bh(&nr_neigh_list_lock);
750
751         if (nr_neigh == NULL)
752                 return;
753
754         nr_neigh->ax25 = NULL;
755         ax25_cb_put(ax25);
756
757         if (++nr_neigh->failed < sysctl_netrom_link_fails_count) {
758                 nr_neigh_put(nr_neigh);
759                 return;
760         }
761         spin_lock_bh(&nr_node_list_lock);
762         nr_node_for_each(nr_node, node, &nr_node_list) {
763                 nr_node_lock(nr_node);
764                 if (nr_node->which < nr_node->count &&
765                     nr_node->routes[nr_node->which].neighbour == nr_neigh)
766                         nr_node->which++;
767                 nr_node_unlock(nr_node);
768         }
769         spin_unlock_bh(&nr_node_list_lock);
770         nr_neigh_put(nr_neigh);
771 }
772
773 /*
774  *      Route a frame to an appropriate AX.25 connection. A NULL ax25_cb
775  *      indicates an internally generated frame.
776  */
777 int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
778 {
779         ax25_address *nr_src, *nr_dest;
780         struct nr_neigh *nr_neigh;
781         struct nr_node  *nr_node;
782         struct net_device *dev;
783         unsigned char *dptr;
784         ax25_cb *ax25s;
785         int ret;
786         struct sk_buff *skbn;
787
788
789         nr_src  = (ax25_address *)(skb->data + 0);
790         nr_dest = (ax25_address *)(skb->data + 7);
791
792         if (ax25 != NULL) {
793                 ret = nr_add_node(nr_src, "", &ax25->dest_addr, ax25->digipeat,
794                                   ax25->ax25_dev->dev, 0,
795                                   sysctl_netrom_obsolescence_count_initialiser);
796                 if (ret)
797                         return ret;
798         }
799
800         if ((dev = nr_dev_get(nr_dest)) != NULL) {      /* Its for me */
801                 if (ax25 == NULL)                       /* Its from me */
802                         ret = nr_loopback_queue(skb);
803                 else
804                         ret = nr_rx_frame(skb, dev);
805                 dev_put(dev);
806                 return ret;
807         }
808
809         if (!sysctl_netrom_routing_control && ax25 != NULL)
810                 return 0;
811
812         /* Its Time-To-Live has expired */
813         if (skb->data[14] == 1) {
814                 return 0;
815         }
816
817         nr_node = nr_node_get(nr_dest);
818         if (nr_node == NULL)
819                 return 0;
820         nr_node_lock(nr_node);
821
822         if (nr_node->which >= nr_node->count) {
823                 nr_node_unlock(nr_node);
824                 nr_node_put(nr_node);
825                 return 0;
826         }
827
828         nr_neigh = nr_node->routes[nr_node->which].neighbour;
829
830         if ((dev = nr_dev_first()) == NULL) {
831                 nr_node_unlock(nr_node);
832                 nr_node_put(nr_node);
833                 return 0;
834         }
835
836         /* We are going to change the netrom headers so we should get our
837            own skb, we also did not know until now how much header space
838            we had to reserve... - RXQ */
839         if ((skbn=skb_copy_expand(skb, dev->hard_header_len, 0, GFP_ATOMIC)) == NULL) {
840                 nr_node_unlock(nr_node);
841                 nr_node_put(nr_node);
842                 dev_put(dev);
843                 return 0;
844         }
845         kfree_skb(skb);
846         skb=skbn;
847         skb->data[14]--;
848
849         dptr  = skb_push(skb, 1);
850         *dptr = AX25_P_NETROM;
851
852         ax25s = nr_neigh->ax25;
853         nr_neigh->ax25 = ax25_send_frame(skb, 256,
854                                          (ax25_address *)dev->dev_addr,
855                                          &nr_neigh->callsign,
856                                          nr_neigh->digipeat, nr_neigh->dev);
857         if (ax25s)
858                 ax25_cb_put(ax25s);
859
860         dev_put(dev);
861         ret = (nr_neigh->ax25 != NULL);
862         nr_node_unlock(nr_node);
863         nr_node_put(nr_node);
864
865         return ret;
866 }
867
868 #ifdef CONFIG_PROC_FS
869
870 static void *nr_node_start(struct seq_file *seq, loff_t *pos)
871 {
872         spin_lock_bh(&nr_node_list_lock);
873         return seq_hlist_start_head(&nr_node_list, *pos);
874 }
875
876 static void *nr_node_next(struct seq_file *seq, void *v, loff_t *pos)
877 {
878         return seq_hlist_next(v, &nr_node_list, pos);
879 }
880
881 static void nr_node_stop(struct seq_file *seq, void *v)
882 {
883         spin_unlock_bh(&nr_node_list_lock);
884 }
885
886 static int nr_node_show(struct seq_file *seq, void *v)
887 {
888         char buf[11];
889         int i;
890
891         if (v == SEQ_START_TOKEN)
892                 seq_puts(seq,
893                          "callsign  mnemonic w n qual obs neigh qual obs neigh qual obs neigh\n");
894         else {
895                 struct nr_node *nr_node = hlist_entry(v, struct nr_node,
896                                                       node_node);
897
898                 nr_node_lock(nr_node);
899                 seq_printf(seq, "%-9s %-7s  %d %d",
900                         ax2asc(buf, &nr_node->callsign),
901                         (nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic,
902                         nr_node->which + 1,
903                         nr_node->count);
904
905                 for (i = 0; i < nr_node->count; i++) {
906                         seq_printf(seq, "  %3d   %d %05d",
907                                 nr_node->routes[i].quality,
908                                 nr_node->routes[i].obs_count,
909                                 nr_node->routes[i].neighbour->number);
910                 }
911                 nr_node_unlock(nr_node);
912
913                 seq_puts(seq, "\n");
914         }
915         return 0;
916 }
917
918 static const struct seq_operations nr_node_seqops = {
919         .start = nr_node_start,
920         .next = nr_node_next,
921         .stop = nr_node_stop,
922         .show = nr_node_show,
923 };
924
925 static int nr_node_info_open(struct inode *inode, struct file *file)
926 {
927         return seq_open(file, &nr_node_seqops);
928 }
929
930 const struct file_operations nr_nodes_fops = {
931         .owner = THIS_MODULE,
932         .open = nr_node_info_open,
933         .read = seq_read,
934         .llseek = seq_lseek,
935         .release = seq_release,
936 };
937
938 static void *nr_neigh_start(struct seq_file *seq, loff_t *pos)
939 {
940         spin_lock_bh(&nr_neigh_list_lock);
941         return seq_hlist_start_head(&nr_neigh_list, *pos);
942 }
943
944 static void *nr_neigh_next(struct seq_file *seq, void *v, loff_t *pos)
945 {
946         return seq_hlist_next(v, &nr_neigh_list, pos);
947 }
948
949 static void nr_neigh_stop(struct seq_file *seq, void *v)
950 {
951         spin_unlock_bh(&nr_neigh_list_lock);
952 }
953
954 static int nr_neigh_show(struct seq_file *seq, void *v)
955 {
956         char buf[11];
957         int i;
958
959         if (v == SEQ_START_TOKEN)
960                 seq_puts(seq, "addr  callsign  dev  qual lock count failed digipeaters\n");
961         else {
962                 struct nr_neigh *nr_neigh;
963
964                 nr_neigh = hlist_entry(v, struct nr_neigh, neigh_node);
965                 seq_printf(seq, "%05d %-9s %-4s  %3d    %d   %3d    %3d",
966                         nr_neigh->number,
967                         ax2asc(buf, &nr_neigh->callsign),
968                         nr_neigh->dev ? nr_neigh->dev->name : "???",
969                         nr_neigh->quality,
970                         nr_neigh->locked,
971                         nr_neigh->count,
972                         nr_neigh->failed);
973
974                 if (nr_neigh->digipeat != NULL) {
975                         for (i = 0; i < nr_neigh->digipeat->ndigi; i++)
976                                 seq_printf(seq, " %s",
977                                            ax2asc(buf, &nr_neigh->digipeat->calls[i]));
978                 }
979
980                 seq_puts(seq, "\n");
981         }
982         return 0;
983 }
984
985 static const struct seq_operations nr_neigh_seqops = {
986         .start = nr_neigh_start,
987         .next = nr_neigh_next,
988         .stop = nr_neigh_stop,
989         .show = nr_neigh_show,
990 };
991
992 static int nr_neigh_info_open(struct inode *inode, struct file *file)
993 {
994         return seq_open(file, &nr_neigh_seqops);
995 }
996
997 const struct file_operations nr_neigh_fops = {
998         .owner = THIS_MODULE,
999         .open = nr_neigh_info_open,
1000         .read = seq_read,
1001         .llseek = seq_lseek,
1002         .release = seq_release,
1003 };
1004
1005 #endif
1006
1007 /*
1008  *      Free all memory associated with the nodes and routes lists.
1009  */
1010 void __exit nr_rt_free(void)
1011 {
1012         struct nr_neigh *s = NULL;
1013         struct nr_node  *t = NULL;
1014         struct hlist_node *node, *nodet;
1015
1016         spin_lock_bh(&nr_neigh_list_lock);
1017         spin_lock_bh(&nr_node_list_lock);
1018         nr_node_for_each_safe(t, node, nodet, &nr_node_list) {
1019                 nr_node_lock(t);
1020                 nr_remove_node_locked(t);
1021                 nr_node_unlock(t);
1022         }
1023         nr_neigh_for_each_safe(s, node, nodet, &nr_neigh_list) {
1024                 while(s->count) {
1025                         s->count--;
1026                         nr_neigh_put(s);
1027                 }
1028                 nr_remove_neigh_locked(s);
1029         }
1030         spin_unlock_bh(&nr_node_list_lock);
1031         spin_unlock_bh(&nr_neigh_list_lock);
1032 }