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