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 <asm/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/string.h>
37 #include <linux/socket.h>
38 #include <linux/sockios.h>
40 #include <linux/errno.h>
41 #include <linux/interrupt.h>
42 #include <linux/if_addr.h>
43 #include <linux/if_ether.h>
44 #include <linux/inet.h>
45 #include <linux/netdevice.h>
46 #include <linux/etherdevice.h>
47 #include <linux/skbuff.h>
48 #include <linux/init.h>
49 #include <linux/notifier.h>
50 #include <linux/inetdevice.h>
51 #include <linux/igmp.h>
52 #include <linux/slab.h>
53 #include <linux/hash.h>
55 #include <linux/sysctl.h>
57 #include <linux/kmod.h>
58 #include <linux/netconf.h>
62 #include <net/route.h>
63 #include <net/ip_fib.h>
64 #include <net/rtnetlink.h>
65 #include <net/net_namespace.h>
67 #include "fib_lookup.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,
78 static struct ipv4_devconf ipv4_devconf_dflt = {
80 [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1,
81 [IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1,
82 [IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1,
83 [IPV4_DEVCONF_SHARED_MEDIA - 1] = 1,
84 [IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE - 1] = 1,
88 #define IPV4_DEVCONF_DFLT(net, attr) \
89 IPV4_DEVCONF((*net->ipv4.devconf_dflt), attr)
91 static const struct nla_policy ifa_ipv4_policy[IFA_MAX+1] = {
92 [IFA_LOCAL] = { .type = NLA_U32 },
93 [IFA_ADDRESS] = { .type = NLA_U32 },
94 [IFA_BROADCAST] = { .type = NLA_U32 },
95 [IFA_LABEL] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 },
98 #define IN4_ADDR_HSIZE_SHIFT 8
99 #define IN4_ADDR_HSIZE (1U << IN4_ADDR_HSIZE_SHIFT)
101 static struct hlist_head inet_addr_lst[IN4_ADDR_HSIZE];
102 static DEFINE_SPINLOCK(inet_addr_hash_lock);
104 static u32 inet_addr_hash(struct net *net, __be32 addr)
106 u32 val = (__force u32) addr ^ net_hash_mix(net);
108 return hash_32(val, IN4_ADDR_HSIZE_SHIFT);
111 static void inet_hash_insert(struct net *net, struct in_ifaddr *ifa)
113 u32 hash = inet_addr_hash(net, ifa->ifa_local);
115 spin_lock(&inet_addr_hash_lock);
116 hlist_add_head_rcu(&ifa->hash, &inet_addr_lst[hash]);
117 spin_unlock(&inet_addr_hash_lock);
120 static void inet_hash_remove(struct in_ifaddr *ifa)
122 spin_lock(&inet_addr_hash_lock);
123 hlist_del_init_rcu(&ifa->hash);
124 spin_unlock(&inet_addr_hash_lock);
128 * __ip_dev_find - find the first device with a given source address.
129 * @net: the net namespace
130 * @addr: the source address
131 * @devref: if true, take a reference on the found device
133 * If a caller uses devref=false, it should be protected by RCU, or RTNL
135 struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref)
137 u32 hash = inet_addr_hash(net, addr);
138 struct net_device *result = NULL;
139 struct in_ifaddr *ifa;
140 struct hlist_node *node;
143 hlist_for_each_entry_rcu(ifa, node, &inet_addr_lst[hash], hash) {
144 if (ifa->ifa_local == addr) {
145 struct net_device *dev = ifa->ifa_dev->dev;
147 if (!net_eq(dev_net(dev), net))
154 struct flowi4 fl4 = { .daddr = addr };
155 struct fib_result res = { 0 };
156 struct fib_table *local;
158 /* Fallback to FIB local table so that communication
159 * over loopback subnets work.
161 local = fib_get_table(net, RT_TABLE_LOCAL);
163 !fib_table_lookup(local, &fl4, &res, FIB_LOOKUP_NOREF) &&
164 res.type == RTN_LOCAL)
165 result = FIB_RES_DEV(res);
167 if (result && devref)
172 EXPORT_SYMBOL(__ip_dev_find);
174 static void rtmsg_ifa(int event, struct in_ifaddr *, struct nlmsghdr *, u32);
176 static BLOCKING_NOTIFIER_HEAD(inetaddr_chain);
177 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
180 static void devinet_sysctl_register(struct in_device *idev);
181 static void devinet_sysctl_unregister(struct in_device *idev);
183 static void devinet_sysctl_register(struct in_device *idev)
186 static void devinet_sysctl_unregister(struct in_device *idev)
191 /* Locks all the inet devices. */
193 static struct in_ifaddr *inet_alloc_ifa(void)
195 return kzalloc(sizeof(struct in_ifaddr), GFP_KERNEL);
198 static void inet_rcu_free_ifa(struct rcu_head *head)
200 struct in_ifaddr *ifa = container_of(head, struct in_ifaddr, rcu_head);
202 in_dev_put(ifa->ifa_dev);
206 static void inet_free_ifa(struct in_ifaddr *ifa)
208 call_rcu(&ifa->rcu_head, inet_rcu_free_ifa);
211 void in_dev_finish_destroy(struct in_device *idev)
213 struct net_device *dev = idev->dev;
215 WARN_ON(idev->ifa_list);
216 WARN_ON(idev->mc_list);
217 #ifdef NET_REFCNT_DEBUG
218 pr_debug("%s: %p=%s\n", __func__, idev, dev ? dev->name : "NIL");
222 pr_err("Freeing alive in_device %p\n", idev);
226 EXPORT_SYMBOL(in_dev_finish_destroy);
228 static struct in_device *inetdev_init(struct net_device *dev)
230 struct in_device *in_dev;
234 in_dev = kzalloc(sizeof(*in_dev), GFP_KERNEL);
237 memcpy(&in_dev->cnf, dev_net(dev)->ipv4.devconf_dflt,
238 sizeof(in_dev->cnf));
239 in_dev->cnf.sysctl = NULL;
241 in_dev->arp_parms = neigh_parms_alloc(dev, &arp_tbl);
242 if (!in_dev->arp_parms)
244 if (IPV4_DEVCONF(in_dev->cnf, FORWARDING))
245 dev_disable_lro(dev);
246 /* Reference in_dev->dev */
248 /* Account for reference dev->ip_ptr (below) */
251 devinet_sysctl_register(in_dev);
252 ip_mc_init_dev(in_dev);
253 if (dev->flags & IFF_UP)
256 /* we can receive as soon as ip_ptr is set -- do this last */
257 rcu_assign_pointer(dev->ip_ptr, in_dev);
266 static void in_dev_rcu_put(struct rcu_head *head)
268 struct in_device *idev = container_of(head, struct in_device, rcu_head);
272 static void inetdev_destroy(struct in_device *in_dev)
274 struct in_ifaddr *ifa;
275 struct net_device *dev;
283 ip_mc_destroy_dev(in_dev);
285 while ((ifa = in_dev->ifa_list) != NULL) {
286 inet_del_ifa(in_dev, &in_dev->ifa_list, 0);
290 RCU_INIT_POINTER(dev->ip_ptr, NULL);
292 devinet_sysctl_unregister(in_dev);
293 neigh_parms_release(&arp_tbl, in_dev->arp_parms);
296 call_rcu(&in_dev->rcu_head, in_dev_rcu_put);
299 int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b)
302 for_primary_ifa(in_dev) {
303 if (inet_ifa_match(a, ifa)) {
304 if (!b || inet_ifa_match(b, ifa)) {
309 } endfor_ifa(in_dev);
314 static void __inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
315 int destroy, struct nlmsghdr *nlh, u32 portid)
317 struct in_ifaddr *promote = NULL;
318 struct in_ifaddr *ifa, *ifa1 = *ifap;
319 struct in_ifaddr *last_prim = in_dev->ifa_list;
320 struct in_ifaddr *prev_prom = NULL;
321 int do_promote = IN_DEV_PROMOTE_SECONDARIES(in_dev);
325 /* 1. Deleting primary ifaddr forces deletion all secondaries
326 * unless alias promotion is set
329 if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
330 struct in_ifaddr **ifap1 = &ifa1->ifa_next;
332 while ((ifa = *ifap1) != NULL) {
333 if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
334 ifa1->ifa_scope <= ifa->ifa_scope)
337 if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
338 ifa1->ifa_mask != ifa->ifa_mask ||
339 !inet_ifa_match(ifa1->ifa_address, ifa)) {
340 ifap1 = &ifa->ifa_next;
346 inet_hash_remove(ifa);
347 *ifap1 = ifa->ifa_next;
349 rtmsg_ifa(RTM_DELADDR, ifa, nlh, portid);
350 blocking_notifier_call_chain(&inetaddr_chain,
360 /* On promotion all secondaries from subnet are changing
361 * the primary IP, we must remove all their routes silently
362 * and later to add them back with new prefsrc. Do this
363 * while all addresses are on the device list.
365 for (ifa = promote; ifa; ifa = ifa->ifa_next) {
366 if (ifa1->ifa_mask == ifa->ifa_mask &&
367 inet_ifa_match(ifa1->ifa_address, ifa))
368 fib_del_ifaddr(ifa, ifa1);
373 *ifap = ifa1->ifa_next;
374 inet_hash_remove(ifa1);
376 /* 3. Announce address deletion */
378 /* Send message first, then call notifier.
379 At first sight, FIB update triggered by notifier
380 will refer to already deleted ifaddr, that could confuse
381 netlink listeners. It is not true: look, gated sees
382 that route deleted and if it still thinks that ifaddr
383 is valid, it will try to restore deleted routes... Grr.
384 So that, this order is correct.
386 rtmsg_ifa(RTM_DELADDR, ifa1, nlh, portid);
387 blocking_notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
390 struct in_ifaddr *next_sec = promote->ifa_next;
393 prev_prom->ifa_next = promote->ifa_next;
394 promote->ifa_next = last_prim->ifa_next;
395 last_prim->ifa_next = promote;
398 promote->ifa_flags &= ~IFA_F_SECONDARY;
399 rtmsg_ifa(RTM_NEWADDR, promote, nlh, portid);
400 blocking_notifier_call_chain(&inetaddr_chain,
402 for (ifa = next_sec; ifa; ifa = ifa->ifa_next) {
403 if (ifa1->ifa_mask != ifa->ifa_mask ||
404 !inet_ifa_match(ifa1->ifa_address, ifa))
414 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
417 __inet_del_ifa(in_dev, ifap, destroy, NULL, 0);
420 static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
423 struct in_device *in_dev = ifa->ifa_dev;
424 struct in_ifaddr *ifa1, **ifap, **last_primary;
428 if (!ifa->ifa_local) {
433 ifa->ifa_flags &= ~IFA_F_SECONDARY;
434 last_primary = &in_dev->ifa_list;
436 for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL;
437 ifap = &ifa1->ifa_next) {
438 if (!(ifa1->ifa_flags & IFA_F_SECONDARY) &&
439 ifa->ifa_scope <= ifa1->ifa_scope)
440 last_primary = &ifa1->ifa_next;
441 if (ifa1->ifa_mask == ifa->ifa_mask &&
442 inet_ifa_match(ifa1->ifa_address, ifa)) {
443 if (ifa1->ifa_local == ifa->ifa_local) {
447 if (ifa1->ifa_scope != ifa->ifa_scope) {
451 ifa->ifa_flags |= IFA_F_SECONDARY;
455 if (!(ifa->ifa_flags & IFA_F_SECONDARY)) {
456 net_srandom(ifa->ifa_local);
460 ifa->ifa_next = *ifap;
463 inet_hash_insert(dev_net(in_dev->dev), ifa);
465 /* Send message first, then call notifier.
466 Notifier will trigger FIB update, so that
467 listeners of netlink will know about new ifaddr */
468 rtmsg_ifa(RTM_NEWADDR, ifa, nlh, portid);
469 blocking_notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
474 static int inet_insert_ifa(struct in_ifaddr *ifa)
476 return __inet_insert_ifa(ifa, NULL, 0);
479 static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
481 struct in_device *in_dev = __in_dev_get_rtnl(dev);
489 ipv4_devconf_setall(in_dev);
490 if (ifa->ifa_dev != in_dev) {
491 WARN_ON(ifa->ifa_dev);
493 ifa->ifa_dev = in_dev;
495 if (ipv4_is_loopback(ifa->ifa_local))
496 ifa->ifa_scope = RT_SCOPE_HOST;
497 return inet_insert_ifa(ifa);
500 /* Caller must hold RCU or RTNL :
501 * We dont take a reference on found in_device
503 struct in_device *inetdev_by_index(struct net *net, int ifindex)
505 struct net_device *dev;
506 struct in_device *in_dev = NULL;
509 dev = dev_get_by_index_rcu(net, ifindex);
511 in_dev = rcu_dereference_rtnl(dev->ip_ptr);
515 EXPORT_SYMBOL(inetdev_by_index);
517 /* Called only from RTNL semaphored context. No locks. */
519 struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
524 for_primary_ifa(in_dev) {
525 if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
527 } endfor_ifa(in_dev);
531 static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
533 struct net *net = sock_net(skb->sk);
534 struct nlattr *tb[IFA_MAX+1];
535 struct in_device *in_dev;
536 struct ifaddrmsg *ifm;
537 struct in_ifaddr *ifa, **ifap;
542 if (!capable(CAP_NET_ADMIN))
545 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy);
549 ifm = nlmsg_data(nlh);
550 in_dev = inetdev_by_index(net, ifm->ifa_index);
551 if (in_dev == NULL) {
556 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
557 ifap = &ifa->ifa_next) {
559 ifa->ifa_local != nla_get_be32(tb[IFA_LOCAL]))
562 if (tb[IFA_LABEL] && nla_strcmp(tb[IFA_LABEL], ifa->ifa_label))
565 if (tb[IFA_ADDRESS] &&
566 (ifm->ifa_prefixlen != ifa->ifa_prefixlen ||
567 !inet_ifa_match(nla_get_be32(tb[IFA_ADDRESS]), ifa)))
570 __inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).portid);
574 err = -EADDRNOTAVAIL;
579 static struct in_ifaddr *rtm_to_ifaddr(struct net *net, struct nlmsghdr *nlh)
581 struct nlattr *tb[IFA_MAX+1];
582 struct in_ifaddr *ifa;
583 struct ifaddrmsg *ifm;
584 struct net_device *dev;
585 struct in_device *in_dev;
588 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy);
592 ifm = nlmsg_data(nlh);
594 if (ifm->ifa_prefixlen > 32 || tb[IFA_LOCAL] == NULL)
597 dev = __dev_get_by_index(net, ifm->ifa_index);
602 in_dev = __in_dev_get_rtnl(dev);
607 ifa = inet_alloc_ifa();
610 * A potential indev allocation can be left alive, it stays
611 * assigned to its device and is destroy with it.
615 ipv4_devconf_setall(in_dev);
618 if (tb[IFA_ADDRESS] == NULL)
619 tb[IFA_ADDRESS] = tb[IFA_LOCAL];
621 INIT_HLIST_NODE(&ifa->hash);
622 ifa->ifa_prefixlen = ifm->ifa_prefixlen;
623 ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
624 ifa->ifa_flags = ifm->ifa_flags;
625 ifa->ifa_scope = ifm->ifa_scope;
626 ifa->ifa_dev = in_dev;
628 ifa->ifa_local = nla_get_be32(tb[IFA_LOCAL]);
629 ifa->ifa_address = nla_get_be32(tb[IFA_ADDRESS]);
631 if (tb[IFA_BROADCAST])
632 ifa->ifa_broadcast = nla_get_be32(tb[IFA_BROADCAST]);
635 nla_strlcpy(ifa->ifa_label, tb[IFA_LABEL], IFNAMSIZ);
637 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
645 static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
647 struct net *net = sock_net(skb->sk);
648 struct in_ifaddr *ifa;
652 if (!capable(CAP_NET_ADMIN))
655 ifa = rtm_to_ifaddr(net, nlh);
659 return __inet_insert_ifa(ifa, nlh, NETLINK_CB(skb).portid);
663 * Determine a default network mask, based on the IP address.
666 static int inet_abc_len(__be32 addr)
668 int rc = -1; /* Something else, probably a multicast. */
670 if (ipv4_is_zeronet(addr))
673 __u32 haddr = ntohl(addr);
675 if (IN_CLASSA(haddr))
677 else if (IN_CLASSB(haddr))
679 else if (IN_CLASSC(haddr))
687 int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
690 struct sockaddr_in sin_orig;
691 struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
692 struct in_device *in_dev;
693 struct in_ifaddr **ifap = NULL;
694 struct in_ifaddr *ifa = NULL;
695 struct net_device *dev;
698 int tryaddrmatch = 0;
701 * Fetch the caller's info block into kernel space
704 if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
706 ifr.ifr_name[IFNAMSIZ - 1] = 0;
708 /* save original address for comparison */
709 memcpy(&sin_orig, sin, sizeof(*sin));
711 colon = strchr(ifr.ifr_name, ':');
715 dev_load(net, ifr.ifr_name);
718 case SIOCGIFADDR: /* Get interface address */
719 case SIOCGIFBRDADDR: /* Get the broadcast address */
720 case SIOCGIFDSTADDR: /* Get the destination address */
721 case SIOCGIFNETMASK: /* Get the netmask for the interface */
722 /* Note that these ioctls will not sleep,
723 so that we do not impose a lock.
724 One day we will be forced to put shlock here (I mean SMP)
726 tryaddrmatch = (sin_orig.sin_family == AF_INET);
727 memset(sin, 0, sizeof(*sin));
728 sin->sin_family = AF_INET;
733 if (!capable(CAP_NET_ADMIN))
736 case SIOCSIFADDR: /* Set interface address (and family) */
737 case SIOCSIFBRDADDR: /* Set the broadcast address */
738 case SIOCSIFDSTADDR: /* Set the destination address */
739 case SIOCSIFNETMASK: /* Set the netmask for the interface */
741 if (!capable(CAP_NET_ADMIN))
744 if (sin->sin_family != AF_INET)
755 dev = __dev_get_by_name(net, ifr.ifr_name);
762 in_dev = __in_dev_get_rtnl(dev);
765 /* Matthias Andree */
766 /* compare label and address (4.4BSD style) */
767 /* note: we only do this for a limited set of ioctls
768 and only if the original address family was AF_INET.
769 This is checked above. */
770 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
771 ifap = &ifa->ifa_next) {
772 if (!strcmp(ifr.ifr_name, ifa->ifa_label) &&
773 sin_orig.sin_addr.s_addr ==
779 /* we didn't get a match, maybe the application is
780 4.3BSD-style and passed in junk so we fall back to
781 comparing just the label */
783 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
784 ifap = &ifa->ifa_next)
785 if (!strcmp(ifr.ifr_name, ifa->ifa_label))
790 ret = -EADDRNOTAVAIL;
791 if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
795 case SIOCGIFADDR: /* Get interface address */
796 sin->sin_addr.s_addr = ifa->ifa_local;
799 case SIOCGIFBRDADDR: /* Get the broadcast address */
800 sin->sin_addr.s_addr = ifa->ifa_broadcast;
803 case SIOCGIFDSTADDR: /* Get the destination address */
804 sin->sin_addr.s_addr = ifa->ifa_address;
807 case SIOCGIFNETMASK: /* Get the netmask for the interface */
808 sin->sin_addr.s_addr = ifa->ifa_mask;
813 ret = -EADDRNOTAVAIL;
817 if (!(ifr.ifr_flags & IFF_UP))
818 inet_del_ifa(in_dev, ifap, 1);
821 ret = dev_change_flags(dev, ifr.ifr_flags);
824 case SIOCSIFADDR: /* Set interface address (and family) */
826 if (inet_abc_len(sin->sin_addr.s_addr) < 0)
831 ifa = inet_alloc_ifa();
832 INIT_HLIST_NODE(&ifa->hash);
836 memcpy(ifa->ifa_label, ifr.ifr_name, IFNAMSIZ);
838 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
841 if (ifa->ifa_local == sin->sin_addr.s_addr)
843 inet_del_ifa(in_dev, ifap, 0);
844 ifa->ifa_broadcast = 0;
848 ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;
850 if (!(dev->flags & IFF_POINTOPOINT)) {
851 ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
852 ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
853 if ((dev->flags & IFF_BROADCAST) &&
854 ifa->ifa_prefixlen < 31)
855 ifa->ifa_broadcast = ifa->ifa_address |
858 ifa->ifa_prefixlen = 32;
859 ifa->ifa_mask = inet_make_mask(32);
861 ret = inet_set_ifa(dev, ifa);
864 case SIOCSIFBRDADDR: /* Set the broadcast address */
866 if (ifa->ifa_broadcast != sin->sin_addr.s_addr) {
867 inet_del_ifa(in_dev, ifap, 0);
868 ifa->ifa_broadcast = sin->sin_addr.s_addr;
869 inet_insert_ifa(ifa);
873 case SIOCSIFDSTADDR: /* Set the destination address */
875 if (ifa->ifa_address == sin->sin_addr.s_addr)
878 if (inet_abc_len(sin->sin_addr.s_addr) < 0)
881 inet_del_ifa(in_dev, ifap, 0);
882 ifa->ifa_address = sin->sin_addr.s_addr;
883 inet_insert_ifa(ifa);
886 case SIOCSIFNETMASK: /* Set the netmask for the interface */
889 * The mask we set must be legal.
892 if (bad_mask(sin->sin_addr.s_addr, 0))
895 if (ifa->ifa_mask != sin->sin_addr.s_addr) {
896 __be32 old_mask = ifa->ifa_mask;
897 inet_del_ifa(in_dev, ifap, 0);
898 ifa->ifa_mask = sin->sin_addr.s_addr;
899 ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
901 /* See if current broadcast address matches
902 * with current netmask, then recalculate
903 * the broadcast address. Otherwise it's a
904 * funny address, so don't touch it since
905 * the user seems to know what (s)he's doing...
907 if ((dev->flags & IFF_BROADCAST) &&
908 (ifa->ifa_prefixlen < 31) &&
909 (ifa->ifa_broadcast ==
910 (ifa->ifa_local|~old_mask))) {
911 ifa->ifa_broadcast = (ifa->ifa_local |
912 ~sin->sin_addr.s_addr);
914 inet_insert_ifa(ifa);
924 ret = copy_to_user(arg, &ifr, sizeof(struct ifreq)) ? -EFAULT : 0;
928 static int inet_gifconf(struct net_device *dev, char __user *buf, int len)
930 struct in_device *in_dev = __in_dev_get_rtnl(dev);
931 struct in_ifaddr *ifa;
938 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
943 if (len < (int) sizeof(ifr))
945 memset(&ifr, 0, sizeof(struct ifreq));
947 strcpy(ifr.ifr_name, ifa->ifa_label);
949 strcpy(ifr.ifr_name, dev->name);
951 (*(struct sockaddr_in *)&ifr.ifr_addr).sin_family = AF_INET;
952 (*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr =
955 if (copy_to_user(buf, &ifr, sizeof(struct ifreq))) {
959 buf += sizeof(struct ifreq);
960 len -= sizeof(struct ifreq);
961 done += sizeof(struct ifreq);
967 __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope)
970 struct in_device *in_dev;
971 struct net *net = dev_net(dev);
974 in_dev = __in_dev_get_rcu(dev);
978 for_primary_ifa(in_dev) {
979 if (ifa->ifa_scope > scope)
981 if (!dst || inet_ifa_match(dst, ifa)) {
982 addr = ifa->ifa_local;
986 addr = ifa->ifa_local;
987 } endfor_ifa(in_dev);
993 /* Not loopback addresses on loopback should be preferred
994 in this case. It is importnat that lo is the first interface
997 for_each_netdev_rcu(net, dev) {
998 in_dev = __in_dev_get_rcu(dev);
1002 for_primary_ifa(in_dev) {
1003 if (ifa->ifa_scope != RT_SCOPE_LINK &&
1004 ifa->ifa_scope <= scope) {
1005 addr = ifa->ifa_local;
1008 } endfor_ifa(in_dev);
1014 EXPORT_SYMBOL(inet_select_addr);
1016 static __be32 confirm_addr_indev(struct in_device *in_dev, __be32 dst,
1017 __be32 local, int scope)
1024 (local == ifa->ifa_local || !local) &&
1025 ifa->ifa_scope <= scope) {
1026 addr = ifa->ifa_local;
1031 same = (!local || inet_ifa_match(local, ifa)) &&
1032 (!dst || inet_ifa_match(dst, ifa));
1036 /* Is the selected addr into dst subnet? */
1037 if (inet_ifa_match(addr, ifa))
1039 /* No, then can we use new local src? */
1040 if (ifa->ifa_scope <= scope) {
1041 addr = ifa->ifa_local;
1044 /* search for large dst subnet for addr */
1048 } endfor_ifa(in_dev);
1050 return same ? addr : 0;
1054 * Confirm that local IP address exists using wildcards:
1055 * - in_dev: only on this interface, 0=any interface
1056 * - dst: only in the same subnet as dst, 0=any dst
1057 * - local: address, 0=autoselect the local address
1058 * - scope: maximum allowed scope value for the local address
1060 __be32 inet_confirm_addr(struct in_device *in_dev,
1061 __be32 dst, __be32 local, int scope)
1064 struct net_device *dev;
1067 if (scope != RT_SCOPE_LINK)
1068 return confirm_addr_indev(in_dev, dst, local, scope);
1070 net = dev_net(in_dev->dev);
1072 for_each_netdev_rcu(net, dev) {
1073 in_dev = __in_dev_get_rcu(dev);
1075 addr = confirm_addr_indev(in_dev, dst, local, scope);
1084 EXPORT_SYMBOL(inet_confirm_addr);
1090 int register_inetaddr_notifier(struct notifier_block *nb)
1092 return blocking_notifier_chain_register(&inetaddr_chain, nb);
1094 EXPORT_SYMBOL(register_inetaddr_notifier);
1096 int unregister_inetaddr_notifier(struct notifier_block *nb)
1098 return blocking_notifier_chain_unregister(&inetaddr_chain, nb);
1100 EXPORT_SYMBOL(unregister_inetaddr_notifier);
1102 /* Rename ifa_labels for a device name change. Make some effort to preserve
1103 * existing alias numbering and to create unique labels if possible.
1105 static void inetdev_changename(struct net_device *dev, struct in_device *in_dev)
1107 struct in_ifaddr *ifa;
1110 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
1111 char old[IFNAMSIZ], *dot;
1113 memcpy(old, ifa->ifa_label, IFNAMSIZ);
1114 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1117 dot = strchr(old, ':');
1119 sprintf(old, ":%d", named);
1122 if (strlen(dot) + strlen(dev->name) < IFNAMSIZ)
1123 strcat(ifa->ifa_label, dot);
1125 strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
1127 rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
1131 static bool inetdev_valid_mtu(unsigned int mtu)
1136 static void inetdev_send_gratuitous_arp(struct net_device *dev,
1137 struct in_device *in_dev)
1140 struct in_ifaddr *ifa;
1142 for (ifa = in_dev->ifa_list; ifa;
1143 ifa = ifa->ifa_next) {
1144 arp_send(ARPOP_REQUEST, ETH_P_ARP,
1145 ifa->ifa_local, dev,
1146 ifa->ifa_local, NULL,
1147 dev->dev_addr, NULL);
1151 /* Called only under RTNL semaphore */
1153 static int inetdev_event(struct notifier_block *this, unsigned long event,
1156 struct net_device *dev = ptr;
1157 struct in_device *in_dev = __in_dev_get_rtnl(dev);
1162 if (event == NETDEV_REGISTER) {
1163 in_dev = inetdev_init(dev);
1165 return notifier_from_errno(-ENOMEM);
1166 if (dev->flags & IFF_LOOPBACK) {
1167 IN_DEV_CONF_SET(in_dev, NOXFRM, 1);
1168 IN_DEV_CONF_SET(in_dev, NOPOLICY, 1);
1170 } else if (event == NETDEV_CHANGEMTU) {
1171 /* Re-enabling IP */
1172 if (inetdev_valid_mtu(dev->mtu))
1173 in_dev = inetdev_init(dev);
1179 case NETDEV_REGISTER:
1180 pr_debug("%s: bug\n", __func__);
1181 RCU_INIT_POINTER(dev->ip_ptr, NULL);
1184 if (!inetdev_valid_mtu(dev->mtu))
1186 if (dev->flags & IFF_LOOPBACK) {
1187 struct in_ifaddr *ifa = inet_alloc_ifa();
1190 INIT_HLIST_NODE(&ifa->hash);
1192 ifa->ifa_address = htonl(INADDR_LOOPBACK);
1193 ifa->ifa_prefixlen = 8;
1194 ifa->ifa_mask = inet_make_mask(8);
1195 in_dev_hold(in_dev);
1196 ifa->ifa_dev = in_dev;
1197 ifa->ifa_scope = RT_SCOPE_HOST;
1198 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1199 inet_insert_ifa(ifa);
1204 case NETDEV_CHANGEADDR:
1205 if (!IN_DEV_ARP_NOTIFY(in_dev))
1208 case NETDEV_NOTIFY_PEERS:
1209 /* Send gratuitous ARP to notify of link change */
1210 inetdev_send_gratuitous_arp(dev, in_dev);
1215 case NETDEV_PRE_TYPE_CHANGE:
1216 ip_mc_unmap(in_dev);
1218 case NETDEV_POST_TYPE_CHANGE:
1219 ip_mc_remap(in_dev);
1221 case NETDEV_CHANGEMTU:
1222 if (inetdev_valid_mtu(dev->mtu))
1224 /* disable IP when MTU is not enough */
1225 case NETDEV_UNREGISTER:
1226 inetdev_destroy(in_dev);
1228 case NETDEV_CHANGENAME:
1229 /* Do not notify about label change, this event is
1230 * not interesting to applications using netlink.
1232 inetdev_changename(dev, in_dev);
1234 devinet_sysctl_unregister(in_dev);
1235 devinet_sysctl_register(in_dev);
1242 static struct notifier_block ip_netdev_notifier = {
1243 .notifier_call = inetdev_event,
1246 static size_t inet_nlmsg_size(void)
1248 return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
1249 + nla_total_size(4) /* IFA_ADDRESS */
1250 + nla_total_size(4) /* IFA_LOCAL */
1251 + nla_total_size(4) /* IFA_BROADCAST */
1252 + nla_total_size(IFNAMSIZ); /* IFA_LABEL */
1255 static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
1256 u32 portid, u32 seq, int event, unsigned int flags)
1258 struct ifaddrmsg *ifm;
1259 struct nlmsghdr *nlh;
1261 nlh = nlmsg_put(skb, portid, seq, event, sizeof(*ifm), flags);
1265 ifm = nlmsg_data(nlh);
1266 ifm->ifa_family = AF_INET;
1267 ifm->ifa_prefixlen = ifa->ifa_prefixlen;
1268 ifm->ifa_flags = ifa->ifa_flags|IFA_F_PERMANENT;
1269 ifm->ifa_scope = ifa->ifa_scope;
1270 ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
1272 if ((ifa->ifa_address &&
1273 nla_put_be32(skb, IFA_ADDRESS, ifa->ifa_address)) ||
1275 nla_put_be32(skb, IFA_LOCAL, ifa->ifa_local)) ||
1276 (ifa->ifa_broadcast &&
1277 nla_put_be32(skb, IFA_BROADCAST, ifa->ifa_broadcast)) ||
1278 (ifa->ifa_label[0] &&
1279 nla_put_string(skb, IFA_LABEL, ifa->ifa_label)))
1280 goto nla_put_failure;
1282 return nlmsg_end(skb, nlh);
1285 nlmsg_cancel(skb, nlh);
1289 static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1291 struct net *net = sock_net(skb->sk);
1294 int ip_idx, s_ip_idx;
1295 struct net_device *dev;
1296 struct in_device *in_dev;
1297 struct in_ifaddr *ifa;
1298 struct hlist_head *head;
1299 struct hlist_node *node;
1302 s_idx = idx = cb->args[1];
1303 s_ip_idx = ip_idx = cb->args[2];
1305 for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
1307 head = &net->dev_index_head[h];
1309 hlist_for_each_entry_rcu(dev, node, head, index_hlist) {
1312 if (h > s_h || idx > s_idx)
1314 in_dev = __in_dev_get_rcu(dev);
1318 for (ifa = in_dev->ifa_list, ip_idx = 0; ifa;
1319 ifa = ifa->ifa_next, ip_idx++) {
1320 if (ip_idx < s_ip_idx)
1322 if (inet_fill_ifaddr(skb, ifa,
1323 NETLINK_CB(cb->skb).portid,
1325 RTM_NEWADDR, NLM_F_MULTI) <= 0) {
1339 cb->args[2] = ip_idx;
1344 static void rtmsg_ifa(int event, struct in_ifaddr *ifa, struct nlmsghdr *nlh,
1347 struct sk_buff *skb;
1348 u32 seq = nlh ? nlh->nlmsg_seq : 0;
1352 net = dev_net(ifa->ifa_dev->dev);
1353 skb = nlmsg_new(inet_nlmsg_size(), GFP_KERNEL);
1357 err = inet_fill_ifaddr(skb, ifa, portid, seq, event, 0);
1359 /* -EMSGSIZE implies BUG in inet_nlmsg_size() */
1360 WARN_ON(err == -EMSGSIZE);
1364 rtnl_notify(skb, net, portid, RTNLGRP_IPV4_IFADDR, nlh, GFP_KERNEL);
1368 rtnl_set_sk_err(net, RTNLGRP_IPV4_IFADDR, err);
1371 static size_t inet_get_link_af_size(const struct net_device *dev)
1373 struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr);
1378 return nla_total_size(IPV4_DEVCONF_MAX * 4); /* IFLA_INET_CONF */
1381 static int inet_fill_link_af(struct sk_buff *skb, const struct net_device *dev)
1383 struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr);
1390 nla = nla_reserve(skb, IFLA_INET_CONF, IPV4_DEVCONF_MAX * 4);
1394 for (i = 0; i < IPV4_DEVCONF_MAX; i++)
1395 ((u32 *) nla_data(nla))[i] = in_dev->cnf.data[i];
1400 static const struct nla_policy inet_af_policy[IFLA_INET_MAX+1] = {
1401 [IFLA_INET_CONF] = { .type = NLA_NESTED },
1404 static int inet_validate_link_af(const struct net_device *dev,
1405 const struct nlattr *nla)
1407 struct nlattr *a, *tb[IFLA_INET_MAX+1];
1410 if (dev && !__in_dev_get_rtnl(dev))
1411 return -EAFNOSUPPORT;
1413 err = nla_parse_nested(tb, IFLA_INET_MAX, nla, inet_af_policy);
1417 if (tb[IFLA_INET_CONF]) {
1418 nla_for_each_nested(a, tb[IFLA_INET_CONF], rem) {
1419 int cfgid = nla_type(a);
1424 if (cfgid <= 0 || cfgid > IPV4_DEVCONF_MAX)
1432 static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla)
1434 struct in_device *in_dev = __in_dev_get_rtnl(dev);
1435 struct nlattr *a, *tb[IFLA_INET_MAX+1];
1439 return -EAFNOSUPPORT;
1441 if (nla_parse_nested(tb, IFLA_INET_MAX, nla, NULL) < 0)
1444 if (tb[IFLA_INET_CONF]) {
1445 nla_for_each_nested(a, tb[IFLA_INET_CONF], rem)
1446 ipv4_devconf_set(in_dev, nla_type(a), nla_get_u32(a));
1452 static int inet_netconf_msgsize_devconf(int type)
1454 int size = NLMSG_ALIGN(sizeof(struct netconfmsg))
1455 + nla_total_size(4); /* NETCONFA_IFINDEX */
1457 /* type -1 is used for ALL */
1458 if (type == -1 || type == NETCONFA_FORWARDING)
1459 size += nla_total_size(4);
1460 if (type == -1 || type == NETCONFA_RP_FILTER)
1461 size += nla_total_size(4);
1466 static int inet_netconf_fill_devconf(struct sk_buff *skb, int ifindex,
1467 struct ipv4_devconf *devconf, u32 portid,
1468 u32 seq, int event, unsigned int flags,
1471 struct nlmsghdr *nlh;
1472 struct netconfmsg *ncm;
1474 nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct netconfmsg),
1479 ncm = nlmsg_data(nlh);
1480 ncm->ncm_family = AF_INET;
1482 if (nla_put_s32(skb, NETCONFA_IFINDEX, ifindex) < 0)
1483 goto nla_put_failure;
1485 /* type -1 is used for ALL */
1486 if ((type == -1 || type == NETCONFA_FORWARDING) &&
1487 nla_put_s32(skb, NETCONFA_FORWARDING,
1488 IPV4_DEVCONF(*devconf, FORWARDING)) < 0)
1489 goto nla_put_failure;
1490 if ((type == -1 || type == NETCONFA_RP_FILTER) &&
1491 nla_put_s32(skb, NETCONFA_RP_FILTER,
1492 IPV4_DEVCONF(*devconf, RP_FILTER)) < 0)
1493 goto nla_put_failure;
1495 return nlmsg_end(skb, nlh);
1498 nlmsg_cancel(skb, nlh);
1502 static void inet_netconf_notify_devconf(struct net *net, int type, int ifindex,
1503 struct ipv4_devconf *devconf)
1505 struct sk_buff *skb;
1508 skb = nlmsg_new(inet_netconf_msgsize_devconf(type), GFP_ATOMIC);
1512 err = inet_netconf_fill_devconf(skb, ifindex, devconf, 0, 0,
1513 RTM_NEWNETCONF, 0, type);
1515 /* -EMSGSIZE implies BUG in inet_netconf_msgsize_devconf() */
1516 WARN_ON(err == -EMSGSIZE);
1520 rtnl_notify(skb, net, 0, RTNLGRP_IPV4_NETCONF, NULL, GFP_ATOMIC);
1524 rtnl_set_sk_err(net, RTNLGRP_IPV4_NETCONF, err);
1527 static const struct nla_policy devconf_ipv4_policy[NETCONFA_MAX+1] = {
1528 [NETCONFA_IFINDEX] = { .len = sizeof(int) },
1529 [NETCONFA_FORWARDING] = { .len = sizeof(int) },
1530 [NETCONFA_RP_FILTER] = { .len = sizeof(int) },
1533 static int inet_netconf_get_devconf(struct sk_buff *in_skb,
1534 struct nlmsghdr *nlh,
1537 struct net *net = sock_net(in_skb->sk);
1538 struct nlattr *tb[NETCONFA_MAX+1];
1539 struct netconfmsg *ncm;
1540 struct sk_buff *skb;
1541 struct ipv4_devconf *devconf;
1542 struct in_device *in_dev;
1543 struct net_device *dev;
1547 err = nlmsg_parse(nlh, sizeof(*ncm), tb, NETCONFA_MAX,
1548 devconf_ipv4_policy);
1553 if (!tb[NETCONFA_IFINDEX])
1556 ifindex = nla_get_s32(tb[NETCONFA_IFINDEX]);
1558 case NETCONFA_IFINDEX_ALL:
1559 devconf = net->ipv4.devconf_all;
1561 case NETCONFA_IFINDEX_DEFAULT:
1562 devconf = net->ipv4.devconf_dflt;
1565 dev = __dev_get_by_index(net, ifindex);
1568 in_dev = __in_dev_get_rtnl(dev);
1571 devconf = &in_dev->cnf;
1576 skb = nlmsg_new(inet_netconf_msgsize_devconf(-1), GFP_ATOMIC);
1580 err = inet_netconf_fill_devconf(skb, ifindex, devconf,
1581 NETLINK_CB(in_skb).portid,
1582 nlh->nlmsg_seq, RTM_NEWNETCONF, 0,
1585 /* -EMSGSIZE implies BUG in inet_netconf_msgsize_devconf() */
1586 WARN_ON(err == -EMSGSIZE);
1590 err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
1595 #ifdef CONFIG_SYSCTL
1597 static void devinet_copy_dflt_conf(struct net *net, int i)
1599 struct net_device *dev;
1602 for_each_netdev_rcu(net, dev) {
1603 struct in_device *in_dev;
1605 in_dev = __in_dev_get_rcu(dev);
1606 if (in_dev && !test_bit(i, in_dev->cnf.state))
1607 in_dev->cnf.data[i] = net->ipv4.devconf_dflt->data[i];
1612 /* called with RTNL locked */
1613 static void inet_forward_change(struct net *net)
1615 struct net_device *dev;
1616 int on = IPV4_DEVCONF_ALL(net, FORWARDING);
1618 IPV4_DEVCONF_ALL(net, ACCEPT_REDIRECTS) = !on;
1619 IPV4_DEVCONF_DFLT(net, FORWARDING) = on;
1620 inet_netconf_notify_devconf(net, NETCONFA_FORWARDING,
1621 NETCONFA_IFINDEX_ALL,
1622 net->ipv4.devconf_all);
1623 inet_netconf_notify_devconf(net, NETCONFA_FORWARDING,
1624 NETCONFA_IFINDEX_DEFAULT,
1625 net->ipv4.devconf_dflt);
1627 for_each_netdev(net, dev) {
1628 struct in_device *in_dev;
1630 dev_disable_lro(dev);
1632 in_dev = __in_dev_get_rcu(dev);
1634 IN_DEV_CONF_SET(in_dev, FORWARDING, on);
1635 inet_netconf_notify_devconf(net, NETCONFA_FORWARDING,
1636 dev->ifindex, &in_dev->cnf);
1642 static int devinet_conf_proc(ctl_table *ctl, int write,
1643 void __user *buffer,
1644 size_t *lenp, loff_t *ppos)
1646 int old_value = *(int *)ctl->data;
1647 int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
1648 int new_value = *(int *)ctl->data;
1651 struct ipv4_devconf *cnf = ctl->extra1;
1652 struct net *net = ctl->extra2;
1653 int i = (int *)ctl->data - cnf->data;
1655 set_bit(i, cnf->state);
1657 if (cnf == net->ipv4.devconf_dflt)
1658 devinet_copy_dflt_conf(net, i);
1659 if (i == IPV4_DEVCONF_ACCEPT_LOCAL - 1 ||
1660 i == IPV4_DEVCONF_ROUTE_LOCALNET - 1)
1661 if ((new_value == 0) && (old_value != 0))
1662 rt_cache_flush(net);
1663 if (i == IPV4_DEVCONF_RP_FILTER - 1 &&
1664 new_value != old_value) {
1667 if (cnf == net->ipv4.devconf_dflt)
1668 ifindex = NETCONFA_IFINDEX_DEFAULT;
1669 else if (cnf == net->ipv4.devconf_all)
1670 ifindex = NETCONFA_IFINDEX_ALL;
1672 struct in_device *idev =
1673 container_of(cnf, struct in_device,
1675 ifindex = idev->dev->ifindex;
1677 inet_netconf_notify_devconf(net, NETCONFA_RP_FILTER,
1685 static int devinet_sysctl_forward(ctl_table *ctl, int write,
1686 void __user *buffer,
1687 size_t *lenp, loff_t *ppos)
1689 int *valp = ctl->data;
1692 int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
1694 if (write && *valp != val) {
1695 struct net *net = ctl->extra2;
1697 if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) {
1698 if (!rtnl_trylock()) {
1699 /* Restore the original values before restarting */
1702 return restart_syscall();
1704 if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) {
1705 inet_forward_change(net);
1707 struct ipv4_devconf *cnf = ctl->extra1;
1708 struct in_device *idev =
1709 container_of(cnf, struct in_device, cnf);
1711 dev_disable_lro(idev->dev);
1712 inet_netconf_notify_devconf(net,
1713 NETCONFA_FORWARDING,
1718 rt_cache_flush(net);
1720 inet_netconf_notify_devconf(net, NETCONFA_FORWARDING,
1721 NETCONFA_IFINDEX_DEFAULT,
1722 net->ipv4.devconf_dflt);
1728 static int ipv4_doint_and_flush(ctl_table *ctl, int write,
1729 void __user *buffer,
1730 size_t *lenp, loff_t *ppos)
1732 int *valp = ctl->data;
1734 int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
1735 struct net *net = ctl->extra2;
1737 if (write && *valp != val)
1738 rt_cache_flush(net);
1743 #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc) \
1746 .data = ipv4_devconf.data + \
1747 IPV4_DEVCONF_ ## attr - 1, \
1748 .maxlen = sizeof(int), \
1750 .proc_handler = proc, \
1751 .extra1 = &ipv4_devconf, \
1754 #define DEVINET_SYSCTL_RW_ENTRY(attr, name) \
1755 DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc)
1757 #define DEVINET_SYSCTL_RO_ENTRY(attr, name) \
1758 DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc)
1760 #define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc) \
1761 DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc)
1763 #define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \
1764 DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush)
1766 static struct devinet_sysctl_table {
1767 struct ctl_table_header *sysctl_header;
1768 struct ctl_table devinet_vars[__IPV4_DEVCONF_MAX];
1769 } devinet_sysctl = {
1771 DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding",
1772 devinet_sysctl_forward),
1773 DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING, "mc_forwarding"),
1775 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS, "accept_redirects"),
1776 DEVINET_SYSCTL_RW_ENTRY(SECURE_REDIRECTS, "secure_redirects"),
1777 DEVINET_SYSCTL_RW_ENTRY(SHARED_MEDIA, "shared_media"),
1778 DEVINET_SYSCTL_RW_ENTRY(RP_FILTER, "rp_filter"),
1779 DEVINET_SYSCTL_RW_ENTRY(SEND_REDIRECTS, "send_redirects"),
1780 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE,
1781 "accept_source_route"),
1782 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_LOCAL, "accept_local"),
1783 DEVINET_SYSCTL_RW_ENTRY(SRC_VMARK, "src_valid_mark"),
1784 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP, "proxy_arp"),
1785 DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID, "medium_id"),
1786 DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY, "bootp_relay"),
1787 DEVINET_SYSCTL_RW_ENTRY(LOG_MARTIANS, "log_martians"),
1788 DEVINET_SYSCTL_RW_ENTRY(TAG, "tag"),
1789 DEVINET_SYSCTL_RW_ENTRY(ARPFILTER, "arp_filter"),
1790 DEVINET_SYSCTL_RW_ENTRY(ARP_ANNOUNCE, "arp_announce"),
1791 DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE, "arp_ignore"),
1792 DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT, "arp_accept"),
1793 DEVINET_SYSCTL_RW_ENTRY(ARP_NOTIFY, "arp_notify"),
1794 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP_PVLAN, "proxy_arp_pvlan"),
1796 DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM, "disable_xfrm"),
1797 DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY, "disable_policy"),
1798 DEVINET_SYSCTL_FLUSHING_ENTRY(FORCE_IGMP_VERSION,
1799 "force_igmp_version"),
1800 DEVINET_SYSCTL_FLUSHING_ENTRY(PROMOTE_SECONDARIES,
1801 "promote_secondaries"),
1802 DEVINET_SYSCTL_FLUSHING_ENTRY(ROUTE_LOCALNET,
1807 static int __devinet_sysctl_register(struct net *net, char *dev_name,
1808 struct ipv4_devconf *p)
1811 struct devinet_sysctl_table *t;
1812 char path[sizeof("net/ipv4/conf/") + IFNAMSIZ];
1814 t = kmemdup(&devinet_sysctl, sizeof(*t), GFP_KERNEL);
1818 for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
1819 t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
1820 t->devinet_vars[i].extra1 = p;
1821 t->devinet_vars[i].extra2 = net;
1824 /* Don't export sysctls to unprivileged users */
1825 if (net->user_ns != &init_user_ns)
1826 t->devinet_vars[0].procname = NULL;
1828 snprintf(path, sizeof(path), "net/ipv4/conf/%s", dev_name);
1830 t->sysctl_header = register_net_sysctl(net, path, t->devinet_vars);
1831 if (!t->sysctl_header)
1843 static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf)
1845 struct devinet_sysctl_table *t = cnf->sysctl;
1851 unregister_net_sysctl_table(t->sysctl_header);
1855 static void devinet_sysctl_register(struct in_device *idev)
1857 neigh_sysctl_register(idev->dev, idev->arp_parms, "ipv4", NULL);
1858 __devinet_sysctl_register(dev_net(idev->dev), idev->dev->name,
1862 static void devinet_sysctl_unregister(struct in_device *idev)
1864 __devinet_sysctl_unregister(&idev->cnf);
1865 neigh_sysctl_unregister(idev->arp_parms);
1868 static struct ctl_table ctl_forward_entry[] = {
1870 .procname = "ip_forward",
1871 .data = &ipv4_devconf.data[
1872 IPV4_DEVCONF_FORWARDING - 1],
1873 .maxlen = sizeof(int),
1875 .proc_handler = devinet_sysctl_forward,
1876 .extra1 = &ipv4_devconf,
1877 .extra2 = &init_net,
1883 static __net_init int devinet_init_net(struct net *net)
1886 struct ipv4_devconf *all, *dflt;
1887 #ifdef CONFIG_SYSCTL
1888 struct ctl_table *tbl = ctl_forward_entry;
1889 struct ctl_table_header *forw_hdr;
1893 all = &ipv4_devconf;
1894 dflt = &ipv4_devconf_dflt;
1896 if (!net_eq(net, &init_net)) {
1897 all = kmemdup(all, sizeof(ipv4_devconf), GFP_KERNEL);
1901 dflt = kmemdup(dflt, sizeof(ipv4_devconf_dflt), GFP_KERNEL);
1903 goto err_alloc_dflt;
1905 #ifdef CONFIG_SYSCTL
1906 tbl = kmemdup(tbl, sizeof(ctl_forward_entry), GFP_KERNEL);
1910 tbl[0].data = &all->data[IPV4_DEVCONF_FORWARDING - 1];
1911 tbl[0].extra1 = all;
1912 tbl[0].extra2 = net;
1914 /* Don't export sysctls to unprivileged users */
1915 if (net->user_ns != &init_user_ns)
1916 tbl[0].procname = NULL;
1920 #ifdef CONFIG_SYSCTL
1921 err = __devinet_sysctl_register(net, "all", all);
1925 err = __devinet_sysctl_register(net, "default", dflt);
1930 forw_hdr = register_net_sysctl(net, "net/ipv4", tbl);
1931 if (forw_hdr == NULL)
1933 net->ipv4.forw_hdr = forw_hdr;
1936 net->ipv4.devconf_all = all;
1937 net->ipv4.devconf_dflt = dflt;
1940 #ifdef CONFIG_SYSCTL
1942 __devinet_sysctl_unregister(dflt);
1944 __devinet_sysctl_unregister(all);
1946 if (tbl != ctl_forward_entry)
1950 if (dflt != &ipv4_devconf_dflt)
1953 if (all != &ipv4_devconf)
1959 static __net_exit void devinet_exit_net(struct net *net)
1961 #ifdef CONFIG_SYSCTL
1962 struct ctl_table *tbl;
1964 tbl = net->ipv4.forw_hdr->ctl_table_arg;
1965 unregister_net_sysctl_table(net->ipv4.forw_hdr);
1966 __devinet_sysctl_unregister(net->ipv4.devconf_dflt);
1967 __devinet_sysctl_unregister(net->ipv4.devconf_all);
1970 kfree(net->ipv4.devconf_dflt);
1971 kfree(net->ipv4.devconf_all);
1974 static __net_initdata struct pernet_operations devinet_ops = {
1975 .init = devinet_init_net,
1976 .exit = devinet_exit_net,
1979 static struct rtnl_af_ops inet_af_ops = {
1981 .fill_link_af = inet_fill_link_af,
1982 .get_link_af_size = inet_get_link_af_size,
1983 .validate_link_af = inet_validate_link_af,
1984 .set_link_af = inet_set_link_af,
1987 void __init devinet_init(void)
1991 for (i = 0; i < IN4_ADDR_HSIZE; i++)
1992 INIT_HLIST_HEAD(&inet_addr_lst[i]);
1994 register_pernet_subsys(&devinet_ops);
1996 register_gifconf(PF_INET, inet_gifconf);
1997 register_netdevice_notifier(&ip_netdev_notifier);
1999 rtnl_af_register(&inet_af_ops);
2001 rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL, NULL);
2002 rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL, NULL);
2003 rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr, NULL);
2004 rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf,