~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/ipv4/devinet.c

Version: ~ [ linux-5.4-rc3 ] ~ [ linux-5.3.6 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.79 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.149 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.196 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.196 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.75 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp