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