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