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 BLOCKING_NOTIFIER_HEAD(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 blocking_notifier_call_chain(&inetaddr_chain
,
282 *ifap
= ifa1
->ifa_next
;
284 /* 3. Announce address deletion */
286 /* Send message first, then call notifier.
287 At first sight, FIB update triggered by notifier
288 will refer to already deleted ifaddr, that could confuse
289 netlink listeners. It is not true: look, gated sees
290 that route deleted and if it still thinks that ifaddr
291 is valid, it will try to restore deleted routes... Grr.
292 So that, this order is correct.
294 rtmsg_ifa(RTM_DELADDR
, ifa1
);
295 blocking_notifier_call_chain(&inetaddr_chain
, NETDEV_DOWN
, ifa1
);
300 prev_prom
->ifa_next
= promote
->ifa_next
;
301 promote
->ifa_next
= last_prim
->ifa_next
;
302 last_prim
->ifa_next
= promote
;
305 promote
->ifa_flags
&= ~IFA_F_SECONDARY
;
306 rtmsg_ifa(RTM_NEWADDR
, promote
);
307 blocking_notifier_call_chain(&inetaddr_chain
,
309 for (ifa
= promote
->ifa_next
; ifa
; ifa
= ifa
->ifa_next
) {
310 if (ifa1
->ifa_mask
!= ifa
->ifa_mask
||
311 !inet_ifa_match(ifa1
->ifa_address
, ifa
))
320 if (!in_dev
->ifa_list
)
321 inetdev_destroy(in_dev
);
325 static int inet_insert_ifa(struct in_ifaddr
*ifa
)
327 struct in_device
*in_dev
= ifa
->ifa_dev
;
328 struct in_ifaddr
*ifa1
, **ifap
, **last_primary
;
332 if (!ifa
->ifa_local
) {
337 ifa
->ifa_flags
&= ~IFA_F_SECONDARY
;
338 last_primary
= &in_dev
->ifa_list
;
340 for (ifap
= &in_dev
->ifa_list
; (ifa1
= *ifap
) != NULL
;
341 ifap
= &ifa1
->ifa_next
) {
342 if (!(ifa1
->ifa_flags
& IFA_F_SECONDARY
) &&
343 ifa
->ifa_scope
<= ifa1
->ifa_scope
)
344 last_primary
= &ifa1
->ifa_next
;
345 if (ifa1
->ifa_mask
== ifa
->ifa_mask
&&
346 inet_ifa_match(ifa1
->ifa_address
, ifa
)) {
347 if (ifa1
->ifa_local
== ifa
->ifa_local
) {
351 if (ifa1
->ifa_scope
!= ifa
->ifa_scope
) {
355 ifa
->ifa_flags
|= IFA_F_SECONDARY
;
359 if (!(ifa
->ifa_flags
& IFA_F_SECONDARY
)) {
360 net_srandom(ifa
->ifa_local
);
364 ifa
->ifa_next
= *ifap
;
367 /* Send message first, then call notifier.
368 Notifier will trigger FIB update, so that
369 listeners of netlink will know about new ifaddr */
370 rtmsg_ifa(RTM_NEWADDR
, ifa
);
371 blocking_notifier_call_chain(&inetaddr_chain
, NETDEV_UP
, ifa
);
376 static int inet_set_ifa(struct net_device
*dev
, struct in_ifaddr
*ifa
)
378 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
383 in_dev
= inetdev_init(dev
);
389 if (ifa
->ifa_dev
!= in_dev
) {
390 BUG_TRAP(!ifa
->ifa_dev
);
392 ifa
->ifa_dev
= in_dev
;
394 if (LOOPBACK(ifa
->ifa_local
))
395 ifa
->ifa_scope
= RT_SCOPE_HOST
;
396 return inet_insert_ifa(ifa
);
399 struct in_device
*inetdev_by_index(int ifindex
)
401 struct net_device
*dev
;
402 struct in_device
*in_dev
= NULL
;
403 read_lock(&dev_base_lock
);
404 dev
= __dev_get_by_index(ifindex
);
406 in_dev
= in_dev_get(dev
);
407 read_unlock(&dev_base_lock
);
411 /* Called only from RTNL semaphored context. No locks. */
413 struct in_ifaddr
*inet_ifa_byprefix(struct in_device
*in_dev
, u32 prefix
,
418 for_primary_ifa(in_dev
) {
419 if (ifa
->ifa_mask
== mask
&& inet_ifa_match(prefix
, ifa
))
421 } endfor_ifa(in_dev
);
425 static int inet_rtm_deladdr(struct sk_buff
*skb
, struct nlmsghdr
*nlh
, void *arg
)
427 struct rtattr
**rta
= arg
;
428 struct in_device
*in_dev
;
429 struct ifaddrmsg
*ifm
= NLMSG_DATA(nlh
);
430 struct in_ifaddr
*ifa
, **ifap
;
434 if ((in_dev
= inetdev_by_index(ifm
->ifa_index
)) == NULL
)
436 __in_dev_put(in_dev
);
438 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
439 ifap
= &ifa
->ifa_next
) {
440 if ((rta
[IFA_LOCAL
- 1] &&
441 memcmp(RTA_DATA(rta
[IFA_LOCAL
- 1]),
442 &ifa
->ifa_local
, 4)) ||
443 (rta
[IFA_LABEL
- 1] &&
444 rtattr_strcmp(rta
[IFA_LABEL
- 1], ifa
->ifa_label
)) ||
445 (rta
[IFA_ADDRESS
- 1] &&
446 (ifm
->ifa_prefixlen
!= ifa
->ifa_prefixlen
||
447 !inet_ifa_match(*(u32
*)RTA_DATA(rta
[IFA_ADDRESS
- 1]),
450 inet_del_ifa(in_dev
, ifap
, 1);
454 return -EADDRNOTAVAIL
;
457 static int inet_rtm_newaddr(struct sk_buff
*skb
, struct nlmsghdr
*nlh
, void *arg
)
459 struct rtattr
**rta
= arg
;
460 struct net_device
*dev
;
461 struct in_device
*in_dev
;
462 struct ifaddrmsg
*ifm
= NLMSG_DATA(nlh
);
463 struct in_ifaddr
*ifa
;
468 if (ifm
->ifa_prefixlen
> 32 || !rta
[IFA_LOCAL
- 1])
472 if ((dev
= __dev_get_by_index(ifm
->ifa_index
)) == NULL
)
476 if ((in_dev
= __in_dev_get_rtnl(dev
)) == NULL
) {
477 in_dev
= inetdev_init(dev
);
482 if ((ifa
= inet_alloc_ifa()) == NULL
)
485 if (!rta
[IFA_ADDRESS
- 1])
486 rta
[IFA_ADDRESS
- 1] = rta
[IFA_LOCAL
- 1];
487 memcpy(&ifa
->ifa_local
, RTA_DATA(rta
[IFA_LOCAL
- 1]), 4);
488 memcpy(&ifa
->ifa_address
, RTA_DATA(rta
[IFA_ADDRESS
- 1]), 4);
489 ifa
->ifa_prefixlen
= ifm
->ifa_prefixlen
;
490 ifa
->ifa_mask
= inet_make_mask(ifm
->ifa_prefixlen
);
491 if (rta
[IFA_BROADCAST
- 1])
492 memcpy(&ifa
->ifa_broadcast
,
493 RTA_DATA(rta
[IFA_BROADCAST
- 1]), 4);
494 if (rta
[IFA_ANYCAST
- 1])
495 memcpy(&ifa
->ifa_anycast
, RTA_DATA(rta
[IFA_ANYCAST
- 1]), 4);
496 ifa
->ifa_flags
= ifm
->ifa_flags
;
497 ifa
->ifa_scope
= ifm
->ifa_scope
;
499 ifa
->ifa_dev
= in_dev
;
500 if (rta
[IFA_LABEL
- 1])
501 rtattr_strlcpy(ifa
->ifa_label
, rta
[IFA_LABEL
- 1], IFNAMSIZ
);
503 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
505 rc
= inet_insert_ifa(ifa
);
511 * Determine a default network mask, based on the IP address.
514 static __inline__
int inet_abc_len(u32 addr
)
516 int rc
= -1; /* Something else, probably a multicast. */
525 else if (IN_CLASSB(addr
))
527 else if (IN_CLASSC(addr
))
535 int devinet_ioctl(unsigned int cmd
, void __user
*arg
)
538 struct sockaddr_in sin_orig
;
539 struct sockaddr_in
*sin
= (struct sockaddr_in
*)&ifr
.ifr_addr
;
540 struct in_device
*in_dev
;
541 struct in_ifaddr
**ifap
= NULL
;
542 struct in_ifaddr
*ifa
= NULL
;
543 struct net_device
*dev
;
546 int tryaddrmatch
= 0;
549 * Fetch the caller's info block into kernel space
552 if (copy_from_user(&ifr
, arg
, sizeof(struct ifreq
)))
554 ifr
.ifr_name
[IFNAMSIZ
- 1] = 0;
556 /* save original address for comparison */
557 memcpy(&sin_orig
, sin
, sizeof(*sin
));
559 colon
= strchr(ifr
.ifr_name
, ':');
564 dev_load(ifr
.ifr_name
);
568 case SIOCGIFADDR
: /* Get interface address */
569 case SIOCGIFBRDADDR
: /* Get the broadcast address */
570 case SIOCGIFDSTADDR
: /* Get the destination address */
571 case SIOCGIFNETMASK
: /* Get the netmask for the interface */
572 /* Note that these ioctls will not sleep,
573 so that we do not impose a lock.
574 One day we will be forced to put shlock here (I mean SMP)
576 tryaddrmatch
= (sin_orig
.sin_family
== AF_INET
);
577 memset(sin
, 0, sizeof(*sin
));
578 sin
->sin_family
= AF_INET
;
583 if (!capable(CAP_NET_ADMIN
))
586 case SIOCSIFADDR
: /* Set interface address (and family) */
587 case SIOCSIFBRDADDR
: /* Set the broadcast address */
588 case SIOCSIFDSTADDR
: /* Set the destination address */
589 case SIOCSIFNETMASK
: /* Set the netmask for the interface */
591 if (!capable(CAP_NET_ADMIN
))
594 if (sin
->sin_family
!= AF_INET
)
605 if ((dev
= __dev_get_by_name(ifr
.ifr_name
)) == NULL
)
611 if ((in_dev
= __in_dev_get_rtnl(dev
)) != NULL
) {
613 /* Matthias Andree */
614 /* compare label and address (4.4BSD style) */
615 /* note: we only do this for a limited set of ioctls
616 and only if the original address family was AF_INET.
617 This is checked above. */
618 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
619 ifap
= &ifa
->ifa_next
) {
620 if (!strcmp(ifr
.ifr_name
, ifa
->ifa_label
) &&
621 sin_orig
.sin_addr
.s_addr
==
627 /* we didn't get a match, maybe the application is
628 4.3BSD-style and passed in junk so we fall back to
629 comparing just the label */
631 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
632 ifap
= &ifa
->ifa_next
)
633 if (!strcmp(ifr
.ifr_name
, ifa
->ifa_label
))
638 ret
= -EADDRNOTAVAIL
;
639 if (!ifa
&& cmd
!= SIOCSIFADDR
&& cmd
!= SIOCSIFFLAGS
)
643 case SIOCGIFADDR
: /* Get interface address */
644 sin
->sin_addr
.s_addr
= ifa
->ifa_local
;
647 case SIOCGIFBRDADDR
: /* Get the broadcast address */
648 sin
->sin_addr
.s_addr
= ifa
->ifa_broadcast
;
651 case SIOCGIFDSTADDR
: /* Get the destination address */
652 sin
->sin_addr
.s_addr
= ifa
->ifa_address
;
655 case SIOCGIFNETMASK
: /* Get the netmask for the interface */
656 sin
->sin_addr
.s_addr
= ifa
->ifa_mask
;
661 ret
= -EADDRNOTAVAIL
;
665 if (!(ifr
.ifr_flags
& IFF_UP
))
666 inet_del_ifa(in_dev
, ifap
, 1);
669 ret
= dev_change_flags(dev
, ifr
.ifr_flags
);
672 case SIOCSIFADDR
: /* Set interface address (and family) */
674 if (inet_abc_len(sin
->sin_addr
.s_addr
) < 0)
679 if ((ifa
= inet_alloc_ifa()) == NULL
)
682 memcpy(ifa
->ifa_label
, ifr
.ifr_name
, IFNAMSIZ
);
684 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
687 if (ifa
->ifa_local
== sin
->sin_addr
.s_addr
)
689 inet_del_ifa(in_dev
, ifap
, 0);
690 ifa
->ifa_broadcast
= 0;
691 ifa
->ifa_anycast
= 0;
694 ifa
->ifa_address
= ifa
->ifa_local
= sin
->sin_addr
.s_addr
;
696 if (!(dev
->flags
& IFF_POINTOPOINT
)) {
697 ifa
->ifa_prefixlen
= inet_abc_len(ifa
->ifa_address
);
698 ifa
->ifa_mask
= inet_make_mask(ifa
->ifa_prefixlen
);
699 if ((dev
->flags
& IFF_BROADCAST
) &&
700 ifa
->ifa_prefixlen
< 31)
701 ifa
->ifa_broadcast
= ifa
->ifa_address
|
704 ifa
->ifa_prefixlen
= 32;
705 ifa
->ifa_mask
= inet_make_mask(32);
707 ret
= inet_set_ifa(dev
, ifa
);
710 case SIOCSIFBRDADDR
: /* Set the broadcast address */
712 if (ifa
->ifa_broadcast
!= sin
->sin_addr
.s_addr
) {
713 inet_del_ifa(in_dev
, ifap
, 0);
714 ifa
->ifa_broadcast
= sin
->sin_addr
.s_addr
;
715 inet_insert_ifa(ifa
);
719 case SIOCSIFDSTADDR
: /* Set the destination address */
721 if (ifa
->ifa_address
== sin
->sin_addr
.s_addr
)
724 if (inet_abc_len(sin
->sin_addr
.s_addr
) < 0)
727 inet_del_ifa(in_dev
, ifap
, 0);
728 ifa
->ifa_address
= sin
->sin_addr
.s_addr
;
729 inet_insert_ifa(ifa
);
732 case SIOCSIFNETMASK
: /* Set the netmask for the interface */
735 * The mask we set must be legal.
738 if (bad_mask(sin
->sin_addr
.s_addr
, 0))
741 if (ifa
->ifa_mask
!= sin
->sin_addr
.s_addr
) {
742 u32 old_mask
= ifa
->ifa_mask
;
743 inet_del_ifa(in_dev
, ifap
, 0);
744 ifa
->ifa_mask
= sin
->sin_addr
.s_addr
;
745 ifa
->ifa_prefixlen
= inet_mask_len(ifa
->ifa_mask
);
747 /* See if current broadcast address matches
748 * with current netmask, then recalculate
749 * the broadcast address. Otherwise it's a
750 * funny address, so don't touch it since
751 * the user seems to know what (s)he's doing...
753 if ((dev
->flags
& IFF_BROADCAST
) &&
754 (ifa
->ifa_prefixlen
< 31) &&
755 (ifa
->ifa_broadcast
==
756 (ifa
->ifa_local
|~old_mask
))) {
757 ifa
->ifa_broadcast
= (ifa
->ifa_local
|
758 ~sin
->sin_addr
.s_addr
);
760 inet_insert_ifa(ifa
);
770 ret
= copy_to_user(arg
, &ifr
, sizeof(struct ifreq
)) ? -EFAULT
: 0;
774 static int inet_gifconf(struct net_device
*dev
, char __user
*buf
, int len
)
776 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
777 struct in_ifaddr
*ifa
;
781 if (!in_dev
|| (ifa
= in_dev
->ifa_list
) == NULL
)
784 for (; ifa
; ifa
= ifa
->ifa_next
) {
789 if (len
< (int) sizeof(ifr
))
791 memset(&ifr
, 0, sizeof(struct ifreq
));
793 strcpy(ifr
.ifr_name
, ifa
->ifa_label
);
795 strcpy(ifr
.ifr_name
, dev
->name
);
797 (*(struct sockaddr_in
*)&ifr
.ifr_addr
).sin_family
= AF_INET
;
798 (*(struct sockaddr_in
*)&ifr
.ifr_addr
).sin_addr
.s_addr
=
801 if (copy_to_user(buf
, &ifr
, sizeof(struct ifreq
))) {
805 buf
+= sizeof(struct ifreq
);
806 len
-= sizeof(struct ifreq
);
807 done
+= sizeof(struct ifreq
);
813 u32
inet_select_addr(const struct net_device
*dev
, u32 dst
, int scope
)
816 struct in_device
*in_dev
;
819 in_dev
= __in_dev_get_rcu(dev
);
823 for_primary_ifa(in_dev
) {
824 if (ifa
->ifa_scope
> scope
)
826 if (!dst
|| inet_ifa_match(dst
, ifa
)) {
827 addr
= ifa
->ifa_local
;
831 addr
= ifa
->ifa_local
;
832 } endfor_ifa(in_dev
);
839 /* Not loopback addresses on loopback should be preferred
840 in this case. It is importnat that lo is the first interface
843 read_lock(&dev_base_lock
);
845 for (dev
= dev_base
; dev
; dev
= dev
->next
) {
846 if ((in_dev
= __in_dev_get_rcu(dev
)) == NULL
)
849 for_primary_ifa(in_dev
) {
850 if (ifa
->ifa_scope
!= RT_SCOPE_LINK
&&
851 ifa
->ifa_scope
<= scope
) {
852 addr
= ifa
->ifa_local
;
853 goto out_unlock_both
;
855 } endfor_ifa(in_dev
);
858 read_unlock(&dev_base_lock
);
864 static u32
confirm_addr_indev(struct in_device
*in_dev
, u32 dst
,
865 u32 local
, int scope
)
872 (local
== ifa
->ifa_local
|| !local
) &&
873 ifa
->ifa_scope
<= scope
) {
874 addr
= ifa
->ifa_local
;
879 same
= (!local
|| inet_ifa_match(local
, ifa
)) &&
880 (!dst
|| inet_ifa_match(dst
, ifa
));
884 /* Is the selected addr into dst subnet? */
885 if (inet_ifa_match(addr
, ifa
))
887 /* No, then can we use new local src? */
888 if (ifa
->ifa_scope
<= scope
) {
889 addr
= ifa
->ifa_local
;
892 /* search for large dst subnet for addr */
896 } endfor_ifa(in_dev
);
898 return same
? addr
: 0;
902 * Confirm that local IP address exists using wildcards:
903 * - dev: only on this interface, 0=any interface
904 * - dst: only in the same subnet as dst, 0=any dst
905 * - local: address, 0=autoselect the local address
906 * - scope: maximum allowed scope value for the local address
908 u32
inet_confirm_addr(const struct net_device
*dev
, u32 dst
, u32 local
, int scope
)
911 struct in_device
*in_dev
;
915 if ((in_dev
= __in_dev_get_rcu(dev
)))
916 addr
= confirm_addr_indev(in_dev
, dst
, local
, scope
);
922 read_lock(&dev_base_lock
);
924 for (dev
= dev_base
; dev
; dev
= dev
->next
) {
925 if ((in_dev
= __in_dev_get_rcu(dev
))) {
926 addr
= confirm_addr_indev(in_dev
, dst
, local
, scope
);
932 read_unlock(&dev_base_lock
);
941 int register_inetaddr_notifier(struct notifier_block
*nb
)
943 return blocking_notifier_chain_register(&inetaddr_chain
, nb
);
946 int unregister_inetaddr_notifier(struct notifier_block
*nb
)
948 return blocking_notifier_chain_unregister(&inetaddr_chain
, nb
);
951 /* Rename ifa_labels for a device name change. Make some effort to preserve existing
952 * alias numbering and to create unique labels if possible.
954 static void inetdev_changename(struct net_device
*dev
, struct in_device
*in_dev
)
956 struct in_ifaddr
*ifa
;
959 for (ifa
= in_dev
->ifa_list
; ifa
; ifa
= ifa
->ifa_next
) {
960 char old
[IFNAMSIZ
], *dot
;
962 memcpy(old
, ifa
->ifa_label
, IFNAMSIZ
);
963 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
966 dot
= strchr(ifa
->ifa_label
, ':');
968 sprintf(old
, ":%d", named
);
971 if (strlen(dot
) + strlen(dev
->name
) < IFNAMSIZ
) {
972 strcat(ifa
->ifa_label
, dot
);
974 strcpy(ifa
->ifa_label
+ (IFNAMSIZ
- strlen(dot
) - 1), dot
);
979 /* Called only under RTNL semaphore */
981 static int inetdev_event(struct notifier_block
*this, unsigned long event
,
984 struct net_device
*dev
= ptr
;
985 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
990 if (event
== NETDEV_REGISTER
&& dev
== &loopback_dev
) {
991 in_dev
= inetdev_init(dev
);
993 panic("devinet: Failed to create loopback\n");
994 in_dev
->cnf
.no_xfrm
= 1;
995 in_dev
->cnf
.no_policy
= 1;
1001 case NETDEV_REGISTER
:
1002 printk(KERN_DEBUG
"inetdev_event: bug\n");
1008 if (dev
== &loopback_dev
) {
1009 struct in_ifaddr
*ifa
;
1010 if ((ifa
= inet_alloc_ifa()) != NULL
) {
1012 ifa
->ifa_address
= htonl(INADDR_LOOPBACK
);
1013 ifa
->ifa_prefixlen
= 8;
1014 ifa
->ifa_mask
= inet_make_mask(8);
1015 in_dev_hold(in_dev
);
1016 ifa
->ifa_dev
= in_dev
;
1017 ifa
->ifa_scope
= RT_SCOPE_HOST
;
1018 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
1019 inet_insert_ifa(ifa
);
1027 case NETDEV_CHANGEMTU
:
1030 /* MTU falled under 68, disable IP */
1031 case NETDEV_UNREGISTER
:
1032 inetdev_destroy(in_dev
);
1034 case NETDEV_CHANGENAME
:
1035 /* Do not notify about label change, this event is
1036 * not interesting to applications using netlink.
1038 inetdev_changename(dev
, in_dev
);
1040 #ifdef CONFIG_SYSCTL
1041 devinet_sysctl_unregister(&in_dev
->cnf
);
1042 neigh_sysctl_unregister(in_dev
->arp_parms
);
1043 neigh_sysctl_register(dev
, in_dev
->arp_parms
, NET_IPV4
,
1044 NET_IPV4_NEIGH
, "ipv4", NULL
, NULL
);
1045 devinet_sysctl_register(in_dev
, &in_dev
->cnf
);
1053 static struct notifier_block ip_netdev_notifier
= {
1054 .notifier_call
=inetdev_event
,
1057 static int inet_fill_ifaddr(struct sk_buff
*skb
, struct in_ifaddr
*ifa
,
1058 u32 pid
, u32 seq
, int event
, unsigned int flags
)
1060 struct ifaddrmsg
*ifm
;
1061 struct nlmsghdr
*nlh
;
1062 unsigned char *b
= skb
->tail
;
1064 nlh
= NLMSG_NEW(skb
, pid
, seq
, event
, sizeof(*ifm
), flags
);
1065 ifm
= NLMSG_DATA(nlh
);
1066 ifm
->ifa_family
= AF_INET
;
1067 ifm
->ifa_prefixlen
= ifa
->ifa_prefixlen
;
1068 ifm
->ifa_flags
= ifa
->ifa_flags
|IFA_F_PERMANENT
;
1069 ifm
->ifa_scope
= ifa
->ifa_scope
;
1070 ifm
->ifa_index
= ifa
->ifa_dev
->dev
->ifindex
;
1071 if (ifa
->ifa_address
)
1072 RTA_PUT(skb
, IFA_ADDRESS
, 4, &ifa
->ifa_address
);
1074 RTA_PUT(skb
, IFA_LOCAL
, 4, &ifa
->ifa_local
);
1075 if (ifa
->ifa_broadcast
)
1076 RTA_PUT(skb
, IFA_BROADCAST
, 4, &ifa
->ifa_broadcast
);
1077 if (ifa
->ifa_anycast
)
1078 RTA_PUT(skb
, IFA_ANYCAST
, 4, &ifa
->ifa_anycast
);
1079 if (ifa
->ifa_label
[0])
1080 RTA_PUT(skb
, IFA_LABEL
, IFNAMSIZ
, &ifa
->ifa_label
);
1081 nlh
->nlmsg_len
= skb
->tail
- b
;
1086 skb_trim(skb
, b
- skb
->data
);
1090 static int inet_dump_ifaddr(struct sk_buff
*skb
, struct netlink_callback
*cb
)
1093 struct net_device
*dev
;
1094 struct in_device
*in_dev
;
1095 struct in_ifaddr
*ifa
;
1096 int s_ip_idx
, s_idx
= cb
->args
[0];
1098 s_ip_idx
= ip_idx
= cb
->args
[1];
1099 read_lock(&dev_base_lock
);
1100 for (dev
= dev_base
, idx
= 0; dev
; dev
= dev
->next
, idx
++) {
1106 if ((in_dev
= __in_dev_get_rcu(dev
)) == NULL
) {
1111 for (ifa
= in_dev
->ifa_list
, ip_idx
= 0; ifa
;
1112 ifa
= ifa
->ifa_next
, ip_idx
++) {
1113 if (ip_idx
< s_ip_idx
)
1115 if (inet_fill_ifaddr(skb
, ifa
, NETLINK_CB(cb
->skb
).pid
,
1117 RTM_NEWADDR
, NLM_F_MULTI
) <= 0) {
1126 read_unlock(&dev_base_lock
);
1128 cb
->args
[1] = ip_idx
;
1133 static void rtmsg_ifa(int event
, struct in_ifaddr
* ifa
)
1135 int size
= NLMSG_SPACE(sizeof(struct ifaddrmsg
) + 128);
1136 struct sk_buff
*skb
= alloc_skb(size
, GFP_KERNEL
);
1139 netlink_set_err(rtnl
, 0, RTNLGRP_IPV4_IFADDR
, ENOBUFS
);
1140 else if (inet_fill_ifaddr(skb
, ifa
, 0, 0, event
, 0) < 0) {
1142 netlink_set_err(rtnl
, 0, RTNLGRP_IPV4_IFADDR
, EINVAL
);
1144 netlink_broadcast(rtnl
, skb
, 0, RTNLGRP_IPV4_IFADDR
, GFP_KERNEL
);
1148 static struct rtnetlink_link inet_rtnetlink_table
[RTM_NR_MSGTYPES
] = {
1149 [RTM_NEWADDR
- RTM_BASE
] = { .doit
= inet_rtm_newaddr
, },
1150 [RTM_DELADDR
- RTM_BASE
] = { .doit
= inet_rtm_deladdr
, },
1151 [RTM_GETADDR
- RTM_BASE
] = { .dumpit
= inet_dump_ifaddr
, },
1152 [RTM_NEWROUTE
- RTM_BASE
] = { .doit
= inet_rtm_newroute
, },
1153 [RTM_DELROUTE
- RTM_BASE
] = { .doit
= inet_rtm_delroute
, },
1154 [RTM_GETROUTE
- RTM_BASE
] = { .doit
= inet_rtm_getroute
,
1155 .dumpit
= inet_dump_fib
, },
1156 #ifdef CONFIG_IP_MULTIPLE_TABLES
1157 [RTM_NEWRULE
- RTM_BASE
] = { .doit
= inet_rtm_newrule
, },
1158 [RTM_DELRULE
- RTM_BASE
] = { .doit
= inet_rtm_delrule
, },
1159 [RTM_GETRULE
- RTM_BASE
] = { .dumpit
= inet_dump_rules
, },
1163 #ifdef CONFIG_SYSCTL
1165 void inet_forward_change(void)
1167 struct net_device
*dev
;
1168 int on
= ipv4_devconf
.forwarding
;
1170 ipv4_devconf
.accept_redirects
= !on
;
1171 ipv4_devconf_dflt
.forwarding
= on
;
1173 read_lock(&dev_base_lock
);
1174 for (dev
= dev_base
; dev
; dev
= dev
->next
) {
1175 struct in_device
*in_dev
;
1177 in_dev
= __in_dev_get_rcu(dev
);
1179 in_dev
->cnf
.forwarding
= on
;
1182 read_unlock(&dev_base_lock
);
1187 static int devinet_sysctl_forward(ctl_table
*ctl
, int write
,
1188 struct file
* filp
, void __user
*buffer
,
1189 size_t *lenp
, loff_t
*ppos
)
1191 int *valp
= ctl
->data
;
1193 int ret
= proc_dointvec(ctl
, write
, filp
, buffer
, lenp
, ppos
);
1195 if (write
&& *valp
!= val
) {
1196 if (valp
== &ipv4_devconf
.forwarding
)
1197 inet_forward_change();
1198 else if (valp
!= &ipv4_devconf_dflt
.forwarding
)
1205 int ipv4_doint_and_flush(ctl_table
*ctl
, int write
,
1206 struct file
* filp
, void __user
*buffer
,
1207 size_t *lenp
, loff_t
*ppos
)
1209 int *valp
= ctl
->data
;
1211 int ret
= proc_dointvec(ctl
, write
, filp
, buffer
, lenp
, ppos
);
1213 if (write
&& *valp
!= val
)
1219 int ipv4_doint_and_flush_strategy(ctl_table
*table
, int __user
*name
, int nlen
,
1220 void __user
*oldval
, size_t __user
*oldlenp
,
1221 void __user
*newval
, size_t newlen
,
1224 int *valp
= table
->data
;
1227 if (!newval
|| !newlen
)
1230 if (newlen
!= sizeof(int))
1233 if (get_user(new, (int __user
*)newval
))
1239 if (oldval
&& oldlenp
) {
1242 if (get_user(len
, oldlenp
))
1246 if (len
> table
->maxlen
)
1247 len
= table
->maxlen
;
1248 if (copy_to_user(oldval
, valp
, len
))
1250 if (put_user(len
, oldlenp
))
1261 static struct devinet_sysctl_table
{
1262 struct ctl_table_header
*sysctl_header
;
1263 ctl_table devinet_vars
[__NET_IPV4_CONF_MAX
];
1264 ctl_table devinet_dev
[2];
1265 ctl_table devinet_conf_dir
[2];
1266 ctl_table devinet_proto_dir
[2];
1267 ctl_table devinet_root_dir
[2];
1268 } devinet_sysctl
= {
1271 .ctl_name
= NET_IPV4_CONF_FORWARDING
,
1272 .procname
= "forwarding",
1273 .data
= &ipv4_devconf
.forwarding
,
1274 .maxlen
= sizeof(int),
1276 .proc_handler
= &devinet_sysctl_forward
,
1279 .ctl_name
= NET_IPV4_CONF_MC_FORWARDING
,
1280 .procname
= "mc_forwarding",
1281 .data
= &ipv4_devconf
.mc_forwarding
,
1282 .maxlen
= sizeof(int),
1284 .proc_handler
= &proc_dointvec
,
1287 .ctl_name
= NET_IPV4_CONF_ACCEPT_REDIRECTS
,
1288 .procname
= "accept_redirects",
1289 .data
= &ipv4_devconf
.accept_redirects
,
1290 .maxlen
= sizeof(int),
1292 .proc_handler
= &proc_dointvec
,
1295 .ctl_name
= NET_IPV4_CONF_SECURE_REDIRECTS
,
1296 .procname
= "secure_redirects",
1297 .data
= &ipv4_devconf
.secure_redirects
,
1298 .maxlen
= sizeof(int),
1300 .proc_handler
= &proc_dointvec
,
1303 .ctl_name
= NET_IPV4_CONF_SHARED_MEDIA
,
1304 .procname
= "shared_media",
1305 .data
= &ipv4_devconf
.shared_media
,
1306 .maxlen
= sizeof(int),
1308 .proc_handler
= &proc_dointvec
,
1311 .ctl_name
= NET_IPV4_CONF_RP_FILTER
,
1312 .procname
= "rp_filter",
1313 .data
= &ipv4_devconf
.rp_filter
,
1314 .maxlen
= sizeof(int),
1316 .proc_handler
= &proc_dointvec
,
1319 .ctl_name
= NET_IPV4_CONF_SEND_REDIRECTS
,
1320 .procname
= "send_redirects",
1321 .data
= &ipv4_devconf
.send_redirects
,
1322 .maxlen
= sizeof(int),
1324 .proc_handler
= &proc_dointvec
,
1327 .ctl_name
= NET_IPV4_CONF_ACCEPT_SOURCE_ROUTE
,
1328 .procname
= "accept_source_route",
1329 .data
= &ipv4_devconf
.accept_source_route
,
1330 .maxlen
= sizeof(int),
1332 .proc_handler
= &proc_dointvec
,
1335 .ctl_name
= NET_IPV4_CONF_PROXY_ARP
,
1336 .procname
= "proxy_arp",
1337 .data
= &ipv4_devconf
.proxy_arp
,
1338 .maxlen
= sizeof(int),
1340 .proc_handler
= &proc_dointvec
,
1343 .ctl_name
= NET_IPV4_CONF_MEDIUM_ID
,
1344 .procname
= "medium_id",
1345 .data
= &ipv4_devconf
.medium_id
,
1346 .maxlen
= sizeof(int),
1348 .proc_handler
= &proc_dointvec
,
1351 .ctl_name
= NET_IPV4_CONF_BOOTP_RELAY
,
1352 .procname
= "bootp_relay",
1353 .data
= &ipv4_devconf
.bootp_relay
,
1354 .maxlen
= sizeof(int),
1356 .proc_handler
= &proc_dointvec
,
1359 .ctl_name
= NET_IPV4_CONF_LOG_MARTIANS
,
1360 .procname
= "log_martians",
1361 .data
= &ipv4_devconf
.log_martians
,
1362 .maxlen
= sizeof(int),
1364 .proc_handler
= &proc_dointvec
,
1367 .ctl_name
= NET_IPV4_CONF_TAG
,
1369 .data
= &ipv4_devconf
.tag
,
1370 .maxlen
= sizeof(int),
1372 .proc_handler
= &proc_dointvec
,
1375 .ctl_name
= NET_IPV4_CONF_ARPFILTER
,
1376 .procname
= "arp_filter",
1377 .data
= &ipv4_devconf
.arp_filter
,
1378 .maxlen
= sizeof(int),
1380 .proc_handler
= &proc_dointvec
,
1383 .ctl_name
= NET_IPV4_CONF_ARP_ANNOUNCE
,
1384 .procname
= "arp_announce",
1385 .data
= &ipv4_devconf
.arp_announce
,
1386 .maxlen
= sizeof(int),
1388 .proc_handler
= &proc_dointvec
,
1391 .ctl_name
= NET_IPV4_CONF_ARP_IGNORE
,
1392 .procname
= "arp_ignore",
1393 .data
= &ipv4_devconf
.arp_ignore
,
1394 .maxlen
= sizeof(int),
1396 .proc_handler
= &proc_dointvec
,
1399 .ctl_name
= NET_IPV4_CONF_ARP_ACCEPT
,
1400 .procname
= "arp_accept",
1401 .data
= &ipv4_devconf
.arp_accept
,
1402 .maxlen
= sizeof(int),
1404 .proc_handler
= &proc_dointvec
,
1407 .ctl_name
= NET_IPV4_CONF_NOXFRM
,
1408 .procname
= "disable_xfrm",
1409 .data
= &ipv4_devconf
.no_xfrm
,
1410 .maxlen
= sizeof(int),
1412 .proc_handler
= &ipv4_doint_and_flush
,
1413 .strategy
= &ipv4_doint_and_flush_strategy
,
1416 .ctl_name
= NET_IPV4_CONF_NOPOLICY
,
1417 .procname
= "disable_policy",
1418 .data
= &ipv4_devconf
.no_policy
,
1419 .maxlen
= sizeof(int),
1421 .proc_handler
= &ipv4_doint_and_flush
,
1422 .strategy
= &ipv4_doint_and_flush_strategy
,
1425 .ctl_name
= NET_IPV4_CONF_FORCE_IGMP_VERSION
,
1426 .procname
= "force_igmp_version",
1427 .data
= &ipv4_devconf
.force_igmp_version
,
1428 .maxlen
= sizeof(int),
1430 .proc_handler
= &ipv4_doint_and_flush
,
1431 .strategy
= &ipv4_doint_and_flush_strategy
,
1434 .ctl_name
= NET_IPV4_CONF_PROMOTE_SECONDARIES
,
1435 .procname
= "promote_secondaries",
1436 .data
= &ipv4_devconf
.promote_secondaries
,
1437 .maxlen
= sizeof(int),
1439 .proc_handler
= &ipv4_doint_and_flush
,
1440 .strategy
= &ipv4_doint_and_flush_strategy
,
1445 .ctl_name
= NET_PROTO_CONF_ALL
,
1448 .child
= devinet_sysctl
.devinet_vars
,
1451 .devinet_conf_dir
= {
1453 .ctl_name
= NET_IPV4_CONF
,
1456 .child
= devinet_sysctl
.devinet_dev
,
1459 .devinet_proto_dir
= {
1461 .ctl_name
= NET_IPV4
,
1464 .child
= devinet_sysctl
.devinet_conf_dir
,
1467 .devinet_root_dir
= {
1469 .ctl_name
= CTL_NET
,
1472 .child
= devinet_sysctl
.devinet_proto_dir
,
1477 static void devinet_sysctl_register(struct in_device
*in_dev
,
1478 struct ipv4_devconf
*p
)
1481 struct net_device
*dev
= in_dev
? in_dev
->dev
: NULL
;
1482 struct devinet_sysctl_table
*t
= kmalloc(sizeof(*t
), GFP_KERNEL
);
1483 char *dev_name
= NULL
;
1487 memcpy(t
, &devinet_sysctl
, sizeof(*t
));
1488 for (i
= 0; i
< ARRAY_SIZE(t
->devinet_vars
) - 1; i
++) {
1489 t
->devinet_vars
[i
].data
+= (char *)p
- (char *)&ipv4_devconf
;
1490 t
->devinet_vars
[i
].de
= NULL
;
1494 dev_name
= dev
->name
;
1495 t
->devinet_dev
[0].ctl_name
= dev
->ifindex
;
1497 dev_name
= "default";
1498 t
->devinet_dev
[0].ctl_name
= NET_PROTO_CONF_DEFAULT
;
1502 * Make a copy of dev_name, because '.procname' is regarded as const
1503 * by sysctl and we wouldn't want anyone to change it under our feet
1504 * (see SIOCSIFNAME).
1506 dev_name
= kstrdup(dev_name
, GFP_KERNEL
);
1510 t
->devinet_dev
[0].procname
= dev_name
;
1511 t
->devinet_dev
[0].child
= t
->devinet_vars
;
1512 t
->devinet_dev
[0].de
= NULL
;
1513 t
->devinet_conf_dir
[0].child
= t
->devinet_dev
;
1514 t
->devinet_conf_dir
[0].de
= NULL
;
1515 t
->devinet_proto_dir
[0].child
= t
->devinet_conf_dir
;
1516 t
->devinet_proto_dir
[0].de
= NULL
;
1517 t
->devinet_root_dir
[0].child
= t
->devinet_proto_dir
;
1518 t
->devinet_root_dir
[0].de
= NULL
;
1520 t
->sysctl_header
= register_sysctl_table(t
->devinet_root_dir
, 0);
1521 if (!t
->sysctl_header
)
1535 static void devinet_sysctl_unregister(struct ipv4_devconf
*p
)
1538 struct devinet_sysctl_table
*t
= p
->sysctl
;
1540 unregister_sysctl_table(t
->sysctl_header
);
1541 kfree(t
->devinet_dev
[0].procname
);
1547 void __init
devinet_init(void)
1549 register_gifconf(PF_INET
, inet_gifconf
);
1550 register_netdevice_notifier(&ip_netdev_notifier
);
1551 rtnetlink_links
[PF_INET
] = inet_rtnetlink_table
;
1552 #ifdef CONFIG_SYSCTL
1553 devinet_sysctl
.sysctl_header
=
1554 register_sysctl_table(devinet_sysctl
.devinet_root_dir
, 0);
1555 devinet_sysctl_register(NULL
, &ipv4_devconf_dflt
);
1559 EXPORT_SYMBOL(in_dev_finish_destroy
);
1560 EXPORT_SYMBOL(inet_select_addr
);
1561 EXPORT_SYMBOL(inetdev_by_index
);
1562 EXPORT_SYMBOL(register_inetaddr_notifier
);
1563 EXPORT_SYMBOL(unregister_inetaddr_notifier
);