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 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version
13 * 2 of the License, or (at your option) any later version.
16 #include <linux/module.h>
17 #include <asm/uaccess.h>
18 #include <asm/system.h>
19 #include <linux/bitops.h>
20 #include <linux/capability.h>
21 #include <linux/types.h>
22 #include <linux/kernel.h>
24 #include <linux/string.h>
25 #include <linux/socket.h>
26 #include <linux/sockios.h>
27 #include <linux/errno.h>
29 #include <linux/inet.h>
30 #include <linux/inetdevice.h>
31 #include <linux/netdevice.h>
32 #include <linux/if_addr.h>
33 #include <linux/if_arp.h>
34 #include <linux/skbuff.h>
35 #include <linux/init.h>
36 #include <linux/list.h>
39 #include <net/protocol.h>
40 #include <net/route.h>
44 #include <net/ip_fib.h>
45 #include <net/rtnetlink.h>
47 #ifndef CONFIG_IP_MULTIPLE_TABLES
49 static int __net_init
fib4_rules_init(struct net
*net
)
51 struct fib_table
*local_table
, *main_table
;
53 local_table
= fib_hash_table(RT_TABLE_LOCAL
);
54 if (local_table
== NULL
)
57 main_table
= fib_hash_table(RT_TABLE_MAIN
);
58 if (main_table
== NULL
)
61 hlist_add_head_rcu(&local_table
->tb_hlist
,
62 &net
->ipv4
.fib_table_hash
[TABLE_LOCAL_INDEX
]);
63 hlist_add_head_rcu(&main_table
->tb_hlist
,
64 &net
->ipv4
.fib_table_hash
[TABLE_MAIN_INDEX
]);
73 struct fib_table
*fib_new_table(struct net
*net
, u32 id
)
80 tb
= fib_get_table(net
, id
);
84 tb
= fib_hash_table(id
);
87 h
= id
& (FIB_TABLE_HASHSZ
- 1);
88 hlist_add_head_rcu(&tb
->tb_hlist
, &net
->ipv4
.fib_table_hash
[h
]);
92 struct fib_table
*fib_get_table(struct net
*net
, u32 id
)
95 struct hlist_node
*node
;
96 struct hlist_head
*head
;
101 h
= id
& (FIB_TABLE_HASHSZ
- 1);
104 head
= &net
->ipv4
.fib_table_hash
[h
];
105 hlist_for_each_entry_rcu(tb
, node
, head
, tb_hlist
) {
106 if (tb
->tb_id
== id
) {
114 #endif /* CONFIG_IP_MULTIPLE_TABLES */
116 void fib_select_default(struct net
*net
,
117 const struct flowi
*flp
, struct fib_result
*res
)
119 struct fib_table
*tb
;
120 int table
= RT_TABLE_MAIN
;
121 #ifdef CONFIG_IP_MULTIPLE_TABLES
122 if (res
->r
== NULL
|| res
->r
->action
!= FR_ACT_TO_TBL
)
124 table
= res
->r
->table
;
126 tb
= fib_get_table(net
, table
);
127 if (FIB_RES_GW(*res
) && FIB_RES_NH(*res
).nh_scope
== RT_SCOPE_LINK
)
128 tb
->tb_select_default(tb
, flp
, res
);
131 static void fib_flush(struct net
*net
)
134 struct fib_table
*tb
;
135 struct hlist_node
*node
;
136 struct hlist_head
*head
;
139 for (h
= 0; h
< FIB_TABLE_HASHSZ
; h
++) {
140 head
= &net
->ipv4
.fib_table_hash
[h
];
141 hlist_for_each_entry(tb
, node
, head
, tb_hlist
)
142 flushed
+= tb
->tb_flush(tb
);
146 rt_cache_flush(net
, -1);
150 * Find the first device with a given source address.
153 struct net_device
* ip_dev_find(struct net
*net
, __be32 addr
)
155 struct flowi fl
= { .nl_u
= { .ip4_u
= { .daddr
= addr
} } };
156 struct fib_result res
;
157 struct net_device
*dev
= NULL
;
158 struct fib_table
*local_table
;
160 #ifdef CONFIG_IP_MULTIPLE_TABLES
164 local_table
= fib_get_table(net
, RT_TABLE_LOCAL
);
165 if (!local_table
|| local_table
->tb_lookup(local_table
, &fl
, &res
))
167 if (res
.type
!= RTN_LOCAL
)
169 dev
= FIB_RES_DEV(res
);
179 * Find address type as if only "dev" was present in the system. If
180 * on_dev is NULL then all interfaces are taken into consideration.
182 static inline unsigned __inet_dev_addr_type(struct net
*net
,
183 const struct net_device
*dev
,
186 struct flowi fl
= { .nl_u
= { .ip4_u
= { .daddr
= addr
} } };
187 struct fib_result res
;
188 unsigned ret
= RTN_BROADCAST
;
189 struct fib_table
*local_table
;
191 if (ipv4_is_zeronet(addr
) || ipv4_is_lbcast(addr
))
192 return RTN_BROADCAST
;
193 if (ipv4_is_multicast(addr
))
194 return RTN_MULTICAST
;
196 #ifdef CONFIG_IP_MULTIPLE_TABLES
200 local_table
= fib_get_table(net
, RT_TABLE_LOCAL
);
203 if (!local_table
->tb_lookup(local_table
, &fl
, &res
)) {
204 if (!dev
|| dev
== res
.fi
->fib_dev
)
212 unsigned int inet_addr_type(struct net
*net
, __be32 addr
)
214 return __inet_dev_addr_type(net
, NULL
, addr
);
217 unsigned int inet_dev_addr_type(struct net
*net
, const struct net_device
*dev
,
220 return __inet_dev_addr_type(net
, dev
, addr
);
223 /* Given (packet source, input interface) and optional (dst, oif, tos):
224 - (main) check, that source is valid i.e. not broadcast or our local
226 - figure out what "logical" interface this packet arrived
227 and calculate "specific destination" address.
228 - check, that packet arrived from expected physical interface.
231 int fib_validate_source(__be32 src
, __be32 dst
, u8 tos
, int oif
,
232 struct net_device
*dev
, __be32
*spec_dst
, u32
*itag
)
234 struct in_device
*in_dev
;
235 struct flowi fl
= { .nl_u
= { .ip4_u
=
240 struct fib_result res
;
247 in_dev
= __in_dev_get_rcu(dev
);
249 no_addr
= in_dev
->ifa_list
== NULL
;
250 rpf
= IN_DEV_RPFILTER(in_dev
);
258 if (fib_lookup(net
, &fl
, &res
))
260 if (res
.type
!= RTN_UNICAST
)
262 *spec_dst
= FIB_RES_PREFSRC(res
);
263 fib_combine_itag(itag
, &res
);
264 #ifdef CONFIG_IP_ROUTE_MULTIPATH
265 if (FIB_RES_DEV(res
) == dev
|| res
.fi
->fib_nhs
> 1)
267 if (FIB_RES_DEV(res
) == dev
)
270 ret
= FIB_RES_NH(res
).nh_scope
>= RT_SCOPE_HOST
;
279 fl
.oif
= dev
->ifindex
;
282 if (fib_lookup(net
, &fl
, &res
) == 0) {
283 if (res
.type
== RTN_UNICAST
) {
284 *spec_dst
= FIB_RES_PREFSRC(res
);
285 ret
= FIB_RES_NH(res
).nh_scope
>= RT_SCOPE_HOST
;
294 *spec_dst
= inet_select_addr(dev
, 0, RT_SCOPE_UNIVERSE
);
304 static inline __be32
sk_extract_addr(struct sockaddr
*addr
)
306 return ((struct sockaddr_in
*) addr
)->sin_addr
.s_addr
;
309 static int put_rtax(struct nlattr
*mx
, int len
, int type
, u32 value
)
313 nla
= (struct nlattr
*) ((char *) mx
+ len
);
314 nla
->nla_type
= type
;
315 nla
->nla_len
= nla_attr_size(4);
316 *(u32
*) nla_data(nla
) = value
;
318 return len
+ nla_total_size(4);
321 static int rtentry_to_fib_config(struct net
*net
, int cmd
, struct rtentry
*rt
,
322 struct fib_config
*cfg
)
327 memset(cfg
, 0, sizeof(*cfg
));
328 cfg
->fc_nlinfo
.nl_net
= net
;
330 if (rt
->rt_dst
.sa_family
!= AF_INET
)
331 return -EAFNOSUPPORT
;
334 * Check mask for validity:
335 * a) it must be contiguous.
336 * b) destination must have all host bits clear.
337 * c) if application forgot to set correct family (AF_INET),
338 * reject request unless it is absolutely clear i.e.
339 * both family and mask are zero.
342 addr
= sk_extract_addr(&rt
->rt_dst
);
343 if (!(rt
->rt_flags
& RTF_HOST
)) {
344 __be32 mask
= sk_extract_addr(&rt
->rt_genmask
);
346 if (rt
->rt_genmask
.sa_family
!= AF_INET
) {
347 if (mask
|| rt
->rt_genmask
.sa_family
)
348 return -EAFNOSUPPORT
;
351 if (bad_mask(mask
, addr
))
354 plen
= inet_mask_len(mask
);
357 cfg
->fc_dst_len
= plen
;
360 if (cmd
!= SIOCDELRT
) {
361 cfg
->fc_nlflags
= NLM_F_CREATE
;
362 cfg
->fc_protocol
= RTPROT_BOOT
;
366 cfg
->fc_priority
= rt
->rt_metric
- 1;
368 if (rt
->rt_flags
& RTF_REJECT
) {
369 cfg
->fc_scope
= RT_SCOPE_HOST
;
370 cfg
->fc_type
= RTN_UNREACHABLE
;
374 cfg
->fc_scope
= RT_SCOPE_NOWHERE
;
375 cfg
->fc_type
= RTN_UNICAST
;
379 struct net_device
*dev
;
380 char devname
[IFNAMSIZ
];
382 if (copy_from_user(devname
, rt
->rt_dev
, IFNAMSIZ
-1))
385 devname
[IFNAMSIZ
-1] = 0;
386 colon
= strchr(devname
, ':');
389 dev
= __dev_get_by_name(net
, devname
);
392 cfg
->fc_oif
= dev
->ifindex
;
394 struct in_ifaddr
*ifa
;
395 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
399 for (ifa
= in_dev
->ifa_list
; ifa
; ifa
= ifa
->ifa_next
)
400 if (strcmp(ifa
->ifa_label
, devname
) == 0)
404 cfg
->fc_prefsrc
= ifa
->ifa_local
;
408 addr
= sk_extract_addr(&rt
->rt_gateway
);
409 if (rt
->rt_gateway
.sa_family
== AF_INET
&& addr
) {
411 if (rt
->rt_flags
& RTF_GATEWAY
&&
412 inet_addr_type(net
, addr
) == RTN_UNICAST
)
413 cfg
->fc_scope
= RT_SCOPE_UNIVERSE
;
416 if (cmd
== SIOCDELRT
)
419 if (rt
->rt_flags
& RTF_GATEWAY
&& !cfg
->fc_gw
)
422 if (cfg
->fc_scope
== RT_SCOPE_NOWHERE
)
423 cfg
->fc_scope
= RT_SCOPE_LINK
;
425 if (rt
->rt_flags
& (RTF_MTU
| RTF_WINDOW
| RTF_IRTT
)) {
429 mx
= kzalloc(3 * nla_total_size(4), GFP_KERNEL
);
433 if (rt
->rt_flags
& RTF_MTU
)
434 len
= put_rtax(mx
, len
, RTAX_ADVMSS
, rt
->rt_mtu
- 40);
436 if (rt
->rt_flags
& RTF_WINDOW
)
437 len
= put_rtax(mx
, len
, RTAX_WINDOW
, rt
->rt_window
);
439 if (rt
->rt_flags
& RTF_IRTT
)
440 len
= put_rtax(mx
, len
, RTAX_RTT
, rt
->rt_irtt
<< 3);
443 cfg
->fc_mx_len
= len
;
450 * Handle IP routing ioctl calls. These are used to manipulate the routing tables
453 int ip_rt_ioctl(struct net
*net
, unsigned int cmd
, void __user
*arg
)
455 struct fib_config cfg
;
460 case SIOCADDRT
: /* Add a route */
461 case SIOCDELRT
: /* Delete a route */
462 if (!capable(CAP_NET_ADMIN
))
465 if (copy_from_user(&rt
, arg
, sizeof(rt
)))
469 err
= rtentry_to_fib_config(net
, cmd
, &rt
, &cfg
);
471 struct fib_table
*tb
;
473 if (cmd
== SIOCDELRT
) {
474 tb
= fib_get_table(net
, cfg
.fc_table
);
476 err
= tb
->tb_delete(tb
, &cfg
);
480 tb
= fib_new_table(net
, cfg
.fc_table
);
482 err
= tb
->tb_insert(tb
, &cfg
);
487 /* allocated by rtentry_to_fib_config() */
496 const struct nla_policy rtm_ipv4_policy
[RTA_MAX
+1] = {
497 [RTA_DST
] = { .type
= NLA_U32
},
498 [RTA_SRC
] = { .type
= NLA_U32
},
499 [RTA_IIF
] = { .type
= NLA_U32
},
500 [RTA_OIF
] = { .type
= NLA_U32
},
501 [RTA_GATEWAY
] = { .type
= NLA_U32
},
502 [RTA_PRIORITY
] = { .type
= NLA_U32
},
503 [RTA_PREFSRC
] = { .type
= NLA_U32
},
504 [RTA_METRICS
] = { .type
= NLA_NESTED
},
505 [RTA_MULTIPATH
] = { .len
= sizeof(struct rtnexthop
) },
506 [RTA_FLOW
] = { .type
= NLA_U32
},
509 static int rtm_to_fib_config(struct net
*net
, struct sk_buff
*skb
,
510 struct nlmsghdr
*nlh
, struct fib_config
*cfg
)
516 err
= nlmsg_validate(nlh
, sizeof(*rtm
), RTA_MAX
, rtm_ipv4_policy
);
520 memset(cfg
, 0, sizeof(*cfg
));
522 rtm
= nlmsg_data(nlh
);
523 cfg
->fc_dst_len
= rtm
->rtm_dst_len
;
524 cfg
->fc_tos
= rtm
->rtm_tos
;
525 cfg
->fc_table
= rtm
->rtm_table
;
526 cfg
->fc_protocol
= rtm
->rtm_protocol
;
527 cfg
->fc_scope
= rtm
->rtm_scope
;
528 cfg
->fc_type
= rtm
->rtm_type
;
529 cfg
->fc_flags
= rtm
->rtm_flags
;
530 cfg
->fc_nlflags
= nlh
->nlmsg_flags
;
532 cfg
->fc_nlinfo
.pid
= NETLINK_CB(skb
).pid
;
533 cfg
->fc_nlinfo
.nlh
= nlh
;
534 cfg
->fc_nlinfo
.nl_net
= net
;
536 if (cfg
->fc_type
> RTN_MAX
) {
541 nlmsg_for_each_attr(attr
, nlh
, sizeof(struct rtmsg
), remaining
) {
542 switch (nla_type(attr
)) {
544 cfg
->fc_dst
= nla_get_be32(attr
);
547 cfg
->fc_oif
= nla_get_u32(attr
);
550 cfg
->fc_gw
= nla_get_be32(attr
);
553 cfg
->fc_priority
= nla_get_u32(attr
);
556 cfg
->fc_prefsrc
= nla_get_be32(attr
);
559 cfg
->fc_mx
= nla_data(attr
);
560 cfg
->fc_mx_len
= nla_len(attr
);
563 cfg
->fc_mp
= nla_data(attr
);
564 cfg
->fc_mp_len
= nla_len(attr
);
567 cfg
->fc_flow
= nla_get_u32(attr
);
570 cfg
->fc_table
= nla_get_u32(attr
);
580 static int inet_rtm_delroute(struct sk_buff
*skb
, struct nlmsghdr
*nlh
, void *arg
)
582 struct net
*net
= sock_net(skb
->sk
);
583 struct fib_config cfg
;
584 struct fib_table
*tb
;
587 err
= rtm_to_fib_config(net
, skb
, nlh
, &cfg
);
591 tb
= fib_get_table(net
, cfg
.fc_table
);
597 err
= tb
->tb_delete(tb
, &cfg
);
602 static int inet_rtm_newroute(struct sk_buff
*skb
, struct nlmsghdr
*nlh
, void *arg
)
604 struct net
*net
= sock_net(skb
->sk
);
605 struct fib_config cfg
;
606 struct fib_table
*tb
;
609 err
= rtm_to_fib_config(net
, skb
, nlh
, &cfg
);
613 tb
= fib_new_table(net
, cfg
.fc_table
);
619 err
= tb
->tb_insert(tb
, &cfg
);
624 static int inet_dump_fib(struct sk_buff
*skb
, struct netlink_callback
*cb
)
626 struct net
*net
= sock_net(skb
->sk
);
628 unsigned int e
= 0, s_e
;
629 struct fib_table
*tb
;
630 struct hlist_node
*node
;
631 struct hlist_head
*head
;
634 if (nlmsg_len(cb
->nlh
) >= sizeof(struct rtmsg
) &&
635 ((struct rtmsg
*) nlmsg_data(cb
->nlh
))->rtm_flags
& RTM_F_CLONED
)
636 return ip_rt_dump(skb
, cb
);
641 for (h
= s_h
; h
< FIB_TABLE_HASHSZ
; h
++, s_e
= 0) {
643 head
= &net
->ipv4
.fib_table_hash
[h
];
644 hlist_for_each_entry(tb
, node
, head
, tb_hlist
) {
648 memset(&cb
->args
[2], 0, sizeof(cb
->args
) -
649 2 * sizeof(cb
->args
[0]));
650 if (tb
->tb_dump(tb
, skb
, cb
) < 0)
664 /* Prepare and feed intra-kernel routing request.
665 Really, it should be netlink message, but :-( netlink
666 can be not configured, so that we feed it directly
667 to fib engine. It is legal, because all events occur
668 only when netlink is already locked.
671 static void fib_magic(int cmd
, int type
, __be32 dst
, int dst_len
, struct in_ifaddr
*ifa
)
673 struct net
*net
= dev_net(ifa
->ifa_dev
->dev
);
674 struct fib_table
*tb
;
675 struct fib_config cfg
= {
676 .fc_protocol
= RTPROT_KERNEL
,
679 .fc_dst_len
= dst_len
,
680 .fc_prefsrc
= ifa
->ifa_local
,
681 .fc_oif
= ifa
->ifa_dev
->dev
->ifindex
,
682 .fc_nlflags
= NLM_F_CREATE
| NLM_F_APPEND
,
688 if (type
== RTN_UNICAST
)
689 tb
= fib_new_table(net
, RT_TABLE_MAIN
);
691 tb
= fib_new_table(net
, RT_TABLE_LOCAL
);
696 cfg
.fc_table
= tb
->tb_id
;
698 if (type
!= RTN_LOCAL
)
699 cfg
.fc_scope
= RT_SCOPE_LINK
;
701 cfg
.fc_scope
= RT_SCOPE_HOST
;
703 if (cmd
== RTM_NEWROUTE
)
704 tb
->tb_insert(tb
, &cfg
);
706 tb
->tb_delete(tb
, &cfg
);
709 void fib_add_ifaddr(struct in_ifaddr
*ifa
)
711 struct in_device
*in_dev
= ifa
->ifa_dev
;
712 struct net_device
*dev
= in_dev
->dev
;
713 struct in_ifaddr
*prim
= ifa
;
714 __be32 mask
= ifa
->ifa_mask
;
715 __be32 addr
= ifa
->ifa_local
;
716 __be32 prefix
= ifa
->ifa_address
&mask
;
718 if (ifa
->ifa_flags
&IFA_F_SECONDARY
) {
719 prim
= inet_ifa_byprefix(in_dev
, prefix
, mask
);
721 printk(KERN_WARNING
"fib_add_ifaddr: bug: prim == NULL\n");
726 fib_magic(RTM_NEWROUTE
, RTN_LOCAL
, addr
, 32, prim
);
728 if (!(dev
->flags
&IFF_UP
))
731 /* Add broadcast address, if it is explicitly assigned. */
732 if (ifa
->ifa_broadcast
&& ifa
->ifa_broadcast
!= htonl(0xFFFFFFFF))
733 fib_magic(RTM_NEWROUTE
, RTN_BROADCAST
, ifa
->ifa_broadcast
, 32, prim
);
735 if (!ipv4_is_zeronet(prefix
) && !(ifa
->ifa_flags
&IFA_F_SECONDARY
) &&
736 (prefix
!= addr
|| ifa
->ifa_prefixlen
< 32)) {
737 fib_magic(RTM_NEWROUTE
, dev
->flags
&IFF_LOOPBACK
? RTN_LOCAL
:
738 RTN_UNICAST
, prefix
, ifa
->ifa_prefixlen
, prim
);
740 /* Add network specific broadcasts, when it takes a sense */
741 if (ifa
->ifa_prefixlen
< 31) {
742 fib_magic(RTM_NEWROUTE
, RTN_BROADCAST
, prefix
, 32, prim
);
743 fib_magic(RTM_NEWROUTE
, RTN_BROADCAST
, prefix
|~mask
, 32, prim
);
748 static void fib_del_ifaddr(struct in_ifaddr
*ifa
)
750 struct in_device
*in_dev
= ifa
->ifa_dev
;
751 struct net_device
*dev
= in_dev
->dev
;
752 struct in_ifaddr
*ifa1
;
753 struct in_ifaddr
*prim
= ifa
;
754 __be32 brd
= ifa
->ifa_address
|~ifa
->ifa_mask
;
755 __be32 any
= ifa
->ifa_address
&ifa
->ifa_mask
;
762 if (!(ifa
->ifa_flags
&IFA_F_SECONDARY
))
763 fib_magic(RTM_DELROUTE
, dev
->flags
&IFF_LOOPBACK
? RTN_LOCAL
:
764 RTN_UNICAST
, any
, ifa
->ifa_prefixlen
, prim
);
766 prim
= inet_ifa_byprefix(in_dev
, any
, ifa
->ifa_mask
);
768 printk(KERN_WARNING
"fib_del_ifaddr: bug: prim == NULL\n");
773 /* Deletion is more complicated than add.
774 We should take care of not to delete too much :-)
776 Scan address list to be sure that addresses are really gone.
779 for (ifa1
= in_dev
->ifa_list
; ifa1
; ifa1
= ifa1
->ifa_next
) {
780 if (ifa
->ifa_local
== ifa1
->ifa_local
)
782 if (ifa
->ifa_broadcast
== ifa1
->ifa_broadcast
)
784 if (brd
== ifa1
->ifa_broadcast
)
786 if (any
== ifa1
->ifa_broadcast
)
791 fib_magic(RTM_DELROUTE
, RTN_BROADCAST
, ifa
->ifa_broadcast
, 32, prim
);
793 fib_magic(RTM_DELROUTE
, RTN_BROADCAST
, brd
, 32, prim
);
795 fib_magic(RTM_DELROUTE
, RTN_BROADCAST
, any
, 32, prim
);
796 if (!(ok
&LOCAL_OK
)) {
797 fib_magic(RTM_DELROUTE
, RTN_LOCAL
, ifa
->ifa_local
, 32, prim
);
799 /* Check, that this local address finally disappeared. */
800 if (inet_addr_type(dev_net(dev
), ifa
->ifa_local
) != RTN_LOCAL
) {
801 /* And the last, but not the least thing.
802 We must flush stray FIB entries.
804 First of all, we scan fib_info list searching
805 for stray nexthop entries, then ignite fib_flush.
807 if (fib_sync_down_addr(dev_net(dev
), ifa
->ifa_local
))
808 fib_flush(dev_net(dev
));
817 static void nl_fib_lookup(struct fib_result_nl
*frn
, struct fib_table
*tb
)
820 struct fib_result res
;
821 struct flowi fl
= { .mark
= frn
->fl_mark
,
822 .nl_u
= { .ip4_u
= { .daddr
= frn
->fl_addr
,
824 .scope
= frn
->fl_scope
} } };
826 #ifdef CONFIG_IP_MULTIPLE_TABLES
834 frn
->tb_id
= tb
->tb_id
;
835 frn
->err
= tb
->tb_lookup(tb
, &fl
, &res
);
838 frn
->prefixlen
= res
.prefixlen
;
839 frn
->nh_sel
= res
.nh_sel
;
840 frn
->type
= res
.type
;
841 frn
->scope
= res
.scope
;
848 static void nl_fib_input(struct sk_buff
*skb
)
851 struct fib_result_nl
*frn
;
852 struct nlmsghdr
*nlh
;
853 struct fib_table
*tb
;
856 net
= sock_net(skb
->sk
);
857 nlh
= nlmsg_hdr(skb
);
858 if (skb
->len
< NLMSG_SPACE(0) || skb
->len
< nlh
->nlmsg_len
||
859 nlh
->nlmsg_len
< NLMSG_LENGTH(sizeof(*frn
)))
862 skb
= skb_clone(skb
, GFP_KERNEL
);
865 nlh
= nlmsg_hdr(skb
);
867 frn
= (struct fib_result_nl
*) NLMSG_DATA(nlh
);
868 tb
= fib_get_table(net
, frn
->tb_id_in
);
870 nl_fib_lookup(frn
, tb
);
872 pid
= NETLINK_CB(skb
).pid
; /* pid of sending process */
873 NETLINK_CB(skb
).pid
= 0; /* from kernel */
874 NETLINK_CB(skb
).dst_group
= 0; /* unicast */
875 netlink_unicast(net
->ipv4
.fibnl
, skb
, pid
, MSG_DONTWAIT
);
878 static int nl_fib_lookup_init(struct net
*net
)
881 sk
= netlink_kernel_create(net
, NETLINK_FIB_LOOKUP
, 0,
882 nl_fib_input
, NULL
, THIS_MODULE
);
884 return -EAFNOSUPPORT
;
885 net
->ipv4
.fibnl
= sk
;
889 static void nl_fib_lookup_exit(struct net
*net
)
891 netlink_kernel_release(net
->ipv4
.fibnl
);
892 net
->ipv4
.fibnl
= NULL
;
895 static void fib_disable_ip(struct net_device
*dev
, int force
)
897 if (fib_sync_down_dev(dev
, force
))
898 fib_flush(dev_net(dev
));
899 rt_cache_flush(dev_net(dev
), 0);
903 static int fib_inetaddr_event(struct notifier_block
*this, unsigned long event
, void *ptr
)
905 struct in_ifaddr
*ifa
= (struct in_ifaddr
*)ptr
;
906 struct net_device
*dev
= ifa
->ifa_dev
->dev
;
911 #ifdef CONFIG_IP_ROUTE_MULTIPATH
914 rt_cache_flush(dev_net(dev
), -1);
918 if (ifa
->ifa_dev
->ifa_list
== NULL
) {
919 /* Last address was deleted from this interface.
922 fib_disable_ip(dev
, 1);
924 rt_cache_flush(dev_net(dev
), -1);
931 static int fib_netdev_event(struct notifier_block
*this, unsigned long event
, void *ptr
)
933 struct net_device
*dev
= ptr
;
934 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
936 if (event
== NETDEV_UNREGISTER
) {
937 fib_disable_ip(dev
, 2);
948 } endfor_ifa(in_dev
);
949 #ifdef CONFIG_IP_ROUTE_MULTIPATH
952 rt_cache_flush(dev_net(dev
), -1);
955 fib_disable_ip(dev
, 0);
957 case NETDEV_CHANGEMTU
:
959 rt_cache_flush(dev_net(dev
), 0);
965 static struct notifier_block fib_inetaddr_notifier
= {
966 .notifier_call
= fib_inetaddr_event
,
969 static struct notifier_block fib_netdev_notifier
= {
970 .notifier_call
= fib_netdev_event
,
973 static int __net_init
ip_fib_net_init(struct net
*net
)
978 net
->ipv4
.fib_table_hash
= kzalloc(
979 sizeof(struct hlist_head
)*FIB_TABLE_HASHSZ
, GFP_KERNEL
);
980 if (net
->ipv4
.fib_table_hash
== NULL
)
983 for (i
= 0; i
< FIB_TABLE_HASHSZ
; i
++)
984 INIT_HLIST_HEAD(&net
->ipv4
.fib_table_hash
[i
]);
986 err
= fib4_rules_init(net
);
992 kfree(net
->ipv4
.fib_table_hash
);
996 static void __net_exit
ip_fib_net_exit(struct net
*net
)
1000 #ifdef CONFIG_IP_MULTIPLE_TABLES
1001 fib4_rules_exit(net
);
1004 for (i
= 0; i
< FIB_TABLE_HASHSZ
; i
++) {
1005 struct fib_table
*tb
;
1006 struct hlist_head
*head
;
1007 struct hlist_node
*node
, *tmp
;
1009 head
= &net
->ipv4
.fib_table_hash
[i
];
1010 hlist_for_each_entry_safe(tb
, node
, tmp
, head
, tb_hlist
) {
1016 kfree(net
->ipv4
.fib_table_hash
);
1019 static int __net_init
fib_net_init(struct net
*net
)
1023 error
= ip_fib_net_init(net
);
1026 error
= nl_fib_lookup_init(net
);
1029 error
= fib_proc_init(net
);
1036 nl_fib_lookup_exit(net
);
1038 ip_fib_net_exit(net
);
1042 static void __net_exit
fib_net_exit(struct net
*net
)
1045 nl_fib_lookup_exit(net
);
1046 ip_fib_net_exit(net
);
1049 static struct pernet_operations fib_net_ops
= {
1050 .init
= fib_net_init
,
1051 .exit
= fib_net_exit
,
1054 void __init
ip_fib_init(void)
1056 rtnl_register(PF_INET
, RTM_NEWROUTE
, inet_rtm_newroute
, NULL
);
1057 rtnl_register(PF_INET
, RTM_DELROUTE
, inet_rtm_delroute
, NULL
);
1058 rtnl_register(PF_INET
, RTM_GETROUTE
, NULL
, inet_dump_fib
);
1060 register_pernet_subsys(&fib_net_ops
);
1061 register_netdevice_notifier(&fib_netdev_notifier
);
1062 register_inetaddr_notifier(&fib_inetaddr_notifier
);
1067 EXPORT_SYMBOL(inet_addr_type
);
1068 EXPORT_SYMBOL(inet_dev_addr_type
);
1069 EXPORT_SYMBOL(ip_dev_find
);