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