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