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