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