xref: /openbmc/linux/net/ipv4/devinet.c (revision 3eeebf17)
1 /*
2  *	NET3	IP device support routines.
3  *
4  *		This program is free software; you can redistribute it and/or
5  *		modify it under the terms of the GNU General Public License
6  *		as published by the Free Software Foundation; either version
7  *		2 of the License, or (at your option) any later version.
8  *
9  *	Derived from the IP parts of dev.c 1.0.19
10  * 		Authors:	Ross Biro
11  *				Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
12  *				Mark Evans, <evansmp@uhura.aston.ac.uk>
13  *
14  *	Additional Authors:
15  *		Alan Cox, <gw4pts@gw4pts.ampr.org>
16  *		Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
17  *
18  *	Changes:
19  *		Alexey Kuznetsov:	pa_* fields are replaced with ifaddr
20  *					lists.
21  *		Cyrus Durgin:		updated for kmod
22  *		Matthias Andree:	in devinet_ioctl, compare label and
23  *					address (4.4BSD alias style support),
24  *					fall back to comparing just the label
25  *					if no match found.
26  */
27 
28 
29 #include <asm/uaccess.h>
30 #include <asm/system.h>
31 #include <linux/bitops.h>
32 #include <linux/capability.h>
33 #include <linux/module.h>
34 #include <linux/types.h>
35 #include <linux/kernel.h>
36 #include <linux/string.h>
37 #include <linux/mm.h>
38 #include <linux/socket.h>
39 #include <linux/sockios.h>
40 #include <linux/in.h>
41 #include <linux/errno.h>
42 #include <linux/interrupt.h>
43 #include <linux/if_addr.h>
44 #include <linux/if_ether.h>
45 #include <linux/inet.h>
46 #include <linux/netdevice.h>
47 #include <linux/etherdevice.h>
48 #include <linux/skbuff.h>
49 #include <linux/init.h>
50 #include <linux/notifier.h>
51 #include <linux/inetdevice.h>
52 #include <linux/igmp.h>
53 #ifdef CONFIG_SYSCTL
54 #include <linux/sysctl.h>
55 #endif
56 #include <linux/kmod.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 
65 static struct ipv4_devconf ipv4_devconf = {
66 	.data = {
67 		[NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1,
68 		[NET_IPV4_CONF_SEND_REDIRECTS - 1] = 1,
69 		[NET_IPV4_CONF_SECURE_REDIRECTS - 1] = 1,
70 		[NET_IPV4_CONF_SHARED_MEDIA - 1] = 1,
71 	},
72 };
73 
74 static struct ipv4_devconf ipv4_devconf_dflt = {
75 	.data = {
76 		[NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1,
77 		[NET_IPV4_CONF_SEND_REDIRECTS - 1] = 1,
78 		[NET_IPV4_CONF_SECURE_REDIRECTS - 1] = 1,
79 		[NET_IPV4_CONF_SHARED_MEDIA - 1] = 1,
80 		[NET_IPV4_CONF_ACCEPT_SOURCE_ROUTE - 1] = 1,
81 	},
82 };
83 
84 #define IPV4_DEVCONF_DFLT(net, attr) \
85 	IPV4_DEVCONF((*net->ipv4.devconf_dflt), attr)
86 
87 static const struct nla_policy ifa_ipv4_policy[IFA_MAX+1] = {
88 	[IFA_LOCAL]     	= { .type = NLA_U32 },
89 	[IFA_ADDRESS]   	= { .type = NLA_U32 },
90 	[IFA_BROADCAST] 	= { .type = NLA_U32 },
91 	[IFA_LABEL]     	= { .type = NLA_STRING, .len = IFNAMSIZ - 1 },
92 };
93 
94 static void rtmsg_ifa(int event, struct in_ifaddr *, struct nlmsghdr *, u32);
95 
96 static BLOCKING_NOTIFIER_HEAD(inetaddr_chain);
97 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
98 			 int destroy);
99 #ifdef CONFIG_SYSCTL
100 static void devinet_sysctl_register(struct in_device *idev);
101 static void devinet_sysctl_unregister(struct in_device *idev);
102 #else
103 static inline void devinet_sysctl_register(struct in_device *idev)
104 {
105 }
106 static inline void devinet_sysctl_unregister(struct in_device *idev)
107 {
108 }
109 #endif
110 
111 /* Locks all the inet devices. */
112 
113 static struct in_ifaddr *inet_alloc_ifa(void)
114 {
115 	struct in_ifaddr *ifa = kzalloc(sizeof(*ifa), GFP_KERNEL);
116 
117 	if (ifa) {
118 		INIT_RCU_HEAD(&ifa->rcu_head);
119 	}
120 
121 	return ifa;
122 }
123 
124 static void inet_rcu_free_ifa(struct rcu_head *head)
125 {
126 	struct in_ifaddr *ifa = container_of(head, struct in_ifaddr, rcu_head);
127 	if (ifa->ifa_dev)
128 		in_dev_put(ifa->ifa_dev);
129 	kfree(ifa);
130 }
131 
132 static inline void inet_free_ifa(struct in_ifaddr *ifa)
133 {
134 	call_rcu(&ifa->rcu_head, inet_rcu_free_ifa);
135 }
136 
137 void in_dev_finish_destroy(struct in_device *idev)
138 {
139 	struct net_device *dev = idev->dev;
140 
141 	WARN_ON(idev->ifa_list);
142 	WARN_ON(idev->mc_list);
143 #ifdef NET_REFCNT_DEBUG
144 	printk(KERN_DEBUG "in_dev_finish_destroy: %p=%s\n",
145 	       idev, dev ? dev->name : "NIL");
146 #endif
147 	dev_put(dev);
148 	if (!idev->dead)
149 		printk("Freeing alive in_device %p\n", idev);
150 	else {
151 		kfree(idev);
152 	}
153 }
154 
155 static struct in_device *inetdev_init(struct net_device *dev)
156 {
157 	struct in_device *in_dev;
158 
159 	ASSERT_RTNL();
160 
161 	in_dev = kzalloc(sizeof(*in_dev), GFP_KERNEL);
162 	if (!in_dev)
163 		goto out;
164 	INIT_RCU_HEAD(&in_dev->rcu_head);
165 	memcpy(&in_dev->cnf, dev_net(dev)->ipv4.devconf_dflt,
166 			sizeof(in_dev->cnf));
167 	in_dev->cnf.sysctl = NULL;
168 	in_dev->dev = dev;
169 	if ((in_dev->arp_parms = neigh_parms_alloc(dev, &arp_tbl)) == NULL)
170 		goto out_kfree;
171 	if (IPV4_DEVCONF(in_dev->cnf, FORWARDING))
172 		dev_disable_lro(dev);
173 	/* Reference in_dev->dev */
174 	dev_hold(dev);
175 	/* Account for reference dev->ip_ptr (below) */
176 	in_dev_hold(in_dev);
177 
178 	devinet_sysctl_register(in_dev);
179 	ip_mc_init_dev(in_dev);
180 	if (dev->flags & IFF_UP)
181 		ip_mc_up(in_dev);
182 
183 	/* we can receive as soon as ip_ptr is set -- do this last */
184 	rcu_assign_pointer(dev->ip_ptr, in_dev);
185 out:
186 	return in_dev;
187 out_kfree:
188 	kfree(in_dev);
189 	in_dev = NULL;
190 	goto out;
191 }
192 
193 static void in_dev_rcu_put(struct rcu_head *head)
194 {
195 	struct in_device *idev = container_of(head, struct in_device, rcu_head);
196 	in_dev_put(idev);
197 }
198 
199 static void inetdev_destroy(struct in_device *in_dev)
200 {
201 	struct in_ifaddr *ifa;
202 	struct net_device *dev;
203 
204 	ASSERT_RTNL();
205 
206 	dev = in_dev->dev;
207 
208 	in_dev->dead = 1;
209 
210 	ip_mc_destroy_dev(in_dev);
211 
212 	while ((ifa = in_dev->ifa_list) != NULL) {
213 		inet_del_ifa(in_dev, &in_dev->ifa_list, 0);
214 		inet_free_ifa(ifa);
215 	}
216 
217 	dev->ip_ptr = NULL;
218 
219 	devinet_sysctl_unregister(in_dev);
220 	neigh_parms_release(&arp_tbl, in_dev->arp_parms);
221 	arp_ifdown(dev);
222 
223 	call_rcu(&in_dev->rcu_head, in_dev_rcu_put);
224 }
225 
226 int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b)
227 {
228 	rcu_read_lock();
229 	for_primary_ifa(in_dev) {
230 		if (inet_ifa_match(a, ifa)) {
231 			if (!b || inet_ifa_match(b, ifa)) {
232 				rcu_read_unlock();
233 				return 1;
234 			}
235 		}
236 	} endfor_ifa(in_dev);
237 	rcu_read_unlock();
238 	return 0;
239 }
240 
241 static void __inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
242 			 int destroy, struct nlmsghdr *nlh, u32 pid)
243 {
244 	struct in_ifaddr *promote = NULL;
245 	struct in_ifaddr *ifa, *ifa1 = *ifap;
246 	struct in_ifaddr *last_prim = in_dev->ifa_list;
247 	struct in_ifaddr *prev_prom = NULL;
248 	int do_promote = IN_DEV_PROMOTE_SECONDARIES(in_dev);
249 
250 	ASSERT_RTNL();
251 
252 	/* 1. Deleting primary ifaddr forces deletion all secondaries
253 	 * unless alias promotion is set
254 	 **/
255 
256 	if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
257 		struct in_ifaddr **ifap1 = &ifa1->ifa_next;
258 
259 		while ((ifa = *ifap1) != NULL) {
260 			if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
261 			    ifa1->ifa_scope <= ifa->ifa_scope)
262 				last_prim = ifa;
263 
264 			if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
265 			    ifa1->ifa_mask != ifa->ifa_mask ||
266 			    !inet_ifa_match(ifa1->ifa_address, ifa)) {
267 				ifap1 = &ifa->ifa_next;
268 				prev_prom = ifa;
269 				continue;
270 			}
271 
272 			if (!do_promote) {
273 				*ifap1 = ifa->ifa_next;
274 
275 				rtmsg_ifa(RTM_DELADDR, ifa, nlh, pid);
276 				blocking_notifier_call_chain(&inetaddr_chain,
277 						NETDEV_DOWN, ifa);
278 				inet_free_ifa(ifa);
279 			} else {
280 				promote = ifa;
281 				break;
282 			}
283 		}
284 	}
285 
286 	/* 2. Unlink it */
287 
288 	*ifap = ifa1->ifa_next;
289 
290 	/* 3. Announce address deletion */
291 
292 	/* Send message first, then call notifier.
293 	   At first sight, FIB update triggered by notifier
294 	   will refer to already deleted ifaddr, that could confuse
295 	   netlink listeners. It is not true: look, gated sees
296 	   that route deleted and if it still thinks that ifaddr
297 	   is valid, it will try to restore deleted routes... Grr.
298 	   So that, this order is correct.
299 	 */
300 	rtmsg_ifa(RTM_DELADDR, ifa1, nlh, pid);
301 	blocking_notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
302 
303 	if (promote) {
304 
305 		if (prev_prom) {
306 			prev_prom->ifa_next = promote->ifa_next;
307 			promote->ifa_next = last_prim->ifa_next;
308 			last_prim->ifa_next = promote;
309 		}
310 
311 		promote->ifa_flags &= ~IFA_F_SECONDARY;
312 		rtmsg_ifa(RTM_NEWADDR, promote, nlh, pid);
313 		blocking_notifier_call_chain(&inetaddr_chain,
314 				NETDEV_UP, promote);
315 		for (ifa = promote->ifa_next; ifa; ifa = ifa->ifa_next) {
316 			if (ifa1->ifa_mask != ifa->ifa_mask ||
317 			    !inet_ifa_match(ifa1->ifa_address, ifa))
318 					continue;
319 			fib_add_ifaddr(ifa);
320 		}
321 
322 	}
323 	if (destroy)
324 		inet_free_ifa(ifa1);
325 }
326 
327 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
328 			 int destroy)
329 {
330 	__inet_del_ifa(in_dev, ifap, destroy, NULL, 0);
331 }
332 
333 static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
334 			     u32 pid)
335 {
336 	struct in_device *in_dev = ifa->ifa_dev;
337 	struct in_ifaddr *ifa1, **ifap, **last_primary;
338 
339 	ASSERT_RTNL();
340 
341 	if (!ifa->ifa_local) {
342 		inet_free_ifa(ifa);
343 		return 0;
344 	}
345 
346 	ifa->ifa_flags &= ~IFA_F_SECONDARY;
347 	last_primary = &in_dev->ifa_list;
348 
349 	for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL;
350 	     ifap = &ifa1->ifa_next) {
351 		if (!(ifa1->ifa_flags & IFA_F_SECONDARY) &&
352 		    ifa->ifa_scope <= ifa1->ifa_scope)
353 			last_primary = &ifa1->ifa_next;
354 		if (ifa1->ifa_mask == ifa->ifa_mask &&
355 		    inet_ifa_match(ifa1->ifa_address, ifa)) {
356 			if (ifa1->ifa_local == ifa->ifa_local) {
357 				inet_free_ifa(ifa);
358 				return -EEXIST;
359 			}
360 			if (ifa1->ifa_scope != ifa->ifa_scope) {
361 				inet_free_ifa(ifa);
362 				return -EINVAL;
363 			}
364 			ifa->ifa_flags |= IFA_F_SECONDARY;
365 		}
366 	}
367 
368 	if (!(ifa->ifa_flags & IFA_F_SECONDARY)) {
369 		net_srandom(ifa->ifa_local);
370 		ifap = last_primary;
371 	}
372 
373 	ifa->ifa_next = *ifap;
374 	*ifap = ifa;
375 
376 	/* Send message first, then call notifier.
377 	   Notifier will trigger FIB update, so that
378 	   listeners of netlink will know about new ifaddr */
379 	rtmsg_ifa(RTM_NEWADDR, ifa, nlh, pid);
380 	blocking_notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
381 
382 	return 0;
383 }
384 
385 static int inet_insert_ifa(struct in_ifaddr *ifa)
386 {
387 	return __inet_insert_ifa(ifa, NULL, 0);
388 }
389 
390 static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
391 {
392 	struct in_device *in_dev = __in_dev_get_rtnl(dev);
393 
394 	ASSERT_RTNL();
395 
396 	if (!in_dev) {
397 		inet_free_ifa(ifa);
398 		return -ENOBUFS;
399 	}
400 	ipv4_devconf_setall(in_dev);
401 	if (ifa->ifa_dev != in_dev) {
402 		WARN_ON(ifa->ifa_dev);
403 		in_dev_hold(in_dev);
404 		ifa->ifa_dev = in_dev;
405 	}
406 	if (ipv4_is_loopback(ifa->ifa_local))
407 		ifa->ifa_scope = RT_SCOPE_HOST;
408 	return inet_insert_ifa(ifa);
409 }
410 
411 struct in_device *inetdev_by_index(struct net *net, int ifindex)
412 {
413 	struct net_device *dev;
414 	struct in_device *in_dev = NULL;
415 	read_lock(&dev_base_lock);
416 	dev = __dev_get_by_index(net, ifindex);
417 	if (dev)
418 		in_dev = in_dev_get(dev);
419 	read_unlock(&dev_base_lock);
420 	return in_dev;
421 }
422 
423 /* Called only from RTNL semaphored context. No locks. */
424 
425 struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
426 				    __be32 mask)
427 {
428 	ASSERT_RTNL();
429 
430 	for_primary_ifa(in_dev) {
431 		if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
432 			return ifa;
433 	} endfor_ifa(in_dev);
434 	return NULL;
435 }
436 
437 static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
438 {
439 	struct net *net = sock_net(skb->sk);
440 	struct nlattr *tb[IFA_MAX+1];
441 	struct in_device *in_dev;
442 	struct ifaddrmsg *ifm;
443 	struct in_ifaddr *ifa, **ifap;
444 	int err = -EINVAL;
445 
446 	ASSERT_RTNL();
447 
448 	err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy);
449 	if (err < 0)
450 		goto errout;
451 
452 	ifm = nlmsg_data(nlh);
453 	in_dev = inetdev_by_index(net, ifm->ifa_index);
454 	if (in_dev == NULL) {
455 		err = -ENODEV;
456 		goto errout;
457 	}
458 
459 	__in_dev_put(in_dev);
460 
461 	for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
462 	     ifap = &ifa->ifa_next) {
463 		if (tb[IFA_LOCAL] &&
464 		    ifa->ifa_local != nla_get_be32(tb[IFA_LOCAL]))
465 			continue;
466 
467 		if (tb[IFA_LABEL] && nla_strcmp(tb[IFA_LABEL], ifa->ifa_label))
468 			continue;
469 
470 		if (tb[IFA_ADDRESS] &&
471 		    (ifm->ifa_prefixlen != ifa->ifa_prefixlen ||
472 		    !inet_ifa_match(nla_get_be32(tb[IFA_ADDRESS]), ifa)))
473 			continue;
474 
475 		__inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).pid);
476 		return 0;
477 	}
478 
479 	err = -EADDRNOTAVAIL;
480 errout:
481 	return err;
482 }
483 
484 static struct in_ifaddr *rtm_to_ifaddr(struct net *net, struct nlmsghdr *nlh)
485 {
486 	struct nlattr *tb[IFA_MAX+1];
487 	struct in_ifaddr *ifa;
488 	struct ifaddrmsg *ifm;
489 	struct net_device *dev;
490 	struct in_device *in_dev;
491 	int err;
492 
493 	err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy);
494 	if (err < 0)
495 		goto errout;
496 
497 	ifm = nlmsg_data(nlh);
498 	err = -EINVAL;
499 	if (ifm->ifa_prefixlen > 32 || tb[IFA_LOCAL] == NULL)
500 		goto errout;
501 
502 	dev = __dev_get_by_index(net, ifm->ifa_index);
503 	err = -ENODEV;
504 	if (dev == NULL)
505 		goto errout;
506 
507 	in_dev = __in_dev_get_rtnl(dev);
508 	err = -ENOBUFS;
509 	if (in_dev == NULL)
510 		goto errout;
511 
512 	ifa = inet_alloc_ifa();
513 	if (ifa == NULL)
514 		/*
515 		 * A potential indev allocation can be left alive, it stays
516 		 * assigned to its device and is destroy with it.
517 		 */
518 		goto errout;
519 
520 	ipv4_devconf_setall(in_dev);
521 	in_dev_hold(in_dev);
522 
523 	if (tb[IFA_ADDRESS] == NULL)
524 		tb[IFA_ADDRESS] = tb[IFA_LOCAL];
525 
526 	ifa->ifa_prefixlen = ifm->ifa_prefixlen;
527 	ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
528 	ifa->ifa_flags = ifm->ifa_flags;
529 	ifa->ifa_scope = ifm->ifa_scope;
530 	ifa->ifa_dev = in_dev;
531 
532 	ifa->ifa_local = nla_get_be32(tb[IFA_LOCAL]);
533 	ifa->ifa_address = nla_get_be32(tb[IFA_ADDRESS]);
534 
535 	if (tb[IFA_BROADCAST])
536 		ifa->ifa_broadcast = nla_get_be32(tb[IFA_BROADCAST]);
537 
538 	if (tb[IFA_LABEL])
539 		nla_strlcpy(ifa->ifa_label, tb[IFA_LABEL], IFNAMSIZ);
540 	else
541 		memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
542 
543 	return ifa;
544 
545 errout:
546 	return ERR_PTR(err);
547 }
548 
549 static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
550 {
551 	struct net *net = sock_net(skb->sk);
552 	struct in_ifaddr *ifa;
553 
554 	ASSERT_RTNL();
555 
556 	ifa = rtm_to_ifaddr(net, nlh);
557 	if (IS_ERR(ifa))
558 		return PTR_ERR(ifa);
559 
560 	return __inet_insert_ifa(ifa, nlh, NETLINK_CB(skb).pid);
561 }
562 
563 /*
564  *	Determine a default network mask, based on the IP address.
565  */
566 
567 static __inline__ int inet_abc_len(__be32 addr)
568 {
569 	int rc = -1;	/* Something else, probably a multicast. */
570 
571 	if (ipv4_is_zeronet(addr))
572 		rc = 0;
573 	else {
574 		__u32 haddr = ntohl(addr);
575 
576 		if (IN_CLASSA(haddr))
577 			rc = 8;
578 		else if (IN_CLASSB(haddr))
579 			rc = 16;
580 		else if (IN_CLASSC(haddr))
581 			rc = 24;
582 	}
583 
584 	return rc;
585 }
586 
587 
588 int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
589 {
590 	struct ifreq ifr;
591 	struct sockaddr_in sin_orig;
592 	struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
593 	struct in_device *in_dev;
594 	struct in_ifaddr **ifap = NULL;
595 	struct in_ifaddr *ifa = NULL;
596 	struct net_device *dev;
597 	char *colon;
598 	int ret = -EFAULT;
599 	int tryaddrmatch = 0;
600 
601 	/*
602 	 *	Fetch the caller's info block into kernel space
603 	 */
604 
605 	if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
606 		goto out;
607 	ifr.ifr_name[IFNAMSIZ - 1] = 0;
608 
609 	/* save original address for comparison */
610 	memcpy(&sin_orig, sin, sizeof(*sin));
611 
612 	colon = strchr(ifr.ifr_name, ':');
613 	if (colon)
614 		*colon = 0;
615 
616 	dev_load(net, ifr.ifr_name);
617 
618 	switch (cmd) {
619 	case SIOCGIFADDR:	/* Get interface address */
620 	case SIOCGIFBRDADDR:	/* Get the broadcast address */
621 	case SIOCGIFDSTADDR:	/* Get the destination address */
622 	case SIOCGIFNETMASK:	/* Get the netmask for the interface */
623 		/* Note that these ioctls will not sleep,
624 		   so that we do not impose a lock.
625 		   One day we will be forced to put shlock here (I mean SMP)
626 		 */
627 		tryaddrmatch = (sin_orig.sin_family == AF_INET);
628 		memset(sin, 0, sizeof(*sin));
629 		sin->sin_family = AF_INET;
630 		break;
631 
632 	case SIOCSIFFLAGS:
633 		ret = -EACCES;
634 		if (!capable(CAP_NET_ADMIN))
635 			goto out;
636 		break;
637 	case SIOCSIFADDR:	/* Set interface address (and family) */
638 	case SIOCSIFBRDADDR:	/* Set the broadcast address */
639 	case SIOCSIFDSTADDR:	/* Set the destination address */
640 	case SIOCSIFNETMASK: 	/* Set the netmask for the interface */
641 		ret = -EACCES;
642 		if (!capable(CAP_NET_ADMIN))
643 			goto out;
644 		ret = -EINVAL;
645 		if (sin->sin_family != AF_INET)
646 			goto out;
647 		break;
648 	default:
649 		ret = -EINVAL;
650 		goto out;
651 	}
652 
653 	rtnl_lock();
654 
655 	ret = -ENODEV;
656 	if ((dev = __dev_get_by_name(net, ifr.ifr_name)) == NULL)
657 		goto done;
658 
659 	if (colon)
660 		*colon = ':';
661 
662 	if ((in_dev = __in_dev_get_rtnl(dev)) != NULL) {
663 		if (tryaddrmatch) {
664 			/* Matthias Andree */
665 			/* compare label and address (4.4BSD style) */
666 			/* note: we only do this for a limited set of ioctls
667 			   and only if the original address family was AF_INET.
668 			   This is checked above. */
669 			for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
670 			     ifap = &ifa->ifa_next) {
671 				if (!strcmp(ifr.ifr_name, ifa->ifa_label) &&
672 				    sin_orig.sin_addr.s_addr ==
673 							ifa->ifa_address) {
674 					break; /* found */
675 				}
676 			}
677 		}
678 		/* we didn't get a match, maybe the application is
679 		   4.3BSD-style and passed in junk so we fall back to
680 		   comparing just the label */
681 		if (!ifa) {
682 			for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
683 			     ifap = &ifa->ifa_next)
684 				if (!strcmp(ifr.ifr_name, ifa->ifa_label))
685 					break;
686 		}
687 	}
688 
689 	ret = -EADDRNOTAVAIL;
690 	if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
691 		goto done;
692 
693 	switch (cmd) {
694 	case SIOCGIFADDR:	/* Get interface address */
695 		sin->sin_addr.s_addr = ifa->ifa_local;
696 		goto rarok;
697 
698 	case SIOCGIFBRDADDR:	/* Get the broadcast address */
699 		sin->sin_addr.s_addr = ifa->ifa_broadcast;
700 		goto rarok;
701 
702 	case SIOCGIFDSTADDR:	/* Get the destination address */
703 		sin->sin_addr.s_addr = ifa->ifa_address;
704 		goto rarok;
705 
706 	case SIOCGIFNETMASK:	/* Get the netmask for the interface */
707 		sin->sin_addr.s_addr = ifa->ifa_mask;
708 		goto rarok;
709 
710 	case SIOCSIFFLAGS:
711 		if (colon) {
712 			ret = -EADDRNOTAVAIL;
713 			if (!ifa)
714 				break;
715 			ret = 0;
716 			if (!(ifr.ifr_flags & IFF_UP))
717 				inet_del_ifa(in_dev, ifap, 1);
718 			break;
719 		}
720 		ret = dev_change_flags(dev, ifr.ifr_flags);
721 		break;
722 
723 	case SIOCSIFADDR:	/* Set interface address (and family) */
724 		ret = -EINVAL;
725 		if (inet_abc_len(sin->sin_addr.s_addr) < 0)
726 			break;
727 
728 		if (!ifa) {
729 			ret = -ENOBUFS;
730 			if ((ifa = inet_alloc_ifa()) == NULL)
731 				break;
732 			if (colon)
733 				memcpy(ifa->ifa_label, ifr.ifr_name, IFNAMSIZ);
734 			else
735 				memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
736 		} else {
737 			ret = 0;
738 			if (ifa->ifa_local == sin->sin_addr.s_addr)
739 				break;
740 			inet_del_ifa(in_dev, ifap, 0);
741 			ifa->ifa_broadcast = 0;
742 			ifa->ifa_scope = 0;
743 		}
744 
745 		ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;
746 
747 		if (!(dev->flags & IFF_POINTOPOINT)) {
748 			ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
749 			ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
750 			if ((dev->flags & IFF_BROADCAST) &&
751 			    ifa->ifa_prefixlen < 31)
752 				ifa->ifa_broadcast = ifa->ifa_address |
753 						     ~ifa->ifa_mask;
754 		} else {
755 			ifa->ifa_prefixlen = 32;
756 			ifa->ifa_mask = inet_make_mask(32);
757 		}
758 		ret = inet_set_ifa(dev, ifa);
759 		break;
760 
761 	case SIOCSIFBRDADDR:	/* Set the broadcast address */
762 		ret = 0;
763 		if (ifa->ifa_broadcast != sin->sin_addr.s_addr) {
764 			inet_del_ifa(in_dev, ifap, 0);
765 			ifa->ifa_broadcast = sin->sin_addr.s_addr;
766 			inet_insert_ifa(ifa);
767 		}
768 		break;
769 
770 	case SIOCSIFDSTADDR:	/* Set the destination address */
771 		ret = 0;
772 		if (ifa->ifa_address == sin->sin_addr.s_addr)
773 			break;
774 		ret = -EINVAL;
775 		if (inet_abc_len(sin->sin_addr.s_addr) < 0)
776 			break;
777 		ret = 0;
778 		inet_del_ifa(in_dev, ifap, 0);
779 		ifa->ifa_address = sin->sin_addr.s_addr;
780 		inet_insert_ifa(ifa);
781 		break;
782 
783 	case SIOCSIFNETMASK: 	/* Set the netmask for the interface */
784 
785 		/*
786 		 *	The mask we set must be legal.
787 		 */
788 		ret = -EINVAL;
789 		if (bad_mask(sin->sin_addr.s_addr, 0))
790 			break;
791 		ret = 0;
792 		if (ifa->ifa_mask != sin->sin_addr.s_addr) {
793 			__be32 old_mask = ifa->ifa_mask;
794 			inet_del_ifa(in_dev, ifap, 0);
795 			ifa->ifa_mask = sin->sin_addr.s_addr;
796 			ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
797 
798 			/* See if current broadcast address matches
799 			 * with current netmask, then recalculate
800 			 * the broadcast address. Otherwise it's a
801 			 * funny address, so don't touch it since
802 			 * the user seems to know what (s)he's doing...
803 			 */
804 			if ((dev->flags & IFF_BROADCAST) &&
805 			    (ifa->ifa_prefixlen < 31) &&
806 			    (ifa->ifa_broadcast ==
807 			     (ifa->ifa_local|~old_mask))) {
808 				ifa->ifa_broadcast = (ifa->ifa_local |
809 						      ~sin->sin_addr.s_addr);
810 			}
811 			inet_insert_ifa(ifa);
812 		}
813 		break;
814 	}
815 done:
816 	rtnl_unlock();
817 out:
818 	return ret;
819 rarok:
820 	rtnl_unlock();
821 	ret = copy_to_user(arg, &ifr, sizeof(struct ifreq)) ? -EFAULT : 0;
822 	goto out;
823 }
824 
825 static int inet_gifconf(struct net_device *dev, char __user *buf, int len)
826 {
827 	struct in_device *in_dev = __in_dev_get_rtnl(dev);
828 	struct in_ifaddr *ifa;
829 	struct ifreq ifr;
830 	int done = 0;
831 
832 	if (!in_dev || (ifa = in_dev->ifa_list) == NULL)
833 		goto out;
834 
835 	for (; ifa; ifa = ifa->ifa_next) {
836 		if (!buf) {
837 			done += sizeof(ifr);
838 			continue;
839 		}
840 		if (len < (int) sizeof(ifr))
841 			break;
842 		memset(&ifr, 0, sizeof(struct ifreq));
843 		if (ifa->ifa_label)
844 			strcpy(ifr.ifr_name, ifa->ifa_label);
845 		else
846 			strcpy(ifr.ifr_name, dev->name);
847 
848 		(*(struct sockaddr_in *)&ifr.ifr_addr).sin_family = AF_INET;
849 		(*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr =
850 								ifa->ifa_local;
851 
852 		if (copy_to_user(buf, &ifr, sizeof(struct ifreq))) {
853 			done = -EFAULT;
854 			break;
855 		}
856 		buf  += sizeof(struct ifreq);
857 		len  -= sizeof(struct ifreq);
858 		done += sizeof(struct ifreq);
859 	}
860 out:
861 	return done;
862 }
863 
864 __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope)
865 {
866 	__be32 addr = 0;
867 	struct in_device *in_dev;
868 	struct net *net = dev_net(dev);
869 
870 	rcu_read_lock();
871 	in_dev = __in_dev_get_rcu(dev);
872 	if (!in_dev)
873 		goto no_in_dev;
874 
875 	for_primary_ifa(in_dev) {
876 		if (ifa->ifa_scope > scope)
877 			continue;
878 		if (!dst || inet_ifa_match(dst, ifa)) {
879 			addr = ifa->ifa_local;
880 			break;
881 		}
882 		if (!addr)
883 			addr = ifa->ifa_local;
884 	} endfor_ifa(in_dev);
885 no_in_dev:
886 	rcu_read_unlock();
887 
888 	if (addr)
889 		goto out;
890 
891 	/* Not loopback addresses on loopback should be preferred
892 	   in this case. It is importnat that lo is the first interface
893 	   in dev_base list.
894 	 */
895 	read_lock(&dev_base_lock);
896 	rcu_read_lock();
897 	for_each_netdev(net, dev) {
898 		if ((in_dev = __in_dev_get_rcu(dev)) == NULL)
899 			continue;
900 
901 		for_primary_ifa(in_dev) {
902 			if (ifa->ifa_scope != RT_SCOPE_LINK &&
903 			    ifa->ifa_scope <= scope) {
904 				addr = ifa->ifa_local;
905 				goto out_unlock_both;
906 			}
907 		} endfor_ifa(in_dev);
908 	}
909 out_unlock_both:
910 	read_unlock(&dev_base_lock);
911 	rcu_read_unlock();
912 out:
913 	return addr;
914 }
915 
916 static __be32 confirm_addr_indev(struct in_device *in_dev, __be32 dst,
917 			      __be32 local, int scope)
918 {
919 	int same = 0;
920 	__be32 addr = 0;
921 
922 	for_ifa(in_dev) {
923 		if (!addr &&
924 		    (local == ifa->ifa_local || !local) &&
925 		    ifa->ifa_scope <= scope) {
926 			addr = ifa->ifa_local;
927 			if (same)
928 				break;
929 		}
930 		if (!same) {
931 			same = (!local || inet_ifa_match(local, ifa)) &&
932 				(!dst || inet_ifa_match(dst, ifa));
933 			if (same && addr) {
934 				if (local || !dst)
935 					break;
936 				/* Is the selected addr into dst subnet? */
937 				if (inet_ifa_match(addr, ifa))
938 					break;
939 				/* No, then can we use new local src? */
940 				if (ifa->ifa_scope <= scope) {
941 					addr = ifa->ifa_local;
942 					break;
943 				}
944 				/* search for large dst subnet for addr */
945 				same = 0;
946 			}
947 		}
948 	} endfor_ifa(in_dev);
949 
950 	return same? addr : 0;
951 }
952 
953 /*
954  * Confirm that local IP address exists using wildcards:
955  * - in_dev: only on this interface, 0=any interface
956  * - dst: only in the same subnet as dst, 0=any dst
957  * - local: address, 0=autoselect the local address
958  * - scope: maximum allowed scope value for the local address
959  */
960 __be32 inet_confirm_addr(struct in_device *in_dev,
961 			 __be32 dst, __be32 local, int scope)
962 {
963 	__be32 addr = 0;
964 	struct net_device *dev;
965 	struct net *net;
966 
967 	if (scope != RT_SCOPE_LINK)
968 		return confirm_addr_indev(in_dev, dst, local, scope);
969 
970 	net = dev_net(in_dev->dev);
971 	read_lock(&dev_base_lock);
972 	rcu_read_lock();
973 	for_each_netdev(net, dev) {
974 		if ((in_dev = __in_dev_get_rcu(dev))) {
975 			addr = confirm_addr_indev(in_dev, dst, local, scope);
976 			if (addr)
977 				break;
978 		}
979 	}
980 	rcu_read_unlock();
981 	read_unlock(&dev_base_lock);
982 
983 	return addr;
984 }
985 
986 /*
987  *	Device notifier
988  */
989 
990 int register_inetaddr_notifier(struct notifier_block *nb)
991 {
992 	return blocking_notifier_chain_register(&inetaddr_chain, nb);
993 }
994 
995 int unregister_inetaddr_notifier(struct notifier_block *nb)
996 {
997 	return blocking_notifier_chain_unregister(&inetaddr_chain, nb);
998 }
999 
1000 /* Rename ifa_labels for a device name change. Make some effort to preserve existing
1001  * alias numbering and to create unique labels if possible.
1002 */
1003 static void inetdev_changename(struct net_device *dev, struct in_device *in_dev)
1004 {
1005 	struct in_ifaddr *ifa;
1006 	int named = 0;
1007 
1008 	for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
1009 		char old[IFNAMSIZ], *dot;
1010 
1011 		memcpy(old, ifa->ifa_label, IFNAMSIZ);
1012 		memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1013 		if (named++ == 0)
1014 			goto skip;
1015 		dot = strchr(old, ':');
1016 		if (dot == NULL) {
1017 			sprintf(old, ":%d", named);
1018 			dot = old;
1019 		}
1020 		if (strlen(dot) + strlen(dev->name) < IFNAMSIZ) {
1021 			strcat(ifa->ifa_label, dot);
1022 		} else {
1023 			strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
1024 		}
1025 skip:
1026 		rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
1027 	}
1028 }
1029 
1030 static inline bool inetdev_valid_mtu(unsigned mtu)
1031 {
1032 	return mtu >= 68;
1033 }
1034 
1035 /* Called only under RTNL semaphore */
1036 
1037 static int inetdev_event(struct notifier_block *this, unsigned long event,
1038 			 void *ptr)
1039 {
1040 	struct net_device *dev = ptr;
1041 	struct in_device *in_dev = __in_dev_get_rtnl(dev);
1042 
1043 	ASSERT_RTNL();
1044 
1045 	if (!in_dev) {
1046 		if (event == NETDEV_REGISTER) {
1047 			in_dev = inetdev_init(dev);
1048 			if (!in_dev)
1049 				return notifier_from_errno(-ENOMEM);
1050 			if (dev->flags & IFF_LOOPBACK) {
1051 				IN_DEV_CONF_SET(in_dev, NOXFRM, 1);
1052 				IN_DEV_CONF_SET(in_dev, NOPOLICY, 1);
1053 			}
1054 		} else if (event == NETDEV_CHANGEMTU) {
1055 			/* Re-enabling IP */
1056 			if (inetdev_valid_mtu(dev->mtu))
1057 				in_dev = inetdev_init(dev);
1058 		}
1059 		goto out;
1060 	}
1061 
1062 	switch (event) {
1063 	case NETDEV_REGISTER:
1064 		printk(KERN_DEBUG "inetdev_event: bug\n");
1065 		dev->ip_ptr = NULL;
1066 		break;
1067 	case NETDEV_UP:
1068 		if (!inetdev_valid_mtu(dev->mtu))
1069 			break;
1070 		if (dev->flags & IFF_LOOPBACK) {
1071 			struct in_ifaddr *ifa;
1072 			if ((ifa = inet_alloc_ifa()) != NULL) {
1073 				ifa->ifa_local =
1074 				  ifa->ifa_address = htonl(INADDR_LOOPBACK);
1075 				ifa->ifa_prefixlen = 8;
1076 				ifa->ifa_mask = inet_make_mask(8);
1077 				in_dev_hold(in_dev);
1078 				ifa->ifa_dev = in_dev;
1079 				ifa->ifa_scope = RT_SCOPE_HOST;
1080 				memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1081 				inet_insert_ifa(ifa);
1082 			}
1083 		}
1084 		ip_mc_up(in_dev);
1085 		break;
1086 	case NETDEV_DOWN:
1087 		ip_mc_down(in_dev);
1088 		break;
1089 	case NETDEV_CHANGEMTU:
1090 		if (inetdev_valid_mtu(dev->mtu))
1091 			break;
1092 		/* disable IP when MTU is not enough */
1093 	case NETDEV_UNREGISTER:
1094 		inetdev_destroy(in_dev);
1095 		break;
1096 	case NETDEV_CHANGENAME:
1097 		/* Do not notify about label change, this event is
1098 		 * not interesting to applications using netlink.
1099 		 */
1100 		inetdev_changename(dev, in_dev);
1101 
1102 		devinet_sysctl_unregister(in_dev);
1103 		devinet_sysctl_register(in_dev);
1104 		break;
1105 	}
1106 out:
1107 	return NOTIFY_DONE;
1108 }
1109 
1110 static struct notifier_block ip_netdev_notifier = {
1111 	.notifier_call =inetdev_event,
1112 };
1113 
1114 static inline size_t inet_nlmsg_size(void)
1115 {
1116 	return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
1117 	       + nla_total_size(4) /* IFA_ADDRESS */
1118 	       + nla_total_size(4) /* IFA_LOCAL */
1119 	       + nla_total_size(4) /* IFA_BROADCAST */
1120 	       + nla_total_size(IFNAMSIZ); /* IFA_LABEL */
1121 }
1122 
1123 static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
1124 			    u32 pid, u32 seq, int event, unsigned int flags)
1125 {
1126 	struct ifaddrmsg *ifm;
1127 	struct nlmsghdr  *nlh;
1128 
1129 	nlh = nlmsg_put(skb, pid, seq, event, sizeof(*ifm), flags);
1130 	if (nlh == NULL)
1131 		return -EMSGSIZE;
1132 
1133 	ifm = nlmsg_data(nlh);
1134 	ifm->ifa_family = AF_INET;
1135 	ifm->ifa_prefixlen = ifa->ifa_prefixlen;
1136 	ifm->ifa_flags = ifa->ifa_flags|IFA_F_PERMANENT;
1137 	ifm->ifa_scope = ifa->ifa_scope;
1138 	ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
1139 
1140 	if (ifa->ifa_address)
1141 		NLA_PUT_BE32(skb, IFA_ADDRESS, ifa->ifa_address);
1142 
1143 	if (ifa->ifa_local)
1144 		NLA_PUT_BE32(skb, IFA_LOCAL, ifa->ifa_local);
1145 
1146 	if (ifa->ifa_broadcast)
1147 		NLA_PUT_BE32(skb, IFA_BROADCAST, ifa->ifa_broadcast);
1148 
1149 	if (ifa->ifa_label[0])
1150 		NLA_PUT_STRING(skb, IFA_LABEL, ifa->ifa_label);
1151 
1152 	return nlmsg_end(skb, nlh);
1153 
1154 nla_put_failure:
1155 	nlmsg_cancel(skb, nlh);
1156 	return -EMSGSIZE;
1157 }
1158 
1159 static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1160 {
1161 	struct net *net = sock_net(skb->sk);
1162 	int idx, ip_idx;
1163 	struct net_device *dev;
1164 	struct in_device *in_dev;
1165 	struct in_ifaddr *ifa;
1166 	int s_ip_idx, s_idx = cb->args[0];
1167 
1168 	s_ip_idx = ip_idx = cb->args[1];
1169 	idx = 0;
1170 	for_each_netdev(net, dev) {
1171 		if (idx < s_idx)
1172 			goto cont;
1173 		if (idx > s_idx)
1174 			s_ip_idx = 0;
1175 		if ((in_dev = __in_dev_get_rtnl(dev)) == NULL)
1176 			goto cont;
1177 
1178 		for (ifa = in_dev->ifa_list, ip_idx = 0; ifa;
1179 		     ifa = ifa->ifa_next, ip_idx++) {
1180 			if (ip_idx < s_ip_idx)
1181 				continue;
1182 			if (inet_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid,
1183 					     cb->nlh->nlmsg_seq,
1184 					     RTM_NEWADDR, NLM_F_MULTI) <= 0)
1185 				goto done;
1186 		}
1187 cont:
1188 		idx++;
1189 	}
1190 
1191 done:
1192 	cb->args[0] = idx;
1193 	cb->args[1] = ip_idx;
1194 
1195 	return skb->len;
1196 }
1197 
1198 static void rtmsg_ifa(int event, struct in_ifaddr* ifa, struct nlmsghdr *nlh,
1199 		      u32 pid)
1200 {
1201 	struct sk_buff *skb;
1202 	u32 seq = nlh ? nlh->nlmsg_seq : 0;
1203 	int err = -ENOBUFS;
1204 	struct net *net;
1205 
1206 	net = dev_net(ifa->ifa_dev->dev);
1207 	skb = nlmsg_new(inet_nlmsg_size(), GFP_KERNEL);
1208 	if (skb == NULL)
1209 		goto errout;
1210 
1211 	err = inet_fill_ifaddr(skb, ifa, pid, seq, event, 0);
1212 	if (err < 0) {
1213 		/* -EMSGSIZE implies BUG in inet_nlmsg_size() */
1214 		WARN_ON(err == -EMSGSIZE);
1215 		kfree_skb(skb);
1216 		goto errout;
1217 	}
1218 	err = rtnl_notify(skb, net, pid, RTNLGRP_IPV4_IFADDR, nlh, GFP_KERNEL);
1219 errout:
1220 	if (err < 0)
1221 		rtnl_set_sk_err(net, RTNLGRP_IPV4_IFADDR, err);
1222 }
1223 
1224 #ifdef CONFIG_SYSCTL
1225 
1226 static void devinet_copy_dflt_conf(struct net *net, int i)
1227 {
1228 	struct net_device *dev;
1229 
1230 	read_lock(&dev_base_lock);
1231 	for_each_netdev(net, dev) {
1232 		struct in_device *in_dev;
1233 		rcu_read_lock();
1234 		in_dev = __in_dev_get_rcu(dev);
1235 		if (in_dev && !test_bit(i, in_dev->cnf.state))
1236 			in_dev->cnf.data[i] = net->ipv4.devconf_dflt->data[i];
1237 		rcu_read_unlock();
1238 	}
1239 	read_unlock(&dev_base_lock);
1240 }
1241 
1242 static void inet_forward_change(struct net *net)
1243 {
1244 	struct net_device *dev;
1245 	int on = IPV4_DEVCONF_ALL(net, FORWARDING);
1246 
1247 	IPV4_DEVCONF_ALL(net, ACCEPT_REDIRECTS) = !on;
1248 	IPV4_DEVCONF_DFLT(net, FORWARDING) = on;
1249 
1250 	read_lock(&dev_base_lock);
1251 	for_each_netdev(net, dev) {
1252 		struct in_device *in_dev;
1253 		if (on)
1254 			dev_disable_lro(dev);
1255 		rcu_read_lock();
1256 		in_dev = __in_dev_get_rcu(dev);
1257 		if (in_dev)
1258 			IN_DEV_CONF_SET(in_dev, FORWARDING, on);
1259 		rcu_read_unlock();
1260 	}
1261 	read_unlock(&dev_base_lock);
1262 }
1263 
1264 static int devinet_conf_proc(ctl_table *ctl, int write,
1265 			     struct file* filp, void __user *buffer,
1266 			     size_t *lenp, loff_t *ppos)
1267 {
1268 	int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
1269 
1270 	if (write) {
1271 		struct ipv4_devconf *cnf = ctl->extra1;
1272 		struct net *net = ctl->extra2;
1273 		int i = (int *)ctl->data - cnf->data;
1274 
1275 		set_bit(i, cnf->state);
1276 
1277 		if (cnf == net->ipv4.devconf_dflt)
1278 			devinet_copy_dflt_conf(net, i);
1279 	}
1280 
1281 	return ret;
1282 }
1283 
1284 static int devinet_conf_sysctl(ctl_table *table,
1285 			       void __user *oldval, size_t __user *oldlenp,
1286 			       void __user *newval, size_t newlen)
1287 {
1288 	struct ipv4_devconf *cnf;
1289 	struct net *net;
1290 	int *valp = table->data;
1291 	int new;
1292 	int i;
1293 
1294 	if (!newval || !newlen)
1295 		return 0;
1296 
1297 	if (newlen != sizeof(int))
1298 		return -EINVAL;
1299 
1300 	if (get_user(new, (int __user *)newval))
1301 		return -EFAULT;
1302 
1303 	if (new == *valp)
1304 		return 0;
1305 
1306 	if (oldval && oldlenp) {
1307 		size_t len;
1308 
1309 		if (get_user(len, oldlenp))
1310 			return -EFAULT;
1311 
1312 		if (len) {
1313 			if (len > table->maxlen)
1314 				len = table->maxlen;
1315 			if (copy_to_user(oldval, valp, len))
1316 				return -EFAULT;
1317 			if (put_user(len, oldlenp))
1318 				return -EFAULT;
1319 		}
1320 	}
1321 
1322 	*valp = new;
1323 
1324 	cnf = table->extra1;
1325 	net = table->extra2;
1326 	i = (int *)table->data - cnf->data;
1327 
1328 	set_bit(i, cnf->state);
1329 
1330 	if (cnf == net->ipv4.devconf_dflt)
1331 		devinet_copy_dflt_conf(net, i);
1332 
1333 	return 1;
1334 }
1335 
1336 static int devinet_sysctl_forward(ctl_table *ctl, int write,
1337 				  struct file* filp, void __user *buffer,
1338 				  size_t *lenp, loff_t *ppos)
1339 {
1340 	int *valp = ctl->data;
1341 	int val = *valp;
1342 	int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
1343 
1344 	if (write && *valp != val) {
1345 		struct net *net = ctl->extra2;
1346 
1347 		if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) {
1348 			rtnl_lock();
1349 			if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) {
1350 				inet_forward_change(net);
1351 			} else if (*valp) {
1352 				struct ipv4_devconf *cnf = ctl->extra1;
1353 				struct in_device *idev =
1354 					container_of(cnf, struct in_device, cnf);
1355 				dev_disable_lro(idev->dev);
1356 			}
1357 			rtnl_unlock();
1358 			rt_cache_flush(net, 0);
1359 		}
1360 	}
1361 
1362 	return ret;
1363 }
1364 
1365 int ipv4_doint_and_flush(ctl_table *ctl, int write,
1366 			 struct file* filp, void __user *buffer,
1367 			 size_t *lenp, loff_t *ppos)
1368 {
1369 	int *valp = ctl->data;
1370 	int val = *valp;
1371 	int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
1372 	struct net *net = ctl->extra2;
1373 
1374 	if (write && *valp != val)
1375 		rt_cache_flush(net, 0);
1376 
1377 	return ret;
1378 }
1379 
1380 int ipv4_doint_and_flush_strategy(ctl_table *table,
1381 				  void __user *oldval, size_t __user *oldlenp,
1382 				  void __user *newval, size_t newlen)
1383 {
1384 	int ret = devinet_conf_sysctl(table, oldval, oldlenp, newval, newlen);
1385 	struct net *net = table->extra2;
1386 
1387 	if (ret == 1)
1388 		rt_cache_flush(net, 0);
1389 
1390 	return ret;
1391 }
1392 
1393 
1394 #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc, sysctl) \
1395 	{ \
1396 		.ctl_name	= NET_IPV4_CONF_ ## attr, \
1397 		.procname	= name, \
1398 		.data		= ipv4_devconf.data + \
1399 				  NET_IPV4_CONF_ ## attr - 1, \
1400 		.maxlen		= sizeof(int), \
1401 		.mode		= mval, \
1402 		.proc_handler	= proc, \
1403 		.strategy	= sysctl, \
1404 		.extra1		= &ipv4_devconf, \
1405 	}
1406 
1407 #define DEVINET_SYSCTL_RW_ENTRY(attr, name) \
1408 	DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc, \
1409 			     devinet_conf_sysctl)
1410 
1411 #define DEVINET_SYSCTL_RO_ENTRY(attr, name) \
1412 	DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc, \
1413 			     devinet_conf_sysctl)
1414 
1415 #define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc, sysctl) \
1416 	DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc, sysctl)
1417 
1418 #define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \
1419 	DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush, \
1420 				     ipv4_doint_and_flush_strategy)
1421 
1422 static struct devinet_sysctl_table {
1423 	struct ctl_table_header *sysctl_header;
1424 	struct ctl_table devinet_vars[__NET_IPV4_CONF_MAX];
1425 	char *dev_name;
1426 } devinet_sysctl = {
1427 	.devinet_vars = {
1428 		DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding",
1429 					     devinet_sysctl_forward,
1430 					     devinet_conf_sysctl),
1431 		DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING, "mc_forwarding"),
1432 
1433 		DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS, "accept_redirects"),
1434 		DEVINET_SYSCTL_RW_ENTRY(SECURE_REDIRECTS, "secure_redirects"),
1435 		DEVINET_SYSCTL_RW_ENTRY(SHARED_MEDIA, "shared_media"),
1436 		DEVINET_SYSCTL_RW_ENTRY(RP_FILTER, "rp_filter"),
1437 		DEVINET_SYSCTL_RW_ENTRY(SEND_REDIRECTS, "send_redirects"),
1438 		DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE,
1439 					"accept_source_route"),
1440 		DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP, "proxy_arp"),
1441 		DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID, "medium_id"),
1442 		DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY, "bootp_relay"),
1443 		DEVINET_SYSCTL_RW_ENTRY(LOG_MARTIANS, "log_martians"),
1444 		DEVINET_SYSCTL_RW_ENTRY(TAG, "tag"),
1445 		DEVINET_SYSCTL_RW_ENTRY(ARPFILTER, "arp_filter"),
1446 		DEVINET_SYSCTL_RW_ENTRY(ARP_ANNOUNCE, "arp_announce"),
1447 		DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE, "arp_ignore"),
1448 		DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT, "arp_accept"),
1449 
1450 		DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM, "disable_xfrm"),
1451 		DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY, "disable_policy"),
1452 		DEVINET_SYSCTL_FLUSHING_ENTRY(FORCE_IGMP_VERSION,
1453 					      "force_igmp_version"),
1454 		DEVINET_SYSCTL_FLUSHING_ENTRY(PROMOTE_SECONDARIES,
1455 					      "promote_secondaries"),
1456 	},
1457 };
1458 
1459 static int __devinet_sysctl_register(struct net *net, char *dev_name,
1460 		int ctl_name, struct ipv4_devconf *p)
1461 {
1462 	int i;
1463 	struct devinet_sysctl_table *t;
1464 
1465 #define DEVINET_CTL_PATH_DEV	3
1466 
1467 	struct ctl_path devinet_ctl_path[] = {
1468 		{ .procname = "net", .ctl_name = CTL_NET, },
1469 		{ .procname = "ipv4", .ctl_name = NET_IPV4, },
1470 		{ .procname = "conf", .ctl_name = NET_IPV4_CONF, },
1471 		{ /* to be set */ },
1472 		{ },
1473 	};
1474 
1475 	t = kmemdup(&devinet_sysctl, sizeof(*t), GFP_KERNEL);
1476 	if (!t)
1477 		goto out;
1478 
1479 	for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
1480 		t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
1481 		t->devinet_vars[i].extra1 = p;
1482 		t->devinet_vars[i].extra2 = net;
1483 	}
1484 
1485 	/*
1486 	 * Make a copy of dev_name, because '.procname' is regarded as const
1487 	 * by sysctl and we wouldn't want anyone to change it under our feet
1488 	 * (see SIOCSIFNAME).
1489 	 */
1490 	t->dev_name = kstrdup(dev_name, GFP_KERNEL);
1491 	if (!t->dev_name)
1492 		goto free;
1493 
1494 	devinet_ctl_path[DEVINET_CTL_PATH_DEV].procname = t->dev_name;
1495 	devinet_ctl_path[DEVINET_CTL_PATH_DEV].ctl_name = ctl_name;
1496 
1497 	t->sysctl_header = register_net_sysctl_table(net, devinet_ctl_path,
1498 			t->devinet_vars);
1499 	if (!t->sysctl_header)
1500 		goto free_procname;
1501 
1502 	p->sysctl = t;
1503 	return 0;
1504 
1505 free_procname:
1506 	kfree(t->dev_name);
1507 free:
1508 	kfree(t);
1509 out:
1510 	return -ENOBUFS;
1511 }
1512 
1513 static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf)
1514 {
1515 	struct devinet_sysctl_table *t = cnf->sysctl;
1516 
1517 	if (t == NULL)
1518 		return;
1519 
1520 	cnf->sysctl = NULL;
1521 	unregister_sysctl_table(t->sysctl_header);
1522 	kfree(t->dev_name);
1523 	kfree(t);
1524 }
1525 
1526 static void devinet_sysctl_register(struct in_device *idev)
1527 {
1528 	neigh_sysctl_register(idev->dev, idev->arp_parms, NET_IPV4,
1529 			NET_IPV4_NEIGH, "ipv4", NULL, NULL);
1530 	__devinet_sysctl_register(dev_net(idev->dev), idev->dev->name,
1531 			idev->dev->ifindex, &idev->cnf);
1532 }
1533 
1534 static void devinet_sysctl_unregister(struct in_device *idev)
1535 {
1536 	__devinet_sysctl_unregister(&idev->cnf);
1537 	neigh_sysctl_unregister(idev->arp_parms);
1538 }
1539 
1540 static struct ctl_table ctl_forward_entry[] = {
1541 	{
1542 		.ctl_name	= NET_IPV4_FORWARD,
1543 		.procname	= "ip_forward",
1544 		.data		= &ipv4_devconf.data[
1545 					NET_IPV4_CONF_FORWARDING - 1],
1546 		.maxlen		= sizeof(int),
1547 		.mode		= 0644,
1548 		.proc_handler	= devinet_sysctl_forward,
1549 		.strategy	= devinet_conf_sysctl,
1550 		.extra1		= &ipv4_devconf,
1551 		.extra2		= &init_net,
1552 	},
1553 	{ },
1554 };
1555 
1556 static __net_initdata struct ctl_path net_ipv4_path[] = {
1557 	{ .procname = "net", .ctl_name = CTL_NET, },
1558 	{ .procname = "ipv4", .ctl_name = NET_IPV4, },
1559 	{ },
1560 };
1561 #endif
1562 
1563 static __net_init int devinet_init_net(struct net *net)
1564 {
1565 	int err;
1566 	struct ipv4_devconf *all, *dflt;
1567 #ifdef CONFIG_SYSCTL
1568 	struct ctl_table *tbl = ctl_forward_entry;
1569 	struct ctl_table_header *forw_hdr;
1570 #endif
1571 
1572 	err = -ENOMEM;
1573 	all = &ipv4_devconf;
1574 	dflt = &ipv4_devconf_dflt;
1575 
1576 	if (net != &init_net) {
1577 		all = kmemdup(all, sizeof(ipv4_devconf), GFP_KERNEL);
1578 		if (all == NULL)
1579 			goto err_alloc_all;
1580 
1581 		dflt = kmemdup(dflt, sizeof(ipv4_devconf_dflt), GFP_KERNEL);
1582 		if (dflt == NULL)
1583 			goto err_alloc_dflt;
1584 
1585 #ifdef CONFIG_SYSCTL
1586 		tbl = kmemdup(tbl, sizeof(ctl_forward_entry), GFP_KERNEL);
1587 		if (tbl == NULL)
1588 			goto err_alloc_ctl;
1589 
1590 		tbl[0].data = &all->data[NET_IPV4_CONF_FORWARDING - 1];
1591 		tbl[0].extra1 = all;
1592 		tbl[0].extra2 = net;
1593 #endif
1594 	}
1595 
1596 #ifdef CONFIG_SYSCTL
1597 	err = __devinet_sysctl_register(net, "all",
1598 			NET_PROTO_CONF_ALL, all);
1599 	if (err < 0)
1600 		goto err_reg_all;
1601 
1602 	err = __devinet_sysctl_register(net, "default",
1603 			NET_PROTO_CONF_DEFAULT, dflt);
1604 	if (err < 0)
1605 		goto err_reg_dflt;
1606 
1607 	err = -ENOMEM;
1608 	forw_hdr = register_net_sysctl_table(net, net_ipv4_path, tbl);
1609 	if (forw_hdr == NULL)
1610 		goto err_reg_ctl;
1611 	net->ipv4.forw_hdr = forw_hdr;
1612 #endif
1613 
1614 	net->ipv4.devconf_all = all;
1615 	net->ipv4.devconf_dflt = dflt;
1616 	return 0;
1617 
1618 #ifdef CONFIG_SYSCTL
1619 err_reg_ctl:
1620 	__devinet_sysctl_unregister(dflt);
1621 err_reg_dflt:
1622 	__devinet_sysctl_unregister(all);
1623 err_reg_all:
1624 	if (tbl != ctl_forward_entry)
1625 		kfree(tbl);
1626 err_alloc_ctl:
1627 #endif
1628 	if (dflt != &ipv4_devconf_dflt)
1629 		kfree(dflt);
1630 err_alloc_dflt:
1631 	if (all != &ipv4_devconf)
1632 		kfree(all);
1633 err_alloc_all:
1634 	return err;
1635 }
1636 
1637 static __net_exit void devinet_exit_net(struct net *net)
1638 {
1639 #ifdef CONFIG_SYSCTL
1640 	struct ctl_table *tbl;
1641 
1642 	tbl = net->ipv4.forw_hdr->ctl_table_arg;
1643 	unregister_net_sysctl_table(net->ipv4.forw_hdr);
1644 	__devinet_sysctl_unregister(net->ipv4.devconf_dflt);
1645 	__devinet_sysctl_unregister(net->ipv4.devconf_all);
1646 	kfree(tbl);
1647 #endif
1648 	kfree(net->ipv4.devconf_dflt);
1649 	kfree(net->ipv4.devconf_all);
1650 }
1651 
1652 static __net_initdata struct pernet_operations devinet_ops = {
1653 	.init = devinet_init_net,
1654 	.exit = devinet_exit_net,
1655 };
1656 
1657 void __init devinet_init(void)
1658 {
1659 	register_pernet_subsys(&devinet_ops);
1660 
1661 	register_gifconf(PF_INET, inet_gifconf);
1662 	register_netdevice_notifier(&ip_netdev_notifier);
1663 
1664 	rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL);
1665 	rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL);
1666 	rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr);
1667 }
1668 
1669 EXPORT_SYMBOL(in_dev_finish_destroy);
1670 EXPORT_SYMBOL(inet_select_addr);
1671 EXPORT_SYMBOL(inetdev_by_index);
1672 EXPORT_SYMBOL(register_inetaddr_notifier);
1673 EXPORT_SYMBOL(unregister_inetaddr_notifier);
1674