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
12 * Authors: Ross Biro, <bir7@leland.Stanford.Edu>
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 <asm/bitops.h>
35 #include <linux/module.h>
36 #include <linux/types.h>
37 #include <linux/kernel.h>
38 #include <linux/sched.h>
39 #include <linux/string.h>
41 #include <linux/socket.h>
42 #include <linux/sockios.h>
44 #include <linux/errno.h>
45 #include <linux/interrupt.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/rtnetlink.h>
52 #include <linux/init.h>
53 #include <linux/notifier.h>
54 #include <linux/inetdevice.h>
55 #include <linux/igmp.h>
57 #include <linux/sysctl.h>
59 #include <linux/kmod.h>
62 #include <net/route.h>
63 #include <net/ip_fib.h>
65 struct ipv4_devconf ipv4_devconf = {
66 .accept_redirects = 1,
68 .secure_redirects = 1,
72 static struct ipv4_devconf ipv4_devconf_dflt = {
73 .accept_redirects = 1,
75 .secure_redirects = 1,
77 .accept_source_route = 1,
80 static void rtmsg_ifa(int event, struct in_ifaddr *);
82 static struct notifier_block *inetaddr_chain;
83 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
86 static void devinet_sysctl_register(struct in_device *in_dev,
87 struct ipv4_devconf *p);
88 static void devinet_sysctl_unregister(struct ipv4_devconf *p);
94 /* Locks all the inet devices. */
96 rwlock_t inetdev_lock = RW_LOCK_UNLOCKED;
98 static struct in_ifaddr *inet_alloc_ifa(void)
100 struct in_ifaddr *ifa = kmalloc(sizeof(*ifa), GFP_KERNEL);
103 memset(ifa, 0, sizeof(*ifa));
110 static __inline__ void inet_free_ifa(struct in_ifaddr *ifa)
113 __in_dev_put(ifa->ifa_dev);
118 void in_dev_finish_destroy(struct in_device *idev)
120 struct net_device *dev = idev->dev;
122 BUG_TRAP(!idev->ifa_list);
123 BUG_TRAP(!idev->mc_list);
124 #ifdef NET_REFCNT_DEBUG
125 printk(KERN_DEBUG "in_dev_finish_destroy: %p=%s\n",
126 idev, dev ? dev->name : "NIL");
130 printk("Freeing alive in_device %p\n", idev);
137 struct in_device *inetdev_init(struct net_device *dev)
139 struct in_device *in_dev;
143 in_dev = kmalloc(sizeof(*in_dev), GFP_KERNEL);
146 memset(in_dev, 0, sizeof(*in_dev));
147 in_dev->lock = RW_LOCK_UNLOCKED;
148 memcpy(&in_dev->cnf, &ipv4_devconf_dflt, sizeof(in_dev->cnf));
149 in_dev->cnf.sysctl = NULL;
151 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);
160 write_lock_bh(&inetdev_lock);
161 dev->ip_ptr = in_dev;
162 /* Account for reference dev->ip_ptr */
164 write_unlock_bh(&inetdev_lock);
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 inetdev_destroy(struct in_device *in_dev)
181 struct in_ifaddr *ifa;
187 ip_mc_destroy_dev(in_dev);
189 while ((ifa = in_dev->ifa_list) != NULL) {
190 inet_del_ifa(in_dev, &in_dev->ifa_list, 0);
195 devinet_sysctl_unregister(&in_dev->cnf);
197 write_lock_bh(&inetdev_lock);
198 in_dev->dev->ip_ptr = NULL;
199 /* in_dev_put following below will kill the in_device */
200 write_unlock_bh(&inetdev_lock);
203 neigh_sysctl_unregister(in_dev->arp_parms);
205 neigh_parms_release(&arp_tbl, in_dev->arp_parms);
209 int inet_addr_onlink(struct in_device *in_dev, u32 a, u32 b)
211 read_lock(&in_dev->lock);
212 for_primary_ifa(in_dev) {
213 if (inet_ifa_match(a, ifa)) {
214 if (!b || inet_ifa_match(b, ifa)) {
215 read_unlock(&in_dev->lock);
219 } endfor_ifa(in_dev);
220 read_unlock(&in_dev->lock);
224 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
227 struct in_ifaddr *ifa1 = *ifap;
231 /* 1. Deleting primary ifaddr forces deletion all secondaries */
233 if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
234 struct in_ifaddr *ifa;
235 struct in_ifaddr **ifap1 = &ifa1->ifa_next;
237 while ((ifa = *ifap1) != NULL) {
238 if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
239 ifa1->ifa_mask != ifa->ifa_mask ||
240 !inet_ifa_match(ifa1->ifa_address, ifa)) {
241 ifap1 = &ifa->ifa_next;
244 write_lock_bh(&in_dev->lock);
245 *ifap1 = ifa->ifa_next;
246 write_unlock_bh(&in_dev->lock);
248 rtmsg_ifa(RTM_DELADDR, ifa);
249 notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa);
256 write_lock_bh(&in_dev->lock);
257 *ifap = ifa1->ifa_next;
258 write_unlock_bh(&in_dev->lock);
260 /* 3. Announce address deletion */
262 /* Send message first, then call notifier.
263 At first sight, FIB update triggered by notifier
264 will refer to already deleted ifaddr, that could confuse
265 netlink listeners. It is not true: look, gated sees
266 that route deleted and if it still thinks that ifaddr
267 is valid, it will try to restore deleted routes... Grr.
268 So that, this order is correct.
270 rtmsg_ifa(RTM_DELADDR, ifa1);
271 notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
275 if (!in_dev->ifa_list)
276 inetdev_destroy(in_dev);
280 static int inet_insert_ifa(struct in_ifaddr *ifa)
282 struct in_device *in_dev = ifa->ifa_dev;
283 struct in_ifaddr *ifa1, **ifap, **last_primary;
287 if (!ifa->ifa_local) {
292 ifa->ifa_flags &= ~IFA_F_SECONDARY;
293 last_primary = &in_dev->ifa_list;
295 for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL;
296 ifap = &ifa1->ifa_next) {
297 if (!(ifa1->ifa_flags & IFA_F_SECONDARY) &&
298 ifa->ifa_scope <= ifa1->ifa_scope)
299 last_primary = &ifa1->ifa_next;
300 if (ifa1->ifa_mask == ifa->ifa_mask &&
301 inet_ifa_match(ifa1->ifa_address, ifa)) {
302 if (ifa1->ifa_local == ifa->ifa_local) {
306 if (ifa1->ifa_scope != ifa->ifa_scope) {
310 ifa->ifa_flags |= IFA_F_SECONDARY;
314 if (!(ifa->ifa_flags & IFA_F_SECONDARY)) {
315 net_srandom(ifa->ifa_local);
319 ifa->ifa_next = *ifap;
320 write_lock_bh(&in_dev->lock);
322 write_unlock_bh(&in_dev->lock);
324 /* Send message first, then call notifier.
325 Notifier will trigger FIB update, so that
326 listeners of netlink will know about new ifaddr */
327 rtmsg_ifa(RTM_NEWADDR, ifa);
328 notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
333 static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
335 struct in_device *in_dev = __in_dev_get(dev);
340 in_dev = inetdev_init(dev);
346 if (ifa->ifa_dev != in_dev) {
347 BUG_TRAP(!ifa->ifa_dev);
349 ifa->ifa_dev = in_dev;
351 if (LOOPBACK(ifa->ifa_local))
352 ifa->ifa_scope = RT_SCOPE_HOST;
353 return inet_insert_ifa(ifa);
356 struct in_device *inetdev_by_index(int ifindex)
358 struct net_device *dev;
359 struct in_device *in_dev = NULL;
360 read_lock(&dev_base_lock);
361 dev = __dev_get_by_index(ifindex);
363 in_dev = in_dev_get(dev);
364 read_unlock(&dev_base_lock);
368 /* Called only from RTNL semaphored context. No locks. */
370 struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, u32 prefix,
375 for_primary_ifa(in_dev) {
376 if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
378 } endfor_ifa(in_dev);
382 int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
384 struct rtattr **rta = arg;
385 struct in_device *in_dev;
386 struct ifaddrmsg *ifm = NLMSG_DATA(nlh);
387 struct in_ifaddr *ifa, **ifap;
391 if ((in_dev = inetdev_by_index(ifm->ifa_index)) == NULL)
393 __in_dev_put(in_dev);
395 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
396 ifap = &ifa->ifa_next) {
397 if ((rta[IFA_LOCAL - 1] &&
398 memcmp(RTA_DATA(rta[IFA_LOCAL - 1]),
399 &ifa->ifa_local, 4)) ||
400 (rta[IFA_LABEL - 1] &&
401 strcmp(RTA_DATA(rta[IFA_LABEL - 1]), ifa->ifa_label)) ||
402 (rta[IFA_ADDRESS - 1] &&
403 (ifm->ifa_prefixlen != ifa->ifa_prefixlen ||
404 !inet_ifa_match(*(u32*)RTA_DATA(rta[IFA_ADDRESS - 1]),
407 inet_del_ifa(in_dev, ifap, 1);
411 return -EADDRNOTAVAIL;
414 int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
416 struct rtattr **rta = arg;
417 struct net_device *dev;
418 struct in_device *in_dev;
419 struct ifaddrmsg *ifm = NLMSG_DATA(nlh);
420 struct in_ifaddr *ifa;
425 if (ifm->ifa_prefixlen > 32 || !rta[IFA_LOCAL - 1])
429 if ((dev = __dev_get_by_index(ifm->ifa_index)) == NULL)
433 if ((in_dev = __in_dev_get(dev)) == NULL) {
434 in_dev = inetdev_init(dev);
439 if ((ifa = inet_alloc_ifa()) == NULL)
442 if (!rta[IFA_ADDRESS - 1])
443 rta[IFA_ADDRESS - 1] = rta[IFA_LOCAL - 1];
444 memcpy(&ifa->ifa_local, RTA_DATA(rta[IFA_LOCAL - 1]), 4);
445 memcpy(&ifa->ifa_address, RTA_DATA(rta[IFA_ADDRESS - 1]), 4);
446 ifa->ifa_prefixlen = ifm->ifa_prefixlen;
447 ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
448 if (rta[IFA_BROADCAST - 1])
449 memcpy(&ifa->ifa_broadcast,
450 RTA_DATA(rta[IFA_BROADCAST - 1]), 4);
451 if (rta[IFA_ANYCAST - 1])
452 memcpy(&ifa->ifa_anycast, RTA_DATA(rta[IFA_ANYCAST - 1]), 4);
453 ifa->ifa_flags = ifm->ifa_flags;
454 ifa->ifa_scope = ifm->ifa_scope;
456 ifa->ifa_dev = in_dev;
457 if (rta[IFA_LABEL - 1])
458 memcpy(ifa->ifa_label, RTA_DATA(rta[IFA_LABEL - 1]), IFNAMSIZ);
460 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
462 rc = inet_insert_ifa(ifa);
468 * Determine a default network mask, based on the IP address.
471 static __inline__ int inet_abc_len(u32 addr)
473 int rc = -1; /* Something else, probably a multicast. */
482 else if (IN_CLASSB(addr))
484 else if (IN_CLASSC(addr))
492 Check that a device is not member of the ipv4root assigned to the process
493 Return true if this is the case
495 If the process is not bound to specific IP, then it returns 0 (all
498 static inline int devinet_notiproot (struct in_ifaddr *ifa)
503 if ((nxi = current->nx_info)) {
505 int nbip = nxi->nbipv4;
506 __u32 addr = ifa->ifa_local;
508 for (i=0; i<nbip; i++) {
509 if(nxi->ipv4[i] == addr) {
519 int devinet_ioctl(unsigned int cmd, void __user *arg)
522 struct sockaddr_in sin_orig;
523 struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
524 struct in_device *in_dev;
525 struct in_ifaddr **ifap = NULL;
526 struct in_ifaddr *ifa = NULL;
527 struct net_device *dev;
530 int tryaddrmatch = 0;
533 * Fetch the caller's info block into kernel space
536 if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
538 ifr.ifr_name[IFNAMSIZ - 1] = 0;
540 /* save original address for comparison */
541 memcpy(&sin_orig, sin, sizeof(*sin));
543 colon = strchr(ifr.ifr_name, ':');
548 dev_load(ifr.ifr_name);
552 case SIOCGIFADDR: /* Get interface address */
553 case SIOCGIFBRDADDR: /* Get the broadcast address */
554 case SIOCGIFDSTADDR: /* Get the destination address */
555 case SIOCGIFNETMASK: /* Get the netmask for the interface */
556 /* Note that these ioctls will not sleep,
557 so that we do not impose a lock.
558 One day we will be forced to put shlock here (I mean SMP)
560 tryaddrmatch = (sin_orig.sin_family == AF_INET);
561 memset(sin, 0, sizeof(*sin));
562 sin->sin_family = AF_INET;
567 if (!capable(CAP_NET_ADMIN))
570 case SIOCSIFADDR: /* Set interface address (and family) */
571 case SIOCSIFBRDADDR: /* Set the broadcast address */
572 case SIOCSIFDSTADDR: /* Set the destination address */
573 case SIOCSIFNETMASK: /* Set the netmask for the interface */
575 if (!capable(CAP_NET_ADMIN))
578 if (sin->sin_family != AF_INET)
589 if ((dev = __dev_get_by_name(ifr.ifr_name)) == NULL)
595 if ((in_dev = __in_dev_get(dev)) != NULL) {
597 /* Matthias Andree */
598 /* compare label and address (4.4BSD style) */
599 /* note: we only do this for a limited set of ioctls
600 and only if the original address family was AF_INET.
601 This is checked above. */
602 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
603 ifap = &ifa->ifa_next) {
604 if (!strcmp(ifr.ifr_name, ifa->ifa_label) &&
605 sin_orig.sin_addr.s_addr ==
611 /* we didn't get a match, maybe the application is
612 4.3BSD-style and passed in junk so we fall back to
613 comparing just the label */
615 for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
616 ifap = &ifa->ifa_next)
617 if (!strcmp(ifr.ifr_name, ifa->ifa_label))
622 ret = -EADDRNOTAVAIL;
623 if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
625 if (!ifa_in_nx_info(ifa, current->nx_info))
629 case SIOCGIFADDR: /* Get interface address */
630 sin->sin_addr.s_addr = ifa->ifa_local;
633 case SIOCGIFBRDADDR: /* Get the broadcast address */
634 sin->sin_addr.s_addr = ifa->ifa_broadcast;
637 case SIOCGIFDSTADDR: /* Get the destination address */
638 sin->sin_addr.s_addr = ifa->ifa_address;
641 case SIOCGIFNETMASK: /* Get the netmask for the interface */
642 sin->sin_addr.s_addr = ifa->ifa_mask;
647 ret = -EADDRNOTAVAIL;
651 if (!(ifr.ifr_flags & IFF_UP))
652 inet_del_ifa(in_dev, ifap, 1);
655 ret = dev_change_flags(dev, ifr.ifr_flags);
658 case SIOCSIFADDR: /* Set interface address (and family) */
660 if (inet_abc_len(sin->sin_addr.s_addr) < 0)
665 if ((ifa = inet_alloc_ifa()) == NULL)
668 memcpy(ifa->ifa_label, ifr.ifr_name, IFNAMSIZ);
670 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
673 if (ifa->ifa_local == sin->sin_addr.s_addr)
675 inet_del_ifa(in_dev, ifap, 0);
676 ifa->ifa_broadcast = 0;
677 ifa->ifa_anycast = 0;
680 ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;
682 if (!(dev->flags & IFF_POINTOPOINT)) {
683 ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
684 ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
685 if ((dev->flags & IFF_BROADCAST) &&
686 ifa->ifa_prefixlen < 31)
687 ifa->ifa_broadcast = ifa->ifa_address |
690 ifa->ifa_prefixlen = 32;
691 ifa->ifa_mask = inet_make_mask(32);
693 ret = inet_set_ifa(dev, ifa);
696 case SIOCSIFBRDADDR: /* Set the broadcast address */
698 if (ifa->ifa_broadcast != sin->sin_addr.s_addr) {
699 inet_del_ifa(in_dev, ifap, 0);
700 ifa->ifa_broadcast = sin->sin_addr.s_addr;
701 inet_insert_ifa(ifa);
705 case SIOCSIFDSTADDR: /* Set the destination address */
707 if (ifa->ifa_address == sin->sin_addr.s_addr)
710 if (inet_abc_len(sin->sin_addr.s_addr) < 0)
713 inet_del_ifa(in_dev, ifap, 0);
714 ifa->ifa_address = sin->sin_addr.s_addr;
715 inet_insert_ifa(ifa);
718 case SIOCSIFNETMASK: /* Set the netmask for the interface */
721 * The mask we set must be legal.
724 if (bad_mask(sin->sin_addr.s_addr, 0))
727 if (ifa->ifa_mask != sin->sin_addr.s_addr) {
728 inet_del_ifa(in_dev, ifap, 0);
729 ifa->ifa_mask = sin->sin_addr.s_addr;
730 ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
732 /* See if current broadcast address matches
733 * with current netmask, then recalculate
734 * the broadcast address. Otherwise it's a
735 * funny address, so don't touch it since
736 * the user seems to know what (s)he's doing...
738 if ((dev->flags & IFF_BROADCAST) &&
739 (ifa->ifa_prefixlen < 31) &&
740 (ifa->ifa_broadcast ==
741 (ifa->ifa_local|~ifa->ifa_mask))) {
742 ifa->ifa_broadcast = (ifa->ifa_local |
743 ~sin->sin_addr.s_addr);
745 inet_insert_ifa(ifa);
755 ret = copy_to_user(arg, &ifr, sizeof(struct ifreq)) ? -EFAULT : 0;
759 static int inet_gifconf(struct net_device *dev, char __user *buf, int len)
761 struct in_device *in_dev = __in_dev_get(dev);
762 struct in_ifaddr *ifa;
766 if (!in_dev || (ifa = in_dev->ifa_list) == NULL)
769 for (; ifa; ifa = ifa->ifa_next) {
770 if (!ifa_in_nx_info(ifa, current->nx_info))
776 if (len < (int) sizeof(ifr))
778 memset(&ifr, 0, sizeof(struct ifreq));
780 strcpy(ifr.ifr_name, ifa->ifa_label);
782 strcpy(ifr.ifr_name, dev->name);
784 (*(struct sockaddr_in *)&ifr.ifr_addr).sin_family = AF_INET;
785 (*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr =
788 if (copy_to_user(buf, &ifr, sizeof(struct ifreq))) {
792 buf += sizeof(struct ifreq);
793 len -= sizeof(struct ifreq);
794 done += sizeof(struct ifreq);
800 u32 inet_select_addr(const struct net_device *dev, u32 dst, int scope)
803 struct in_device *in_dev;
805 read_lock(&inetdev_lock);
806 in_dev = __in_dev_get(dev);
808 goto out_unlock_inetdev;
810 read_lock(&in_dev->lock);
811 for_primary_ifa(in_dev) {
812 if (ifa->ifa_scope > scope)
814 if (!dst || inet_ifa_match(dst, ifa)) {
815 addr = ifa->ifa_local;
819 addr = ifa->ifa_local;
820 } endfor_ifa(in_dev);
821 read_unlock(&in_dev->lock);
822 read_unlock(&inetdev_lock);
827 /* Not loopback addresses on loopback should be preferred
828 in this case. It is importnat that lo is the first interface
831 read_lock(&dev_base_lock);
832 read_lock(&inetdev_lock);
833 for (dev = dev_base; dev; dev = dev->next) {
834 if ((in_dev = __in_dev_get(dev)) == NULL)
837 read_lock(&in_dev->lock);
838 for_primary_ifa(in_dev) {
839 if (ifa->ifa_scope != RT_SCOPE_LINK &&
840 ifa->ifa_scope <= scope) {
841 read_unlock(&in_dev->lock);
842 addr = ifa->ifa_local;
843 goto out_unlock_both;
845 } endfor_ifa(in_dev);
846 read_unlock(&in_dev->lock);
849 read_unlock(&inetdev_lock);
850 read_unlock(&dev_base_lock);
854 read_unlock(&inetdev_lock);
858 static u32 confirm_addr_indev(struct in_device *in_dev, u32 dst,
859 u32 local, int scope)
866 (local == ifa->ifa_local || !local) &&
867 ifa->ifa_scope <= scope) {
868 addr = ifa->ifa_local;
873 same = (!local || inet_ifa_match(local, ifa)) &&
874 (!dst || inet_ifa_match(dst, ifa));
878 /* Is the selected addr into dst subnet? */
879 if (inet_ifa_match(addr, ifa))
881 /* No, then can we use new local src? */
882 if (ifa->ifa_scope <= scope) {
883 addr = ifa->ifa_local;
886 /* search for large dst subnet for addr */
890 } endfor_ifa(in_dev);
892 return same? addr : 0;
896 * Confirm that local IP address exists using wildcards:
897 * - dev: only on this interface, 0=any interface
898 * - dst: only in the same subnet as dst, 0=any dst
899 * - local: address, 0=autoselect the local address
900 * - scope: maximum allowed scope value for the local address
902 u32 inet_confirm_addr(const struct net_device *dev, u32 dst, u32 local, int scope)
905 struct in_device *in_dev;
908 read_lock(&inetdev_lock);
909 if ((in_dev = __in_dev_get(dev))) {
910 read_lock(&in_dev->lock);
911 addr = confirm_addr_indev(in_dev, dst, local, scope);
912 read_unlock(&in_dev->lock);
914 read_unlock(&inetdev_lock);
919 read_lock(&dev_base_lock);
920 read_lock(&inetdev_lock);
921 for (dev = dev_base; dev; dev = dev->next) {
922 if ((in_dev = __in_dev_get(dev))) {
923 read_lock(&in_dev->lock);
924 addr = confirm_addr_indev(in_dev, dst, local, scope);
925 read_unlock(&in_dev->lock);
930 read_unlock(&inetdev_lock);
931 read_unlock(&dev_base_lock);
940 int register_inetaddr_notifier(struct notifier_block *nb)
942 return notifier_chain_register(&inetaddr_chain, nb);
945 int unregister_inetaddr_notifier(struct notifier_block *nb)
947 return notifier_chain_unregister(&inetaddr_chain, nb);
950 /* Rename ifa_labels for a device name change. Make some effort to preserve existing
951 * alias numbering and to create unique labels if possible.
953 static void inetdev_changename(struct net_device *dev, struct in_device *in_dev)
955 struct in_ifaddr *ifa;
958 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
959 char old[IFNAMSIZ], *dot;
961 memcpy(old, ifa->ifa_label, IFNAMSIZ);
962 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
965 dot = strchr(ifa->ifa_label, ':');
967 sprintf(old, ":%d", named);
970 if (strlen(dot) + strlen(dev->name) < IFNAMSIZ) {
971 strcat(ifa->ifa_label, dot);
973 strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
978 /* Called only under RTNL semaphore */
980 static int inetdev_event(struct notifier_block *this, unsigned long event,
983 struct net_device *dev = ptr;
984 struct in_device *in_dev = __in_dev_get(dev);
992 case NETDEV_REGISTER:
993 printk(KERN_DEBUG "inetdev_event: bug\n");
999 if (dev == &loopback_dev) {
1000 struct in_ifaddr *ifa;
1001 if ((ifa = inet_alloc_ifa()) != NULL) {
1003 ifa->ifa_address = htonl(INADDR_LOOPBACK);
1004 ifa->ifa_prefixlen = 8;
1005 ifa->ifa_mask = inet_make_mask(8);
1006 in_dev_hold(in_dev);
1007 ifa->ifa_dev = in_dev;
1008 ifa->ifa_scope = RT_SCOPE_HOST;
1009 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1010 inet_insert_ifa(ifa);
1012 in_dev->cnf.no_xfrm = 1;
1013 in_dev->cnf.no_policy = 1;
1020 case NETDEV_CHANGEMTU:
1023 /* MTU falled under 68, disable IP */
1024 case NETDEV_UNREGISTER:
1025 inetdev_destroy(in_dev);
1027 case NETDEV_CHANGENAME:
1028 /* Do not notify about label change, this event is
1029 * not interesting to applications using netlink.
1031 inetdev_changename(dev, in_dev);
1033 #ifdef CONFIG_SYSCTL
1034 devinet_sysctl_unregister(&in_dev->cnf);
1035 neigh_sysctl_unregister(in_dev->arp_parms);
1036 neigh_sysctl_register(dev, in_dev->arp_parms, NET_IPV4,
1037 NET_IPV4_NEIGH, "ipv4", NULL);
1038 devinet_sysctl_register(in_dev, &in_dev->cnf);
1046 static struct notifier_block ip_netdev_notifier = {
1047 .notifier_call =inetdev_event,
1050 static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
1051 u32 pid, u32 seq, int event)
1053 struct ifaddrmsg *ifm;
1054 struct nlmsghdr *nlh;
1055 unsigned char *b = skb->tail;
1057 nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
1058 if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
1059 ifm = NLMSG_DATA(nlh);
1060 ifm->ifa_family = AF_INET;
1061 ifm->ifa_prefixlen = ifa->ifa_prefixlen;
1062 ifm->ifa_flags = ifa->ifa_flags|IFA_F_PERMANENT;
1063 ifm->ifa_scope = ifa->ifa_scope;
1064 ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
1065 if (ifa->ifa_address)
1066 RTA_PUT(skb, IFA_ADDRESS, 4, &ifa->ifa_address);
1068 RTA_PUT(skb, IFA_LOCAL, 4, &ifa->ifa_local);
1069 if (ifa->ifa_broadcast)
1070 RTA_PUT(skb, IFA_BROADCAST, 4, &ifa->ifa_broadcast);
1071 if (ifa->ifa_anycast)
1072 RTA_PUT(skb, IFA_ANYCAST, 4, &ifa->ifa_anycast);
1073 if (ifa->ifa_label[0])
1074 RTA_PUT(skb, IFA_LABEL, IFNAMSIZ, &ifa->ifa_label);
1075 nlh->nlmsg_len = skb->tail - b;
1080 skb_trim(skb, b - skb->data);
1084 static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1087 struct net_device *dev;
1088 struct in_device *in_dev;
1089 struct in_ifaddr *ifa;
1090 int s_ip_idx, s_idx = cb->args[0];
1092 s_ip_idx = ip_idx = cb->args[1];
1093 read_lock(&dev_base_lock);
1094 for (dev = dev_base, idx = 0; dev; dev = dev->next, idx++) {
1099 read_lock(&inetdev_lock);
1100 if ((in_dev = __in_dev_get(dev)) == NULL) {
1101 read_unlock(&inetdev_lock);
1104 read_lock(&in_dev->lock);
1105 for (ifa = in_dev->ifa_list, ip_idx = 0; ifa;
1106 ifa = ifa->ifa_next, ip_idx++) {
1107 if (!ifa_in_nx_info(ifa, current->nx_info))
1109 if (ip_idx < s_ip_idx)
1111 if (inet_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid,
1113 RTM_NEWADDR) <= 0) {
1114 read_unlock(&in_dev->lock);
1115 read_unlock(&inetdev_lock);
1119 read_unlock(&in_dev->lock);
1120 read_unlock(&inetdev_lock);
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, RTMGRP_IPV4_IFADDR, ENOBUFS);
1138 else if (inet_fill_ifaddr(skb, ifa, 0, 0, event) < 0) {
1140 netlink_set_err(rtnl, 0, RTMGRP_IPV4_IFADDR, EINVAL);
1142 NETLINK_CB(skb).dst_groups = RTMGRP_IPV4_IFADDR;
1143 netlink_broadcast(rtnl, skb, 0, RTMGRP_IPV4_IFADDR, GFP_KERNEL);
1147 static struct rtnetlink_link inet_rtnetlink_table[RTM_MAX - RTM_BASE + 1] = {
1148 [4] = { .doit = inet_rtm_newaddr, },
1149 [5] = { .doit = inet_rtm_deladdr, },
1150 [6] = { .dumpit = inet_dump_ifaddr, },
1151 [8] = { .doit = inet_rtm_newroute, },
1152 [9] = { .doit = inet_rtm_delroute, },
1153 [10] = { .doit = inet_rtm_getroute, .dumpit = inet_dump_fib, },
1154 #ifdef CONFIG_IP_MULTIPLE_TABLES
1155 [16] = { .doit = inet_rtm_newrule, },
1156 [17] = { .doit = inet_rtm_delrule, },
1157 [18] = { .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;
1174 read_lock(&inetdev_lock);
1175 in_dev = __in_dev_get(dev);
1177 in_dev->cnf.forwarding = on;
1178 read_unlock(&inetdev_lock);
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[20];
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,
1426 .ctl_name = NET_PROTO_CONF_ALL,
1429 .child = devinet_sysctl.devinet_vars,
1432 .devinet_conf_dir = {
1434 .ctl_name = NET_IPV4_CONF,
1437 .child = devinet_sysctl.devinet_dev,
1440 .devinet_proto_dir = {
1442 .ctl_name = NET_IPV4,
1445 .child = devinet_sysctl.devinet_conf_dir,
1448 .devinet_root_dir = {
1450 .ctl_name = CTL_NET,
1453 .child = devinet_sysctl.devinet_proto_dir,
1458 static void devinet_sysctl_register(struct in_device *in_dev,
1459 struct ipv4_devconf *p)
1462 struct net_device *dev = in_dev ? in_dev->dev : NULL;
1463 struct devinet_sysctl_table *t = kmalloc(sizeof(*t), GFP_KERNEL);
1464 char *dev_name = NULL;
1468 memcpy(t, &devinet_sysctl, sizeof(*t));
1469 for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
1470 t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
1471 t->devinet_vars[i].de = NULL;
1475 dev_name = dev->name;
1476 t->devinet_dev[0].ctl_name = dev->ifindex;
1478 dev_name = "default";
1479 t->devinet_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
1483 * Make a copy of dev_name, because '.procname' is regarded as const
1484 * by sysctl and we wouldn't want anyone to change it under our feet
1485 * (see SIOCSIFNAME).
1487 dev_name = net_sysctl_strdup(dev_name);
1491 t->devinet_dev[0].procname = dev_name;
1492 t->devinet_dev[0].child = t->devinet_vars;
1493 t->devinet_dev[0].de = NULL;
1494 t->devinet_conf_dir[0].child = t->devinet_dev;
1495 t->devinet_conf_dir[0].de = NULL;
1496 t->devinet_proto_dir[0].child = t->devinet_conf_dir;
1497 t->devinet_proto_dir[0].de = NULL;
1498 t->devinet_root_dir[0].child = t->devinet_proto_dir;
1499 t->devinet_root_dir[0].de = NULL;
1501 t->sysctl_header = register_sysctl_table(t->devinet_root_dir, 0);
1502 if (!t->sysctl_header)
1516 static void devinet_sysctl_unregister(struct ipv4_devconf *p)
1519 struct devinet_sysctl_table *t = p->sysctl;
1521 unregister_sysctl_table(t->sysctl_header);
1522 kfree(t->devinet_dev[0].procname);
1528 void __init devinet_init(void)
1530 register_gifconf(PF_INET, inet_gifconf);
1531 register_netdevice_notifier(&ip_netdev_notifier);
1532 rtnetlink_links[PF_INET] = inet_rtnetlink_table;
1533 #ifdef CONFIG_SYSCTL
1534 devinet_sysctl.sysctl_header =
1535 register_sysctl_table(devinet_sysctl.devinet_root_dir, 0);
1536 devinet_sysctl_register(NULL, &ipv4_devconf_dflt);
1540 EXPORT_SYMBOL(devinet_ioctl);
1541 EXPORT_SYMBOL(in_dev_finish_destroy);
1542 EXPORT_SYMBOL(inet_select_addr);
1543 EXPORT_SYMBOL(inetdev_by_index);
1544 EXPORT_SYMBOL(inetdev_lock);
1545 EXPORT_SYMBOL(register_inetaddr_notifier);
1546 EXPORT_SYMBOL(unregister_inetaddr_notifier);