1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38#include <linux/cache.h>
39#include <linux/uaccess.h>
40#include <linux/bitops.h>
41#include <linux/types.h>
42#include <linux/kernel.h>
43#include <linux/mm.h>
44#include <linux/string.h>
45#include <linux/socket.h>
46#include <linux/sockios.h>
47#include <linux/errno.h>
48#include <linux/in.h>
49#include <linux/inet.h>
50#include <linux/inetdevice.h>
51#include <linux/netdevice.h>
52#include <linux/if_arp.h>
53#include <linux/proc_fs.h>
54#include <linux/rcupdate.h>
55#include <linux/skbuff.h>
56#include <linux/netlink.h>
57#include <linux/init.h>
58#include <linux/list.h>
59#include <linux/slab.h>
60#include <linux/export.h>
61#include <linux/vmalloc.h>
62#include <linux/notifier.h>
63#include <net/net_namespace.h>
64#include <net/ip.h>
65#include <net/protocol.h>
66#include <net/route.h>
67#include <net/tcp.h>
68#include <net/sock.h>
69#include <net/ip_fib.h>
70#include <net/fib_notifier.h>
71#include <trace/events/fib.h>
72#include "fib_lookup.h"
73
74static int call_fib_entry_notifier(struct notifier_block *nb,
75 enum fib_event_type event_type, u32 dst,
76 int dst_len, struct fib_alias *fa,
77 struct netlink_ext_ack *extack)
78{
79 struct fib_entry_notifier_info info = {
80 .info.extack = extack,
81 .dst = dst,
82 .dst_len = dst_len,
83 .fi = fa->fa_info,
84 .tos = fa->fa_tos,
85 .type = fa->fa_type,
86 .tb_id = fa->tb_id,
87 };
88 return call_fib4_notifier(nb, event_type, &info.info);
89}
90
91static int call_fib_entry_notifiers(struct net *net,
92 enum fib_event_type event_type, u32 dst,
93 int dst_len, struct fib_alias *fa,
94 struct netlink_ext_ack *extack)
95{
96 struct fib_entry_notifier_info info = {
97 .info.extack = extack,
98 .dst = dst,
99 .dst_len = dst_len,
100 .fi = fa->fa_info,
101 .tos = fa->fa_tos,
102 .type = fa->fa_type,
103 .tb_id = fa->tb_id,
104 };
105 return call_fib4_notifiers(net, event_type, &info.info);
106}
107
108#define MAX_STAT_DEPTH 32
109
110#define KEYLENGTH (8*sizeof(t_key))
111#define KEY_MAX ((t_key)~0)
112
113typedef unsigned int t_key;
114
115#define IS_TRIE(n) ((n)->pos >= KEYLENGTH)
116#define IS_TNODE(n) ((n)->bits)
117#define IS_LEAF(n) (!(n)->bits)
118
119struct key_vector {
120 t_key key;
121 unsigned char pos;
122 unsigned char bits;
123 unsigned char slen;
124 union {
125
126 struct hlist_head leaf;
127
128 struct key_vector __rcu *tnode[0];
129 };
130};
131
132struct tnode {
133 struct rcu_head rcu;
134 t_key empty_children;
135 t_key full_children;
136 struct key_vector __rcu *parent;
137 struct key_vector kv[1];
138#define tn_bits kv[0].bits
139};
140
141#define TNODE_SIZE(n) offsetof(struct tnode, kv[0].tnode[n])
142#define LEAF_SIZE TNODE_SIZE(1)
143
144#ifdef CONFIG_IP_FIB_TRIE_STATS
145struct trie_use_stats {
146 unsigned int gets;
147 unsigned int backtrack;
148 unsigned int semantic_match_passed;
149 unsigned int semantic_match_miss;
150 unsigned int null_node_hit;
151 unsigned int resize_node_skipped;
152};
153#endif
154
155struct trie_stat {
156 unsigned int totdepth;
157 unsigned int maxdepth;
158 unsigned int tnodes;
159 unsigned int leaves;
160 unsigned int nullpointers;
161 unsigned int prefixes;
162 unsigned int nodesizes[MAX_STAT_DEPTH];
163};
164
165struct trie {
166 struct key_vector kv[1];
167#ifdef CONFIG_IP_FIB_TRIE_STATS
168 struct trie_use_stats __percpu *stats;
169#endif
170};
171
172static struct key_vector *resize(struct trie *t, struct key_vector *tn);
173static unsigned int tnode_free_size;
174
175
176
177
178
179
180unsigned int sysctl_fib_sync_mem = 512 * 1024;
181unsigned int sysctl_fib_sync_mem_min = 64 * 1024;
182unsigned int sysctl_fib_sync_mem_max = 64 * 1024 * 1024;
183
184static struct kmem_cache *fn_alias_kmem __ro_after_init;
185static struct kmem_cache *trie_leaf_kmem __ro_after_init;
186
187static inline struct tnode *tn_info(struct key_vector *kv)
188{
189 return container_of(kv, struct tnode, kv[0]);
190}
191
192
193#define node_parent(tn) rtnl_dereference(tn_info(tn)->parent)
194#define get_child(tn, i) rtnl_dereference((tn)->tnode[i])
195
196
197#define node_parent_rcu(tn) rcu_dereference_rtnl(tn_info(tn)->parent)
198#define get_child_rcu(tn, i) rcu_dereference_rtnl((tn)->tnode[i])
199
200
201static inline void node_set_parent(struct key_vector *n, struct key_vector *tp)
202{
203 if (n)
204 rcu_assign_pointer(tn_info(n)->parent, tp);
205}
206
207#define NODE_INIT_PARENT(n, p) RCU_INIT_POINTER(tn_info(n)->parent, p)
208
209
210
211
212static inline unsigned long child_length(const struct key_vector *tn)
213{
214 return (1ul << tn->bits) & ~(1ul);
215}
216
217#define get_cindex(key, kv) (((key) ^ (kv)->key) >> (kv)->pos)
218
219static inline unsigned long get_index(t_key key, struct key_vector *kv)
220{
221 unsigned long index = key ^ kv->key;
222
223 if ((BITS_PER_LONG <= KEYLENGTH) && (KEYLENGTH == kv->pos))
224 return 0;
225
226 return index >> kv->pos;
227}
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288static const int halve_threshold = 25;
289static const int inflate_threshold = 50;
290static const int halve_threshold_root = 15;
291static const int inflate_threshold_root = 30;
292
293static void __alias_free_mem(struct rcu_head *head)
294{
295 struct fib_alias *fa = container_of(head, struct fib_alias, rcu);
296 kmem_cache_free(fn_alias_kmem, fa);
297}
298
299static inline void alias_free_mem_rcu(struct fib_alias *fa)
300{
301 call_rcu(&fa->rcu, __alias_free_mem);
302}
303
304#define TNODE_VMALLOC_MAX \
305 ilog2((SIZE_MAX - TNODE_SIZE(0)) / sizeof(struct key_vector *))
306
307static void __node_free_rcu(struct rcu_head *head)
308{
309 struct tnode *n = container_of(head, struct tnode, rcu);
310
311 if (!n->tn_bits)
312 kmem_cache_free(trie_leaf_kmem, n);
313 else
314 kvfree(n);
315}
316
317#define node_free(n) call_rcu(&tn_info(n)->rcu, __node_free_rcu)
318
319static struct tnode *tnode_alloc(int bits)
320{
321 size_t size;
322
323
324 if (bits > TNODE_VMALLOC_MAX)
325 return NULL;
326
327
328 size = TNODE_SIZE(1ul << bits);
329
330 if (size <= PAGE_SIZE)
331 return kzalloc(size, GFP_KERNEL);
332 else
333 return vzalloc(size);
334}
335
336static inline void empty_child_inc(struct key_vector *n)
337{
338 tn_info(n)->empty_children++;
339
340 if (!tn_info(n)->empty_children)
341 tn_info(n)->full_children++;
342}
343
344static inline void empty_child_dec(struct key_vector *n)
345{
346 if (!tn_info(n)->empty_children)
347 tn_info(n)->full_children--;
348
349 tn_info(n)->empty_children--;
350}
351
352static struct key_vector *leaf_new(t_key key, struct fib_alias *fa)
353{
354 struct key_vector *l;
355 struct tnode *kv;
356
357 kv = kmem_cache_alloc(trie_leaf_kmem, GFP_KERNEL);
358 if (!kv)
359 return NULL;
360
361
362 l = kv->kv;
363 l->key = key;
364 l->pos = 0;
365 l->bits = 0;
366 l->slen = fa->fa_slen;
367
368
369 INIT_HLIST_HEAD(&l->leaf);
370 hlist_add_head(&fa->fa_list, &l->leaf);
371
372 return l;
373}
374
375static struct key_vector *tnode_new(t_key key, int pos, int bits)
376{
377 unsigned int shift = pos + bits;
378 struct key_vector *tn;
379 struct tnode *tnode;
380
381
382 BUG_ON(!bits || (shift > KEYLENGTH));
383
384 tnode = tnode_alloc(bits);
385 if (!tnode)
386 return NULL;
387
388 pr_debug("AT %p s=%zu %zu\n", tnode, TNODE_SIZE(0),
389 sizeof(struct key_vector *) << bits);
390
391 if (bits == KEYLENGTH)
392 tnode->full_children = 1;
393 else
394 tnode->empty_children = 1ul << bits;
395
396 tn = tnode->kv;
397 tn->key = (shift < KEYLENGTH) ? (key >> shift) << shift : 0;
398 tn->pos = pos;
399 tn->bits = bits;
400 tn->slen = pos;
401
402 return tn;
403}
404
405
406
407
408static inline int tnode_full(struct key_vector *tn, struct key_vector *n)
409{
410 return n && ((n->pos + n->bits) == tn->pos) && IS_TNODE(n);
411}
412
413
414
415
416static void put_child(struct key_vector *tn, unsigned long i,
417 struct key_vector *n)
418{
419 struct key_vector *chi = get_child(tn, i);
420 int isfull, wasfull;
421
422 BUG_ON(i >= child_length(tn));
423
424
425 if (!n && chi)
426 empty_child_inc(tn);
427 if (n && !chi)
428 empty_child_dec(tn);
429
430
431 wasfull = tnode_full(tn, chi);
432 isfull = tnode_full(tn, n);
433
434 if (wasfull && !isfull)
435 tn_info(tn)->full_children--;
436 else if (!wasfull && isfull)
437 tn_info(tn)->full_children++;
438
439 if (n && (tn->slen < n->slen))
440 tn->slen = n->slen;
441
442 rcu_assign_pointer(tn->tnode[i], n);
443}
444
445static void update_children(struct key_vector *tn)
446{
447 unsigned long i;
448
449
450 for (i = child_length(tn); i;) {
451 struct key_vector *inode = get_child(tn, --i);
452
453 if (!inode)
454 continue;
455
456
457
458
459
460 if (node_parent(inode) == tn)
461 update_children(inode);
462 else
463 node_set_parent(inode, tn);
464 }
465}
466
467static inline void put_child_root(struct key_vector *tp, t_key key,
468 struct key_vector *n)
469{
470 if (IS_TRIE(tp))
471 rcu_assign_pointer(tp->tnode[0], n);
472 else
473 put_child(tp, get_index(key, tp), n);
474}
475
476static inline void tnode_free_init(struct key_vector *tn)
477{
478 tn_info(tn)->rcu.next = NULL;
479}
480
481static inline void tnode_free_append(struct key_vector *tn,
482 struct key_vector *n)
483{
484 tn_info(n)->rcu.next = tn_info(tn)->rcu.next;
485 tn_info(tn)->rcu.next = &tn_info(n)->rcu;
486}
487
488static void tnode_free(struct key_vector *tn)
489{
490 struct callback_head *head = &tn_info(tn)->rcu;
491
492 while (head) {
493 head = head->next;
494 tnode_free_size += TNODE_SIZE(1ul << tn->bits);
495 node_free(tn);
496
497 tn = container_of(head, struct tnode, rcu)->kv;
498 }
499
500 if (tnode_free_size >= sysctl_fib_sync_mem) {
501 tnode_free_size = 0;
502 synchronize_rcu();
503 }
504}
505
506static struct key_vector *replace(struct trie *t,
507 struct key_vector *oldtnode,
508 struct key_vector *tn)
509{
510 struct key_vector *tp = node_parent(oldtnode);
511 unsigned long i;
512
513
514 NODE_INIT_PARENT(tn, tp);
515 put_child_root(tp, tn->key, tn);
516
517
518 update_children(tn);
519
520
521 tnode_free(oldtnode);
522
523
524 for (i = child_length(tn); i;) {
525 struct key_vector *inode = get_child(tn, --i);
526
527
528 if (tnode_full(tn, inode))
529 tn = resize(t, inode);
530 }
531
532 return tp;
533}
534
535static struct key_vector *inflate(struct trie *t,
536 struct key_vector *oldtnode)
537{
538 struct key_vector *tn;
539 unsigned long i;
540 t_key m;
541
542 pr_debug("In inflate\n");
543
544 tn = tnode_new(oldtnode->key, oldtnode->pos - 1, oldtnode->bits + 1);
545 if (!tn)
546 goto notnode;
547
548
549 tnode_free_init(oldtnode);
550
551
552
553
554
555
556 for (i = child_length(oldtnode), m = 1u << tn->pos; i;) {
557 struct key_vector *inode = get_child(oldtnode, --i);
558 struct key_vector *node0, *node1;
559 unsigned long j, k;
560
561
562 if (!inode)
563 continue;
564
565
566 if (!tnode_full(oldtnode, inode)) {
567 put_child(tn, get_index(inode->key, tn), inode);
568 continue;
569 }
570
571
572 tnode_free_append(oldtnode, inode);
573
574
575 if (inode->bits == 1) {
576 put_child(tn, 2 * i + 1, get_child(inode, 1));
577 put_child(tn, 2 * i, get_child(inode, 0));
578 continue;
579 }
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595 node1 = tnode_new(inode->key | m, inode->pos, inode->bits - 1);
596 if (!node1)
597 goto nomem;
598 node0 = tnode_new(inode->key, inode->pos, inode->bits - 1);
599
600 tnode_free_append(tn, node1);
601 if (!node0)
602 goto nomem;
603 tnode_free_append(tn, node0);
604
605
606 for (k = child_length(inode), j = k / 2; j;) {
607 put_child(node1, --j, get_child(inode, --k));
608 put_child(node0, j, get_child(inode, j));
609 put_child(node1, --j, get_child(inode, --k));
610 put_child(node0, j, get_child(inode, j));
611 }
612
613
614 NODE_INIT_PARENT(node1, tn);
615 NODE_INIT_PARENT(node0, tn);
616
617
618 put_child(tn, 2 * i + 1, node1);
619 put_child(tn, 2 * i, node0);
620 }
621
622
623 return replace(t, oldtnode, tn);
624nomem:
625
626 tnode_free(tn);
627notnode:
628 return NULL;
629}
630
631static struct key_vector *halve(struct trie *t,
632 struct key_vector *oldtnode)
633{
634 struct key_vector *tn;
635 unsigned long i;
636
637 pr_debug("In halve\n");
638
639 tn = tnode_new(oldtnode->key, oldtnode->pos + 1, oldtnode->bits - 1);
640 if (!tn)
641 goto notnode;
642
643
644 tnode_free_init(oldtnode);
645
646
647
648
649
650
651 for (i = child_length(oldtnode); i;) {
652 struct key_vector *node1 = get_child(oldtnode, --i);
653 struct key_vector *node0 = get_child(oldtnode, --i);
654 struct key_vector *inode;
655
656
657 if (!node1 || !node0) {
658 put_child(tn, i / 2, node1 ? : node0);
659 continue;
660 }
661
662
663 inode = tnode_new(node0->key, oldtnode->pos, 1);
664 if (!inode)
665 goto nomem;
666 tnode_free_append(tn, inode);
667
668
669 put_child(inode, 1, node1);
670 put_child(inode, 0, node0);
671 NODE_INIT_PARENT(inode, tn);
672
673
674 put_child(tn, i / 2, inode);
675 }
676
677
678 return replace(t, oldtnode, tn);
679nomem:
680
681 tnode_free(tn);
682notnode:
683 return NULL;
684}
685
686static struct key_vector *collapse(struct trie *t,
687 struct key_vector *oldtnode)
688{
689 struct key_vector *n, *tp;
690 unsigned long i;
691
692
693 for (n = NULL, i = child_length(oldtnode); !n && i;)
694 n = get_child(oldtnode, --i);
695
696
697 tp = node_parent(oldtnode);
698 put_child_root(tp, oldtnode->key, n);
699 node_set_parent(n, tp);
700
701
702 node_free(oldtnode);
703
704 return tp;
705}
706
707static unsigned char update_suffix(struct key_vector *tn)
708{
709 unsigned char slen = tn->pos;
710 unsigned long stride, i;
711 unsigned char slen_max;
712
713
714
715
716
717 slen_max = min_t(unsigned char, tn->pos + tn->bits - 1, tn->slen);
718
719
720
721
722
723
724 for (i = 0, stride = 0x2ul ; i < child_length(tn); i += stride) {
725 struct key_vector *n = get_child(tn, i);
726
727 if (!n || (n->slen <= slen))
728 continue;
729
730
731 stride <<= (n->slen - slen);
732 slen = n->slen;
733 i &= ~(stride - 1);
734
735
736 if (slen >= slen_max)
737 break;
738 }
739
740 tn->slen = slen;
741
742 return slen;
743}
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802static inline bool should_inflate(struct key_vector *tp, struct key_vector *tn)
803{
804 unsigned long used = child_length(tn);
805 unsigned long threshold = used;
806
807
808 threshold *= IS_TRIE(tp) ? inflate_threshold_root : inflate_threshold;
809 used -= tn_info(tn)->empty_children;
810 used += tn_info(tn)->full_children;
811
812
813
814 return (used > 1) && tn->pos && ((50 * used) >= threshold);
815}
816
817static inline bool should_halve(struct key_vector *tp, struct key_vector *tn)
818{
819 unsigned long used = child_length(tn);
820 unsigned long threshold = used;
821
822
823 threshold *= IS_TRIE(tp) ? halve_threshold_root : halve_threshold;
824 used -= tn_info(tn)->empty_children;
825
826
827
828 return (used > 1) && (tn->bits > 1) && ((100 * used) < threshold);
829}
830
831static inline bool should_collapse(struct key_vector *tn)
832{
833 unsigned long used = child_length(tn);
834
835 used -= tn_info(tn)->empty_children;
836
837
838 if ((tn->bits == KEYLENGTH) && tn_info(tn)->full_children)
839 used -= KEY_MAX;
840
841
842 return used < 2;
843}
844
845#define MAX_WORK 10
846static struct key_vector *resize(struct trie *t, struct key_vector *tn)
847{
848#ifdef CONFIG_IP_FIB_TRIE_STATS
849 struct trie_use_stats __percpu *stats = t->stats;
850#endif
851 struct key_vector *tp = node_parent(tn);
852 unsigned long cindex = get_index(tn->key, tp);
853 int max_work = MAX_WORK;
854
855 pr_debug("In tnode_resize %p inflate_threshold=%d threshold=%d\n",
856 tn, inflate_threshold, halve_threshold);
857
858
859
860
861
862 BUG_ON(tn != get_child(tp, cindex));
863
864
865
866
867 while (should_inflate(tp, tn) && max_work) {
868 tp = inflate(t, tn);
869 if (!tp) {
870#ifdef CONFIG_IP_FIB_TRIE_STATS
871 this_cpu_inc(stats->resize_node_skipped);
872#endif
873 break;
874 }
875
876 max_work--;
877 tn = get_child(tp, cindex);
878 }
879
880
881 tp = node_parent(tn);
882
883
884 if (max_work != MAX_WORK)
885 return tp;
886
887
888
889
890 while (should_halve(tp, tn) && max_work) {
891 tp = halve(t, tn);
892 if (!tp) {
893#ifdef CONFIG_IP_FIB_TRIE_STATS
894 this_cpu_inc(stats->resize_node_skipped);
895#endif
896 break;
897 }
898
899 max_work--;
900 tn = get_child(tp, cindex);
901 }
902
903
904 if (should_collapse(tn))
905 return collapse(t, tn);
906
907
908 return node_parent(tn);
909}
910
911static void node_pull_suffix(struct key_vector *tn, unsigned char slen)
912{
913 unsigned char node_slen = tn->slen;
914
915 while ((node_slen > tn->pos) && (node_slen > slen)) {
916 slen = update_suffix(tn);
917 if (node_slen == slen)
918 break;
919
920 tn = node_parent(tn);
921 node_slen = tn->slen;
922 }
923}
924
925static void node_push_suffix(struct key_vector *tn, unsigned char slen)
926{
927 while (tn->slen < slen) {
928 tn->slen = slen;
929 tn = node_parent(tn);
930 }
931}
932
933
934static struct key_vector *fib_find_node(struct trie *t,
935 struct key_vector **tp, u32 key)
936{
937 struct key_vector *pn, *n = t->kv;
938 unsigned long index = 0;
939
940 do {
941 pn = n;
942 n = get_child_rcu(n, index);
943
944 if (!n)
945 break;
946
947 index = get_cindex(key, n);
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963 if (index >= (1ul << n->bits)) {
964 n = NULL;
965 break;
966 }
967
968
969 } while (IS_TNODE(n));
970
971 *tp = pn;
972
973 return n;
974}
975
976
977
978
979
980
981static struct fib_alias *fib_find_alias(struct hlist_head *fah, u8 slen,
982 u8 tos, u32 prio, u32 tb_id,
983 bool find_first)
984{
985 struct fib_alias *fa;
986
987 if (!fah)
988 return NULL;
989
990 hlist_for_each_entry(fa, fah, fa_list) {
991 if (fa->fa_slen < slen)
992 continue;
993 if (fa->fa_slen != slen)
994 break;
995 if (fa->tb_id > tb_id)
996 continue;
997 if (fa->tb_id != tb_id)
998 break;
999 if (find_first)
1000 return fa;
1001 if (fa->fa_tos > tos)
1002 continue;
1003 if (fa->fa_info->fib_priority >= prio || fa->fa_tos < tos)
1004 return fa;
1005 }
1006
1007 return NULL;
1008}
1009
1010static struct fib_alias *
1011fib_find_matching_alias(struct net *net, const struct fib_rt_info *fri)
1012{
1013 u8 slen = KEYLENGTH - fri->dst_len;
1014 struct key_vector *l, *tp;
1015 struct fib_table *tb;
1016 struct fib_alias *fa;
1017 struct trie *t;
1018
1019 tb = fib_get_table(net, fri->tb_id);
1020 if (!tb)
1021 return NULL;
1022
1023 t = (struct trie *)tb->tb_data;
1024 l = fib_find_node(t, &tp, be32_to_cpu(fri->dst));
1025 if (!l)
1026 return NULL;
1027
1028 hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
1029 if (fa->fa_slen == slen && fa->tb_id == fri->tb_id &&
1030 fa->fa_tos == fri->tos && fa->fa_info == fri->fi &&
1031 fa->fa_type == fri->type)
1032 return fa;
1033 }
1034
1035 return NULL;
1036}
1037
1038void fib_alias_hw_flags_set(struct net *net, const struct fib_rt_info *fri)
1039{
1040 struct fib_alias *fa_match;
1041 struct sk_buff *skb;
1042 int err;
1043
1044 rcu_read_lock();
1045
1046 fa_match = fib_find_matching_alias(net, fri);
1047 if (!fa_match)
1048 goto out;
1049
1050 if (fa_match->offload == fri->offload && fa_match->trap == fri->trap &&
1051 fa_match->offload_failed == fri->offload_failed)
1052 goto out;
1053
1054 fa_match->offload = fri->offload;
1055 fa_match->trap = fri->trap;
1056
1057
1058 if (net->ipv4.sysctl_fib_notify_on_flag_change == 2 &&
1059 fa_match->offload_failed == fri->offload_failed)
1060 goto out;
1061
1062 fa_match->offload_failed = fri->offload_failed;
1063
1064 if (!net->ipv4.sysctl_fib_notify_on_flag_change)
1065 goto out;
1066
1067 skb = nlmsg_new(fib_nlmsg_size(fa_match->fa_info), GFP_ATOMIC);
1068 if (!skb) {
1069 err = -ENOBUFS;
1070 goto errout;
1071 }
1072
1073 err = fib_dump_info(skb, 0, 0, RTM_NEWROUTE, fri, 0);
1074 if (err < 0) {
1075
1076 WARN_ON(err == -EMSGSIZE);
1077 kfree_skb(skb);
1078 goto errout;
1079 }
1080
1081 rtnl_notify(skb, net, 0, RTNLGRP_IPV4_ROUTE, NULL, GFP_ATOMIC);
1082 goto out;
1083
1084errout:
1085 rtnl_set_sk_err(net, RTNLGRP_IPV4_ROUTE, err);
1086out:
1087 rcu_read_unlock();
1088}
1089EXPORT_SYMBOL_GPL(fib_alias_hw_flags_set);
1090
1091static void trie_rebalance(struct trie *t, struct key_vector *tn)
1092{
1093 while (!IS_TRIE(tn))
1094 tn = resize(t, tn);
1095}
1096
1097static int fib_insert_node(struct trie *t, struct key_vector *tp,
1098 struct fib_alias *new, t_key key)
1099{
1100 struct key_vector *n, *l;
1101
1102 l = leaf_new(key, new);
1103 if (!l)
1104 goto noleaf;
1105
1106
1107 n = get_child(tp, get_index(key, tp));
1108
1109
1110
1111
1112
1113
1114
1115 if (n) {
1116 struct key_vector *tn;
1117
1118 tn = tnode_new(key, __fls(key ^ n->key), 1);
1119 if (!tn)
1120 goto notnode;
1121
1122
1123 NODE_INIT_PARENT(tn, tp);
1124 put_child(tn, get_index(key, tn) ^ 1, n);
1125
1126
1127 put_child_root(tp, key, tn);
1128 node_set_parent(n, tn);
1129
1130
1131 tp = tn;
1132 }
1133
1134
1135 node_push_suffix(tp, new->fa_slen);
1136 NODE_INIT_PARENT(l, tp);
1137 put_child_root(tp, key, l);
1138 trie_rebalance(t, tp);
1139
1140 return 0;
1141notnode:
1142 node_free(l);
1143noleaf:
1144 return -ENOMEM;
1145}
1146
1147static int fib_insert_alias(struct trie *t, struct key_vector *tp,
1148 struct key_vector *l, struct fib_alias *new,
1149 struct fib_alias *fa, t_key key)
1150{
1151 if (!l)
1152 return fib_insert_node(t, tp, new, key);
1153
1154 if (fa) {
1155 hlist_add_before_rcu(&new->fa_list, &fa->fa_list);
1156 } else {
1157 struct fib_alias *last;
1158
1159 hlist_for_each_entry(last, &l->leaf, fa_list) {
1160 if (new->fa_slen < last->fa_slen)
1161 break;
1162 if ((new->fa_slen == last->fa_slen) &&
1163 (new->tb_id > last->tb_id))
1164 break;
1165 fa = last;
1166 }
1167
1168 if (fa)
1169 hlist_add_behind_rcu(&new->fa_list, &fa->fa_list);
1170 else
1171 hlist_add_head_rcu(&new->fa_list, &l->leaf);
1172 }
1173
1174
1175 if (l->slen < new->fa_slen) {
1176 l->slen = new->fa_slen;
1177 node_push_suffix(tp, new->fa_slen);
1178 }
1179
1180 return 0;
1181}
1182
1183static bool fib_valid_key_len(u32 key, u8 plen, struct netlink_ext_ack *extack)
1184{
1185 if (plen > KEYLENGTH) {
1186 NL_SET_ERR_MSG(extack, "Invalid prefix length");
1187 return false;
1188 }
1189
1190 if ((plen < KEYLENGTH) && (key << plen)) {
1191 NL_SET_ERR_MSG(extack,
1192 "Invalid prefix for given prefix length");
1193 return false;
1194 }
1195
1196 return true;
1197}
1198
1199static void fib_remove_alias(struct trie *t, struct key_vector *tp,
1200 struct key_vector *l, struct fib_alias *old);
1201
1202
1203int fib_table_insert(struct net *net, struct fib_table *tb,
1204 struct fib_config *cfg, struct netlink_ext_ack *extack)
1205{
1206 struct trie *t = (struct trie *)tb->tb_data;
1207 struct fib_alias *fa, *new_fa;
1208 struct key_vector *l, *tp;
1209 u16 nlflags = NLM_F_EXCL;
1210 struct fib_info *fi;
1211 u8 plen = cfg->fc_dst_len;
1212 u8 slen = KEYLENGTH - plen;
1213 u8 tos = cfg->fc_tos;
1214 u32 key;
1215 int err;
1216
1217 key = ntohl(cfg->fc_dst);
1218
1219 if (!fib_valid_key_len(key, plen, extack))
1220 return -EINVAL;
1221
1222 pr_debug("Insert table=%u %08x/%d\n", tb->tb_id, key, plen);
1223
1224 fi = fib_create_info(cfg, extack);
1225 if (IS_ERR(fi)) {
1226 err = PTR_ERR(fi);
1227 goto err;
1228 }
1229
1230 l = fib_find_node(t, &tp, key);
1231 fa = l ? fib_find_alias(&l->leaf, slen, tos, fi->fib_priority,
1232 tb->tb_id, false) : NULL;
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243 if (fa && fa->fa_tos == tos &&
1244 fa->fa_info->fib_priority == fi->fib_priority) {
1245 struct fib_alias *fa_first, *fa_match;
1246
1247 err = -EEXIST;
1248 if (cfg->fc_nlflags & NLM_F_EXCL)
1249 goto out;
1250
1251 nlflags &= ~NLM_F_EXCL;
1252
1253
1254
1255
1256
1257
1258 fa_match = NULL;
1259 fa_first = fa;
1260 hlist_for_each_entry_from(fa, fa_list) {
1261 if ((fa->fa_slen != slen) ||
1262 (fa->tb_id != tb->tb_id) ||
1263 (fa->fa_tos != tos))
1264 break;
1265 if (fa->fa_info->fib_priority != fi->fib_priority)
1266 break;
1267 if (fa->fa_type == cfg->fc_type &&
1268 fa->fa_info == fi) {
1269 fa_match = fa;
1270 break;
1271 }
1272 }
1273
1274 if (cfg->fc_nlflags & NLM_F_REPLACE) {
1275 struct fib_info *fi_drop;
1276 u8 state;
1277
1278 nlflags |= NLM_F_REPLACE;
1279 fa = fa_first;
1280 if (fa_match) {
1281 if (fa == fa_match)
1282 err = 0;
1283 goto out;
1284 }
1285 err = -ENOBUFS;
1286 new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
1287 if (!new_fa)
1288 goto out;
1289
1290 fi_drop = fa->fa_info;
1291 new_fa->fa_tos = fa->fa_tos;
1292 new_fa->fa_info = fi;
1293 new_fa->fa_type = cfg->fc_type;
1294 state = fa->fa_state;
1295 new_fa->fa_state = state & ~FA_S_ACCESSED;
1296 new_fa->fa_slen = fa->fa_slen;
1297 new_fa->tb_id = tb->tb_id;
1298 new_fa->fa_default = -1;
1299 new_fa->offload = 0;
1300 new_fa->trap = 0;
1301 new_fa->offload_failed = 0;
1302
1303 hlist_replace_rcu(&fa->fa_list, &new_fa->fa_list);
1304
1305 if (fib_find_alias(&l->leaf, fa->fa_slen, 0, 0,
1306 tb->tb_id, true) == new_fa) {
1307 enum fib_event_type fib_event;
1308
1309 fib_event = FIB_EVENT_ENTRY_REPLACE;
1310 err = call_fib_entry_notifiers(net, fib_event,
1311 key, plen,
1312 new_fa, extack);
1313 if (err) {
1314 hlist_replace_rcu(&new_fa->fa_list,
1315 &fa->fa_list);
1316 goto out_free_new_fa;
1317 }
1318 }
1319
1320 rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen,
1321 tb->tb_id, &cfg->fc_nlinfo, nlflags);
1322
1323 alias_free_mem_rcu(fa);
1324
1325 fib_release_info(fi_drop);
1326 if (state & FA_S_ACCESSED)
1327 rt_cache_flush(cfg->fc_nlinfo.nl_net);
1328
1329 goto succeeded;
1330 }
1331
1332
1333
1334
1335 if (fa_match)
1336 goto out;
1337
1338 if (cfg->fc_nlflags & NLM_F_APPEND)
1339 nlflags |= NLM_F_APPEND;
1340 else
1341 fa = fa_first;
1342 }
1343 err = -ENOENT;
1344 if (!(cfg->fc_nlflags & NLM_F_CREATE))
1345 goto out;
1346
1347 nlflags |= NLM_F_CREATE;
1348 err = -ENOBUFS;
1349 new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
1350 if (!new_fa)
1351 goto out;
1352
1353 new_fa->fa_info = fi;
1354 new_fa->fa_tos = tos;
1355 new_fa->fa_type = cfg->fc_type;
1356 new_fa->fa_state = 0;
1357 new_fa->fa_slen = slen;
1358 new_fa->tb_id = tb->tb_id;
1359 new_fa->fa_default = -1;
1360 new_fa->offload = 0;
1361 new_fa->trap = 0;
1362 new_fa->offload_failed = 0;
1363
1364
1365 err = fib_insert_alias(t, tp, l, new_fa, fa, key);
1366 if (err)
1367 goto out_free_new_fa;
1368
1369
1370 l = l ? l : fib_find_node(t, &tp, key);
1371 if (WARN_ON_ONCE(!l))
1372 goto out_free_new_fa;
1373
1374 if (fib_find_alias(&l->leaf, new_fa->fa_slen, 0, 0, tb->tb_id, true) ==
1375 new_fa) {
1376 enum fib_event_type fib_event;
1377
1378 fib_event = FIB_EVENT_ENTRY_REPLACE;
1379 err = call_fib_entry_notifiers(net, fib_event, key, plen,
1380 new_fa, extack);
1381 if (err)
1382 goto out_remove_new_fa;
1383 }
1384
1385 if (!plen)
1386 tb->tb_num_default++;
1387
1388 rt_cache_flush(cfg->fc_nlinfo.nl_net);
1389 rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, new_fa->tb_id,
1390 &cfg->fc_nlinfo, nlflags);
1391succeeded:
1392 return 0;
1393
1394out_remove_new_fa:
1395 fib_remove_alias(t, tp, l, new_fa);
1396out_free_new_fa:
1397 kmem_cache_free(fn_alias_kmem, new_fa);
1398out:
1399 fib_release_info(fi);
1400err:
1401 return err;
1402}
1403
1404static inline t_key prefix_mismatch(t_key key, struct key_vector *n)
1405{
1406 t_key prefix = n->key;
1407
1408 return (key ^ prefix) & (prefix | -prefix);
1409}
1410
1411bool fib_lookup_good_nhc(const struct fib_nh_common *nhc, int fib_flags,
1412 const struct flowi4 *flp)
1413{
1414 if (nhc->nhc_flags & RTNH_F_DEAD)
1415 return false;
1416
1417 if (ip_ignore_linkdown(nhc->nhc_dev) &&
1418 nhc->nhc_flags & RTNH_F_LINKDOWN &&
1419 !(fib_flags & FIB_LOOKUP_IGNORE_LINKSTATE))
1420 return false;
1421
1422 if (!(flp->flowi4_flags & FLOWI_FLAG_SKIP_NH_OIF)) {
1423 if (flp->flowi4_oif &&
1424 flp->flowi4_oif != nhc->nhc_oif)
1425 return false;
1426 }
1427
1428 return true;
1429}
1430
1431
1432int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
1433 struct fib_result *res, int fib_flags)
1434{
1435 struct trie *t = (struct trie *) tb->tb_data;
1436#ifdef CONFIG_IP_FIB_TRIE_STATS
1437 struct trie_use_stats __percpu *stats = t->stats;
1438#endif
1439 const t_key key = ntohl(flp->daddr);
1440 struct key_vector *n, *pn;
1441 struct fib_alias *fa;
1442 unsigned long index;
1443 t_key cindex;
1444
1445 pn = t->kv;
1446 cindex = 0;
1447
1448 n = get_child_rcu(pn, cindex);
1449 if (!n) {
1450 trace_fib_table_lookup(tb->tb_id, flp, NULL, -EAGAIN);
1451 return -EAGAIN;
1452 }
1453
1454#ifdef CONFIG_IP_FIB_TRIE_STATS
1455 this_cpu_inc(stats->gets);
1456#endif
1457
1458
1459 for (;;) {
1460 index = get_cindex(key, n);
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476 if (index >= (1ul << n->bits))
1477 break;
1478
1479
1480 if (IS_LEAF(n))
1481 goto found;
1482
1483
1484
1485
1486 if (n->slen > n->pos) {
1487 pn = n;
1488 cindex = index;
1489 }
1490
1491 n = get_child_rcu(n, index);
1492 if (unlikely(!n))
1493 goto backtrace;
1494 }
1495
1496
1497 for (;;) {
1498
1499 struct key_vector __rcu **cptr = n->tnode;
1500
1501
1502
1503
1504
1505 if (unlikely(prefix_mismatch(key, n)) || (n->slen == n->pos))
1506 goto backtrace;
1507
1508
1509 if (unlikely(IS_LEAF(n)))
1510 break;
1511
1512
1513
1514
1515
1516
1517 while ((n = rcu_dereference(*cptr)) == NULL) {
1518backtrace:
1519#ifdef CONFIG_IP_FIB_TRIE_STATS
1520 if (!n)
1521 this_cpu_inc(stats->null_node_hit);
1522#endif
1523
1524
1525
1526
1527
1528 while (!cindex) {
1529 t_key pkey = pn->key;
1530
1531
1532
1533
1534
1535 if (IS_TRIE(pn)) {
1536 trace_fib_table_lookup(tb->tb_id, flp,
1537 NULL, -EAGAIN);
1538 return -EAGAIN;
1539 }
1540#ifdef CONFIG_IP_FIB_TRIE_STATS
1541 this_cpu_inc(stats->backtrack);
1542#endif
1543
1544 pn = node_parent_rcu(pn);
1545 cindex = get_index(pkey, pn);
1546 }
1547
1548
1549 cindex &= cindex - 1;
1550
1551
1552 cptr = &pn->tnode[cindex];
1553 }
1554 }
1555
1556found:
1557
1558 index = key ^ n->key;
1559
1560
1561 hlist_for_each_entry_rcu(fa, &n->leaf, fa_list) {
1562 struct fib_info *fi = fa->fa_info;
1563 struct fib_nh_common *nhc;
1564 int nhsel, err;
1565
1566 if ((BITS_PER_LONG > KEYLENGTH) || (fa->fa_slen < KEYLENGTH)) {
1567 if (index >= (1ul << fa->fa_slen))
1568 continue;
1569 }
1570 if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos)
1571 continue;
1572 if (fi->fib_dead)
1573 continue;
1574 if (fa->fa_info->fib_scope < flp->flowi4_scope)
1575 continue;
1576 fib_alias_accessed(fa);
1577 err = fib_props[fa->fa_type].error;
1578 if (unlikely(err < 0)) {
1579out_reject:
1580#ifdef CONFIG_IP_FIB_TRIE_STATS
1581 this_cpu_inc(stats->semantic_match_passed);
1582#endif
1583 trace_fib_table_lookup(tb->tb_id, flp, NULL, err);
1584 return err;
1585 }
1586 if (fi->fib_flags & RTNH_F_DEAD)
1587 continue;
1588
1589 if (unlikely(fi->nh)) {
1590 if (nexthop_is_blackhole(fi->nh)) {
1591 err = fib_props[RTN_BLACKHOLE].error;
1592 goto out_reject;
1593 }
1594
1595 nhc = nexthop_get_nhc_lookup(fi->nh, fib_flags, flp,
1596 &nhsel);
1597 if (nhc)
1598 goto set_result;
1599 goto miss;
1600 }
1601
1602 for (nhsel = 0; nhsel < fib_info_num_path(fi); nhsel++) {
1603 nhc = fib_info_nhc(fi, nhsel);
1604
1605 if (!fib_lookup_good_nhc(nhc, fib_flags, flp))
1606 continue;
1607set_result:
1608 if (!(fib_flags & FIB_LOOKUP_NOREF))
1609 refcount_inc(&fi->fib_clntref);
1610
1611 res->prefix = htonl(n->key);
1612 res->prefixlen = KEYLENGTH - fa->fa_slen;
1613 res->nh_sel = nhsel;
1614 res->nhc = nhc;
1615 res->type = fa->fa_type;
1616 res->scope = fi->fib_scope;
1617 res->fi = fi;
1618 res->table = tb;
1619 res->fa_head = &n->leaf;
1620#ifdef CONFIG_IP_FIB_TRIE_STATS
1621 this_cpu_inc(stats->semantic_match_passed);
1622#endif
1623 trace_fib_table_lookup(tb->tb_id, flp, nhc, err);
1624
1625 return err;
1626 }
1627 }
1628miss:
1629#ifdef CONFIG_IP_FIB_TRIE_STATS
1630 this_cpu_inc(stats->semantic_match_miss);
1631#endif
1632 goto backtrace;
1633}
1634EXPORT_SYMBOL_GPL(fib_table_lookup);
1635
1636static void fib_remove_alias(struct trie *t, struct key_vector *tp,
1637 struct key_vector *l, struct fib_alias *old)
1638{
1639
1640 struct hlist_node **pprev = old->fa_list.pprev;
1641 struct fib_alias *fa = hlist_entry(pprev, typeof(*fa), fa_list.next);
1642
1643
1644 hlist_del_rcu(&old->fa_list);
1645
1646
1647
1648
1649 if (hlist_empty(&l->leaf)) {
1650 if (tp->slen == l->slen)
1651 node_pull_suffix(tp, tp->pos);
1652 put_child_root(tp, l->key, NULL);
1653 node_free(l);
1654 trie_rebalance(t, tp);
1655 return;
1656 }
1657
1658
1659 if (*pprev)
1660 return;
1661
1662
1663 l->slen = fa->fa_slen;
1664 node_pull_suffix(tp, fa->fa_slen);
1665}
1666
1667static void fib_notify_alias_delete(struct net *net, u32 key,
1668 struct hlist_head *fah,
1669 struct fib_alias *fa_to_delete,
1670 struct netlink_ext_ack *extack)
1671{
1672 struct fib_alias *fa_next, *fa_to_notify;
1673 u32 tb_id = fa_to_delete->tb_id;
1674 u8 slen = fa_to_delete->fa_slen;
1675 enum fib_event_type fib_event;
1676
1677
1678 if (fib_find_alias(fah, slen, 0, 0, tb_id, true) != fa_to_delete)
1679 return;
1680
1681
1682
1683
1684 fa_next = hlist_entry_safe(fa_to_delete->fa_list.next,
1685 struct fib_alias, fa_list);
1686 if (fa_next && fa_next->fa_slen == slen && fa_next->tb_id == tb_id) {
1687 fib_event = FIB_EVENT_ENTRY_REPLACE;
1688 fa_to_notify = fa_next;
1689 } else {
1690 fib_event = FIB_EVENT_ENTRY_DEL;
1691 fa_to_notify = fa_to_delete;
1692 }
1693 call_fib_entry_notifiers(net, fib_event, key, KEYLENGTH - slen,
1694 fa_to_notify, extack);
1695}
1696
1697
1698int fib_table_delete(struct net *net, struct fib_table *tb,
1699 struct fib_config *cfg, struct netlink_ext_ack *extack)
1700{
1701 struct trie *t = (struct trie *) tb->tb_data;
1702 struct fib_alias *fa, *fa_to_delete;
1703 struct key_vector *l, *tp;
1704 u8 plen = cfg->fc_dst_len;
1705 u8 slen = KEYLENGTH - plen;
1706 u8 tos = cfg->fc_tos;
1707 u32 key;
1708
1709 key = ntohl(cfg->fc_dst);
1710
1711 if (!fib_valid_key_len(key, plen, extack))
1712 return -EINVAL;
1713
1714 l = fib_find_node(t, &tp, key);
1715 if (!l)
1716 return -ESRCH;
1717
1718 fa = fib_find_alias(&l->leaf, slen, tos, 0, tb->tb_id, false);
1719 if (!fa)
1720 return -ESRCH;
1721
1722 pr_debug("Deleting %08x/%d tos=%d t=%p\n", key, plen, tos, t);
1723
1724 fa_to_delete = NULL;
1725 hlist_for_each_entry_from(fa, fa_list) {
1726 struct fib_info *fi = fa->fa_info;
1727
1728 if ((fa->fa_slen != slen) ||
1729 (fa->tb_id != tb->tb_id) ||
1730 (fa->fa_tos != tos))
1731 break;
1732
1733 if ((!cfg->fc_type || fa->fa_type == cfg->fc_type) &&
1734 (cfg->fc_scope == RT_SCOPE_NOWHERE ||
1735 fa->fa_info->fib_scope == cfg->fc_scope) &&
1736 (!cfg->fc_prefsrc ||
1737 fi->fib_prefsrc == cfg->fc_prefsrc) &&
1738 (!cfg->fc_protocol ||
1739 fi->fib_protocol == cfg->fc_protocol) &&
1740 fib_nh_match(net, cfg, fi, extack) == 0 &&
1741 fib_metrics_match(cfg, fi)) {
1742 fa_to_delete = fa;
1743 break;
1744 }
1745 }
1746
1747 if (!fa_to_delete)
1748 return -ESRCH;
1749
1750 fib_notify_alias_delete(net, key, &l->leaf, fa_to_delete, extack);
1751 rtmsg_fib(RTM_DELROUTE, htonl(key), fa_to_delete, plen, tb->tb_id,
1752 &cfg->fc_nlinfo, 0);
1753
1754 if (!plen)
1755 tb->tb_num_default--;
1756
1757 fib_remove_alias(t, tp, l, fa_to_delete);
1758
1759 if (fa_to_delete->fa_state & FA_S_ACCESSED)
1760 rt_cache_flush(cfg->fc_nlinfo.nl_net);
1761
1762 fib_release_info(fa_to_delete->fa_info);
1763 alias_free_mem_rcu(fa_to_delete);
1764 return 0;
1765}
1766
1767
1768static struct key_vector *leaf_walk_rcu(struct key_vector **tn, t_key key)
1769{
1770 struct key_vector *pn, *n = *tn;
1771 unsigned long cindex;
1772
1773
1774 do {
1775
1776 pn = n;
1777 cindex = (key > pn->key) ? get_index(key, pn) : 0;
1778
1779 if (cindex >> pn->bits)
1780 break;
1781
1782
1783 n = get_child_rcu(pn, cindex++);
1784 if (!n)
1785 break;
1786
1787
1788 if (IS_LEAF(n) && (n->key >= key))
1789 goto found;
1790 } while (IS_TNODE(n));
1791
1792
1793 while (!IS_TRIE(pn)) {
1794
1795 if (cindex >= (1ul << pn->bits)) {
1796 t_key pkey = pn->key;
1797
1798 pn = node_parent_rcu(pn);
1799 cindex = get_index(pkey, pn) + 1;
1800 continue;
1801 }
1802
1803
1804 n = get_child_rcu(pn, cindex++);
1805 if (!n)
1806 continue;
1807
1808
1809 if (IS_LEAF(n))
1810 goto found;
1811
1812
1813 pn = n;
1814 cindex = 0;
1815 }
1816
1817 *tn = pn;
1818 return NULL;
1819found:
1820
1821 *tn = pn;
1822 return n;
1823}
1824
1825static void fib_trie_free(struct fib_table *tb)
1826{
1827 struct trie *t = (struct trie *)tb->tb_data;
1828 struct key_vector *pn = t->kv;
1829 unsigned long cindex = 1;
1830 struct hlist_node *tmp;
1831 struct fib_alias *fa;
1832
1833
1834 for (;;) {
1835 struct key_vector *n;
1836
1837 if (!(cindex--)) {
1838 t_key pkey = pn->key;
1839
1840 if (IS_TRIE(pn))
1841 break;
1842
1843 n = pn;
1844 pn = node_parent(pn);
1845
1846
1847 put_child_root(pn, n->key, NULL);
1848 node_free(n);
1849
1850 cindex = get_index(pkey, pn);
1851
1852 continue;
1853 }
1854
1855
1856 n = get_child(pn, cindex);
1857 if (!n)
1858 continue;
1859
1860 if (IS_TNODE(n)) {
1861
1862 pn = n;
1863 cindex = 1ul << n->bits;
1864
1865 continue;
1866 }
1867
1868 hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) {
1869 hlist_del_rcu(&fa->fa_list);
1870 alias_free_mem_rcu(fa);
1871 }
1872
1873 put_child_root(pn, n->key, NULL);
1874 node_free(n);
1875 }
1876
1877#ifdef CONFIG_IP_FIB_TRIE_STATS
1878 free_percpu(t->stats);
1879#endif
1880 kfree(tb);
1881}
1882
1883struct fib_table *fib_trie_unmerge(struct fib_table *oldtb)
1884{
1885 struct trie *ot = (struct trie *)oldtb->tb_data;
1886 struct key_vector *l, *tp = ot->kv;
1887 struct fib_table *local_tb;
1888 struct fib_alias *fa;
1889 struct trie *lt;
1890 t_key key = 0;
1891
1892 if (oldtb->tb_data == oldtb->__data)
1893 return oldtb;
1894
1895 local_tb = fib_trie_table(RT_TABLE_LOCAL, NULL);
1896 if (!local_tb)
1897 return NULL;
1898
1899 lt = (struct trie *)local_tb->tb_data;
1900
1901 while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
1902 struct key_vector *local_l = NULL, *local_tp;
1903
1904 hlist_for_each_entry(fa, &l->leaf, fa_list) {
1905 struct fib_alias *new_fa;
1906
1907 if (local_tb->tb_id != fa->tb_id)
1908 continue;
1909
1910
1911 new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
1912 if (!new_fa)
1913 goto out;
1914
1915 memcpy(new_fa, fa, sizeof(*fa));
1916
1917
1918 if (!local_l)
1919 local_l = fib_find_node(lt, &local_tp, l->key);
1920
1921 if (fib_insert_alias(lt, local_tp, local_l, new_fa,
1922 NULL, l->key)) {
1923 kmem_cache_free(fn_alias_kmem, new_fa);
1924 goto out;
1925 }
1926 }
1927
1928
1929 key = l->key + 1;
1930 if (key < l->key)
1931 break;
1932 }
1933
1934 return local_tb;
1935out:
1936 fib_trie_free(local_tb);
1937
1938 return NULL;
1939}
1940
1941
1942void fib_table_flush_external(struct fib_table *tb)
1943{
1944 struct trie *t = (struct trie *)tb->tb_data;
1945 struct key_vector *pn = t->kv;
1946 unsigned long cindex = 1;
1947 struct hlist_node *tmp;
1948 struct fib_alias *fa;
1949
1950
1951 for (;;) {
1952 unsigned char slen = 0;
1953 struct key_vector *n;
1954
1955 if (!(cindex--)) {
1956 t_key pkey = pn->key;
1957
1958
1959 if (IS_TRIE(pn))
1960 break;
1961
1962
1963 if (pn->slen > pn->pos)
1964 update_suffix(pn);
1965
1966
1967 pn = resize(t, pn);
1968 cindex = get_index(pkey, pn);
1969
1970 continue;
1971 }
1972
1973
1974 n = get_child(pn, cindex);
1975 if (!n)
1976 continue;
1977
1978 if (IS_TNODE(n)) {
1979
1980 pn = n;
1981 cindex = 1ul << n->bits;
1982
1983 continue;
1984 }
1985
1986 hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) {
1987
1988
1989
1990 if (tb->tb_id != fa->tb_id) {
1991 hlist_del_rcu(&fa->fa_list);
1992 alias_free_mem_rcu(fa);
1993 continue;
1994 }
1995
1996
1997 slen = fa->fa_slen;
1998 }
1999
2000
2001 n->slen = slen;
2002
2003 if (hlist_empty(&n->leaf)) {
2004 put_child_root(pn, n->key, NULL);
2005 node_free(n);
2006 }
2007 }
2008}
2009
2010
2011int fib_table_flush(struct net *net, struct fib_table *tb, bool flush_all)
2012{
2013 struct trie *t = (struct trie *)tb->tb_data;
2014 struct key_vector *pn = t->kv;
2015 unsigned long cindex = 1;
2016 struct hlist_node *tmp;
2017 struct fib_alias *fa;
2018 int found = 0;
2019
2020
2021 for (;;) {
2022 unsigned char slen = 0;
2023 struct key_vector *n;
2024
2025 if (!(cindex--)) {
2026 t_key pkey = pn->key;
2027
2028
2029 if (IS_TRIE(pn))
2030 break;
2031
2032
2033 if (pn->slen > pn->pos)
2034 update_suffix(pn);
2035
2036
2037 pn = resize(t, pn);
2038 cindex = get_index(pkey, pn);
2039
2040 continue;
2041 }
2042
2043
2044 n = get_child(pn, cindex);
2045 if (!n)
2046 continue;
2047
2048 if (IS_TNODE(n)) {
2049
2050 pn = n;
2051 cindex = 1ul << n->bits;
2052
2053 continue;
2054 }
2055
2056 hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) {
2057 struct fib_info *fi = fa->fa_info;
2058
2059 if (!fi || tb->tb_id != fa->tb_id ||
2060 (!(fi->fib_flags & RTNH_F_DEAD) &&
2061 !fib_props[fa->fa_type].error)) {
2062 slen = fa->fa_slen;
2063 continue;
2064 }
2065
2066
2067
2068
2069 if (!flush_all && fib_props[fa->fa_type].error) {
2070 slen = fa->fa_slen;
2071 continue;
2072 }
2073
2074 fib_notify_alias_delete(net, n->key, &n->leaf, fa,
2075 NULL);
2076 hlist_del_rcu(&fa->fa_list);
2077 fib_release_info(fa->fa_info);
2078 alias_free_mem_rcu(fa);
2079 found++;
2080 }
2081
2082
2083 n->slen = slen;
2084
2085 if (hlist_empty(&n->leaf)) {
2086 put_child_root(pn, n->key, NULL);
2087 node_free(n);
2088 }
2089 }
2090
2091 pr_debug("trie_flush found=%d\n", found);
2092 return found;
2093}
2094
2095
2096static void __fib_info_notify_update(struct net *net, struct fib_table *tb,
2097 struct nl_info *info)
2098{
2099 struct trie *t = (struct trie *)tb->tb_data;
2100 struct key_vector *pn = t->kv;
2101 unsigned long cindex = 1;
2102 struct fib_alias *fa;
2103
2104 for (;;) {
2105 struct key_vector *n;
2106
2107 if (!(cindex--)) {
2108 t_key pkey = pn->key;
2109
2110 if (IS_TRIE(pn))
2111 break;
2112
2113 pn = node_parent(pn);
2114 cindex = get_index(pkey, pn);
2115 continue;
2116 }
2117
2118
2119 n = get_child(pn, cindex);
2120 if (!n)
2121 continue;
2122
2123 if (IS_TNODE(n)) {
2124
2125 pn = n;
2126 cindex = 1ul << n->bits;
2127
2128 continue;
2129 }
2130
2131 hlist_for_each_entry(fa, &n->leaf, fa_list) {
2132 struct fib_info *fi = fa->fa_info;
2133
2134 if (!fi || !fi->nh_updated || fa->tb_id != tb->tb_id)
2135 continue;
2136
2137 rtmsg_fib(RTM_NEWROUTE, htonl(n->key), fa,
2138 KEYLENGTH - fa->fa_slen, tb->tb_id,
2139 info, NLM_F_REPLACE);
2140 }
2141 }
2142}
2143
2144void fib_info_notify_update(struct net *net, struct nl_info *info)
2145{
2146 unsigned int h;
2147
2148 for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2149 struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2150 struct fib_table *tb;
2151
2152 hlist_for_each_entry_rcu(tb, head, tb_hlist,
2153 lockdep_rtnl_is_held())
2154 __fib_info_notify_update(net, tb, info);
2155 }
2156}
2157
2158static int fib_leaf_notify(struct key_vector *l, struct fib_table *tb,
2159 struct notifier_block *nb,
2160 struct netlink_ext_ack *extack)
2161{
2162 struct fib_alias *fa;
2163 int last_slen = -1;
2164 int err;
2165
2166 hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
2167 struct fib_info *fi = fa->fa_info;
2168
2169 if (!fi)
2170 continue;
2171
2172
2173
2174
2175 if (tb->tb_id != fa->tb_id)
2176 continue;
2177
2178 if (fa->fa_slen == last_slen)
2179 continue;
2180
2181 last_slen = fa->fa_slen;
2182 err = call_fib_entry_notifier(nb, FIB_EVENT_ENTRY_REPLACE,
2183 l->key, KEYLENGTH - fa->fa_slen,
2184 fa, extack);
2185 if (err)
2186 return err;
2187 }
2188 return 0;
2189}
2190
2191static int fib_table_notify(struct fib_table *tb, struct notifier_block *nb,
2192 struct netlink_ext_ack *extack)
2193{
2194 struct trie *t = (struct trie *)tb->tb_data;
2195 struct key_vector *l, *tp = t->kv;
2196 t_key key = 0;
2197 int err;
2198
2199 while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
2200 err = fib_leaf_notify(l, tb, nb, extack);
2201 if (err)
2202 return err;
2203
2204 key = l->key + 1;
2205
2206 if (key < l->key)
2207 break;
2208 }
2209 return 0;
2210}
2211
2212int fib_notify(struct net *net, struct notifier_block *nb,
2213 struct netlink_ext_ack *extack)
2214{
2215 unsigned int h;
2216 int err;
2217
2218 for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2219 struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2220 struct fib_table *tb;
2221
2222 hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2223 err = fib_table_notify(tb, nb, extack);
2224 if (err)
2225 return err;
2226 }
2227 }
2228 return 0;
2229}
2230
2231static void __trie_free_rcu(struct rcu_head *head)
2232{
2233 struct fib_table *tb = container_of(head, struct fib_table, rcu);
2234#ifdef CONFIG_IP_FIB_TRIE_STATS
2235 struct trie *t = (struct trie *)tb->tb_data;
2236
2237 if (tb->tb_data == tb->__data)
2238 free_percpu(t->stats);
2239#endif
2240 kfree(tb);
2241}
2242
2243void fib_free_table(struct fib_table *tb)
2244{
2245 call_rcu(&tb->rcu, __trie_free_rcu);
2246}
2247
2248static int fn_trie_dump_leaf(struct key_vector *l, struct fib_table *tb,
2249 struct sk_buff *skb, struct netlink_callback *cb,
2250 struct fib_dump_filter *filter)
2251{
2252 unsigned int flags = NLM_F_MULTI;
2253 __be32 xkey = htonl(l->key);
2254 int i, s_i, i_fa, s_fa, err;
2255 struct fib_alias *fa;
2256
2257 if (filter->filter_set ||
2258 !filter->dump_exceptions || !filter->dump_routes)
2259 flags |= NLM_F_DUMP_FILTERED;
2260
2261 s_i = cb->args[4];
2262 s_fa = cb->args[5];
2263 i = 0;
2264
2265
2266 hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
2267 struct fib_info *fi = fa->fa_info;
2268
2269 if (i < s_i)
2270 goto next;
2271
2272 i_fa = 0;
2273
2274 if (tb->tb_id != fa->tb_id)
2275 goto next;
2276
2277 if (filter->filter_set) {
2278 if (filter->rt_type && fa->fa_type != filter->rt_type)
2279 goto next;
2280
2281 if ((filter->protocol &&
2282 fi->fib_protocol != filter->protocol))
2283 goto next;
2284
2285 if (filter->dev &&
2286 !fib_info_nh_uses_dev(fi, filter->dev))
2287 goto next;
2288 }
2289
2290 if (filter->dump_routes) {
2291 if (!s_fa) {
2292 struct fib_rt_info fri;
2293
2294 fri.fi = fi;
2295 fri.tb_id = tb->tb_id;
2296 fri.dst = xkey;
2297 fri.dst_len = KEYLENGTH - fa->fa_slen;
2298 fri.tos = fa->fa_tos;
2299 fri.type = fa->fa_type;
2300 fri.offload = fa->offload;
2301 fri.trap = fa->trap;
2302 fri.offload_failed = fa->offload_failed;
2303 err = fib_dump_info(skb,
2304 NETLINK_CB(cb->skb).portid,
2305 cb->nlh->nlmsg_seq,
2306 RTM_NEWROUTE, &fri, flags);
2307 if (err < 0)
2308 goto stop;
2309 }
2310
2311 i_fa++;
2312 }
2313
2314 if (filter->dump_exceptions) {
2315 err = fib_dump_info_fnhe(skb, cb, tb->tb_id, fi,
2316 &i_fa, s_fa, flags);
2317 if (err < 0)
2318 goto stop;
2319 }
2320
2321next:
2322 i++;
2323 }
2324
2325 cb->args[4] = i;
2326 return skb->len;
2327
2328stop:
2329 cb->args[4] = i;
2330 cb->args[5] = i_fa;
2331 return err;
2332}
2333
2334
2335int fib_table_dump(struct fib_table *tb, struct sk_buff *skb,
2336 struct netlink_callback *cb, struct fib_dump_filter *filter)
2337{
2338 struct trie *t = (struct trie *)tb->tb_data;
2339 struct key_vector *l, *tp = t->kv;
2340
2341
2342
2343 int count = cb->args[2];
2344 t_key key = cb->args[3];
2345
2346
2347
2348
2349 if (count && !key)
2350 return skb->len;
2351
2352 while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
2353 int err;
2354
2355 err = fn_trie_dump_leaf(l, tb, skb, cb, filter);
2356 if (err < 0) {
2357 cb->args[3] = key;
2358 cb->args[2] = count;
2359 return err;
2360 }
2361
2362 ++count;
2363 key = l->key + 1;
2364
2365 memset(&cb->args[4], 0,
2366 sizeof(cb->args) - 4*sizeof(cb->args[0]));
2367
2368
2369 if (key < l->key)
2370 break;
2371 }
2372
2373 cb->args[3] = key;
2374 cb->args[2] = count;
2375
2376 return skb->len;
2377}
2378
2379void __init fib_trie_init(void)
2380{
2381 fn_alias_kmem = kmem_cache_create("ip_fib_alias",
2382 sizeof(struct fib_alias),
2383 0, SLAB_PANIC, NULL);
2384
2385 trie_leaf_kmem = kmem_cache_create("ip_fib_trie",
2386 LEAF_SIZE,
2387 0, SLAB_PANIC, NULL);
2388}
2389
2390struct fib_table *fib_trie_table(u32 id, struct fib_table *alias)
2391{
2392 struct fib_table *tb;
2393 struct trie *t;
2394 size_t sz = sizeof(*tb);
2395
2396 if (!alias)
2397 sz += sizeof(struct trie);
2398
2399 tb = kzalloc(sz, GFP_KERNEL);
2400 if (!tb)
2401 return NULL;
2402
2403 tb->tb_id = id;
2404 tb->tb_num_default = 0;
2405 tb->tb_data = (alias ? alias->__data : tb->__data);
2406
2407 if (alias)
2408 return tb;
2409
2410 t = (struct trie *) tb->tb_data;
2411 t->kv[0].pos = KEYLENGTH;
2412 t->kv[0].slen = KEYLENGTH;
2413#ifdef CONFIG_IP_FIB_TRIE_STATS
2414 t->stats = alloc_percpu(struct trie_use_stats);
2415 if (!t->stats) {
2416 kfree(tb);
2417 tb = NULL;
2418 }
2419#endif
2420
2421 return tb;
2422}
2423
2424#ifdef CONFIG_PROC_FS
2425
2426struct fib_trie_iter {
2427 struct seq_net_private p;
2428 struct fib_table *tb;
2429 struct key_vector *tnode;
2430 unsigned int index;
2431 unsigned int depth;
2432};
2433
2434static struct key_vector *fib_trie_get_next(struct fib_trie_iter *iter)
2435{
2436 unsigned long cindex = iter->index;
2437 struct key_vector *pn = iter->tnode;
2438 t_key pkey;
2439
2440 pr_debug("get_next iter={node=%p index=%d depth=%d}\n",
2441 iter->tnode, iter->index, iter->depth);
2442
2443 while (!IS_TRIE(pn)) {
2444 while (cindex < child_length(pn)) {
2445 struct key_vector *n = get_child_rcu(pn, cindex++);
2446
2447 if (!n)
2448 continue;
2449
2450 if (IS_LEAF(n)) {
2451 iter->tnode = pn;
2452 iter->index = cindex;
2453 } else {
2454
2455 iter->tnode = n;
2456 iter->index = 0;
2457 ++iter->depth;
2458 }
2459
2460 return n;
2461 }
2462
2463
2464 pkey = pn->key;
2465 pn = node_parent_rcu(pn);
2466 cindex = get_index(pkey, pn) + 1;
2467 --iter->depth;
2468 }
2469
2470
2471 iter->tnode = pn;
2472 iter->index = 0;
2473
2474 return NULL;
2475}
2476
2477static struct key_vector *fib_trie_get_first(struct fib_trie_iter *iter,
2478 struct trie *t)
2479{
2480 struct key_vector *n, *pn;
2481
2482 if (!t)
2483 return NULL;
2484
2485 pn = t->kv;
2486 n = rcu_dereference(pn->tnode[0]);
2487 if (!n)
2488 return NULL;
2489
2490 if (IS_TNODE(n)) {
2491 iter->tnode = n;
2492 iter->index = 0;
2493 iter->depth = 1;
2494 } else {
2495 iter->tnode = pn;
2496 iter->index = 0;
2497 iter->depth = 0;
2498 }
2499
2500 return n;
2501}
2502
2503static void trie_collect_stats(struct trie *t, struct trie_stat *s)
2504{
2505 struct key_vector *n;
2506 struct fib_trie_iter iter;
2507
2508 memset(s, 0, sizeof(*s));
2509
2510 rcu_read_lock();
2511 for (n = fib_trie_get_first(&iter, t); n; n = fib_trie_get_next(&iter)) {
2512 if (IS_LEAF(n)) {
2513 struct fib_alias *fa;
2514
2515 s->leaves++;
2516 s->totdepth += iter.depth;
2517 if (iter.depth > s->maxdepth)
2518 s->maxdepth = iter.depth;
2519
2520 hlist_for_each_entry_rcu(fa, &n->leaf, fa_list)
2521 ++s->prefixes;
2522 } else {
2523 s->tnodes++;
2524 if (n->bits < MAX_STAT_DEPTH)
2525 s->nodesizes[n->bits]++;
2526 s->nullpointers += tn_info(n)->empty_children;
2527 }
2528 }
2529 rcu_read_unlock();
2530}
2531
2532
2533
2534
2535static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat)
2536{
2537 unsigned int i, max, pointers, bytes, avdepth;
2538
2539 if (stat->leaves)
2540 avdepth = stat->totdepth*100 / stat->leaves;
2541 else
2542 avdepth = 0;
2543
2544 seq_printf(seq, "\tAver depth: %u.%02d\n",
2545 avdepth / 100, avdepth % 100);
2546 seq_printf(seq, "\tMax depth: %u\n", stat->maxdepth);
2547
2548 seq_printf(seq, "\tLeaves: %u\n", stat->leaves);
2549 bytes = LEAF_SIZE * stat->leaves;
2550
2551 seq_printf(seq, "\tPrefixes: %u\n", stat->prefixes);
2552 bytes += sizeof(struct fib_alias) * stat->prefixes;
2553
2554 seq_printf(seq, "\tInternal nodes: %u\n\t", stat->tnodes);
2555 bytes += TNODE_SIZE(0) * stat->tnodes;
2556
2557 max = MAX_STAT_DEPTH;
2558 while (max > 0 && stat->nodesizes[max-1] == 0)
2559 max--;
2560
2561 pointers = 0;
2562 for (i = 1; i < max; i++)
2563 if (stat->nodesizes[i] != 0) {
2564 seq_printf(seq, " %u: %u", i, stat->nodesizes[i]);
2565 pointers += (1<<i) * stat->nodesizes[i];
2566 }
2567 seq_putc(seq, '\n');
2568 seq_printf(seq, "\tPointers: %u\n", pointers);
2569
2570 bytes += sizeof(struct key_vector *) * pointers;
2571 seq_printf(seq, "Null ptrs: %u\n", stat->nullpointers);
2572 seq_printf(seq, "Total size: %u kB\n", (bytes + 1023) / 1024);
2573}
2574
2575#ifdef CONFIG_IP_FIB_TRIE_STATS
2576static void trie_show_usage(struct seq_file *seq,
2577 const struct trie_use_stats __percpu *stats)
2578{
2579 struct trie_use_stats s = { 0 };
2580 int cpu;
2581
2582
2583 for_each_possible_cpu(cpu) {
2584 const struct trie_use_stats *pcpu = per_cpu_ptr(stats, cpu);
2585
2586 s.gets += pcpu->gets;
2587 s.backtrack += pcpu->backtrack;
2588 s.semantic_match_passed += pcpu->semantic_match_passed;
2589 s.semantic_match_miss += pcpu->semantic_match_miss;
2590 s.null_node_hit += pcpu->null_node_hit;
2591 s.resize_node_skipped += pcpu->resize_node_skipped;
2592 }
2593
2594 seq_printf(seq, "\nCounters:\n---------\n");
2595 seq_printf(seq, "gets = %u\n", s.gets);
2596 seq_printf(seq, "backtracks = %u\n", s.backtrack);
2597 seq_printf(seq, "semantic match passed = %u\n",
2598 s.semantic_match_passed);
2599 seq_printf(seq, "semantic match miss = %u\n", s.semantic_match_miss);
2600 seq_printf(seq, "null node hit= %u\n", s.null_node_hit);
2601 seq_printf(seq, "skipped node resize = %u\n\n", s.resize_node_skipped);
2602}
2603#endif
2604
2605static void fib_table_print(struct seq_file *seq, struct fib_table *tb)
2606{
2607 if (tb->tb_id == RT_TABLE_LOCAL)
2608 seq_puts(seq, "Local:\n");
2609 else if (tb->tb_id == RT_TABLE_MAIN)
2610 seq_puts(seq, "Main:\n");
2611 else
2612 seq_printf(seq, "Id %d:\n", tb->tb_id);
2613}
2614
2615
2616static int fib_triestat_seq_show(struct seq_file *seq, void *v)
2617{
2618 struct net *net = (struct net *)seq->private;
2619 unsigned int h;
2620
2621 seq_printf(seq,
2622 "Basic info: size of leaf:"
2623 " %zd bytes, size of tnode: %zd bytes.\n",
2624 LEAF_SIZE, TNODE_SIZE(0));
2625
2626 rcu_read_lock();
2627 for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2628 struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2629 struct fib_table *tb;
2630
2631 hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2632 struct trie *t = (struct trie *) tb->tb_data;
2633 struct trie_stat stat;
2634
2635 if (!t)
2636 continue;
2637
2638 fib_table_print(seq, tb);
2639
2640 trie_collect_stats(t, &stat);
2641 trie_show_stats(seq, &stat);
2642#ifdef CONFIG_IP_FIB_TRIE_STATS
2643 trie_show_usage(seq, t->stats);
2644#endif
2645 }
2646 cond_resched_rcu();
2647 }
2648 rcu_read_unlock();
2649
2650 return 0;
2651}
2652
2653static struct key_vector *fib_trie_get_idx(struct seq_file *seq, loff_t pos)
2654{
2655 struct fib_trie_iter *iter = seq->private;
2656 struct net *net = seq_file_net(seq);
2657 loff_t idx = 0;
2658 unsigned int h;
2659
2660 for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2661 struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2662 struct fib_table *tb;
2663
2664 hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2665 struct key_vector *n;
2666
2667 for (n = fib_trie_get_first(iter,
2668 (struct trie *) tb->tb_data);
2669 n; n = fib_trie_get_next(iter))
2670 if (pos == idx++) {
2671 iter->tb = tb;
2672 return n;
2673 }
2674 }
2675 }
2676
2677 return NULL;
2678}
2679
2680static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos)
2681 __acquires(RCU)
2682{
2683 rcu_read_lock();
2684 return fib_trie_get_idx(seq, *pos);
2685}
2686
2687static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2688{
2689 struct fib_trie_iter *iter = seq->private;
2690 struct net *net = seq_file_net(seq);
2691 struct fib_table *tb = iter->tb;
2692 struct hlist_node *tb_node;
2693 unsigned int h;
2694 struct key_vector *n;
2695
2696 ++*pos;
2697
2698 n = fib_trie_get_next(iter);
2699 if (n)
2700 return n;
2701
2702
2703 h = tb->tb_id & (FIB_TABLE_HASHSZ - 1);
2704 while ((tb_node = rcu_dereference(hlist_next_rcu(&tb->tb_hlist)))) {
2705 tb = hlist_entry(tb_node, struct fib_table, tb_hlist);
2706 n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
2707 if (n)
2708 goto found;
2709 }
2710
2711
2712 while (++h < FIB_TABLE_HASHSZ) {
2713 struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2714 hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2715 n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
2716 if (n)
2717 goto found;
2718 }
2719 }
2720 return NULL;
2721
2722found:
2723 iter->tb = tb;
2724 return n;
2725}
2726
2727static void fib_trie_seq_stop(struct seq_file *seq, void *v)
2728 __releases(RCU)
2729{
2730 rcu_read_unlock();
2731}
2732
2733static void seq_indent(struct seq_file *seq, int n)
2734{
2735 while (n-- > 0)
2736 seq_puts(seq, " ");
2737}
2738
2739static inline const char *rtn_scope(char *buf, size_t len, enum rt_scope_t s)
2740{
2741 switch (s) {
2742 case RT_SCOPE_UNIVERSE: return "universe";
2743 case RT_SCOPE_SITE: return "site";
2744 case RT_SCOPE_LINK: return "link";
2745 case RT_SCOPE_HOST: return "host";
2746 case RT_SCOPE_NOWHERE: return "nowhere";
2747 default:
2748 snprintf(buf, len, "scope=%d", s);
2749 return buf;
2750 }
2751}
2752
2753static const char *const rtn_type_names[__RTN_MAX] = {
2754 [RTN_UNSPEC] = "UNSPEC",
2755 [RTN_UNICAST] = "UNICAST",
2756 [RTN_LOCAL] = "LOCAL",
2757 [RTN_BROADCAST] = "BROADCAST",
2758 [RTN_ANYCAST] = "ANYCAST",
2759 [RTN_MULTICAST] = "MULTICAST",
2760 [RTN_BLACKHOLE] = "BLACKHOLE",
2761 [RTN_UNREACHABLE] = "UNREACHABLE",
2762 [RTN_PROHIBIT] = "PROHIBIT",
2763 [RTN_THROW] = "THROW",
2764 [RTN_NAT] = "NAT",
2765 [RTN_XRESOLVE] = "XRESOLVE",
2766};
2767
2768static inline const char *rtn_type(char *buf, size_t len, unsigned int t)
2769{
2770 if (t < __RTN_MAX && rtn_type_names[t])
2771 return rtn_type_names[t];
2772 snprintf(buf, len, "type %u", t);
2773 return buf;
2774}
2775
2776
2777static int fib_trie_seq_show(struct seq_file *seq, void *v)
2778{
2779 const struct fib_trie_iter *iter = seq->private;
2780 struct key_vector *n = v;
2781
2782 if (IS_TRIE(node_parent_rcu(n)))
2783 fib_table_print(seq, iter->tb);
2784
2785 if (IS_TNODE(n)) {
2786 __be32 prf = htonl(n->key);
2787
2788 seq_indent(seq, iter->depth-1);
2789 seq_printf(seq, " +-- %pI4/%zu %u %u %u\n",
2790 &prf, KEYLENGTH - n->pos - n->bits, n->bits,
2791 tn_info(n)->full_children,
2792 tn_info(n)->empty_children);
2793 } else {
2794 __be32 val = htonl(n->key);
2795 struct fib_alias *fa;
2796
2797 seq_indent(seq, iter->depth);
2798 seq_printf(seq, " |-- %pI4\n", &val);
2799
2800 hlist_for_each_entry_rcu(fa, &n->leaf, fa_list) {
2801 char buf1[32], buf2[32];
2802
2803 seq_indent(seq, iter->depth + 1);
2804 seq_printf(seq, " /%zu %s %s",
2805 KEYLENGTH - fa->fa_slen,
2806 rtn_scope(buf1, sizeof(buf1),
2807 fa->fa_info->fib_scope),
2808 rtn_type(buf2, sizeof(buf2),
2809 fa->fa_type));
2810 if (fa->fa_tos)
2811 seq_printf(seq, " tos=%d", fa->fa_tos);
2812 seq_putc(seq, '\n');
2813 }
2814 }
2815
2816 return 0;
2817}
2818
2819static const struct seq_operations fib_trie_seq_ops = {
2820 .start = fib_trie_seq_start,
2821 .next = fib_trie_seq_next,
2822 .stop = fib_trie_seq_stop,
2823 .show = fib_trie_seq_show,
2824};
2825
2826struct fib_route_iter {
2827 struct seq_net_private p;
2828 struct fib_table *main_tb;
2829 struct key_vector *tnode;
2830 loff_t pos;
2831 t_key key;
2832};
2833
2834static struct key_vector *fib_route_get_idx(struct fib_route_iter *iter,
2835 loff_t pos)
2836{
2837 struct key_vector *l, **tp = &iter->tnode;
2838 t_key key;
2839
2840
2841 if (iter->pos > 0 && pos >= iter->pos) {
2842 key = iter->key;
2843 } else {
2844 iter->pos = 1;
2845 key = 0;
2846 }
2847
2848 pos -= iter->pos;
2849
2850 while ((l = leaf_walk_rcu(tp, key)) && (pos-- > 0)) {
2851 key = l->key + 1;
2852 iter->pos++;
2853 l = NULL;
2854
2855
2856 if (!key)
2857 break;
2858 }
2859
2860 if (l)
2861 iter->key = l->key;
2862 else
2863 iter->pos = 0;
2864
2865 return l;
2866}
2867
2868static void *fib_route_seq_start(struct seq_file *seq, loff_t *pos)
2869 __acquires(RCU)
2870{
2871 struct fib_route_iter *iter = seq->private;
2872 struct fib_table *tb;
2873 struct trie *t;
2874
2875 rcu_read_lock();
2876
2877 tb = fib_get_table(seq_file_net(seq), RT_TABLE_MAIN);
2878 if (!tb)
2879 return NULL;
2880
2881 iter->main_tb = tb;
2882 t = (struct trie *)tb->tb_data;
2883 iter->tnode = t->kv;
2884
2885 if (*pos != 0)
2886 return fib_route_get_idx(iter, *pos);
2887
2888 iter->pos = 0;
2889 iter->key = KEY_MAX;
2890
2891 return SEQ_START_TOKEN;
2892}
2893
2894static void *fib_route_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2895{
2896 struct fib_route_iter *iter = seq->private;
2897 struct key_vector *l = NULL;
2898 t_key key = iter->key + 1;
2899
2900 ++*pos;
2901
2902
2903 if ((v == SEQ_START_TOKEN) || key)
2904 l = leaf_walk_rcu(&iter->tnode, key);
2905
2906 if (l) {
2907 iter->key = l->key;
2908 iter->pos++;
2909 } else {
2910 iter->pos = 0;
2911 }
2912
2913 return l;
2914}
2915
2916static void fib_route_seq_stop(struct seq_file *seq, void *v)
2917 __releases(RCU)
2918{
2919 rcu_read_unlock();
2920}
2921
2922static unsigned int fib_flag_trans(int type, __be32 mask, struct fib_info *fi)
2923{
2924 unsigned int flags = 0;
2925
2926 if (type == RTN_UNREACHABLE || type == RTN_PROHIBIT)
2927 flags = RTF_REJECT;
2928 if (fi) {
2929 const struct fib_nh_common *nhc = fib_info_nhc(fi, 0);
2930
2931 if (nhc->nhc_gw.ipv4)
2932 flags |= RTF_GATEWAY;
2933 }
2934 if (mask == htonl(0xFFFFFFFF))
2935 flags |= RTF_HOST;
2936 flags |= RTF_UP;
2937 return flags;
2938}
2939
2940
2941
2942
2943
2944
2945
2946static int fib_route_seq_show(struct seq_file *seq, void *v)
2947{
2948 struct fib_route_iter *iter = seq->private;
2949 struct fib_table *tb = iter->main_tb;
2950 struct fib_alias *fa;
2951 struct key_vector *l = v;
2952 __be32 prefix;
2953
2954 if (v == SEQ_START_TOKEN) {
2955 seq_printf(seq, "%-127s\n", "Iface\tDestination\tGateway "
2956 "\tFlags\tRefCnt\tUse\tMetric\tMask\t\tMTU"
2957 "\tWindow\tIRTT");
2958 return 0;
2959 }
2960
2961 prefix = htonl(l->key);
2962
2963 hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
2964 struct fib_info *fi = fa->fa_info;
2965 __be32 mask = inet_make_mask(KEYLENGTH - fa->fa_slen);
2966 unsigned int flags = fib_flag_trans(fa->fa_type, mask, fi);
2967
2968 if ((fa->fa_type == RTN_BROADCAST) ||
2969 (fa->fa_type == RTN_MULTICAST))
2970 continue;
2971
2972 if (fa->tb_id != tb->tb_id)
2973 continue;
2974
2975 seq_setwidth(seq, 127);
2976
2977 if (fi) {
2978 struct fib_nh_common *nhc = fib_info_nhc(fi, 0);
2979 __be32 gw = 0;
2980
2981 if (nhc->nhc_gw_family == AF_INET)
2982 gw = nhc->nhc_gw.ipv4;
2983
2984 seq_printf(seq,
2985 "%s\t%08X\t%08X\t%04X\t%d\t%u\t"
2986 "%d\t%08X\t%d\t%u\t%u",
2987 nhc->nhc_dev ? nhc->nhc_dev->name : "*",
2988 prefix, gw, flags, 0, 0,
2989 fi->fib_priority,
2990 mask,
2991 (fi->fib_advmss ?
2992 fi->fib_advmss + 40 : 0),
2993 fi->fib_window,
2994 fi->fib_rtt >> 3);
2995 } else {
2996 seq_printf(seq,
2997 "*\t%08X\t%08X\t%04X\t%d\t%u\t"
2998 "%d\t%08X\t%d\t%u\t%u",
2999 prefix, 0, flags, 0, 0, 0,
3000 mask, 0, 0, 0);
3001 }
3002 seq_pad(seq, '\n');
3003 }
3004
3005 return 0;
3006}
3007
3008static const struct seq_operations fib_route_seq_ops = {
3009 .start = fib_route_seq_start,
3010 .next = fib_route_seq_next,
3011 .stop = fib_route_seq_stop,
3012 .show = fib_route_seq_show,
3013};
3014
3015int __net_init fib_proc_init(struct net *net)
3016{
3017 if (!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops,
3018 sizeof(struct fib_trie_iter)))
3019 goto out1;
3020
3021 if (!proc_create_net_single("fib_triestat", 0444, net->proc_net,
3022 fib_triestat_seq_show, NULL))
3023 goto out2;
3024
3025 if (!proc_create_net("route", 0444, net->proc_net, &fib_route_seq_ops,
3026 sizeof(struct fib_route_iter)))
3027 goto out3;
3028
3029 return 0;
3030
3031out3:
3032 remove_proc_entry("fib_triestat", net->proc_net);
3033out2:
3034 remove_proc_entry("fib_trie", net->proc_net);
3035out1:
3036 return -ENOMEM;
3037}
3038
3039void __net_exit fib_proc_exit(struct net *net)
3040{
3041 remove_proc_entry("fib_trie", net->proc_net);
3042 remove_proc_entry("fib_triestat", net->proc_net);
3043 remove_proc_entry("route", net->proc_net);
3044}
3045
3046#endif
3047