xref: /linux/net/ipv4/devinet.c (revision 0e59523b440c90ed1899476f32ad4e949282f43e)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *	NET3	IP device support routines.
4  *
5  *	Derived from the IP parts of dev.c 1.0.19
6  * 		Authors:	Ross Biro
7  *				Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
8  *				Mark Evans, <evansmp@uhura.aston.ac.uk>
9  *
10  *	Additional Authors:
11  *		Alan Cox, <gw4pts@gw4pts.ampr.org>
12  *		Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
13  *
14  *	Changes:
15  *		Alexey Kuznetsov:	pa_* fields are replaced with ifaddr
16  *					lists.
17  *		Cyrus Durgin:		updated for kmod
18  *		Matthias Andree:	in devinet_ioctl, compare label and
19  *					address (4.4BSD alias style support),
20  *					fall back to comparing just the label
21  *					if no match found.
22  */
23 
24 
25 #include <linux/uaccess.h>
26 #include <linux/bitops.h>
27 #include <linux/capability.h>
28 #include <linux/module.h>
29 #include <linux/types.h>
30 #include <linux/kernel.h>
31 #include <linux/sched/signal.h>
32 #include <linux/string.h>
33 #include <linux/mm.h>
34 #include <linux/socket.h>
35 #include <linux/sockios.h>
36 #include <linux/in.h>
37 #include <linux/errno.h>
38 #include <linux/interrupt.h>
39 #include <linux/if_addr.h>
40 #include <linux/if_ether.h>
41 #include <linux/inet.h>
42 #include <linux/netdevice.h>
43 #include <linux/etherdevice.h>
44 #include <linux/skbuff.h>
45 #include <linux/init.h>
46 #include <linux/notifier.h>
47 #include <linux/inetdevice.h>
48 #include <linux/igmp.h>
49 #include "igmp_internal.h"
50 #include <linux/slab.h>
51 #include <linux/hash.h>
52 #ifdef CONFIG_SYSCTL
53 #include <linux/sysctl.h>
54 #endif
55 #include <linux/kmod.h>
56 #include <linux/netconf.h>
57 
58 #include <net/arp.h>
59 #include <net/ip.h>
60 #include <net/route.h>
61 #include <net/ip_fib.h>
62 #include <net/rtnetlink.h>
63 #include <net/net_namespace.h>
64 #include <net/addrconf.h>
65 
66 #define IPV6ONLY_FLAGS	\
67 		(IFA_F_NODAD | IFA_F_OPTIMISTIC | IFA_F_DADFAILED | \
68 		 IFA_F_HOMEADDRESS | IFA_F_TENTATIVE | \
69 		 IFA_F_MANAGETEMPADDR | IFA_F_STABLE_PRIVACY)
70 
71 static struct ipv4_devconf ipv4_devconf = {
72 	.data = {
73 		[IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1,
74 		[IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1,
75 		[IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1,
76 		[IPV4_DEVCONF_SHARED_MEDIA - 1] = 1,
77 		[IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL - 1] = 10000 /*ms*/,
78 		[IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL - 1] =  1000 /*ms*/,
79 		[IPV4_DEVCONF_ARP_EVICT_NOCARRIER - 1] = 1,
80 	},
81 };
82 
83 static struct ipv4_devconf ipv4_devconf_dflt = {
84 	.data = {
85 		[IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1,
86 		[IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1,
87 		[IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1,
88 		[IPV4_DEVCONF_SHARED_MEDIA - 1] = 1,
89 		[IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE - 1] = 1,
90 		[IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL - 1] = 10000 /*ms*/,
91 		[IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL - 1] =  1000 /*ms*/,
92 		[IPV4_DEVCONF_ARP_EVICT_NOCARRIER - 1] = 1,
93 	},
94 };
95 
96 #define IPV4_DEVCONF_DFLT(net, attr) \
97 	IPV4_DEVCONF((*net->ipv4.devconf_dflt), attr)
98 
99 static const struct nla_policy ifa_ipv4_policy[IFA_MAX+1] = {
100 	[IFA_LOCAL]     	= { .type = NLA_U32 },
101 	[IFA_ADDRESS]   	= { .type = NLA_U32 },
102 	[IFA_BROADCAST] 	= { .type = NLA_U32 },
103 	[IFA_LABEL]     	= { .type = NLA_STRING, .len = IFNAMSIZ - 1 },
104 	[IFA_CACHEINFO]		= { .len = sizeof(struct ifa_cacheinfo) },
105 	[IFA_FLAGS]		= { .type = NLA_U32 },
106 	[IFA_RT_PRIORITY]	= { .type = NLA_U32 },
107 	[IFA_TARGET_NETNSID]	= { .type = NLA_S32 },
108 	[IFA_PROTO]		= { .type = NLA_U8 },
109 };
110 
111 #define IN4_ADDR_HSIZE_SHIFT	8
112 #define IN4_ADDR_HSIZE		(1U << IN4_ADDR_HSIZE_SHIFT)
113 
114 static u32 inet_addr_hash(const struct net *net, __be32 addr)
115 {
116 	u32 val = __ipv4_addr_hash(addr, net_hash_mix(net));
117 
118 	return hash_32(val, IN4_ADDR_HSIZE_SHIFT);
119 }
120 
121 static void inet_hash_insert(struct net *net, struct in_ifaddr *ifa)
122 {
123 	u32 hash = inet_addr_hash(net, ifa->ifa_local);
124 
125 	ASSERT_RTNL();
126 	hlist_add_head_rcu(&ifa->addr_lst, &net->ipv4.inet_addr_lst[hash]);
127 }
128 
129 static void inet_hash_remove(struct in_ifaddr *ifa)
130 {
131 	ASSERT_RTNL();
132 	hlist_del_init_rcu(&ifa->addr_lst);
133 }
134 
135 /**
136  * __ip_dev_find - find the first device with a given source address.
137  * @net: the net namespace
138  * @addr: the source address
139  * @devref: if true, take a reference on the found device
140  *
141  * If a caller uses devref=false, it should be protected by RCU, or RTNL
142  */
143 struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref)
144 {
145 	struct net_device *result = NULL;
146 	struct in_ifaddr *ifa;
147 
148 	rcu_read_lock();
149 	ifa = inet_lookup_ifaddr_rcu(net, addr);
150 	if (!ifa) {
151 		struct flowi4 fl4 = { .daddr = addr };
152 		struct fib_result res = { 0 };
153 		struct fib_table *local;
154 
155 		/* Fallback to FIB local table so that communication
156 		 * over loopback subnets work.
157 		 */
158 		local = fib_get_table(net, RT_TABLE_LOCAL);
159 		if (local &&
160 		    !fib_table_lookup(local, &fl4, &res, FIB_LOOKUP_NOREF) &&
161 		    res.type == RTN_LOCAL)
162 			result = FIB_RES_DEV(res);
163 	} else {
164 		result = ifa->ifa_dev->dev;
165 	}
166 	if (result && devref)
167 		dev_hold(result);
168 	rcu_read_unlock();
169 	return result;
170 }
171 EXPORT_SYMBOL(__ip_dev_find);
172 
173 /* called under RCU lock */
174 struct in_ifaddr *inet_lookup_ifaddr_rcu(struct net *net, __be32 addr)
175 {
176 	u32 hash = inet_addr_hash(net, addr);
177 	struct in_ifaddr *ifa;
178 
179 	hlist_for_each_entry_rcu(ifa, &net->ipv4.inet_addr_lst[hash], addr_lst)
180 		if (ifa->ifa_local == addr)
181 			return ifa;
182 
183 	return NULL;
184 }
185 
186 static void rtmsg_ifa(int event, struct in_ifaddr *, struct nlmsghdr *, u32);
187 
188 static BLOCKING_NOTIFIER_HEAD(inetaddr_chain);
189 static BLOCKING_NOTIFIER_HEAD(inetaddr_validator_chain);
190 static void inet_del_ifa(struct in_device *in_dev,
191 			 struct in_ifaddr __rcu **ifap,
192 			 int destroy);
193 #ifdef CONFIG_SYSCTL
194 static int devinet_sysctl_register(struct in_device *idev);
195 static void devinet_sysctl_unregister(struct in_device *idev);
196 #else
197 static int devinet_sysctl_register(struct in_device *idev)
198 {
199 	return 0;
200 }
201 static void devinet_sysctl_unregister(struct in_device *idev)
202 {
203 }
204 #endif
205 
206 /* Locks all the inet devices. */
207 
208 static struct in_ifaddr *inet_alloc_ifa(struct in_device *in_dev)
209 {
210 	struct in_ifaddr *ifa;
211 
212 	ifa = kzalloc_obj(*ifa, GFP_KERNEL_ACCOUNT);
213 	if (!ifa)
214 		return NULL;
215 
216 	in_dev_hold(in_dev);
217 	ifa->ifa_dev = in_dev;
218 
219 	INIT_HLIST_NODE(&ifa->addr_lst);
220 
221 	return ifa;
222 }
223 
224 static void inet_rcu_free_ifa(struct rcu_head *head)
225 {
226 	struct in_ifaddr *ifa = container_of(head, struct in_ifaddr, rcu_head);
227 
228 	in_dev_put(ifa->ifa_dev);
229 	kfree(ifa);
230 }
231 
232 static void inet_free_ifa(struct in_ifaddr *ifa)
233 {
234 	/* Our reference to ifa->ifa_dev must be freed ASAP
235 	 * to release the reference to the netdev the same way.
236 	 * in_dev_put() -> in_dev_finish_destroy() -> netdev_put()
237 	 */
238 	call_rcu_hurry(&ifa->rcu_head, inet_rcu_free_ifa);
239 }
240 
241 static void in_dev_free_rcu(struct rcu_head *head)
242 {
243 	struct in_device *idev = container_of(head, struct in_device, rcu_head);
244 
245 	kfree(rcu_dereference_protected(idev->mc_hash, 1));
246 	kfree(idev);
247 }
248 
249 void in_dev_finish_destroy(struct in_device *idev)
250 {
251 	struct net_device *dev = idev->dev;
252 
253 	WARN_ON(idev->ifa_list);
254 	WARN_ON(idev->mc_list);
255 #ifdef NET_REFCNT_DEBUG
256 	pr_debug("%s: %p=%s\n", __func__, idev, dev ? dev->name : "NIL");
257 #endif
258 	netdev_put(dev, &idev->dev_tracker);
259 	if (!idev->dead)
260 		pr_err("Freeing alive in_device %p\n", idev);
261 	else
262 		call_rcu(&idev->rcu_head, in_dev_free_rcu);
263 }
264 EXPORT_SYMBOL(in_dev_finish_destroy);
265 
266 static struct in_device *inetdev_init(struct net_device *dev)
267 {
268 	struct net *net = dev_net(dev);
269 	struct in_device *in_dev;
270 	struct neigh_table *tbl;
271 	int err = -ENOMEM;
272 
273 	ASSERT_RTNL();
274 
275 	in_dev = kzalloc_obj(*in_dev);
276 	if (!in_dev)
277 		goto out;
278 
279 	tbl = arp_table(net);
280 	memcpy(&in_dev->cnf, net->ipv4.devconf_dflt, sizeof(in_dev->cnf));
281 	in_dev->cnf.sysctl = NULL;
282 	in_dev->dev = dev;
283 	in_dev->arp_parms = neigh_parms_alloc(dev, tbl);
284 	if (!in_dev->arp_parms)
285 		goto out_kfree;
286 	if (IPV4_DEVCONF(in_dev->cnf, FORWARDING))
287 		netif_disable_lro(dev);
288 	/* Reference in_dev->dev */
289 	netdev_hold(dev, &in_dev->dev_tracker, GFP_KERNEL);
290 	/* Account for reference dev->ip_ptr (below) */
291 	refcount_set(&in_dev->refcnt, 1);
292 
293 	if (dev != blackhole_netdev) {
294 		err = devinet_sysctl_register(in_dev);
295 		if (err) {
296 			in_dev->dead = 1;
297 			neigh_parms_release(tbl, in_dev->arp_parms);
298 			in_dev_put(in_dev);
299 			in_dev = NULL;
300 			goto out;
301 		}
302 		ip_mc_init_dev(in_dev);
303 		if (dev->flags & IFF_UP)
304 			ip_mc_up(in_dev);
305 	}
306 
307 	/* we can receive as soon as ip_ptr is set -- do this last */
308 	rcu_assign_pointer(dev->ip_ptr, in_dev);
309 out:
310 	return in_dev ?: ERR_PTR(err);
311 out_kfree:
312 	kfree(in_dev);
313 	in_dev = NULL;
314 	goto out;
315 }
316 
317 static void inetdev_destroy(struct in_device *in_dev)
318 {
319 	struct net_device *dev = in_dev->dev;
320 	struct net *net = dev_net(dev);
321 	struct in_ifaddr *ifa;
322 
323 	ASSERT_RTNL();
324 
325 	in_dev->dead = 1;
326 
327 	RCU_INIT_POINTER(dev->ip_ptr, NULL);
328 
329 	ip_mc_destroy_dev(in_dev);
330 
331 	while ((ifa = rtnl_dereference(in_dev->ifa_list)) != NULL) {
332 		inet_del_ifa(in_dev, &in_dev->ifa_list, 0);
333 		inet_free_ifa(ifa);
334 	}
335 
336 	devinet_sysctl_unregister(in_dev);
337 	neigh_parms_release(arp_table(net), in_dev->arp_parms);
338 	arp_ifdown(dev);
339 
340 	in_dev_put(in_dev);
341 }
342 
343 int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b)
344 {
345 	const struct in_ifaddr *ifa;
346 
347 	rcu_read_lock();
348 	in_dev_for_each_ifa_rcu(ifa, in_dev) {
349 		if (inet_ifa_match(a, ifa)) {
350 			if (!b || inet_ifa_match(b, ifa)) {
351 				rcu_read_unlock();
352 				return 1;
353 			}
354 		}
355 	}
356 	rcu_read_unlock();
357 	return 0;
358 }
359 
360 static void __inet_del_ifa(struct in_device *in_dev,
361 			   struct in_ifaddr __rcu **ifap,
362 			   int destroy, struct nlmsghdr *nlh, u32 portid)
363 {
364 	struct in_ifaddr *promote = NULL;
365 	struct in_ifaddr *ifa, *ifa1;
366 	struct in_ifaddr __rcu **last_prim;
367 	struct in_ifaddr *prev_prom = NULL;
368 	int do_promote = IN_DEV_PROMOTE_SECONDARIES(in_dev);
369 
370 	ASSERT_RTNL();
371 
372 	ifa1 = rtnl_dereference(*ifap);
373 	last_prim = ifap;
374 	if (in_dev->dead)
375 		goto no_promotions;
376 
377 	/* 1. Deleting primary ifaddr forces deletion all secondaries
378 	 * unless alias promotion is set
379 	 **/
380 
381 	if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
382 		struct in_ifaddr __rcu **ifap1 = &ifa1->ifa_next;
383 
384 		while ((ifa = rtnl_dereference(*ifap1)) != NULL) {
385 			if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
386 			    ifa1->ifa_scope <= ifa->ifa_scope)
387 				last_prim = &ifa->ifa_next;
388 
389 			if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
390 			    ifa1->ifa_mask != ifa->ifa_mask ||
391 			    !inet_ifa_match(ifa1->ifa_address, ifa)) {
392 				ifap1 = &ifa->ifa_next;
393 				prev_prom = ifa;
394 				continue;
395 			}
396 
397 			if (!do_promote) {
398 				inet_hash_remove(ifa);
399 				*ifap1 = ifa->ifa_next;
400 
401 				rtmsg_ifa(RTM_DELADDR, ifa, nlh, portid);
402 				blocking_notifier_call_chain(&inetaddr_chain,
403 						NETDEV_DOWN, ifa);
404 				inet_free_ifa(ifa);
405 			} else {
406 				promote = ifa;
407 				break;
408 			}
409 		}
410 	}
411 
412 	/* On promotion all secondaries from subnet are changing
413 	 * the primary IP, we must remove all their routes silently
414 	 * and later to add them back with new prefsrc. Do this
415 	 * while all addresses are on the device list.
416 	 */
417 	for (ifa = promote; ifa; ifa = rtnl_dereference(ifa->ifa_next)) {
418 		if (ifa1->ifa_mask == ifa->ifa_mask &&
419 		    inet_ifa_match(ifa1->ifa_address, ifa))
420 			fib_del_ifaddr(ifa, ifa1);
421 	}
422 
423 no_promotions:
424 	/* 2. Unlink it */
425 
426 	*ifap = ifa1->ifa_next;
427 	inet_hash_remove(ifa1);
428 
429 	/* 3. Announce address deletion */
430 
431 	/* Send message first, then call notifier.
432 	   At first sight, FIB update triggered by notifier
433 	   will refer to already deleted ifaddr, that could confuse
434 	   netlink listeners. It is not true: look, gated sees
435 	   that route deleted and if it still thinks that ifaddr
436 	   is valid, it will try to restore deleted routes... Grr.
437 	   So that, this order is correct.
438 	 */
439 	rtmsg_ifa(RTM_DELADDR, ifa1, nlh, portid);
440 	blocking_notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
441 
442 	if (promote) {
443 		struct in_ifaddr *next_sec;
444 
445 		next_sec = rtnl_dereference(promote->ifa_next);
446 		if (prev_prom) {
447 			struct in_ifaddr *last_sec;
448 
449 			rcu_assign_pointer(prev_prom->ifa_next, next_sec);
450 
451 			last_sec = rtnl_dereference(*last_prim);
452 			rcu_assign_pointer(promote->ifa_next, last_sec);
453 			rcu_assign_pointer(*last_prim, promote);
454 		}
455 
456 		promote->ifa_flags &= ~IFA_F_SECONDARY;
457 		rtmsg_ifa(RTM_NEWADDR, promote, nlh, portid);
458 		blocking_notifier_call_chain(&inetaddr_chain,
459 				NETDEV_UP, promote);
460 		for (ifa = next_sec; ifa;
461 		     ifa = rtnl_dereference(ifa->ifa_next)) {
462 			if (ifa1->ifa_mask != ifa->ifa_mask ||
463 			    !inet_ifa_match(ifa1->ifa_address, ifa))
464 					continue;
465 			fib_add_ifaddr(ifa);
466 		}
467 
468 	}
469 	if (destroy)
470 		inet_free_ifa(ifa1);
471 }
472 
473 static void inet_del_ifa(struct in_device *in_dev,
474 			 struct in_ifaddr __rcu **ifap,
475 			 int destroy)
476 {
477 	__inet_del_ifa(in_dev, ifap, destroy, NULL, 0);
478 }
479 
480 static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
481 			     u32 portid, struct netlink_ext_ack *extack)
482 {
483 	struct in_ifaddr __rcu **last_primary, **ifap;
484 	struct in_device *in_dev = ifa->ifa_dev;
485 	struct net *net = dev_net(in_dev->dev);
486 	struct in_validator_info ivi;
487 	struct in_ifaddr *ifa1;
488 	int ret;
489 
490 	ASSERT_RTNL();
491 
492 	ifa->ifa_flags &= ~IFA_F_SECONDARY;
493 	last_primary = &in_dev->ifa_list;
494 
495 	/* Don't set IPv6 only flags to IPv4 addresses */
496 	ifa->ifa_flags &= ~IPV6ONLY_FLAGS;
497 
498 	ifap = &in_dev->ifa_list;
499 	ifa1 = rtnl_dereference(*ifap);
500 
501 	while (ifa1) {
502 		if (!(ifa1->ifa_flags & IFA_F_SECONDARY) &&
503 		    ifa->ifa_scope <= ifa1->ifa_scope)
504 			last_primary = &ifa1->ifa_next;
505 		if (ifa1->ifa_mask == ifa->ifa_mask &&
506 		    inet_ifa_match(ifa1->ifa_address, ifa)) {
507 			if (ifa1->ifa_local == ifa->ifa_local) {
508 				inet_free_ifa(ifa);
509 				return -EEXIST;
510 			}
511 			if (ifa1->ifa_scope != ifa->ifa_scope) {
512 				NL_SET_ERR_MSG(extack, "ipv4: Invalid scope value");
513 				inet_free_ifa(ifa);
514 				return -EINVAL;
515 			}
516 			ifa->ifa_flags |= IFA_F_SECONDARY;
517 		}
518 
519 		ifap = &ifa1->ifa_next;
520 		ifa1 = rtnl_dereference(*ifap);
521 	}
522 
523 	/* Allow any devices that wish to register ifaddr validtors to weigh
524 	 * in now, before changes are committed.  The rntl lock is serializing
525 	 * access here, so the state should not change between a validator call
526 	 * and a final notify on commit.  This isn't invoked on promotion under
527 	 * the assumption that validators are checking the address itself, and
528 	 * not the flags.
529 	 */
530 	ivi.ivi_addr = ifa->ifa_address;
531 	ivi.ivi_dev = ifa->ifa_dev;
532 	ivi.extack = extack;
533 	ret = blocking_notifier_call_chain(&inetaddr_validator_chain,
534 					   NETDEV_UP, &ivi);
535 	ret = notifier_to_errno(ret);
536 	if (ret) {
537 		inet_free_ifa(ifa);
538 		return ret;
539 	}
540 
541 	if (!(ifa->ifa_flags & IFA_F_SECONDARY))
542 		ifap = last_primary;
543 
544 	rcu_assign_pointer(ifa->ifa_next, *ifap);
545 	rcu_assign_pointer(*ifap, ifa);
546 
547 	inet_hash_insert(dev_net(in_dev->dev), ifa);
548 
549 	cancel_delayed_work(&net->ipv4.addr_chk_work);
550 	queue_delayed_work(system_power_efficient_wq, &net->ipv4.addr_chk_work, 0);
551 
552 	/* Send message first, then call notifier.
553 	   Notifier will trigger FIB update, so that
554 	   listeners of netlink will know about new ifaddr */
555 	rtmsg_ifa(RTM_NEWADDR, ifa, nlh, portid);
556 	blocking_notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
557 
558 	return 0;
559 }
560 
561 static int inet_insert_ifa(struct in_ifaddr *ifa)
562 {
563 	if (!ifa->ifa_local) {
564 		inet_free_ifa(ifa);
565 		return 0;
566 	}
567 
568 	return __inet_insert_ifa(ifa, NULL, 0, NULL);
569 }
570 
571 static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
572 {
573 	struct in_device *in_dev = __in_dev_get_rtnl_net(dev);
574 
575 	ipv4_devconf_setall(in_dev);
576 	neigh_parms_data_state_setall(in_dev->arp_parms);
577 
578 	if (ipv4_is_loopback(ifa->ifa_local))
579 		ifa->ifa_scope = RT_SCOPE_HOST;
580 	return inet_insert_ifa(ifa);
581 }
582 
583 /* Caller must hold RCU or RTNL :
584  * We dont take a reference on found in_device
585  */
586 struct in_device *inetdev_by_index(struct net *net, int ifindex)
587 {
588 	struct net_device *dev;
589 	struct in_device *in_dev = NULL;
590 
591 	rcu_read_lock();
592 	dev = dev_get_by_index_rcu(net, ifindex);
593 	if (dev)
594 		in_dev = rcu_dereference_rtnl(dev->ip_ptr);
595 	rcu_read_unlock();
596 	return in_dev;
597 }
598 EXPORT_SYMBOL(inetdev_by_index);
599 
600 /* Called only from RTNL semaphored context. No locks. */
601 
602 struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
603 				    __be32 mask)
604 {
605 	struct in_ifaddr *ifa;
606 
607 	ASSERT_RTNL();
608 
609 	in_dev_for_each_ifa_rtnl(ifa, in_dev) {
610 		if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
611 			return ifa;
612 	}
613 	return NULL;
614 }
615 
616 static int ip_mc_autojoin_config(struct net *net, bool join,
617 				 const struct in_ifaddr *ifa)
618 {
619 #if defined(CONFIG_IP_MULTICAST)
620 	struct ip_mreqn mreq = {
621 		.imr_multiaddr.s_addr = ifa->ifa_address,
622 		.imr_ifindex = ifa->ifa_dev->dev->ifindex,
623 	};
624 	struct sock *sk = net->ipv4.mc_autojoin_sk;
625 	int ret;
626 
627 	ASSERT_RTNL_NET(net);
628 
629 	lock_sock(sk);
630 	if (join)
631 		ret = ip_mc_join_group(sk, &mreq);
632 	else
633 		ret = ip_mc_leave_group(sk, &mreq);
634 	release_sock(sk);
635 
636 	return ret;
637 #else
638 	return -EOPNOTSUPP;
639 #endif
640 }
641 
642 static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh,
643 			    struct netlink_ext_ack *extack)
644 {
645 	struct net *net = sock_net(skb->sk);
646 	struct in_ifaddr __rcu **ifap;
647 	struct nlattr *tb[IFA_MAX+1];
648 	struct in_device *in_dev;
649 	struct ifaddrmsg *ifm;
650 	struct in_ifaddr *ifa;
651 	int err;
652 
653 	err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
654 				     ifa_ipv4_policy, extack);
655 	if (err < 0)
656 		goto out;
657 
658 	ifm = nlmsg_data(nlh);
659 
660 	rtnl_net_lock(net);
661 
662 	in_dev = inetdev_by_index(net, ifm->ifa_index);
663 	if (!in_dev) {
664 		NL_SET_ERR_MSG(extack, "ipv4: Device not found");
665 		err = -ENODEV;
666 		goto unlock;
667 	}
668 
669 	for (ifap = &in_dev->ifa_list;
670 	     (ifa = rtnl_net_dereference(net, *ifap)) != NULL;
671 	     ifap = &ifa->ifa_next) {
672 		if (tb[IFA_LOCAL] &&
673 		    ifa->ifa_local != nla_get_in_addr(tb[IFA_LOCAL]))
674 			continue;
675 
676 		if (tb[IFA_LABEL] && nla_strcmp(tb[IFA_LABEL], ifa->ifa_label))
677 			continue;
678 
679 		if (tb[IFA_ADDRESS] &&
680 		    (ifm->ifa_prefixlen != ifa->ifa_prefixlen ||
681 		    !inet_ifa_match(nla_get_in_addr(tb[IFA_ADDRESS]), ifa)))
682 			continue;
683 
684 		if (ipv4_is_multicast(ifa->ifa_address))
685 			ip_mc_autojoin_config(net, false, ifa);
686 
687 		__inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).portid);
688 		goto unlock;
689 	}
690 
691 	NL_SET_ERR_MSG(extack, "ipv4: Address not found");
692 	err = -EADDRNOTAVAIL;
693 unlock:
694 	rtnl_net_unlock(net);
695 out:
696 	return err;
697 }
698 
699 static void check_lifetime(struct work_struct *work)
700 {
701 	unsigned long now, next, next_sec, next_sched;
702 	struct in_ifaddr *ifa;
703 	struct hlist_node *n;
704 	struct net *net;
705 	int i;
706 
707 	net = container_of(to_delayed_work(work), struct net, ipv4.addr_chk_work);
708 	now = jiffies;
709 	next = round_jiffies_up(now + ADDR_CHECK_FREQUENCY);
710 
711 	for (i = 0; i < IN4_ADDR_HSIZE; i++) {
712 		struct hlist_head *head = &net->ipv4.inet_addr_lst[i];
713 		bool change_needed = false;
714 
715 		rcu_read_lock();
716 		hlist_for_each_entry_rcu(ifa, head, addr_lst) {
717 			unsigned long age, tstamp;
718 			u32 preferred_lft;
719 			u32 valid_lft;
720 			u32 flags;
721 
722 			flags = READ_ONCE(ifa->ifa_flags);
723 			if (flags & IFA_F_PERMANENT)
724 				continue;
725 
726 			preferred_lft = READ_ONCE(ifa->ifa_preferred_lft);
727 			valid_lft = READ_ONCE(ifa->ifa_valid_lft);
728 			tstamp = READ_ONCE(ifa->ifa_tstamp);
729 			/* We try to batch several events at once. */
730 			age = (now - tstamp +
731 			       ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
732 
733 			if (valid_lft != INFINITY_LIFE_TIME &&
734 			    age >= valid_lft) {
735 				change_needed = true;
736 			} else if (preferred_lft ==
737 				   INFINITY_LIFE_TIME) {
738 				continue;
739 			} else if (age >= preferred_lft) {
740 				if (time_before(tstamp + valid_lft * HZ, next))
741 					next = tstamp + valid_lft * HZ;
742 
743 				if (!(flags & IFA_F_DEPRECATED))
744 					change_needed = true;
745 			} else if (time_before(tstamp + preferred_lft * HZ,
746 					       next)) {
747 				next = tstamp + preferred_lft * HZ;
748 			}
749 		}
750 		rcu_read_unlock();
751 		if (!change_needed)
752 			continue;
753 
754 		rtnl_net_lock(net);
755 		hlist_for_each_entry_safe(ifa, n, head, addr_lst) {
756 			unsigned long age;
757 
758 			if (ifa->ifa_flags & IFA_F_PERMANENT)
759 				continue;
760 
761 			/* We try to batch several events at once. */
762 			age = (now - ifa->ifa_tstamp +
763 			       ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
764 
765 			if (ifa->ifa_valid_lft != INFINITY_LIFE_TIME &&
766 			    age >= ifa->ifa_valid_lft) {
767 				struct in_ifaddr __rcu **ifap;
768 				struct in_ifaddr *tmp;
769 
770 				ifap = &ifa->ifa_dev->ifa_list;
771 				tmp = rtnl_net_dereference(net, *ifap);
772 				while (tmp) {
773 					if (tmp == ifa) {
774 						inet_del_ifa(ifa->ifa_dev,
775 							     ifap, 1);
776 						break;
777 					}
778 					ifap = &tmp->ifa_next;
779 					tmp = rtnl_net_dereference(net, *ifap);
780 				}
781 			} else if (ifa->ifa_preferred_lft !=
782 				   INFINITY_LIFE_TIME &&
783 				   age >= ifa->ifa_preferred_lft &&
784 				   !(ifa->ifa_flags & IFA_F_DEPRECATED)) {
785 				ifa->ifa_flags |= IFA_F_DEPRECATED;
786 				rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
787 			}
788 		}
789 		rtnl_net_unlock(net);
790 	}
791 
792 	next_sec = round_jiffies_up(next);
793 	next_sched = next;
794 
795 	/* If rounded timeout is accurate enough, accept it. */
796 	if (time_before(next_sec, next + ADDRCONF_TIMER_FUZZ))
797 		next_sched = next_sec;
798 
799 	now = jiffies;
800 	/* And minimum interval is ADDRCONF_TIMER_FUZZ_MAX. */
801 	if (time_before(next_sched, now + ADDRCONF_TIMER_FUZZ_MAX))
802 		next_sched = now + ADDRCONF_TIMER_FUZZ_MAX;
803 
804 	queue_delayed_work(system_power_efficient_wq, &net->ipv4.addr_chk_work,
805 			   next_sched - now);
806 }
807 
808 static void set_ifa_lifetime(struct in_ifaddr *ifa, __u32 valid_lft,
809 			     __u32 prefered_lft)
810 {
811 	unsigned long timeout;
812 	u32 flags;
813 
814 	flags = ifa->ifa_flags & ~(IFA_F_PERMANENT | IFA_F_DEPRECATED);
815 
816 	timeout = addrconf_timeout_fixup(valid_lft, HZ);
817 	if (addrconf_finite_timeout(timeout))
818 		WRITE_ONCE(ifa->ifa_valid_lft, timeout);
819 	else
820 		flags |= IFA_F_PERMANENT;
821 
822 	timeout = addrconf_timeout_fixup(prefered_lft, HZ);
823 	if (addrconf_finite_timeout(timeout)) {
824 		if (timeout == 0)
825 			flags |= IFA_F_DEPRECATED;
826 		WRITE_ONCE(ifa->ifa_preferred_lft, timeout);
827 	}
828 	WRITE_ONCE(ifa->ifa_flags, flags);
829 	WRITE_ONCE(ifa->ifa_tstamp, jiffies);
830 	if (!ifa->ifa_cstamp)
831 		WRITE_ONCE(ifa->ifa_cstamp, ifa->ifa_tstamp);
832 }
833 
834 static int inet_validate_rtm(struct nlmsghdr *nlh, struct nlattr **tb,
835 			     struct netlink_ext_ack *extack,
836 			     __u32 *valid_lft, __u32 *prefered_lft)
837 {
838 	struct ifaddrmsg *ifm = nlmsg_data(nlh);
839 	int err;
840 
841 	err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
842 				     ifa_ipv4_policy, extack);
843 	if (err < 0)
844 		return err;
845 
846 	if (ifm->ifa_prefixlen > 32) {
847 		NL_SET_ERR_MSG(extack, "ipv4: Invalid prefix length");
848 		return -EINVAL;
849 	}
850 
851 	if (!tb[IFA_LOCAL]) {
852 		NL_SET_ERR_MSG(extack, "ipv4: Local address is not supplied");
853 		return -EINVAL;
854 	}
855 
856 	if (tb[IFA_CACHEINFO]) {
857 		struct ifa_cacheinfo *ci;
858 
859 		ci = nla_data(tb[IFA_CACHEINFO]);
860 		if (!ci->ifa_valid || ci->ifa_prefered > ci->ifa_valid) {
861 			NL_SET_ERR_MSG(extack, "ipv4: address lifetime invalid");
862 			return -EINVAL;
863 		}
864 
865 		*valid_lft = ci->ifa_valid;
866 		*prefered_lft = ci->ifa_prefered;
867 	}
868 
869 	return 0;
870 }
871 
872 static struct in_ifaddr *inet_rtm_to_ifa(struct net *net, struct nlmsghdr *nlh,
873 					 struct nlattr **tb,
874 					 struct netlink_ext_ack *extack)
875 {
876 	struct ifaddrmsg *ifm = nlmsg_data(nlh);
877 	struct in_device *in_dev;
878 	struct net_device *dev;
879 	struct in_ifaddr *ifa;
880 	int err;
881 
882 	dev = __dev_get_by_index(net, ifm->ifa_index);
883 	err = -ENODEV;
884 	if (!dev) {
885 		NL_SET_ERR_MSG(extack, "ipv4: Device not found");
886 		goto errout;
887 	}
888 
889 	in_dev = __in_dev_get_rtnl_net(dev);
890 	err = -ENOBUFS;
891 	if (!in_dev)
892 		goto errout;
893 
894 	ifa = inet_alloc_ifa(in_dev);
895 	if (!ifa)
896 		/*
897 		 * A potential indev allocation can be left alive, it stays
898 		 * assigned to its device and is destroy with it.
899 		 */
900 		goto errout;
901 
902 	ipv4_devconf_setall(in_dev);
903 	neigh_parms_data_state_setall(in_dev->arp_parms);
904 
905 	if (!tb[IFA_ADDRESS])
906 		tb[IFA_ADDRESS] = tb[IFA_LOCAL];
907 
908 	ifa->ifa_prefixlen = ifm->ifa_prefixlen;
909 	ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
910 	ifa->ifa_flags = nla_get_u32_default(tb[IFA_FLAGS], ifm->ifa_flags);
911 	ifa->ifa_scope = ifm->ifa_scope;
912 	ifa->ifa_local = nla_get_in_addr(tb[IFA_LOCAL]);
913 	ifa->ifa_address = nla_get_in_addr(tb[IFA_ADDRESS]);
914 
915 	if (tb[IFA_BROADCAST])
916 		ifa->ifa_broadcast = nla_get_in_addr(tb[IFA_BROADCAST]);
917 
918 	if (tb[IFA_LABEL])
919 		nla_strscpy(ifa->ifa_label, tb[IFA_LABEL], IFNAMSIZ);
920 	else
921 		memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
922 
923 	if (tb[IFA_RT_PRIORITY])
924 		ifa->ifa_rt_priority = nla_get_u32(tb[IFA_RT_PRIORITY]);
925 
926 	if (tb[IFA_PROTO])
927 		ifa->ifa_proto = nla_get_u8(tb[IFA_PROTO]);
928 
929 	return ifa;
930 
931 errout:
932 	return ERR_PTR(err);
933 }
934 
935 static struct in_ifaddr *find_matching_ifa(struct net *net, struct in_ifaddr *ifa)
936 {
937 	struct in_device *in_dev = ifa->ifa_dev;
938 	struct in_ifaddr *ifa1;
939 
940 	in_dev_for_each_ifa_rtnl_net(net, ifa1, in_dev) {
941 		if (ifa1->ifa_mask == ifa->ifa_mask &&
942 		    inet_ifa_match(ifa1->ifa_address, ifa) &&
943 		    ifa1->ifa_local == ifa->ifa_local)
944 			return ifa1;
945 	}
946 
947 	return NULL;
948 }
949 
950 static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
951 			    struct netlink_ext_ack *extack)
952 {
953 	__u32 prefered_lft = INFINITY_LIFE_TIME;
954 	__u32 valid_lft = INFINITY_LIFE_TIME;
955 	struct net *net = sock_net(skb->sk);
956 	struct in_ifaddr *ifa_existing;
957 	struct nlattr *tb[IFA_MAX + 1];
958 	struct in_ifaddr *ifa;
959 	int ret;
960 
961 	ret = inet_validate_rtm(nlh, tb, extack, &valid_lft, &prefered_lft);
962 	if (ret < 0)
963 		return ret;
964 
965 	if (!nla_get_in_addr(tb[IFA_LOCAL]))
966 		return 0;
967 
968 	rtnl_net_lock(net);
969 
970 	ifa = inet_rtm_to_ifa(net, nlh, tb, extack);
971 	if (IS_ERR(ifa)) {
972 		ret = PTR_ERR(ifa);
973 		goto unlock;
974 	}
975 
976 	ifa_existing = find_matching_ifa(net, ifa);
977 	if (!ifa_existing) {
978 		/* It would be best to check for !NLM_F_CREATE here but
979 		 * userspace already relies on not having to provide this.
980 		 */
981 		set_ifa_lifetime(ifa, valid_lft, prefered_lft);
982 		if (ifa->ifa_flags & IFA_F_MCAUTOJOIN) {
983 			ret = ip_mc_autojoin_config(net, true, ifa);
984 			if (ret < 0) {
985 				NL_SET_ERR_MSG(extack, "ipv4: Multicast auto join failed");
986 				inet_free_ifa(ifa);
987 				goto unlock;
988 			}
989 		}
990 
991 		ret = __inet_insert_ifa(ifa, nlh, NETLINK_CB(skb).portid, extack);
992 	} else {
993 		u32 new_metric = ifa->ifa_rt_priority;
994 		u8 new_proto = ifa->ifa_proto;
995 
996 		inet_free_ifa(ifa);
997 
998 		if (nlh->nlmsg_flags & NLM_F_EXCL ||
999 		    !(nlh->nlmsg_flags & NLM_F_REPLACE)) {
1000 			NL_SET_ERR_MSG(extack, "ipv4: Address already assigned");
1001 			ret = -EEXIST;
1002 			goto unlock;
1003 		}
1004 		ifa = ifa_existing;
1005 
1006 		if (ifa->ifa_rt_priority != new_metric) {
1007 			fib_modify_prefix_metric(ifa, new_metric);
1008 			ifa->ifa_rt_priority = new_metric;
1009 		}
1010 
1011 		ifa->ifa_proto = new_proto;
1012 
1013 		set_ifa_lifetime(ifa, valid_lft, prefered_lft);
1014 		cancel_delayed_work(&net->ipv4.addr_chk_work);
1015 		queue_delayed_work(system_power_efficient_wq,
1016 				   &net->ipv4.addr_chk_work, 0);
1017 		rtmsg_ifa(RTM_NEWADDR, ifa, nlh, NETLINK_CB(skb).portid);
1018 	}
1019 
1020 unlock:
1021 	rtnl_net_unlock(net);
1022 
1023 	return ret;
1024 }
1025 
1026 /*
1027  *	Determine a default network mask, based on the IP address.
1028  */
1029 
1030 static int inet_abc_len(__be32 addr)
1031 {
1032 	int rc = -1;	/* Something else, probably a multicast. */
1033 
1034 	if (ipv4_is_zeronet(addr) || ipv4_is_lbcast(addr))
1035 		rc = 0;
1036 	else {
1037 		__u32 haddr = ntohl(addr);
1038 		if (IN_CLASSA(haddr))
1039 			rc = 8;
1040 		else if (IN_CLASSB(haddr))
1041 			rc = 16;
1042 		else if (IN_CLASSC(haddr))
1043 			rc = 24;
1044 		else if (IN_CLASSE(haddr))
1045 			rc = 32;
1046 	}
1047 
1048 	return rc;
1049 }
1050 
1051 
1052 int devinet_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr)
1053 {
1054 	struct sockaddr_in sin_orig;
1055 	struct sockaddr_in *sin = (struct sockaddr_in *)&ifr->ifr_addr;
1056 	struct in_ifaddr __rcu **ifap = NULL;
1057 	struct in_device *in_dev;
1058 	struct in_ifaddr *ifa = NULL;
1059 	struct net_device *dev;
1060 	char *colon;
1061 	int ret = -EFAULT;
1062 	int tryaddrmatch = 0;
1063 
1064 	ifr->ifr_name[IFNAMSIZ - 1] = 0;
1065 
1066 	/* save original address for comparison */
1067 	memcpy(&sin_orig, sin, sizeof(*sin));
1068 
1069 	colon = strchr(ifr->ifr_name, ':');
1070 	if (colon)
1071 		*colon = 0;
1072 
1073 	dev_load(net, ifr->ifr_name);
1074 
1075 	switch (cmd) {
1076 	case SIOCGIFADDR:	/* Get interface address */
1077 	case SIOCGIFBRDADDR:	/* Get the broadcast address */
1078 	case SIOCGIFDSTADDR:	/* Get the destination address */
1079 	case SIOCGIFNETMASK:	/* Get the netmask for the interface */
1080 		/* Note that these ioctls will not sleep,
1081 		   so that we do not impose a lock.
1082 		   One day we will be forced to put shlock here (I mean SMP)
1083 		 */
1084 		tryaddrmatch = (sin_orig.sin_family == AF_INET);
1085 		memset(sin, 0, sizeof(*sin));
1086 		sin->sin_family = AF_INET;
1087 		break;
1088 
1089 	case SIOCSIFFLAGS:
1090 		ret = -EPERM;
1091 		if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
1092 			goto out;
1093 		break;
1094 	case SIOCSIFADDR:	/* Set interface address (and family) */
1095 	case SIOCSIFBRDADDR:	/* Set the broadcast address */
1096 	case SIOCSIFDSTADDR:	/* Set the destination address */
1097 	case SIOCSIFNETMASK: 	/* Set the netmask for the interface */
1098 		ret = -EPERM;
1099 		if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
1100 			goto out;
1101 		ret = -EINVAL;
1102 		if (sin->sin_family != AF_INET)
1103 			goto out;
1104 		break;
1105 	default:
1106 		ret = -EINVAL;
1107 		goto out;
1108 	}
1109 
1110 	rtnl_net_lock(net);
1111 
1112 	ret = -ENODEV;
1113 	dev = __dev_get_by_name(net, ifr->ifr_name);
1114 	if (!dev)
1115 		goto done;
1116 
1117 	if (colon)
1118 		*colon = ':';
1119 
1120 	in_dev = __in_dev_get_rtnl_net(dev);
1121 	if (in_dev) {
1122 		if (tryaddrmatch) {
1123 			/* Matthias Andree */
1124 			/* compare label and address (4.4BSD style) */
1125 			/* note: we only do this for a limited set of ioctls
1126 			   and only if the original address family was AF_INET.
1127 			   This is checked above. */
1128 
1129 			for (ifap = &in_dev->ifa_list;
1130 			     (ifa = rtnl_net_dereference(net, *ifap)) != NULL;
1131 			     ifap = &ifa->ifa_next) {
1132 				if (!strcmp(ifr->ifr_name, ifa->ifa_label) &&
1133 				    sin_orig.sin_addr.s_addr ==
1134 							ifa->ifa_local) {
1135 					break; /* found */
1136 				}
1137 			}
1138 		}
1139 		/* we didn't get a match, maybe the application is
1140 		   4.3BSD-style and passed in junk so we fall back to
1141 		   comparing just the label */
1142 		if (!ifa) {
1143 			for (ifap = &in_dev->ifa_list;
1144 			     (ifa = rtnl_net_dereference(net, *ifap)) != NULL;
1145 			     ifap = &ifa->ifa_next)
1146 				if (!strcmp(ifr->ifr_name, ifa->ifa_label))
1147 					break;
1148 		}
1149 	}
1150 
1151 	ret = -EADDRNOTAVAIL;
1152 	if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
1153 		goto done;
1154 
1155 	switch (cmd) {
1156 	case SIOCGIFADDR:	/* Get interface address */
1157 		ret = 0;
1158 		sin->sin_addr.s_addr = ifa->ifa_local;
1159 		break;
1160 
1161 	case SIOCGIFBRDADDR:	/* Get the broadcast address */
1162 		ret = 0;
1163 		sin->sin_addr.s_addr = ifa->ifa_broadcast;
1164 		break;
1165 
1166 	case SIOCGIFDSTADDR:	/* Get the destination address */
1167 		ret = 0;
1168 		sin->sin_addr.s_addr = ifa->ifa_address;
1169 		break;
1170 
1171 	case SIOCGIFNETMASK:	/* Get the netmask for the interface */
1172 		ret = 0;
1173 		sin->sin_addr.s_addr = ifa->ifa_mask;
1174 		break;
1175 
1176 	case SIOCSIFFLAGS:
1177 		if (colon) {
1178 			ret = -EADDRNOTAVAIL;
1179 			if (!ifa)
1180 				break;
1181 			ret = 0;
1182 			if (!(ifr->ifr_flags & IFF_UP))
1183 				inet_del_ifa(in_dev, ifap, 1);
1184 			break;
1185 		}
1186 
1187 		/* NETDEV_UP/DOWN/CHANGE could touch a peer dev */
1188 		ASSERT_RTNL();
1189 		ret = dev_change_flags(dev, ifr->ifr_flags, NULL);
1190 		break;
1191 
1192 	case SIOCSIFADDR:	/* Set interface address (and family) */
1193 		ret = -EINVAL;
1194 		if (inet_abc_len(sin->sin_addr.s_addr) < 0)
1195 			break;
1196 
1197 		if (!ifa) {
1198 			ret = -ENOBUFS;
1199 			if (!in_dev)
1200 				break;
1201 			ifa = inet_alloc_ifa(in_dev);
1202 			if (!ifa)
1203 				break;
1204 
1205 			if (colon)
1206 				memcpy(ifa->ifa_label, ifr->ifr_name, IFNAMSIZ);
1207 			else
1208 				memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1209 		} else {
1210 			ret = 0;
1211 			if (ifa->ifa_local == sin->sin_addr.s_addr)
1212 				break;
1213 			inet_del_ifa(in_dev, ifap, 0);
1214 			ifa->ifa_broadcast = 0;
1215 			ifa->ifa_scope = 0;
1216 		}
1217 
1218 		ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;
1219 
1220 		if (!(dev->flags & IFF_POINTOPOINT)) {
1221 			ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
1222 			ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
1223 			if ((dev->flags & IFF_BROADCAST) &&
1224 			    ifa->ifa_prefixlen < 31)
1225 				ifa->ifa_broadcast = ifa->ifa_address |
1226 						     ~ifa->ifa_mask;
1227 		} else {
1228 			ifa->ifa_prefixlen = 32;
1229 			ifa->ifa_mask = inet_make_mask(32);
1230 		}
1231 		set_ifa_lifetime(ifa, INFINITY_LIFE_TIME, INFINITY_LIFE_TIME);
1232 		ret = inet_set_ifa(dev, ifa);
1233 		break;
1234 
1235 	case SIOCSIFBRDADDR:	/* Set the broadcast address */
1236 		ret = 0;
1237 		if (ifa->ifa_broadcast != sin->sin_addr.s_addr) {
1238 			inet_del_ifa(in_dev, ifap, 0);
1239 			ifa->ifa_broadcast = sin->sin_addr.s_addr;
1240 			inet_insert_ifa(ifa);
1241 		}
1242 		break;
1243 
1244 	case SIOCSIFDSTADDR:	/* Set the destination address */
1245 		ret = 0;
1246 		if (ifa->ifa_address == sin->sin_addr.s_addr)
1247 			break;
1248 		ret = -EINVAL;
1249 		if (inet_abc_len(sin->sin_addr.s_addr) < 0)
1250 			break;
1251 		ret = 0;
1252 		inet_del_ifa(in_dev, ifap, 0);
1253 		ifa->ifa_address = sin->sin_addr.s_addr;
1254 		inet_insert_ifa(ifa);
1255 		break;
1256 
1257 	case SIOCSIFNETMASK: 	/* Set the netmask for the interface */
1258 
1259 		/*
1260 		 *	The mask we set must be legal.
1261 		 */
1262 		ret = -EINVAL;
1263 		if (bad_mask(sin->sin_addr.s_addr, 0))
1264 			break;
1265 		ret = 0;
1266 		if (ifa->ifa_mask != sin->sin_addr.s_addr) {
1267 			__be32 old_mask = ifa->ifa_mask;
1268 			inet_del_ifa(in_dev, ifap, 0);
1269 			ifa->ifa_mask = sin->sin_addr.s_addr;
1270 			ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
1271 
1272 			/* See if current broadcast address matches
1273 			 * with current netmask, then recalculate
1274 			 * the broadcast address. Otherwise it's a
1275 			 * funny address, so don't touch it since
1276 			 * the user seems to know what (s)he's doing...
1277 			 */
1278 			if ((dev->flags & IFF_BROADCAST) &&
1279 			    (ifa->ifa_prefixlen < 31) &&
1280 			    (ifa->ifa_broadcast ==
1281 			     (ifa->ifa_local|~old_mask))) {
1282 				ifa->ifa_broadcast = (ifa->ifa_local |
1283 						      ~sin->sin_addr.s_addr);
1284 			}
1285 			inet_insert_ifa(ifa);
1286 		}
1287 		break;
1288 	}
1289 done:
1290 	rtnl_net_unlock(net);
1291 out:
1292 	return ret;
1293 }
1294 
1295 int inet_gifconf(struct net_device *dev, char __user *buf, int len, int size)
1296 {
1297 	struct in_device *in_dev = __in_dev_get_rtnl_net(dev);
1298 	const struct in_ifaddr *ifa;
1299 	struct ifreq ifr;
1300 	int done = 0;
1301 
1302 	if (WARN_ON(size > sizeof(struct ifreq)))
1303 		goto out;
1304 
1305 	if (!in_dev)
1306 		goto out;
1307 
1308 	in_dev_for_each_ifa_rtnl_net(dev_net(dev), ifa, in_dev) {
1309 		if (!buf) {
1310 			done += size;
1311 			continue;
1312 		}
1313 		if (len < size)
1314 			break;
1315 		memset(&ifr, 0, sizeof(struct ifreq));
1316 		strcpy(ifr.ifr_name, ifa->ifa_label);
1317 
1318 		(*(struct sockaddr_in *)&ifr.ifr_addr).sin_family = AF_INET;
1319 		(*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr =
1320 								ifa->ifa_local;
1321 
1322 		if (copy_to_user(buf + done, &ifr, size)) {
1323 			done = -EFAULT;
1324 			break;
1325 		}
1326 		len  -= size;
1327 		done += size;
1328 	}
1329 out:
1330 	return done;
1331 }
1332 
1333 static __be32 in_dev_select_addr(const struct in_device *in_dev,
1334 				 int scope)
1335 {
1336 	const struct in_ifaddr *ifa;
1337 
1338 	in_dev_for_each_ifa_rcu(ifa, in_dev) {
1339 		if (READ_ONCE(ifa->ifa_flags) & IFA_F_SECONDARY)
1340 			continue;
1341 		if (ifa->ifa_scope != RT_SCOPE_LINK &&
1342 		    ifa->ifa_scope <= scope)
1343 			return ifa->ifa_local;
1344 	}
1345 
1346 	return 0;
1347 }
1348 
1349 __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope)
1350 {
1351 	const struct in_ifaddr *ifa;
1352 	__be32 addr = 0;
1353 	unsigned char localnet_scope = RT_SCOPE_HOST;
1354 	struct in_device *in_dev;
1355 	struct net *net;
1356 	int master_idx;
1357 
1358 	rcu_read_lock();
1359 	net = dev_net_rcu(dev);
1360 	in_dev = __in_dev_get_rcu(dev);
1361 	if (!in_dev)
1362 		goto no_in_dev;
1363 
1364 	if (unlikely(IN_DEV_ROUTE_LOCALNET(in_dev)))
1365 		localnet_scope = RT_SCOPE_LINK;
1366 
1367 	in_dev_for_each_ifa_rcu(ifa, in_dev) {
1368 		if (READ_ONCE(ifa->ifa_flags) & IFA_F_SECONDARY)
1369 			continue;
1370 		if (min(ifa->ifa_scope, localnet_scope) > scope)
1371 			continue;
1372 		if (!dst || inet_ifa_match(dst, ifa)) {
1373 			addr = ifa->ifa_local;
1374 			break;
1375 		}
1376 		if (!addr)
1377 			addr = ifa->ifa_local;
1378 	}
1379 
1380 	if (addr)
1381 		goto out_unlock;
1382 no_in_dev:
1383 	master_idx = l3mdev_master_ifindex_rcu(dev);
1384 
1385 	/* For VRFs, the VRF device takes the place of the loopback device,
1386 	 * with addresses on it being preferred.  Note in such cases the
1387 	 * loopback device will be among the devices that fail the master_idx
1388 	 * equality check in the loop below.
1389 	 */
1390 	if (master_idx &&
1391 	    (dev = dev_get_by_index_rcu(net, master_idx)) &&
1392 	    (in_dev = __in_dev_get_rcu(dev))) {
1393 		addr = in_dev_select_addr(in_dev, scope);
1394 		if (addr)
1395 			goto out_unlock;
1396 	}
1397 
1398 	/* Not loopback addresses on loopback should be preferred
1399 	   in this case. It is important that lo is the first interface
1400 	   in dev_base list.
1401 	 */
1402 	for_each_netdev_rcu(net, dev) {
1403 		if (l3mdev_master_ifindex_rcu(dev) != master_idx)
1404 			continue;
1405 
1406 		in_dev = __in_dev_get_rcu(dev);
1407 		if (!in_dev)
1408 			continue;
1409 
1410 		addr = in_dev_select_addr(in_dev, scope);
1411 		if (addr)
1412 			goto out_unlock;
1413 	}
1414 out_unlock:
1415 	rcu_read_unlock();
1416 	return addr;
1417 }
1418 EXPORT_SYMBOL(inet_select_addr);
1419 
1420 static __be32 confirm_addr_indev(struct in_device *in_dev, __be32 dst,
1421 			      __be32 local, int scope)
1422 {
1423 	unsigned char localnet_scope = RT_SCOPE_HOST;
1424 	const struct in_ifaddr *ifa;
1425 	__be32 addr = 0;
1426 	int same = 0;
1427 
1428 	if (unlikely(IN_DEV_ROUTE_LOCALNET(in_dev)))
1429 		localnet_scope = RT_SCOPE_LINK;
1430 
1431 	in_dev_for_each_ifa_rcu(ifa, in_dev) {
1432 		unsigned char min_scope = min(ifa->ifa_scope, localnet_scope);
1433 
1434 		if (!addr &&
1435 		    (local == ifa->ifa_local || !local) &&
1436 		    min_scope <= scope) {
1437 			addr = ifa->ifa_local;
1438 			if (same)
1439 				break;
1440 		}
1441 		if (!same) {
1442 			same = (!local || inet_ifa_match(local, ifa)) &&
1443 				(!dst || inet_ifa_match(dst, ifa));
1444 			if (same && addr) {
1445 				if (local || !dst)
1446 					break;
1447 				/* Is the selected addr into dst subnet? */
1448 				if (inet_ifa_match(addr, ifa))
1449 					break;
1450 				/* No, then can we use new local src? */
1451 				if (min_scope <= scope) {
1452 					addr = ifa->ifa_local;
1453 					break;
1454 				}
1455 				/* search for large dst subnet for addr */
1456 				same = 0;
1457 			}
1458 		}
1459 	}
1460 
1461 	return same ? addr : 0;
1462 }
1463 
1464 /*
1465  * Confirm that local IP address exists using wildcards:
1466  * - net: netns to check, cannot be NULL
1467  * - in_dev: only on this interface, NULL=any interface
1468  * - dst: only in the same subnet as dst, 0=any dst
1469  * - local: address, 0=autoselect the local address
1470  * - scope: maximum allowed scope value for the local address
1471  */
1472 __be32 inet_confirm_addr(struct net *net, struct in_device *in_dev,
1473 			 __be32 dst, __be32 local, int scope)
1474 {
1475 	__be32 addr = 0;
1476 	struct net_device *dev;
1477 
1478 	if (in_dev)
1479 		return confirm_addr_indev(in_dev, dst, local, scope);
1480 
1481 	rcu_read_lock();
1482 	for_each_netdev_rcu(net, dev) {
1483 		in_dev = __in_dev_get_rcu(dev);
1484 		if (in_dev) {
1485 			addr = confirm_addr_indev(in_dev, dst, local, scope);
1486 			if (addr)
1487 				break;
1488 		}
1489 	}
1490 	rcu_read_unlock();
1491 
1492 	return addr;
1493 }
1494 EXPORT_SYMBOL(inet_confirm_addr);
1495 
1496 /*
1497  *	Device notifier
1498  */
1499 
1500 int register_inetaddr_notifier(struct notifier_block *nb)
1501 {
1502 	return blocking_notifier_chain_register(&inetaddr_chain, nb);
1503 }
1504 EXPORT_SYMBOL(register_inetaddr_notifier);
1505 
1506 int unregister_inetaddr_notifier(struct notifier_block *nb)
1507 {
1508 	return blocking_notifier_chain_unregister(&inetaddr_chain, nb);
1509 }
1510 EXPORT_SYMBOL(unregister_inetaddr_notifier);
1511 
1512 int register_inetaddr_validator_notifier(struct notifier_block *nb)
1513 {
1514 	return blocking_notifier_chain_register(&inetaddr_validator_chain, nb);
1515 }
1516 EXPORT_SYMBOL(register_inetaddr_validator_notifier);
1517 
1518 int unregister_inetaddr_validator_notifier(struct notifier_block *nb)
1519 {
1520 	return blocking_notifier_chain_unregister(&inetaddr_validator_chain,
1521 	    nb);
1522 }
1523 EXPORT_SYMBOL(unregister_inetaddr_validator_notifier);
1524 
1525 /* Rename ifa_labels for a device name change. Make some effort to preserve
1526  * existing alias numbering and to create unique labels if possible.
1527 */
1528 static void inetdev_changename(struct net_device *dev, struct in_device *in_dev)
1529 {
1530 	struct in_ifaddr *ifa;
1531 	int named = 0;
1532 
1533 	in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1534 		char old[IFNAMSIZ], *dot;
1535 
1536 		memcpy(old, ifa->ifa_label, IFNAMSIZ);
1537 		memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1538 		if (named++ == 0)
1539 			goto skip;
1540 		dot = strchr(old, ':');
1541 		if (!dot) {
1542 			sprintf(old, ":%d", named);
1543 			dot = old;
1544 		}
1545 		if (strlen(dot) + strlen(dev->name) < IFNAMSIZ)
1546 			strcat(ifa->ifa_label, dot);
1547 		else
1548 			strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
1549 skip:
1550 		rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
1551 	}
1552 }
1553 
1554 static void inetdev_send_gratuitous_arp(struct net_device *dev,
1555 					struct in_device *in_dev)
1556 
1557 {
1558 	const struct in_ifaddr *ifa;
1559 
1560 	in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1561 		arp_send(ARPOP_REQUEST, ETH_P_ARP,
1562 			 ifa->ifa_local, dev,
1563 			 ifa->ifa_local, NULL,
1564 			 dev->dev_addr, NULL);
1565 	}
1566 }
1567 
1568 /* Called only under RTNL semaphore */
1569 
1570 static int inetdev_event(struct notifier_block *this, unsigned long event,
1571 			 void *ptr)
1572 {
1573 	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1574 	struct in_device *in_dev = __in_dev_get_rtnl(dev);
1575 
1576 	ASSERT_RTNL();
1577 
1578 	if (!in_dev) {
1579 		if (event == NETDEV_REGISTER) {
1580 			in_dev = inetdev_init(dev);
1581 			if (IS_ERR(in_dev))
1582 				return notifier_from_errno(PTR_ERR(in_dev));
1583 			if (dev->flags & IFF_LOOPBACK) {
1584 				IN_DEV_CONF_SET(in_dev, NOXFRM, 1);
1585 				IN_DEV_CONF_SET(in_dev, NOPOLICY, 1);
1586 			}
1587 		} else if (event == NETDEV_CHANGEMTU) {
1588 			/* Re-enabling IP */
1589 			if (inetdev_valid_mtu(dev->mtu))
1590 				in_dev = inetdev_init(dev);
1591 		}
1592 		goto out;
1593 	}
1594 
1595 	switch (event) {
1596 	case NETDEV_REGISTER:
1597 		pr_debug("%s: bug\n", __func__);
1598 		RCU_INIT_POINTER(dev->ip_ptr, NULL);
1599 		break;
1600 	case NETDEV_UP:
1601 		if (!inetdev_valid_mtu(dev->mtu))
1602 			break;
1603 		if (dev->flags & IFF_LOOPBACK) {
1604 			struct in_ifaddr *ifa = inet_alloc_ifa(in_dev);
1605 
1606 			if (ifa) {
1607 				ifa->ifa_local =
1608 				  ifa->ifa_address = htonl(INADDR_LOOPBACK);
1609 				ifa->ifa_prefixlen = 8;
1610 				ifa->ifa_mask = inet_make_mask(8);
1611 				ifa->ifa_scope = RT_SCOPE_HOST;
1612 				memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1613 				set_ifa_lifetime(ifa, INFINITY_LIFE_TIME,
1614 						 INFINITY_LIFE_TIME);
1615 				ipv4_devconf_setall(in_dev);
1616 				neigh_parms_data_state_setall(in_dev->arp_parms);
1617 				inet_insert_ifa(ifa);
1618 			}
1619 		}
1620 		ip_mc_up(in_dev);
1621 		fallthrough;
1622 	case NETDEV_CHANGEADDR:
1623 		if (!IN_DEV_ARP_NOTIFY(in_dev))
1624 			break;
1625 		fallthrough;
1626 	case NETDEV_NOTIFY_PEERS:
1627 		/* Send gratuitous ARP to notify of link change */
1628 		inetdev_send_gratuitous_arp(dev, in_dev);
1629 		break;
1630 	case NETDEV_DOWN:
1631 		ip_mc_down(in_dev);
1632 		break;
1633 	case NETDEV_PRE_TYPE_CHANGE:
1634 		ip_mc_unmap(in_dev);
1635 		break;
1636 	case NETDEV_POST_TYPE_CHANGE:
1637 		ip_mc_remap(in_dev);
1638 		break;
1639 	case NETDEV_CHANGEMTU:
1640 		if (inetdev_valid_mtu(dev->mtu))
1641 			break;
1642 		/* disable IP when MTU is not enough */
1643 		fallthrough;
1644 	case NETDEV_UNREGISTER:
1645 		inetdev_destroy(in_dev);
1646 		break;
1647 	case NETDEV_CHANGENAME:
1648 		/* Do not notify about label change, this event is
1649 		 * not interesting to applications using netlink.
1650 		 */
1651 		inetdev_changename(dev, in_dev);
1652 
1653 		devinet_sysctl_unregister(in_dev);
1654 		devinet_sysctl_register(in_dev);
1655 		break;
1656 	}
1657 out:
1658 	return NOTIFY_DONE;
1659 }
1660 
1661 static struct notifier_block ip_netdev_notifier = {
1662 	.notifier_call = inetdev_event,
1663 };
1664 
1665 static size_t inet_nlmsg_size(void)
1666 {
1667 	return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
1668 	       + nla_total_size(4) /* IFA_ADDRESS */
1669 	       + nla_total_size(4) /* IFA_LOCAL */
1670 	       + nla_total_size(4) /* IFA_BROADCAST */
1671 	       + nla_total_size(IFNAMSIZ) /* IFA_LABEL */
1672 	       + nla_total_size(4)  /* IFA_FLAGS */
1673 	       + nla_total_size(1)  /* IFA_PROTO */
1674 	       + nla_total_size(4)  /* IFA_RT_PRIORITY */
1675 	       + nla_total_size(sizeof(struct ifa_cacheinfo)); /* IFA_CACHEINFO */
1676 }
1677 
1678 static inline u32 cstamp_delta(unsigned long cstamp)
1679 {
1680 	return (cstamp - INITIAL_JIFFIES) * 100UL / HZ;
1681 }
1682 
1683 static int put_cacheinfo(struct sk_buff *skb, unsigned long cstamp,
1684 			 unsigned long tstamp, u32 preferred, u32 valid)
1685 {
1686 	struct ifa_cacheinfo ci;
1687 
1688 	ci.cstamp = cstamp_delta(cstamp);
1689 	ci.tstamp = cstamp_delta(tstamp);
1690 	ci.ifa_prefered = preferred;
1691 	ci.ifa_valid = valid;
1692 
1693 	return nla_put(skb, IFA_CACHEINFO, sizeof(ci), &ci);
1694 }
1695 
1696 static int inet_fill_ifaddr(struct sk_buff *skb, const struct in_ifaddr *ifa,
1697 			    struct inet_fill_args *args)
1698 {
1699 	struct ifaddrmsg *ifm;
1700 	struct nlmsghdr  *nlh;
1701 	unsigned long tstamp;
1702 	u32 preferred, valid;
1703 	u32 flags;
1704 
1705 	nlh = nlmsg_put(skb, args->portid, args->seq, args->event, sizeof(*ifm),
1706 			args->flags);
1707 	if (!nlh)
1708 		return -EMSGSIZE;
1709 
1710 	ifm = nlmsg_data(nlh);
1711 	ifm->ifa_family = AF_INET;
1712 	ifm->ifa_prefixlen = ifa->ifa_prefixlen;
1713 
1714 	flags = READ_ONCE(ifa->ifa_flags);
1715 	/* Warning : ifm->ifa_flags is an __u8, it holds only 8 bits.
1716 	 * The 32bit value is given in IFA_FLAGS attribute.
1717 	 */
1718 	ifm->ifa_flags = (__u8)flags;
1719 
1720 	ifm->ifa_scope = ifa->ifa_scope;
1721 	ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
1722 
1723 	if (args->netnsid >= 0 &&
1724 	    nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid))
1725 		goto nla_put_failure;
1726 
1727 	tstamp = READ_ONCE(ifa->ifa_tstamp);
1728 	if (!(flags & IFA_F_PERMANENT)) {
1729 		preferred = READ_ONCE(ifa->ifa_preferred_lft);
1730 		valid = READ_ONCE(ifa->ifa_valid_lft);
1731 		if (preferred != INFINITY_LIFE_TIME) {
1732 			long tval = (jiffies - tstamp) / HZ;
1733 
1734 			if (preferred > tval)
1735 				preferred -= tval;
1736 			else
1737 				preferred = 0;
1738 			if (valid != INFINITY_LIFE_TIME) {
1739 				if (valid > tval)
1740 					valid -= tval;
1741 				else
1742 					valid = 0;
1743 			}
1744 		}
1745 	} else {
1746 		preferred = INFINITY_LIFE_TIME;
1747 		valid = INFINITY_LIFE_TIME;
1748 	}
1749 	if ((ifa->ifa_address &&
1750 	     nla_put_in_addr(skb, IFA_ADDRESS, ifa->ifa_address)) ||
1751 	    (ifa->ifa_local &&
1752 	     nla_put_in_addr(skb, IFA_LOCAL, ifa->ifa_local)) ||
1753 	    (ifa->ifa_broadcast &&
1754 	     nla_put_in_addr(skb, IFA_BROADCAST, ifa->ifa_broadcast)) ||
1755 	    (ifa->ifa_label[0] &&
1756 	     nla_put_string(skb, IFA_LABEL, ifa->ifa_label)) ||
1757 	    (ifa->ifa_proto &&
1758 	     nla_put_u8(skb, IFA_PROTO, ifa->ifa_proto)) ||
1759 	    nla_put_u32(skb, IFA_FLAGS, flags) ||
1760 	    (ifa->ifa_rt_priority &&
1761 	     nla_put_u32(skb, IFA_RT_PRIORITY, ifa->ifa_rt_priority)) ||
1762 	    put_cacheinfo(skb, READ_ONCE(ifa->ifa_cstamp), tstamp,
1763 			  preferred, valid))
1764 		goto nla_put_failure;
1765 
1766 	nlmsg_end(skb, nlh);
1767 	return 0;
1768 
1769 nla_put_failure:
1770 	nlmsg_cancel(skb, nlh);
1771 	return -EMSGSIZE;
1772 }
1773 
1774 static int inet_valid_dump_ifaddr_req(const struct nlmsghdr *nlh,
1775 				      struct inet_fill_args *fillargs,
1776 				      struct net **tgt_net, struct sock *sk,
1777 				      struct netlink_callback *cb)
1778 {
1779 	struct netlink_ext_ack *extack = cb->extack;
1780 	struct nlattr *tb[IFA_MAX+1];
1781 	struct ifaddrmsg *ifm;
1782 	int err, i;
1783 
1784 	ifm = nlmsg_payload(nlh, sizeof(*ifm));
1785 	if (!ifm) {
1786 		NL_SET_ERR_MSG(extack, "ipv4: Invalid header for address dump request");
1787 		return -EINVAL;
1788 	}
1789 
1790 	if (ifm->ifa_prefixlen || ifm->ifa_flags || ifm->ifa_scope) {
1791 		NL_SET_ERR_MSG(extack, "ipv4: Invalid values in header for address dump request");
1792 		return -EINVAL;
1793 	}
1794 
1795 	fillargs->ifindex = ifm->ifa_index;
1796 	if (fillargs->ifindex) {
1797 		cb->answer_flags |= NLM_F_DUMP_FILTERED;
1798 		fillargs->flags |= NLM_F_DUMP_FILTERED;
1799 	}
1800 
1801 	err = nlmsg_parse_deprecated_strict(nlh, sizeof(*ifm), tb, IFA_MAX,
1802 					    ifa_ipv4_policy, extack);
1803 	if (err < 0)
1804 		return err;
1805 
1806 	for (i = 0; i <= IFA_MAX; ++i) {
1807 		if (!tb[i])
1808 			continue;
1809 
1810 		if (i == IFA_TARGET_NETNSID) {
1811 			struct net *net;
1812 
1813 			fillargs->netnsid = nla_get_s32(tb[i]);
1814 
1815 			net = rtnl_get_net_ns_capable(sk, fillargs->netnsid);
1816 			if (IS_ERR(net)) {
1817 				fillargs->netnsid = -1;
1818 				NL_SET_ERR_MSG(extack, "ipv4: Invalid target network namespace id");
1819 				return PTR_ERR(net);
1820 			}
1821 			*tgt_net = net;
1822 		} else {
1823 			NL_SET_ERR_MSG(extack, "ipv4: Unsupported attribute in dump request");
1824 			return -EINVAL;
1825 		}
1826 	}
1827 
1828 	return 0;
1829 }
1830 
1831 static int in_dev_dump_ifmcaddr(struct in_device *in_dev, struct sk_buff *skb,
1832 				struct netlink_callback *cb, int *s_ip_idx,
1833 				struct inet_fill_args *fillargs)
1834 {
1835 	struct ip_mc_list *im;
1836 	int ip_idx = 0;
1837 	int err;
1838 
1839 	for (im = rcu_dereference(in_dev->mc_list);
1840 	     im;
1841 	     im = rcu_dereference(im->next_rcu)) {
1842 		if (ip_idx < *s_ip_idx) {
1843 			ip_idx++;
1844 			continue;
1845 		}
1846 		err = inet_fill_ifmcaddr(skb, in_dev->dev, im, fillargs);
1847 		if (err < 0)
1848 			goto done;
1849 
1850 		nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1851 		ip_idx++;
1852 	}
1853 	err = 0;
1854 	ip_idx = 0;
1855 done:
1856 	*s_ip_idx = ip_idx;
1857 	return err;
1858 }
1859 
1860 static int in_dev_dump_ifaddr(struct in_device *in_dev, struct sk_buff *skb,
1861 			      struct netlink_callback *cb, int *s_ip_idx,
1862 			      struct inet_fill_args *fillargs)
1863 {
1864 	struct in_ifaddr *ifa;
1865 	int ip_idx = 0;
1866 	int err;
1867 
1868 	in_dev_for_each_ifa_rcu(ifa, in_dev) {
1869 		if (ip_idx < *s_ip_idx) {
1870 			ip_idx++;
1871 			continue;
1872 		}
1873 		err = inet_fill_ifaddr(skb, ifa, fillargs);
1874 		if (err < 0)
1875 			goto done;
1876 
1877 		nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1878 		ip_idx++;
1879 	}
1880 	err = 0;
1881 	ip_idx = 0;
1882 done:
1883 	*s_ip_idx = ip_idx;
1884 
1885 	return err;
1886 }
1887 
1888 static int in_dev_dump_addr(struct in_device *in_dev, struct sk_buff *skb,
1889 			    struct netlink_callback *cb, int *s_ip_idx,
1890 			    struct inet_fill_args *fillargs)
1891 {
1892 	switch (fillargs->event) {
1893 	case RTM_NEWADDR:
1894 		return in_dev_dump_ifaddr(in_dev, skb, cb, s_ip_idx, fillargs);
1895 	case RTM_GETMULTICAST:
1896 		return in_dev_dump_ifmcaddr(in_dev, skb, cb, s_ip_idx,
1897 					    fillargs);
1898 	default:
1899 		return -EINVAL;
1900 	}
1901 }
1902 
1903 /* Combine dev_addr_genid and dev_base_seq to detect changes.
1904  */
1905 static u32 inet_base_seq(const struct net *net)
1906 {
1907 	u32 res = atomic_read(&net->ipv4.dev_addr_genid) +
1908 		  READ_ONCE(net->dev_base_seq);
1909 
1910 	/* Must not return 0 (see nl_dump_check_consistent()).
1911 	 * Chose a value far away from 0.
1912 	 */
1913 	if (!res)
1914 		res = 0x80000000;
1915 	return res;
1916 }
1917 
1918 static int inet_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
1919 			  int event)
1920 {
1921 	const struct nlmsghdr *nlh = cb->nlh;
1922 	struct inet_fill_args fillargs = {
1923 		.portid = NETLINK_CB(cb->skb).portid,
1924 		.seq = nlh->nlmsg_seq,
1925 		.event = event,
1926 		.flags = NLM_F_MULTI,
1927 		.netnsid = -1,
1928 	};
1929 	struct net *net = sock_net(skb->sk);
1930 	struct net *tgt_net = net;
1931 	struct {
1932 		unsigned long ifindex;
1933 		int ip_idx;
1934 	} *ctx = (void *)cb->ctx;
1935 	struct in_device *in_dev;
1936 	struct net_device *dev;
1937 	int err = 0;
1938 
1939 	rcu_read_lock();
1940 	if (cb->strict_check) {
1941 		err = inet_valid_dump_ifaddr_req(nlh, &fillargs, &tgt_net,
1942 						 skb->sk, cb);
1943 		if (err < 0)
1944 			goto done;
1945 
1946 		if (fillargs.ifindex) {
1947 			dev = dev_get_by_index_rcu(tgt_net, fillargs.ifindex);
1948 			if (!dev) {
1949 				err = -ENODEV;
1950 				goto done;
1951 			}
1952 			in_dev = __in_dev_get_rcu(dev);
1953 			if (!in_dev)
1954 				goto done;
1955 			err = in_dev_dump_addr(in_dev, skb, cb, &ctx->ip_idx,
1956 					       &fillargs);
1957 			goto done;
1958 		}
1959 	}
1960 
1961 	cb->seq = inet_base_seq(tgt_net);
1962 
1963 	for_each_netdev_dump(tgt_net, dev, ctx->ifindex) {
1964 		in_dev = __in_dev_get_rcu(dev);
1965 		if (!in_dev)
1966 			continue;
1967 		err = in_dev_dump_addr(in_dev, skb, cb, &ctx->ip_idx,
1968 				       &fillargs);
1969 		if (err < 0)
1970 			goto done;
1971 	}
1972 done:
1973 	if (fillargs.netnsid >= 0)
1974 		put_net(tgt_net);
1975 	rcu_read_unlock();
1976 	return err;
1977 }
1978 
1979 static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1980 {
1981 	return inet_dump_addr(skb, cb, RTM_NEWADDR);
1982 }
1983 
1984 static int inet_dump_ifmcaddr(struct sk_buff *skb, struct netlink_callback *cb)
1985 {
1986 	return inet_dump_addr(skb, cb, RTM_GETMULTICAST);
1987 }
1988 
1989 static void rtmsg_ifa(int event, struct in_ifaddr *ifa, struct nlmsghdr *nlh,
1990 		      u32 portid)
1991 {
1992 	struct inet_fill_args fillargs = {
1993 		.portid = portid,
1994 		.seq = nlh ? nlh->nlmsg_seq : 0,
1995 		.event = event,
1996 		.flags = 0,
1997 		.netnsid = -1,
1998 	};
1999 	struct sk_buff *skb;
2000 	int err = -ENOBUFS;
2001 	struct net *net;
2002 
2003 	net = dev_net(ifa->ifa_dev->dev);
2004 	skb = nlmsg_new(inet_nlmsg_size(), GFP_KERNEL);
2005 	if (!skb)
2006 		goto errout;
2007 
2008 	err = inet_fill_ifaddr(skb, ifa, &fillargs);
2009 	if (err < 0) {
2010 		/* -EMSGSIZE implies BUG in inet_nlmsg_size() */
2011 		WARN_ON(err == -EMSGSIZE);
2012 		kfree_skb(skb);
2013 		goto errout;
2014 	}
2015 	rtnl_notify(skb, net, portid, RTNLGRP_IPV4_IFADDR, nlh, GFP_KERNEL);
2016 	return;
2017 errout:
2018 	rtnl_set_sk_err(net, RTNLGRP_IPV4_IFADDR, err);
2019 }
2020 
2021 static size_t inet_get_link_af_size(const struct net_device *dev,
2022 				    u32 ext_filter_mask)
2023 {
2024 	struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr);
2025 
2026 	if (!in_dev)
2027 		return 0;
2028 
2029 	return nla_total_size(IPV4_DEVCONF_MAX * 4); /* IFLA_INET_CONF */
2030 }
2031 
2032 static int inet_fill_link_af(struct sk_buff *skb, const struct net_device *dev,
2033 			     u32 ext_filter_mask)
2034 {
2035 	struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr);
2036 	struct nlattr *nla;
2037 	int i;
2038 
2039 	if (!in_dev)
2040 		return -ENODATA;
2041 
2042 	nla = nla_reserve(skb, IFLA_INET_CONF, IPV4_DEVCONF_MAX * 4);
2043 	if (!nla)
2044 		return -EMSGSIZE;
2045 
2046 	for (i = 0; i < IPV4_DEVCONF_MAX; i++)
2047 		((u32 *) nla_data(nla))[i] = READ_ONCE(in_dev->cnf.data[i]);
2048 
2049 	return 0;
2050 }
2051 
2052 static const struct nla_policy inet_af_policy[IFLA_INET_MAX+1] = {
2053 	[IFLA_INET_CONF]	= { .type = NLA_NESTED },
2054 };
2055 
2056 static const struct nla_policy inet_devconf_policy[IPV4_DEVCONF_MAX + 1] = {
2057 	[IPV4_DEVCONF_FORWARDING]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2058 	[IPV4_DEVCONF_MC_FORWARDING]	= { .type = NLA_REJECT },
2059 	[IPV4_DEVCONF_PROXY_ARP]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2060 	[IPV4_DEVCONF_ACCEPT_REDIRECTS]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2061 	[IPV4_DEVCONF_SECURE_REDIRECTS]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2062 	[IPV4_DEVCONF_SEND_REDIRECTS]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2063 	[IPV4_DEVCONF_SHARED_MEDIA]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2064 	[IPV4_DEVCONF_RP_FILTER]	= NLA_POLICY_RANGE(NLA_U32, 0, 2),
2065 	[IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE] = NLA_POLICY_RANGE(NLA_U32, 0, 1),
2066 	[IPV4_DEVCONF_BOOTP_RELAY]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2067 	[IPV4_DEVCONF_LOG_MARTIANS]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2068 	[IPV4_DEVCONF_TAG]		= { .type = NLA_U32 },
2069 	[IPV4_DEVCONF_ARPFILTER]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2070 	[IPV4_DEVCONF_MEDIUM_ID]	= NLA_POLICY_MIN(NLA_S32, -1),
2071 	[IPV4_DEVCONF_NOXFRM]		= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2072 	[IPV4_DEVCONF_NOPOLICY]		= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2073 	[IPV4_DEVCONF_FORCE_IGMP_VERSION] = NLA_POLICY_RANGE(NLA_U32, 0, 3),
2074 	[IPV4_DEVCONF_ARP_ANNOUNCE]	= NLA_POLICY_RANGE(NLA_U32, 0, 2),
2075 	[IPV4_DEVCONF_ARP_IGNORE]	= NLA_POLICY_RANGE(NLA_U32, 0, 8),
2076 	[IPV4_DEVCONF_PROMOTE_SECONDARIES] = NLA_POLICY_RANGE(NLA_U32, 0, 1),
2077 	[IPV4_DEVCONF_ARP_ACCEPT]	= NLA_POLICY_RANGE(NLA_U32, 0, 2),
2078 	[IPV4_DEVCONF_ARP_NOTIFY]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2079 	[IPV4_DEVCONF_ACCEPT_LOCAL]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2080 	[IPV4_DEVCONF_SRC_VMARK]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2081 	[IPV4_DEVCONF_PROXY_ARP_PVLAN]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2082 	[IPV4_DEVCONF_ROUTE_LOCALNET]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2083 	[IPV4_DEVCONF_BC_FORWARDING]	= NLA_POLICY_RANGE(NLA_U32, 0, 1),
2084 	[IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL] = { .type = NLA_U32 },
2085 	[IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL] = { .type = NLA_U32 },
2086 	[IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN] =
2087 		NLA_POLICY_RANGE(NLA_U32, 0, 1),
2088 	[IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST] =
2089 		NLA_POLICY_RANGE(NLA_U32, 0, 1),
2090 	[IPV4_DEVCONF_DROP_GRATUITOUS_ARP] = NLA_POLICY_RANGE(NLA_U32, 0, 1),
2091 	[IPV4_DEVCONF_ARP_EVICT_NOCARRIER] = NLA_POLICY_RANGE(NLA_U32, 0, 1),
2092 };
2093 
2094 static int inet_validate_link_af(const struct net_device *dev,
2095 				 const struct nlattr *nla,
2096 				 struct netlink_ext_ack *extack)
2097 {
2098 	struct nlattr *tb[IFLA_INET_MAX + 1], *nested_tb[IPV4_DEVCONF_MAX + 1];
2099 	int err;
2100 
2101 	if (dev && !__in_dev_get_rtnl(dev))
2102 		return -EAFNOSUPPORT;
2103 
2104 	err = nla_parse_nested_deprecated(tb, IFLA_INET_MAX, nla,
2105 					  inet_af_policy, extack);
2106 	if (err < 0)
2107 		return err;
2108 
2109 	if (tb[IFLA_INET_CONF]) {
2110 		err = nla_parse(nested_tb, IPV4_DEVCONF_MAX,
2111 				nla_data(tb[IFLA_INET_CONF]),
2112 				nla_len(tb[IFLA_INET_CONF]),
2113 				inet_devconf_policy, extack);
2114 
2115 		if (err < 0)
2116 			return err;
2117 	}
2118 
2119 	return 0;
2120 }
2121 
2122 static bool devinet_conf_post_set(struct net *net, struct ipv4_devconf *cnf,
2123 				  int attr, int new, int old, int ifindex)
2124 {
2125 	if (new == old)
2126 		return false;
2127 
2128 	switch (attr) {
2129 	case IPV4_DEVCONF_ROUTE_LOCALNET:
2130 	case IPV4_DEVCONF_ACCEPT_LOCAL:
2131 		if (new == 0)
2132 			return true;
2133 		break;
2134 	case IPV4_DEVCONF_NOXFRM:
2135 	case IPV4_DEVCONF_NOPOLICY:
2136 	case IPV4_DEVCONF_PROMOTE_SECONDARIES:
2137 	case IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST:
2138 	case IPV4_DEVCONF_BC_FORWARDING:
2139 		return true;
2140 	case IPV4_DEVCONF_RP_FILTER:
2141 		inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2142 					    NETCONFA_RP_FILTER,
2143 					    ifindex, cnf);
2144 		break;
2145 	case IPV4_DEVCONF_PROXY_ARP:
2146 		inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2147 					    NETCONFA_PROXY_NEIGH,
2148 					    ifindex, cnf);
2149 		break;
2150 	case IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN:
2151 		inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2152 					    NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
2153 					    ifindex, cnf);
2154 		break;
2155 	case IPV4_DEVCONF_FORWARDING:
2156 		if (new == 1) {
2157 			/* it is safe to use container_of() because forwarding case
2158 			 * is only used by the netlink path
2159 			 */
2160 			struct in_device *idev = container_of(cnf, struct in_device, cnf);
2161 
2162 			netif_disable_lro(idev->dev);
2163 		}
2164 
2165 		inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2166 					    NETCONFA_FORWARDING,
2167 					    ifindex, cnf);
2168 		return true;
2169 	default:
2170 		break;
2171 	}
2172 
2173 	return false;
2174 }
2175 
2176 static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla,
2177 			    struct netlink_ext_ack *extack)
2178 {
2179 	struct in_device *in_dev = __in_dev_get_rtnl(dev);
2180 	struct nlattr *a, *tb[IFLA_INET_MAX+1];
2181 	struct net *net = dev_net(dev);
2182 	bool flush_cache = false;
2183 	int rem;
2184 
2185 	if (!in_dev)
2186 		return -EAFNOSUPPORT;
2187 
2188 	if (nla_parse_nested_deprecated(tb, IFLA_INET_MAX, nla, NULL, NULL) < 0)
2189 		return -EINVAL;
2190 
2191 	if (tb[IFLA_INET_CONF]) {
2192 		nla_for_each_nested(a, tb[IFLA_INET_CONF], rem) {
2193 			int old_value = ipv4_devconf_get(in_dev, nla_type(a));
2194 			int new_value = nla_get_u32(a);
2195 
2196 			ipv4_devconf_set(in_dev, nla_type(a), new_value);
2197 			if (devinet_conf_post_set(net, &in_dev->cnf, nla_type(a), new_value,
2198 						  old_value, dev->ifindex))
2199 				flush_cache = true;
2200 		}
2201 		if (flush_cache)
2202 			rt_cache_flush(net);
2203 	}
2204 
2205 	return 0;
2206 }
2207 
2208 static int inet_netconf_msgsize_devconf(int type)
2209 {
2210 	int size = NLMSG_ALIGN(sizeof(struct netconfmsg))
2211 		   + nla_total_size(4);	/* NETCONFA_IFINDEX */
2212 	bool all = false;
2213 
2214 	if (type == NETCONFA_ALL)
2215 		all = true;
2216 
2217 	if (all || type == NETCONFA_FORWARDING)
2218 		size += nla_total_size(4);
2219 	if (all || type == NETCONFA_RP_FILTER)
2220 		size += nla_total_size(4);
2221 	if (all || type == NETCONFA_MC_FORWARDING)
2222 		size += nla_total_size(4);
2223 	if (all || type == NETCONFA_BC_FORWARDING)
2224 		size += nla_total_size(4);
2225 	if (all || type == NETCONFA_PROXY_NEIGH)
2226 		size += nla_total_size(4);
2227 	if (all || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN)
2228 		size += nla_total_size(4);
2229 
2230 	return size;
2231 }
2232 
2233 static int inet_netconf_fill_devconf(struct sk_buff *skb, int ifindex,
2234 				     const struct ipv4_devconf *devconf,
2235 				     u32 portid, u32 seq, int event,
2236 				     unsigned int flags, int type)
2237 {
2238 	struct nlmsghdr  *nlh;
2239 	struct netconfmsg *ncm;
2240 	bool all = false;
2241 
2242 	nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct netconfmsg),
2243 			flags);
2244 	if (!nlh)
2245 		return -EMSGSIZE;
2246 
2247 	if (type == NETCONFA_ALL)
2248 		all = true;
2249 
2250 	ncm = nlmsg_data(nlh);
2251 	ncm->ncm_family = AF_INET;
2252 
2253 	if (nla_put_s32(skb, NETCONFA_IFINDEX, ifindex) < 0)
2254 		goto nla_put_failure;
2255 
2256 	if (!devconf)
2257 		goto out;
2258 
2259 	if ((all || type == NETCONFA_FORWARDING) &&
2260 	    nla_put_s32(skb, NETCONFA_FORWARDING,
2261 			IPV4_DEVCONF_RO(*devconf, FORWARDING)) < 0)
2262 		goto nla_put_failure;
2263 	if ((all || type == NETCONFA_RP_FILTER) &&
2264 	    nla_put_s32(skb, NETCONFA_RP_FILTER,
2265 			IPV4_DEVCONF_RO(*devconf, RP_FILTER)) < 0)
2266 		goto nla_put_failure;
2267 	if ((all || type == NETCONFA_MC_FORWARDING) &&
2268 	    nla_put_s32(skb, NETCONFA_MC_FORWARDING,
2269 			IPV4_DEVCONF_RO(*devconf, MC_FORWARDING)) < 0)
2270 		goto nla_put_failure;
2271 	if ((all || type == NETCONFA_BC_FORWARDING) &&
2272 	    nla_put_s32(skb, NETCONFA_BC_FORWARDING,
2273 			IPV4_DEVCONF_RO(*devconf, BC_FORWARDING)) < 0)
2274 		goto nla_put_failure;
2275 	if ((all || type == NETCONFA_PROXY_NEIGH) &&
2276 	    nla_put_s32(skb, NETCONFA_PROXY_NEIGH,
2277 			IPV4_DEVCONF_RO(*devconf, PROXY_ARP)) < 0)
2278 		goto nla_put_failure;
2279 	if ((all || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN) &&
2280 	    nla_put_s32(skb, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
2281 			IPV4_DEVCONF_RO(*devconf,
2282 					IGNORE_ROUTES_WITH_LINKDOWN)) < 0)
2283 		goto nla_put_failure;
2284 
2285 out:
2286 	nlmsg_end(skb, nlh);
2287 	return 0;
2288 
2289 nla_put_failure:
2290 	nlmsg_cancel(skb, nlh);
2291 	return -EMSGSIZE;
2292 }
2293 
2294 void inet_netconf_notify_devconf(struct net *net, int event, int type,
2295 				 int ifindex, struct ipv4_devconf *devconf)
2296 {
2297 	struct sk_buff *skb;
2298 	int err = -ENOBUFS;
2299 
2300 	skb = nlmsg_new(inet_netconf_msgsize_devconf(type), GFP_KERNEL);
2301 	if (!skb)
2302 		goto errout;
2303 
2304 	err = inet_netconf_fill_devconf(skb, ifindex, devconf, 0, 0,
2305 					event, 0, type);
2306 	if (err < 0) {
2307 		/* -EMSGSIZE implies BUG in inet_netconf_msgsize_devconf() */
2308 		WARN_ON(err == -EMSGSIZE);
2309 		kfree_skb(skb);
2310 		goto errout;
2311 	}
2312 	rtnl_notify(skb, net, 0, RTNLGRP_IPV4_NETCONF, NULL, GFP_KERNEL);
2313 	return;
2314 errout:
2315 	rtnl_set_sk_err(net, RTNLGRP_IPV4_NETCONF, err);
2316 }
2317 
2318 static const struct nla_policy devconf_ipv4_policy[NETCONFA_MAX+1] = {
2319 	[NETCONFA_IFINDEX]	= { .len = sizeof(int) },
2320 	[NETCONFA_FORWARDING]	= { .len = sizeof(int) },
2321 	[NETCONFA_RP_FILTER]	= { .len = sizeof(int) },
2322 	[NETCONFA_PROXY_NEIGH]	= { .len = sizeof(int) },
2323 	[NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN]	= { .len = sizeof(int) },
2324 };
2325 
2326 static int inet_netconf_valid_get_req(struct sk_buff *skb,
2327 				      const struct nlmsghdr *nlh,
2328 				      struct nlattr **tb,
2329 				      struct netlink_ext_ack *extack)
2330 {
2331 	int i, err;
2332 
2333 	if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(struct netconfmsg))) {
2334 		NL_SET_ERR_MSG(extack, "ipv4: Invalid header for netconf get request");
2335 		return -EINVAL;
2336 	}
2337 
2338 	if (!netlink_strict_get_check(skb))
2339 		return nlmsg_parse_deprecated(nlh, sizeof(struct netconfmsg),
2340 					      tb, NETCONFA_MAX,
2341 					      devconf_ipv4_policy, extack);
2342 
2343 	err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct netconfmsg),
2344 					    tb, NETCONFA_MAX,
2345 					    devconf_ipv4_policy, extack);
2346 	if (err)
2347 		return err;
2348 
2349 	for (i = 0; i <= NETCONFA_MAX; i++) {
2350 		if (!tb[i])
2351 			continue;
2352 
2353 		switch (i) {
2354 		case NETCONFA_IFINDEX:
2355 			break;
2356 		default:
2357 			NL_SET_ERR_MSG(extack, "ipv4: Unsupported attribute in netconf get request");
2358 			return -EINVAL;
2359 		}
2360 	}
2361 
2362 	return 0;
2363 }
2364 
2365 static int inet_netconf_get_devconf(struct sk_buff *in_skb,
2366 				    struct nlmsghdr *nlh,
2367 				    struct netlink_ext_ack *extack)
2368 {
2369 	struct net *net = sock_net(in_skb->sk);
2370 	struct nlattr *tb[NETCONFA_MAX + 1];
2371 	const struct ipv4_devconf *devconf;
2372 	struct in_device *in_dev = NULL;
2373 	struct net_device *dev = NULL;
2374 	struct sk_buff *skb;
2375 	int ifindex;
2376 	int err;
2377 
2378 	err = inet_netconf_valid_get_req(in_skb, nlh, tb, extack);
2379 	if (err)
2380 		return err;
2381 
2382 	if (!tb[NETCONFA_IFINDEX])
2383 		return -EINVAL;
2384 
2385 	ifindex = nla_get_s32(tb[NETCONFA_IFINDEX]);
2386 	switch (ifindex) {
2387 	case NETCONFA_IFINDEX_ALL:
2388 		devconf = net->ipv4.devconf_all;
2389 		break;
2390 	case NETCONFA_IFINDEX_DEFAULT:
2391 		devconf = net->ipv4.devconf_dflt;
2392 		break;
2393 	default:
2394 		err = -ENODEV;
2395 		dev = dev_get_by_index(net, ifindex);
2396 		if (dev)
2397 			in_dev = in_dev_get(dev);
2398 		if (!in_dev)
2399 			goto errout;
2400 		devconf = &in_dev->cnf;
2401 		break;
2402 	}
2403 
2404 	err = -ENOBUFS;
2405 	skb = nlmsg_new(inet_netconf_msgsize_devconf(NETCONFA_ALL), GFP_KERNEL);
2406 	if (!skb)
2407 		goto errout;
2408 
2409 	err = inet_netconf_fill_devconf(skb, ifindex, devconf,
2410 					NETLINK_CB(in_skb).portid,
2411 					nlh->nlmsg_seq, RTM_NEWNETCONF, 0,
2412 					NETCONFA_ALL);
2413 	if (err < 0) {
2414 		/* -EMSGSIZE implies BUG in inet_netconf_msgsize_devconf() */
2415 		WARN_ON(err == -EMSGSIZE);
2416 		kfree_skb(skb);
2417 		goto errout;
2418 	}
2419 	err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
2420 errout:
2421 	if (in_dev)
2422 		in_dev_put(in_dev);
2423 	dev_put(dev);
2424 	return err;
2425 }
2426 
2427 static int inet_netconf_dump_devconf(struct sk_buff *skb,
2428 				     struct netlink_callback *cb)
2429 {
2430 	const struct nlmsghdr *nlh = cb->nlh;
2431 	struct net *net = sock_net(skb->sk);
2432 	struct {
2433 		unsigned long ifindex;
2434 		unsigned int all_default;
2435 	} *ctx = (void *)cb->ctx;
2436 	const struct in_device *in_dev;
2437 	struct net_device *dev;
2438 	int err = 0;
2439 
2440 	if (cb->strict_check) {
2441 		struct netlink_ext_ack *extack = cb->extack;
2442 		struct netconfmsg *ncm;
2443 
2444 		if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ncm))) {
2445 			NL_SET_ERR_MSG(extack, "ipv4: Invalid header for netconf dump request");
2446 			return -EINVAL;
2447 		}
2448 
2449 		if (nlmsg_attrlen(nlh, sizeof(*ncm))) {
2450 			NL_SET_ERR_MSG(extack, "ipv4: Invalid data after header in netconf dump request");
2451 			return -EINVAL;
2452 		}
2453 	}
2454 
2455 	rcu_read_lock();
2456 	for_each_netdev_dump(net, dev, ctx->ifindex) {
2457 		in_dev = __in_dev_get_rcu(dev);
2458 		if (!in_dev)
2459 			continue;
2460 		err = inet_netconf_fill_devconf(skb, dev->ifindex,
2461 						&in_dev->cnf,
2462 						NETLINK_CB(cb->skb).portid,
2463 						nlh->nlmsg_seq,
2464 						RTM_NEWNETCONF, NLM_F_MULTI,
2465 						NETCONFA_ALL);
2466 		if (err < 0)
2467 			goto done;
2468 	}
2469 	if (ctx->all_default == 0) {
2470 		err = inet_netconf_fill_devconf(skb, NETCONFA_IFINDEX_ALL,
2471 						net->ipv4.devconf_all,
2472 						NETLINK_CB(cb->skb).portid,
2473 						nlh->nlmsg_seq,
2474 						RTM_NEWNETCONF, NLM_F_MULTI,
2475 						NETCONFA_ALL);
2476 		if (err < 0)
2477 			goto done;
2478 		ctx->all_default++;
2479 	}
2480 	if (ctx->all_default == 1) {
2481 		err = inet_netconf_fill_devconf(skb, NETCONFA_IFINDEX_DEFAULT,
2482 						net->ipv4.devconf_dflt,
2483 						NETLINK_CB(cb->skb).portid,
2484 						nlh->nlmsg_seq,
2485 						RTM_NEWNETCONF, NLM_F_MULTI,
2486 						NETCONFA_ALL);
2487 		if (err < 0)
2488 			goto done;
2489 		ctx->all_default++;
2490 	}
2491 done:
2492 	rcu_read_unlock();
2493 	return err;
2494 }
2495 
2496 #ifdef CONFIG_SYSCTL
2497 
2498 static void devinet_copy_dflt_conf(struct net *net, int i)
2499 {
2500 	struct net_device *dev;
2501 
2502 	rcu_read_lock();
2503 	for_each_netdev_rcu(net, dev) {
2504 		struct in_device *in_dev;
2505 
2506 		in_dev = __in_dev_get_rcu(dev);
2507 		if (in_dev && !test_bit(i, in_dev->cnf.state))
2508 			in_dev->cnf.data[i] = net->ipv4.devconf_dflt->data[i];
2509 	}
2510 	rcu_read_unlock();
2511 }
2512 
2513 /* called with RTNL locked */
2514 static void inet_forward_change(struct net *net)
2515 {
2516 	struct net_device *dev;
2517 	int on = IPV4_DEVCONF_ALL(net, FORWARDING);
2518 
2519 	IPV4_DEVCONF_ALL(net, ACCEPT_REDIRECTS) = !on;
2520 	IPV4_DEVCONF_DFLT(net, FORWARDING) = on;
2521 	inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2522 				    NETCONFA_FORWARDING,
2523 				    NETCONFA_IFINDEX_ALL,
2524 				    net->ipv4.devconf_all);
2525 	inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2526 				    NETCONFA_FORWARDING,
2527 				    NETCONFA_IFINDEX_DEFAULT,
2528 				    net->ipv4.devconf_dflt);
2529 
2530 	for_each_netdev(net, dev) {
2531 		struct in_device *in_dev;
2532 
2533 		if (on)
2534 			dev_disable_lro(dev);
2535 
2536 		in_dev = __in_dev_get_rtnl_net(dev);
2537 		if (in_dev) {
2538 			IN_DEV_CONF_SET(in_dev, FORWARDING, on);
2539 			inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2540 						    NETCONFA_FORWARDING,
2541 						    dev->ifindex, &in_dev->cnf);
2542 		}
2543 	}
2544 }
2545 
2546 static int devinet_conf_ifindex(struct net *net, struct ipv4_devconf *cnf)
2547 {
2548 	if (cnf == net->ipv4.devconf_dflt)
2549 		return NETCONFA_IFINDEX_DEFAULT;
2550 	else if (cnf == net->ipv4.devconf_all)
2551 		return NETCONFA_IFINDEX_ALL;
2552 	else {
2553 		struct in_device *idev
2554 			= container_of(cnf, struct in_device, cnf);
2555 		return idev->dev->ifindex;
2556 	}
2557 }
2558 
2559 static int devinet_conf_proc(const struct ctl_table *ctl, int write,
2560 			     void *buffer, size_t *lenp, loff_t *ppos)
2561 {
2562 	int old_value = *(int *)ctl->data;
2563 	int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
2564 	int new_value = *(int *)ctl->data;
2565 
2566 	if (write) {
2567 		struct ipv4_devconf *cnf = ctl->extra1;
2568 		int i = (int *)ctl->data - cnf->data;
2569 		struct net *net = ctl->extra2;
2570 		int ifindex;
2571 
2572 		/* These attributes are bypassing the tracking state,
2573 		 * for the rest track the state and propagate the changes
2574 		 * to default config
2575 		 */
2576 		switch (i + 1) {
2577 		case IPV4_DEVCONF_NOXFRM:
2578 		case IPV4_DEVCONF_NOPOLICY:
2579 		case IPV4_DEVCONF_PROMOTE_SECONDARIES:
2580 		case IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST:
2581 			break;
2582 		default:
2583 			set_bit(i, cnf->state);
2584 			if (cnf == net->ipv4.devconf_dflt)
2585 				devinet_copy_dflt_conf(net, i);
2586 			break;
2587 		}
2588 
2589 		ifindex = devinet_conf_ifindex(net, cnf);
2590 		if (devinet_conf_post_set(net, cnf, i + 1, new_value,
2591 					  old_value, ifindex))
2592 			rt_cache_flush(net);
2593 	}
2594 
2595 	return ret;
2596 }
2597 
2598 static int devinet_sysctl_forward(const struct ctl_table *ctl, int write,
2599 				  void *buffer, size_t *lenp, loff_t *ppos)
2600 {
2601 	struct net *net = ctl->extra2;
2602 	int *valp = ctl->data;
2603 	int val = *valp;
2604 	int ret;
2605 
2606 	if (write && !ns_capable(net->user_ns, CAP_NET_ADMIN))
2607 		return -EPERM;
2608 
2609 	ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
2610 
2611 	if (write && *valp != val) {
2612 		if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) {
2613 			if (!rtnl_net_trylock(net)) {
2614 				/* Restore the original values before restarting */
2615 				*valp = val;
2616 				return restart_syscall();
2617 			}
2618 			if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) {
2619 				inet_forward_change(net);
2620 			} else {
2621 				struct ipv4_devconf *cnf = ctl->extra1;
2622 				struct in_device *idev =
2623 					container_of(cnf, struct in_device, cnf);
2624 				if (*valp)
2625 					dev_disable_lro(idev->dev);
2626 				inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2627 							    NETCONFA_FORWARDING,
2628 							    idev->dev->ifindex,
2629 							    cnf);
2630 			}
2631 			rtnl_net_unlock(net);
2632 			rt_cache_flush(net);
2633 		} else
2634 			inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2635 						    NETCONFA_FORWARDING,
2636 						    NETCONFA_IFINDEX_DEFAULT,
2637 						    net->ipv4.devconf_dflt);
2638 	}
2639 
2640 	return ret;
2641 }
2642 
2643 #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc) \
2644 	{ \
2645 		.procname	= name, \
2646 		.data		= ipv4_devconf.data + \
2647 				  IPV4_DEVCONF_ ## attr - 1, \
2648 		.maxlen		= sizeof(int), \
2649 		.mode		= mval, \
2650 		.proc_handler	= proc, \
2651 		.extra1		= &ipv4_devconf, \
2652 	}
2653 
2654 #define DEVINET_SYSCTL_RW_ENTRY(attr, name) \
2655 	DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc)
2656 
2657 #define DEVINET_SYSCTL_RO_ENTRY(attr, name) \
2658 	DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc)
2659 
2660 #define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc) \
2661 	DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc)
2662 
2663 static struct devinet_sysctl_table {
2664 	struct ctl_table_header *sysctl_header;
2665 	struct ctl_table devinet_vars[IPV4_DEVCONF_MAX];
2666 } devinet_sysctl = {
2667 	.devinet_vars = {
2668 		DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding",
2669 					     devinet_sysctl_forward),
2670 		DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING, "mc_forwarding"),
2671 		DEVINET_SYSCTL_RW_ENTRY(BC_FORWARDING, "bc_forwarding"),
2672 
2673 		DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS, "accept_redirects"),
2674 		DEVINET_SYSCTL_RW_ENTRY(SECURE_REDIRECTS, "secure_redirects"),
2675 		DEVINET_SYSCTL_RW_ENTRY(SHARED_MEDIA, "shared_media"),
2676 		DEVINET_SYSCTL_RW_ENTRY(RP_FILTER, "rp_filter"),
2677 		DEVINET_SYSCTL_RW_ENTRY(SEND_REDIRECTS, "send_redirects"),
2678 		DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE,
2679 					"accept_source_route"),
2680 		DEVINET_SYSCTL_RW_ENTRY(ACCEPT_LOCAL, "accept_local"),
2681 		DEVINET_SYSCTL_RW_ENTRY(SRC_VMARK, "src_valid_mark"),
2682 		DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP, "proxy_arp"),
2683 		DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID, "medium_id"),
2684 		DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY, "bootp_relay"),
2685 		DEVINET_SYSCTL_RW_ENTRY(LOG_MARTIANS, "log_martians"),
2686 		DEVINET_SYSCTL_RW_ENTRY(TAG, "tag"),
2687 		DEVINET_SYSCTL_RW_ENTRY(ARPFILTER, "arp_filter"),
2688 		DEVINET_SYSCTL_RW_ENTRY(ARP_ANNOUNCE, "arp_announce"),
2689 		DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE, "arp_ignore"),
2690 		DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT, "arp_accept"),
2691 		DEVINET_SYSCTL_RW_ENTRY(ARP_NOTIFY, "arp_notify"),
2692 		DEVINET_SYSCTL_RW_ENTRY(ARP_EVICT_NOCARRIER,
2693 					"arp_evict_nocarrier"),
2694 		DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP_PVLAN, "proxy_arp_pvlan"),
2695 		DEVINET_SYSCTL_RW_ENTRY(FORCE_IGMP_VERSION,
2696 					"force_igmp_version"),
2697 		DEVINET_SYSCTL_RW_ENTRY(IGMPV2_UNSOLICITED_REPORT_INTERVAL,
2698 					"igmpv2_unsolicited_report_interval"),
2699 		DEVINET_SYSCTL_RW_ENTRY(IGMPV3_UNSOLICITED_REPORT_INTERVAL,
2700 					"igmpv3_unsolicited_report_interval"),
2701 		DEVINET_SYSCTL_RW_ENTRY(IGNORE_ROUTES_WITH_LINKDOWN,
2702 					"ignore_routes_with_linkdown"),
2703 		DEVINET_SYSCTL_RW_ENTRY(DROP_GRATUITOUS_ARP,
2704 					"drop_gratuitous_arp"),
2705 		DEVINET_SYSCTL_RW_ENTRY(NOXFRM, "disable_xfrm"),
2706 		DEVINET_SYSCTL_RW_ENTRY(NOPOLICY, "disable_policy"),
2707 		DEVINET_SYSCTL_RW_ENTRY(PROMOTE_SECONDARIES,
2708 					"promote_secondaries"),
2709 		DEVINET_SYSCTL_RW_ENTRY(ROUTE_LOCALNET,
2710 					"route_localnet"),
2711 		DEVINET_SYSCTL_RW_ENTRY(DROP_UNICAST_IN_L2_MULTICAST,
2712 					"drop_unicast_in_l2_multicast"),
2713 	},
2714 };
2715 
2716 static int __devinet_sysctl_register(struct net *net, char *dev_name,
2717 				     int ifindex, struct ipv4_devconf *p)
2718 {
2719 	int i;
2720 	struct devinet_sysctl_table *t;
2721 	char path[sizeof("net/ipv4/conf/") + IFNAMSIZ];
2722 
2723 	t = kmemdup(&devinet_sysctl, sizeof(*t), GFP_KERNEL_ACCOUNT);
2724 	if (!t)
2725 		goto out;
2726 
2727 	for (i = 0; i < ARRAY_SIZE(t->devinet_vars); i++) {
2728 		t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
2729 		t->devinet_vars[i].extra1 = p;
2730 		t->devinet_vars[i].extra2 = net;
2731 	}
2732 
2733 	snprintf(path, sizeof(path), "net/ipv4/conf/%s", dev_name);
2734 
2735 	t->sysctl_header = register_net_sysctl(net, path, t->devinet_vars);
2736 	if (!t->sysctl_header)
2737 		goto free;
2738 
2739 	p->sysctl = t;
2740 
2741 	inet_netconf_notify_devconf(net, RTM_NEWNETCONF, NETCONFA_ALL,
2742 				    ifindex, p);
2743 	return 0;
2744 
2745 free:
2746 	kfree(t);
2747 out:
2748 	return -ENOMEM;
2749 }
2750 
2751 static void __devinet_sysctl_unregister(struct net *net,
2752 					struct ipv4_devconf *cnf, int ifindex)
2753 {
2754 	struct devinet_sysctl_table *t = cnf->sysctl;
2755 
2756 	if (t) {
2757 		cnf->sysctl = NULL;
2758 		unregister_net_sysctl_table(t->sysctl_header);
2759 		kfree(t);
2760 	}
2761 
2762 	inet_netconf_notify_devconf(net, RTM_DELNETCONF, 0, ifindex, NULL);
2763 }
2764 
2765 static int devinet_sysctl_register(struct in_device *idev)
2766 {
2767 	int err;
2768 
2769 	if (!sysctl_dev_name_is_allowed(idev->dev->name))
2770 		return -EINVAL;
2771 
2772 	err = neigh_sysctl_register(idev->dev, idev->arp_parms, NULL);
2773 	if (err)
2774 		return err;
2775 	err = __devinet_sysctl_register(dev_net(idev->dev), idev->dev->name,
2776 					idev->dev->ifindex, &idev->cnf);
2777 	if (err)
2778 		neigh_sysctl_unregister(idev->arp_parms);
2779 	return err;
2780 }
2781 
2782 static void devinet_sysctl_unregister(struct in_device *idev)
2783 {
2784 	struct net *net = dev_net(idev->dev);
2785 
2786 	__devinet_sysctl_unregister(net, &idev->cnf, idev->dev->ifindex);
2787 	neigh_sysctl_unregister(idev->arp_parms);
2788 }
2789 
2790 static const struct ctl_table ctl_forward_entry[] = {
2791 	{
2792 		.procname	= "ip_forward",
2793 		.data		= &ipv4_devconf.data[
2794 					IPV4_DEVCONF_FORWARDING - 1],
2795 		.maxlen		= sizeof(int),
2796 		.mode		= 0644,
2797 		.proc_handler	= devinet_sysctl_forward,
2798 		.extra1		= &ipv4_devconf,
2799 		.extra2		= &init_net,
2800 	},
2801 };
2802 #endif
2803 
2804 static __net_init int devinet_init_net(struct net *net)
2805 {
2806 #ifdef CONFIG_SYSCTL
2807 	struct ctl_table_header *forw_hdr;
2808 	struct ctl_table *tbl;
2809 #endif
2810 	struct ipv4_devconf *all, *dflt;
2811 	int err;
2812 	int i;
2813 
2814 	err = -ENOMEM;
2815 	net->ipv4.inet_addr_lst = kmalloc_objs(struct hlist_head,
2816 					       IN4_ADDR_HSIZE);
2817 	if (!net->ipv4.inet_addr_lst)
2818 		goto err_alloc_hash;
2819 
2820 	all = kmemdup(&ipv4_devconf, sizeof(ipv4_devconf), GFP_KERNEL);
2821 	if (!all)
2822 		goto err_alloc_all;
2823 
2824 	dflt = kmemdup(&ipv4_devconf_dflt, sizeof(ipv4_devconf_dflt), GFP_KERNEL);
2825 	if (!dflt)
2826 		goto err_alloc_dflt;
2827 
2828 #ifdef CONFIG_SYSCTL
2829 	tbl = kmemdup(ctl_forward_entry, sizeof(ctl_forward_entry), GFP_KERNEL);
2830 	if (!tbl)
2831 		goto err_alloc_ctl;
2832 
2833 	tbl[0].data = &all->data[IPV4_DEVCONF_FORWARDING - 1];
2834 	tbl[0].extra1 = all;
2835 	tbl[0].extra2 = net;
2836 #endif
2837 
2838 	if (!net_eq(net, &init_net)) {
2839 		switch (net_inherit_devconf()) {
2840 		case 3:
2841 			/* copy from the current netns */
2842 			memcpy(all, current->nsproxy->net_ns->ipv4.devconf_all,
2843 			       sizeof(ipv4_devconf));
2844 			memcpy(dflt,
2845 			       current->nsproxy->net_ns->ipv4.devconf_dflt,
2846 			       sizeof(ipv4_devconf_dflt));
2847 			break;
2848 		case 0:
2849 		case 1:
2850 			/* copy from init_net */
2851 			memcpy(all, init_net.ipv4.devconf_all,
2852 			       sizeof(ipv4_devconf));
2853 			memcpy(dflt, init_net.ipv4.devconf_dflt,
2854 			       sizeof(ipv4_devconf_dflt));
2855 			break;
2856 		case 2:
2857 			/* use compiled values */
2858 			break;
2859 		}
2860 	}
2861 
2862 #ifdef CONFIG_SYSCTL
2863 	err = __devinet_sysctl_register(net, "all", NETCONFA_IFINDEX_ALL, all);
2864 	if (err < 0)
2865 		goto err_reg_all;
2866 
2867 	err = __devinet_sysctl_register(net, "default",
2868 					NETCONFA_IFINDEX_DEFAULT, dflt);
2869 	if (err < 0)
2870 		goto err_reg_dflt;
2871 
2872 	err = -ENOMEM;
2873 	forw_hdr = register_net_sysctl_sz(net, "net/ipv4", tbl,
2874 					  ARRAY_SIZE(ctl_forward_entry));
2875 	if (!forw_hdr)
2876 		goto err_reg_ctl;
2877 	net->ipv4.forw_hdr = forw_hdr;
2878 #endif
2879 
2880 	for (i = 0; i < IN4_ADDR_HSIZE; i++)
2881 		INIT_HLIST_HEAD(&net->ipv4.inet_addr_lst[i]);
2882 
2883 	INIT_DEFERRABLE_WORK(&net->ipv4.addr_chk_work, check_lifetime);
2884 
2885 	net->ipv4.devconf_all = all;
2886 	net->ipv4.devconf_dflt = dflt;
2887 	return 0;
2888 
2889 #ifdef CONFIG_SYSCTL
2890 err_reg_ctl:
2891 	__devinet_sysctl_unregister(net, dflt, NETCONFA_IFINDEX_DEFAULT);
2892 err_reg_dflt:
2893 	__devinet_sysctl_unregister(net, all, NETCONFA_IFINDEX_ALL);
2894 err_reg_all:
2895 	kfree(tbl);
2896 err_alloc_ctl:
2897 #endif
2898 	kfree(dflt);
2899 err_alloc_dflt:
2900 	kfree(all);
2901 err_alloc_all:
2902 	kfree(net->ipv4.inet_addr_lst);
2903 err_alloc_hash:
2904 	return err;
2905 }
2906 
2907 static __net_exit void devinet_exit_net(struct net *net)
2908 {
2909 #ifdef CONFIG_SYSCTL
2910 	const struct ctl_table *tbl;
2911 #endif
2912 
2913 	cancel_delayed_work_sync(&net->ipv4.addr_chk_work);
2914 
2915 #ifdef CONFIG_SYSCTL
2916 	tbl = net->ipv4.forw_hdr->ctl_table_arg;
2917 	unregister_net_sysctl_table(net->ipv4.forw_hdr);
2918 	__devinet_sysctl_unregister(net, net->ipv4.devconf_dflt,
2919 				    NETCONFA_IFINDEX_DEFAULT);
2920 	__devinet_sysctl_unregister(net, net->ipv4.devconf_all,
2921 				    NETCONFA_IFINDEX_ALL);
2922 	kfree(tbl);
2923 #endif
2924 	kfree(net->ipv4.devconf_dflt);
2925 	kfree(net->ipv4.devconf_all);
2926 	kfree(net->ipv4.inet_addr_lst);
2927 }
2928 
2929 static __net_initdata struct pernet_operations devinet_ops = {
2930 	.init = devinet_init_net,
2931 	.exit = devinet_exit_net,
2932 };
2933 
2934 static struct rtnl_af_ops inet_af_ops __read_mostly = {
2935 	.family		  = AF_INET,
2936 	.fill_link_af	  = inet_fill_link_af,
2937 	.get_link_af_size = inet_get_link_af_size,
2938 	.validate_link_af = inet_validate_link_af,
2939 	.set_link_af	  = inet_set_link_af,
2940 };
2941 
2942 static const struct rtnl_msg_handler devinet_rtnl_msg_handlers[] __initconst = {
2943 	{.protocol = PF_INET, .msgtype = RTM_NEWADDR, .doit = inet_rtm_newaddr,
2944 	 .flags = RTNL_FLAG_DOIT_PERNET},
2945 	{.protocol = PF_INET, .msgtype = RTM_DELADDR, .doit = inet_rtm_deladdr,
2946 	 .flags = RTNL_FLAG_DOIT_PERNET},
2947 	{.protocol = PF_INET, .msgtype = RTM_GETADDR, .dumpit = inet_dump_ifaddr,
2948 	 .flags = RTNL_FLAG_DUMP_UNLOCKED | RTNL_FLAG_DUMP_SPLIT_NLM_DONE},
2949 	{.protocol = PF_INET, .msgtype = RTM_GETNETCONF,
2950 	 .doit = inet_netconf_get_devconf, .dumpit = inet_netconf_dump_devconf,
2951 	 .flags = RTNL_FLAG_DOIT_UNLOCKED | RTNL_FLAG_DUMP_UNLOCKED},
2952 	{.owner = THIS_MODULE, .protocol = PF_INET, .msgtype = RTM_GETMULTICAST,
2953 	 .dumpit = inet_dump_ifmcaddr, .flags = RTNL_FLAG_DUMP_UNLOCKED},
2954 };
2955 
2956 void __init devinet_init(void)
2957 {
2958 	register_pernet_subsys(&devinet_ops);
2959 	register_netdevice_notifier(&ip_netdev_notifier);
2960 
2961 	if (rtnl_af_register(&inet_af_ops))
2962 		panic("Unable to register inet_af_ops\n");
2963 
2964 	rtnl_register_many(devinet_rtnl_msg_handlers);
2965 
2966 	rtnl_lock();
2967 	if (IS_ERR(inetdev_init(blackhole_netdev)))
2968 		panic("IP: failed to allocate in_device for blackhole_netdev\n");
2969 	rtnl_unlock();
2970 }
2971