linux/net/ipv4/fib_frontend.c
<<
>>
Prefs
   1/*
   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.
   5 *
   6 *              IPv4 Forwarding Information Base: FIB frontend.
   7 *
   8 * Authors:     Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
   9 *
  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.
  14 */
  15
  16#include <linux/module.h>
  17#include <asm/uaccess.h>
  18#include <linux/bitops.h>
  19#include <linux/capability.h>
  20#include <linux/types.h>
  21#include <linux/kernel.h>
  22#include <linux/mm.h>
  23#include <linux/string.h>
  24#include <linux/socket.h>
  25#include <linux/sockios.h>
  26#include <linux/errno.h>
  27#include <linux/in.h>
  28#include <linux/inet.h>
  29#include <linux/inetdevice.h>
  30#include <linux/netdevice.h>
  31#include <linux/if_addr.h>
  32#include <linux/if_arp.h>
  33#include <linux/skbuff.h>
  34#include <linux/cache.h>
  35#include <linux/init.h>
  36#include <linux/list.h>
  37#include <linux/slab.h>
  38
  39#include <net/ip.h>
  40#include <net/protocol.h>
  41#include <net/route.h>
  42#include <net/tcp.h>
  43#include <net/sock.h>
  44#include <net/arp.h>
  45#include <net/ip_fib.h>
  46#include <net/rtnetlink.h>
  47#include <net/xfrm.h>
  48#include <net/vrf.h>
  49#include <trace/events/fib.h>
  50
  51#ifndef CONFIG_IP_MULTIPLE_TABLES
  52
  53static int __net_init fib4_rules_init(struct net *net)
  54{
  55        struct fib_table *local_table, *main_table;
  56
  57        main_table  = fib_trie_table(RT_TABLE_MAIN, NULL);
  58        if (!main_table)
  59                return -ENOMEM;
  60
  61        local_table = fib_trie_table(RT_TABLE_LOCAL, main_table);
  62        if (!local_table)
  63                goto fail;
  64
  65        hlist_add_head_rcu(&local_table->tb_hlist,
  66                                &net->ipv4.fib_table_hash[TABLE_LOCAL_INDEX]);
  67        hlist_add_head_rcu(&main_table->tb_hlist,
  68                                &net->ipv4.fib_table_hash[TABLE_MAIN_INDEX]);
  69        return 0;
  70
  71fail:
  72        fib_free_table(main_table);
  73        return -ENOMEM;
  74}
  75#else
  76
  77struct fib_table *fib_new_table(struct net *net, u32 id)
  78{
  79        struct fib_table *tb, *alias = NULL;
  80        unsigned int h;
  81
  82        if (id == 0)
  83                id = RT_TABLE_MAIN;
  84        tb = fib_get_table(net, id);
  85        if (tb)
  86                return tb;
  87
  88        if (id == RT_TABLE_LOCAL)
  89                alias = fib_new_table(net, RT_TABLE_MAIN);
  90
  91        tb = fib_trie_table(id, alias);
  92        if (!tb)
  93                return NULL;
  94
  95        switch (id) {
  96        case RT_TABLE_LOCAL:
  97                rcu_assign_pointer(net->ipv4.fib_local, tb);
  98                break;
  99        case RT_TABLE_MAIN:
 100                rcu_assign_pointer(net->ipv4.fib_main, tb);
 101                break;
 102        case RT_TABLE_DEFAULT:
 103                rcu_assign_pointer(net->ipv4.fib_default, tb);
 104                break;
 105        default:
 106                break;
 107        }
 108
 109        h = id & (FIB_TABLE_HASHSZ - 1);
 110        hlist_add_head_rcu(&tb->tb_hlist, &net->ipv4.fib_table_hash[h]);
 111        return tb;
 112}
 113
 114/* caller must hold either rtnl or rcu read lock */
 115struct fib_table *fib_get_table(struct net *net, u32 id)
 116{
 117        struct fib_table *tb;
 118        struct hlist_head *head;
 119        unsigned int h;
 120
 121        if (id == 0)
 122                id = RT_TABLE_MAIN;
 123        h = id & (FIB_TABLE_HASHSZ - 1);
 124
 125        head = &net->ipv4.fib_table_hash[h];
 126        hlist_for_each_entry_rcu(tb, head, tb_hlist) {
 127                if (tb->tb_id == id)
 128                        return tb;
 129        }
 130        return NULL;
 131}
 132#endif /* CONFIG_IP_MULTIPLE_TABLES */
 133
 134static void fib_replace_table(struct net *net, struct fib_table *old,
 135                              struct fib_table *new)
 136{
 137#ifdef CONFIG_IP_MULTIPLE_TABLES
 138        switch (new->tb_id) {
 139        case RT_TABLE_LOCAL:
 140                rcu_assign_pointer(net->ipv4.fib_local, new);
 141                break;
 142        case RT_TABLE_MAIN:
 143                rcu_assign_pointer(net->ipv4.fib_main, new);
 144                break;
 145        case RT_TABLE_DEFAULT:
 146                rcu_assign_pointer(net->ipv4.fib_default, new);
 147                break;
 148        default:
 149                break;
 150        }
 151
 152#endif
 153        /* replace the old table in the hlist */
 154        hlist_replace_rcu(&old->tb_hlist, &new->tb_hlist);
 155}
 156
 157int fib_unmerge(struct net *net)
 158{
 159        struct fib_table *old, *new;
 160
 161        /* attempt to fetch local table if it has been allocated */
 162        old = fib_get_table(net, RT_TABLE_LOCAL);
 163        if (!old)
 164                return 0;
 165
 166        new = fib_trie_unmerge(old);
 167        if (!new)
 168                return -ENOMEM;
 169
 170        /* replace merged table with clean table */
 171        if (new != old) {
 172                fib_replace_table(net, old, new);
 173                fib_free_table(old);
 174        }
 175
 176        return 0;
 177}
 178
 179static void fib_flush(struct net *net)
 180{
 181        int flushed = 0;
 182        unsigned int h;
 183
 184        for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
 185                struct hlist_head *head = &net->ipv4.fib_table_hash[h];
 186                struct hlist_node *tmp;
 187                struct fib_table *tb;
 188
 189                hlist_for_each_entry_safe(tb, tmp, head, tb_hlist)
 190                        flushed += fib_table_flush(tb);
 191        }
 192
 193        if (flushed)
 194                rt_cache_flush(net);
 195}
 196
 197void fib_flush_external(struct net *net)
 198{
 199        struct fib_table *tb;
 200        struct hlist_head *head;
 201        unsigned int h;
 202
 203        for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
 204                head = &net->ipv4.fib_table_hash[h];
 205                hlist_for_each_entry(tb, head, tb_hlist)
 206                        fib_table_flush_external(tb);
 207        }
 208}
 209
 210/*
 211 * Find address type as if only "dev" was present in the system. If
 212 * on_dev is NULL then all interfaces are taken into consideration.
 213 */
 214static inline unsigned int __inet_dev_addr_type(struct net *net,
 215                                                const struct net_device *dev,
 216                                                __be32 addr, u32 tb_id)
 217{
 218        struct flowi4           fl4 = { .daddr = addr };
 219        struct fib_result       res;
 220        unsigned int ret = RTN_BROADCAST;
 221        struct fib_table *table;
 222
 223        if (ipv4_is_zeronet(addr) || ipv4_is_lbcast(addr))
 224                return RTN_BROADCAST;
 225        if (ipv4_is_multicast(addr))
 226                return RTN_MULTICAST;
 227
 228        rcu_read_lock();
 229
 230        table = fib_get_table(net, tb_id);
 231        if (table) {
 232                ret = RTN_UNICAST;
 233                if (!fib_table_lookup(table, &fl4, &res, FIB_LOOKUP_NOREF)) {
 234                        if (!dev || dev == res.fi->fib_dev)
 235                                ret = res.type;
 236                }
 237        }
 238
 239        rcu_read_unlock();
 240        return ret;
 241}
 242
 243unsigned int inet_addr_type_table(struct net *net, __be32 addr, u32 tb_id)
 244{
 245        return __inet_dev_addr_type(net, NULL, addr, tb_id);
 246}
 247EXPORT_SYMBOL(inet_addr_type_table);
 248
 249unsigned int inet_addr_type(struct net *net, __be32 addr)
 250{
 251        return __inet_dev_addr_type(net, NULL, addr, RT_TABLE_LOCAL);
 252}
 253EXPORT_SYMBOL(inet_addr_type);
 254
 255unsigned int inet_dev_addr_type(struct net *net, const struct net_device *dev,
 256                                __be32 addr)
 257{
 258        u32 rt_table = vrf_dev_table(dev) ? : RT_TABLE_LOCAL;
 259
 260        return __inet_dev_addr_type(net, dev, addr, rt_table);
 261}
 262EXPORT_SYMBOL(inet_dev_addr_type);
 263
 264/* inet_addr_type with dev == NULL but using the table from a dev
 265 * if one is associated
 266 */
 267unsigned int inet_addr_type_dev_table(struct net *net,
 268                                      const struct net_device *dev,
 269                                      __be32 addr)
 270{
 271        u32 rt_table = vrf_dev_table(dev) ? : RT_TABLE_LOCAL;
 272
 273        return __inet_dev_addr_type(net, NULL, addr, rt_table);
 274}
 275EXPORT_SYMBOL(inet_addr_type_dev_table);
 276
 277__be32 fib_compute_spec_dst(struct sk_buff *skb)
 278{
 279        struct net_device *dev = skb->dev;
 280        struct in_device *in_dev;
 281        struct fib_result res;
 282        struct rtable *rt;
 283        struct flowi4 fl4;
 284        struct net *net;
 285        int scope;
 286
 287        rt = skb_rtable(skb);
 288        if ((rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST | RTCF_LOCAL)) ==
 289            RTCF_LOCAL)
 290                return ip_hdr(skb)->daddr;
 291
 292        in_dev = __in_dev_get_rcu(dev);
 293        BUG_ON(!in_dev);
 294
 295        net = dev_net(dev);
 296
 297        scope = RT_SCOPE_UNIVERSE;
 298        if (!ipv4_is_zeronet(ip_hdr(skb)->saddr)) {
 299                fl4.flowi4_oif = 0;
 300                fl4.flowi4_iif = LOOPBACK_IFINDEX;
 301                fl4.daddr = ip_hdr(skb)->saddr;
 302                fl4.saddr = 0;
 303                fl4.flowi4_tos = RT_TOS(ip_hdr(skb)->tos);
 304                fl4.flowi4_scope = scope;
 305                fl4.flowi4_mark = IN_DEV_SRC_VMARK(in_dev) ? skb->mark : 0;
 306                fl4.flowi4_tun_key.tun_id = 0;
 307                if (!fib_lookup(net, &fl4, &res, 0))
 308                        return FIB_RES_PREFSRC(net, res);
 309        } else {
 310                scope = RT_SCOPE_LINK;
 311        }
 312
 313        return inet_select_addr(dev, ip_hdr(skb)->saddr, scope);
 314}
 315
 316/* Given (packet source, input interface) and optional (dst, oif, tos):
 317 * - (main) check, that source is valid i.e. not broadcast or our local
 318 *   address.
 319 * - figure out what "logical" interface this packet arrived
 320 *   and calculate "specific destination" address.
 321 * - check, that packet arrived from expected physical interface.
 322 * called with rcu_read_lock()
 323 */
 324static int __fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst,
 325                                 u8 tos, int oif, struct net_device *dev,
 326                                 int rpf, struct in_device *idev, u32 *itag)
 327{
 328        int ret, no_addr;
 329        struct fib_result res;
 330        struct flowi4 fl4;
 331        struct net *net;
 332        bool dev_match;
 333
 334        fl4.flowi4_oif = 0;
 335        fl4.flowi4_iif = vrf_master_ifindex_rcu(dev);
 336        if (!fl4.flowi4_iif)
 337                fl4.flowi4_iif = oif ? : LOOPBACK_IFINDEX;
 338        fl4.daddr = src;
 339        fl4.saddr = dst;
 340        fl4.flowi4_tos = tos;
 341        fl4.flowi4_scope = RT_SCOPE_UNIVERSE;
 342        fl4.flowi4_tun_key.tun_id = 0;
 343        fl4.flowi4_flags = 0;
 344
 345        no_addr = idev->ifa_list == NULL;
 346
 347        fl4.flowi4_mark = IN_DEV_SRC_VMARK(idev) ? skb->mark : 0;
 348
 349        trace_fib_validate_source(dev, &fl4);
 350
 351        net = dev_net(dev);
 352        if (fib_lookup(net, &fl4, &res, 0))
 353                goto last_resort;
 354        if (res.type != RTN_UNICAST &&
 355            (res.type != RTN_LOCAL || !IN_DEV_ACCEPT_LOCAL(idev)))
 356                goto e_inval;
 357        if (!rpf && !fib_num_tclassid_users(dev_net(dev)) &&
 358            (dev->ifindex != oif || !IN_DEV_TX_REDIRECTS(idev)))
 359                goto last_resort;
 360        fib_combine_itag(itag, &res);
 361        dev_match = false;
 362
 363#ifdef CONFIG_IP_ROUTE_MULTIPATH
 364        for (ret = 0; ret < res.fi->fib_nhs; ret++) {
 365                struct fib_nh *nh = &res.fi->fib_nh[ret];
 366
 367                if (nh->nh_dev == dev) {
 368                        dev_match = true;
 369                        break;
 370                } else if (vrf_master_ifindex_rcu(nh->nh_dev) == dev->ifindex) {
 371                        dev_match = true;
 372                        break;
 373                }
 374        }
 375#else
 376        if (FIB_RES_DEV(res) == dev)
 377                dev_match = true;
 378#endif
 379        if (dev_match) {
 380                ret = FIB_RES_NH(res).nh_scope >= RT_SCOPE_HOST;
 381                return ret;
 382        }
 383        if (no_addr)
 384                goto last_resort;
 385        if (rpf == 1)
 386                goto e_rpf;
 387        fl4.flowi4_oif = dev->ifindex;
 388
 389        ret = 0;
 390        if (fib_lookup(net, &fl4, &res, FIB_LOOKUP_IGNORE_LINKSTATE) == 0) {
 391                if (res.type == RTN_UNICAST)
 392                        ret = FIB_RES_NH(res).nh_scope >= RT_SCOPE_HOST;
 393        }
 394        return ret;
 395
 396last_resort:
 397        if (rpf)
 398                goto e_rpf;
 399        *itag = 0;
 400        return 0;
 401
 402e_inval:
 403        return -EINVAL;
 404e_rpf:
 405        return -EXDEV;
 406}
 407
 408/* Ignore rp_filter for packets protected by IPsec. */
 409int fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst,
 410                        u8 tos, int oif, struct net_device *dev,
 411                        struct in_device *idev, u32 *itag)
 412{
 413        int r = secpath_exists(skb) ? 0 : IN_DEV_RPFILTER(idev);
 414
 415        if (!r && !fib_num_tclassid_users(dev_net(dev)) &&
 416            IN_DEV_ACCEPT_LOCAL(idev) &&
 417            (dev->ifindex != oif || !IN_DEV_TX_REDIRECTS(idev))) {
 418                *itag = 0;
 419                return 0;
 420        }
 421        return __fib_validate_source(skb, src, dst, tos, oif, dev, r, idev, itag);
 422}
 423
 424static inline __be32 sk_extract_addr(struct sockaddr *addr)
 425{
 426        return ((struct sockaddr_in *) addr)->sin_addr.s_addr;
 427}
 428
 429static int put_rtax(struct nlattr *mx, int len, int type, u32 value)
 430{
 431        struct nlattr *nla;
 432
 433        nla = (struct nlattr *) ((char *) mx + len);
 434        nla->nla_type = type;
 435        nla->nla_len = nla_attr_size(4);
 436        *(u32 *) nla_data(nla) = value;
 437
 438        return len + nla_total_size(4);
 439}
 440
 441static int rtentry_to_fib_config(struct net *net, int cmd, struct rtentry *rt,
 442                                 struct fib_config *cfg)
 443{
 444        __be32 addr;
 445        int plen;
 446
 447        memset(cfg, 0, sizeof(*cfg));
 448        cfg->fc_nlinfo.nl_net = net;
 449
 450        if (rt->rt_dst.sa_family != AF_INET)
 451                return -EAFNOSUPPORT;
 452
 453        /*
 454         * Check mask for validity:
 455         * a) it must be contiguous.
 456         * b) destination must have all host bits clear.
 457         * c) if application forgot to set correct family (AF_INET),
 458         *    reject request unless it is absolutely clear i.e.
 459         *    both family and mask are zero.
 460         */
 461        plen = 32;
 462        addr = sk_extract_addr(&rt->rt_dst);
 463        if (!(rt->rt_flags & RTF_HOST)) {
 464                __be32 mask = sk_extract_addr(&rt->rt_genmask);
 465
 466                if (rt->rt_genmask.sa_family != AF_INET) {
 467                        if (mask || rt->rt_genmask.sa_family)
 468                                return -EAFNOSUPPORT;
 469                }
 470
 471                if (bad_mask(mask, addr))
 472                        return -EINVAL;
 473
 474                plen = inet_mask_len(mask);
 475        }
 476
 477        cfg->fc_dst_len = plen;
 478        cfg->fc_dst = addr;
 479
 480        if (cmd != SIOCDELRT) {
 481                cfg->fc_nlflags = NLM_F_CREATE;
 482                cfg->fc_protocol = RTPROT_BOOT;
 483        }
 484
 485        if (rt->rt_metric)
 486                cfg->fc_priority = rt->rt_metric - 1;
 487
 488        if (rt->rt_flags & RTF_REJECT) {
 489                cfg->fc_scope = RT_SCOPE_HOST;
 490                cfg->fc_type = RTN_UNREACHABLE;
 491                return 0;
 492        }
 493
 494        cfg->fc_scope = RT_SCOPE_NOWHERE;
 495        cfg->fc_type = RTN_UNICAST;
 496
 497        if (rt->rt_dev) {
 498                char *colon;
 499                struct net_device *dev;
 500                char devname[IFNAMSIZ];
 501
 502                if (copy_from_user(devname, rt->rt_dev, IFNAMSIZ-1))
 503                        return -EFAULT;
 504
 505                devname[IFNAMSIZ-1] = 0;
 506                colon = strchr(devname, ':');
 507                if (colon)
 508                        *colon = 0;
 509                dev = __dev_get_by_name(net, devname);
 510                if (!dev)
 511                        return -ENODEV;
 512                cfg->fc_oif = dev->ifindex;
 513                if (colon) {
 514                        struct in_ifaddr *ifa;
 515                        struct in_device *in_dev = __in_dev_get_rtnl(dev);
 516                        if (!in_dev)
 517                                return -ENODEV;
 518                        *colon = ':';
 519                        for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next)
 520                                if (strcmp(ifa->ifa_label, devname) == 0)
 521                                        break;
 522                        if (!ifa)
 523                                return -ENODEV;
 524                        cfg->fc_prefsrc = ifa->ifa_local;
 525                }
 526        }
 527
 528        addr = sk_extract_addr(&rt->rt_gateway);
 529        if (rt->rt_gateway.sa_family == AF_INET && addr) {
 530                unsigned int addr_type;
 531
 532                cfg->fc_gw = addr;
 533                addr_type = inet_addr_type_table(net, addr, cfg->fc_table);
 534                if (rt->rt_flags & RTF_GATEWAY &&
 535                    addr_type == RTN_UNICAST)
 536                        cfg->fc_scope = RT_SCOPE_UNIVERSE;
 537        }
 538
 539        if (cmd == SIOCDELRT)
 540                return 0;
 541
 542        if (rt->rt_flags & RTF_GATEWAY && !cfg->fc_gw)
 543                return -EINVAL;
 544
 545        if (cfg->fc_scope == RT_SCOPE_NOWHERE)
 546                cfg->fc_scope = RT_SCOPE_LINK;
 547
 548        if (rt->rt_flags & (RTF_MTU | RTF_WINDOW | RTF_IRTT)) {
 549                struct nlattr *mx;
 550                int len = 0;
 551
 552                mx = kzalloc(3 * nla_total_size(4), GFP_KERNEL);
 553                if (!mx)
 554                        return -ENOMEM;
 555
 556                if (rt->rt_flags & RTF_MTU)
 557                        len = put_rtax(mx, len, RTAX_ADVMSS, rt->rt_mtu - 40);
 558
 559                if (rt->rt_flags & RTF_WINDOW)
 560                        len = put_rtax(mx, len, RTAX_WINDOW, rt->rt_window);
 561
 562                if (rt->rt_flags & RTF_IRTT)
 563                        len = put_rtax(mx, len, RTAX_RTT, rt->rt_irtt << 3);
 564
 565                cfg->fc_mx = mx;
 566                cfg->fc_mx_len = len;
 567        }
 568
 569        return 0;
 570}
 571
 572/*
 573 * Handle IP routing ioctl calls.
 574 * These are used to manipulate the routing tables
 575 */
 576int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg)
 577{
 578        struct fib_config cfg;
 579        struct rtentry rt;
 580        int err;
 581
 582        switch (cmd) {
 583        case SIOCADDRT:         /* Add a route */
 584        case SIOCDELRT:         /* Delete a route */
 585                if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
 586                        return -EPERM;
 587
 588                if (copy_from_user(&rt, arg, sizeof(rt)))
 589                        return -EFAULT;
 590
 591                rtnl_lock();
 592                err = rtentry_to_fib_config(net, cmd, &rt, &cfg);
 593                if (err == 0) {
 594                        struct fib_table *tb;
 595
 596                        if (cmd == SIOCDELRT) {
 597                                tb = fib_get_table(net, cfg.fc_table);
 598                                if (tb)
 599                                        err = fib_table_delete(tb, &cfg);
 600                                else
 601                                        err = -ESRCH;
 602                        } else {
 603                                tb = fib_new_table(net, cfg.fc_table);
 604                                if (tb)
 605                                        err = fib_table_insert(tb, &cfg);
 606                                else
 607                                        err = -ENOBUFS;
 608                        }
 609
 610                        /* allocated by rtentry_to_fib_config() */
 611                        kfree(cfg.fc_mx);
 612                }
 613                rtnl_unlock();
 614                return err;
 615        }
 616        return -EINVAL;
 617}
 618
 619const struct nla_policy rtm_ipv4_policy[RTA_MAX + 1] = {
 620        [RTA_DST]               = { .type = NLA_U32 },
 621        [RTA_SRC]               = { .type = NLA_U32 },
 622        [RTA_IIF]               = { .type = NLA_U32 },
 623        [RTA_OIF]               = { .type = NLA_U32 },
 624        [RTA_GATEWAY]           = { .type = NLA_U32 },
 625        [RTA_PRIORITY]          = { .type = NLA_U32 },
 626        [RTA_PREFSRC]           = { .type = NLA_U32 },
 627        [RTA_METRICS]           = { .type = NLA_NESTED },
 628        [RTA_MULTIPATH]         = { .len = sizeof(struct rtnexthop) },
 629        [RTA_FLOW]              = { .type = NLA_U32 },
 630        [RTA_ENCAP_TYPE]        = { .type = NLA_U16 },
 631        [RTA_ENCAP]             = { .type = NLA_NESTED },
 632};
 633
 634static int rtm_to_fib_config(struct net *net, struct sk_buff *skb,
 635                             struct nlmsghdr *nlh, struct fib_config *cfg)
 636{
 637        struct nlattr *attr;
 638        int err, remaining;
 639        struct rtmsg *rtm;
 640
 641        err = nlmsg_validate(nlh, sizeof(*rtm), RTA_MAX, rtm_ipv4_policy);
 642        if (err < 0)
 643                goto errout;
 644
 645        memset(cfg, 0, sizeof(*cfg));
 646
 647        rtm = nlmsg_data(nlh);
 648        cfg->fc_dst_len = rtm->rtm_dst_len;
 649        cfg->fc_tos = rtm->rtm_tos;
 650        cfg->fc_table = rtm->rtm_table;
 651        cfg->fc_protocol = rtm->rtm_protocol;
 652        cfg->fc_scope = rtm->rtm_scope;
 653        cfg->fc_type = rtm->rtm_type;
 654        cfg->fc_flags = rtm->rtm_flags;
 655        cfg->fc_nlflags = nlh->nlmsg_flags;
 656
 657        cfg->fc_nlinfo.portid = NETLINK_CB(skb).portid;
 658        cfg->fc_nlinfo.nlh = nlh;
 659        cfg->fc_nlinfo.nl_net = net;
 660
 661        if (cfg->fc_type > RTN_MAX) {
 662                err = -EINVAL;
 663                goto errout;
 664        }
 665
 666        nlmsg_for_each_attr(attr, nlh, sizeof(struct rtmsg), remaining) {
 667                switch (nla_type(attr)) {
 668                case RTA_DST:
 669                        cfg->fc_dst = nla_get_be32(attr);
 670                        break;
 671                case RTA_OIF:
 672                        cfg->fc_oif = nla_get_u32(attr);
 673                        break;
 674                case RTA_GATEWAY:
 675                        cfg->fc_gw = nla_get_be32(attr);
 676                        break;
 677                case RTA_PRIORITY:
 678                        cfg->fc_priority = nla_get_u32(attr);
 679                        break;
 680                case RTA_PREFSRC:
 681                        cfg->fc_prefsrc = nla_get_be32(attr);
 682                        break;
 683                case RTA_METRICS:
 684                        cfg->fc_mx = nla_data(attr);
 685                        cfg->fc_mx_len = nla_len(attr);
 686                        break;
 687                case RTA_MULTIPATH:
 688                        cfg->fc_mp = nla_data(attr);
 689                        cfg->fc_mp_len = nla_len(attr);
 690                        break;
 691                case RTA_FLOW:
 692                        cfg->fc_flow = nla_get_u32(attr);
 693                        break;
 694                case RTA_TABLE:
 695                        cfg->fc_table = nla_get_u32(attr);
 696                        break;
 697                case RTA_ENCAP:
 698                        cfg->fc_encap = attr;
 699                        break;
 700                case RTA_ENCAP_TYPE:
 701                        cfg->fc_encap_type = nla_get_u16(attr);
 702                        break;
 703                }
 704        }
 705
 706        return 0;
 707errout:
 708        return err;
 709}
 710
 711static int inet_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh)
 712{
 713        struct net *net = sock_net(skb->sk);
 714        struct fib_config cfg;
 715        struct fib_table *tb;
 716        int err;
 717
 718        err = rtm_to_fib_config(net, skb, nlh, &cfg);
 719        if (err < 0)
 720                goto errout;
 721
 722        tb = fib_get_table(net, cfg.fc_table);
 723        if (!tb) {
 724                err = -ESRCH;
 725                goto errout;
 726        }
 727
 728        err = fib_table_delete(tb, &cfg);
 729errout:
 730        return err;
 731}
 732
 733static int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh)
 734{
 735        struct net *net = sock_net(skb->sk);
 736        struct fib_config cfg;
 737        struct fib_table *tb;
 738        int err;
 739
 740        err = rtm_to_fib_config(net, skb, nlh, &cfg);
 741        if (err < 0)
 742                goto errout;
 743
 744        tb = fib_new_table(net, cfg.fc_table);
 745        if (!tb) {
 746                err = -ENOBUFS;
 747                goto errout;
 748        }
 749
 750        err = fib_table_insert(tb, &cfg);
 751errout:
 752        return err;
 753}
 754
 755static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
 756{
 757        struct net *net = sock_net(skb->sk);
 758        unsigned int h, s_h;
 759        unsigned int e = 0, s_e;
 760        struct fib_table *tb;
 761        struct hlist_head *head;
 762        int dumped = 0;
 763
 764        if (nlmsg_len(cb->nlh) >= sizeof(struct rtmsg) &&
 765            ((struct rtmsg *) nlmsg_data(cb->nlh))->rtm_flags & RTM_F_CLONED)
 766                return skb->len;
 767
 768        s_h = cb->args[0];
 769        s_e = cb->args[1];
 770
 771        rcu_read_lock();
 772
 773        for (h = s_h; h < FIB_TABLE_HASHSZ; h++, s_e = 0) {
 774                e = 0;
 775                head = &net->ipv4.fib_table_hash[h];
 776                hlist_for_each_entry_rcu(tb, head, tb_hlist) {
 777                        if (e < s_e)
 778                                goto next;
 779                        if (dumped)
 780                                memset(&cb->args[2], 0, sizeof(cb->args) -
 781                                                 2 * sizeof(cb->args[0]));
 782                        if (fib_table_dump(tb, skb, cb) < 0)
 783                                goto out;
 784                        dumped = 1;
 785next:
 786                        e++;
 787                }
 788        }
 789out:
 790        rcu_read_unlock();
 791
 792        cb->args[1] = e;
 793        cb->args[0] = h;
 794
 795        return skb->len;
 796}
 797
 798/* Prepare and feed intra-kernel routing request.
 799 * Really, it should be netlink message, but :-( netlink
 800 * can be not configured, so that we feed it directly
 801 * to fib engine. It is legal, because all events occur
 802 * only when netlink is already locked.
 803 */
 804static void fib_magic(int cmd, int type, __be32 dst, int dst_len, struct in_ifaddr *ifa)
 805{
 806        struct net *net = dev_net(ifa->ifa_dev->dev);
 807        u32 tb_id = vrf_dev_table_rtnl(ifa->ifa_dev->dev);
 808        struct fib_table *tb;
 809        struct fib_config cfg = {
 810                .fc_protocol = RTPROT_KERNEL,
 811                .fc_type = type,
 812                .fc_dst = dst,
 813                .fc_dst_len = dst_len,
 814                .fc_prefsrc = ifa->ifa_local,
 815                .fc_oif = ifa->ifa_dev->dev->ifindex,
 816                .fc_nlflags = NLM_F_CREATE | NLM_F_APPEND,
 817                .fc_nlinfo = {
 818                        .nl_net = net,
 819                },
 820        };
 821
 822        if (!tb_id)
 823                tb_id = (type == RTN_UNICAST) ? RT_TABLE_MAIN : RT_TABLE_LOCAL;
 824
 825        tb = fib_new_table(net, tb_id);
 826        if (!tb)
 827                return;
 828
 829        cfg.fc_table = tb->tb_id;
 830
 831        if (type != RTN_LOCAL)
 832                cfg.fc_scope = RT_SCOPE_LINK;
 833        else
 834                cfg.fc_scope = RT_SCOPE_HOST;
 835
 836        if (cmd == RTM_NEWROUTE)
 837                fib_table_insert(tb, &cfg);
 838        else
 839                fib_table_delete(tb, &cfg);
 840}
 841
 842void fib_add_ifaddr(struct in_ifaddr *ifa)
 843{
 844        struct in_device *in_dev = ifa->ifa_dev;
 845        struct net_device *dev = in_dev->dev;
 846        struct in_ifaddr *prim = ifa;
 847        __be32 mask = ifa->ifa_mask;
 848        __be32 addr = ifa->ifa_local;
 849        __be32 prefix = ifa->ifa_address & mask;
 850
 851        if (ifa->ifa_flags & IFA_F_SECONDARY) {
 852                prim = inet_ifa_byprefix(in_dev, prefix, mask);
 853                if (!prim) {
 854                        pr_warn("%s: bug: prim == NULL\n", __func__);
 855                        return;
 856                }
 857        }
 858
 859        fib_magic(RTM_NEWROUTE, RTN_LOCAL, addr, 32, prim);
 860
 861        if (!(dev->flags & IFF_UP))
 862                return;
 863
 864        /* Add broadcast address, if it is explicitly assigned. */
 865        if (ifa->ifa_broadcast && ifa->ifa_broadcast != htonl(0xFFFFFFFF))
 866                fib_magic(RTM_NEWROUTE, RTN_BROADCAST, ifa->ifa_broadcast, 32, prim);
 867
 868        if (!ipv4_is_zeronet(prefix) && !(ifa->ifa_flags & IFA_F_SECONDARY) &&
 869            (prefix != addr || ifa->ifa_prefixlen < 32)) {
 870                fib_magic(RTM_NEWROUTE,
 871                          dev->flags & IFF_LOOPBACK ? RTN_LOCAL : RTN_UNICAST,
 872                          prefix, ifa->ifa_prefixlen, prim);
 873
 874                /* Add network specific broadcasts, when it takes a sense */
 875                if (ifa->ifa_prefixlen < 31) {
 876                        fib_magic(RTM_NEWROUTE, RTN_BROADCAST, prefix, 32, prim);
 877                        fib_magic(RTM_NEWROUTE, RTN_BROADCAST, prefix | ~mask,
 878                                  32, prim);
 879                }
 880        }
 881}
 882
 883/* Delete primary or secondary address.
 884 * Optionally, on secondary address promotion consider the addresses
 885 * from subnet iprim as deleted, even if they are in device list.
 886 * In this case the secondary ifa can be in device list.
 887 */
 888void fib_del_ifaddr(struct in_ifaddr *ifa, struct in_ifaddr *iprim)
 889{
 890        struct in_device *in_dev = ifa->ifa_dev;
 891        struct net_device *dev = in_dev->dev;
 892        struct in_ifaddr *ifa1;
 893        struct in_ifaddr *prim = ifa, *prim1 = NULL;
 894        __be32 brd = ifa->ifa_address | ~ifa->ifa_mask;
 895        __be32 any = ifa->ifa_address & ifa->ifa_mask;
 896#define LOCAL_OK        1
 897#define BRD_OK          2
 898#define BRD0_OK         4
 899#define BRD1_OK         8
 900        unsigned int ok = 0;
 901        int subnet = 0;         /* Primary network */
 902        int gone = 1;           /* Address is missing */
 903        int same_prefsrc = 0;   /* Another primary with same IP */
 904
 905        if (ifa->ifa_flags & IFA_F_SECONDARY) {
 906                prim = inet_ifa_byprefix(in_dev, any, ifa->ifa_mask);
 907                if (!prim) {
 908                        pr_warn("%s: bug: prim == NULL\n", __func__);
 909                        return;
 910                }
 911                if (iprim && iprim != prim) {
 912                        pr_warn("%s: bug: iprim != prim\n", __func__);
 913                        return;
 914                }
 915        } else if (!ipv4_is_zeronet(any) &&
 916                   (any != ifa->ifa_local || ifa->ifa_prefixlen < 32)) {
 917                fib_magic(RTM_DELROUTE,
 918                          dev->flags & IFF_LOOPBACK ? RTN_LOCAL : RTN_UNICAST,
 919                          any, ifa->ifa_prefixlen, prim);
 920                subnet = 1;
 921        }
 922
 923        /* Deletion is more complicated than add.
 924         * We should take care of not to delete too much :-)
 925         *
 926         * Scan address list to be sure that addresses are really gone.
 927         */
 928
 929        for (ifa1 = in_dev->ifa_list; ifa1; ifa1 = ifa1->ifa_next) {
 930                if (ifa1 == ifa) {
 931                        /* promotion, keep the IP */
 932                        gone = 0;
 933                        continue;
 934                }
 935                /* Ignore IFAs from our subnet */
 936                if (iprim && ifa1->ifa_mask == iprim->ifa_mask &&
 937                    inet_ifa_match(ifa1->ifa_address, iprim))
 938                        continue;
 939
 940                /* Ignore ifa1 if it uses different primary IP (prefsrc) */
 941                if (ifa1->ifa_flags & IFA_F_SECONDARY) {
 942                        /* Another address from our subnet? */
 943                        if (ifa1->ifa_mask == prim->ifa_mask &&
 944                            inet_ifa_match(ifa1->ifa_address, prim))
 945                                prim1 = prim;
 946                        else {
 947                                /* We reached the secondaries, so
 948                                 * same_prefsrc should be determined.
 949                                 */
 950                                if (!same_prefsrc)
 951                                        continue;
 952                                /* Search new prim1 if ifa1 is not
 953                                 * using the current prim1
 954                                 */
 955                                if (!prim1 ||
 956                                    ifa1->ifa_mask != prim1->ifa_mask ||
 957                                    !inet_ifa_match(ifa1->ifa_address, prim1))
 958                                        prim1 = inet_ifa_byprefix(in_dev,
 959                                                        ifa1->ifa_address,
 960                                                        ifa1->ifa_mask);
 961                                if (!prim1)
 962                                        continue;
 963                                if (prim1->ifa_local != prim->ifa_local)
 964                                        continue;
 965                        }
 966                } else {
 967                        if (prim->ifa_local != ifa1->ifa_local)
 968                                continue;
 969                        prim1 = ifa1;
 970                        if (prim != prim1)
 971                                same_prefsrc = 1;
 972                }
 973                if (ifa->ifa_local == ifa1->ifa_local)
 974                        ok |= LOCAL_OK;
 975                if (ifa->ifa_broadcast == ifa1->ifa_broadcast)
 976                        ok |= BRD_OK;
 977                if (brd == ifa1->ifa_broadcast)
 978                        ok |= BRD1_OK;
 979                if (any == ifa1->ifa_broadcast)
 980                        ok |= BRD0_OK;
 981                /* primary has network specific broadcasts */
 982                if (prim1 == ifa1 && ifa1->ifa_prefixlen < 31) {
 983                        __be32 brd1 = ifa1->ifa_address | ~ifa1->ifa_mask;
 984                        __be32 any1 = ifa1->ifa_address & ifa1->ifa_mask;
 985
 986                        if (!ipv4_is_zeronet(any1)) {
 987                                if (ifa->ifa_broadcast == brd1 ||
 988                                    ifa->ifa_broadcast == any1)
 989                                        ok |= BRD_OK;
 990                                if (brd == brd1 || brd == any1)
 991                                        ok |= BRD1_OK;
 992                                if (any == brd1 || any == any1)
 993                                        ok |= BRD0_OK;
 994                        }
 995                }
 996        }
 997
 998        if (!(ok & BRD_OK))
 999                fib_magic(RTM_DELROUTE, RTN_BROADCAST, ifa->ifa_broadcast, 32, prim);
1000        if (subnet && ifa->ifa_prefixlen < 31) {
1001                if (!(ok & BRD1_OK))
1002                        fib_magic(RTM_DELROUTE, RTN_BROADCAST, brd, 32, prim);
1003                if (!(ok & BRD0_OK))
1004                        fib_magic(RTM_DELROUTE, RTN_BROADCAST, any, 32, prim);
1005        }
1006        if (!(ok & LOCAL_OK)) {
1007                unsigned int addr_type;
1008
1009                fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 32, prim);
1010
1011                /* Check, that this local address finally disappeared. */
1012                addr_type = inet_addr_type_dev_table(dev_net(dev), dev,
1013                                                     ifa->ifa_local);
1014                if (gone && addr_type != RTN_LOCAL) {
1015                        /* And the last, but not the least thing.
1016                         * We must flush stray FIB entries.
1017                         *
1018                         * First of all, we scan fib_info list searching
1019                         * for stray nexthop entries, then ignite fib_flush.
1020                         */
1021                        if (fib_sync_down_addr(dev_net(dev), ifa->ifa_local))
1022                                fib_flush(dev_net(dev));
1023                }
1024        }
1025#undef LOCAL_OK
1026#undef BRD_OK
1027#undef BRD0_OK
1028#undef BRD1_OK
1029}
1030
1031static void nl_fib_lookup(struct net *net, struct fib_result_nl *frn)
1032{
1033
1034        struct fib_result       res;
1035        struct flowi4           fl4 = {
1036                .flowi4_mark = frn->fl_mark,
1037                .daddr = frn->fl_addr,
1038                .flowi4_tos = frn->fl_tos,
1039                .flowi4_scope = frn->fl_scope,
1040        };
1041        struct fib_table *tb;
1042
1043        rcu_read_lock();
1044
1045        tb = fib_get_table(net, frn->tb_id_in);
1046
1047        frn->err = -ENOENT;
1048        if (tb) {
1049                local_bh_disable();
1050
1051                frn->tb_id = tb->tb_id;
1052                frn->err = fib_table_lookup(tb, &fl4, &res, FIB_LOOKUP_NOREF);
1053
1054                if (!frn->err) {
1055                        frn->prefixlen = res.prefixlen;
1056                        frn->nh_sel = res.nh_sel;
1057                        frn->type = res.type;
1058                        frn->scope = res.scope;
1059                }
1060                local_bh_enable();
1061        }
1062
1063        rcu_read_unlock();
1064}
1065
1066static void nl_fib_input(struct sk_buff *skb)
1067{
1068        struct net *net;
1069        struct fib_result_nl *frn;
1070        struct nlmsghdr *nlh;
1071        u32 portid;
1072
1073        net = sock_net(skb->sk);
1074        nlh = nlmsg_hdr(skb);
1075        if (skb->len < NLMSG_HDRLEN || skb->len < nlh->nlmsg_len ||
1076            nlmsg_len(nlh) < sizeof(*frn))
1077                return;
1078
1079        skb = netlink_skb_clone(skb, GFP_KERNEL);
1080        if (!skb)
1081                return;
1082        nlh = nlmsg_hdr(skb);
1083
1084        frn = (struct fib_result_nl *) nlmsg_data(nlh);
1085        nl_fib_lookup(net, frn);
1086
1087        portid = NETLINK_CB(skb).portid;      /* netlink portid */
1088        NETLINK_CB(skb).portid = 0;        /* from kernel */
1089        NETLINK_CB(skb).dst_group = 0;  /* unicast */
1090        netlink_unicast(net->ipv4.fibnl, skb, portid, MSG_DONTWAIT);
1091}
1092
1093static int __net_init nl_fib_lookup_init(struct net *net)
1094{
1095        struct sock *sk;
1096        struct netlink_kernel_cfg cfg = {
1097                .input  = nl_fib_input,
1098        };
1099
1100        sk = netlink_kernel_create(net, NETLINK_FIB_LOOKUP, &cfg);
1101        if (!sk)
1102                return -EAFNOSUPPORT;
1103        net->ipv4.fibnl = sk;
1104        return 0;
1105}
1106
1107static void nl_fib_lookup_exit(struct net *net)
1108{
1109        netlink_kernel_release(net->ipv4.fibnl);
1110        net->ipv4.fibnl = NULL;
1111}
1112
1113static void fib_disable_ip(struct net_device *dev, unsigned long event)
1114{
1115        if (fib_sync_down_dev(dev, event))
1116                fib_flush(dev_net(dev));
1117        rt_cache_flush(dev_net(dev));
1118        arp_ifdown(dev);
1119}
1120
1121static int fib_inetaddr_event(struct notifier_block *this, unsigned long event, void *ptr)
1122{
1123        struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
1124        struct net_device *dev = ifa->ifa_dev->dev;
1125        struct net *net = dev_net(dev);
1126
1127        switch (event) {
1128        case NETDEV_UP:
1129                fib_add_ifaddr(ifa);
1130#ifdef CONFIG_IP_ROUTE_MULTIPATH
1131                fib_sync_up(dev, RTNH_F_DEAD);
1132#endif
1133                atomic_inc(&net->ipv4.dev_addr_genid);
1134                rt_cache_flush(dev_net(dev));
1135                break;
1136        case NETDEV_DOWN:
1137                fib_del_ifaddr(ifa, NULL);
1138                atomic_inc(&net->ipv4.dev_addr_genid);
1139                if (!ifa->ifa_dev->ifa_list) {
1140                        /* Last address was deleted from this interface.
1141                         * Disable IP.
1142                         */
1143                        fib_disable_ip(dev, event);
1144                } else {
1145                        rt_cache_flush(dev_net(dev));
1146                }
1147                break;
1148        }
1149        return NOTIFY_DONE;
1150}
1151
1152static int fib_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1153{
1154        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1155        struct in_device *in_dev;
1156        struct net *net = dev_net(dev);
1157        unsigned int flags;
1158
1159        if (event == NETDEV_UNREGISTER) {
1160                fib_disable_ip(dev, event);
1161                rt_flush_dev(dev);
1162                return NOTIFY_DONE;
1163        }
1164
1165        in_dev = __in_dev_get_rtnl(dev);
1166        if (!in_dev)
1167                return NOTIFY_DONE;
1168
1169        switch (event) {
1170        case NETDEV_UP:
1171                for_ifa(in_dev) {
1172                        fib_add_ifaddr(ifa);
1173                } endfor_ifa(in_dev);
1174#ifdef CONFIG_IP_ROUTE_MULTIPATH
1175                fib_sync_up(dev, RTNH_F_DEAD);
1176#endif
1177                atomic_inc(&net->ipv4.dev_addr_genid);
1178                rt_cache_flush(net);
1179                break;
1180        case NETDEV_DOWN:
1181                fib_disable_ip(dev, event);
1182                break;
1183        case NETDEV_CHANGE:
1184                flags = dev_get_flags(dev);
1185                if (flags & (IFF_RUNNING | IFF_LOWER_UP))
1186                        fib_sync_up(dev, RTNH_F_LINKDOWN);
1187                else
1188                        fib_sync_down_dev(dev, event);
1189                /* fall through */
1190        case NETDEV_CHANGEMTU:
1191                rt_cache_flush(net);
1192                break;
1193        }
1194        return NOTIFY_DONE;
1195}
1196
1197static struct notifier_block fib_inetaddr_notifier = {
1198        .notifier_call = fib_inetaddr_event,
1199};
1200
1201static struct notifier_block fib_netdev_notifier = {
1202        .notifier_call = fib_netdev_event,
1203};
1204
1205static int __net_init ip_fib_net_init(struct net *net)
1206{
1207        int err;
1208        size_t size = sizeof(struct hlist_head) * FIB_TABLE_HASHSZ;
1209
1210        /* Avoid false sharing : Use at least a full cache line */
1211        size = max_t(size_t, size, L1_CACHE_BYTES);
1212
1213        net->ipv4.fib_table_hash = kzalloc(size, GFP_KERNEL);
1214        if (!net->ipv4.fib_table_hash)
1215                return -ENOMEM;
1216
1217        err = fib4_rules_init(net);
1218        if (err < 0)
1219                goto fail;
1220        return 0;
1221
1222fail:
1223        kfree(net->ipv4.fib_table_hash);
1224        return err;
1225}
1226
1227static void ip_fib_net_exit(struct net *net)
1228{
1229        unsigned int i;
1230
1231        rtnl_lock();
1232#ifdef CONFIG_IP_MULTIPLE_TABLES
1233        RCU_INIT_POINTER(net->ipv4.fib_local, NULL);
1234        RCU_INIT_POINTER(net->ipv4.fib_main, NULL);
1235        RCU_INIT_POINTER(net->ipv4.fib_default, NULL);
1236#endif
1237        for (i = 0; i < FIB_TABLE_HASHSZ; i++) {
1238                struct hlist_head *head = &net->ipv4.fib_table_hash[i];
1239                struct hlist_node *tmp;
1240                struct fib_table *tb;
1241
1242                hlist_for_each_entry_safe(tb, tmp, head, tb_hlist) {
1243                        hlist_del(&tb->tb_hlist);
1244                        fib_table_flush(tb);
1245                        fib_free_table(tb);
1246                }
1247        }
1248
1249#ifdef CONFIG_IP_MULTIPLE_TABLES
1250        fib4_rules_exit(net);
1251#endif
1252        rtnl_unlock();
1253        kfree(net->ipv4.fib_table_hash);
1254}
1255
1256static int __net_init fib_net_init(struct net *net)
1257{
1258        int error;
1259
1260#ifdef CONFIG_IP_ROUTE_CLASSID
1261        net->ipv4.fib_num_tclassid_users = 0;
1262#endif
1263        error = ip_fib_net_init(net);
1264        if (error < 0)
1265                goto out;
1266        error = nl_fib_lookup_init(net);
1267        if (error < 0)
1268                goto out_nlfl;
1269        error = fib_proc_init(net);
1270        if (error < 0)
1271                goto out_proc;
1272out:
1273        return error;
1274
1275out_proc:
1276        nl_fib_lookup_exit(net);
1277out_nlfl:
1278        ip_fib_net_exit(net);
1279        goto out;
1280}
1281
1282static void __net_exit fib_net_exit(struct net *net)
1283{
1284        fib_proc_exit(net);
1285        nl_fib_lookup_exit(net);
1286        ip_fib_net_exit(net);
1287}
1288
1289static struct pernet_operations fib_net_ops = {
1290        .init = fib_net_init,
1291        .exit = fib_net_exit,
1292};
1293
1294void __init ip_fib_init(void)
1295{
1296        rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL, NULL);
1297        rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL, NULL);
1298        rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib, NULL);
1299
1300        register_pernet_subsys(&fib_net_ops);
1301        register_netdevice_notifier(&fib_netdev_notifier);
1302        register_inetaddr_notifier(&fib_inetaddr_notifier);
1303
1304        fib_trie_init();
1305}
1306