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