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