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