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);
159 * Find address type as if only "dev" was present in the system. If
160 * on_dev is NULL then all interfaces are taken into consideration.
162 static inline unsigned __inet_dev_addr_type(const struct net_device *dev,
165 struct flowi fl = { .nl_u = { .ip4_u = { .daddr = addr } } };
166 struct fib_result res;
167 unsigned ret = RTN_BROADCAST;
168 struct fib_table *local_table;
170 if (ipv4_is_zeronet(addr) || ipv4_is_badclass(addr))
171 return RTN_BROADCAST;
172 if (ipv4_is_multicast(addr))
173 return RTN_MULTICAST;
175 #ifdef CONFIG_IP_MULTIPLE_TABLES
179 local_table = fib_get_table(RT_TABLE_LOCAL);
182 if (!local_table->tb_lookup(local_table, &fl, &res)) {
183 if (!dev || dev == res.fi->fib_dev)
191 unsigned int inet_addr_type(__be32 addr)
193 return __inet_dev_addr_type(NULL, addr);
196 unsigned int inet_dev_addr_type(const struct net_device *dev, __be32 addr)
198 return __inet_dev_addr_type(dev, addr);
201 /* Given (packet source, input interface) and optional (dst, oif, tos):
202 - (main) check, that source is valid i.e. not broadcast or our local
204 - figure out what "logical" interface this packet arrived
205 and calculate "specific destination" address.
206 - check, that packet arrived from expected physical interface.
209 int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
210 struct net_device *dev, __be32 *spec_dst, u32 *itag)
212 struct in_device *in_dev;
213 struct flowi fl = { .nl_u = { .ip4_u =
218 struct fib_result res;
224 in_dev = __in_dev_get_rcu(dev);
226 no_addr = in_dev->ifa_list == NULL;
227 rpf = IN_DEV_RPFILTER(in_dev);
234 if (fib_lookup(&fl, &res))
236 if (res.type != RTN_UNICAST)
238 *spec_dst = FIB_RES_PREFSRC(res);
239 fib_combine_itag(itag, &res);
240 #ifdef CONFIG_IP_ROUTE_MULTIPATH
241 if (FIB_RES_DEV(res) == dev || res.fi->fib_nhs > 1)
243 if (FIB_RES_DEV(res) == dev)
246 ret = FIB_RES_NH(res).nh_scope >= RT_SCOPE_HOST;
255 fl.oif = dev->ifindex;
258 if (fib_lookup(&fl, &res) == 0) {
259 if (res.type == RTN_UNICAST) {
260 *spec_dst = FIB_RES_PREFSRC(res);
261 ret = FIB_RES_NH(res).nh_scope >= RT_SCOPE_HOST;
270 *spec_dst = inet_select_addr(dev, 0, RT_SCOPE_UNIVERSE);
280 static inline __be32 sk_extract_addr(struct sockaddr *addr)
282 return ((struct sockaddr_in *) addr)->sin_addr.s_addr;
285 static int put_rtax(struct nlattr *mx, int len, int type, u32 value)
289 nla = (struct nlattr *) ((char *) mx + len);
290 nla->nla_type = type;
291 nla->nla_len = nla_attr_size(4);
292 *(u32 *) nla_data(nla) = value;
294 return len + nla_total_size(4);
297 static int rtentry_to_fib_config(int cmd, struct rtentry *rt,
298 struct fib_config *cfg)
303 memset(cfg, 0, sizeof(*cfg));
305 if (rt->rt_dst.sa_family != AF_INET)
306 return -EAFNOSUPPORT;
309 * Check mask for validity:
310 * a) it must be contiguous.
311 * b) destination must have all host bits clear.
312 * c) if application forgot to set correct family (AF_INET),
313 * reject request unless it is absolutely clear i.e.
314 * both family and mask are zero.
317 addr = sk_extract_addr(&rt->rt_dst);
318 if (!(rt->rt_flags & RTF_HOST)) {
319 __be32 mask = sk_extract_addr(&rt->rt_genmask);
321 if (rt->rt_genmask.sa_family != AF_INET) {
322 if (mask || rt->rt_genmask.sa_family)
323 return -EAFNOSUPPORT;
326 if (bad_mask(mask, addr))
329 plen = inet_mask_len(mask);
332 cfg->fc_dst_len = plen;
335 if (cmd != SIOCDELRT) {
336 cfg->fc_nlflags = NLM_F_CREATE;
337 cfg->fc_protocol = RTPROT_BOOT;
341 cfg->fc_priority = rt->rt_metric - 1;
343 if (rt->rt_flags & RTF_REJECT) {
344 cfg->fc_scope = RT_SCOPE_HOST;
345 cfg->fc_type = RTN_UNREACHABLE;
349 cfg->fc_scope = RT_SCOPE_NOWHERE;
350 cfg->fc_type = RTN_UNICAST;
354 struct net_device *dev;
355 char devname[IFNAMSIZ];
357 if (copy_from_user(devname, rt->rt_dev, IFNAMSIZ-1))
360 devname[IFNAMSIZ-1] = 0;
361 colon = strchr(devname, ':');
364 dev = __dev_get_by_name(&init_net, devname);
367 cfg->fc_oif = dev->ifindex;
369 struct in_ifaddr *ifa;
370 struct in_device *in_dev = __in_dev_get_rtnl(dev);
374 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next)
375 if (strcmp(ifa->ifa_label, devname) == 0)
379 cfg->fc_prefsrc = ifa->ifa_local;
383 addr = sk_extract_addr(&rt->rt_gateway);
384 if (rt->rt_gateway.sa_family == AF_INET && addr) {
386 if (rt->rt_flags & RTF_GATEWAY &&
387 inet_addr_type(addr) == RTN_UNICAST)
388 cfg->fc_scope = RT_SCOPE_UNIVERSE;
391 if (cmd == SIOCDELRT)
394 if (rt->rt_flags & RTF_GATEWAY && !cfg->fc_gw)
397 if (cfg->fc_scope == RT_SCOPE_NOWHERE)
398 cfg->fc_scope = RT_SCOPE_LINK;
400 if (rt->rt_flags & (RTF_MTU | RTF_WINDOW | RTF_IRTT)) {
404 mx = kzalloc(3 * nla_total_size(4), GFP_KERNEL);
408 if (rt->rt_flags & RTF_MTU)
409 len = put_rtax(mx, len, RTAX_ADVMSS, rt->rt_mtu - 40);
411 if (rt->rt_flags & RTF_WINDOW)
412 len = put_rtax(mx, len, RTAX_WINDOW, rt->rt_window);
414 if (rt->rt_flags & RTF_IRTT)
415 len = put_rtax(mx, len, RTAX_RTT, rt->rt_irtt << 3);
418 cfg->fc_mx_len = len;
425 * Handle IP routing ioctl calls. These are used to manipulate the routing tables
428 int ip_rt_ioctl(unsigned int cmd, void __user *arg)
430 struct fib_config cfg;
435 case SIOCADDRT: /* Add a route */
436 case SIOCDELRT: /* Delete a route */
437 if (!capable(CAP_NET_ADMIN))
440 if (copy_from_user(&rt, arg, sizeof(rt)))
444 err = rtentry_to_fib_config(cmd, &rt, &cfg);
446 struct fib_table *tb;
448 if (cmd == SIOCDELRT) {
449 tb = fib_get_table(cfg.fc_table);
451 err = tb->tb_delete(tb, &cfg);
455 tb = fib_new_table(cfg.fc_table);
457 err = tb->tb_insert(tb, &cfg);
462 /* allocated by rtentry_to_fib_config() */
471 const struct nla_policy rtm_ipv4_policy[RTA_MAX+1] = {
472 [RTA_DST] = { .type = NLA_U32 },
473 [RTA_SRC] = { .type = NLA_U32 },
474 [RTA_IIF] = { .type = NLA_U32 },
475 [RTA_OIF] = { .type = NLA_U32 },
476 [RTA_GATEWAY] = { .type = NLA_U32 },
477 [RTA_PRIORITY] = { .type = NLA_U32 },
478 [RTA_PREFSRC] = { .type = NLA_U32 },
479 [RTA_METRICS] = { .type = NLA_NESTED },
480 [RTA_MULTIPATH] = { .len = sizeof(struct rtnexthop) },
481 [RTA_PROTOINFO] = { .type = NLA_U32 },
482 [RTA_FLOW] = { .type = NLA_U32 },
485 static int rtm_to_fib_config(struct sk_buff *skb, struct nlmsghdr *nlh,
486 struct fib_config *cfg)
492 err = nlmsg_validate(nlh, sizeof(*rtm), RTA_MAX, rtm_ipv4_policy);
496 memset(cfg, 0, sizeof(*cfg));
498 rtm = nlmsg_data(nlh);
499 cfg->fc_dst_len = rtm->rtm_dst_len;
500 cfg->fc_tos = rtm->rtm_tos;
501 cfg->fc_table = rtm->rtm_table;
502 cfg->fc_protocol = rtm->rtm_protocol;
503 cfg->fc_scope = rtm->rtm_scope;
504 cfg->fc_type = rtm->rtm_type;
505 cfg->fc_flags = rtm->rtm_flags;
506 cfg->fc_nlflags = nlh->nlmsg_flags;
508 cfg->fc_nlinfo.pid = NETLINK_CB(skb).pid;
509 cfg->fc_nlinfo.nlh = nlh;
511 if (cfg->fc_type > RTN_MAX) {
516 nlmsg_for_each_attr(attr, nlh, sizeof(struct rtmsg), remaining) {
517 switch (nla_type(attr)) {
519 cfg->fc_dst = nla_get_be32(attr);
522 cfg->fc_oif = nla_get_u32(attr);
525 cfg->fc_gw = nla_get_be32(attr);
528 cfg->fc_priority = nla_get_u32(attr);
531 cfg->fc_prefsrc = nla_get_be32(attr);
534 cfg->fc_mx = nla_data(attr);
535 cfg->fc_mx_len = nla_len(attr);
538 cfg->fc_mp = nla_data(attr);
539 cfg->fc_mp_len = nla_len(attr);
542 cfg->fc_flow = nla_get_u32(attr);
545 cfg->fc_table = nla_get_u32(attr);
555 static int inet_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
557 struct net *net = skb->sk->sk_net;
558 struct fib_config cfg;
559 struct fib_table *tb;
562 if (net != &init_net)
565 err = rtm_to_fib_config(skb, nlh, &cfg);
569 tb = fib_get_table(cfg.fc_table);
575 err = tb->tb_delete(tb, &cfg);
580 static int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
582 struct net *net = skb->sk->sk_net;
583 struct fib_config cfg;
584 struct fib_table *tb;
587 if (net != &init_net)
590 err = rtm_to_fib_config(skb, nlh, &cfg);
594 tb = fib_new_table(cfg.fc_table);
600 err = tb->tb_insert(tb, &cfg);
605 static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
607 struct net *net = skb->sk->sk_net;
609 unsigned int e = 0, s_e;
610 struct fib_table *tb;
611 struct hlist_node *node;
614 if (net != &init_net)
617 if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) &&
618 ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED)
619 return ip_rt_dump(skb, cb);
624 for (h = s_h; h < FIB_TABLE_HASHSZ; h++, s_e = 0) {
626 hlist_for_each_entry(tb, node, &fib_table_hash[h], tb_hlist) {
630 memset(&cb->args[2], 0, sizeof(cb->args) -
631 2 * sizeof(cb->args[0]));
632 if (tb->tb_dump(tb, skb, cb) < 0)
646 /* Prepare and feed intra-kernel routing request.
647 Really, it should be netlink message, but :-( netlink
648 can be not configured, so that we feed it directly
649 to fib engine. It is legal, because all events occur
650 only when netlink is already locked.
653 static void fib_magic(int cmd, int type, __be32 dst, int dst_len, struct in_ifaddr *ifa)
655 struct fib_table *tb;
656 struct fib_config cfg = {
657 .fc_protocol = RTPROT_KERNEL,
660 .fc_dst_len = dst_len,
661 .fc_prefsrc = ifa->ifa_local,
662 .fc_oif = ifa->ifa_dev->dev->ifindex,
663 .fc_nlflags = NLM_F_CREATE | NLM_F_APPEND,
666 if (type == RTN_UNICAST)
667 tb = fib_new_table(RT_TABLE_MAIN);
669 tb = fib_new_table(RT_TABLE_LOCAL);
674 cfg.fc_table = tb->tb_id;
676 if (type != RTN_LOCAL)
677 cfg.fc_scope = RT_SCOPE_LINK;
679 cfg.fc_scope = RT_SCOPE_HOST;
681 if (cmd == RTM_NEWROUTE)
682 tb->tb_insert(tb, &cfg);
684 tb->tb_delete(tb, &cfg);
687 void fib_add_ifaddr(struct in_ifaddr *ifa)
689 struct in_device *in_dev = ifa->ifa_dev;
690 struct net_device *dev = in_dev->dev;
691 struct in_ifaddr *prim = ifa;
692 __be32 mask = ifa->ifa_mask;
693 __be32 addr = ifa->ifa_local;
694 __be32 prefix = ifa->ifa_address&mask;
696 if (ifa->ifa_flags&IFA_F_SECONDARY) {
697 prim = inet_ifa_byprefix(in_dev, prefix, mask);
699 printk(KERN_DEBUG "fib_add_ifaddr: bug: prim == NULL\n");
704 fib_magic(RTM_NEWROUTE, RTN_LOCAL, addr, 32, prim);
706 if (!(dev->flags&IFF_UP))
709 /* Add broadcast address, if it is explicitly assigned. */
710 if (ifa->ifa_broadcast && ifa->ifa_broadcast != htonl(0xFFFFFFFF))
711 fib_magic(RTM_NEWROUTE, RTN_BROADCAST, ifa->ifa_broadcast, 32, prim);
713 if (!ipv4_is_zeronet(prefix) && !(ifa->ifa_flags&IFA_F_SECONDARY) &&
714 (prefix != addr || ifa->ifa_prefixlen < 32)) {
715 fib_magic(RTM_NEWROUTE, dev->flags&IFF_LOOPBACK ? RTN_LOCAL :
716 RTN_UNICAST, prefix, ifa->ifa_prefixlen, prim);
718 /* Add network specific broadcasts, when it takes a sense */
719 if (ifa->ifa_prefixlen < 31) {
720 fib_magic(RTM_NEWROUTE, RTN_BROADCAST, prefix, 32, prim);
721 fib_magic(RTM_NEWROUTE, RTN_BROADCAST, prefix|~mask, 32, prim);
726 static void fib_del_ifaddr(struct in_ifaddr *ifa)
728 struct in_device *in_dev = ifa->ifa_dev;
729 struct net_device *dev = in_dev->dev;
730 struct in_ifaddr *ifa1;
731 struct in_ifaddr *prim = ifa;
732 __be32 brd = ifa->ifa_address|~ifa->ifa_mask;
733 __be32 any = ifa->ifa_address&ifa->ifa_mask;
740 if (!(ifa->ifa_flags&IFA_F_SECONDARY))
741 fib_magic(RTM_DELROUTE, dev->flags&IFF_LOOPBACK ? RTN_LOCAL :
742 RTN_UNICAST, any, ifa->ifa_prefixlen, prim);
744 prim = inet_ifa_byprefix(in_dev, any, ifa->ifa_mask);
746 printk(KERN_DEBUG "fib_del_ifaddr: bug: prim == NULL\n");
751 /* Deletion is more complicated than add.
752 We should take care of not to delete too much :-)
754 Scan address list to be sure that addresses are really gone.
757 for (ifa1 = in_dev->ifa_list; ifa1; ifa1 = ifa1->ifa_next) {
758 if (ifa->ifa_local == ifa1->ifa_local)
760 if (ifa->ifa_broadcast == ifa1->ifa_broadcast)
762 if (brd == ifa1->ifa_broadcast)
764 if (any == ifa1->ifa_broadcast)
769 fib_magic(RTM_DELROUTE, RTN_BROADCAST, ifa->ifa_broadcast, 32, prim);
771 fib_magic(RTM_DELROUTE, RTN_BROADCAST, brd, 32, prim);
773 fib_magic(RTM_DELROUTE, RTN_BROADCAST, any, 32, prim);
774 if (!(ok&LOCAL_OK)) {
775 fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 32, prim);
777 /* Check, that this local address finally disappeared. */
778 if (inet_addr_type(ifa->ifa_local) != RTN_LOCAL) {
779 /* And the last, but not the least thing.
780 We must flush stray FIB entries.
782 First of all, we scan fib_info list searching
783 for stray nexthop entries, then ignite fib_flush.
785 if (fib_sync_down(ifa->ifa_local, NULL, 0))
795 static void nl_fib_lookup(struct fib_result_nl *frn, struct fib_table *tb )
798 struct fib_result res;
799 struct flowi fl = { .mark = frn->fl_mark,
800 .nl_u = { .ip4_u = { .daddr = frn->fl_addr,
802 .scope = frn->fl_scope } } };
804 #ifdef CONFIG_IP_MULTIPLE_TABLES
812 frn->tb_id = tb->tb_id;
813 frn->err = tb->tb_lookup(tb, &fl, &res);
816 frn->prefixlen = res.prefixlen;
817 frn->nh_sel = res.nh_sel;
818 frn->type = res.type;
819 frn->scope = res.scope;
826 static void nl_fib_input(struct sk_buff *skb)
828 struct fib_result_nl *frn;
829 struct nlmsghdr *nlh;
830 struct fib_table *tb;
833 nlh = nlmsg_hdr(skb);
834 if (skb->len < NLMSG_SPACE(0) || skb->len < nlh->nlmsg_len ||
835 nlh->nlmsg_len < NLMSG_LENGTH(sizeof(*frn)))
838 skb = skb_clone(skb, GFP_KERNEL);
841 nlh = nlmsg_hdr(skb);
843 frn = (struct fib_result_nl *) NLMSG_DATA(nlh);
844 tb = fib_get_table(frn->tb_id_in);
846 nl_fib_lookup(frn, tb);
848 pid = NETLINK_CB(skb).pid; /* pid of sending process */
849 NETLINK_CB(skb).pid = 0; /* from kernel */
850 NETLINK_CB(skb).dst_group = 0; /* unicast */
851 netlink_unicast(fibnl, skb, pid, MSG_DONTWAIT);
854 static void nl_fib_lookup_init(void)
856 fibnl = netlink_kernel_create(&init_net, NETLINK_FIB_LOOKUP, 0,
857 nl_fib_input, NULL, THIS_MODULE);
860 static void fib_disable_ip(struct net_device *dev, int force)
862 if (fib_sync_down(0, dev, force))
868 static int fib_inetaddr_event(struct notifier_block *this, unsigned long event, void *ptr)
870 struct in_ifaddr *ifa = (struct in_ifaddr*)ptr;
875 #ifdef CONFIG_IP_ROUTE_MULTIPATH
876 fib_sync_up(ifa->ifa_dev->dev);
882 if (ifa->ifa_dev->ifa_list == NULL) {
883 /* Last address was deleted from this interface.
886 fib_disable_ip(ifa->ifa_dev->dev, 1);
895 static int fib_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
897 struct net_device *dev = ptr;
898 struct in_device *in_dev = __in_dev_get_rtnl(dev);
900 if (dev->nd_net != &init_net)
903 if (event == NETDEV_UNREGISTER) {
904 fib_disable_ip(dev, 2);
915 } endfor_ifa(in_dev);
916 #ifdef CONFIG_IP_ROUTE_MULTIPATH
922 fib_disable_ip(dev, 0);
924 case NETDEV_CHANGEMTU:
932 static struct notifier_block fib_inetaddr_notifier = {
933 .notifier_call =fib_inetaddr_event,
936 static struct notifier_block fib_netdev_notifier = {
937 .notifier_call =fib_netdev_event,
940 void __init ip_fib_init(void)
944 for (i = 0; i < FIB_TABLE_HASHSZ; i++)
945 INIT_HLIST_HEAD(&fib_table_hash[i]);
949 register_netdevice_notifier(&fib_netdev_notifier);
950 register_inetaddr_notifier(&fib_inetaddr_notifier);
951 nl_fib_lookup_init();
953 rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL);
954 rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL);
955 rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib);
958 EXPORT_SYMBOL(inet_addr_type);
959 EXPORT_SYMBOL(inet_dev_addr_type);
960 EXPORT_SYMBOL(ip_dev_find);