2 * NET3 IP device support routines.
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.
9 * Derived from the IP parts of dev.c 1.0.19
11 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
12 * Mark Evans, <evansmp@uhura.aston.ac.uk>
15 * Alan Cox, <gw4pts@gw4pts.ampr.org>
16 * Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
19 * Alexey Kuznetsov: pa_* fields are replaced with ifaddr
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
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>
38 #include <linux/socket.h>
39 #include <linux/sockios.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>
56 #include <linux/sysctl.h>
58 #include <linux/kmod.h>
59 #include <linux/netconf.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>
69 static struct ipv4_devconf ipv4_devconf = {
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*/,
80 static struct ipv4_devconf ipv4_devconf_dflt = {
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*/,
92 #define IPV4_DEVCONF_DFLT(net, attr) \
93 IPV4_DEVCONF((*net->ipv4.devconf_dflt), attr)
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 },
104 #define IN4_ADDR_HSIZE_SHIFT 8
105 #define IN4_ADDR_HSIZE (1U << IN4_ADDR_HSIZE_SHIFT)
107 static struct hlist_head inet_addr_lst[IN4_ADDR_HSIZE];
109 static u32 inet_addr_hash(const struct net *net, __be32 addr)
111 u32 val = (__force u32) addr ^ net_hash_mix(net);
113 return hash_32(val, IN4_ADDR_HSIZE_SHIFT);
116 static void inet_hash_insert(struct net *net, struct in_ifaddr *ifa)
118 u32 hash = inet_addr_hash(net, ifa->ifa_local);
121 hlist_add_head_rcu(&ifa->hash, &inet_addr_lst[hash]);
124 static void inet_hash_remove(struct in_ifaddr *ifa)
127 hlist_del_init_rcu(&ifa->hash);
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
136 * If a caller uses devref=false, it should be protected by RCU, or RTNL
138 struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref)
140 struct net_device *result = NULL;
141 struct in_ifaddr *ifa;
144 ifa = inet_lookup_ifaddr_rcu(net, addr);
146 struct flowi4 fl4 = { .daddr = addr };
147 struct fib_result res = { 0 };
148 struct fib_table *local;
150 /* Fallback to FIB local table so that communication
151 * over loopback subnets work.
153 local = fib_get_table(net, RT_TABLE_LOCAL);
155 !fib_table_lookup(local, &fl4, &res, FIB_LOOKUP_NOREF) &&
156 res.type == RTN_LOCAL)
157 result = FIB_RES_DEV(res);
159 result = ifa->ifa_dev->dev;
161 if (result && devref)
166 EXPORT_SYMBOL(__ip_dev_find);
168 /* called under RCU lock */
169 struct in_ifaddr *inet_lookup_ifaddr_rcu(struct net *net, __be32 addr)
171 u32 hash = inet_addr_hash(net, addr);
172 struct in_ifaddr *ifa;
174 hlist_for_each_entry_rcu(ifa, &inet_addr_lst[hash], hash)
175 if (ifa->ifa_local == addr &&
176 net_eq(dev_net(ifa->ifa_dev->dev), net))
182 static void rtmsg_ifa(int event, struct in_ifaddr *, struct nlmsghdr *, u32);
184 static BLOCKING_NOTIFIER_HEAD(inetaddr_chain);
185 static BLOCKING_NOTIFIER_HEAD(inetaddr_validator_chain);
186 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
189 static int devinet_sysctl_register(struct in_device *idev);
190 static void devinet_sysctl_unregister(struct in_device *idev);
192 static int devinet_sysctl_register(struct in_device *idev)
196 static void devinet_sysctl_unregister(struct in_device *idev)
201 /* Locks all the inet devices. */
203 static struct in_ifaddr *inet_alloc_ifa(void)
205 return kzalloc(sizeof(struct in_ifaddr), GFP_KERNEL);
208 static void inet_rcu_free_ifa(struct rcu_head *head)
210 struct in_ifaddr *ifa = container_of(head, struct in_ifaddr, rcu_head);
212 in_dev_put(ifa->ifa_dev);
216 static void inet_free_ifa(struct in_ifaddr *ifa)
218 call_rcu(&ifa->rcu_head, inet_rcu_free_ifa);
221 void in_dev_finish_destroy(struct in_device *idev)
223 struct net_device *dev = idev->dev;
225 WARN_ON(idev->ifa_list);
226 WARN_ON(idev->mc_list);
227 kfree(rcu_dereference_protected(idev->mc_hash, 1));
228 #ifdef NET_REFCNT_DEBUG
229 pr_debug("%s: %p=%s\n", __func__, idev, dev ? dev->name : "NIL");
233 pr_err("Freeing alive in_device %p\n", idev);
237 EXPORT_SYMBOL(in_dev_finish_destroy);
239 static struct in_device *inetdev_init(struct net_device *dev)
241 struct in_device *in_dev;
246 in_dev = kzalloc(sizeof(*in_dev), GFP_KERNEL);
249 memcpy(&in_dev->cnf, dev_net(dev)->ipv4.devconf_dflt,
250 sizeof(in_dev->cnf));
251 in_dev->cnf.sysctl = NULL;
253 in_dev->arp_parms = neigh_parms_alloc(dev, &arp_tbl);
254 if (!in_dev->arp_parms)
256 if (IPV4_DEVCONF(in_dev->cnf, FORWARDING))
257 dev_disable_lro(dev);
258 /* Reference in_dev->dev */
260 /* Account for reference dev->ip_ptr (below) */
261 refcount_set(&in_dev->refcnt, 1);
263 err = devinet_sysctl_register(in_dev);
270 ip_mc_init_dev(in_dev);
271 if (dev->flags & IFF_UP)
274 /* we can receive as soon as ip_ptr is set -- do this last */
275 rcu_assign_pointer(dev->ip_ptr, in_dev);
277 return in_dev ?: ERR_PTR(err);
284 static void in_dev_rcu_put(struct rcu_head *head)
286 struct in_device *idev = container_of(head, struct in_device, rcu_head);
290 static void inetdev_destroy(struct in_device *in_dev)
292 struct in_ifaddr *ifa;
293 struct net_device *dev;
301 ip_mc_destroy_dev(in_dev);
303 while ((ifa = in_dev->ifa_list) != NULL) {
304 inet_del_ifa(in_dev, &in_dev->ifa_list, 0);
308 RCU_INIT_POINTER(dev->ip_ptr, NULL);
310 devinet_sysctl_unregister(in_dev);
311 neigh_parms_release(&arp_tbl, in_dev->arp_parms);
314 call_rcu(&in_dev->rcu_head, in_dev_rcu_put);
317 int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b)
320 for_primary_ifa(in_dev) {
321 if (inet_ifa_match(a, ifa)) {
322 if (!b || inet_ifa_match(b, ifa)) {
327 } endfor_ifa(in_dev);
332 static void __inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
333 int destroy, struct nlmsghdr *nlh, u32 portid)
335 struct in_ifaddr *promote = NULL;
336 struct in_ifaddr *ifa, *ifa1 = *ifap;
337 struct in_ifaddr *last_prim = in_dev->ifa_list;
338 struct in_ifaddr *prev_prom = NULL;
339 int do_promote = IN_DEV_PROMOTE_SECONDARIES(in_dev);
346 /* 1. Deleting primary ifaddr forces deletion all secondaries
347 * unless alias promotion is set
350 if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
351 struct in_ifaddr **ifap1 = &ifa1->ifa_next;
353 while ((ifa = *ifap1) != NULL) {
354 if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
355 ifa1->ifa_scope <= ifa->ifa_scope)
358 if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
359 ifa1->ifa_mask != ifa->ifa_mask ||
360 !inet_ifa_match(ifa1->ifa_address, ifa)) {
361 ifap1 = &ifa->ifa_next;
367 inet_hash_remove(ifa);
368 *ifap1 = ifa->ifa_next;
370 rtmsg_ifa(RTM_DELADDR, ifa, nlh, portid);
371 blocking_notifier_call_chain(&inetaddr_chain,
381 /* On promotion all secondaries from subnet are changing
382 * the primary IP, we must remove all their routes silently
383 * and later to add them back with new prefsrc. Do this
384 * while all addresses are on the device list.
386 for (ifa = promote; ifa; ifa = ifa->ifa_next) {
387 if (ifa1->ifa_mask == ifa->ifa_mask &&
388 inet_ifa_match(ifa1->ifa_address, ifa))
389 fib_del_ifaddr(ifa, ifa1);
395 *ifap = ifa1->ifa_next;
396 inet_hash_remove(ifa1);
398 /* 3. Announce address deletion */
400 /* Send message first, then call notifier.
401 At first sight, FIB update triggered by notifier
402 will refer to already deleted ifaddr, that could confuse
403 netlink listeners. It is not true: look, gated sees
404 that route deleted and if it still thinks that ifaddr
405 is valid, it will try to restore deleted routes... Grr.
406 So that, this order is correct.
408 rtmsg_ifa(RTM_DELADDR, ifa1, nlh, portid);
409 blocking_notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
412 struct in_ifaddr *next_sec = promote->ifa_next;
415 prev_prom->ifa_next = promote->ifa_next;
416 promote->ifa_next = last_prim->ifa_next;
417 last_prim->ifa_next = promote;
420 promote->ifa_flags &= ~IFA_F_SECONDARY;
421 rtmsg_ifa(RTM_NEWADDR, promote, nlh, portid);
422 blocking_notifier_call_chain(&inetaddr_chain,
424 for (ifa = next_sec; ifa; ifa = ifa->ifa_next) {
425 if (ifa1->ifa_mask != ifa->ifa_mask ||
426 !inet_ifa_match(ifa1->ifa_address, ifa))
436 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
439 __inet_del_ifa(in_dev, ifap, destroy, NULL, 0);
442 static void check_lifetime(struct work_struct *work);
444 static DECLARE_DELAYED_WORK(check_lifetime_work, check_lifetime);
446 static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
447 u32 portid, struct netlink_ext_ack *extack)
449 struct in_device *in_dev = ifa->ifa_dev;
450 struct in_ifaddr *ifa1, **ifap, **last_primary;
451 struct in_validator_info ivi;
456 if (!ifa->ifa_local) {
461 ifa->ifa_flags &= ~IFA_F_SECONDARY;
462 last_primary = &in_dev->ifa_list;
464 for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL;
465 ifap = &ifa1->ifa_next) {
466 if (!(ifa1->ifa_flags & IFA_F_SECONDARY) &&
467 ifa->ifa_scope <= ifa1->ifa_scope)
468 last_primary = &ifa1->ifa_next;
469 if (ifa1->ifa_mask == ifa->ifa_mask &&
470 inet_ifa_match(ifa1->ifa_address, ifa)) {
471 if (ifa1->ifa_local == ifa->ifa_local) {
475 if (ifa1->ifa_scope != ifa->ifa_scope) {
479 ifa->ifa_flags |= IFA_F_SECONDARY;
483 /* Allow any devices that wish to register ifaddr validtors to weigh
484 * in now, before changes are committed. The rntl lock is serializing
485 * access here, so the state should not change between a validator call
486 * and a final notify on commit. This isn't invoked on promotion under
487 * the assumption that validators are checking the address itself, and
490 ivi.ivi_addr = ifa->ifa_address;
491 ivi.ivi_dev = ifa->ifa_dev;
493 ret = blocking_notifier_call_chain(&inetaddr_validator_chain,
495 ret = notifier_to_errno(ret);
501 if (!(ifa->ifa_flags & IFA_F_SECONDARY)) {
502 prandom_seed((__force u32) ifa->ifa_local);
506 ifa->ifa_next = *ifap;
509 inet_hash_insert(dev_net(in_dev->dev), ifa);
511 cancel_delayed_work(&check_lifetime_work);
512 queue_delayed_work(system_power_efficient_wq, &check_lifetime_work, 0);
514 /* Send message first, then call notifier.
515 Notifier will trigger FIB update, so that
516 listeners of netlink will know about new ifaddr */
517 rtmsg_ifa(RTM_NEWADDR, ifa, nlh, portid);
518 blocking_notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
523 static int inet_insert_ifa(struct in_ifaddr *ifa)
525 return __inet_insert_ifa(ifa, NULL, 0, NULL);
528 static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
530 struct in_device *in_dev = __in_dev_get_rtnl(dev);
538 ipv4_devconf_setall(in_dev);
539 neigh_parms_data_state_setall(in_dev->arp_parms);
540 if (ifa->ifa_dev != in_dev) {
541 WARN_ON(ifa->ifa_dev);
543 ifa->ifa_dev = in_dev;
545 if (ipv4_is_loopback(ifa->ifa_local))
546 ifa->ifa_scope = RT_SCOPE_HOST;
547 return inet_insert_ifa(ifa);
550 /* Caller must hold RCU or RTNL :
551 * We dont take a reference on found in_device
553 struct in_device *inetdev_by_index(struct net *net, int ifindex)
555 struct net_device *dev;
556 struct in_device *in_dev = NULL;
559 dev = dev_get_by_index_rcu(net, ifindex);
561 in_dev = rcu_dereference_rtnl(dev->ip_ptr);
565 EXPORT_SYMBOL(inetdev_by_index);
567 /* Called only from RTNL semaphored context. No locks. */
569 struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
574 for_primary_ifa(in_dev) {
575 if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
577 } endfor_ifa(in_dev);
581 static int ip_mc_config(struct sock *sk, bool join, const struct in_ifaddr *ifa)
583 struct ip_mreqn mreq = {
584 .imr_multiaddr.s_addr = ifa->ifa_address,
585 .imr_ifindex = ifa->ifa_dev->dev->ifindex,
593 ret = ip_mc_join_group(sk, &mreq);
595 ret = ip_mc_leave_group(sk, &mreq);
601 static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh,
602 struct netlink_ext_ack *extack)
604 struct net *net = sock_net(skb->sk);
605 struct nlattr *tb[IFA_MAX+1];
606 struct in_device *in_dev;
607 struct ifaddrmsg *ifm;
608 struct in_ifaddr *ifa, **ifap;
613 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy,
618 ifm = nlmsg_data(nlh);
619 in_dev = inetdev_by_index(net, ifm->ifa_index);
625 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
626 ifap = &ifa->ifa_next) {
628 ifa->ifa_local != nla_get_in_addr(tb[IFA_LOCAL]))
631 if (tb[IFA_LABEL] && nla_strcmp(tb[IFA_LABEL], ifa->ifa_label))
634 if (tb[IFA_ADDRESS] &&
635 (ifm->ifa_prefixlen != ifa->ifa_prefixlen ||
636 !inet_ifa_match(nla_get_in_addr(tb[IFA_ADDRESS]), ifa)))
639 if (ipv4_is_multicast(ifa->ifa_address))
640 ip_mc_config(net->ipv4.mc_autojoin_sk, false, ifa);
641 __inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).portid);
645 err = -EADDRNOTAVAIL;
650 #define INFINITY_LIFE_TIME 0xFFFFFFFF
652 static void check_lifetime(struct work_struct *work)
654 unsigned long now, next, next_sec, next_sched;
655 struct in_ifaddr *ifa;
656 struct hlist_node *n;
660 next = round_jiffies_up(now + ADDR_CHECK_FREQUENCY);
662 for (i = 0; i < IN4_ADDR_HSIZE; i++) {
663 bool change_needed = false;
666 hlist_for_each_entry_rcu(ifa, &inet_addr_lst[i], hash) {
669 if (ifa->ifa_flags & IFA_F_PERMANENT)
672 /* We try to batch several events at once. */
673 age = (now - ifa->ifa_tstamp +
674 ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
676 if (ifa->ifa_valid_lft != INFINITY_LIFE_TIME &&
677 age >= ifa->ifa_valid_lft) {
678 change_needed = true;
679 } else if (ifa->ifa_preferred_lft ==
680 INFINITY_LIFE_TIME) {
682 } else if (age >= ifa->ifa_preferred_lft) {
683 if (time_before(ifa->ifa_tstamp +
684 ifa->ifa_valid_lft * HZ, next))
685 next = ifa->ifa_tstamp +
686 ifa->ifa_valid_lft * HZ;
688 if (!(ifa->ifa_flags & IFA_F_DEPRECATED))
689 change_needed = true;
690 } else if (time_before(ifa->ifa_tstamp +
691 ifa->ifa_preferred_lft * HZ,
693 next = ifa->ifa_tstamp +
694 ifa->ifa_preferred_lft * HZ;
701 hlist_for_each_entry_safe(ifa, n, &inet_addr_lst[i], hash) {
704 if (ifa->ifa_flags & IFA_F_PERMANENT)
707 /* We try to batch several events at once. */
708 age = (now - ifa->ifa_tstamp +
709 ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
711 if (ifa->ifa_valid_lft != INFINITY_LIFE_TIME &&
712 age >= ifa->ifa_valid_lft) {
713 struct in_ifaddr **ifap;
715 for (ifap = &ifa->ifa_dev->ifa_list;
716 *ifap != NULL; ifap = &(*ifap)->ifa_next) {
718 inet_del_ifa(ifa->ifa_dev,
723 } else if (ifa->ifa_preferred_lft !=
724 INFINITY_LIFE_TIME &&
725 age >= ifa->ifa_preferred_lft &&
726 !(ifa->ifa_flags & IFA_F_DEPRECATED)) {
727 ifa->ifa_flags |= IFA_F_DEPRECATED;
728 rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
734 next_sec = round_jiffies_up(next);
737 /* If rounded timeout is accurate enough, accept it. */
738 if (time_before(next_sec, next + ADDRCONF_TIMER_FUZZ))
739 next_sched = next_sec;
742 /* And minimum interval is ADDRCONF_TIMER_FUZZ_MAX. */
743 if (time_before(next_sched, now + ADDRCONF_TIMER_FUZZ_MAX))
744 next_sched = now + ADDRCONF_TIMER_FUZZ_MAX;
746 queue_delayed_work(system_power_efficient_wq, &check_lifetime_work,
750 static void set_ifa_lifetime(struct in_ifaddr *ifa, __u32 valid_lft,
753 unsigned long timeout;
755 ifa->ifa_flags &= ~(IFA_F_PERMANENT | IFA_F_DEPRECATED);
757 timeout = addrconf_timeout_fixup(valid_lft, HZ);
758 if (addrconf_finite_timeout(timeout))
759 ifa->ifa_valid_lft = timeout;
761 ifa->ifa_flags |= IFA_F_PERMANENT;
763 timeout = addrconf_timeout_fixup(prefered_lft, HZ);
764 if (addrconf_finite_timeout(timeout)) {
766 ifa->ifa_flags |= IFA_F_DEPRECATED;
767 ifa->ifa_preferred_lft = timeout;
769 ifa->ifa_tstamp = jiffies;
770 if (!ifa->ifa_cstamp)
771 ifa->ifa_cstamp = ifa->ifa_tstamp;
774 static struct in_ifaddr *rtm_to_ifaddr(struct net *net, struct nlmsghdr *nlh,
775 __u32 *pvalid_lft, __u32 *pprefered_lft)
777 struct nlattr *tb[IFA_MAX+1];
778 struct in_ifaddr *ifa;
779 struct ifaddrmsg *ifm;
780 struct net_device *dev;
781 struct in_device *in_dev;
784 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy,
789 ifm = nlmsg_data(nlh);
791 if (ifm->ifa_prefixlen > 32 || !tb[IFA_LOCAL])
794 dev = __dev_get_by_index(net, ifm->ifa_index);
799 in_dev = __in_dev_get_rtnl(dev);
804 ifa = inet_alloc_ifa();
807 * A potential indev allocation can be left alive, it stays
808 * assigned to its device and is destroy with it.
812 ipv4_devconf_setall(in_dev);
813 neigh_parms_data_state_setall(in_dev->arp_parms);
816 if (!tb[IFA_ADDRESS])
817 tb[IFA_ADDRESS] = tb[IFA_LOCAL];
819 INIT_HLIST_NODE(&ifa->hash);
820 ifa->ifa_prefixlen = ifm->ifa_prefixlen;
821 ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
822 ifa->ifa_flags = tb[IFA_FLAGS] ? nla_get_u32(tb[IFA_FLAGS]) :
824 ifa->ifa_scope = ifm->ifa_scope;
825 ifa->ifa_dev = in_dev;
827 ifa->ifa_local = nla_get_in_addr(tb[IFA_LOCAL]);
828 ifa->ifa_address = nla_get_in_addr(tb[IFA_ADDRESS]);
830 if (tb[IFA_BROADCAST])
831 ifa->ifa_broadcast = nla_get_in_addr(tb[IFA_BROADCAST]);
834 nla_strlcpy(ifa->ifa_label, tb[IFA_LABEL], IFNAMSIZ);
836 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
838 if (tb[IFA_CACHEINFO]) {
839 struct ifa_cacheinfo *ci;
841 ci = nla_data(tb[IFA_CACHEINFO]);
842 if (!ci->ifa_valid || ci->ifa_prefered > ci->ifa_valid) {
846 *pvalid_lft = ci->ifa_valid;
847 *pprefered_lft = ci->ifa_prefered;
858 static struct in_ifaddr *find_matching_ifa(struct in_ifaddr *ifa)
860 struct in_device *in_dev = ifa->ifa_dev;
861 struct in_ifaddr *ifa1, **ifap;
866 for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL;
867 ifap = &ifa1->ifa_next) {
868 if (ifa1->ifa_mask == ifa->ifa_mask &&
869 inet_ifa_match(ifa1->ifa_address, ifa) &&
870 ifa1->ifa_local == ifa->ifa_local)
876 static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
877 struct netlink_ext_ack *extack)
879 struct net *net = sock_net(skb->sk);
880 struct in_ifaddr *ifa;
881 struct in_ifaddr *ifa_existing;
882 __u32 valid_lft = INFINITY_LIFE_TIME;
883 __u32 prefered_lft = INFINITY_LIFE_TIME;
887 ifa = rtm_to_ifaddr(net, nlh, &valid_lft, &prefered_lft);
891 ifa_existing = find_matching_ifa(ifa);
893 /* It would be best to check for !NLM_F_CREATE here but
894 * userspace already relies on not having to provide this.
896 set_ifa_lifetime(ifa, valid_lft, prefered_lft);
897 if (ifa->ifa_flags & IFA_F_MCAUTOJOIN) {
898 int ret = ip_mc_config(net->ipv4.mc_autojoin_sk,
906 return __inet_insert_ifa(ifa, nlh, NETLINK_CB(skb).portid,
911 if (nlh->nlmsg_flags & NLM_F_EXCL ||
912 !(nlh->nlmsg_flags & NLM_F_REPLACE))
915 set_ifa_lifetime(ifa, valid_lft, prefered_lft);
916 cancel_delayed_work(&check_lifetime_work);
917 queue_delayed_work(system_power_efficient_wq,
918 &check_lifetime_work, 0);
919 rtmsg_ifa(RTM_NEWADDR, ifa, nlh, NETLINK_CB(skb).portid);
925 * Determine a default network mask, based on the IP address.
928 static int inet_abc_len(__be32 addr)
930 int rc = -1; /* Something else, probably a multicast. */
932 if (ipv4_is_zeronet(addr))
935 __u32 haddr = ntohl(addr);
937 if (IN_CLASSA(haddr))
939 else if (IN_CLASSB(haddr))
941 else if (IN_CLASSC(haddr))
949 int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
952 struct sockaddr_in sin_orig;
953 struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
954 struct in_device *in_dev;
955 struct in_ifaddr **ifap = NULL;
956 struct in_ifaddr *ifa = NULL;
957 struct net_device *dev;
960 int tryaddrmatch = 0;
963 * Fetch the caller's info block into kernel space
966 if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
968 ifr.ifr_name[IFNAMSIZ - 1] = 0;
970 /* save original address for comparison */
971 memcpy(&sin_orig, sin, sizeof(*sin));
973 colon = strchr(ifr.ifr_name, ':');
977 dev_load(net, ifr.ifr_name);
980 case SIOCGIFADDR: /* Get interface address */
981 case SIOCGIFBRDADDR: /* Get the broadcast address */
982 case SIOCGIFDSTADDR: /* Get the destination address */
983 case SIOCGIFNETMASK: /* Get the netmask for the interface */
984 /* Note that these ioctls will not sleep,
985 so that we do not impose a lock.
986 One day we will be forced to put shlock here (I mean SMP)
988 tryaddrmatch = (sin_orig.sin_family == AF_INET);
989 memset(sin, 0, sizeof(*sin));
990 sin->sin_family = AF_INET;
995 if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
998 case SIOCSIFADDR: /* Set interface address (and family) */
999 case SIOCSIFBRDADDR: /* Set the broadcast address */
1000 case SIOCSIFDSTADDR: /* Set the destination address */
1001 case SIOCSIFNETMASK: /* Set the netmask for the interface */
1003 if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
1006 if (sin->sin_family != AF_INET)
1017 dev = __dev_get_by_name(net, ifr.ifr_name);
1024 in_dev = __in_dev_get_rtnl(dev);
1027 /* Matthias Andree */
1028 /* compare label and address (4.4BSD style) */
1029 /* note: we only do this for a limited set of ioctls
1030 and only if the original address family was AF_INET.
1031 This is checked above. */
1032 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
1033 ifap = &ifa->ifa_next) {
1034 if (!strcmp(ifr.ifr_name, ifa->ifa_label) &&
1035 sin_orig.sin_addr.s_addr ==
1041 /* we didn't get a match, maybe the application is
1042 4.3BSD-style and passed in junk so we fall back to
1043 comparing just the label */
1045 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
1046 ifap = &ifa->ifa_next)
1047 if (!strcmp(ifr.ifr_name, ifa->ifa_label))
1052 ret = -EADDRNOTAVAIL;
1053 if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
1057 case SIOCGIFADDR: /* Get interface address */
1058 sin->sin_addr.s_addr = ifa->ifa_local;
1061 case SIOCGIFBRDADDR: /* Get the broadcast address */
1062 sin->sin_addr.s_addr = ifa->ifa_broadcast;
1065 case SIOCGIFDSTADDR: /* Get the destination address */
1066 sin->sin_addr.s_addr = ifa->ifa_address;
1069 case SIOCGIFNETMASK: /* Get the netmask for the interface */
1070 sin->sin_addr.s_addr = ifa->ifa_mask;
1075 ret = -EADDRNOTAVAIL;
1079 if (!(ifr.ifr_flags & IFF_UP))
1080 inet_del_ifa(in_dev, ifap, 1);
1083 ret = dev_change_flags(dev, ifr.ifr_flags);
1086 case SIOCSIFADDR: /* Set interface address (and family) */
1088 if (inet_abc_len(sin->sin_addr.s_addr) < 0)
1093 ifa = inet_alloc_ifa();
1096 INIT_HLIST_NODE(&ifa->hash);
1098 memcpy(ifa->ifa_label, ifr.ifr_name, IFNAMSIZ);
1100 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1103 if (ifa->ifa_local == sin->sin_addr.s_addr)
1105 inet_del_ifa(in_dev, ifap, 0);
1106 ifa->ifa_broadcast = 0;
1110 ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;
1112 if (!(dev->flags & IFF_POINTOPOINT)) {
1113 ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
1114 ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
1115 if ((dev->flags & IFF_BROADCAST) &&
1116 ifa->ifa_prefixlen < 31)
1117 ifa->ifa_broadcast = ifa->ifa_address |
1120 ifa->ifa_prefixlen = 32;
1121 ifa->ifa_mask = inet_make_mask(32);
1123 set_ifa_lifetime(ifa, INFINITY_LIFE_TIME, INFINITY_LIFE_TIME);
1124 ret = inet_set_ifa(dev, ifa);
1127 case SIOCSIFBRDADDR: /* Set the broadcast address */
1129 if (ifa->ifa_broadcast != sin->sin_addr.s_addr) {
1130 inet_del_ifa(in_dev, ifap, 0);
1131 ifa->ifa_broadcast = sin->sin_addr.s_addr;
1132 inet_insert_ifa(ifa);
1136 case SIOCSIFDSTADDR: /* Set the destination address */
1138 if (ifa->ifa_address == sin->sin_addr.s_addr)
1141 if (inet_abc_len(sin->sin_addr.s_addr) < 0)
1144 inet_del_ifa(in_dev, ifap, 0);
1145 ifa->ifa_address = sin->sin_addr.s_addr;
1146 inet_insert_ifa(ifa);
1149 case SIOCSIFNETMASK: /* Set the netmask for the interface */
1152 * The mask we set must be legal.
1155 if (bad_mask(sin->sin_addr.s_addr, 0))
1158 if (ifa->ifa_mask != sin->sin_addr.s_addr) {
1159 __be32 old_mask = ifa->ifa_mask;
1160 inet_del_ifa(in_dev, ifap, 0);
1161 ifa->ifa_mask = sin->sin_addr.s_addr;
1162 ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
1164 /* See if current broadcast address matches
1165 * with current netmask, then recalculate
1166 * the broadcast address. Otherwise it's a
1167 * funny address, so don't touch it since
1168 * the user seems to know what (s)he's doing...
1170 if ((dev->flags & IFF_BROADCAST) &&
1171 (ifa->ifa_prefixlen < 31) &&
1172 (ifa->ifa_broadcast ==
1173 (ifa->ifa_local|~old_mask))) {
1174 ifa->ifa_broadcast = (ifa->ifa_local |
1175 ~sin->sin_addr.s_addr);
1177 inet_insert_ifa(ifa);
1187 ret = copy_to_user(arg, &ifr, sizeof(struct ifreq)) ? -EFAULT : 0;
1191 static int inet_gifconf(struct net_device *dev, char __user *buf, int len, int size)
1193 struct in_device *in_dev = __in_dev_get_rtnl(dev);
1194 struct in_ifaddr *ifa;
1198 if (WARN_ON(size > sizeof(struct ifreq)))
1204 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
1211 memset(&ifr, 0, sizeof(struct ifreq));
1212 strcpy(ifr.ifr_name, ifa->ifa_label);
1214 (*(struct sockaddr_in *)&ifr.ifr_addr).sin_family = AF_INET;
1215 (*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr =
1218 if (copy_to_user(buf + done, &ifr, size)) {
1229 static __be32 in_dev_select_addr(const struct in_device *in_dev,
1232 for_primary_ifa(in_dev) {
1233 if (ifa->ifa_scope != RT_SCOPE_LINK &&
1234 ifa->ifa_scope <= scope)
1235 return ifa->ifa_local;
1236 } endfor_ifa(in_dev);
1241 __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope)
1244 struct in_device *in_dev;
1245 struct net *net = dev_net(dev);
1249 in_dev = __in_dev_get_rcu(dev);
1253 for_primary_ifa(in_dev) {
1254 if (ifa->ifa_scope > scope)
1256 if (!dst || inet_ifa_match(dst, ifa)) {
1257 addr = ifa->ifa_local;
1261 addr = ifa->ifa_local;
1262 } endfor_ifa(in_dev);
1267 master_idx = l3mdev_master_ifindex_rcu(dev);
1269 /* For VRFs, the VRF device takes the place of the loopback device,
1270 * with addresses on it being preferred. Note in such cases the
1271 * loopback device will be among the devices that fail the master_idx
1272 * equality check in the loop below.
1275 (dev = dev_get_by_index_rcu(net, master_idx)) &&
1276 (in_dev = __in_dev_get_rcu(dev))) {
1277 addr = in_dev_select_addr(in_dev, scope);
1282 /* Not loopback addresses on loopback should be preferred
1283 in this case. It is important that lo is the first interface
1286 for_each_netdev_rcu(net, dev) {
1287 if (l3mdev_master_ifindex_rcu(dev) != master_idx)
1290 in_dev = __in_dev_get_rcu(dev);
1294 addr = in_dev_select_addr(in_dev, scope);
1302 EXPORT_SYMBOL(inet_select_addr);
1304 static __be32 confirm_addr_indev(struct in_device *in_dev, __be32 dst,
1305 __be32 local, int scope)
1312 (local == ifa->ifa_local || !local) &&
1313 ifa->ifa_scope <= scope) {
1314 addr = ifa->ifa_local;
1319 same = (!local || inet_ifa_match(local, ifa)) &&
1320 (!dst || inet_ifa_match(dst, ifa));
1324 /* Is the selected addr into dst subnet? */
1325 if (inet_ifa_match(addr, ifa))
1327 /* No, then can we use new local src? */
1328 if (ifa->ifa_scope <= scope) {
1329 addr = ifa->ifa_local;
1332 /* search for large dst subnet for addr */
1336 } endfor_ifa(in_dev);
1338 return same ? addr : 0;
1342 * Confirm that local IP address exists using wildcards:
1343 * - net: netns to check, cannot be NULL
1344 * - in_dev: only on this interface, NULL=any interface
1345 * - dst: only in the same subnet as dst, 0=any dst
1346 * - local: address, 0=autoselect the local address
1347 * - scope: maximum allowed scope value for the local address
1349 __be32 inet_confirm_addr(struct net *net, struct in_device *in_dev,
1350 __be32 dst, __be32 local, int scope)
1353 struct net_device *dev;
1356 return confirm_addr_indev(in_dev, dst, local, scope);
1359 for_each_netdev_rcu(net, dev) {
1360 in_dev = __in_dev_get_rcu(dev);
1362 addr = confirm_addr_indev(in_dev, dst, local, scope);
1371 EXPORT_SYMBOL(inet_confirm_addr);
1377 int register_inetaddr_notifier(struct notifier_block *nb)
1379 return blocking_notifier_chain_register(&inetaddr_chain, nb);
1381 EXPORT_SYMBOL(register_inetaddr_notifier);
1383 int unregister_inetaddr_notifier(struct notifier_block *nb)
1385 return blocking_notifier_chain_unregister(&inetaddr_chain, nb);
1387 EXPORT_SYMBOL(unregister_inetaddr_notifier);
1389 int register_inetaddr_validator_notifier(struct notifier_block *nb)
1391 return blocking_notifier_chain_register(&inetaddr_validator_chain, nb);
1393 EXPORT_SYMBOL(register_inetaddr_validator_notifier);
1395 int unregister_inetaddr_validator_notifier(struct notifier_block *nb)
1397 return blocking_notifier_chain_unregister(&inetaddr_validator_chain,
1400 EXPORT_SYMBOL(unregister_inetaddr_validator_notifier);
1402 /* Rename ifa_labels for a device name change. Make some effort to preserve
1403 * existing alias numbering and to create unique labels if possible.
1405 static void inetdev_changename(struct net_device *dev, struct in_device *in_dev)
1407 struct in_ifaddr *ifa;
1410 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
1411 char old[IFNAMSIZ], *dot;
1413 memcpy(old, ifa->ifa_label, IFNAMSIZ);
1414 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1417 dot = strchr(old, ':');
1419 sprintf(old, ":%d", named);
1422 if (strlen(dot) + strlen(dev->name) < IFNAMSIZ)
1423 strcat(ifa->ifa_label, dot);
1425 strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
1427 rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
1431 static bool inetdev_valid_mtu(unsigned int mtu)
1433 return mtu >= IPV4_MIN_MTU;
1436 static void inetdev_send_gratuitous_arp(struct net_device *dev,
1437 struct in_device *in_dev)
1440 struct in_ifaddr *ifa;
1442 for (ifa = in_dev->ifa_list; ifa;
1443 ifa = ifa->ifa_next) {
1444 arp_send(ARPOP_REQUEST, ETH_P_ARP,
1445 ifa->ifa_local, dev,
1446 ifa->ifa_local, NULL,
1447 dev->dev_addr, NULL);
1451 /* Called only under RTNL semaphore */
1453 static int inetdev_event(struct notifier_block *this, unsigned long event,
1456 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1457 struct in_device *in_dev = __in_dev_get_rtnl(dev);
1462 if (event == NETDEV_REGISTER) {
1463 in_dev = inetdev_init(dev);
1465 return notifier_from_errno(PTR_ERR(in_dev));
1466 if (dev->flags & IFF_LOOPBACK) {
1467 IN_DEV_CONF_SET(in_dev, NOXFRM, 1);
1468 IN_DEV_CONF_SET(in_dev, NOPOLICY, 1);
1470 } else if (event == NETDEV_CHANGEMTU) {
1471 /* Re-enabling IP */
1472 if (inetdev_valid_mtu(dev->mtu))
1473 in_dev = inetdev_init(dev);
1479 case NETDEV_REGISTER:
1480 pr_debug("%s: bug\n", __func__);
1481 RCU_INIT_POINTER(dev->ip_ptr, NULL);
1484 if (!inetdev_valid_mtu(dev->mtu))
1486 if (dev->flags & IFF_LOOPBACK) {
1487 struct in_ifaddr *ifa = inet_alloc_ifa();
1490 INIT_HLIST_NODE(&ifa->hash);
1492 ifa->ifa_address = htonl(INADDR_LOOPBACK);
1493 ifa->ifa_prefixlen = 8;
1494 ifa->ifa_mask = inet_make_mask(8);
1495 in_dev_hold(in_dev);
1496 ifa->ifa_dev = in_dev;
1497 ifa->ifa_scope = RT_SCOPE_HOST;
1498 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1499 set_ifa_lifetime(ifa, INFINITY_LIFE_TIME,
1500 INFINITY_LIFE_TIME);
1501 ipv4_devconf_setall(in_dev);
1502 neigh_parms_data_state_setall(in_dev->arp_parms);
1503 inet_insert_ifa(ifa);
1508 case NETDEV_CHANGEADDR:
1509 if (!IN_DEV_ARP_NOTIFY(in_dev))
1512 case NETDEV_NOTIFY_PEERS:
1513 /* Send gratuitous ARP to notify of link change */
1514 inetdev_send_gratuitous_arp(dev, in_dev);
1519 case NETDEV_PRE_TYPE_CHANGE:
1520 ip_mc_unmap(in_dev);
1522 case NETDEV_POST_TYPE_CHANGE:
1523 ip_mc_remap(in_dev);
1525 case NETDEV_CHANGEMTU:
1526 if (inetdev_valid_mtu(dev->mtu))
1528 /* disable IP when MTU is not enough */
1530 case NETDEV_UNREGISTER:
1531 inetdev_destroy(in_dev);
1533 case NETDEV_CHANGENAME:
1534 /* Do not notify about label change, this event is
1535 * not interesting to applications using netlink.
1537 inetdev_changename(dev, in_dev);
1539 devinet_sysctl_unregister(in_dev);
1540 devinet_sysctl_register(in_dev);
1547 static struct notifier_block ip_netdev_notifier = {
1548 .notifier_call = inetdev_event,
1551 static size_t inet_nlmsg_size(void)
1553 return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
1554 + nla_total_size(4) /* IFA_ADDRESS */
1555 + nla_total_size(4) /* IFA_LOCAL */
1556 + nla_total_size(4) /* IFA_BROADCAST */
1557 + nla_total_size(IFNAMSIZ) /* IFA_LABEL */
1558 + nla_total_size(4) /* IFA_FLAGS */
1559 + nla_total_size(sizeof(struct ifa_cacheinfo)); /* IFA_CACHEINFO */
1562 static inline u32 cstamp_delta(unsigned long cstamp)
1564 return (cstamp - INITIAL_JIFFIES) * 100UL / HZ;
1567 static int put_cacheinfo(struct sk_buff *skb, unsigned long cstamp,
1568 unsigned long tstamp, u32 preferred, u32 valid)
1570 struct ifa_cacheinfo ci;
1572 ci.cstamp = cstamp_delta(cstamp);
1573 ci.tstamp = cstamp_delta(tstamp);
1574 ci.ifa_prefered = preferred;
1575 ci.ifa_valid = valid;
1577 return nla_put(skb, IFA_CACHEINFO, sizeof(ci), &ci);
1580 static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
1581 u32 portid, u32 seq, int event, unsigned int flags)
1583 struct ifaddrmsg *ifm;
1584 struct nlmsghdr *nlh;
1585 u32 preferred, valid;
1587 nlh = nlmsg_put(skb, portid, seq, event, sizeof(*ifm), flags);
1591 ifm = nlmsg_data(nlh);
1592 ifm->ifa_family = AF_INET;
1593 ifm->ifa_prefixlen = ifa->ifa_prefixlen;
1594 ifm->ifa_flags = ifa->ifa_flags;
1595 ifm->ifa_scope = ifa->ifa_scope;
1596 ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
1598 if (!(ifm->ifa_flags & IFA_F_PERMANENT)) {
1599 preferred = ifa->ifa_preferred_lft;
1600 valid = ifa->ifa_valid_lft;
1601 if (preferred != INFINITY_LIFE_TIME) {
1602 long tval = (jiffies - ifa->ifa_tstamp) / HZ;
1604 if (preferred > tval)
1608 if (valid != INFINITY_LIFE_TIME) {
1616 preferred = INFINITY_LIFE_TIME;
1617 valid = INFINITY_LIFE_TIME;
1619 if ((ifa->ifa_address &&
1620 nla_put_in_addr(skb, IFA_ADDRESS, ifa->ifa_address)) ||
1622 nla_put_in_addr(skb, IFA_LOCAL, ifa->ifa_local)) ||
1623 (ifa->ifa_broadcast &&
1624 nla_put_in_addr(skb, IFA_BROADCAST, ifa->ifa_broadcast)) ||
1625 (ifa->ifa_label[0] &&
1626 nla_put_string(skb, IFA_LABEL, ifa->ifa_label)) ||
1627 nla_put_u32(skb, IFA_FLAGS, ifa->ifa_flags) ||
1628 put_cacheinfo(skb, ifa->ifa_cstamp, ifa->ifa_tstamp,
1630 goto nla_put_failure;
1632 nlmsg_end(skb, nlh);
1636 nlmsg_cancel(skb, nlh);
1640 static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1642 struct net *net = sock_net(skb->sk);
1645 int ip_idx, s_ip_idx;
1646 struct net_device *dev;
1647 struct in_device *in_dev;
1648 struct in_ifaddr *ifa;
1649 struct hlist_head *head;
1652 s_idx = idx = cb->args[1];
1653 s_ip_idx = ip_idx = cb->args[2];
1655 for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
1657 head = &net->dev_index_head[h];
1659 cb->seq = atomic_read(&net->ipv4.dev_addr_genid) ^
1661 hlist_for_each_entry_rcu(dev, head, index_hlist) {
1664 if (h > s_h || idx > s_idx)
1666 in_dev = __in_dev_get_rcu(dev);
1670 for (ifa = in_dev->ifa_list, ip_idx = 0; ifa;
1671 ifa = ifa->ifa_next, ip_idx++) {
1672 if (ip_idx < s_ip_idx)
1674 if (inet_fill_ifaddr(skb, ifa,
1675 NETLINK_CB(cb->skb).portid,
1677 RTM_NEWADDR, NLM_F_MULTI) < 0) {
1681 nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1692 cb->args[2] = ip_idx;
1697 static void rtmsg_ifa(int event, struct in_ifaddr *ifa, struct nlmsghdr *nlh,
1700 struct sk_buff *skb;
1701 u32 seq = nlh ? nlh->nlmsg_seq : 0;
1705 net = dev_net(ifa->ifa_dev->dev);
1706 skb = nlmsg_new(inet_nlmsg_size(), GFP_KERNEL);
1710 err = inet_fill_ifaddr(skb, ifa, portid, seq, event, 0);
1712 /* -EMSGSIZE implies BUG in inet_nlmsg_size() */
1713 WARN_ON(err == -EMSGSIZE);
1717 rtnl_notify(skb, net, portid, RTNLGRP_IPV4_IFADDR, nlh, GFP_KERNEL);
1721 rtnl_set_sk_err(net, RTNLGRP_IPV4_IFADDR, err);
1724 static size_t inet_get_link_af_size(const struct net_device *dev,
1725 u32 ext_filter_mask)
1727 struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr);
1732 return nla_total_size(IPV4_DEVCONF_MAX * 4); /* IFLA_INET_CONF */
1735 static int inet_fill_link_af(struct sk_buff *skb, const struct net_device *dev,
1736 u32 ext_filter_mask)
1738 struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr);
1745 nla = nla_reserve(skb, IFLA_INET_CONF, IPV4_DEVCONF_MAX * 4);
1749 for (i = 0; i < IPV4_DEVCONF_MAX; i++)
1750 ((u32 *) nla_data(nla))[i] = in_dev->cnf.data[i];
1755 static const struct nla_policy inet_af_policy[IFLA_INET_MAX+1] = {
1756 [IFLA_INET_CONF] = { .type = NLA_NESTED },
1759 static int inet_validate_link_af(const struct net_device *dev,
1760 const struct nlattr *nla)
1762 struct nlattr *a, *tb[IFLA_INET_MAX+1];
1765 if (dev && !__in_dev_get_rcu(dev))
1766 return -EAFNOSUPPORT;
1768 err = nla_parse_nested(tb, IFLA_INET_MAX, nla, inet_af_policy, NULL);
1772 if (tb[IFLA_INET_CONF]) {
1773 nla_for_each_nested(a, tb[IFLA_INET_CONF], rem) {
1774 int cfgid = nla_type(a);
1779 if (cfgid <= 0 || cfgid > IPV4_DEVCONF_MAX)
1787 static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla)
1789 struct in_device *in_dev = __in_dev_get_rcu(dev);
1790 struct nlattr *a, *tb[IFLA_INET_MAX+1];
1794 return -EAFNOSUPPORT;
1796 if (nla_parse_nested(tb, IFLA_INET_MAX, nla, NULL, NULL) < 0)
1799 if (tb[IFLA_INET_CONF]) {
1800 nla_for_each_nested(a, tb[IFLA_INET_CONF], rem)
1801 ipv4_devconf_set(in_dev, nla_type(a), nla_get_u32(a));
1807 static int inet_netconf_msgsize_devconf(int type)
1809 int size = NLMSG_ALIGN(sizeof(struct netconfmsg))
1810 + nla_total_size(4); /* NETCONFA_IFINDEX */
1813 if (type == NETCONFA_ALL)
1816 if (all || type == NETCONFA_FORWARDING)
1817 size += nla_total_size(4);
1818 if (all || type == NETCONFA_RP_FILTER)
1819 size += nla_total_size(4);
1820 if (all || type == NETCONFA_MC_FORWARDING)
1821 size += nla_total_size(4);
1822 if (all || type == NETCONFA_PROXY_NEIGH)
1823 size += nla_total_size(4);
1824 if (all || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN)
1825 size += nla_total_size(4);
1830 static int inet_netconf_fill_devconf(struct sk_buff *skb, int ifindex,
1831 struct ipv4_devconf *devconf, u32 portid,
1832 u32 seq, int event, unsigned int flags,
1835 struct nlmsghdr *nlh;
1836 struct netconfmsg *ncm;
1839 nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct netconfmsg),
1844 if (type == NETCONFA_ALL)
1847 ncm = nlmsg_data(nlh);
1848 ncm->ncm_family = AF_INET;
1850 if (nla_put_s32(skb, NETCONFA_IFINDEX, ifindex) < 0)
1851 goto nla_put_failure;
1856 if ((all || type == NETCONFA_FORWARDING) &&
1857 nla_put_s32(skb, NETCONFA_FORWARDING,
1858 IPV4_DEVCONF(*devconf, FORWARDING)) < 0)
1859 goto nla_put_failure;
1860 if ((all || type == NETCONFA_RP_FILTER) &&
1861 nla_put_s32(skb, NETCONFA_RP_FILTER,
1862 IPV4_DEVCONF(*devconf, RP_FILTER)) < 0)
1863 goto nla_put_failure;
1864 if ((all || type == NETCONFA_MC_FORWARDING) &&
1865 nla_put_s32(skb, NETCONFA_MC_FORWARDING,
1866 IPV4_DEVCONF(*devconf, MC_FORWARDING)) < 0)
1867 goto nla_put_failure;
1868 if ((all || type == NETCONFA_PROXY_NEIGH) &&
1869 nla_put_s32(skb, NETCONFA_PROXY_NEIGH,
1870 IPV4_DEVCONF(*devconf, PROXY_ARP)) < 0)
1871 goto nla_put_failure;
1872 if ((all || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN) &&
1873 nla_put_s32(skb, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
1874 IPV4_DEVCONF(*devconf, IGNORE_ROUTES_WITH_LINKDOWN)) < 0)
1875 goto nla_put_failure;
1878 nlmsg_end(skb, nlh);
1882 nlmsg_cancel(skb, nlh);
1886 void inet_netconf_notify_devconf(struct net *net, int event, int type,
1887 int ifindex, struct ipv4_devconf *devconf)
1889 struct sk_buff *skb;
1892 skb = nlmsg_new(inet_netconf_msgsize_devconf(type), GFP_KERNEL);
1896 err = inet_netconf_fill_devconf(skb, ifindex, devconf, 0, 0,
1899 /* -EMSGSIZE implies BUG in inet_netconf_msgsize_devconf() */
1900 WARN_ON(err == -EMSGSIZE);
1904 rtnl_notify(skb, net, 0, RTNLGRP_IPV4_NETCONF, NULL, GFP_KERNEL);
1908 rtnl_set_sk_err(net, RTNLGRP_IPV4_NETCONF, err);
1911 static const struct nla_policy devconf_ipv4_policy[NETCONFA_MAX+1] = {
1912 [NETCONFA_IFINDEX] = { .len = sizeof(int) },
1913 [NETCONFA_FORWARDING] = { .len = sizeof(int) },
1914 [NETCONFA_RP_FILTER] = { .len = sizeof(int) },
1915 [NETCONFA_PROXY_NEIGH] = { .len = sizeof(int) },
1916 [NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN] = { .len = sizeof(int) },
1919 static int inet_netconf_get_devconf(struct sk_buff *in_skb,
1920 struct nlmsghdr *nlh,
1921 struct netlink_ext_ack *extack)
1923 struct net *net = sock_net(in_skb->sk);
1924 struct nlattr *tb[NETCONFA_MAX+1];
1925 struct netconfmsg *ncm;
1926 struct sk_buff *skb;
1927 struct ipv4_devconf *devconf;
1928 struct in_device *in_dev;
1929 struct net_device *dev;
1933 err = nlmsg_parse(nlh, sizeof(*ncm), tb, NETCONFA_MAX,
1934 devconf_ipv4_policy, extack);
1939 if (!tb[NETCONFA_IFINDEX])
1942 ifindex = nla_get_s32(tb[NETCONFA_IFINDEX]);
1944 case NETCONFA_IFINDEX_ALL:
1945 devconf = net->ipv4.devconf_all;
1947 case NETCONFA_IFINDEX_DEFAULT:
1948 devconf = net->ipv4.devconf_dflt;
1951 dev = __dev_get_by_index(net, ifindex);
1954 in_dev = __in_dev_get_rtnl(dev);
1957 devconf = &in_dev->cnf;
1962 skb = nlmsg_new(inet_netconf_msgsize_devconf(NETCONFA_ALL), GFP_KERNEL);
1966 err = inet_netconf_fill_devconf(skb, ifindex, devconf,
1967 NETLINK_CB(in_skb).portid,
1968 nlh->nlmsg_seq, RTM_NEWNETCONF, 0,
1971 /* -EMSGSIZE implies BUG in inet_netconf_msgsize_devconf() */
1972 WARN_ON(err == -EMSGSIZE);
1976 err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
1981 static int inet_netconf_dump_devconf(struct sk_buff *skb,
1982 struct netlink_callback *cb)
1984 struct net *net = sock_net(skb->sk);
1987 struct net_device *dev;
1988 struct in_device *in_dev;
1989 struct hlist_head *head;
1992 s_idx = idx = cb->args[1];
1994 for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
1996 head = &net->dev_index_head[h];
1998 cb->seq = atomic_read(&net->ipv4.dev_addr_genid) ^
2000 hlist_for_each_entry_rcu(dev, head, index_hlist) {
2003 in_dev = __in_dev_get_rcu(dev);
2007 if (inet_netconf_fill_devconf(skb, dev->ifindex,
2009 NETLINK_CB(cb->skb).portid,
2013 NETCONFA_ALL) < 0) {
2017 nl_dump_check_consistent(cb, nlmsg_hdr(skb));
2023 if (h == NETDEV_HASHENTRIES) {
2024 if (inet_netconf_fill_devconf(skb, NETCONFA_IFINDEX_ALL,
2025 net->ipv4.devconf_all,
2026 NETLINK_CB(cb->skb).portid,
2028 RTM_NEWNETCONF, NLM_F_MULTI,
2034 if (h == NETDEV_HASHENTRIES + 1) {
2035 if (inet_netconf_fill_devconf(skb, NETCONFA_IFINDEX_DEFAULT,
2036 net->ipv4.devconf_dflt,
2037 NETLINK_CB(cb->skb).portid,
2039 RTM_NEWNETCONF, NLM_F_MULTI,
2052 #ifdef CONFIG_SYSCTL
2054 static void devinet_copy_dflt_conf(struct net *net, int i)
2056 struct net_device *dev;
2059 for_each_netdev_rcu(net, dev) {
2060 struct in_device *in_dev;
2062 in_dev = __in_dev_get_rcu(dev);
2063 if (in_dev && !test_bit(i, in_dev->cnf.state))
2064 in_dev->cnf.data[i] = net->ipv4.devconf_dflt->data[i];
2069 /* called with RTNL locked */
2070 static void inet_forward_change(struct net *net)
2072 struct net_device *dev;
2073 int on = IPV4_DEVCONF_ALL(net, FORWARDING);
2075 IPV4_DEVCONF_ALL(net, ACCEPT_REDIRECTS) = !on;
2076 IPV4_DEVCONF_DFLT(net, FORWARDING) = on;
2077 inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2078 NETCONFA_FORWARDING,
2079 NETCONFA_IFINDEX_ALL,
2080 net->ipv4.devconf_all);
2081 inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2082 NETCONFA_FORWARDING,
2083 NETCONFA_IFINDEX_DEFAULT,
2084 net->ipv4.devconf_dflt);
2086 for_each_netdev(net, dev) {
2087 struct in_device *in_dev;
2090 dev_disable_lro(dev);
2092 in_dev = __in_dev_get_rtnl(dev);
2094 IN_DEV_CONF_SET(in_dev, FORWARDING, on);
2095 inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2096 NETCONFA_FORWARDING,
2097 dev->ifindex, &in_dev->cnf);
2102 static int devinet_conf_ifindex(struct net *net, struct ipv4_devconf *cnf)
2104 if (cnf == net->ipv4.devconf_dflt)
2105 return NETCONFA_IFINDEX_DEFAULT;
2106 else if (cnf == net->ipv4.devconf_all)
2107 return NETCONFA_IFINDEX_ALL;
2109 struct in_device *idev
2110 = container_of(cnf, struct in_device, cnf);
2111 return idev->dev->ifindex;
2115 static int devinet_conf_proc(struct ctl_table *ctl, int write,
2116 void __user *buffer,
2117 size_t *lenp, loff_t *ppos)
2119 int old_value = *(int *)ctl->data;
2120 int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
2121 int new_value = *(int *)ctl->data;
2124 struct ipv4_devconf *cnf = ctl->extra1;
2125 struct net *net = ctl->extra2;
2126 int i = (int *)ctl->data - cnf->data;
2129 set_bit(i, cnf->state);
2131 if (cnf == net->ipv4.devconf_dflt)
2132 devinet_copy_dflt_conf(net, i);
2133 if (i == IPV4_DEVCONF_ACCEPT_LOCAL - 1 ||
2134 i == IPV4_DEVCONF_ROUTE_LOCALNET - 1)
2135 if ((new_value == 0) && (old_value != 0))
2136 rt_cache_flush(net);
2138 if (i == IPV4_DEVCONF_RP_FILTER - 1 &&
2139 new_value != old_value) {
2140 ifindex = devinet_conf_ifindex(net, cnf);
2141 inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2145 if (i == IPV4_DEVCONF_PROXY_ARP - 1 &&
2146 new_value != old_value) {
2147 ifindex = devinet_conf_ifindex(net, cnf);
2148 inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2149 NETCONFA_PROXY_NEIGH,
2152 if (i == IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN - 1 &&
2153 new_value != old_value) {
2154 ifindex = devinet_conf_ifindex(net, cnf);
2155 inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2156 NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
2164 static int devinet_sysctl_forward(struct ctl_table *ctl, int write,
2165 void __user *buffer,
2166 size_t *lenp, loff_t *ppos)
2168 int *valp = ctl->data;
2171 int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
2173 if (write && *valp != val) {
2174 struct net *net = ctl->extra2;
2176 if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) {
2177 if (!rtnl_trylock()) {
2178 /* Restore the original values before restarting */
2181 return restart_syscall();
2183 if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) {
2184 inet_forward_change(net);
2186 struct ipv4_devconf *cnf = ctl->extra1;
2187 struct in_device *idev =
2188 container_of(cnf, struct in_device, cnf);
2190 dev_disable_lro(idev->dev);
2191 inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2192 NETCONFA_FORWARDING,
2197 rt_cache_flush(net);
2199 inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2200 NETCONFA_FORWARDING,
2201 NETCONFA_IFINDEX_DEFAULT,
2202 net->ipv4.devconf_dflt);
2208 static int ipv4_doint_and_flush(struct ctl_table *ctl, int write,
2209 void __user *buffer,
2210 size_t *lenp, loff_t *ppos)
2212 int *valp = ctl->data;
2214 int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
2215 struct net *net = ctl->extra2;
2217 if (write && *valp != val)
2218 rt_cache_flush(net);
2223 #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc) \
2226 .data = ipv4_devconf.data + \
2227 IPV4_DEVCONF_ ## attr - 1, \
2228 .maxlen = sizeof(int), \
2230 .proc_handler = proc, \
2231 .extra1 = &ipv4_devconf, \
2234 #define DEVINET_SYSCTL_RW_ENTRY(attr, name) \
2235 DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc)
2237 #define DEVINET_SYSCTL_RO_ENTRY(attr, name) \
2238 DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc)
2240 #define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc) \
2241 DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc)
2243 #define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \
2244 DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush)
2246 static struct devinet_sysctl_table {
2247 struct ctl_table_header *sysctl_header;
2248 struct ctl_table devinet_vars[__IPV4_DEVCONF_MAX];
2249 } devinet_sysctl = {
2251 DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding",
2252 devinet_sysctl_forward),
2253 DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING, "mc_forwarding"),
2255 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS, "accept_redirects"),
2256 DEVINET_SYSCTL_RW_ENTRY(SECURE_REDIRECTS, "secure_redirects"),
2257 DEVINET_SYSCTL_RW_ENTRY(SHARED_MEDIA, "shared_media"),
2258 DEVINET_SYSCTL_RW_ENTRY(RP_FILTER, "rp_filter"),
2259 DEVINET_SYSCTL_RW_ENTRY(SEND_REDIRECTS, "send_redirects"),
2260 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE,
2261 "accept_source_route"),
2262 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_LOCAL, "accept_local"),
2263 DEVINET_SYSCTL_RW_ENTRY(SRC_VMARK, "src_valid_mark"),
2264 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP, "proxy_arp"),
2265 DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID, "medium_id"),
2266 DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY, "bootp_relay"),
2267 DEVINET_SYSCTL_RW_ENTRY(LOG_MARTIANS, "log_martians"),
2268 DEVINET_SYSCTL_RW_ENTRY(TAG, "tag"),
2269 DEVINET_SYSCTL_RW_ENTRY(ARPFILTER, "arp_filter"),
2270 DEVINET_SYSCTL_RW_ENTRY(ARP_ANNOUNCE, "arp_announce"),
2271 DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE, "arp_ignore"),
2272 DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT, "arp_accept"),
2273 DEVINET_SYSCTL_RW_ENTRY(ARP_NOTIFY, "arp_notify"),
2274 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP_PVLAN, "proxy_arp_pvlan"),
2275 DEVINET_SYSCTL_RW_ENTRY(FORCE_IGMP_VERSION,
2276 "force_igmp_version"),
2277 DEVINET_SYSCTL_RW_ENTRY(IGMPV2_UNSOLICITED_REPORT_INTERVAL,
2278 "igmpv2_unsolicited_report_interval"),
2279 DEVINET_SYSCTL_RW_ENTRY(IGMPV3_UNSOLICITED_REPORT_INTERVAL,
2280 "igmpv3_unsolicited_report_interval"),
2281 DEVINET_SYSCTL_RW_ENTRY(IGNORE_ROUTES_WITH_LINKDOWN,
2282 "ignore_routes_with_linkdown"),
2283 DEVINET_SYSCTL_RW_ENTRY(DROP_GRATUITOUS_ARP,
2284 "drop_gratuitous_arp"),
2286 DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM, "disable_xfrm"),
2287 DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY, "disable_policy"),
2288 DEVINET_SYSCTL_FLUSHING_ENTRY(PROMOTE_SECONDARIES,
2289 "promote_secondaries"),
2290 DEVINET_SYSCTL_FLUSHING_ENTRY(ROUTE_LOCALNET,
2292 DEVINET_SYSCTL_FLUSHING_ENTRY(DROP_UNICAST_IN_L2_MULTICAST,
2293 "drop_unicast_in_l2_multicast"),
2297 static int __devinet_sysctl_register(struct net *net, char *dev_name,
2298 int ifindex, struct ipv4_devconf *p)
2301 struct devinet_sysctl_table *t;
2302 char path[sizeof("net/ipv4/conf/") + IFNAMSIZ];
2304 t = kmemdup(&devinet_sysctl, sizeof(*t), GFP_KERNEL);
2308 for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
2309 t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
2310 t->devinet_vars[i].extra1 = p;
2311 t->devinet_vars[i].extra2 = net;
2314 snprintf(path, sizeof(path), "net/ipv4/conf/%s", dev_name);
2316 t->sysctl_header = register_net_sysctl(net, path, t->devinet_vars);
2317 if (!t->sysctl_header)
2322 inet_netconf_notify_devconf(net, RTM_NEWNETCONF, NETCONFA_ALL,
2332 static void __devinet_sysctl_unregister(struct net *net,
2333 struct ipv4_devconf *cnf, int ifindex)
2335 struct devinet_sysctl_table *t = cnf->sysctl;
2339 unregister_net_sysctl_table(t->sysctl_header);
2343 inet_netconf_notify_devconf(net, RTM_DELNETCONF, 0, ifindex, NULL);
2346 static int devinet_sysctl_register(struct in_device *idev)
2350 if (!sysctl_dev_name_is_allowed(idev->dev->name))
2353 err = neigh_sysctl_register(idev->dev, idev->arp_parms, NULL);
2356 err = __devinet_sysctl_register(dev_net(idev->dev), idev->dev->name,
2357 idev->dev->ifindex, &idev->cnf);
2359 neigh_sysctl_unregister(idev->arp_parms);
2363 static void devinet_sysctl_unregister(struct in_device *idev)
2365 struct net *net = dev_net(idev->dev);
2367 __devinet_sysctl_unregister(net, &idev->cnf, idev->dev->ifindex);
2368 neigh_sysctl_unregister(idev->arp_parms);
2371 static struct ctl_table ctl_forward_entry[] = {
2373 .procname = "ip_forward",
2374 .data = &ipv4_devconf.data[
2375 IPV4_DEVCONF_FORWARDING - 1],
2376 .maxlen = sizeof(int),
2378 .proc_handler = devinet_sysctl_forward,
2379 .extra1 = &ipv4_devconf,
2380 .extra2 = &init_net,
2386 static __net_init int devinet_init_net(struct net *net)
2389 struct ipv4_devconf *all, *dflt;
2390 #ifdef CONFIG_SYSCTL
2391 struct ctl_table *tbl = ctl_forward_entry;
2392 struct ctl_table_header *forw_hdr;
2396 all = &ipv4_devconf;
2397 dflt = &ipv4_devconf_dflt;
2399 if (!net_eq(net, &init_net)) {
2400 all = kmemdup(all, sizeof(ipv4_devconf), GFP_KERNEL);
2404 dflt = kmemdup(dflt, sizeof(ipv4_devconf_dflt), GFP_KERNEL);
2406 goto err_alloc_dflt;
2408 #ifdef CONFIG_SYSCTL
2409 tbl = kmemdup(tbl, sizeof(ctl_forward_entry), GFP_KERNEL);
2413 tbl[0].data = &all->data[IPV4_DEVCONF_FORWARDING - 1];
2414 tbl[0].extra1 = all;
2415 tbl[0].extra2 = net;
2419 #ifdef CONFIG_SYSCTL
2420 err = __devinet_sysctl_register(net, "all", NETCONFA_IFINDEX_ALL, all);
2424 err = __devinet_sysctl_register(net, "default",
2425 NETCONFA_IFINDEX_DEFAULT, dflt);
2430 forw_hdr = register_net_sysctl(net, "net/ipv4", tbl);
2433 net->ipv4.forw_hdr = forw_hdr;
2436 net->ipv4.devconf_all = all;
2437 net->ipv4.devconf_dflt = dflt;
2440 #ifdef CONFIG_SYSCTL
2442 __devinet_sysctl_unregister(net, dflt, NETCONFA_IFINDEX_DEFAULT);
2444 __devinet_sysctl_unregister(net, all, NETCONFA_IFINDEX_ALL);
2446 if (tbl != ctl_forward_entry)
2450 if (dflt != &ipv4_devconf_dflt)
2453 if (all != &ipv4_devconf)
2459 static __net_exit void devinet_exit_net(struct net *net)
2461 #ifdef CONFIG_SYSCTL
2462 struct ctl_table *tbl;
2464 tbl = net->ipv4.forw_hdr->ctl_table_arg;
2465 unregister_net_sysctl_table(net->ipv4.forw_hdr);
2466 __devinet_sysctl_unregister(net, net->ipv4.devconf_dflt,
2467 NETCONFA_IFINDEX_DEFAULT);
2468 __devinet_sysctl_unregister(net, net->ipv4.devconf_all,
2469 NETCONFA_IFINDEX_ALL);
2472 kfree(net->ipv4.devconf_dflt);
2473 kfree(net->ipv4.devconf_all);
2476 static __net_initdata struct pernet_operations devinet_ops = {
2477 .init = devinet_init_net,
2478 .exit = devinet_exit_net,
2481 static struct rtnl_af_ops inet_af_ops __read_mostly = {
2483 .fill_link_af = inet_fill_link_af,
2484 .get_link_af_size = inet_get_link_af_size,
2485 .validate_link_af = inet_validate_link_af,
2486 .set_link_af = inet_set_link_af,
2489 void __init devinet_init(void)
2493 for (i = 0; i < IN4_ADDR_HSIZE; i++)
2494 INIT_HLIST_HEAD(&inet_addr_lst[i]);
2496 register_pernet_subsys(&devinet_ops);
2498 register_gifconf(PF_INET, inet_gifconf);
2499 register_netdevice_notifier(&ip_netdev_notifier);
2501 queue_delayed_work(system_power_efficient_wq, &check_lifetime_work, 0);
2503 rtnl_af_register(&inet_af_ops);
2505 rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL, 0);
2506 rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL, 0);
2507 rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr, 0);
2508 rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf,
2509 inet_netconf_dump_devconf, 0);