2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
6 * IPv4 Forwarding Information Base: FIB frontend.
8 * Version: $Id: fib_frontend.c,v 1.26 2001/10/31 21:55:54 davem Exp $
10 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version
15 * 2 of the License, or (at your option) any later version.
18 #include <linux/module.h>
19 #include <asm/uaccess.h>
20 #include <asm/system.h>
21 #include <linux/bitops.h>
22 #include <linux/capability.h>
23 #include <linux/types.h>
24 #include <linux/kernel.h>
26 #include <linux/string.h>
27 #include <linux/socket.h>
28 #include <linux/sockios.h>
29 #include <linux/errno.h>
31 #include <linux/inet.h>
32 #include <linux/inetdevice.h>
33 #include <linux/netdevice.h>
34 #include <linux/if_addr.h>
35 #include <linux/if_arp.h>
36 #include <linux/skbuff.h>
37 #include <linux/init.h>
38 #include <linux/list.h>
41 #include <net/protocol.h>
42 #include <net/route.h>
47 #include <net/ip_fib.h>
48 #include <net/rtnetlink.h>
50 #define FFprint(a...) printk(KERN_DEBUG a)
52 static struct sock
*fibnl
;
54 #ifndef CONFIG_IP_MULTIPLE_TABLES
56 struct fib_table
*ip_fib_local_table
;
57 struct fib_table
*ip_fib_main_table
;
59 #define FIB_TABLE_HASHSZ 1
60 static struct hlist_head fib_table_hash
[FIB_TABLE_HASHSZ
];
62 static void __init
fib4_rules_init(void)
64 ip_fib_local_table
= fib_hash_init(RT_TABLE_LOCAL
);
65 hlist_add_head_rcu(&ip_fib_local_table
->tb_hlist
, &fib_table_hash
[0]);
66 ip_fib_main_table
= fib_hash_init(RT_TABLE_MAIN
);
67 hlist_add_head_rcu(&ip_fib_main_table
->tb_hlist
, &fib_table_hash
[0]);
71 #define FIB_TABLE_HASHSZ 256
72 static struct hlist_head fib_table_hash
[FIB_TABLE_HASHSZ
];
74 struct fib_table
*fib_new_table(u32 id
)
81 tb
= fib_get_table(id
);
84 tb
= fib_hash_init(id
);
87 h
= id
& (FIB_TABLE_HASHSZ
- 1);
88 hlist_add_head_rcu(&tb
->tb_hlist
, &fib_table_hash
[h
]);
92 struct fib_table
*fib_get_table(u32 id
)
95 struct hlist_node
*node
;
100 h
= id
& (FIB_TABLE_HASHSZ
- 1);
102 hlist_for_each_entry_rcu(tb
, node
, &fib_table_hash
[h
], tb_hlist
) {
103 if (tb
->tb_id
== id
) {
111 #endif /* CONFIG_IP_MULTIPLE_TABLES */
113 static void fib_flush(void)
116 struct fib_table
*tb
;
117 struct hlist_node
*node
;
120 for (h
= 0; h
< FIB_TABLE_HASHSZ
; h
++) {
121 hlist_for_each_entry(tb
, node
, &fib_table_hash
[h
], tb_hlist
)
122 flushed
+= tb
->tb_flush(tb
);
130 * Find the first device with a given source address.
133 struct net_device
* ip_dev_find(__be32 addr
)
135 struct flowi fl
= { .nl_u
= { .ip4_u
= { .daddr
= addr
} } };
136 struct fib_result res
;
137 struct net_device
*dev
= NULL
;
138 struct fib_table
*local_table
;
140 #ifdef CONFIG_IP_MULTIPLE_TABLES
144 local_table
= fib_get_table(RT_TABLE_LOCAL
);
145 if (!local_table
|| local_table
->tb_lookup(local_table
, &fl
, &res
))
147 if (res
.type
!= RTN_LOCAL
)
149 dev
= FIB_RES_DEV(res
);
158 unsigned inet_addr_type(__be32 addr
)
160 struct flowi fl
= { .nl_u
= { .ip4_u
= { .daddr
= addr
} } };
161 struct fib_result res
;
162 unsigned ret
= RTN_BROADCAST
;
163 struct fib_table
*local_table
;
165 if (ZERONET(addr
) || BADCLASS(addr
))
166 return RTN_BROADCAST
;
168 return RTN_MULTICAST
;
170 #ifdef CONFIG_IP_MULTIPLE_TABLES
174 local_table
= fib_get_table(RT_TABLE_LOCAL
);
177 if (!local_table
->tb_lookup(local_table
, &fl
, &res
)) {
185 /* Given (packet source, input interface) and optional (dst, oif, tos):
186 - (main) check, that source is valid i.e. not broadcast or our local
188 - figure out what "logical" interface this packet arrived
189 and calculate "specific destination" address.
190 - check, that packet arrived from expected physical interface.
193 int fib_validate_source(__be32 src
, __be32 dst
, u8 tos
, int oif
,
194 struct net_device
*dev
, __be32
*spec_dst
, u32
*itag
)
196 struct in_device
*in_dev
;
197 struct flowi fl
= { .nl_u
= { .ip4_u
=
202 struct fib_result res
;
208 in_dev
= __in_dev_get_rcu(dev
);
210 no_addr
= in_dev
->ifa_list
== NULL
;
211 rpf
= IN_DEV_RPFILTER(in_dev
);
218 if (fib_lookup(&fl
, &res
))
220 if (res
.type
!= RTN_UNICAST
)
222 *spec_dst
= FIB_RES_PREFSRC(res
);
223 fib_combine_itag(itag
, &res
);
224 #ifdef CONFIG_IP_ROUTE_MULTIPATH
225 if (FIB_RES_DEV(res
) == dev
|| res
.fi
->fib_nhs
> 1)
227 if (FIB_RES_DEV(res
) == dev
)
230 ret
= FIB_RES_NH(res
).nh_scope
>= RT_SCOPE_HOST
;
239 fl
.oif
= dev
->ifindex
;
242 if (fib_lookup(&fl
, &res
) == 0) {
243 if (res
.type
== RTN_UNICAST
) {
244 *spec_dst
= FIB_RES_PREFSRC(res
);
245 ret
= FIB_RES_NH(res
).nh_scope
>= RT_SCOPE_HOST
;
254 *spec_dst
= inet_select_addr(dev
, 0, RT_SCOPE_UNIVERSE
);
264 static inline __be32
sk_extract_addr(struct sockaddr
*addr
)
266 return ((struct sockaddr_in
*) addr
)->sin_addr
.s_addr
;
269 static int put_rtax(struct nlattr
*mx
, int len
, int type
, u32 value
)
273 nla
= (struct nlattr
*) ((char *) mx
+ len
);
274 nla
->nla_type
= type
;
275 nla
->nla_len
= nla_attr_size(4);
276 *(u32
*) nla_data(nla
) = value
;
278 return len
+ nla_total_size(4);
281 static int rtentry_to_fib_config(int cmd
, struct rtentry
*rt
,
282 struct fib_config
*cfg
)
287 memset(cfg
, 0, sizeof(*cfg
));
289 if (rt
->rt_dst
.sa_family
!= AF_INET
)
290 return -EAFNOSUPPORT
;
293 * Check mask for validity:
294 * a) it must be contiguous.
295 * b) destination must have all host bits clear.
296 * c) if application forgot to set correct family (AF_INET),
297 * reject request unless it is absolutely clear i.e.
298 * both family and mask are zero.
301 addr
= sk_extract_addr(&rt
->rt_dst
);
302 if (!(rt
->rt_flags
& RTF_HOST
)) {
303 __be32 mask
= sk_extract_addr(&rt
->rt_genmask
);
305 if (rt
->rt_genmask
.sa_family
!= AF_INET
) {
306 if (mask
|| rt
->rt_genmask
.sa_family
)
307 return -EAFNOSUPPORT
;
310 if (bad_mask(mask
, addr
))
313 plen
= inet_mask_len(mask
);
316 cfg
->fc_dst_len
= plen
;
319 if (cmd
!= SIOCDELRT
) {
320 cfg
->fc_nlflags
= NLM_F_CREATE
;
321 cfg
->fc_protocol
= RTPROT_BOOT
;
325 cfg
->fc_priority
= rt
->rt_metric
- 1;
327 if (rt
->rt_flags
& RTF_REJECT
) {
328 cfg
->fc_scope
= RT_SCOPE_HOST
;
329 cfg
->fc_type
= RTN_UNREACHABLE
;
333 cfg
->fc_scope
= RT_SCOPE_NOWHERE
;
334 cfg
->fc_type
= RTN_UNICAST
;
338 struct net_device
*dev
;
339 char devname
[IFNAMSIZ
];
341 if (copy_from_user(devname
, rt
->rt_dev
, IFNAMSIZ
-1))
344 devname
[IFNAMSIZ
-1] = 0;
345 colon
= strchr(devname
, ':');
348 dev
= __dev_get_by_name(&init_net
, devname
);
351 cfg
->fc_oif
= dev
->ifindex
;
353 struct in_ifaddr
*ifa
;
354 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
358 for (ifa
= in_dev
->ifa_list
; ifa
; ifa
= ifa
->ifa_next
)
359 if (strcmp(ifa
->ifa_label
, devname
) == 0)
363 cfg
->fc_prefsrc
= ifa
->ifa_local
;
367 addr
= sk_extract_addr(&rt
->rt_gateway
);
368 if (rt
->rt_gateway
.sa_family
== AF_INET
&& addr
) {
370 if (rt
->rt_flags
& RTF_GATEWAY
&&
371 inet_addr_type(addr
) == RTN_UNICAST
)
372 cfg
->fc_scope
= RT_SCOPE_UNIVERSE
;
375 if (cmd
== SIOCDELRT
)
378 if (rt
->rt_flags
& RTF_GATEWAY
&& !cfg
->fc_gw
)
381 if (cfg
->fc_scope
== RT_SCOPE_NOWHERE
)
382 cfg
->fc_scope
= RT_SCOPE_LINK
;
384 if (rt
->rt_flags
& (RTF_MTU
| RTF_WINDOW
| RTF_IRTT
)) {
388 mx
= kzalloc(3 * nla_total_size(4), GFP_KERNEL
);
392 if (rt
->rt_flags
& RTF_MTU
)
393 len
= put_rtax(mx
, len
, RTAX_ADVMSS
, rt
->rt_mtu
- 40);
395 if (rt
->rt_flags
& RTF_WINDOW
)
396 len
= put_rtax(mx
, len
, RTAX_WINDOW
, rt
->rt_window
);
398 if (rt
->rt_flags
& RTF_IRTT
)
399 len
= put_rtax(mx
, len
, RTAX_RTT
, rt
->rt_irtt
<< 3);
402 cfg
->fc_mx_len
= len
;
409 * Handle IP routing ioctl calls. These are used to manipulate the routing tables
412 int ip_rt_ioctl(unsigned int cmd
, void __user
*arg
)
414 struct fib_config cfg
;
419 case SIOCADDRT
: /* Add a route */
420 case SIOCDELRT
: /* Delete a route */
421 if (!capable(CAP_NET_ADMIN
))
424 if (copy_from_user(&rt
, arg
, sizeof(rt
)))
428 err
= rtentry_to_fib_config(cmd
, &rt
, &cfg
);
430 struct fib_table
*tb
;
432 if (cmd
== SIOCDELRT
) {
433 tb
= fib_get_table(cfg
.fc_table
);
435 err
= tb
->tb_delete(tb
, &cfg
);
439 tb
= fib_new_table(cfg
.fc_table
);
441 err
= tb
->tb_insert(tb
, &cfg
);
446 /* allocated by rtentry_to_fib_config() */
455 const struct nla_policy rtm_ipv4_policy
[RTA_MAX
+1] = {
456 [RTA_DST
] = { .type
= NLA_U32
},
457 [RTA_SRC
] = { .type
= NLA_U32
},
458 [RTA_IIF
] = { .type
= NLA_U32
},
459 [RTA_OIF
] = { .type
= NLA_U32
},
460 [RTA_GATEWAY
] = { .type
= NLA_U32
},
461 [RTA_PRIORITY
] = { .type
= NLA_U32
},
462 [RTA_PREFSRC
] = { .type
= NLA_U32
},
463 [RTA_METRICS
] = { .type
= NLA_NESTED
},
464 [RTA_MULTIPATH
] = { .len
= sizeof(struct rtnexthop
) },
465 [RTA_PROTOINFO
] = { .type
= NLA_U32
},
466 [RTA_FLOW
] = { .type
= NLA_U32
},
469 static int rtm_to_fib_config(struct sk_buff
*skb
, struct nlmsghdr
*nlh
,
470 struct fib_config
*cfg
)
476 err
= nlmsg_validate(nlh
, sizeof(*rtm
), RTA_MAX
, rtm_ipv4_policy
);
480 memset(cfg
, 0, sizeof(*cfg
));
482 rtm
= nlmsg_data(nlh
);
483 cfg
->fc_dst_len
= rtm
->rtm_dst_len
;
484 cfg
->fc_tos
= rtm
->rtm_tos
;
485 cfg
->fc_table
= rtm
->rtm_table
;
486 cfg
->fc_protocol
= rtm
->rtm_protocol
;
487 cfg
->fc_scope
= rtm
->rtm_scope
;
488 cfg
->fc_type
= rtm
->rtm_type
;
489 cfg
->fc_flags
= rtm
->rtm_flags
;
490 cfg
->fc_nlflags
= nlh
->nlmsg_flags
;
492 cfg
->fc_nlinfo
.pid
= NETLINK_CB(skb
).pid
;
493 cfg
->fc_nlinfo
.nlh
= nlh
;
495 if (cfg
->fc_type
> RTN_MAX
) {
500 nlmsg_for_each_attr(attr
, nlh
, sizeof(struct rtmsg
), remaining
) {
501 switch (nla_type(attr
)) {
503 cfg
->fc_dst
= nla_get_be32(attr
);
506 cfg
->fc_oif
= nla_get_u32(attr
);
509 cfg
->fc_gw
= nla_get_be32(attr
);
512 cfg
->fc_priority
= nla_get_u32(attr
);
515 cfg
->fc_prefsrc
= nla_get_be32(attr
);
518 cfg
->fc_mx
= nla_data(attr
);
519 cfg
->fc_mx_len
= nla_len(attr
);
522 cfg
->fc_mp
= nla_data(attr
);
523 cfg
->fc_mp_len
= nla_len(attr
);
526 cfg
->fc_flow
= nla_get_u32(attr
);
529 cfg
->fc_table
= nla_get_u32(attr
);
539 static int inet_rtm_delroute(struct sk_buff
*skb
, struct nlmsghdr
* nlh
, void *arg
)
541 struct net
*net
= skb
->sk
->sk_net
;
542 struct fib_config cfg
;
543 struct fib_table
*tb
;
546 if (net
!= &init_net
)
549 err
= rtm_to_fib_config(skb
, nlh
, &cfg
);
553 tb
= fib_get_table(cfg
.fc_table
);
559 err
= tb
->tb_delete(tb
, &cfg
);
564 static int inet_rtm_newroute(struct sk_buff
*skb
, struct nlmsghdr
* nlh
, void *arg
)
566 struct net
*net
= skb
->sk
->sk_net
;
567 struct fib_config cfg
;
568 struct fib_table
*tb
;
571 if (net
!= &init_net
)
574 err
= rtm_to_fib_config(skb
, nlh
, &cfg
);
578 tb
= fib_new_table(cfg
.fc_table
);
584 err
= tb
->tb_insert(tb
, &cfg
);
589 static int inet_dump_fib(struct sk_buff
*skb
, struct netlink_callback
*cb
)
591 struct net
*net
= skb
->sk
->sk_net
;
593 unsigned int e
= 0, s_e
;
594 struct fib_table
*tb
;
595 struct hlist_node
*node
;
598 if (net
!= &init_net
)
601 if (nlmsg_len(cb
->nlh
) >= sizeof(struct rtmsg
) &&
602 ((struct rtmsg
*) nlmsg_data(cb
->nlh
))->rtm_flags
& RTM_F_CLONED
)
603 return ip_rt_dump(skb
, cb
);
608 for (h
= s_h
; h
< FIB_TABLE_HASHSZ
; h
++, s_e
= 0) {
610 hlist_for_each_entry(tb
, node
, &fib_table_hash
[h
], tb_hlist
) {
614 memset(&cb
->args
[2], 0, sizeof(cb
->args
) -
615 2 * sizeof(cb
->args
[0]));
616 if (tb
->tb_dump(tb
, skb
, cb
) < 0)
630 /* Prepare and feed intra-kernel routing request.
631 Really, it should be netlink message, but :-( netlink
632 can be not configured, so that we feed it directly
633 to fib engine. It is legal, because all events occur
634 only when netlink is already locked.
637 static void fib_magic(int cmd
, int type
, __be32 dst
, int dst_len
, struct in_ifaddr
*ifa
)
639 struct fib_table
*tb
;
640 struct fib_config cfg
= {
641 .fc_protocol
= RTPROT_KERNEL
,
644 .fc_dst_len
= dst_len
,
645 .fc_prefsrc
= ifa
->ifa_local
,
646 .fc_oif
= ifa
->ifa_dev
->dev
->ifindex
,
647 .fc_nlflags
= NLM_F_CREATE
| NLM_F_APPEND
,
650 if (type
== RTN_UNICAST
)
651 tb
= fib_new_table(RT_TABLE_MAIN
);
653 tb
= fib_new_table(RT_TABLE_LOCAL
);
658 cfg
.fc_table
= tb
->tb_id
;
660 if (type
!= RTN_LOCAL
)
661 cfg
.fc_scope
= RT_SCOPE_LINK
;
663 cfg
.fc_scope
= RT_SCOPE_HOST
;
665 if (cmd
== RTM_NEWROUTE
)
666 tb
->tb_insert(tb
, &cfg
);
668 tb
->tb_delete(tb
, &cfg
);
671 void fib_add_ifaddr(struct in_ifaddr
*ifa
)
673 struct in_device
*in_dev
= ifa
->ifa_dev
;
674 struct net_device
*dev
= in_dev
->dev
;
675 struct in_ifaddr
*prim
= ifa
;
676 __be32 mask
= ifa
->ifa_mask
;
677 __be32 addr
= ifa
->ifa_local
;
678 __be32 prefix
= ifa
->ifa_address
&mask
;
680 if (ifa
->ifa_flags
&IFA_F_SECONDARY
) {
681 prim
= inet_ifa_byprefix(in_dev
, prefix
, mask
);
683 printk(KERN_DEBUG
"fib_add_ifaddr: bug: prim == NULL\n");
688 fib_magic(RTM_NEWROUTE
, RTN_LOCAL
, addr
, 32, prim
);
690 if (!(dev
->flags
&IFF_UP
))
693 /* Add broadcast address, if it is explicitly assigned. */
694 if (ifa
->ifa_broadcast
&& ifa
->ifa_broadcast
!= htonl(0xFFFFFFFF))
695 fib_magic(RTM_NEWROUTE
, RTN_BROADCAST
, ifa
->ifa_broadcast
, 32, prim
);
697 if (!ZERONET(prefix
) && !(ifa
->ifa_flags
&IFA_F_SECONDARY
) &&
698 (prefix
!= addr
|| ifa
->ifa_prefixlen
< 32)) {
699 fib_magic(RTM_NEWROUTE
, dev
->flags
&IFF_LOOPBACK
? RTN_LOCAL
:
700 RTN_UNICAST
, prefix
, ifa
->ifa_prefixlen
, prim
);
702 /* Add network specific broadcasts, when it takes a sense */
703 if (ifa
->ifa_prefixlen
< 31) {
704 fib_magic(RTM_NEWROUTE
, RTN_BROADCAST
, prefix
, 32, prim
);
705 fib_magic(RTM_NEWROUTE
, RTN_BROADCAST
, prefix
|~mask
, 32, prim
);
710 static void fib_del_ifaddr(struct in_ifaddr
*ifa
)
712 struct in_device
*in_dev
= ifa
->ifa_dev
;
713 struct net_device
*dev
= in_dev
->dev
;
714 struct in_ifaddr
*ifa1
;
715 struct in_ifaddr
*prim
= ifa
;
716 __be32 brd
= ifa
->ifa_address
|~ifa
->ifa_mask
;
717 __be32 any
= ifa
->ifa_address
&ifa
->ifa_mask
;
724 if (!(ifa
->ifa_flags
&IFA_F_SECONDARY
))
725 fib_magic(RTM_DELROUTE
, dev
->flags
&IFF_LOOPBACK
? RTN_LOCAL
:
726 RTN_UNICAST
, any
, ifa
->ifa_prefixlen
, prim
);
728 prim
= inet_ifa_byprefix(in_dev
, any
, ifa
->ifa_mask
);
730 printk(KERN_DEBUG
"fib_del_ifaddr: bug: prim == NULL\n");
735 /* Deletion is more complicated than add.
736 We should take care of not to delete too much :-)
738 Scan address list to be sure that addresses are really gone.
741 for (ifa1
= in_dev
->ifa_list
; ifa1
; ifa1
= ifa1
->ifa_next
) {
742 if (ifa
->ifa_local
== ifa1
->ifa_local
)
744 if (ifa
->ifa_broadcast
== ifa1
->ifa_broadcast
)
746 if (brd
== ifa1
->ifa_broadcast
)
748 if (any
== ifa1
->ifa_broadcast
)
753 fib_magic(RTM_DELROUTE
, RTN_BROADCAST
, ifa
->ifa_broadcast
, 32, prim
);
755 fib_magic(RTM_DELROUTE
, RTN_BROADCAST
, brd
, 32, prim
);
757 fib_magic(RTM_DELROUTE
, RTN_BROADCAST
, any
, 32, prim
);
758 if (!(ok
&LOCAL_OK
)) {
759 fib_magic(RTM_DELROUTE
, RTN_LOCAL
, ifa
->ifa_local
, 32, prim
);
761 /* Check, that this local address finally disappeared. */
762 if (inet_addr_type(ifa
->ifa_local
) != RTN_LOCAL
) {
763 /* And the last, but not the least thing.
764 We must flush stray FIB entries.
766 First of all, we scan fib_info list searching
767 for stray nexthop entries, then ignite fib_flush.
769 if (fib_sync_down(ifa
->ifa_local
, NULL
, 0))
779 static void nl_fib_lookup(struct fib_result_nl
*frn
, struct fib_table
*tb
)
782 struct fib_result res
;
783 struct flowi fl
= { .mark
= frn
->fl_mark
,
784 .nl_u
= { .ip4_u
= { .daddr
= frn
->fl_addr
,
786 .scope
= frn
->fl_scope
} } };
788 #ifdef CONFIG_IP_MULTIPLE_TABLES
796 frn
->tb_id
= tb
->tb_id
;
797 frn
->err
= tb
->tb_lookup(tb
, &fl
, &res
);
800 frn
->prefixlen
= res
.prefixlen
;
801 frn
->nh_sel
= res
.nh_sel
;
802 frn
->type
= res
.type
;
803 frn
->scope
= res
.scope
;
810 static void nl_fib_input(struct sk_buff
*skb
)
812 struct fib_result_nl
*frn
;
813 struct nlmsghdr
*nlh
;
814 struct fib_table
*tb
;
817 nlh
= nlmsg_hdr(skb
);
818 if (skb
->len
< NLMSG_SPACE(0) || skb
->len
< nlh
->nlmsg_len
||
819 nlh
->nlmsg_len
< NLMSG_LENGTH(sizeof(*frn
)))
822 skb
= skb_clone(skb
, GFP_KERNEL
);
825 nlh
= nlmsg_hdr(skb
);
827 frn
= (struct fib_result_nl
*) NLMSG_DATA(nlh
);
828 tb
= fib_get_table(frn
->tb_id_in
);
830 nl_fib_lookup(frn
, tb
);
832 pid
= NETLINK_CB(skb
).pid
; /* pid of sending process */
833 NETLINK_CB(skb
).pid
= 0; /* from kernel */
834 NETLINK_CB(skb
).dst_group
= 0; /* unicast */
835 netlink_unicast(fibnl
, skb
, pid
, MSG_DONTWAIT
);
838 static void nl_fib_lookup_init(void)
840 fibnl
= netlink_kernel_create(&init_net
, NETLINK_FIB_LOOKUP
, 0,
841 nl_fib_input
, NULL
, THIS_MODULE
);
844 static void fib_disable_ip(struct net_device
*dev
, int force
)
846 if (fib_sync_down(0, dev
, force
))
852 static int fib_inetaddr_event(struct notifier_block
*this, unsigned long event
, void *ptr
)
854 struct in_ifaddr
*ifa
= (struct in_ifaddr
*)ptr
;
859 #ifdef CONFIG_IP_ROUTE_MULTIPATH
860 fib_sync_up(ifa
->ifa_dev
->dev
);
866 if (ifa
->ifa_dev
->ifa_list
== NULL
) {
867 /* Last address was deleted from this interface.
870 fib_disable_ip(ifa
->ifa_dev
->dev
, 1);
879 static int fib_netdev_event(struct notifier_block
*this, unsigned long event
, void *ptr
)
881 struct net_device
*dev
= ptr
;
882 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
884 if (dev
->nd_net
!= &init_net
)
887 if (event
== NETDEV_UNREGISTER
) {
888 fib_disable_ip(dev
, 2);
899 } endfor_ifa(in_dev
);
900 #ifdef CONFIG_IP_ROUTE_MULTIPATH
906 fib_disable_ip(dev
, 0);
908 case NETDEV_CHANGEMTU
:
916 static struct notifier_block fib_inetaddr_notifier
= {
917 .notifier_call
=fib_inetaddr_event
,
920 static struct notifier_block fib_netdev_notifier
= {
921 .notifier_call
=fib_netdev_event
,
924 void __init
ip_fib_init(void)
928 for (i
= 0; i
< FIB_TABLE_HASHSZ
; i
++)
929 INIT_HLIST_HEAD(&fib_table_hash
[i
]);
933 register_netdevice_notifier(&fib_netdev_notifier
);
934 register_inetaddr_notifier(&fib_inetaddr_notifier
);
935 nl_fib_lookup_init();
937 rtnl_register(PF_INET
, RTM_NEWROUTE
, inet_rtm_newroute
, NULL
);
938 rtnl_register(PF_INET
, RTM_DELROUTE
, inet_rtm_delroute
, NULL
);
939 rtnl_register(PF_INET
, RTM_GETROUTE
, NULL
, inet_dump_fib
);
942 EXPORT_SYMBOL(inet_addr_type
);
943 EXPORT_SYMBOL(ip_dev_find
);