2 * NET3 IP device support routines.
4 * Version: $Id: devinet.c,v 1.44 2001/10/31 21:55:54 davem Exp $
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
11 * Derived from the IP parts of dev.c 1.0.19
13 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
14 * Mark Evans, <evansmp@uhura.aston.ac.uk>
17 * Alan Cox, <gw4pts@gw4pts.ampr.org>
18 * Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
21 * Alexey Kuznetsov: pa_* fields are replaced with ifaddr
23 * Cyrus Durgin: updated for kmod
24 * Matthias Andree: in devinet_ioctl, compare label and
25 * address (4.4BSD alias style support),
26 * fall back to comparing just the label
31 #include <asm/uaccess.h>
32 #include <asm/system.h>
33 #include <linux/bitops.h>
34 #include <linux/capability.h>
35 #include <linux/module.h>
36 #include <linux/types.h>
37 #include <linux/kernel.h>
38 #include <linux/string.h>
40 #include <linux/socket.h>
41 #include <linux/sockios.h>
43 #include <linux/errno.h>
44 #include <linux/interrupt.h>
45 #include <linux/if_addr.h>
46 #include <linux/if_ether.h>
47 #include <linux/inet.h>
48 #include <linux/netdevice.h>
49 #include <linux/etherdevice.h>
50 #include <linux/skbuff.h>
51 #include <linux/init.h>
52 #include <linux/notifier.h>
53 #include <linux/inetdevice.h>
54 #include <linux/igmp.h>
56 #include <linux/sysctl.h>
58 #include <linux/kmod.h>
62 #include <net/route.h>
63 #include <net/ip_fib.h>
64 #include <net/rtnetlink.h>
66 struct ipv4_devconf ipv4_devconf = {
68 [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1,
69 [NET_IPV4_CONF_SEND_REDIRECTS - 1] = 1,
70 [NET_IPV4_CONF_SECURE_REDIRECTS - 1] = 1,
71 [NET_IPV4_CONF_SHARED_MEDIA - 1] = 1,
75 static struct ipv4_devconf ipv4_devconf_dflt = {
77 [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1,
78 [NET_IPV4_CONF_SEND_REDIRECTS - 1] = 1,
79 [NET_IPV4_CONF_SECURE_REDIRECTS - 1] = 1,
80 [NET_IPV4_CONF_SHARED_MEDIA - 1] = 1,
81 [NET_IPV4_CONF_ACCEPT_SOURCE_ROUTE - 1] = 1,
85 #define IPV4_DEVCONF_DFLT(attr) IPV4_DEVCONF(ipv4_devconf_dflt, attr)
87 static struct nla_policy ifa_ipv4_policy[IFA_MAX+1] __read_mostly = {
88 [IFA_LOCAL] = { .type = NLA_U32 },
89 [IFA_ADDRESS] = { .type = NLA_U32 },
90 [IFA_BROADCAST] = { .type = NLA_U32 },
91 [IFA_ANYCAST] = { .type = NLA_U32 },
92 [IFA_LABEL] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 },
95 static void rtmsg_ifa(int event, struct in_ifaddr *, struct nlmsghdr *, u32);
97 static BLOCKING_NOTIFIER_HEAD(inetaddr_chain);
98 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
101 static void devinet_sysctl_register(struct in_device *in_dev,
102 struct ipv4_devconf *p);
103 static void devinet_sysctl_unregister(struct ipv4_devconf *p);
106 /* Locks all the inet devices. */
108 static struct in_ifaddr *inet_alloc_ifa(void)
110 struct in_ifaddr *ifa = kzalloc(sizeof(*ifa), GFP_KERNEL);
113 INIT_RCU_HEAD(&ifa->rcu_head);
119 static void inet_rcu_free_ifa(struct rcu_head *head)
121 struct in_ifaddr *ifa = container_of(head, struct in_ifaddr, rcu_head);
123 in_dev_put(ifa->ifa_dev);
127 static inline void inet_free_ifa(struct in_ifaddr *ifa)
129 call_rcu(&ifa->rcu_head, inet_rcu_free_ifa);
132 void in_dev_finish_destroy(struct in_device *idev)
134 struct net_device *dev = idev->dev;
136 BUG_TRAP(!idev->ifa_list);
137 BUG_TRAP(!idev->mc_list);
138 #ifdef NET_REFCNT_DEBUG
139 printk(KERN_DEBUG "in_dev_finish_destroy: %p=%s\n",
140 idev, dev ? dev->name : "NIL");
144 printk("Freeing alive in_device %p\n", idev);
150 struct in_device *inetdev_init(struct net_device *dev)
152 struct in_device *in_dev;
156 in_dev = kzalloc(sizeof(*in_dev), GFP_KERNEL);
159 INIT_RCU_HEAD(&in_dev->rcu_head);
160 memcpy(&in_dev->cnf, &ipv4_devconf_dflt, sizeof(in_dev->cnf));
161 in_dev->cnf.sysctl = NULL;
163 if ((in_dev->arp_parms = neigh_parms_alloc(dev, &arp_tbl)) == NULL)
165 /* Reference in_dev->dev */
168 neigh_sysctl_register(dev, in_dev->arp_parms, NET_IPV4,
169 NET_IPV4_NEIGH, "ipv4", NULL, NULL);
172 /* Account for reference dev->ip_ptr (below) */
176 devinet_sysctl_register(in_dev, &in_dev->cnf);
178 ip_mc_init_dev(in_dev);
179 if (dev->flags & IFF_UP)
182 /* we can receive as soon as ip_ptr is set -- do this last */
183 rcu_assign_pointer(dev->ip_ptr, in_dev);
192 static void in_dev_rcu_put(struct rcu_head *head)
194 struct in_device *idev = container_of(head, struct in_device, rcu_head);
198 static void inetdev_destroy(struct in_device *in_dev)
200 struct in_ifaddr *ifa;
201 struct net_device *dev;
206 if (dev == &loopback_dev)
211 ip_mc_destroy_dev(in_dev);
213 while ((ifa = in_dev->ifa_list) != NULL) {
214 inet_del_ifa(in_dev, &in_dev->ifa_list, 0);
219 devinet_sysctl_unregister(&in_dev->cnf);
225 neigh_sysctl_unregister(in_dev->arp_parms);
227 neigh_parms_release(&arp_tbl, in_dev->arp_parms);
230 call_rcu(&in_dev->rcu_head, in_dev_rcu_put);
233 int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b)
236 for_primary_ifa(in_dev) {
237 if (inet_ifa_match(a, ifa)) {
238 if (!b || inet_ifa_match(b, ifa)) {
243 } endfor_ifa(in_dev);
248 static void __inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
249 int destroy, struct nlmsghdr *nlh, u32 pid)
251 struct in_ifaddr *promote = NULL;
252 struct in_ifaddr *ifa, *ifa1 = *ifap;
253 struct in_ifaddr *last_prim = in_dev->ifa_list;
254 struct in_ifaddr *prev_prom = NULL;
255 int do_promote = IN_DEV_PROMOTE_SECONDARIES(in_dev);
259 /* 1. Deleting primary ifaddr forces deletion all secondaries
260 * unless alias promotion is set
263 if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
264 struct in_ifaddr **ifap1 = &ifa1->ifa_next;
266 while ((ifa = *ifap1) != NULL) {
267 if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
268 ifa1->ifa_scope <= ifa->ifa_scope)
271 if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
272 ifa1->ifa_mask != ifa->ifa_mask ||
273 !inet_ifa_match(ifa1->ifa_address, ifa)) {
274 ifap1 = &ifa->ifa_next;
280 *ifap1 = ifa->ifa_next;
282 rtmsg_ifa(RTM_DELADDR, ifa, nlh, pid);
283 blocking_notifier_call_chain(&inetaddr_chain,
295 *ifap = ifa1->ifa_next;
297 /* 3. Announce address deletion */
299 /* Send message first, then call notifier.
300 At first sight, FIB update triggered by notifier
301 will refer to already deleted ifaddr, that could confuse
302 netlink listeners. It is not true: look, gated sees
303 that route deleted and if it still thinks that ifaddr
304 is valid, it will try to restore deleted routes... Grr.
305 So that, this order is correct.
307 rtmsg_ifa(RTM_DELADDR, ifa1, nlh, pid);
308 blocking_notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
313 prev_prom->ifa_next = promote->ifa_next;
314 promote->ifa_next = last_prim->ifa_next;
315 last_prim->ifa_next = promote;
318 promote->ifa_flags &= ~IFA_F_SECONDARY;
319 rtmsg_ifa(RTM_NEWADDR, promote, nlh, pid);
320 blocking_notifier_call_chain(&inetaddr_chain,
322 for (ifa = promote->ifa_next; ifa; ifa = ifa->ifa_next) {
323 if (ifa1->ifa_mask != ifa->ifa_mask ||
324 !inet_ifa_match(ifa1->ifa_address, ifa))
333 if (!in_dev->ifa_list)
334 inetdev_destroy(in_dev);
338 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
341 __inet_del_ifa(in_dev, ifap, destroy, NULL, 0);
344 static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
347 struct in_device *in_dev = ifa->ifa_dev;
348 struct in_ifaddr *ifa1, **ifap, **last_primary;
352 if (!ifa->ifa_local) {
357 ifa->ifa_flags &= ~IFA_F_SECONDARY;
358 last_primary = &in_dev->ifa_list;
360 for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL;
361 ifap = &ifa1->ifa_next) {
362 if (!(ifa1->ifa_flags & IFA_F_SECONDARY) &&
363 ifa->ifa_scope <= ifa1->ifa_scope)
364 last_primary = &ifa1->ifa_next;
365 if (ifa1->ifa_mask == ifa->ifa_mask &&
366 inet_ifa_match(ifa1->ifa_address, ifa)) {
367 if (ifa1->ifa_local == ifa->ifa_local) {
371 if (ifa1->ifa_scope != ifa->ifa_scope) {
375 ifa->ifa_flags |= IFA_F_SECONDARY;
379 if (!(ifa->ifa_flags & IFA_F_SECONDARY)) {
380 net_srandom(ifa->ifa_local);
384 ifa->ifa_next = *ifap;
387 /* Send message first, then call notifier.
388 Notifier will trigger FIB update, so that
389 listeners of netlink will know about new ifaddr */
390 rtmsg_ifa(RTM_NEWADDR, ifa, nlh, pid);
391 blocking_notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
396 static int inet_insert_ifa(struct in_ifaddr *ifa)
398 return __inet_insert_ifa(ifa, NULL, 0);
401 static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
403 struct in_device *in_dev = __in_dev_get_rtnl(dev);
408 in_dev = inetdev_init(dev);
414 if (ifa->ifa_dev != in_dev) {
415 BUG_TRAP(!ifa->ifa_dev);
417 ifa->ifa_dev = in_dev;
419 if (LOOPBACK(ifa->ifa_local))
420 ifa->ifa_scope = RT_SCOPE_HOST;
421 return inet_insert_ifa(ifa);
424 struct in_device *inetdev_by_index(int ifindex)
426 struct net_device *dev;
427 struct in_device *in_dev = NULL;
428 read_lock(&dev_base_lock);
429 dev = __dev_get_by_index(ifindex);
431 in_dev = in_dev_get(dev);
432 read_unlock(&dev_base_lock);
436 /* Called only from RTNL semaphored context. No locks. */
438 struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
443 for_primary_ifa(in_dev) {
444 if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
446 } endfor_ifa(in_dev);
450 static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
452 struct nlattr *tb[IFA_MAX+1];
453 struct in_device *in_dev;
454 struct ifaddrmsg *ifm;
455 struct in_ifaddr *ifa, **ifap;
460 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy);
464 ifm = nlmsg_data(nlh);
465 in_dev = inetdev_by_index(ifm->ifa_index);
466 if (in_dev == NULL) {
471 __in_dev_put(in_dev);
473 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
474 ifap = &ifa->ifa_next) {
476 ifa->ifa_local != nla_get_be32(tb[IFA_LOCAL]))
479 if (tb[IFA_LABEL] && nla_strcmp(tb[IFA_LABEL], ifa->ifa_label))
482 if (tb[IFA_ADDRESS] &&
483 (ifm->ifa_prefixlen != ifa->ifa_prefixlen ||
484 !inet_ifa_match(nla_get_be32(tb[IFA_ADDRESS]), ifa)))
487 __inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).pid);
491 err = -EADDRNOTAVAIL;
496 static struct in_ifaddr *rtm_to_ifaddr(struct nlmsghdr *nlh)
498 struct nlattr *tb[IFA_MAX+1];
499 struct in_ifaddr *ifa;
500 struct ifaddrmsg *ifm;
501 struct net_device *dev;
502 struct in_device *in_dev;
505 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy);
509 ifm = nlmsg_data(nlh);
510 if (ifm->ifa_prefixlen > 32 || tb[IFA_LOCAL] == NULL) {
515 dev = __dev_get_by_index(ifm->ifa_index);
521 in_dev = __in_dev_get_rtnl(dev);
522 if (in_dev == NULL) {
523 in_dev = inetdev_init(dev);
524 if (in_dev == NULL) {
530 ifa = inet_alloc_ifa();
533 * A potential indev allocation can be left alive, it stays
534 * assigned to its device and is destroy with it.
542 if (tb[IFA_ADDRESS] == NULL)
543 tb[IFA_ADDRESS] = tb[IFA_LOCAL];
545 ifa->ifa_prefixlen = ifm->ifa_prefixlen;
546 ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
547 ifa->ifa_flags = ifm->ifa_flags;
548 ifa->ifa_scope = ifm->ifa_scope;
549 ifa->ifa_dev = in_dev;
551 ifa->ifa_local = nla_get_be32(tb[IFA_LOCAL]);
552 ifa->ifa_address = nla_get_be32(tb[IFA_ADDRESS]);
554 if (tb[IFA_BROADCAST])
555 ifa->ifa_broadcast = nla_get_be32(tb[IFA_BROADCAST]);
558 ifa->ifa_anycast = nla_get_be32(tb[IFA_ANYCAST]);
561 nla_strlcpy(ifa->ifa_label, tb[IFA_LABEL], IFNAMSIZ);
563 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
571 static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
573 struct in_ifaddr *ifa;
577 ifa = rtm_to_ifaddr(nlh);
581 return __inet_insert_ifa(ifa, nlh, NETLINK_CB(skb).pid);
585 * Determine a default network mask, based on the IP address.
588 static __inline__ int inet_abc_len(__be32 addr)
590 int rc = -1; /* Something else, probably a multicast. */
595 __u32 haddr = ntohl(addr);
597 if (IN_CLASSA(haddr))
599 else if (IN_CLASSB(haddr))
601 else if (IN_CLASSC(haddr))
609 int devinet_ioctl(unsigned int cmd, void __user *arg)
612 struct sockaddr_in sin_orig;
613 struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
614 struct in_device *in_dev;
615 struct in_ifaddr **ifap = NULL;
616 struct in_ifaddr *ifa = NULL;
617 struct net_device *dev;
620 int tryaddrmatch = 0;
623 * Fetch the caller's info block into kernel space
626 if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
628 ifr.ifr_name[IFNAMSIZ - 1] = 0;
630 /* save original address for comparison */
631 memcpy(&sin_orig, sin, sizeof(*sin));
633 colon = strchr(ifr.ifr_name, ':');
638 dev_load(ifr.ifr_name);
642 case SIOCGIFADDR: /* Get interface address */
643 case SIOCGIFBRDADDR: /* Get the broadcast address */
644 case SIOCGIFDSTADDR: /* Get the destination address */
645 case SIOCGIFNETMASK: /* Get the netmask for the interface */
646 /* Note that these ioctls will not sleep,
647 so that we do not impose a lock.
648 One day we will be forced to put shlock here (I mean SMP)
650 tryaddrmatch = (sin_orig.sin_family == AF_INET);
651 memset(sin, 0, sizeof(*sin));
652 sin->sin_family = AF_INET;
657 if (!capable(CAP_NET_ADMIN))
660 case SIOCSIFADDR: /* Set interface address (and family) */
661 case SIOCSIFBRDADDR: /* Set the broadcast address */
662 case SIOCSIFDSTADDR: /* Set the destination address */
663 case SIOCSIFNETMASK: /* Set the netmask for the interface */
665 if (!capable(CAP_NET_ADMIN))
668 if (sin->sin_family != AF_INET)
679 if ((dev = __dev_get_by_name(ifr.ifr_name)) == NULL)
685 if ((in_dev = __in_dev_get_rtnl(dev)) != NULL) {
687 /* Matthias Andree */
688 /* compare label and address (4.4BSD style) */
689 /* note: we only do this for a limited set of ioctls
690 and only if the original address family was AF_INET.
691 This is checked above. */
692 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
693 ifap = &ifa->ifa_next) {
694 if (!strcmp(ifr.ifr_name, ifa->ifa_label) &&
695 sin_orig.sin_addr.s_addr ==
701 /* we didn't get a match, maybe the application is
702 4.3BSD-style and passed in junk so we fall back to
703 comparing just the label */
705 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
706 ifap = &ifa->ifa_next)
707 if (!strcmp(ifr.ifr_name, ifa->ifa_label))
712 ret = -EADDRNOTAVAIL;
713 if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
717 case SIOCGIFADDR: /* Get interface address */
718 sin->sin_addr.s_addr = ifa->ifa_local;
721 case SIOCGIFBRDADDR: /* Get the broadcast address */
722 sin->sin_addr.s_addr = ifa->ifa_broadcast;
725 case SIOCGIFDSTADDR: /* Get the destination address */
726 sin->sin_addr.s_addr = ifa->ifa_address;
729 case SIOCGIFNETMASK: /* Get the netmask for the interface */
730 sin->sin_addr.s_addr = ifa->ifa_mask;
735 ret = -EADDRNOTAVAIL;
739 if (!(ifr.ifr_flags & IFF_UP))
740 inet_del_ifa(in_dev, ifap, 1);
743 ret = dev_change_flags(dev, ifr.ifr_flags);
746 case SIOCSIFADDR: /* Set interface address (and family) */
748 if (inet_abc_len(sin->sin_addr.s_addr) < 0)
753 if ((ifa = inet_alloc_ifa()) == NULL)
756 memcpy(ifa->ifa_label, ifr.ifr_name, IFNAMSIZ);
758 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
761 if (ifa->ifa_local == sin->sin_addr.s_addr)
763 inet_del_ifa(in_dev, ifap, 0);
764 ifa->ifa_broadcast = 0;
765 ifa->ifa_anycast = 0;
768 ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;
770 if (!(dev->flags & IFF_POINTOPOINT)) {
771 ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
772 ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
773 if ((dev->flags & IFF_BROADCAST) &&
774 ifa->ifa_prefixlen < 31)
775 ifa->ifa_broadcast = ifa->ifa_address |
778 ifa->ifa_prefixlen = 32;
779 ifa->ifa_mask = inet_make_mask(32);
781 ret = inet_set_ifa(dev, ifa);
784 case SIOCSIFBRDADDR: /* Set the broadcast address */
786 if (ifa->ifa_broadcast != sin->sin_addr.s_addr) {
787 inet_del_ifa(in_dev, ifap, 0);
788 ifa->ifa_broadcast = sin->sin_addr.s_addr;
789 inet_insert_ifa(ifa);
793 case SIOCSIFDSTADDR: /* Set the destination address */
795 if (ifa->ifa_address == sin->sin_addr.s_addr)
798 if (inet_abc_len(sin->sin_addr.s_addr) < 0)
801 inet_del_ifa(in_dev, ifap, 0);
802 ifa->ifa_address = sin->sin_addr.s_addr;
803 inet_insert_ifa(ifa);
806 case SIOCSIFNETMASK: /* Set the netmask for the interface */
809 * The mask we set must be legal.
812 if (bad_mask(sin->sin_addr.s_addr, 0))
815 if (ifa->ifa_mask != sin->sin_addr.s_addr) {
816 __be32 old_mask = ifa->ifa_mask;
817 inet_del_ifa(in_dev, ifap, 0);
818 ifa->ifa_mask = sin->sin_addr.s_addr;
819 ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
821 /* See if current broadcast address matches
822 * with current netmask, then recalculate
823 * the broadcast address. Otherwise it's a
824 * funny address, so don't touch it since
825 * the user seems to know what (s)he's doing...
827 if ((dev->flags & IFF_BROADCAST) &&
828 (ifa->ifa_prefixlen < 31) &&
829 (ifa->ifa_broadcast ==
830 (ifa->ifa_local|~old_mask))) {
831 ifa->ifa_broadcast = (ifa->ifa_local |
832 ~sin->sin_addr.s_addr);
834 inet_insert_ifa(ifa);
844 ret = copy_to_user(arg, &ifr, sizeof(struct ifreq)) ? -EFAULT : 0;
848 static int inet_gifconf(struct net_device *dev, char __user *buf, int len)
850 struct in_device *in_dev = __in_dev_get_rtnl(dev);
851 struct in_ifaddr *ifa;
855 if (!in_dev || (ifa = in_dev->ifa_list) == NULL)
858 for (; ifa; ifa = ifa->ifa_next) {
863 if (len < (int) sizeof(ifr))
865 memset(&ifr, 0, sizeof(struct ifreq));
867 strcpy(ifr.ifr_name, ifa->ifa_label);
869 strcpy(ifr.ifr_name, dev->name);
871 (*(struct sockaddr_in *)&ifr.ifr_addr).sin_family = AF_INET;
872 (*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr =
875 if (copy_to_user(buf, &ifr, sizeof(struct ifreq))) {
879 buf += sizeof(struct ifreq);
880 len -= sizeof(struct ifreq);
881 done += sizeof(struct ifreq);
887 __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope)
890 struct in_device *in_dev;
893 in_dev = __in_dev_get_rcu(dev);
897 for_primary_ifa(in_dev) {
898 if (ifa->ifa_scope > scope)
900 if (!dst || inet_ifa_match(dst, ifa)) {
901 addr = ifa->ifa_local;
905 addr = ifa->ifa_local;
906 } endfor_ifa(in_dev);
913 /* Not loopback addresses on loopback should be preferred
914 in this case. It is importnat that lo is the first interface
917 read_lock(&dev_base_lock);
919 for_each_netdev(dev) {
920 if ((in_dev = __in_dev_get_rcu(dev)) == NULL)
923 for_primary_ifa(in_dev) {
924 if (ifa->ifa_scope != RT_SCOPE_LINK &&
925 ifa->ifa_scope <= scope) {
926 addr = ifa->ifa_local;
927 goto out_unlock_both;
929 } endfor_ifa(in_dev);
932 read_unlock(&dev_base_lock);
938 static __be32 confirm_addr_indev(struct in_device *in_dev, __be32 dst,
939 __be32 local, int scope)
946 (local == ifa->ifa_local || !local) &&
947 ifa->ifa_scope <= scope) {
948 addr = ifa->ifa_local;
953 same = (!local || inet_ifa_match(local, ifa)) &&
954 (!dst || inet_ifa_match(dst, ifa));
958 /* Is the selected addr into dst subnet? */
959 if (inet_ifa_match(addr, ifa))
961 /* No, then can we use new local src? */
962 if (ifa->ifa_scope <= scope) {
963 addr = ifa->ifa_local;
966 /* search for large dst subnet for addr */
970 } endfor_ifa(in_dev);
972 return same? addr : 0;
976 * Confirm that local IP address exists using wildcards:
977 * - dev: only on this interface, 0=any interface
978 * - dst: only in the same subnet as dst, 0=any dst
979 * - local: address, 0=autoselect the local address
980 * - scope: maximum allowed scope value for the local address
982 __be32 inet_confirm_addr(const struct net_device *dev, __be32 dst, __be32 local, int scope)
985 struct in_device *in_dev;
989 if ((in_dev = __in_dev_get_rcu(dev)))
990 addr = confirm_addr_indev(in_dev, dst, local, scope);
996 read_lock(&dev_base_lock);
998 for_each_netdev(dev) {
999 if ((in_dev = __in_dev_get_rcu(dev))) {
1000 addr = confirm_addr_indev(in_dev, dst, local, scope);
1006 read_unlock(&dev_base_lock);
1015 int register_inetaddr_notifier(struct notifier_block *nb)
1017 return blocking_notifier_chain_register(&inetaddr_chain, nb);
1020 int unregister_inetaddr_notifier(struct notifier_block *nb)
1022 return blocking_notifier_chain_unregister(&inetaddr_chain, nb);
1025 /* Rename ifa_labels for a device name change. Make some effort to preserve existing
1026 * alias numbering and to create unique labels if possible.
1028 static void inetdev_changename(struct net_device *dev, struct in_device *in_dev)
1030 struct in_ifaddr *ifa;
1033 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
1034 char old[IFNAMSIZ], *dot;
1036 memcpy(old, ifa->ifa_label, IFNAMSIZ);
1037 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1040 dot = strchr(ifa->ifa_label, ':');
1042 sprintf(old, ":%d", named);
1045 if (strlen(dot) + strlen(dev->name) < IFNAMSIZ) {
1046 strcat(ifa->ifa_label, dot);
1048 strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
1053 /* Called only under RTNL semaphore */
1055 static int inetdev_event(struct notifier_block *this, unsigned long event,
1058 struct net_device *dev = ptr;
1059 struct in_device *in_dev = __in_dev_get_rtnl(dev);
1064 if (event == NETDEV_REGISTER) {
1065 in_dev = inetdev_init(dev);
1066 if (dev == &loopback_dev) {
1069 "Failed to create loopback\n");
1070 IN_DEV_CONF_SET(in_dev, NOXFRM, 1);
1071 IN_DEV_CONF_SET(in_dev, NOPOLICY, 1);
1078 case NETDEV_REGISTER:
1079 printk(KERN_DEBUG "inetdev_event: bug\n");
1085 if (dev == &loopback_dev) {
1086 struct in_ifaddr *ifa;
1087 if ((ifa = inet_alloc_ifa()) != NULL) {
1089 ifa->ifa_address = htonl(INADDR_LOOPBACK);
1090 ifa->ifa_prefixlen = 8;
1091 ifa->ifa_mask = inet_make_mask(8);
1092 in_dev_hold(in_dev);
1093 ifa->ifa_dev = in_dev;
1094 ifa->ifa_scope = RT_SCOPE_HOST;
1095 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1096 inet_insert_ifa(ifa);
1104 case NETDEV_CHANGEMTU:
1107 /* MTU falled under 68, disable IP */
1108 case NETDEV_UNREGISTER:
1109 inetdev_destroy(in_dev);
1111 case NETDEV_CHANGENAME:
1112 /* Do not notify about label change, this event is
1113 * not interesting to applications using netlink.
1115 inetdev_changename(dev, in_dev);
1117 #ifdef CONFIG_SYSCTL
1118 devinet_sysctl_unregister(&in_dev->cnf);
1119 neigh_sysctl_unregister(in_dev->arp_parms);
1120 neigh_sysctl_register(dev, in_dev->arp_parms, NET_IPV4,
1121 NET_IPV4_NEIGH, "ipv4", NULL, NULL);
1122 devinet_sysctl_register(in_dev, &in_dev->cnf);
1130 static struct notifier_block ip_netdev_notifier = {
1131 .notifier_call =inetdev_event,
1134 static inline size_t inet_nlmsg_size(void)
1136 return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
1137 + nla_total_size(4) /* IFA_ADDRESS */
1138 + nla_total_size(4) /* IFA_LOCAL */
1139 + nla_total_size(4) /* IFA_BROADCAST */
1140 + nla_total_size(4) /* IFA_ANYCAST */
1141 + nla_total_size(IFNAMSIZ); /* IFA_LABEL */
1144 static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
1145 u32 pid, u32 seq, int event, unsigned int flags)
1147 struct ifaddrmsg *ifm;
1148 struct nlmsghdr *nlh;
1150 nlh = nlmsg_put(skb, pid, seq, event, sizeof(*ifm), flags);
1154 ifm = nlmsg_data(nlh);
1155 ifm->ifa_family = AF_INET;
1156 ifm->ifa_prefixlen = ifa->ifa_prefixlen;
1157 ifm->ifa_flags = ifa->ifa_flags|IFA_F_PERMANENT;
1158 ifm->ifa_scope = ifa->ifa_scope;
1159 ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
1161 if (ifa->ifa_address)
1162 NLA_PUT_BE32(skb, IFA_ADDRESS, ifa->ifa_address);
1165 NLA_PUT_BE32(skb, IFA_LOCAL, ifa->ifa_local);
1167 if (ifa->ifa_broadcast)
1168 NLA_PUT_BE32(skb, IFA_BROADCAST, ifa->ifa_broadcast);
1170 if (ifa->ifa_anycast)
1171 NLA_PUT_BE32(skb, IFA_ANYCAST, ifa->ifa_anycast);
1173 if (ifa->ifa_label[0])
1174 NLA_PUT_STRING(skb, IFA_LABEL, ifa->ifa_label);
1176 return nlmsg_end(skb, nlh);
1179 nlmsg_cancel(skb, nlh);
1183 static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1186 struct net_device *dev;
1187 struct in_device *in_dev;
1188 struct in_ifaddr *ifa;
1189 int s_ip_idx, s_idx = cb->args[0];
1191 s_ip_idx = ip_idx = cb->args[1];
1193 for_each_netdev(dev) {
1198 if ((in_dev = __in_dev_get_rtnl(dev)) == NULL)
1201 for (ifa = in_dev->ifa_list, ip_idx = 0; ifa;
1202 ifa = ifa->ifa_next, ip_idx++) {
1203 if (ip_idx < s_ip_idx)
1205 if (inet_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid,
1207 RTM_NEWADDR, NLM_F_MULTI) <= 0)
1216 cb->args[1] = ip_idx;
1221 static void rtmsg_ifa(int event, struct in_ifaddr* ifa, struct nlmsghdr *nlh,
1224 struct sk_buff *skb;
1225 u32 seq = nlh ? nlh->nlmsg_seq : 0;
1228 skb = nlmsg_new(inet_nlmsg_size(), GFP_KERNEL);
1232 err = inet_fill_ifaddr(skb, ifa, pid, seq, event, 0);
1234 /* -EMSGSIZE implies BUG in inet_nlmsg_size() */
1235 WARN_ON(err == -EMSGSIZE);
1239 err = rtnl_notify(skb, pid, RTNLGRP_IPV4_IFADDR, nlh, GFP_KERNEL);
1242 rtnl_set_sk_err(RTNLGRP_IPV4_IFADDR, err);
1245 #ifdef CONFIG_SYSCTL
1247 void inet_forward_change(void)
1249 struct net_device *dev;
1250 int on = IPV4_DEVCONF_ALL(FORWARDING);
1252 IPV4_DEVCONF_ALL(ACCEPT_REDIRECTS) = !on;
1253 IPV4_DEVCONF_DFLT(FORWARDING) = on;
1255 read_lock(&dev_base_lock);
1256 for_each_netdev(dev) {
1257 struct in_device *in_dev;
1259 in_dev = __in_dev_get_rcu(dev);
1261 IN_DEV_CONF_SET(in_dev, FORWARDING, on);
1264 read_unlock(&dev_base_lock);
1269 static int devinet_sysctl_forward(ctl_table *ctl, int write,
1270 struct file* filp, void __user *buffer,
1271 size_t *lenp, loff_t *ppos)
1273 int *valp = ctl->data;
1275 int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
1277 if (write && *valp != val) {
1278 if (valp == &IPV4_DEVCONF_ALL(FORWARDING))
1279 inet_forward_change();
1280 else if (valp != &IPV4_DEVCONF_DFLT(FORWARDING))
1287 int ipv4_doint_and_flush(ctl_table *ctl, int write,
1288 struct file* filp, void __user *buffer,
1289 size_t *lenp, loff_t *ppos)
1291 int *valp = ctl->data;
1293 int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
1295 if (write && *valp != val)
1301 int ipv4_doint_and_flush_strategy(ctl_table *table, int __user *name, int nlen,
1302 void __user *oldval, size_t __user *oldlenp,
1303 void __user *newval, size_t newlen)
1305 int *valp = table->data;
1308 if (!newval || !newlen)
1311 if (newlen != sizeof(int))
1314 if (get_user(new, (int __user *)newval))
1320 if (oldval && oldlenp) {
1323 if (get_user(len, oldlenp))
1327 if (len > table->maxlen)
1328 len = table->maxlen;
1329 if (copy_to_user(oldval, valp, len))
1331 if (put_user(len, oldlenp))
1342 #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc, sysctl) \
1344 .ctl_name = NET_IPV4_CONF_ ## attr, \
1346 .data = ipv4_devconf.data + \
1347 NET_IPV4_CONF_ ## attr - 1, \
1348 .maxlen = sizeof(int), \
1350 .proc_handler = proc, \
1351 .strategy = sysctl, \
1354 #define DEVINET_SYSCTL_RW_ENTRY(attr, name) \
1355 DEVINET_SYSCTL_ENTRY(attr, name, 0644, &proc_dointvec, NULL)
1357 #define DEVINET_SYSCTL_RO_ENTRY(attr, name) \
1358 DEVINET_SYSCTL_ENTRY(attr, name, 0444, &proc_dointvec, NULL)
1360 #define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc, sysctl) \
1361 DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc, sysctl)
1363 #define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \
1364 DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush, \
1365 ipv4_doint_and_flush_strategy)
1367 static struct devinet_sysctl_table {
1368 struct ctl_table_header *sysctl_header;
1369 ctl_table devinet_vars[__NET_IPV4_CONF_MAX];
1370 ctl_table devinet_dev[2];
1371 ctl_table devinet_conf_dir[2];
1372 ctl_table devinet_proto_dir[2];
1373 ctl_table devinet_root_dir[2];
1374 } devinet_sysctl = {
1376 DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding",
1377 devinet_sysctl_forward, NULL),
1378 DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING, "mc_forwarding"),
1380 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS, "accept_redirects"),
1381 DEVINET_SYSCTL_RW_ENTRY(SECURE_REDIRECTS, "secure_redirects"),
1382 DEVINET_SYSCTL_RW_ENTRY(SHARED_MEDIA, "shared_media"),
1383 DEVINET_SYSCTL_RW_ENTRY(RP_FILTER, "rp_filter"),
1384 DEVINET_SYSCTL_RW_ENTRY(SEND_REDIRECTS, "send_redirects"),
1385 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE,
1386 "accept_source_route"),
1387 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP, "proxy_arp"),
1388 DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID, "medium_id"),
1389 DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY, "bootp_relay"),
1390 DEVINET_SYSCTL_RW_ENTRY(LOG_MARTIANS, "log_martians"),
1391 DEVINET_SYSCTL_RW_ENTRY(TAG, "tag"),
1392 DEVINET_SYSCTL_RW_ENTRY(ARPFILTER, "arp_filter"),
1393 DEVINET_SYSCTL_RW_ENTRY(ARP_ANNOUNCE, "arp_announce"),
1394 DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE, "arp_ignore"),
1395 DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT, "arp_accept"),
1397 DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM, "disable_xfrm"),
1398 DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY, "disable_policy"),
1399 DEVINET_SYSCTL_FLUSHING_ENTRY(FORCE_IGMP_VERSION,
1400 "force_igmp_version"),
1401 DEVINET_SYSCTL_FLUSHING_ENTRY(PROMOTE_SECONDARIES,
1402 "promote_secondaries"),
1406 .ctl_name = NET_PROTO_CONF_ALL,
1409 .child = devinet_sysctl.devinet_vars,
1412 .devinet_conf_dir = {
1414 .ctl_name = NET_IPV4_CONF,
1417 .child = devinet_sysctl.devinet_dev,
1420 .devinet_proto_dir = {
1422 .ctl_name = NET_IPV4,
1425 .child = devinet_sysctl.devinet_conf_dir,
1428 .devinet_root_dir = {
1430 .ctl_name = CTL_NET,
1433 .child = devinet_sysctl.devinet_proto_dir,
1438 static void devinet_sysctl_register(struct in_device *in_dev,
1439 struct ipv4_devconf *p)
1442 struct net_device *dev = in_dev ? in_dev->dev : NULL;
1443 struct devinet_sysctl_table *t = kmemdup(&devinet_sysctl, sizeof(*t),
1445 char *dev_name = NULL;
1449 for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
1450 t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
1454 dev_name = dev->name;
1455 t->devinet_dev[0].ctl_name = dev->ifindex;
1457 dev_name = "default";
1458 t->devinet_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
1462 * Make a copy of dev_name, because '.procname' is regarded as const
1463 * by sysctl and we wouldn't want anyone to change it under our feet
1464 * (see SIOCSIFNAME).
1466 dev_name = kstrdup(dev_name, GFP_KERNEL);
1470 t->devinet_dev[0].procname = dev_name;
1471 t->devinet_dev[0].child = t->devinet_vars;
1472 t->devinet_conf_dir[0].child = t->devinet_dev;
1473 t->devinet_proto_dir[0].child = t->devinet_conf_dir;
1474 t->devinet_root_dir[0].child = t->devinet_proto_dir;
1476 t->sysctl_header = register_sysctl_table(t->devinet_root_dir);
1477 if (!t->sysctl_header)
1491 static void devinet_sysctl_unregister(struct ipv4_devconf *p)
1494 struct devinet_sysctl_table *t = p->sysctl;
1496 unregister_sysctl_table(t->sysctl_header);
1497 kfree(t->devinet_dev[0].procname);
1503 void __init devinet_init(void)
1505 register_gifconf(PF_INET, inet_gifconf);
1506 register_netdevice_notifier(&ip_netdev_notifier);
1508 rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL);
1509 rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL);
1510 rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr);
1511 #ifdef CONFIG_SYSCTL
1512 devinet_sysctl.sysctl_header =
1513 register_sysctl_table(devinet_sysctl.devinet_root_dir);
1514 devinet_sysctl_register(NULL, &ipv4_devconf_dflt);
1518 EXPORT_SYMBOL(in_dev_finish_destroy);
1519 EXPORT_SYMBOL(inet_select_addr);
1520 EXPORT_SYMBOL(inetdev_by_index);
1521 EXPORT_SYMBOL(register_inetaddr_notifier);
1522 EXPORT_SYMBOL(unregister_inetaddr_notifier);