2 * NET3 IP device support routines.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
9 * Derived from the IP parts of dev.c 1.0.19
11 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
12 * Mark Evans, <evansmp@uhura.aston.ac.uk>
15 * Alan Cox, <gw4pts@gw4pts.ampr.org>
16 * Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
19 * Alexey Kuznetsov: pa_* fields are replaced with ifaddr
21 * Cyrus Durgin: updated for kmod
22 * Matthias Andree: in devinet_ioctl, compare label and
23 * address (4.4BSD alias style support),
24 * fall back to comparing just the label
29 #include <asm/uaccess.h>
30 #include <linux/bitops.h>
31 #include <linux/capability.h>
32 #include <linux/module.h>
33 #include <linux/types.h>
34 #include <linux/kernel.h>
35 #include <linux/string.h>
37 #include <linux/socket.h>
38 #include <linux/sockios.h>
40 #include <linux/errno.h>
41 #include <linux/interrupt.h>
42 #include <linux/if_addr.h>
43 #include <linux/if_ether.h>
44 #include <linux/inet.h>
45 #include <linux/netdevice.h>
46 #include <linux/etherdevice.h>
47 #include <linux/skbuff.h>
48 #include <linux/init.h>
49 #include <linux/notifier.h>
50 #include <linux/inetdevice.h>
51 #include <linux/igmp.h>
52 #include <linux/slab.h>
53 #include <linux/hash.h>
55 #include <linux/sysctl.h>
57 #include <linux/kmod.h>
61 #include <net/route.h>
62 #include <net/ip_fib.h>
63 #include <net/rtnetlink.h>
64 #include <net/net_namespace.h>
66 #include "fib_lookup.h"
68 static struct ipv4_devconf ipv4_devconf
= {
70 [IPV4_DEVCONF_ACCEPT_REDIRECTS
- 1] = 1,
71 [IPV4_DEVCONF_SEND_REDIRECTS
- 1] = 1,
72 [IPV4_DEVCONF_SECURE_REDIRECTS
- 1] = 1,
73 [IPV4_DEVCONF_SHARED_MEDIA
- 1] = 1,
77 static struct ipv4_devconf ipv4_devconf_dflt
= {
79 [IPV4_DEVCONF_ACCEPT_REDIRECTS
- 1] = 1,
80 [IPV4_DEVCONF_SEND_REDIRECTS
- 1] = 1,
81 [IPV4_DEVCONF_SECURE_REDIRECTS
- 1] = 1,
82 [IPV4_DEVCONF_SHARED_MEDIA
- 1] = 1,
83 [IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE
- 1] = 1,
87 #define IPV4_DEVCONF_DFLT(net, attr) \
88 IPV4_DEVCONF((*net->ipv4.devconf_dflt), attr)
90 static const struct nla_policy ifa_ipv4_policy
[IFA_MAX
+1] = {
91 [IFA_LOCAL
] = { .type
= NLA_U32
},
92 [IFA_ADDRESS
] = { .type
= NLA_U32
},
93 [IFA_BROADCAST
] = { .type
= NLA_U32
},
94 [IFA_LABEL
] = { .type
= NLA_STRING
, .len
= IFNAMSIZ
- 1 },
97 /* inet_addr_hash's shifting is dependent upon this IN4_ADDR_HSIZE
98 * value. So if you change this define, make appropriate changes to
99 * inet_addr_hash as well.
101 #define IN4_ADDR_HSIZE 256
102 static struct hlist_head inet_addr_lst
[IN4_ADDR_HSIZE
];
103 static DEFINE_SPINLOCK(inet_addr_hash_lock
);
105 static inline unsigned int inet_addr_hash(struct net
*net
, __be32 addr
)
107 u32 val
= (__force u32
) addr
^ hash_ptr(net
, 8);
109 return ((val
^ (val
>> 8) ^ (val
>> 16) ^ (val
>> 24)) &
110 (IN4_ADDR_HSIZE
- 1));
113 static void inet_hash_insert(struct net
*net
, struct in_ifaddr
*ifa
)
115 unsigned int hash
= inet_addr_hash(net
, ifa
->ifa_local
);
117 spin_lock(&inet_addr_hash_lock
);
118 hlist_add_head_rcu(&ifa
->hash
, &inet_addr_lst
[hash
]);
119 spin_unlock(&inet_addr_hash_lock
);
122 static void inet_hash_remove(struct in_ifaddr
*ifa
)
124 spin_lock(&inet_addr_hash_lock
);
125 hlist_del_init_rcu(&ifa
->hash
);
126 spin_unlock(&inet_addr_hash_lock
);
130 * __ip_dev_find - find the first device with a given source address.
131 * @net: the net namespace
132 * @addr: the source address
133 * @devref: if true, take a reference on the found device
135 * If a caller uses devref=false, it should be protected by RCU, or RTNL
137 struct net_device
*__ip_dev_find(struct net
*net
, __be32 addr
, bool devref
)
139 unsigned int hash
= inet_addr_hash(net
, addr
);
140 struct net_device
*result
= NULL
;
141 struct in_ifaddr
*ifa
;
142 struct hlist_node
*node
;
145 hlist_for_each_entry_rcu(ifa
, node
, &inet_addr_lst
[hash
], hash
) {
146 struct net_device
*dev
= ifa
->ifa_dev
->dev
;
148 if (!net_eq(dev_net(dev
), net
))
150 if (ifa
->ifa_local
== addr
) {
156 struct flowi4 fl4
= { .daddr
= addr
};
157 struct fib_result res
= { 0 };
158 struct fib_table
*local
;
160 /* Fallback to FIB local table so that communication
161 * over loopback subnets work.
163 local
= fib_get_table(net
, RT_TABLE_LOCAL
);
165 !fib_table_lookup(local
, &fl4
, &res
, FIB_LOOKUP_NOREF
) &&
166 res
.type
== RTN_LOCAL
)
167 result
= FIB_RES_DEV(res
);
169 if (result
&& devref
)
174 EXPORT_SYMBOL(__ip_dev_find
);
176 static void rtmsg_ifa(int event
, struct in_ifaddr
*, struct nlmsghdr
*, u32
);
178 static BLOCKING_NOTIFIER_HEAD(inetaddr_chain
);
179 static void inet_del_ifa(struct in_device
*in_dev
, struct in_ifaddr
**ifap
,
182 static void devinet_sysctl_register(struct in_device
*idev
);
183 static void devinet_sysctl_unregister(struct in_device
*idev
);
185 static inline void devinet_sysctl_register(struct in_device
*idev
)
188 static inline void devinet_sysctl_unregister(struct in_device
*idev
)
193 /* Locks all the inet devices. */
195 static struct in_ifaddr
*inet_alloc_ifa(void)
197 return kzalloc(sizeof(struct in_ifaddr
), GFP_KERNEL
);
200 static void inet_rcu_free_ifa(struct rcu_head
*head
)
202 struct in_ifaddr
*ifa
= container_of(head
, struct in_ifaddr
, rcu_head
);
204 in_dev_put(ifa
->ifa_dev
);
208 static inline void inet_free_ifa(struct in_ifaddr
*ifa
)
210 call_rcu(&ifa
->rcu_head
, inet_rcu_free_ifa
);
213 void in_dev_finish_destroy(struct in_device
*idev
)
215 struct net_device
*dev
= idev
->dev
;
217 WARN_ON(idev
->ifa_list
);
218 WARN_ON(idev
->mc_list
);
219 #ifdef NET_REFCNT_DEBUG
220 pr_debug("%s: %p=%s\n", __func__
, idev
, dev
? dev
->name
: "NIL");
224 pr_err("Freeing alive in_device %p\n", idev
);
228 EXPORT_SYMBOL(in_dev_finish_destroy
);
230 static struct in_device
*inetdev_init(struct net_device
*dev
)
232 struct in_device
*in_dev
;
236 in_dev
= kzalloc(sizeof(*in_dev
), GFP_KERNEL
);
239 memcpy(&in_dev
->cnf
, dev_net(dev
)->ipv4
.devconf_dflt
,
240 sizeof(in_dev
->cnf
));
241 in_dev
->cnf
.sysctl
= NULL
;
243 in_dev
->arp_parms
= neigh_parms_alloc(dev
, &arp_tbl
);
244 if (!in_dev
->arp_parms
)
246 if (IPV4_DEVCONF(in_dev
->cnf
, FORWARDING
))
247 dev_disable_lro(dev
);
248 /* Reference in_dev->dev */
250 /* Account for reference dev->ip_ptr (below) */
253 devinet_sysctl_register(in_dev
);
254 ip_mc_init_dev(in_dev
);
255 if (dev
->flags
& IFF_UP
)
258 /* we can receive as soon as ip_ptr is set -- do this last */
259 rcu_assign_pointer(dev
->ip_ptr
, in_dev
);
268 static void in_dev_rcu_put(struct rcu_head
*head
)
270 struct in_device
*idev
= container_of(head
, struct in_device
, rcu_head
);
274 static void inetdev_destroy(struct in_device
*in_dev
)
276 struct in_ifaddr
*ifa
;
277 struct net_device
*dev
;
285 ip_mc_destroy_dev(in_dev
);
287 while ((ifa
= in_dev
->ifa_list
) != NULL
) {
288 inet_del_ifa(in_dev
, &in_dev
->ifa_list
, 0);
292 RCU_INIT_POINTER(dev
->ip_ptr
, NULL
);
294 devinet_sysctl_unregister(in_dev
);
295 neigh_parms_release(&arp_tbl
, in_dev
->arp_parms
);
298 call_rcu(&in_dev
->rcu_head
, in_dev_rcu_put
);
301 int inet_addr_onlink(struct in_device
*in_dev
, __be32 a
, __be32 b
)
304 for_primary_ifa(in_dev
) {
305 if (inet_ifa_match(a
, ifa
)) {
306 if (!b
|| inet_ifa_match(b
, ifa
)) {
311 } endfor_ifa(in_dev
);
316 static void __inet_del_ifa(struct in_device
*in_dev
, struct in_ifaddr
**ifap
,
317 int destroy
, struct nlmsghdr
*nlh
, u32 pid
)
319 struct in_ifaddr
*promote
= NULL
;
320 struct in_ifaddr
*ifa
, *ifa1
= *ifap
;
321 struct in_ifaddr
*last_prim
= in_dev
->ifa_list
;
322 struct in_ifaddr
*prev_prom
= NULL
;
323 int do_promote
= IN_DEV_PROMOTE_SECONDARIES(in_dev
);
327 /* 1. Deleting primary ifaddr forces deletion all secondaries
328 * unless alias promotion is set
331 if (!(ifa1
->ifa_flags
& IFA_F_SECONDARY
)) {
332 struct in_ifaddr
**ifap1
= &ifa1
->ifa_next
;
334 while ((ifa
= *ifap1
) != NULL
) {
335 if (!(ifa
->ifa_flags
& IFA_F_SECONDARY
) &&
336 ifa1
->ifa_scope
<= ifa
->ifa_scope
)
339 if (!(ifa
->ifa_flags
& IFA_F_SECONDARY
) ||
340 ifa1
->ifa_mask
!= ifa
->ifa_mask
||
341 !inet_ifa_match(ifa1
->ifa_address
, ifa
)) {
342 ifap1
= &ifa
->ifa_next
;
348 inet_hash_remove(ifa
);
349 *ifap1
= ifa
->ifa_next
;
351 rtmsg_ifa(RTM_DELADDR
, ifa
, nlh
, pid
);
352 blocking_notifier_call_chain(&inetaddr_chain
,
362 /* On promotion all secondaries from subnet are changing
363 * the primary IP, we must remove all their routes silently
364 * and later to add them back with new prefsrc. Do this
365 * while all addresses are on the device list.
367 for (ifa
= promote
; ifa
; ifa
= ifa
->ifa_next
) {
368 if (ifa1
->ifa_mask
== ifa
->ifa_mask
&&
369 inet_ifa_match(ifa1
->ifa_address
, ifa
))
370 fib_del_ifaddr(ifa
, ifa1
);
375 *ifap
= ifa1
->ifa_next
;
376 inet_hash_remove(ifa1
);
378 /* 3. Announce address deletion */
380 /* Send message first, then call notifier.
381 At first sight, FIB update triggered by notifier
382 will refer to already deleted ifaddr, that could confuse
383 netlink listeners. It is not true: look, gated sees
384 that route deleted and if it still thinks that ifaddr
385 is valid, it will try to restore deleted routes... Grr.
386 So that, this order is correct.
388 rtmsg_ifa(RTM_DELADDR
, ifa1
, nlh
, pid
);
389 blocking_notifier_call_chain(&inetaddr_chain
, NETDEV_DOWN
, ifa1
);
392 struct in_ifaddr
*next_sec
= promote
->ifa_next
;
395 prev_prom
->ifa_next
= promote
->ifa_next
;
396 promote
->ifa_next
= last_prim
->ifa_next
;
397 last_prim
->ifa_next
= promote
;
400 promote
->ifa_flags
&= ~IFA_F_SECONDARY
;
401 rtmsg_ifa(RTM_NEWADDR
, promote
, nlh
, pid
);
402 blocking_notifier_call_chain(&inetaddr_chain
,
404 for (ifa
= next_sec
; ifa
; ifa
= ifa
->ifa_next
) {
405 if (ifa1
->ifa_mask
!= ifa
->ifa_mask
||
406 !inet_ifa_match(ifa1
->ifa_address
, ifa
))
416 static void inet_del_ifa(struct in_device
*in_dev
, struct in_ifaddr
**ifap
,
419 __inet_del_ifa(in_dev
, ifap
, destroy
, NULL
, 0);
422 static int __inet_insert_ifa(struct in_ifaddr
*ifa
, struct nlmsghdr
*nlh
,
425 struct in_device
*in_dev
= ifa
->ifa_dev
;
426 struct in_ifaddr
*ifa1
, **ifap
, **last_primary
;
430 if (!ifa
->ifa_local
) {
435 ifa
->ifa_flags
&= ~IFA_F_SECONDARY
;
436 last_primary
= &in_dev
->ifa_list
;
438 for (ifap
= &in_dev
->ifa_list
; (ifa1
= *ifap
) != NULL
;
439 ifap
= &ifa1
->ifa_next
) {
440 if (!(ifa1
->ifa_flags
& IFA_F_SECONDARY
) &&
441 ifa
->ifa_scope
<= ifa1
->ifa_scope
)
442 last_primary
= &ifa1
->ifa_next
;
443 if (ifa1
->ifa_mask
== ifa
->ifa_mask
&&
444 inet_ifa_match(ifa1
->ifa_address
, ifa
)) {
445 if (ifa1
->ifa_local
== ifa
->ifa_local
) {
449 if (ifa1
->ifa_scope
!= ifa
->ifa_scope
) {
453 ifa
->ifa_flags
|= IFA_F_SECONDARY
;
457 if (!(ifa
->ifa_flags
& IFA_F_SECONDARY
)) {
458 net_srandom(ifa
->ifa_local
);
462 ifa
->ifa_next
= *ifap
;
465 inet_hash_insert(dev_net(in_dev
->dev
), ifa
);
467 /* Send message first, then call notifier.
468 Notifier will trigger FIB update, so that
469 listeners of netlink will know about new ifaddr */
470 rtmsg_ifa(RTM_NEWADDR
, ifa
, nlh
, pid
);
471 blocking_notifier_call_chain(&inetaddr_chain
, NETDEV_UP
, ifa
);
476 static int inet_insert_ifa(struct in_ifaddr
*ifa
)
478 return __inet_insert_ifa(ifa
, NULL
, 0);
481 static int inet_set_ifa(struct net_device
*dev
, struct in_ifaddr
*ifa
)
483 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
491 ipv4_devconf_setall(in_dev
);
492 if (ifa
->ifa_dev
!= in_dev
) {
493 WARN_ON(ifa
->ifa_dev
);
495 ifa
->ifa_dev
= in_dev
;
497 if (ipv4_is_loopback(ifa
->ifa_local
))
498 ifa
->ifa_scope
= RT_SCOPE_HOST
;
499 return inet_insert_ifa(ifa
);
502 /* Caller must hold RCU or RTNL :
503 * We dont take a reference on found in_device
505 struct in_device
*inetdev_by_index(struct net
*net
, int ifindex
)
507 struct net_device
*dev
;
508 struct in_device
*in_dev
= NULL
;
511 dev
= dev_get_by_index_rcu(net
, ifindex
);
513 in_dev
= rcu_dereference_rtnl(dev
->ip_ptr
);
517 EXPORT_SYMBOL(inetdev_by_index
);
519 /* Called only from RTNL semaphored context. No locks. */
521 struct in_ifaddr
*inet_ifa_byprefix(struct in_device
*in_dev
, __be32 prefix
,
526 for_primary_ifa(in_dev
) {
527 if (ifa
->ifa_mask
== mask
&& inet_ifa_match(prefix
, ifa
))
529 } endfor_ifa(in_dev
);
533 static int inet_rtm_deladdr(struct sk_buff
*skb
, struct nlmsghdr
*nlh
, void *arg
)
535 struct net
*net
= sock_net(skb
->sk
);
536 struct nlattr
*tb
[IFA_MAX
+1];
537 struct in_device
*in_dev
;
538 struct ifaddrmsg
*ifm
;
539 struct in_ifaddr
*ifa
, **ifap
;
544 err
= nlmsg_parse(nlh
, sizeof(*ifm
), tb
, IFA_MAX
, ifa_ipv4_policy
);
548 ifm
= nlmsg_data(nlh
);
549 in_dev
= inetdev_by_index(net
, ifm
->ifa_index
);
550 if (in_dev
== NULL
) {
555 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
556 ifap
= &ifa
->ifa_next
) {
558 ifa
->ifa_local
!= nla_get_be32(tb
[IFA_LOCAL
]))
561 if (tb
[IFA_LABEL
] && nla_strcmp(tb
[IFA_LABEL
], ifa
->ifa_label
))
564 if (tb
[IFA_ADDRESS
] &&
565 (ifm
->ifa_prefixlen
!= ifa
->ifa_prefixlen
||
566 !inet_ifa_match(nla_get_be32(tb
[IFA_ADDRESS
]), ifa
)))
569 __inet_del_ifa(in_dev
, ifap
, 1, nlh
, NETLINK_CB(skb
).pid
);
573 err
= -EADDRNOTAVAIL
;
578 static struct in_ifaddr
*rtm_to_ifaddr(struct net
*net
, struct nlmsghdr
*nlh
)
580 struct nlattr
*tb
[IFA_MAX
+1];
581 struct in_ifaddr
*ifa
;
582 struct ifaddrmsg
*ifm
;
583 struct net_device
*dev
;
584 struct in_device
*in_dev
;
587 err
= nlmsg_parse(nlh
, sizeof(*ifm
), tb
, IFA_MAX
, ifa_ipv4_policy
);
591 ifm
= nlmsg_data(nlh
);
593 if (ifm
->ifa_prefixlen
> 32 || tb
[IFA_LOCAL
] == NULL
)
596 dev
= __dev_get_by_index(net
, ifm
->ifa_index
);
601 in_dev
= __in_dev_get_rtnl(dev
);
606 ifa
= inet_alloc_ifa();
609 * A potential indev allocation can be left alive, it stays
610 * assigned to its device and is destroy with it.
614 ipv4_devconf_setall(in_dev
);
617 if (tb
[IFA_ADDRESS
] == NULL
)
618 tb
[IFA_ADDRESS
] = tb
[IFA_LOCAL
];
620 INIT_HLIST_NODE(&ifa
->hash
);
621 ifa
->ifa_prefixlen
= ifm
->ifa_prefixlen
;
622 ifa
->ifa_mask
= inet_make_mask(ifm
->ifa_prefixlen
);
623 ifa
->ifa_flags
= ifm
->ifa_flags
;
624 ifa
->ifa_scope
= ifm
->ifa_scope
;
625 ifa
->ifa_dev
= in_dev
;
627 ifa
->ifa_local
= nla_get_be32(tb
[IFA_LOCAL
]);
628 ifa
->ifa_address
= nla_get_be32(tb
[IFA_ADDRESS
]);
630 if (tb
[IFA_BROADCAST
])
631 ifa
->ifa_broadcast
= nla_get_be32(tb
[IFA_BROADCAST
]);
634 nla_strlcpy(ifa
->ifa_label
, tb
[IFA_LABEL
], IFNAMSIZ
);
636 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
644 static int inet_rtm_newaddr(struct sk_buff
*skb
, struct nlmsghdr
*nlh
, void *arg
)
646 struct net
*net
= sock_net(skb
->sk
);
647 struct in_ifaddr
*ifa
;
651 ifa
= rtm_to_ifaddr(net
, nlh
);
655 return __inet_insert_ifa(ifa
, nlh
, NETLINK_CB(skb
).pid
);
659 * Determine a default network mask, based on the IP address.
662 static inline int inet_abc_len(__be32 addr
)
664 int rc
= -1; /* Something else, probably a multicast. */
666 if (ipv4_is_zeronet(addr
))
669 __u32 haddr
= ntohl(addr
);
671 if (IN_CLASSA(haddr
))
673 else if (IN_CLASSB(haddr
))
675 else if (IN_CLASSC(haddr
))
683 int devinet_ioctl(struct net
*net
, unsigned int cmd
, void __user
*arg
)
686 struct sockaddr_in sin_orig
;
687 struct sockaddr_in
*sin
= (struct sockaddr_in
*)&ifr
.ifr_addr
;
688 struct in_device
*in_dev
;
689 struct in_ifaddr
**ifap
= NULL
;
690 struct in_ifaddr
*ifa
= NULL
;
691 struct net_device
*dev
;
694 int tryaddrmatch
= 0;
697 * Fetch the caller's info block into kernel space
700 if (copy_from_user(&ifr
, arg
, sizeof(struct ifreq
)))
702 ifr
.ifr_name
[IFNAMSIZ
- 1] = 0;
704 /* save original address for comparison */
705 memcpy(&sin_orig
, sin
, sizeof(*sin
));
707 colon
= strchr(ifr
.ifr_name
, ':');
711 dev_load(net
, ifr
.ifr_name
);
714 case SIOCGIFADDR
: /* Get interface address */
715 case SIOCGIFBRDADDR
: /* Get the broadcast address */
716 case SIOCGIFDSTADDR
: /* Get the destination address */
717 case SIOCGIFNETMASK
: /* Get the netmask for the interface */
718 /* Note that these ioctls will not sleep,
719 so that we do not impose a lock.
720 One day we will be forced to put shlock here (I mean SMP)
722 tryaddrmatch
= (sin_orig
.sin_family
== AF_INET
);
723 memset(sin
, 0, sizeof(*sin
));
724 sin
->sin_family
= AF_INET
;
729 if (!capable(CAP_NET_ADMIN
))
732 case SIOCSIFADDR
: /* Set interface address (and family) */
733 case SIOCSIFBRDADDR
: /* Set the broadcast address */
734 case SIOCSIFDSTADDR
: /* Set the destination address */
735 case SIOCSIFNETMASK
: /* Set the netmask for the interface */
737 if (!capable(CAP_NET_ADMIN
))
740 if (sin
->sin_family
!= AF_INET
)
751 dev
= __dev_get_by_name(net
, ifr
.ifr_name
);
758 in_dev
= __in_dev_get_rtnl(dev
);
761 /* Matthias Andree */
762 /* compare label and address (4.4BSD style) */
763 /* note: we only do this for a limited set of ioctls
764 and only if the original address family was AF_INET.
765 This is checked above. */
766 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
767 ifap
= &ifa
->ifa_next
) {
768 if (!strcmp(ifr
.ifr_name
, ifa
->ifa_label
) &&
769 sin_orig
.sin_addr
.s_addr
==
775 /* we didn't get a match, maybe the application is
776 4.3BSD-style and passed in junk so we fall back to
777 comparing just the label */
779 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
780 ifap
= &ifa
->ifa_next
)
781 if (!strcmp(ifr
.ifr_name
, ifa
->ifa_label
))
786 ret
= -EADDRNOTAVAIL
;
787 if (!ifa
&& cmd
!= SIOCSIFADDR
&& cmd
!= SIOCSIFFLAGS
)
791 case SIOCGIFADDR
: /* Get interface address */
792 sin
->sin_addr
.s_addr
= ifa
->ifa_local
;
795 case SIOCGIFBRDADDR
: /* Get the broadcast address */
796 sin
->sin_addr
.s_addr
= ifa
->ifa_broadcast
;
799 case SIOCGIFDSTADDR
: /* Get the destination address */
800 sin
->sin_addr
.s_addr
= ifa
->ifa_address
;
803 case SIOCGIFNETMASK
: /* Get the netmask for the interface */
804 sin
->sin_addr
.s_addr
= ifa
->ifa_mask
;
809 ret
= -EADDRNOTAVAIL
;
813 if (!(ifr
.ifr_flags
& IFF_UP
))
814 inet_del_ifa(in_dev
, ifap
, 1);
817 ret
= dev_change_flags(dev
, ifr
.ifr_flags
);
820 case SIOCSIFADDR
: /* Set interface address (and family) */
822 if (inet_abc_len(sin
->sin_addr
.s_addr
) < 0)
827 ifa
= inet_alloc_ifa();
828 INIT_HLIST_NODE(&ifa
->hash
);
832 memcpy(ifa
->ifa_label
, ifr
.ifr_name
, IFNAMSIZ
);
834 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
837 if (ifa
->ifa_local
== sin
->sin_addr
.s_addr
)
839 inet_del_ifa(in_dev
, ifap
, 0);
840 ifa
->ifa_broadcast
= 0;
844 ifa
->ifa_address
= ifa
->ifa_local
= sin
->sin_addr
.s_addr
;
846 if (!(dev
->flags
& IFF_POINTOPOINT
)) {
847 ifa
->ifa_prefixlen
= inet_abc_len(ifa
->ifa_address
);
848 ifa
->ifa_mask
= inet_make_mask(ifa
->ifa_prefixlen
);
849 if ((dev
->flags
& IFF_BROADCAST
) &&
850 ifa
->ifa_prefixlen
< 31)
851 ifa
->ifa_broadcast
= ifa
->ifa_address
|
854 ifa
->ifa_prefixlen
= 32;
855 ifa
->ifa_mask
= inet_make_mask(32);
857 ret
= inet_set_ifa(dev
, ifa
);
860 case SIOCSIFBRDADDR
: /* Set the broadcast address */
862 if (ifa
->ifa_broadcast
!= sin
->sin_addr
.s_addr
) {
863 inet_del_ifa(in_dev
, ifap
, 0);
864 ifa
->ifa_broadcast
= sin
->sin_addr
.s_addr
;
865 inet_insert_ifa(ifa
);
869 case SIOCSIFDSTADDR
: /* Set the destination address */
871 if (ifa
->ifa_address
== sin
->sin_addr
.s_addr
)
874 if (inet_abc_len(sin
->sin_addr
.s_addr
) < 0)
877 inet_del_ifa(in_dev
, ifap
, 0);
878 ifa
->ifa_address
= sin
->sin_addr
.s_addr
;
879 inet_insert_ifa(ifa
);
882 case SIOCSIFNETMASK
: /* Set the netmask for the interface */
885 * The mask we set must be legal.
888 if (bad_mask(sin
->sin_addr
.s_addr
, 0))
891 if (ifa
->ifa_mask
!= sin
->sin_addr
.s_addr
) {
892 __be32 old_mask
= ifa
->ifa_mask
;
893 inet_del_ifa(in_dev
, ifap
, 0);
894 ifa
->ifa_mask
= sin
->sin_addr
.s_addr
;
895 ifa
->ifa_prefixlen
= inet_mask_len(ifa
->ifa_mask
);
897 /* See if current broadcast address matches
898 * with current netmask, then recalculate
899 * the broadcast address. Otherwise it's a
900 * funny address, so don't touch it since
901 * the user seems to know what (s)he's doing...
903 if ((dev
->flags
& IFF_BROADCAST
) &&
904 (ifa
->ifa_prefixlen
< 31) &&
905 (ifa
->ifa_broadcast
==
906 (ifa
->ifa_local
|~old_mask
))) {
907 ifa
->ifa_broadcast
= (ifa
->ifa_local
|
908 ~sin
->sin_addr
.s_addr
);
910 inet_insert_ifa(ifa
);
920 ret
= copy_to_user(arg
, &ifr
, sizeof(struct ifreq
)) ? -EFAULT
: 0;
924 static int inet_gifconf(struct net_device
*dev
, char __user
*buf
, int len
)
926 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
927 struct in_ifaddr
*ifa
;
934 for (ifa
= in_dev
->ifa_list
; ifa
; ifa
= ifa
->ifa_next
) {
939 if (len
< (int) sizeof(ifr
))
941 memset(&ifr
, 0, sizeof(struct ifreq
));
943 strcpy(ifr
.ifr_name
, ifa
->ifa_label
);
945 strcpy(ifr
.ifr_name
, dev
->name
);
947 (*(struct sockaddr_in
*)&ifr
.ifr_addr
).sin_family
= AF_INET
;
948 (*(struct sockaddr_in
*)&ifr
.ifr_addr
).sin_addr
.s_addr
=
951 if (copy_to_user(buf
, &ifr
, sizeof(struct ifreq
))) {
955 buf
+= sizeof(struct ifreq
);
956 len
-= sizeof(struct ifreq
);
957 done
+= sizeof(struct ifreq
);
963 __be32
inet_select_addr(const struct net_device
*dev
, __be32 dst
, int scope
)
966 struct in_device
*in_dev
;
967 struct net
*net
= dev_net(dev
);
970 in_dev
= __in_dev_get_rcu(dev
);
974 for_primary_ifa(in_dev
) {
975 if (ifa
->ifa_scope
> scope
)
977 if (!dst
|| inet_ifa_match(dst
, ifa
)) {
978 addr
= ifa
->ifa_local
;
982 addr
= ifa
->ifa_local
;
983 } endfor_ifa(in_dev
);
989 /* Not loopback addresses on loopback should be preferred
990 in this case. It is importnat that lo is the first interface
993 for_each_netdev_rcu(net
, dev
) {
994 in_dev
= __in_dev_get_rcu(dev
);
998 for_primary_ifa(in_dev
) {
999 if (ifa
->ifa_scope
!= RT_SCOPE_LINK
&&
1000 ifa
->ifa_scope
<= scope
) {
1001 addr
= ifa
->ifa_local
;
1004 } endfor_ifa(in_dev
);
1010 EXPORT_SYMBOL(inet_select_addr
);
1012 static __be32
confirm_addr_indev(struct in_device
*in_dev
, __be32 dst
,
1013 __be32 local
, int scope
)
1020 (local
== ifa
->ifa_local
|| !local
) &&
1021 ifa
->ifa_scope
<= scope
) {
1022 addr
= ifa
->ifa_local
;
1027 same
= (!local
|| inet_ifa_match(local
, ifa
)) &&
1028 (!dst
|| inet_ifa_match(dst
, ifa
));
1032 /* Is the selected addr into dst subnet? */
1033 if (inet_ifa_match(addr
, ifa
))
1035 /* No, then can we use new local src? */
1036 if (ifa
->ifa_scope
<= scope
) {
1037 addr
= ifa
->ifa_local
;
1040 /* search for large dst subnet for addr */
1044 } endfor_ifa(in_dev
);
1046 return same
? addr
: 0;
1050 * Confirm that local IP address exists using wildcards:
1051 * - in_dev: only on this interface, 0=any interface
1052 * - dst: only in the same subnet as dst, 0=any dst
1053 * - local: address, 0=autoselect the local address
1054 * - scope: maximum allowed scope value for the local address
1056 __be32
inet_confirm_addr(struct in_device
*in_dev
,
1057 __be32 dst
, __be32 local
, int scope
)
1060 struct net_device
*dev
;
1063 if (scope
!= RT_SCOPE_LINK
)
1064 return confirm_addr_indev(in_dev
, dst
, local
, scope
);
1066 net
= dev_net(in_dev
->dev
);
1068 for_each_netdev_rcu(net
, dev
) {
1069 in_dev
= __in_dev_get_rcu(dev
);
1071 addr
= confirm_addr_indev(in_dev
, dst
, local
, scope
);
1080 EXPORT_SYMBOL(inet_confirm_addr
);
1086 int register_inetaddr_notifier(struct notifier_block
*nb
)
1088 return blocking_notifier_chain_register(&inetaddr_chain
, nb
);
1090 EXPORT_SYMBOL(register_inetaddr_notifier
);
1092 int unregister_inetaddr_notifier(struct notifier_block
*nb
)
1094 return blocking_notifier_chain_unregister(&inetaddr_chain
, nb
);
1096 EXPORT_SYMBOL(unregister_inetaddr_notifier
);
1098 /* Rename ifa_labels for a device name change. Make some effort to preserve
1099 * existing alias numbering and to create unique labels if possible.
1101 static void inetdev_changename(struct net_device
*dev
, struct in_device
*in_dev
)
1103 struct in_ifaddr
*ifa
;
1106 for (ifa
= in_dev
->ifa_list
; ifa
; ifa
= ifa
->ifa_next
) {
1107 char old
[IFNAMSIZ
], *dot
;
1109 memcpy(old
, ifa
->ifa_label
, IFNAMSIZ
);
1110 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
1113 dot
= strchr(old
, ':');
1115 sprintf(old
, ":%d", named
);
1118 if (strlen(dot
) + strlen(dev
->name
) < IFNAMSIZ
)
1119 strcat(ifa
->ifa_label
, dot
);
1121 strcpy(ifa
->ifa_label
+ (IFNAMSIZ
- strlen(dot
) - 1), dot
);
1123 rtmsg_ifa(RTM_NEWADDR
, ifa
, NULL
, 0);
1127 static inline bool inetdev_valid_mtu(unsigned int mtu
)
1132 static void inetdev_send_gratuitous_arp(struct net_device
*dev
,
1133 struct in_device
*in_dev
)
1136 struct in_ifaddr
*ifa
;
1138 for (ifa
= in_dev
->ifa_list
; ifa
;
1139 ifa
= ifa
->ifa_next
) {
1140 arp_send(ARPOP_REQUEST
, ETH_P_ARP
,
1141 ifa
->ifa_local
, dev
,
1142 ifa
->ifa_local
, NULL
,
1143 dev
->dev_addr
, NULL
);
1147 /* Called only under RTNL semaphore */
1149 static int inetdev_event(struct notifier_block
*this, unsigned long event
,
1152 struct net_device
*dev
= ptr
;
1153 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
1158 if (event
== NETDEV_REGISTER
) {
1159 in_dev
= inetdev_init(dev
);
1161 return notifier_from_errno(-ENOMEM
);
1162 if (dev
->flags
& IFF_LOOPBACK
) {
1163 IN_DEV_CONF_SET(in_dev
, NOXFRM
, 1);
1164 IN_DEV_CONF_SET(in_dev
, NOPOLICY
, 1);
1166 } else if (event
== NETDEV_CHANGEMTU
) {
1167 /* Re-enabling IP */
1168 if (inetdev_valid_mtu(dev
->mtu
))
1169 in_dev
= inetdev_init(dev
);
1175 case NETDEV_REGISTER
:
1176 pr_debug("%s: bug\n", __func__
);
1177 RCU_INIT_POINTER(dev
->ip_ptr
, NULL
);
1180 if (!inetdev_valid_mtu(dev
->mtu
))
1182 if (dev
->flags
& IFF_LOOPBACK
) {
1183 struct in_ifaddr
*ifa
= inet_alloc_ifa();
1186 INIT_HLIST_NODE(&ifa
->hash
);
1188 ifa
->ifa_address
= htonl(INADDR_LOOPBACK
);
1189 ifa
->ifa_prefixlen
= 8;
1190 ifa
->ifa_mask
= inet_make_mask(8);
1191 in_dev_hold(in_dev
);
1192 ifa
->ifa_dev
= in_dev
;
1193 ifa
->ifa_scope
= RT_SCOPE_HOST
;
1194 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
1195 inet_insert_ifa(ifa
);
1200 case NETDEV_CHANGEADDR
:
1201 if (!IN_DEV_ARP_NOTIFY(in_dev
))
1204 case NETDEV_NOTIFY_PEERS
:
1205 /* Send gratuitous ARP to notify of link change */
1206 inetdev_send_gratuitous_arp(dev
, in_dev
);
1211 case NETDEV_PRE_TYPE_CHANGE
:
1212 ip_mc_unmap(in_dev
);
1214 case NETDEV_POST_TYPE_CHANGE
:
1215 ip_mc_remap(in_dev
);
1217 case NETDEV_CHANGEMTU
:
1218 if (inetdev_valid_mtu(dev
->mtu
))
1220 /* disable IP when MTU is not enough */
1221 case NETDEV_UNREGISTER
:
1222 inetdev_destroy(in_dev
);
1224 case NETDEV_CHANGENAME
:
1225 /* Do not notify about label change, this event is
1226 * not interesting to applications using netlink.
1228 inetdev_changename(dev
, in_dev
);
1230 devinet_sysctl_unregister(in_dev
);
1231 devinet_sysctl_register(in_dev
);
1238 static struct notifier_block ip_netdev_notifier
= {
1239 .notifier_call
= inetdev_event
,
1242 static inline size_t inet_nlmsg_size(void)
1244 return NLMSG_ALIGN(sizeof(struct ifaddrmsg
))
1245 + nla_total_size(4) /* IFA_ADDRESS */
1246 + nla_total_size(4) /* IFA_LOCAL */
1247 + nla_total_size(4) /* IFA_BROADCAST */
1248 + nla_total_size(IFNAMSIZ
); /* IFA_LABEL */
1251 static int inet_fill_ifaddr(struct sk_buff
*skb
, struct in_ifaddr
*ifa
,
1252 u32 pid
, u32 seq
, int event
, unsigned int flags
)
1254 struct ifaddrmsg
*ifm
;
1255 struct nlmsghdr
*nlh
;
1257 nlh
= nlmsg_put(skb
, pid
, seq
, event
, sizeof(*ifm
), flags
);
1261 ifm
= nlmsg_data(nlh
);
1262 ifm
->ifa_family
= AF_INET
;
1263 ifm
->ifa_prefixlen
= ifa
->ifa_prefixlen
;
1264 ifm
->ifa_flags
= ifa
->ifa_flags
|IFA_F_PERMANENT
;
1265 ifm
->ifa_scope
= ifa
->ifa_scope
;
1266 ifm
->ifa_index
= ifa
->ifa_dev
->dev
->ifindex
;
1268 if ((ifa
->ifa_address
&&
1269 nla_put_be32(skb
, IFA_ADDRESS
, ifa
->ifa_address
)) ||
1271 nla_put_be32(skb
, IFA_LOCAL
, ifa
->ifa_local
)) ||
1272 (ifa
->ifa_broadcast
&&
1273 nla_put_be32(skb
, IFA_BROADCAST
, ifa
->ifa_broadcast
)) ||
1274 (ifa
->ifa_label
[0] &&
1275 nla_put_string(skb
, IFA_LABEL
, ifa
->ifa_label
)))
1276 goto nla_put_failure
;
1278 return nlmsg_end(skb
, nlh
);
1281 nlmsg_cancel(skb
, nlh
);
1285 static int inet_dump_ifaddr(struct sk_buff
*skb
, struct netlink_callback
*cb
)
1287 struct net
*net
= sock_net(skb
->sk
);
1290 int ip_idx
, s_ip_idx
;
1291 struct net_device
*dev
;
1292 struct in_device
*in_dev
;
1293 struct in_ifaddr
*ifa
;
1294 struct hlist_head
*head
;
1295 struct hlist_node
*node
;
1298 s_idx
= idx
= cb
->args
[1];
1299 s_ip_idx
= ip_idx
= cb
->args
[2];
1301 for (h
= s_h
; h
< NETDEV_HASHENTRIES
; h
++, s_idx
= 0) {
1303 head
= &net
->dev_index_head
[h
];
1305 hlist_for_each_entry_rcu(dev
, node
, head
, index_hlist
) {
1308 if (h
> s_h
|| idx
> s_idx
)
1310 in_dev
= __in_dev_get_rcu(dev
);
1314 for (ifa
= in_dev
->ifa_list
, ip_idx
= 0; ifa
;
1315 ifa
= ifa
->ifa_next
, ip_idx
++) {
1316 if (ip_idx
< s_ip_idx
)
1318 if (inet_fill_ifaddr(skb
, ifa
,
1319 NETLINK_CB(cb
->skb
).pid
,
1321 RTM_NEWADDR
, NLM_F_MULTI
) <= 0) {
1335 cb
->args
[2] = ip_idx
;
1340 static void rtmsg_ifa(int event
, struct in_ifaddr
*ifa
, struct nlmsghdr
*nlh
,
1343 struct sk_buff
*skb
;
1344 u32 seq
= nlh
? nlh
->nlmsg_seq
: 0;
1348 net
= dev_net(ifa
->ifa_dev
->dev
);
1349 skb
= nlmsg_new(inet_nlmsg_size(), GFP_KERNEL
);
1353 err
= inet_fill_ifaddr(skb
, ifa
, pid
, seq
, event
, 0);
1355 /* -EMSGSIZE implies BUG in inet_nlmsg_size() */
1356 WARN_ON(err
== -EMSGSIZE
);
1360 rtnl_notify(skb
, net
, pid
, RTNLGRP_IPV4_IFADDR
, nlh
, GFP_KERNEL
);
1364 rtnl_set_sk_err(net
, RTNLGRP_IPV4_IFADDR
, err
);
1367 static size_t inet_get_link_af_size(const struct net_device
*dev
)
1369 struct in_device
*in_dev
= rcu_dereference_rtnl(dev
->ip_ptr
);
1374 return nla_total_size(IPV4_DEVCONF_MAX
* 4); /* IFLA_INET_CONF */
1377 static int inet_fill_link_af(struct sk_buff
*skb
, const struct net_device
*dev
)
1379 struct in_device
*in_dev
= rcu_dereference_rtnl(dev
->ip_ptr
);
1386 nla
= nla_reserve(skb
, IFLA_INET_CONF
, IPV4_DEVCONF_MAX
* 4);
1390 for (i
= 0; i
< IPV4_DEVCONF_MAX
; i
++)
1391 ((u32
*) nla_data(nla
))[i
] = in_dev
->cnf
.data
[i
];
1396 static const struct nla_policy inet_af_policy
[IFLA_INET_MAX
+1] = {
1397 [IFLA_INET_CONF
] = { .type
= NLA_NESTED
},
1400 static int inet_validate_link_af(const struct net_device
*dev
,
1401 const struct nlattr
*nla
)
1403 struct nlattr
*a
, *tb
[IFLA_INET_MAX
+1];
1406 if (dev
&& !__in_dev_get_rtnl(dev
))
1407 return -EAFNOSUPPORT
;
1409 err
= nla_parse_nested(tb
, IFLA_INET_MAX
, nla
, inet_af_policy
);
1413 if (tb
[IFLA_INET_CONF
]) {
1414 nla_for_each_nested(a
, tb
[IFLA_INET_CONF
], rem
) {
1415 int cfgid
= nla_type(a
);
1420 if (cfgid
<= 0 || cfgid
> IPV4_DEVCONF_MAX
)
1428 static int inet_set_link_af(struct net_device
*dev
, const struct nlattr
*nla
)
1430 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
1431 struct nlattr
*a
, *tb
[IFLA_INET_MAX
+1];
1435 return -EAFNOSUPPORT
;
1437 if (nla_parse_nested(tb
, IFLA_INET_MAX
, nla
, NULL
) < 0)
1440 if (tb
[IFLA_INET_CONF
]) {
1441 nla_for_each_nested(a
, tb
[IFLA_INET_CONF
], rem
)
1442 ipv4_devconf_set(in_dev
, nla_type(a
), nla_get_u32(a
));
1448 #ifdef CONFIG_SYSCTL
1450 static void devinet_copy_dflt_conf(struct net
*net
, int i
)
1452 struct net_device
*dev
;
1455 for_each_netdev_rcu(net
, dev
) {
1456 struct in_device
*in_dev
;
1458 in_dev
= __in_dev_get_rcu(dev
);
1459 if (in_dev
&& !test_bit(i
, in_dev
->cnf
.state
))
1460 in_dev
->cnf
.data
[i
] = net
->ipv4
.devconf_dflt
->data
[i
];
1465 /* called with RTNL locked */
1466 static void inet_forward_change(struct net
*net
)
1468 struct net_device
*dev
;
1469 int on
= IPV4_DEVCONF_ALL(net
, FORWARDING
);
1471 IPV4_DEVCONF_ALL(net
, ACCEPT_REDIRECTS
) = !on
;
1472 IPV4_DEVCONF_DFLT(net
, FORWARDING
) = on
;
1474 for_each_netdev(net
, dev
) {
1475 struct in_device
*in_dev
;
1477 dev_disable_lro(dev
);
1479 in_dev
= __in_dev_get_rcu(dev
);
1481 IN_DEV_CONF_SET(in_dev
, FORWARDING
, on
);
1486 static int devinet_conf_proc(ctl_table
*ctl
, int write
,
1487 void __user
*buffer
,
1488 size_t *lenp
, loff_t
*ppos
)
1490 int old_value
= *(int *)ctl
->data
;
1491 int ret
= proc_dointvec(ctl
, write
, buffer
, lenp
, ppos
);
1492 int new_value
= *(int *)ctl
->data
;
1495 struct ipv4_devconf
*cnf
= ctl
->extra1
;
1496 struct net
*net
= ctl
->extra2
;
1497 int i
= (int *)ctl
->data
- cnf
->data
;
1499 set_bit(i
, cnf
->state
);
1501 if (cnf
== net
->ipv4
.devconf_dflt
)
1502 devinet_copy_dflt_conf(net
, i
);
1503 if (i
== IPV4_DEVCONF_ACCEPT_LOCAL
- 1)
1504 if ((new_value
== 0) && (old_value
!= 0))
1505 rt_cache_flush(net
, 0);
1511 static int devinet_sysctl_forward(ctl_table
*ctl
, int write
,
1512 void __user
*buffer
,
1513 size_t *lenp
, loff_t
*ppos
)
1515 int *valp
= ctl
->data
;
1518 int ret
= proc_dointvec(ctl
, write
, buffer
, lenp
, ppos
);
1520 if (write
&& *valp
!= val
) {
1521 struct net
*net
= ctl
->extra2
;
1523 if (valp
!= &IPV4_DEVCONF_DFLT(net
, FORWARDING
)) {
1524 if (!rtnl_trylock()) {
1525 /* Restore the original values before restarting */
1528 return restart_syscall();
1530 if (valp
== &IPV4_DEVCONF_ALL(net
, FORWARDING
)) {
1531 inet_forward_change(net
);
1533 struct ipv4_devconf
*cnf
= ctl
->extra1
;
1534 struct in_device
*idev
=
1535 container_of(cnf
, struct in_device
, cnf
);
1536 dev_disable_lro(idev
->dev
);
1539 rt_cache_flush(net
, 0);
1546 static int ipv4_doint_and_flush(ctl_table
*ctl
, int write
,
1547 void __user
*buffer
,
1548 size_t *lenp
, loff_t
*ppos
)
1550 int *valp
= ctl
->data
;
1552 int ret
= proc_dointvec(ctl
, write
, buffer
, lenp
, ppos
);
1553 struct net
*net
= ctl
->extra2
;
1555 if (write
&& *valp
!= val
)
1556 rt_cache_flush(net
, 0);
1561 #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc) \
1564 .data = ipv4_devconf.data + \
1565 IPV4_DEVCONF_ ## attr - 1, \
1566 .maxlen = sizeof(int), \
1568 .proc_handler = proc, \
1569 .extra1 = &ipv4_devconf, \
1572 #define DEVINET_SYSCTL_RW_ENTRY(attr, name) \
1573 DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc)
1575 #define DEVINET_SYSCTL_RO_ENTRY(attr, name) \
1576 DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc)
1578 #define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc) \
1579 DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc)
1581 #define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \
1582 DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush)
1584 static struct devinet_sysctl_table
{
1585 struct ctl_table_header
*sysctl_header
;
1586 struct ctl_table devinet_vars
[__IPV4_DEVCONF_MAX
];
1587 } devinet_sysctl
= {
1589 DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING
, "forwarding",
1590 devinet_sysctl_forward
),
1591 DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING
, "mc_forwarding"),
1593 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS
, "accept_redirects"),
1594 DEVINET_SYSCTL_RW_ENTRY(SECURE_REDIRECTS
, "secure_redirects"),
1595 DEVINET_SYSCTL_RW_ENTRY(SHARED_MEDIA
, "shared_media"),
1596 DEVINET_SYSCTL_RW_ENTRY(RP_FILTER
, "rp_filter"),
1597 DEVINET_SYSCTL_RW_ENTRY(SEND_REDIRECTS
, "send_redirects"),
1598 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE
,
1599 "accept_source_route"),
1600 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_LOCAL
, "accept_local"),
1601 DEVINET_SYSCTL_RW_ENTRY(SRC_VMARK
, "src_valid_mark"),
1602 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP
, "proxy_arp"),
1603 DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID
, "medium_id"),
1604 DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY
, "bootp_relay"),
1605 DEVINET_SYSCTL_RW_ENTRY(LOG_MARTIANS
, "log_martians"),
1606 DEVINET_SYSCTL_RW_ENTRY(TAG
, "tag"),
1607 DEVINET_SYSCTL_RW_ENTRY(ARPFILTER
, "arp_filter"),
1608 DEVINET_SYSCTL_RW_ENTRY(ARP_ANNOUNCE
, "arp_announce"),
1609 DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE
, "arp_ignore"),
1610 DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT
, "arp_accept"),
1611 DEVINET_SYSCTL_RW_ENTRY(ARP_NOTIFY
, "arp_notify"),
1612 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP_PVLAN
, "proxy_arp_pvlan"),
1614 DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM
, "disable_xfrm"),
1615 DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY
, "disable_policy"),
1616 DEVINET_SYSCTL_FLUSHING_ENTRY(FORCE_IGMP_VERSION
,
1617 "force_igmp_version"),
1618 DEVINET_SYSCTL_FLUSHING_ENTRY(PROMOTE_SECONDARIES
,
1619 "promote_secondaries"),
1623 static int __devinet_sysctl_register(struct net
*net
, char *dev_name
,
1624 struct ipv4_devconf
*p
)
1627 struct devinet_sysctl_table
*t
;
1628 char path
[sizeof("net/ipv4/conf/") + IFNAMSIZ
];
1630 t
= kmemdup(&devinet_sysctl
, sizeof(*t
), GFP_KERNEL
);
1634 for (i
= 0; i
< ARRAY_SIZE(t
->devinet_vars
) - 1; i
++) {
1635 t
->devinet_vars
[i
].data
+= (char *)p
- (char *)&ipv4_devconf
;
1636 t
->devinet_vars
[i
].extra1
= p
;
1637 t
->devinet_vars
[i
].extra2
= net
;
1640 snprintf(path
, sizeof(path
), "net/ipv4/conf/%s", dev_name
);
1642 t
->sysctl_header
= register_net_sysctl(net
, path
, t
->devinet_vars
);
1643 if (!t
->sysctl_header
)
1655 static void __devinet_sysctl_unregister(struct ipv4_devconf
*cnf
)
1657 struct devinet_sysctl_table
*t
= cnf
->sysctl
;
1663 unregister_net_sysctl_table(t
->sysctl_header
);
1667 static void devinet_sysctl_register(struct in_device
*idev
)
1669 neigh_sysctl_register(idev
->dev
, idev
->arp_parms
, "ipv4", NULL
);
1670 __devinet_sysctl_register(dev_net(idev
->dev
), idev
->dev
->name
,
1674 static void devinet_sysctl_unregister(struct in_device
*idev
)
1676 __devinet_sysctl_unregister(&idev
->cnf
);
1677 neigh_sysctl_unregister(idev
->arp_parms
);
1680 static struct ctl_table ctl_forward_entry
[] = {
1682 .procname
= "ip_forward",
1683 .data
= &ipv4_devconf
.data
[
1684 IPV4_DEVCONF_FORWARDING
- 1],
1685 .maxlen
= sizeof(int),
1687 .proc_handler
= devinet_sysctl_forward
,
1688 .extra1
= &ipv4_devconf
,
1689 .extra2
= &init_net
,
1695 static __net_init
int devinet_init_net(struct net
*net
)
1698 struct ipv4_devconf
*all
, *dflt
;
1699 #ifdef CONFIG_SYSCTL
1700 struct ctl_table
*tbl
= ctl_forward_entry
;
1701 struct ctl_table_header
*forw_hdr
;
1705 all
= &ipv4_devconf
;
1706 dflt
= &ipv4_devconf_dflt
;
1708 if (!net_eq(net
, &init_net
)) {
1709 all
= kmemdup(all
, sizeof(ipv4_devconf
), GFP_KERNEL
);
1713 dflt
= kmemdup(dflt
, sizeof(ipv4_devconf_dflt
), GFP_KERNEL
);
1715 goto err_alloc_dflt
;
1717 #ifdef CONFIG_SYSCTL
1718 tbl
= kmemdup(tbl
, sizeof(ctl_forward_entry
), GFP_KERNEL
);
1722 tbl
[0].data
= &all
->data
[IPV4_DEVCONF_FORWARDING
- 1];
1723 tbl
[0].extra1
= all
;
1724 tbl
[0].extra2
= net
;
1728 #ifdef CONFIG_SYSCTL
1729 err
= __devinet_sysctl_register(net
, "all", all
);
1733 err
= __devinet_sysctl_register(net
, "default", dflt
);
1738 forw_hdr
= register_net_sysctl(net
, "net/ipv4", tbl
);
1739 if (forw_hdr
== NULL
)
1741 net
->ipv4
.forw_hdr
= forw_hdr
;
1744 net
->ipv4
.devconf_all
= all
;
1745 net
->ipv4
.devconf_dflt
= dflt
;
1748 #ifdef CONFIG_SYSCTL
1750 __devinet_sysctl_unregister(dflt
);
1752 __devinet_sysctl_unregister(all
);
1754 if (tbl
!= ctl_forward_entry
)
1758 if (dflt
!= &ipv4_devconf_dflt
)
1761 if (all
!= &ipv4_devconf
)
1767 static __net_exit
void devinet_exit_net(struct net
*net
)
1769 #ifdef CONFIG_SYSCTL
1770 struct ctl_table
*tbl
;
1772 tbl
= net
->ipv4
.forw_hdr
->ctl_table_arg
;
1773 unregister_net_sysctl_table(net
->ipv4
.forw_hdr
);
1774 __devinet_sysctl_unregister(net
->ipv4
.devconf_dflt
);
1775 __devinet_sysctl_unregister(net
->ipv4
.devconf_all
);
1778 kfree(net
->ipv4
.devconf_dflt
);
1779 kfree(net
->ipv4
.devconf_all
);
1782 static __net_initdata
struct pernet_operations devinet_ops
= {
1783 .init
= devinet_init_net
,
1784 .exit
= devinet_exit_net
,
1787 static struct rtnl_af_ops inet_af_ops
= {
1789 .fill_link_af
= inet_fill_link_af
,
1790 .get_link_af_size
= inet_get_link_af_size
,
1791 .validate_link_af
= inet_validate_link_af
,
1792 .set_link_af
= inet_set_link_af
,
1795 void __init
devinet_init(void)
1799 for (i
= 0; i
< IN4_ADDR_HSIZE
; i
++)
1800 INIT_HLIST_HEAD(&inet_addr_lst
[i
]);
1802 register_pernet_subsys(&devinet_ops
);
1804 register_gifconf(PF_INET
, inet_gifconf
);
1805 register_netdevice_notifier(&ip_netdev_notifier
);
1807 rtnl_af_register(&inet_af_ops
);
1809 rtnl_register(PF_INET
, RTM_NEWADDR
, inet_rtm_newaddr
, NULL
, NULL
);
1810 rtnl_register(PF_INET
, RTM_DELADDR
, inet_rtm_deladdr
, NULL
, NULL
);
1811 rtnl_register(PF_INET
, RTM_GETADDR
, NULL
, inet_dump_ifaddr
, NULL
);