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