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
30 #include <linux/config.h>
32 #include <asm/uaccess.h>
33 #include <asm/system.h>
34 #include <linux/bitops.h>
35 #include <linux/capability.h>
36 #include <linux/module.h>
37 #include <linux/types.h>
38 #include <linux/kernel.h>
39 #include <linux/sched.h>
40 #include <linux/string.h>
42 #include <linux/socket.h>
43 #include <linux/sockios.h>
45 #include <linux/errno.h>
46 #include <linux/interrupt.h>
47 #include <linux/if_ether.h>
48 #include <linux/inet.h>
49 #include <linux/netdevice.h>
50 #include <linux/etherdevice.h>
51 #include <linux/skbuff.h>
52 #include <linux/rtnetlink.h>
53 #include <linux/init.h>
54 #include <linux/notifier.h>
55 #include <linux/inetdevice.h>
56 #include <linux/igmp.h>
58 #include <linux/sysctl.h>
60 #include <linux/kmod.h>
64 #include <net/route.h>
65 #include <net/ip_fib.h>
67 struct ipv4_devconf ipv4_devconf = {
68 .accept_redirects = 1,
70 .secure_redirects = 1,
74 static struct ipv4_devconf ipv4_devconf_dflt = {
75 .accept_redirects = 1,
77 .secure_redirects = 1,
79 .accept_source_route = 1,
82 static void rtmsg_ifa(int event, struct in_ifaddr *);
84 static struct notifier_block *inetaddr_chain;
85 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
88 static void devinet_sysctl_register(struct in_device *in_dev,
89 struct ipv4_devconf *p);
90 static void devinet_sysctl_unregister(struct ipv4_devconf *p);
93 /* Locks all the inet devices. */
95 static struct in_ifaddr *inet_alloc_ifa(void)
97 struct in_ifaddr *ifa = kmalloc(sizeof(*ifa), GFP_KERNEL);
100 memset(ifa, 0, sizeof(*ifa));
101 INIT_RCU_HEAD(&ifa->rcu_head);
107 static void inet_rcu_free_ifa(struct rcu_head *head)
109 struct in_ifaddr *ifa = container_of(head, struct in_ifaddr, rcu_head);
111 in_dev_put(ifa->ifa_dev);
115 static inline void inet_free_ifa(struct in_ifaddr *ifa)
117 call_rcu(&ifa->rcu_head, inet_rcu_free_ifa);
120 void in_dev_finish_destroy(struct in_device *idev)
122 struct net_device *dev = idev->dev;
124 BUG_TRAP(!idev->ifa_list);
125 BUG_TRAP(!idev->mc_list);
126 #ifdef NET_REFCNT_DEBUG
127 printk(KERN_DEBUG "in_dev_finish_destroy: %p=%s\n",
128 idev, dev ? dev->name : "NIL");
132 printk("Freeing alive in_device %p\n", idev);
138 struct in_device *inetdev_init(struct net_device *dev)
140 struct in_device *in_dev;
144 in_dev = kmalloc(sizeof(*in_dev), GFP_KERNEL);
147 memset(in_dev, 0, sizeof(*in_dev));
148 INIT_RCU_HEAD(&in_dev->rcu_head);
149 memcpy(&in_dev->cnf, &ipv4_devconf_dflt, sizeof(in_dev->cnf));
150 in_dev->cnf.sysctl = NULL;
152 if ((in_dev->arp_parms = neigh_parms_alloc(dev, &arp_tbl)) == NULL)
154 /* Reference in_dev->dev */
157 neigh_sysctl_register(dev, in_dev->arp_parms, NET_IPV4,
158 NET_IPV4_NEIGH, "ipv4", NULL, NULL);
161 /* Account for reference dev->ip_ptr */
163 rcu_assign_pointer(dev->ip_ptr, in_dev);
166 devinet_sysctl_register(in_dev, &in_dev->cnf);
168 ip_mc_init_dev(in_dev);
169 if (dev->flags & IFF_UP)
179 static void in_dev_rcu_put(struct rcu_head *head)
181 struct in_device *idev = container_of(head, struct in_device, rcu_head);
185 static void inetdev_destroy(struct in_device *in_dev)
187 struct in_ifaddr *ifa;
188 struct net_device *dev;
193 if (dev == &loopback_dev)
198 ip_mc_destroy_dev(in_dev);
200 while ((ifa = in_dev->ifa_list) != NULL) {
201 inet_del_ifa(in_dev, &in_dev->ifa_list, 0);
206 devinet_sysctl_unregister(&in_dev->cnf);
212 neigh_sysctl_unregister(in_dev->arp_parms);
214 neigh_parms_release(&arp_tbl, in_dev->arp_parms);
217 call_rcu(&in_dev->rcu_head, in_dev_rcu_put);
220 int inet_addr_onlink(struct in_device *in_dev, u32 a, u32 b)
223 for_primary_ifa(in_dev) {
224 if (inet_ifa_match(a, ifa)) {
225 if (!b || inet_ifa_match(b, ifa)) {
230 } endfor_ifa(in_dev);
235 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
238 struct in_ifaddr *promote = NULL;
239 struct in_ifaddr *ifa, *ifa1 = *ifap;
240 struct in_ifaddr *last_prim = in_dev->ifa_list;
241 struct in_ifaddr *prev_prom = NULL;
242 int do_promote = IN_DEV_PROMOTE_SECONDARIES(in_dev);
246 /* 1. Deleting primary ifaddr forces deletion all secondaries
247 * unless alias promotion is set
250 if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
251 struct in_ifaddr **ifap1 = &ifa1->ifa_next;
253 while ((ifa = *ifap1) != NULL) {
254 if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
255 ifa1->ifa_scope <= ifa->ifa_scope)
258 if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
259 ifa1->ifa_mask != ifa->ifa_mask ||
260 !inet_ifa_match(ifa1->ifa_address, ifa)) {
261 ifap1 = &ifa->ifa_next;
267 *ifap1 = ifa->ifa_next;
269 rtmsg_ifa(RTM_DELADDR, ifa);
270 notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa);
281 *ifap = ifa1->ifa_next;
283 /* 3. Announce address deletion */
285 /* Send message first, then call notifier.
286 At first sight, FIB update triggered by notifier
287 will refer to already deleted ifaddr, that could confuse
288 netlink listeners. It is not true: look, gated sees
289 that route deleted and if it still thinks that ifaddr
290 is valid, it will try to restore deleted routes... Grr.
291 So that, this order is correct.
293 rtmsg_ifa(RTM_DELADDR, ifa1);
294 notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
299 prev_prom->ifa_next = promote->ifa_next;
300 promote->ifa_next = last_prim->ifa_next;
301 last_prim->ifa_next = promote;
304 promote->ifa_flags &= ~IFA_F_SECONDARY;
305 rtmsg_ifa(RTM_NEWADDR, promote);
306 notifier_call_chain(&inetaddr_chain, NETDEV_UP, promote);
307 for (ifa = promote->ifa_next; ifa; ifa = ifa->ifa_next) {
308 if (ifa1->ifa_mask != ifa->ifa_mask ||
309 !inet_ifa_match(ifa1->ifa_address, ifa))
318 if (!in_dev->ifa_list)
319 inetdev_destroy(in_dev);
323 static int inet_insert_ifa(struct in_ifaddr *ifa)
325 struct in_device *in_dev = ifa->ifa_dev;
326 struct in_ifaddr *ifa1, **ifap, **last_primary;
330 if (!ifa->ifa_local) {
335 ifa->ifa_flags &= ~IFA_F_SECONDARY;
336 last_primary = &in_dev->ifa_list;
338 for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL;
339 ifap = &ifa1->ifa_next) {
340 if (!(ifa1->ifa_flags & IFA_F_SECONDARY) &&
341 ifa->ifa_scope <= ifa1->ifa_scope)
342 last_primary = &ifa1->ifa_next;
343 if (ifa1->ifa_mask == ifa->ifa_mask &&
344 inet_ifa_match(ifa1->ifa_address, ifa)) {
345 if (ifa1->ifa_local == ifa->ifa_local) {
349 if (ifa1->ifa_scope != ifa->ifa_scope) {
353 ifa->ifa_flags |= IFA_F_SECONDARY;
357 if (!(ifa->ifa_flags & IFA_F_SECONDARY)) {
358 net_srandom(ifa->ifa_local);
362 ifa->ifa_next = *ifap;
365 /* Send message first, then call notifier.
366 Notifier will trigger FIB update, so that
367 listeners of netlink will know about new ifaddr */
368 rtmsg_ifa(RTM_NEWADDR, ifa);
369 notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
374 static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
376 struct in_device *in_dev = __in_dev_get_rtnl(dev);
381 in_dev = inetdev_init(dev);
387 if (ifa->ifa_dev != in_dev) {
388 BUG_TRAP(!ifa->ifa_dev);
390 ifa->ifa_dev = in_dev;
392 if (LOOPBACK(ifa->ifa_local))
393 ifa->ifa_scope = RT_SCOPE_HOST;
394 return inet_insert_ifa(ifa);
397 struct in_device *inetdev_by_index(int ifindex)
399 struct net_device *dev;
400 struct in_device *in_dev = NULL;
401 read_lock(&dev_base_lock);
402 dev = __dev_get_by_index(ifindex);
404 in_dev = in_dev_get(dev);
405 read_unlock(&dev_base_lock);
409 /* Called only from RTNL semaphored context. No locks. */
411 struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, u32 prefix,
416 for_primary_ifa(in_dev) {
417 if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
419 } endfor_ifa(in_dev);
423 static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
425 struct rtattr **rta = arg;
426 struct in_device *in_dev;
427 struct ifaddrmsg *ifm = NLMSG_DATA(nlh);
428 struct in_ifaddr *ifa, **ifap;
432 if ((in_dev = inetdev_by_index(ifm->ifa_index)) == NULL)
434 __in_dev_put(in_dev);
436 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
437 ifap = &ifa->ifa_next) {
438 if ((rta[IFA_LOCAL - 1] &&
439 memcmp(RTA_DATA(rta[IFA_LOCAL - 1]),
440 &ifa->ifa_local, 4)) ||
441 (rta[IFA_LABEL - 1] &&
442 rtattr_strcmp(rta[IFA_LABEL - 1], ifa->ifa_label)) ||
443 (rta[IFA_ADDRESS - 1] &&
444 (ifm->ifa_prefixlen != ifa->ifa_prefixlen ||
445 !inet_ifa_match(*(u32*)RTA_DATA(rta[IFA_ADDRESS - 1]),
448 inet_del_ifa(in_dev, ifap, 1);
452 return -EADDRNOTAVAIL;
455 static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
457 struct rtattr **rta = arg;
458 struct net_device *dev;
459 struct in_device *in_dev;
460 struct ifaddrmsg *ifm = NLMSG_DATA(nlh);
461 struct in_ifaddr *ifa;
466 if (ifm->ifa_prefixlen > 32 || !rta[IFA_LOCAL - 1])
470 if ((dev = __dev_get_by_index(ifm->ifa_index)) == NULL)
474 if ((in_dev = __in_dev_get_rtnl(dev)) == NULL) {
475 in_dev = inetdev_init(dev);
480 if ((ifa = inet_alloc_ifa()) == NULL)
483 if (!rta[IFA_ADDRESS - 1])
484 rta[IFA_ADDRESS - 1] = rta[IFA_LOCAL - 1];
485 memcpy(&ifa->ifa_local, RTA_DATA(rta[IFA_LOCAL - 1]), 4);
486 memcpy(&ifa->ifa_address, RTA_DATA(rta[IFA_ADDRESS - 1]), 4);
487 ifa->ifa_prefixlen = ifm->ifa_prefixlen;
488 ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
489 if (rta[IFA_BROADCAST - 1])
490 memcpy(&ifa->ifa_broadcast,
491 RTA_DATA(rta[IFA_BROADCAST - 1]), 4);
492 if (rta[IFA_ANYCAST - 1])
493 memcpy(&ifa->ifa_anycast, RTA_DATA(rta[IFA_ANYCAST - 1]), 4);
494 ifa->ifa_flags = ifm->ifa_flags;
495 ifa->ifa_scope = ifm->ifa_scope;
497 ifa->ifa_dev = in_dev;
498 if (rta[IFA_LABEL - 1])
499 rtattr_strlcpy(ifa->ifa_label, rta[IFA_LABEL - 1], IFNAMSIZ);
501 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
503 rc = inet_insert_ifa(ifa);
509 * Determine a default network mask, based on the IP address.
512 static __inline__ int inet_abc_len(u32 addr)
514 int rc = -1; /* Something else, probably a multicast. */
523 else if (IN_CLASSB(addr))
525 else if (IN_CLASSC(addr))
533 int devinet_ioctl(unsigned int cmd, void __user *arg)
536 struct sockaddr_in sin_orig;
537 struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
538 struct in_device *in_dev;
539 struct in_ifaddr **ifap = NULL;
540 struct in_ifaddr *ifa = NULL;
541 struct net_device *dev;
544 int tryaddrmatch = 0;
547 * Fetch the caller's info block into kernel space
550 if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
552 ifr.ifr_name[IFNAMSIZ - 1] = 0;
554 /* save original address for comparison */
555 memcpy(&sin_orig, sin, sizeof(*sin));
557 colon = strchr(ifr.ifr_name, ':');
562 dev_load(ifr.ifr_name);
566 case SIOCGIFADDR: /* Get interface address */
567 case SIOCGIFBRDADDR: /* Get the broadcast address */
568 case SIOCGIFDSTADDR: /* Get the destination address */
569 case SIOCGIFNETMASK: /* Get the netmask for the interface */
570 /* Note that these ioctls will not sleep,
571 so that we do not impose a lock.
572 One day we will be forced to put shlock here (I mean SMP)
574 tryaddrmatch = (sin_orig.sin_family == AF_INET);
575 memset(sin, 0, sizeof(*sin));
576 sin->sin_family = AF_INET;
581 if (!capable(CAP_NET_ADMIN))
584 case SIOCSIFADDR: /* Set interface address (and family) */
585 case SIOCSIFBRDADDR: /* Set the broadcast address */
586 case SIOCSIFDSTADDR: /* Set the destination address */
587 case SIOCSIFNETMASK: /* Set the netmask for the interface */
589 if (!capable(CAP_NET_ADMIN))
592 if (sin->sin_family != AF_INET)
603 if ((dev = __dev_get_by_name(ifr.ifr_name)) == NULL)
609 if ((in_dev = __in_dev_get_rtnl(dev)) != NULL) {
611 /* Matthias Andree */
612 /* compare label and address (4.4BSD style) */
613 /* note: we only do this for a limited set of ioctls
614 and only if the original address family was AF_INET.
615 This is checked above. */
616 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
617 ifap = &ifa->ifa_next) {
618 if (!strcmp(ifr.ifr_name, ifa->ifa_label) &&
619 sin_orig.sin_addr.s_addr ==
625 /* we didn't get a match, maybe the application is
626 4.3BSD-style and passed in junk so we fall back to
627 comparing just the label */
629 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
630 ifap = &ifa->ifa_next)
631 if (!strcmp(ifr.ifr_name, ifa->ifa_label))
636 ret = -EADDRNOTAVAIL;
637 if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
641 case SIOCGIFADDR: /* Get interface address */
642 sin->sin_addr.s_addr = ifa->ifa_local;
645 case SIOCGIFBRDADDR: /* Get the broadcast address */
646 sin->sin_addr.s_addr = ifa->ifa_broadcast;
649 case SIOCGIFDSTADDR: /* Get the destination address */
650 sin->sin_addr.s_addr = ifa->ifa_address;
653 case SIOCGIFNETMASK: /* Get the netmask for the interface */
654 sin->sin_addr.s_addr = ifa->ifa_mask;
659 ret = -EADDRNOTAVAIL;
663 if (!(ifr.ifr_flags & IFF_UP))
664 inet_del_ifa(in_dev, ifap, 1);
667 ret = dev_change_flags(dev, ifr.ifr_flags);
670 case SIOCSIFADDR: /* Set interface address (and family) */
672 if (inet_abc_len(sin->sin_addr.s_addr) < 0)
677 if ((ifa = inet_alloc_ifa()) == NULL)
680 memcpy(ifa->ifa_label, ifr.ifr_name, IFNAMSIZ);
682 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
685 if (ifa->ifa_local == sin->sin_addr.s_addr)
687 inet_del_ifa(in_dev, ifap, 0);
688 ifa->ifa_broadcast = 0;
689 ifa->ifa_anycast = 0;
692 ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;
694 if (!(dev->flags & IFF_POINTOPOINT)) {
695 ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
696 ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
697 if ((dev->flags & IFF_BROADCAST) &&
698 ifa->ifa_prefixlen < 31)
699 ifa->ifa_broadcast = ifa->ifa_address |
702 ifa->ifa_prefixlen = 32;
703 ifa->ifa_mask = inet_make_mask(32);
705 ret = inet_set_ifa(dev, ifa);
708 case SIOCSIFBRDADDR: /* Set the broadcast address */
710 if (ifa->ifa_broadcast != sin->sin_addr.s_addr) {
711 inet_del_ifa(in_dev, ifap, 0);
712 ifa->ifa_broadcast = sin->sin_addr.s_addr;
713 inet_insert_ifa(ifa);
717 case SIOCSIFDSTADDR: /* Set the destination address */
719 if (ifa->ifa_address == sin->sin_addr.s_addr)
722 if (inet_abc_len(sin->sin_addr.s_addr) < 0)
725 inet_del_ifa(in_dev, ifap, 0);
726 ifa->ifa_address = sin->sin_addr.s_addr;
727 inet_insert_ifa(ifa);
730 case SIOCSIFNETMASK: /* Set the netmask for the interface */
733 * The mask we set must be legal.
736 if (bad_mask(sin->sin_addr.s_addr, 0))
739 if (ifa->ifa_mask != sin->sin_addr.s_addr) {
740 u32 old_mask = ifa->ifa_mask;
741 inet_del_ifa(in_dev, ifap, 0);
742 ifa->ifa_mask = sin->sin_addr.s_addr;
743 ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
745 /* See if current broadcast address matches
746 * with current netmask, then recalculate
747 * the broadcast address. Otherwise it's a
748 * funny address, so don't touch it since
749 * the user seems to know what (s)he's doing...
751 if ((dev->flags & IFF_BROADCAST) &&
752 (ifa->ifa_prefixlen < 31) &&
753 (ifa->ifa_broadcast ==
754 (ifa->ifa_local|~old_mask))) {
755 ifa->ifa_broadcast = (ifa->ifa_local |
756 ~sin->sin_addr.s_addr);
758 inet_insert_ifa(ifa);
768 ret = copy_to_user(arg, &ifr, sizeof(struct ifreq)) ? -EFAULT : 0;
772 static int inet_gifconf(struct net_device *dev, char __user *buf, int len)
774 struct in_device *in_dev = __in_dev_get_rtnl(dev);
775 struct in_ifaddr *ifa;
779 if (!in_dev || (ifa = in_dev->ifa_list) == NULL)
782 for (; ifa; ifa = ifa->ifa_next) {
787 if (len < (int) sizeof(ifr))
789 memset(&ifr, 0, sizeof(struct ifreq));
791 strcpy(ifr.ifr_name, ifa->ifa_label);
793 strcpy(ifr.ifr_name, dev->name);
795 (*(struct sockaddr_in *)&ifr.ifr_addr).sin_family = AF_INET;
796 (*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr =
799 if (copy_to_user(buf, &ifr, sizeof(struct ifreq))) {
803 buf += sizeof(struct ifreq);
804 len -= sizeof(struct ifreq);
805 done += sizeof(struct ifreq);
811 u32 inet_select_addr(const struct net_device *dev, u32 dst, int scope)
814 struct in_device *in_dev;
817 in_dev = __in_dev_get_rcu(dev);
821 for_primary_ifa(in_dev) {
822 if (ifa->ifa_scope > scope)
824 if (!dst || inet_ifa_match(dst, ifa)) {
825 addr = ifa->ifa_local;
829 addr = ifa->ifa_local;
830 } endfor_ifa(in_dev);
837 /* Not loopback addresses on loopback should be preferred
838 in this case. It is importnat that lo is the first interface
841 read_lock(&dev_base_lock);
843 for (dev = dev_base; dev; dev = dev->next) {
844 if ((in_dev = __in_dev_get_rcu(dev)) == NULL)
847 for_primary_ifa(in_dev) {
848 if (ifa->ifa_scope != RT_SCOPE_LINK &&
849 ifa->ifa_scope <= scope) {
850 addr = ifa->ifa_local;
851 goto out_unlock_both;
853 } endfor_ifa(in_dev);
856 read_unlock(&dev_base_lock);
862 static u32 confirm_addr_indev(struct in_device *in_dev, u32 dst,
863 u32 local, int scope)
870 (local == ifa->ifa_local || !local) &&
871 ifa->ifa_scope <= scope) {
872 addr = ifa->ifa_local;
877 same = (!local || inet_ifa_match(local, ifa)) &&
878 (!dst || inet_ifa_match(dst, ifa));
882 /* Is the selected addr into dst subnet? */
883 if (inet_ifa_match(addr, ifa))
885 /* No, then can we use new local src? */
886 if (ifa->ifa_scope <= scope) {
887 addr = ifa->ifa_local;
890 /* search for large dst subnet for addr */
894 } endfor_ifa(in_dev);
896 return same? addr : 0;
900 * Confirm that local IP address exists using wildcards:
901 * - dev: only on this interface, 0=any interface
902 * - dst: only in the same subnet as dst, 0=any dst
903 * - local: address, 0=autoselect the local address
904 * - scope: maximum allowed scope value for the local address
906 u32 inet_confirm_addr(const struct net_device *dev, u32 dst, u32 local, int scope)
909 struct in_device *in_dev;
913 if ((in_dev = __in_dev_get_rcu(dev)))
914 addr = confirm_addr_indev(in_dev, dst, local, scope);
920 read_lock(&dev_base_lock);
922 for (dev = dev_base; dev; dev = dev->next) {
923 if ((in_dev = __in_dev_get_rcu(dev))) {
924 addr = confirm_addr_indev(in_dev, dst, local, scope);
930 read_unlock(&dev_base_lock);
939 int register_inetaddr_notifier(struct notifier_block *nb)
941 return notifier_chain_register(&inetaddr_chain, nb);
944 int unregister_inetaddr_notifier(struct notifier_block *nb)
946 return notifier_chain_unregister(&inetaddr_chain, nb);
949 /* Rename ifa_labels for a device name change. Make some effort to preserve existing
950 * alias numbering and to create unique labels if possible.
952 static void inetdev_changename(struct net_device *dev, struct in_device *in_dev)
954 struct in_ifaddr *ifa;
957 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
958 char old[IFNAMSIZ], *dot;
960 memcpy(old, ifa->ifa_label, IFNAMSIZ);
961 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
964 dot = strchr(ifa->ifa_label, ':');
966 sprintf(old, ":%d", named);
969 if (strlen(dot) + strlen(dev->name) < IFNAMSIZ) {
970 strcat(ifa->ifa_label, dot);
972 strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
977 /* Called only under RTNL semaphore */
979 static int inetdev_event(struct notifier_block *this, unsigned long event,
982 struct net_device *dev = ptr;
983 struct in_device *in_dev = __in_dev_get_rtnl(dev);
988 if (event == NETDEV_REGISTER && dev == &loopback_dev) {
989 in_dev = inetdev_init(dev);
991 panic("devinet: Failed to create loopback\n");
992 in_dev->cnf.no_xfrm = 1;
993 in_dev->cnf.no_policy = 1;
999 case NETDEV_REGISTER:
1000 printk(KERN_DEBUG "inetdev_event: bug\n");
1006 if (dev == &loopback_dev) {
1007 struct in_ifaddr *ifa;
1008 if ((ifa = inet_alloc_ifa()) != NULL) {
1010 ifa->ifa_address = htonl(INADDR_LOOPBACK);
1011 ifa->ifa_prefixlen = 8;
1012 ifa->ifa_mask = inet_make_mask(8);
1013 in_dev_hold(in_dev);
1014 ifa->ifa_dev = in_dev;
1015 ifa->ifa_scope = RT_SCOPE_HOST;
1016 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1017 inet_insert_ifa(ifa);
1025 case NETDEV_CHANGEMTU:
1028 /* MTU falled under 68, disable IP */
1029 case NETDEV_UNREGISTER:
1030 inetdev_destroy(in_dev);
1032 case NETDEV_CHANGENAME:
1033 /* Do not notify about label change, this event is
1034 * not interesting to applications using netlink.
1036 inetdev_changename(dev, in_dev);
1038 #ifdef CONFIG_SYSCTL
1039 devinet_sysctl_unregister(&in_dev->cnf);
1040 neigh_sysctl_unregister(in_dev->arp_parms);
1041 neigh_sysctl_register(dev, in_dev->arp_parms, NET_IPV4,
1042 NET_IPV4_NEIGH, "ipv4", NULL, NULL);
1043 devinet_sysctl_register(in_dev, &in_dev->cnf);
1051 static struct notifier_block ip_netdev_notifier = {
1052 .notifier_call =inetdev_event,
1055 static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
1056 u32 pid, u32 seq, int event, unsigned int flags)
1058 struct ifaddrmsg *ifm;
1059 struct nlmsghdr *nlh;
1060 unsigned char *b = skb->tail;
1062 nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags);
1063 ifm = NLMSG_DATA(nlh);
1064 ifm->ifa_family = AF_INET;
1065 ifm->ifa_prefixlen = ifa->ifa_prefixlen;
1066 ifm->ifa_flags = ifa->ifa_flags|IFA_F_PERMANENT;
1067 ifm->ifa_scope = ifa->ifa_scope;
1068 ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
1069 if (ifa->ifa_address)
1070 RTA_PUT(skb, IFA_ADDRESS, 4, &ifa->ifa_address);
1072 RTA_PUT(skb, IFA_LOCAL, 4, &ifa->ifa_local);
1073 if (ifa->ifa_broadcast)
1074 RTA_PUT(skb, IFA_BROADCAST, 4, &ifa->ifa_broadcast);
1075 if (ifa->ifa_anycast)
1076 RTA_PUT(skb, IFA_ANYCAST, 4, &ifa->ifa_anycast);
1077 if (ifa->ifa_label[0])
1078 RTA_PUT(skb, IFA_LABEL, IFNAMSIZ, &ifa->ifa_label);
1079 nlh->nlmsg_len = skb->tail - b;
1084 skb_trim(skb, b - skb->data);
1088 static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1091 struct net_device *dev;
1092 struct in_device *in_dev;
1093 struct in_ifaddr *ifa;
1094 int s_ip_idx, s_idx = cb->args[0];
1096 s_ip_idx = ip_idx = cb->args[1];
1097 read_lock(&dev_base_lock);
1098 for (dev = dev_base, idx = 0; dev; dev = dev->next, idx++) {
1104 if ((in_dev = __in_dev_get_rcu(dev)) == NULL) {
1109 for (ifa = in_dev->ifa_list, ip_idx = 0; ifa;
1110 ifa = ifa->ifa_next, ip_idx++) {
1111 if (ip_idx < s_ip_idx)
1113 if (inet_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid,
1115 RTM_NEWADDR, NLM_F_MULTI) <= 0) {
1124 read_unlock(&dev_base_lock);
1126 cb->args[1] = ip_idx;
1131 static void rtmsg_ifa(int event, struct in_ifaddr* ifa)
1133 int size = NLMSG_SPACE(sizeof(struct ifaddrmsg) + 128);
1134 struct sk_buff *skb = alloc_skb(size, GFP_KERNEL);
1137 netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, ENOBUFS);
1138 else if (inet_fill_ifaddr(skb, ifa, current->pid, 0, event, 0) < 0) {
1140 netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, EINVAL);
1142 netlink_broadcast(rtnl, skb, 0, RTNLGRP_IPV4_IFADDR, GFP_KERNEL);
1146 static struct rtnetlink_link inet_rtnetlink_table[RTM_NR_MSGTYPES] = {
1147 [RTM_NEWADDR - RTM_BASE] = { .doit = inet_rtm_newaddr, },
1148 [RTM_DELADDR - RTM_BASE] = { .doit = inet_rtm_deladdr, },
1149 [RTM_GETADDR - RTM_BASE] = { .dumpit = inet_dump_ifaddr, },
1150 [RTM_NEWROUTE - RTM_BASE] = { .doit = inet_rtm_newroute, },
1151 [RTM_DELROUTE - RTM_BASE] = { .doit = inet_rtm_delroute, },
1152 [RTM_GETROUTE - RTM_BASE] = { .doit = inet_rtm_getroute,
1153 .dumpit = inet_dump_fib, },
1154 #ifdef CONFIG_IP_MULTIPLE_TABLES
1155 [RTM_NEWRULE - RTM_BASE] = { .doit = inet_rtm_newrule, },
1156 [RTM_DELRULE - RTM_BASE] = { .doit = inet_rtm_delrule, },
1157 [RTM_GETRULE - RTM_BASE] = { .dumpit = inet_dump_rules, },
1161 #ifdef CONFIG_SYSCTL
1163 void inet_forward_change(void)
1165 struct net_device *dev;
1166 int on = ipv4_devconf.forwarding;
1168 ipv4_devconf.accept_redirects = !on;
1169 ipv4_devconf_dflt.forwarding = on;
1171 read_lock(&dev_base_lock);
1172 for (dev = dev_base; dev; dev = dev->next) {
1173 struct in_device *in_dev;
1175 in_dev = __in_dev_get_rcu(dev);
1177 in_dev->cnf.forwarding = on;
1180 read_unlock(&dev_base_lock);
1185 static int devinet_sysctl_forward(ctl_table *ctl, int write,
1186 struct file* filp, void __user *buffer,
1187 size_t *lenp, loff_t *ppos)
1189 int *valp = ctl->data;
1191 int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
1193 if (write && *valp != val) {
1194 if (valp == &ipv4_devconf.forwarding)
1195 inet_forward_change();
1196 else if (valp != &ipv4_devconf_dflt.forwarding)
1203 int ipv4_doint_and_flush(ctl_table *ctl, int write,
1204 struct file* filp, void __user *buffer,
1205 size_t *lenp, loff_t *ppos)
1207 int *valp = ctl->data;
1209 int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
1211 if (write && *valp != val)
1217 int ipv4_doint_and_flush_strategy(ctl_table *table, int __user *name, int nlen,
1218 void __user *oldval, size_t __user *oldlenp,
1219 void __user *newval, size_t newlen,
1222 int *valp = table->data;
1225 if (!newval || !newlen)
1228 if (newlen != sizeof(int))
1231 if (get_user(new, (int __user *)newval))
1237 if (oldval && oldlenp) {
1240 if (get_user(len, oldlenp))
1244 if (len > table->maxlen)
1245 len = table->maxlen;
1246 if (copy_to_user(oldval, valp, len))
1248 if (put_user(len, oldlenp))
1259 static struct devinet_sysctl_table {
1260 struct ctl_table_header *sysctl_header;
1261 ctl_table devinet_vars[__NET_IPV4_CONF_MAX];
1262 ctl_table devinet_dev[2];
1263 ctl_table devinet_conf_dir[2];
1264 ctl_table devinet_proto_dir[2];
1265 ctl_table devinet_root_dir[2];
1266 } devinet_sysctl = {
1269 .ctl_name = NET_IPV4_CONF_FORWARDING,
1270 .procname = "forwarding",
1271 .data = &ipv4_devconf.forwarding,
1272 .maxlen = sizeof(int),
1274 .proc_handler = &devinet_sysctl_forward,
1277 .ctl_name = NET_IPV4_CONF_MC_FORWARDING,
1278 .procname = "mc_forwarding",
1279 .data = &ipv4_devconf.mc_forwarding,
1280 .maxlen = sizeof(int),
1282 .proc_handler = &proc_dointvec,
1285 .ctl_name = NET_IPV4_CONF_ACCEPT_REDIRECTS,
1286 .procname = "accept_redirects",
1287 .data = &ipv4_devconf.accept_redirects,
1288 .maxlen = sizeof(int),
1290 .proc_handler = &proc_dointvec,
1293 .ctl_name = NET_IPV4_CONF_SECURE_REDIRECTS,
1294 .procname = "secure_redirects",
1295 .data = &ipv4_devconf.secure_redirects,
1296 .maxlen = sizeof(int),
1298 .proc_handler = &proc_dointvec,
1301 .ctl_name = NET_IPV4_CONF_SHARED_MEDIA,
1302 .procname = "shared_media",
1303 .data = &ipv4_devconf.shared_media,
1304 .maxlen = sizeof(int),
1306 .proc_handler = &proc_dointvec,
1309 .ctl_name = NET_IPV4_CONF_RP_FILTER,
1310 .procname = "rp_filter",
1311 .data = &ipv4_devconf.rp_filter,
1312 .maxlen = sizeof(int),
1314 .proc_handler = &proc_dointvec,
1317 .ctl_name = NET_IPV4_CONF_SEND_REDIRECTS,
1318 .procname = "send_redirects",
1319 .data = &ipv4_devconf.send_redirects,
1320 .maxlen = sizeof(int),
1322 .proc_handler = &proc_dointvec,
1325 .ctl_name = NET_IPV4_CONF_ACCEPT_SOURCE_ROUTE,
1326 .procname = "accept_source_route",
1327 .data = &ipv4_devconf.accept_source_route,
1328 .maxlen = sizeof(int),
1330 .proc_handler = &proc_dointvec,
1333 .ctl_name = NET_IPV4_CONF_PROXY_ARP,
1334 .procname = "proxy_arp",
1335 .data = &ipv4_devconf.proxy_arp,
1336 .maxlen = sizeof(int),
1338 .proc_handler = &proc_dointvec,
1341 .ctl_name = NET_IPV4_CONF_MEDIUM_ID,
1342 .procname = "medium_id",
1343 .data = &ipv4_devconf.medium_id,
1344 .maxlen = sizeof(int),
1346 .proc_handler = &proc_dointvec,
1349 .ctl_name = NET_IPV4_CONF_BOOTP_RELAY,
1350 .procname = "bootp_relay",
1351 .data = &ipv4_devconf.bootp_relay,
1352 .maxlen = sizeof(int),
1354 .proc_handler = &proc_dointvec,
1357 .ctl_name = NET_IPV4_CONF_LOG_MARTIANS,
1358 .procname = "log_martians",
1359 .data = &ipv4_devconf.log_martians,
1360 .maxlen = sizeof(int),
1362 .proc_handler = &proc_dointvec,
1365 .ctl_name = NET_IPV4_CONF_TAG,
1367 .data = &ipv4_devconf.tag,
1368 .maxlen = sizeof(int),
1370 .proc_handler = &proc_dointvec,
1373 .ctl_name = NET_IPV4_CONF_ARPFILTER,
1374 .procname = "arp_filter",
1375 .data = &ipv4_devconf.arp_filter,
1376 .maxlen = sizeof(int),
1378 .proc_handler = &proc_dointvec,
1381 .ctl_name = NET_IPV4_CONF_ARP_ANNOUNCE,
1382 .procname = "arp_announce",
1383 .data = &ipv4_devconf.arp_announce,
1384 .maxlen = sizeof(int),
1386 .proc_handler = &proc_dointvec,
1389 .ctl_name = NET_IPV4_CONF_ARP_IGNORE,
1390 .procname = "arp_ignore",
1391 .data = &ipv4_devconf.arp_ignore,
1392 .maxlen = sizeof(int),
1394 .proc_handler = &proc_dointvec,
1397 .ctl_name = NET_IPV4_CONF_NOXFRM,
1398 .procname = "disable_xfrm",
1399 .data = &ipv4_devconf.no_xfrm,
1400 .maxlen = sizeof(int),
1402 .proc_handler = &ipv4_doint_and_flush,
1403 .strategy = &ipv4_doint_and_flush_strategy,
1406 .ctl_name = NET_IPV4_CONF_NOPOLICY,
1407 .procname = "disable_policy",
1408 .data = &ipv4_devconf.no_policy,
1409 .maxlen = sizeof(int),
1411 .proc_handler = &ipv4_doint_and_flush,
1412 .strategy = &ipv4_doint_and_flush_strategy,
1415 .ctl_name = NET_IPV4_CONF_FORCE_IGMP_VERSION,
1416 .procname = "force_igmp_version",
1417 .data = &ipv4_devconf.force_igmp_version,
1418 .maxlen = sizeof(int),
1420 .proc_handler = &ipv4_doint_and_flush,
1421 .strategy = &ipv4_doint_and_flush_strategy,
1424 .ctl_name = NET_IPV4_CONF_PROMOTE_SECONDARIES,
1425 .procname = "promote_secondaries",
1426 .data = &ipv4_devconf.promote_secondaries,
1427 .maxlen = sizeof(int),
1429 .proc_handler = &ipv4_doint_and_flush,
1430 .strategy = &ipv4_doint_and_flush_strategy,
1435 .ctl_name = NET_PROTO_CONF_ALL,
1438 .child = devinet_sysctl.devinet_vars,
1441 .devinet_conf_dir = {
1443 .ctl_name = NET_IPV4_CONF,
1446 .child = devinet_sysctl.devinet_dev,
1449 .devinet_proto_dir = {
1451 .ctl_name = NET_IPV4,
1454 .child = devinet_sysctl.devinet_conf_dir,
1457 .devinet_root_dir = {
1459 .ctl_name = CTL_NET,
1462 .child = devinet_sysctl.devinet_proto_dir,
1467 static void devinet_sysctl_register(struct in_device *in_dev,
1468 struct ipv4_devconf *p)
1471 struct net_device *dev = in_dev ? in_dev->dev : NULL;
1472 struct devinet_sysctl_table *t = kmalloc(sizeof(*t), GFP_KERNEL);
1473 char *dev_name = NULL;
1477 memcpy(t, &devinet_sysctl, sizeof(*t));
1478 for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
1479 t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
1480 t->devinet_vars[i].de = NULL;
1484 dev_name = dev->name;
1485 t->devinet_dev[0].ctl_name = dev->ifindex;
1487 dev_name = "default";
1488 t->devinet_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
1492 * Make a copy of dev_name, because '.procname' is regarded as const
1493 * by sysctl and we wouldn't want anyone to change it under our feet
1494 * (see SIOCSIFNAME).
1496 dev_name = kstrdup(dev_name, GFP_KERNEL);
1500 t->devinet_dev[0].procname = dev_name;
1501 t->devinet_dev[0].child = t->devinet_vars;
1502 t->devinet_dev[0].de = NULL;
1503 t->devinet_conf_dir[0].child = t->devinet_dev;
1504 t->devinet_conf_dir[0].de = NULL;
1505 t->devinet_proto_dir[0].child = t->devinet_conf_dir;
1506 t->devinet_proto_dir[0].de = NULL;
1507 t->devinet_root_dir[0].child = t->devinet_proto_dir;
1508 t->devinet_root_dir[0].de = NULL;
1510 t->sysctl_header = register_sysctl_table(t->devinet_root_dir, 0);
1511 if (!t->sysctl_header)
1525 static void devinet_sysctl_unregister(struct ipv4_devconf *p)
1528 struct devinet_sysctl_table *t = p->sysctl;
1530 unregister_sysctl_table(t->sysctl_header);
1531 kfree(t->devinet_dev[0].procname);
1537 void __init devinet_init(void)
1539 register_gifconf(PF_INET, inet_gifconf);
1540 register_netdevice_notifier(&ip_netdev_notifier);
1541 rtnetlink_links[PF_INET] = inet_rtnetlink_table;
1542 #ifdef CONFIG_SYSCTL
1543 devinet_sysctl.sysctl_header =
1544 register_sysctl_table(devinet_sysctl.devinet_root_dir, 0);
1545 devinet_sysctl_register(NULL, &ipv4_devconf_dflt);
1549 EXPORT_SYMBOL(devinet_ioctl);
1550 EXPORT_SYMBOL(in_dev_finish_destroy);
1551 EXPORT_SYMBOL(inet_select_addr);
1552 EXPORT_SYMBOL(inetdev_by_index);
1553 EXPORT_SYMBOL(register_inetaddr_notifier);
1554 EXPORT_SYMBOL(unregister_inetaddr_notifier);