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