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