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 <asm/system.h>
31 #include <linux/bitops.h>
32 #include <linux/capability.h>
33 #include <linux/module.h>
34 #include <linux/types.h>
35 #include <linux/kernel.h>
36 #include <linux/string.h>
38 #include <linux/socket.h>
39 #include <linux/sockios.h>
41 #include <linux/errno.h>
42 #include <linux/interrupt.h>
43 #include <linux/if_addr.h>
44 #include <linux/if_ether.h>
45 #include <linux/inet.h>
46 #include <linux/netdevice.h>
47 #include <linux/etherdevice.h>
48 #include <linux/skbuff.h>
49 #include <linux/init.h>
50 #include <linux/notifier.h>
51 #include <linux/inetdevice.h>
52 #include <linux/igmp.h>
53 #include <linux/slab.h>
54 #include <linux/hash.h>
56 #include <linux/sysctl.h>
58 #include <linux/kmod.h>
62 #include <net/route.h>
63 #include <net/ip_fib.h>
64 #include <net/rtnetlink.h>
65 #include <net/net_namespace.h>
67 static struct ipv4_devconf ipv4_devconf
= {
69 [IPV4_DEVCONF_ACCEPT_REDIRECTS
- 1] = 1,
70 [IPV4_DEVCONF_SEND_REDIRECTS
- 1] = 1,
71 [IPV4_DEVCONF_SECURE_REDIRECTS
- 1] = 1,
72 [IPV4_DEVCONF_SHARED_MEDIA
- 1] = 1,
76 static struct ipv4_devconf ipv4_devconf_dflt
= {
78 [IPV4_DEVCONF_ACCEPT_REDIRECTS
- 1] = 1,
79 [IPV4_DEVCONF_SEND_REDIRECTS
- 1] = 1,
80 [IPV4_DEVCONF_SECURE_REDIRECTS
- 1] = 1,
81 [IPV4_DEVCONF_SHARED_MEDIA
- 1] = 1,
82 [IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE
- 1] = 1,
86 #define IPV4_DEVCONF_DFLT(net, attr) \
87 IPV4_DEVCONF((*net->ipv4.devconf_dflt), attr)
89 static const struct nla_policy ifa_ipv4_policy
[IFA_MAX
+1] = {
90 [IFA_LOCAL
] = { .type
= NLA_U32
},
91 [IFA_ADDRESS
] = { .type
= NLA_U32
},
92 [IFA_BROADCAST
] = { .type
= NLA_U32
},
93 [IFA_LABEL
] = { .type
= NLA_STRING
, .len
= IFNAMSIZ
- 1 },
96 /* inet_addr_hash's shifting is dependent upon this IN4_ADDR_HSIZE
97 * value. So if you change this define, make appropriate changes to
98 * inet_addr_hash as well.
100 #define IN4_ADDR_HSIZE 256
101 static struct hlist_head inet_addr_lst
[IN4_ADDR_HSIZE
];
102 static DEFINE_SPINLOCK(inet_addr_hash_lock
);
104 static inline unsigned int inet_addr_hash(struct net
*net
, __be32 addr
)
106 u32 val
= (__force u32
) addr
^ hash_ptr(net
, 8);
108 return ((val
^ (val
>> 8) ^ (val
>> 16) ^ (val
>> 24)) &
109 (IN4_ADDR_HSIZE
- 1));
112 static void inet_hash_insert(struct net
*net
, struct in_ifaddr
*ifa
)
114 unsigned int hash
= inet_addr_hash(net
, ifa
->ifa_local
);
116 spin_lock(&inet_addr_hash_lock
);
117 hlist_add_head_rcu(&ifa
->hash
, &inet_addr_lst
[hash
]);
118 spin_unlock(&inet_addr_hash_lock
);
121 static void inet_hash_remove(struct in_ifaddr
*ifa
)
123 spin_lock(&inet_addr_hash_lock
);
124 hlist_del_init_rcu(&ifa
->hash
);
125 spin_unlock(&inet_addr_hash_lock
);
129 * __ip_dev_find - find the first device with a given source address.
130 * @net: the net namespace
131 * @addr: the source address
132 * @devref: if true, take a reference on the found device
134 * If a caller uses devref=false, it should be protected by RCU, or RTNL
136 struct net_device
*__ip_dev_find(struct net
*net
, __be32 addr
, bool devref
)
138 unsigned int hash
= inet_addr_hash(net
, addr
);
139 struct net_device
*result
= NULL
;
140 struct in_ifaddr
*ifa
;
141 struct hlist_node
*node
;
144 hlist_for_each_entry_rcu(ifa
, node
, &inet_addr_lst
[hash
], hash
) {
145 struct net_device
*dev
= ifa
->ifa_dev
->dev
;
147 if (!net_eq(dev_net(dev
), net
))
149 if (ifa
->ifa_local
== addr
) {
154 if (result
&& devref
)
159 EXPORT_SYMBOL(__ip_dev_find
);
161 static void rtmsg_ifa(int event
, struct in_ifaddr
*, struct nlmsghdr
*, u32
);
163 static BLOCKING_NOTIFIER_HEAD(inetaddr_chain
);
164 static void inet_del_ifa(struct in_device
*in_dev
, struct in_ifaddr
**ifap
,
167 static void devinet_sysctl_register(struct in_device
*idev
);
168 static void devinet_sysctl_unregister(struct in_device
*idev
);
170 static inline void devinet_sysctl_register(struct in_device
*idev
)
173 static inline void devinet_sysctl_unregister(struct in_device
*idev
)
178 /* Locks all the inet devices. */
180 static struct in_ifaddr
*inet_alloc_ifa(void)
182 return kzalloc(sizeof(struct in_ifaddr
), GFP_KERNEL
);
185 static void inet_rcu_free_ifa(struct rcu_head
*head
)
187 struct in_ifaddr
*ifa
= container_of(head
, struct in_ifaddr
, rcu_head
);
189 in_dev_put(ifa
->ifa_dev
);
193 static inline void inet_free_ifa(struct in_ifaddr
*ifa
)
195 call_rcu(&ifa
->rcu_head
, inet_rcu_free_ifa
);
198 void in_dev_finish_destroy(struct in_device
*idev
)
200 struct net_device
*dev
= idev
->dev
;
202 WARN_ON(idev
->ifa_list
);
203 WARN_ON(idev
->mc_list
);
204 #ifdef NET_REFCNT_DEBUG
205 printk(KERN_DEBUG
"in_dev_finish_destroy: %p=%s\n",
206 idev
, dev
? dev
->name
: "NIL");
210 pr_err("Freeing alive in_device %p\n", idev
);
214 EXPORT_SYMBOL(in_dev_finish_destroy
);
216 static struct in_device
*inetdev_init(struct net_device
*dev
)
218 struct in_device
*in_dev
;
222 in_dev
= kzalloc(sizeof(*in_dev
), GFP_KERNEL
);
225 memcpy(&in_dev
->cnf
, dev_net(dev
)->ipv4
.devconf_dflt
,
226 sizeof(in_dev
->cnf
));
227 in_dev
->cnf
.sysctl
= NULL
;
229 in_dev
->arp_parms
= neigh_parms_alloc(dev
, &arp_tbl
);
230 if (!in_dev
->arp_parms
)
232 if (IPV4_DEVCONF(in_dev
->cnf
, FORWARDING
))
233 dev_disable_lro(dev
);
234 /* Reference in_dev->dev */
236 /* Account for reference dev->ip_ptr (below) */
239 devinet_sysctl_register(in_dev
);
240 ip_mc_init_dev(in_dev
);
241 if (dev
->flags
& IFF_UP
)
244 /* we can receive as soon as ip_ptr is set -- do this last */
245 rcu_assign_pointer(dev
->ip_ptr
, in_dev
);
254 static void in_dev_rcu_put(struct rcu_head
*head
)
256 struct in_device
*idev
= container_of(head
, struct in_device
, rcu_head
);
260 static void inetdev_destroy(struct in_device
*in_dev
)
262 struct in_ifaddr
*ifa
;
263 struct net_device
*dev
;
271 ip_mc_destroy_dev(in_dev
);
273 while ((ifa
= in_dev
->ifa_list
) != NULL
) {
274 inet_del_ifa(in_dev
, &in_dev
->ifa_list
, 0);
278 rcu_assign_pointer(dev
->ip_ptr
, NULL
);
280 devinet_sysctl_unregister(in_dev
);
281 neigh_parms_release(&arp_tbl
, in_dev
->arp_parms
);
284 call_rcu(&in_dev
->rcu_head
, in_dev_rcu_put
);
287 int inet_addr_onlink(struct in_device
*in_dev
, __be32 a
, __be32 b
)
290 for_primary_ifa(in_dev
) {
291 if (inet_ifa_match(a
, ifa
)) {
292 if (!b
|| inet_ifa_match(b
, ifa
)) {
297 } endfor_ifa(in_dev
);
302 static void __inet_del_ifa(struct in_device
*in_dev
, struct in_ifaddr
**ifap
,
303 int destroy
, struct nlmsghdr
*nlh
, u32 pid
)
305 struct in_ifaddr
*promote
= NULL
;
306 struct in_ifaddr
*ifa
, *ifa1
= *ifap
;
307 struct in_ifaddr
*last_prim
= in_dev
->ifa_list
;
308 struct in_ifaddr
*prev_prom
= NULL
;
309 int do_promote
= IN_DEV_PROMOTE_SECONDARIES(in_dev
);
313 /* 1. Deleting primary ifaddr forces deletion all secondaries
314 * unless alias promotion is set
317 if (!(ifa1
->ifa_flags
& IFA_F_SECONDARY
)) {
318 struct in_ifaddr
**ifap1
= &ifa1
->ifa_next
;
320 while ((ifa
= *ifap1
) != NULL
) {
321 if (!(ifa
->ifa_flags
& IFA_F_SECONDARY
) &&
322 ifa1
->ifa_scope
<= ifa
->ifa_scope
)
325 if (!(ifa
->ifa_flags
& IFA_F_SECONDARY
) ||
326 ifa1
->ifa_mask
!= ifa
->ifa_mask
||
327 !inet_ifa_match(ifa1
->ifa_address
, ifa
)) {
328 ifap1
= &ifa
->ifa_next
;
334 inet_hash_remove(ifa
);
335 *ifap1
= ifa
->ifa_next
;
337 rtmsg_ifa(RTM_DELADDR
, ifa
, nlh
, pid
);
338 blocking_notifier_call_chain(&inetaddr_chain
,
350 *ifap
= ifa1
->ifa_next
;
351 inet_hash_remove(ifa1
);
353 /* 3. Announce address deletion */
355 /* Send message first, then call notifier.
356 At first sight, FIB update triggered by notifier
357 will refer to already deleted ifaddr, that could confuse
358 netlink listeners. It is not true: look, gated sees
359 that route deleted and if it still thinks that ifaddr
360 is valid, it will try to restore deleted routes... Grr.
361 So that, this order is correct.
363 rtmsg_ifa(RTM_DELADDR
, ifa1
, nlh
, pid
);
364 blocking_notifier_call_chain(&inetaddr_chain
, NETDEV_DOWN
, ifa1
);
369 prev_prom
->ifa_next
= promote
->ifa_next
;
370 promote
->ifa_next
= last_prim
->ifa_next
;
371 last_prim
->ifa_next
= promote
;
374 promote
->ifa_flags
&= ~IFA_F_SECONDARY
;
375 rtmsg_ifa(RTM_NEWADDR
, promote
, nlh
, pid
);
376 blocking_notifier_call_chain(&inetaddr_chain
,
378 for (ifa
= promote
->ifa_next
; ifa
; ifa
= ifa
->ifa_next
) {
379 if (ifa1
->ifa_mask
!= ifa
->ifa_mask
||
380 !inet_ifa_match(ifa1
->ifa_address
, ifa
))
390 static void inet_del_ifa(struct in_device
*in_dev
, struct in_ifaddr
**ifap
,
393 __inet_del_ifa(in_dev
, ifap
, destroy
, NULL
, 0);
396 static int __inet_insert_ifa(struct in_ifaddr
*ifa
, struct nlmsghdr
*nlh
,
399 struct in_device
*in_dev
= ifa
->ifa_dev
;
400 struct in_ifaddr
*ifa1
, **ifap
, **last_primary
;
404 if (!ifa
->ifa_local
) {
409 ifa
->ifa_flags
&= ~IFA_F_SECONDARY
;
410 last_primary
= &in_dev
->ifa_list
;
412 for (ifap
= &in_dev
->ifa_list
; (ifa1
= *ifap
) != NULL
;
413 ifap
= &ifa1
->ifa_next
) {
414 if (!(ifa1
->ifa_flags
& IFA_F_SECONDARY
) &&
415 ifa
->ifa_scope
<= ifa1
->ifa_scope
)
416 last_primary
= &ifa1
->ifa_next
;
417 if (ifa1
->ifa_mask
== ifa
->ifa_mask
&&
418 inet_ifa_match(ifa1
->ifa_address
, ifa
)) {
419 if (ifa1
->ifa_local
== ifa
->ifa_local
) {
423 if (ifa1
->ifa_scope
!= ifa
->ifa_scope
) {
427 ifa
->ifa_flags
|= IFA_F_SECONDARY
;
431 if (!(ifa
->ifa_flags
& IFA_F_SECONDARY
)) {
432 net_srandom(ifa
->ifa_local
);
436 ifa
->ifa_next
= *ifap
;
439 inet_hash_insert(dev_net(in_dev
->dev
), ifa
);
441 /* Send message first, then call notifier.
442 Notifier will trigger FIB update, so that
443 listeners of netlink will know about new ifaddr */
444 rtmsg_ifa(RTM_NEWADDR
, ifa
, nlh
, pid
);
445 blocking_notifier_call_chain(&inetaddr_chain
, NETDEV_UP
, ifa
);
450 static int inet_insert_ifa(struct in_ifaddr
*ifa
)
452 return __inet_insert_ifa(ifa
, NULL
, 0);
455 static int inet_set_ifa(struct net_device
*dev
, struct in_ifaddr
*ifa
)
457 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
465 ipv4_devconf_setall(in_dev
);
466 if (ifa
->ifa_dev
!= in_dev
) {
467 WARN_ON(ifa
->ifa_dev
);
469 ifa
->ifa_dev
= in_dev
;
471 if (ipv4_is_loopback(ifa
->ifa_local
))
472 ifa
->ifa_scope
= RT_SCOPE_HOST
;
473 return inet_insert_ifa(ifa
);
476 /* Caller must hold RCU or RTNL :
477 * We dont take a reference on found in_device
479 struct in_device
*inetdev_by_index(struct net
*net
, int ifindex
)
481 struct net_device
*dev
;
482 struct in_device
*in_dev
= NULL
;
485 dev
= dev_get_by_index_rcu(net
, ifindex
);
487 in_dev
= rcu_dereference_rtnl(dev
->ip_ptr
);
491 EXPORT_SYMBOL(inetdev_by_index
);
493 /* Called only from RTNL semaphored context. No locks. */
495 struct in_ifaddr
*inet_ifa_byprefix(struct in_device
*in_dev
, __be32 prefix
,
500 for_primary_ifa(in_dev
) {
501 if (ifa
->ifa_mask
== mask
&& inet_ifa_match(prefix
, ifa
))
503 } endfor_ifa(in_dev
);
507 static int inet_rtm_deladdr(struct sk_buff
*skb
, struct nlmsghdr
*nlh
, void *arg
)
509 struct net
*net
= sock_net(skb
->sk
);
510 struct nlattr
*tb
[IFA_MAX
+1];
511 struct in_device
*in_dev
;
512 struct ifaddrmsg
*ifm
;
513 struct in_ifaddr
*ifa
, **ifap
;
518 err
= nlmsg_parse(nlh
, sizeof(*ifm
), tb
, IFA_MAX
, ifa_ipv4_policy
);
522 ifm
= nlmsg_data(nlh
);
523 in_dev
= inetdev_by_index(net
, ifm
->ifa_index
);
524 if (in_dev
== NULL
) {
529 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
530 ifap
= &ifa
->ifa_next
) {
532 ifa
->ifa_local
!= nla_get_be32(tb
[IFA_LOCAL
]))
535 if (tb
[IFA_LABEL
] && nla_strcmp(tb
[IFA_LABEL
], ifa
->ifa_label
))
538 if (tb
[IFA_ADDRESS
] &&
539 (ifm
->ifa_prefixlen
!= ifa
->ifa_prefixlen
||
540 !inet_ifa_match(nla_get_be32(tb
[IFA_ADDRESS
]), ifa
)))
543 __inet_del_ifa(in_dev
, ifap
, 1, nlh
, NETLINK_CB(skb
).pid
);
547 err
= -EADDRNOTAVAIL
;
552 static struct in_ifaddr
*rtm_to_ifaddr(struct net
*net
, struct nlmsghdr
*nlh
)
554 struct nlattr
*tb
[IFA_MAX
+1];
555 struct in_ifaddr
*ifa
;
556 struct ifaddrmsg
*ifm
;
557 struct net_device
*dev
;
558 struct in_device
*in_dev
;
561 err
= nlmsg_parse(nlh
, sizeof(*ifm
), tb
, IFA_MAX
, ifa_ipv4_policy
);
565 ifm
= nlmsg_data(nlh
);
567 if (ifm
->ifa_prefixlen
> 32 || tb
[IFA_LOCAL
] == NULL
)
570 dev
= __dev_get_by_index(net
, ifm
->ifa_index
);
575 in_dev
= __in_dev_get_rtnl(dev
);
580 ifa
= inet_alloc_ifa();
583 * A potential indev allocation can be left alive, it stays
584 * assigned to its device and is destroy with it.
588 ipv4_devconf_setall(in_dev
);
591 if (tb
[IFA_ADDRESS
] == NULL
)
592 tb
[IFA_ADDRESS
] = tb
[IFA_LOCAL
];
594 INIT_HLIST_NODE(&ifa
->hash
);
595 ifa
->ifa_prefixlen
= ifm
->ifa_prefixlen
;
596 ifa
->ifa_mask
= inet_make_mask(ifm
->ifa_prefixlen
);
597 ifa
->ifa_flags
= ifm
->ifa_flags
;
598 ifa
->ifa_scope
= ifm
->ifa_scope
;
599 ifa
->ifa_dev
= in_dev
;
601 ifa
->ifa_local
= nla_get_be32(tb
[IFA_LOCAL
]);
602 ifa
->ifa_address
= nla_get_be32(tb
[IFA_ADDRESS
]);
604 if (tb
[IFA_BROADCAST
])
605 ifa
->ifa_broadcast
= nla_get_be32(tb
[IFA_BROADCAST
]);
608 nla_strlcpy(ifa
->ifa_label
, tb
[IFA_LABEL
], IFNAMSIZ
);
610 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
618 static int inet_rtm_newaddr(struct sk_buff
*skb
, struct nlmsghdr
*nlh
, void *arg
)
620 struct net
*net
= sock_net(skb
->sk
);
621 struct in_ifaddr
*ifa
;
625 ifa
= rtm_to_ifaddr(net
, nlh
);
629 return __inet_insert_ifa(ifa
, nlh
, NETLINK_CB(skb
).pid
);
633 * Determine a default network mask, based on the IP address.
636 static inline int inet_abc_len(__be32 addr
)
638 int rc
= -1; /* Something else, probably a multicast. */
640 if (ipv4_is_zeronet(addr
))
643 __u32 haddr
= ntohl(addr
);
645 if (IN_CLASSA(haddr
))
647 else if (IN_CLASSB(haddr
))
649 else if (IN_CLASSC(haddr
))
657 int devinet_ioctl(struct net
*net
, unsigned int cmd
, void __user
*arg
)
660 struct sockaddr_in sin_orig
;
661 struct sockaddr_in
*sin
= (struct sockaddr_in
*)&ifr
.ifr_addr
;
662 struct in_device
*in_dev
;
663 struct in_ifaddr
**ifap
= NULL
;
664 struct in_ifaddr
*ifa
= NULL
;
665 struct net_device
*dev
;
668 int tryaddrmatch
= 0;
671 * Fetch the caller's info block into kernel space
674 if (copy_from_user(&ifr
, arg
, sizeof(struct ifreq
)))
676 ifr
.ifr_name
[IFNAMSIZ
- 1] = 0;
678 /* save original address for comparison */
679 memcpy(&sin_orig
, sin
, sizeof(*sin
));
681 colon
= strchr(ifr
.ifr_name
, ':');
685 dev_load(net
, ifr
.ifr_name
);
688 case SIOCGIFADDR
: /* Get interface address */
689 case SIOCGIFBRDADDR
: /* Get the broadcast address */
690 case SIOCGIFDSTADDR
: /* Get the destination address */
691 case SIOCGIFNETMASK
: /* Get the netmask for the interface */
692 /* Note that these ioctls will not sleep,
693 so that we do not impose a lock.
694 One day we will be forced to put shlock here (I mean SMP)
696 tryaddrmatch
= (sin_orig
.sin_family
== AF_INET
);
697 memset(sin
, 0, sizeof(*sin
));
698 sin
->sin_family
= AF_INET
;
703 if (!capable(CAP_NET_ADMIN
))
706 case SIOCSIFADDR
: /* Set interface address (and family) */
707 case SIOCSIFBRDADDR
: /* Set the broadcast address */
708 case SIOCSIFDSTADDR
: /* Set the destination address */
709 case SIOCSIFNETMASK
: /* Set the netmask for the interface */
711 if (!capable(CAP_NET_ADMIN
))
714 if (sin
->sin_family
!= AF_INET
)
725 dev
= __dev_get_by_name(net
, ifr
.ifr_name
);
732 in_dev
= __in_dev_get_rtnl(dev
);
735 /* Matthias Andree */
736 /* compare label and address (4.4BSD style) */
737 /* note: we only do this for a limited set of ioctls
738 and only if the original address family was AF_INET.
739 This is checked above. */
740 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
741 ifap
= &ifa
->ifa_next
) {
742 if (!strcmp(ifr
.ifr_name
, ifa
->ifa_label
) &&
743 sin_orig
.sin_addr
.s_addr
==
749 /* we didn't get a match, maybe the application is
750 4.3BSD-style and passed in junk so we fall back to
751 comparing just the label */
753 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
754 ifap
= &ifa
->ifa_next
)
755 if (!strcmp(ifr
.ifr_name
, ifa
->ifa_label
))
760 ret
= -EADDRNOTAVAIL
;
761 if (!ifa
&& cmd
!= SIOCSIFADDR
&& cmd
!= SIOCSIFFLAGS
)
765 case SIOCGIFADDR
: /* Get interface address */
766 sin
->sin_addr
.s_addr
= ifa
->ifa_local
;
769 case SIOCGIFBRDADDR
: /* Get the broadcast address */
770 sin
->sin_addr
.s_addr
= ifa
->ifa_broadcast
;
773 case SIOCGIFDSTADDR
: /* Get the destination address */
774 sin
->sin_addr
.s_addr
= ifa
->ifa_address
;
777 case SIOCGIFNETMASK
: /* Get the netmask for the interface */
778 sin
->sin_addr
.s_addr
= ifa
->ifa_mask
;
783 ret
= -EADDRNOTAVAIL
;
787 if (!(ifr
.ifr_flags
& IFF_UP
))
788 inet_del_ifa(in_dev
, ifap
, 1);
791 ret
= dev_change_flags(dev
, ifr
.ifr_flags
);
794 case SIOCSIFADDR
: /* Set interface address (and family) */
796 if (inet_abc_len(sin
->sin_addr
.s_addr
) < 0)
801 ifa
= inet_alloc_ifa();
802 INIT_HLIST_NODE(&ifa
->hash
);
806 memcpy(ifa
->ifa_label
, ifr
.ifr_name
, IFNAMSIZ
);
808 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
811 if (ifa
->ifa_local
== sin
->sin_addr
.s_addr
)
813 inet_del_ifa(in_dev
, ifap
, 0);
814 ifa
->ifa_broadcast
= 0;
818 ifa
->ifa_address
= ifa
->ifa_local
= sin
->sin_addr
.s_addr
;
820 if (!(dev
->flags
& IFF_POINTOPOINT
)) {
821 ifa
->ifa_prefixlen
= inet_abc_len(ifa
->ifa_address
);
822 ifa
->ifa_mask
= inet_make_mask(ifa
->ifa_prefixlen
);
823 if ((dev
->flags
& IFF_BROADCAST
) &&
824 ifa
->ifa_prefixlen
< 31)
825 ifa
->ifa_broadcast
= ifa
->ifa_address
|
828 ifa
->ifa_prefixlen
= 32;
829 ifa
->ifa_mask
= inet_make_mask(32);
831 ret
= inet_set_ifa(dev
, ifa
);
834 case SIOCSIFBRDADDR
: /* Set the broadcast address */
836 if (ifa
->ifa_broadcast
!= sin
->sin_addr
.s_addr
) {
837 inet_del_ifa(in_dev
, ifap
, 0);
838 ifa
->ifa_broadcast
= sin
->sin_addr
.s_addr
;
839 inet_insert_ifa(ifa
);
843 case SIOCSIFDSTADDR
: /* Set the destination address */
845 if (ifa
->ifa_address
== sin
->sin_addr
.s_addr
)
848 if (inet_abc_len(sin
->sin_addr
.s_addr
) < 0)
851 inet_del_ifa(in_dev
, ifap
, 0);
852 ifa
->ifa_address
= sin
->sin_addr
.s_addr
;
853 inet_insert_ifa(ifa
);
856 case SIOCSIFNETMASK
: /* Set the netmask for the interface */
859 * The mask we set must be legal.
862 if (bad_mask(sin
->sin_addr
.s_addr
, 0))
865 if (ifa
->ifa_mask
!= sin
->sin_addr
.s_addr
) {
866 __be32 old_mask
= ifa
->ifa_mask
;
867 inet_del_ifa(in_dev
, ifap
, 0);
868 ifa
->ifa_mask
= sin
->sin_addr
.s_addr
;
869 ifa
->ifa_prefixlen
= inet_mask_len(ifa
->ifa_mask
);
871 /* See if current broadcast address matches
872 * with current netmask, then recalculate
873 * the broadcast address. Otherwise it's a
874 * funny address, so don't touch it since
875 * the user seems to know what (s)he's doing...
877 if ((dev
->flags
& IFF_BROADCAST
) &&
878 (ifa
->ifa_prefixlen
< 31) &&
879 (ifa
->ifa_broadcast
==
880 (ifa
->ifa_local
|~old_mask
))) {
881 ifa
->ifa_broadcast
= (ifa
->ifa_local
|
882 ~sin
->sin_addr
.s_addr
);
884 inet_insert_ifa(ifa
);
894 ret
= copy_to_user(arg
, &ifr
, sizeof(struct ifreq
)) ? -EFAULT
: 0;
898 static int inet_gifconf(struct net_device
*dev
, char __user
*buf
, int len
)
900 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
901 struct in_ifaddr
*ifa
;
908 for (ifa
= in_dev
->ifa_list
; ifa
; ifa
= ifa
->ifa_next
) {
913 if (len
< (int) sizeof(ifr
))
915 memset(&ifr
, 0, sizeof(struct ifreq
));
917 strcpy(ifr
.ifr_name
, ifa
->ifa_label
);
919 strcpy(ifr
.ifr_name
, dev
->name
);
921 (*(struct sockaddr_in
*)&ifr
.ifr_addr
).sin_family
= AF_INET
;
922 (*(struct sockaddr_in
*)&ifr
.ifr_addr
).sin_addr
.s_addr
=
925 if (copy_to_user(buf
, &ifr
, sizeof(struct ifreq
))) {
929 buf
+= sizeof(struct ifreq
);
930 len
-= sizeof(struct ifreq
);
931 done
+= sizeof(struct ifreq
);
937 __be32
inet_select_addr(const struct net_device
*dev
, __be32 dst
, int scope
)
940 struct in_device
*in_dev
;
941 struct net
*net
= dev_net(dev
);
944 in_dev
= __in_dev_get_rcu(dev
);
948 for_primary_ifa(in_dev
) {
949 if (ifa
->ifa_scope
> scope
)
951 if (!dst
|| inet_ifa_match(dst
, ifa
)) {
952 addr
= ifa
->ifa_local
;
956 addr
= ifa
->ifa_local
;
957 } endfor_ifa(in_dev
);
963 /* Not loopback addresses on loopback should be preferred
964 in this case. It is importnat that lo is the first interface
967 for_each_netdev_rcu(net
, dev
) {
968 in_dev
= __in_dev_get_rcu(dev
);
972 for_primary_ifa(in_dev
) {
973 if (ifa
->ifa_scope
!= RT_SCOPE_LINK
&&
974 ifa
->ifa_scope
<= scope
) {
975 addr
= ifa
->ifa_local
;
978 } endfor_ifa(in_dev
);
984 EXPORT_SYMBOL(inet_select_addr
);
986 static __be32
confirm_addr_indev(struct in_device
*in_dev
, __be32 dst
,
987 __be32 local
, int scope
)
994 (local
== ifa
->ifa_local
|| !local
) &&
995 ifa
->ifa_scope
<= scope
) {
996 addr
= ifa
->ifa_local
;
1001 same
= (!local
|| inet_ifa_match(local
, ifa
)) &&
1002 (!dst
|| inet_ifa_match(dst
, ifa
));
1006 /* Is the selected addr into dst subnet? */
1007 if (inet_ifa_match(addr
, ifa
))
1009 /* No, then can we use new local src? */
1010 if (ifa
->ifa_scope
<= scope
) {
1011 addr
= ifa
->ifa_local
;
1014 /* search for large dst subnet for addr */
1018 } endfor_ifa(in_dev
);
1020 return same
? addr
: 0;
1024 * Confirm that local IP address exists using wildcards:
1025 * - in_dev: only on this interface, 0=any interface
1026 * - dst: only in the same subnet as dst, 0=any dst
1027 * - local: address, 0=autoselect the local address
1028 * - scope: maximum allowed scope value for the local address
1030 __be32
inet_confirm_addr(struct in_device
*in_dev
,
1031 __be32 dst
, __be32 local
, int scope
)
1034 struct net_device
*dev
;
1037 if (scope
!= RT_SCOPE_LINK
)
1038 return confirm_addr_indev(in_dev
, dst
, local
, scope
);
1040 net
= dev_net(in_dev
->dev
);
1042 for_each_netdev_rcu(net
, dev
) {
1043 in_dev
= __in_dev_get_rcu(dev
);
1045 addr
= confirm_addr_indev(in_dev
, dst
, local
, scope
);
1059 int register_inetaddr_notifier(struct notifier_block
*nb
)
1061 return blocking_notifier_chain_register(&inetaddr_chain
, nb
);
1063 EXPORT_SYMBOL(register_inetaddr_notifier
);
1065 int unregister_inetaddr_notifier(struct notifier_block
*nb
)
1067 return blocking_notifier_chain_unregister(&inetaddr_chain
, nb
);
1069 EXPORT_SYMBOL(unregister_inetaddr_notifier
);
1071 /* Rename ifa_labels for a device name change. Make some effort to preserve
1072 * existing alias numbering and to create unique labels if possible.
1074 static void inetdev_changename(struct net_device
*dev
, struct in_device
*in_dev
)
1076 struct in_ifaddr
*ifa
;
1079 for (ifa
= in_dev
->ifa_list
; ifa
; ifa
= ifa
->ifa_next
) {
1080 char old
[IFNAMSIZ
], *dot
;
1082 memcpy(old
, ifa
->ifa_label
, IFNAMSIZ
);
1083 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
1086 dot
= strchr(old
, ':');
1088 sprintf(old
, ":%d", named
);
1091 if (strlen(dot
) + strlen(dev
->name
) < IFNAMSIZ
)
1092 strcat(ifa
->ifa_label
, dot
);
1094 strcpy(ifa
->ifa_label
+ (IFNAMSIZ
- strlen(dot
) - 1), dot
);
1096 rtmsg_ifa(RTM_NEWADDR
, ifa
, NULL
, 0);
1100 static inline bool inetdev_valid_mtu(unsigned mtu
)
1105 static void inetdev_send_gratuitous_arp(struct net_device
*dev
,
1106 struct in_device
*in_dev
)
1109 struct in_ifaddr
*ifa
= in_dev
->ifa_list
;
1114 arp_send(ARPOP_REQUEST
, ETH_P_ARP
,
1115 ifa
->ifa_local
, dev
,
1116 ifa
->ifa_local
, NULL
,
1117 dev
->dev_addr
, NULL
);
1120 /* Called only under RTNL semaphore */
1122 static int inetdev_event(struct notifier_block
*this, unsigned long event
,
1125 struct net_device
*dev
= ptr
;
1126 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
1131 if (event
== NETDEV_REGISTER
) {
1132 in_dev
= inetdev_init(dev
);
1134 return notifier_from_errno(-ENOMEM
);
1135 if (dev
->flags
& IFF_LOOPBACK
) {
1136 IN_DEV_CONF_SET(in_dev
, NOXFRM
, 1);
1137 IN_DEV_CONF_SET(in_dev
, NOPOLICY
, 1);
1139 } else if (event
== NETDEV_CHANGEMTU
) {
1140 /* Re-enabling IP */
1141 if (inetdev_valid_mtu(dev
->mtu
))
1142 in_dev
= inetdev_init(dev
);
1148 case NETDEV_REGISTER
:
1149 printk(KERN_DEBUG
"inetdev_event: bug\n");
1150 rcu_assign_pointer(dev
->ip_ptr
, NULL
);
1153 if (!inetdev_valid_mtu(dev
->mtu
))
1155 if (dev
->flags
& IFF_LOOPBACK
) {
1156 struct in_ifaddr
*ifa
= inet_alloc_ifa();
1159 INIT_HLIST_NODE(&ifa
->hash
);
1161 ifa
->ifa_address
= htonl(INADDR_LOOPBACK
);
1162 ifa
->ifa_prefixlen
= 8;
1163 ifa
->ifa_mask
= inet_make_mask(8);
1164 in_dev_hold(in_dev
);
1165 ifa
->ifa_dev
= in_dev
;
1166 ifa
->ifa_scope
= RT_SCOPE_HOST
;
1167 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
1168 inet_insert_ifa(ifa
);
1173 case NETDEV_CHANGEADDR
:
1174 if (!IN_DEV_ARP_NOTIFY(in_dev
))
1177 case NETDEV_NOTIFY_PEERS
:
1178 /* Send gratuitous ARP to notify of link change */
1179 inetdev_send_gratuitous_arp(dev
, in_dev
);
1184 case NETDEV_PRE_TYPE_CHANGE
:
1185 ip_mc_unmap(in_dev
);
1187 case NETDEV_POST_TYPE_CHANGE
:
1188 ip_mc_remap(in_dev
);
1190 case NETDEV_CHANGEMTU
:
1191 if (inetdev_valid_mtu(dev
->mtu
))
1193 /* disable IP when MTU is not enough */
1194 case NETDEV_UNREGISTER
:
1195 inetdev_destroy(in_dev
);
1197 case NETDEV_CHANGENAME
:
1198 /* Do not notify about label change, this event is
1199 * not interesting to applications using netlink.
1201 inetdev_changename(dev
, in_dev
);
1203 devinet_sysctl_unregister(in_dev
);
1204 devinet_sysctl_register(in_dev
);
1211 static struct notifier_block ip_netdev_notifier
= {
1212 .notifier_call
= inetdev_event
,
1215 static inline size_t inet_nlmsg_size(void)
1217 return NLMSG_ALIGN(sizeof(struct ifaddrmsg
))
1218 + nla_total_size(4) /* IFA_ADDRESS */
1219 + nla_total_size(4) /* IFA_LOCAL */
1220 + nla_total_size(4) /* IFA_BROADCAST */
1221 + nla_total_size(IFNAMSIZ
); /* IFA_LABEL */
1224 static int inet_fill_ifaddr(struct sk_buff
*skb
, struct in_ifaddr
*ifa
,
1225 u32 pid
, u32 seq
, int event
, unsigned int flags
)
1227 struct ifaddrmsg
*ifm
;
1228 struct nlmsghdr
*nlh
;
1230 nlh
= nlmsg_put(skb
, pid
, seq
, event
, sizeof(*ifm
), flags
);
1234 ifm
= nlmsg_data(nlh
);
1235 ifm
->ifa_family
= AF_INET
;
1236 ifm
->ifa_prefixlen
= ifa
->ifa_prefixlen
;
1237 ifm
->ifa_flags
= ifa
->ifa_flags
|IFA_F_PERMANENT
;
1238 ifm
->ifa_scope
= ifa
->ifa_scope
;
1239 ifm
->ifa_index
= ifa
->ifa_dev
->dev
->ifindex
;
1241 if (ifa
->ifa_address
)
1242 NLA_PUT_BE32(skb
, IFA_ADDRESS
, ifa
->ifa_address
);
1245 NLA_PUT_BE32(skb
, IFA_LOCAL
, ifa
->ifa_local
);
1247 if (ifa
->ifa_broadcast
)
1248 NLA_PUT_BE32(skb
, IFA_BROADCAST
, ifa
->ifa_broadcast
);
1250 if (ifa
->ifa_label
[0])
1251 NLA_PUT_STRING(skb
, IFA_LABEL
, ifa
->ifa_label
);
1253 return nlmsg_end(skb
, nlh
);
1256 nlmsg_cancel(skb
, nlh
);
1260 static int inet_dump_ifaddr(struct sk_buff
*skb
, struct netlink_callback
*cb
)
1262 struct net
*net
= sock_net(skb
->sk
);
1265 int ip_idx
, s_ip_idx
;
1266 struct net_device
*dev
;
1267 struct in_device
*in_dev
;
1268 struct in_ifaddr
*ifa
;
1269 struct hlist_head
*head
;
1270 struct hlist_node
*node
;
1273 s_idx
= idx
= cb
->args
[1];
1274 s_ip_idx
= ip_idx
= cb
->args
[2];
1276 for (h
= s_h
; h
< NETDEV_HASHENTRIES
; h
++, s_idx
= 0) {
1278 head
= &net
->dev_index_head
[h
];
1280 hlist_for_each_entry_rcu(dev
, node
, head
, index_hlist
) {
1283 if (h
> s_h
|| idx
> s_idx
)
1285 in_dev
= __in_dev_get_rcu(dev
);
1289 for (ifa
= in_dev
->ifa_list
, ip_idx
= 0; ifa
;
1290 ifa
= ifa
->ifa_next
, ip_idx
++) {
1291 if (ip_idx
< s_ip_idx
)
1293 if (inet_fill_ifaddr(skb
, ifa
,
1294 NETLINK_CB(cb
->skb
).pid
,
1296 RTM_NEWADDR
, NLM_F_MULTI
) <= 0) {
1310 cb
->args
[2] = ip_idx
;
1315 static void rtmsg_ifa(int event
, struct in_ifaddr
*ifa
, struct nlmsghdr
*nlh
,
1318 struct sk_buff
*skb
;
1319 u32 seq
= nlh
? nlh
->nlmsg_seq
: 0;
1323 net
= dev_net(ifa
->ifa_dev
->dev
);
1324 skb
= nlmsg_new(inet_nlmsg_size(), GFP_KERNEL
);
1328 err
= inet_fill_ifaddr(skb
, ifa
, pid
, seq
, event
, 0);
1330 /* -EMSGSIZE implies BUG in inet_nlmsg_size() */
1331 WARN_ON(err
== -EMSGSIZE
);
1335 rtnl_notify(skb
, net
, pid
, RTNLGRP_IPV4_IFADDR
, nlh
, GFP_KERNEL
);
1339 rtnl_set_sk_err(net
, RTNLGRP_IPV4_IFADDR
, err
);
1342 static size_t inet_get_link_af_size(const struct net_device
*dev
)
1344 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
1349 return nla_total_size(IPV4_DEVCONF_MAX
* 4); /* IFLA_INET_CONF */
1352 static int inet_fill_link_af(struct sk_buff
*skb
, const struct net_device
*dev
)
1354 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
1361 nla
= nla_reserve(skb
, IFLA_INET_CONF
, IPV4_DEVCONF_MAX
* 4);
1365 for (i
= 0; i
< IPV4_DEVCONF_MAX
; i
++)
1366 ((u32
*) nla_data(nla
))[i
] = in_dev
->cnf
.data
[i
];
1371 static const struct nla_policy inet_af_policy
[IFLA_INET_MAX
+1] = {
1372 [IFLA_INET_CONF
] = { .type
= NLA_NESTED
},
1375 static int inet_validate_link_af(const struct net_device
*dev
,
1376 const struct nlattr
*nla
)
1378 struct nlattr
*a
, *tb
[IFLA_INET_MAX
+1];
1381 if (dev
&& !__in_dev_get_rtnl(dev
))
1382 return -EAFNOSUPPORT
;
1384 err
= nla_parse_nested(tb
, IFLA_INET_MAX
, nla
, inet_af_policy
);
1388 if (tb
[IFLA_INET_CONF
]) {
1389 nla_for_each_nested(a
, tb
[IFLA_INET_CONF
], rem
) {
1390 int cfgid
= nla_type(a
);
1395 if (cfgid
<= 0 || cfgid
> IPV4_DEVCONF_MAX
)
1403 static int inet_set_link_af(struct net_device
*dev
, const struct nlattr
*nla
)
1405 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
1406 struct nlattr
*a
, *tb
[IFLA_INET_MAX
+1];
1410 return -EAFNOSUPPORT
;
1412 if (nla_parse_nested(tb
, IFLA_INET_MAX
, nla
, NULL
) < 0)
1415 if (tb
[IFLA_INET_CONF
]) {
1416 nla_for_each_nested(a
, tb
[IFLA_INET_CONF
], rem
)
1417 ipv4_devconf_set(in_dev
, nla_type(a
), nla_get_u32(a
));
1423 #ifdef CONFIG_SYSCTL
1425 static void devinet_copy_dflt_conf(struct net
*net
, int i
)
1427 struct net_device
*dev
;
1430 for_each_netdev_rcu(net
, dev
) {
1431 struct in_device
*in_dev
;
1433 in_dev
= __in_dev_get_rcu(dev
);
1434 if (in_dev
&& !test_bit(i
, in_dev
->cnf
.state
))
1435 in_dev
->cnf
.data
[i
] = net
->ipv4
.devconf_dflt
->data
[i
];
1440 /* called with RTNL locked */
1441 static void inet_forward_change(struct net
*net
)
1443 struct net_device
*dev
;
1444 int on
= IPV4_DEVCONF_ALL(net
, FORWARDING
);
1446 IPV4_DEVCONF_ALL(net
, ACCEPT_REDIRECTS
) = !on
;
1447 IPV4_DEVCONF_DFLT(net
, FORWARDING
) = on
;
1449 for_each_netdev(net
, dev
) {
1450 struct in_device
*in_dev
;
1452 dev_disable_lro(dev
);
1454 in_dev
= __in_dev_get_rcu(dev
);
1456 IN_DEV_CONF_SET(in_dev
, FORWARDING
, on
);
1461 static int devinet_conf_proc(ctl_table
*ctl
, int write
,
1462 void __user
*buffer
,
1463 size_t *lenp
, loff_t
*ppos
)
1465 int ret
= proc_dointvec(ctl
, write
, buffer
, lenp
, ppos
);
1468 struct ipv4_devconf
*cnf
= ctl
->extra1
;
1469 struct net
*net
= ctl
->extra2
;
1470 int i
= (int *)ctl
->data
- cnf
->data
;
1472 set_bit(i
, cnf
->state
);
1474 if (cnf
== net
->ipv4
.devconf_dflt
)
1475 devinet_copy_dflt_conf(net
, i
);
1481 static int devinet_sysctl_forward(ctl_table
*ctl
, int write
,
1482 void __user
*buffer
,
1483 size_t *lenp
, loff_t
*ppos
)
1485 int *valp
= ctl
->data
;
1488 int ret
= proc_dointvec(ctl
, write
, buffer
, lenp
, ppos
);
1490 if (write
&& *valp
!= val
) {
1491 struct net
*net
= ctl
->extra2
;
1493 if (valp
!= &IPV4_DEVCONF_DFLT(net
, FORWARDING
)) {
1494 if (!rtnl_trylock()) {
1495 /* Restore the original values before restarting */
1498 return restart_syscall();
1500 if (valp
== &IPV4_DEVCONF_ALL(net
, FORWARDING
)) {
1501 inet_forward_change(net
);
1503 struct ipv4_devconf
*cnf
= ctl
->extra1
;
1504 struct in_device
*idev
=
1505 container_of(cnf
, struct in_device
, cnf
);
1506 dev_disable_lro(idev
->dev
);
1509 rt_cache_flush(net
, 0);
1516 static int ipv4_doint_and_flush(ctl_table
*ctl
, int write
,
1517 void __user
*buffer
,
1518 size_t *lenp
, loff_t
*ppos
)
1520 int *valp
= ctl
->data
;
1522 int ret
= proc_dointvec(ctl
, write
, buffer
, lenp
, ppos
);
1523 struct net
*net
= ctl
->extra2
;
1525 if (write
&& *valp
!= val
)
1526 rt_cache_flush(net
, 0);
1531 #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc) \
1534 .data = ipv4_devconf.data + \
1535 IPV4_DEVCONF_ ## attr - 1, \
1536 .maxlen = sizeof(int), \
1538 .proc_handler = proc, \
1539 .extra1 = &ipv4_devconf, \
1542 #define DEVINET_SYSCTL_RW_ENTRY(attr, name) \
1543 DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc)
1545 #define DEVINET_SYSCTL_RO_ENTRY(attr, name) \
1546 DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc)
1548 #define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc) \
1549 DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc)
1551 #define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \
1552 DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush)
1554 static struct devinet_sysctl_table
{
1555 struct ctl_table_header
*sysctl_header
;
1556 struct ctl_table devinet_vars
[__IPV4_DEVCONF_MAX
];
1558 } devinet_sysctl
= {
1560 DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING
, "forwarding",
1561 devinet_sysctl_forward
),
1562 DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING
, "mc_forwarding"),
1564 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS
, "accept_redirects"),
1565 DEVINET_SYSCTL_RW_ENTRY(SECURE_REDIRECTS
, "secure_redirects"),
1566 DEVINET_SYSCTL_RW_ENTRY(SHARED_MEDIA
, "shared_media"),
1567 DEVINET_SYSCTL_RW_ENTRY(RP_FILTER
, "rp_filter"),
1568 DEVINET_SYSCTL_RW_ENTRY(SEND_REDIRECTS
, "send_redirects"),
1569 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE
,
1570 "accept_source_route"),
1571 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_LOCAL
, "accept_local"),
1572 DEVINET_SYSCTL_RW_ENTRY(SRC_VMARK
, "src_valid_mark"),
1573 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP
, "proxy_arp"),
1574 DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID
, "medium_id"),
1575 DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY
, "bootp_relay"),
1576 DEVINET_SYSCTL_RW_ENTRY(LOG_MARTIANS
, "log_martians"),
1577 DEVINET_SYSCTL_RW_ENTRY(TAG
, "tag"),
1578 DEVINET_SYSCTL_RW_ENTRY(ARPFILTER
, "arp_filter"),
1579 DEVINET_SYSCTL_RW_ENTRY(ARP_ANNOUNCE
, "arp_announce"),
1580 DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE
, "arp_ignore"),
1581 DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT
, "arp_accept"),
1582 DEVINET_SYSCTL_RW_ENTRY(ARP_NOTIFY
, "arp_notify"),
1583 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP_PVLAN
, "proxy_arp_pvlan"),
1585 DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM
, "disable_xfrm"),
1586 DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY
, "disable_policy"),
1587 DEVINET_SYSCTL_FLUSHING_ENTRY(FORCE_IGMP_VERSION
,
1588 "force_igmp_version"),
1589 DEVINET_SYSCTL_FLUSHING_ENTRY(PROMOTE_SECONDARIES
,
1590 "promote_secondaries"),
1594 static int __devinet_sysctl_register(struct net
*net
, char *dev_name
,
1595 struct ipv4_devconf
*p
)
1598 struct devinet_sysctl_table
*t
;
1600 #define DEVINET_CTL_PATH_DEV 3
1602 struct ctl_path devinet_ctl_path
[] = {
1603 { .procname
= "net", },
1604 { .procname
= "ipv4", },
1605 { .procname
= "conf", },
1606 { /* to be set */ },
1610 t
= kmemdup(&devinet_sysctl
, sizeof(*t
), GFP_KERNEL
);
1614 for (i
= 0; i
< ARRAY_SIZE(t
->devinet_vars
) - 1; i
++) {
1615 t
->devinet_vars
[i
].data
+= (char *)p
- (char *)&ipv4_devconf
;
1616 t
->devinet_vars
[i
].extra1
= p
;
1617 t
->devinet_vars
[i
].extra2
= net
;
1621 * Make a copy of dev_name, because '.procname' is regarded as const
1622 * by sysctl and we wouldn't want anyone to change it under our feet
1623 * (see SIOCSIFNAME).
1625 t
->dev_name
= kstrdup(dev_name
, GFP_KERNEL
);
1629 devinet_ctl_path
[DEVINET_CTL_PATH_DEV
].procname
= t
->dev_name
;
1631 t
->sysctl_header
= register_net_sysctl_table(net
, devinet_ctl_path
,
1633 if (!t
->sysctl_header
)
1647 static void __devinet_sysctl_unregister(struct ipv4_devconf
*cnf
)
1649 struct devinet_sysctl_table
*t
= cnf
->sysctl
;
1655 unregister_sysctl_table(t
->sysctl_header
);
1660 static void devinet_sysctl_register(struct in_device
*idev
)
1662 neigh_sysctl_register(idev
->dev
, idev
->arp_parms
, "ipv4", NULL
);
1663 __devinet_sysctl_register(dev_net(idev
->dev
), idev
->dev
->name
,
1667 static void devinet_sysctl_unregister(struct in_device
*idev
)
1669 __devinet_sysctl_unregister(&idev
->cnf
);
1670 neigh_sysctl_unregister(idev
->arp_parms
);
1673 static struct ctl_table ctl_forward_entry
[] = {
1675 .procname
= "ip_forward",
1676 .data
= &ipv4_devconf
.data
[
1677 IPV4_DEVCONF_FORWARDING
- 1],
1678 .maxlen
= sizeof(int),
1680 .proc_handler
= devinet_sysctl_forward
,
1681 .extra1
= &ipv4_devconf
,
1682 .extra2
= &init_net
,
1687 static __net_initdata
struct ctl_path net_ipv4_path
[] = {
1688 { .procname
= "net", },
1689 { .procname
= "ipv4", },
1694 static __net_init
int devinet_init_net(struct net
*net
)
1697 struct ipv4_devconf
*all
, *dflt
;
1698 #ifdef CONFIG_SYSCTL
1699 struct ctl_table
*tbl
= ctl_forward_entry
;
1700 struct ctl_table_header
*forw_hdr
;
1704 all
= &ipv4_devconf
;
1705 dflt
= &ipv4_devconf_dflt
;
1707 if (!net_eq(net
, &init_net
)) {
1708 all
= kmemdup(all
, sizeof(ipv4_devconf
), GFP_KERNEL
);
1712 dflt
= kmemdup(dflt
, sizeof(ipv4_devconf_dflt
), GFP_KERNEL
);
1714 goto err_alloc_dflt
;
1716 #ifdef CONFIG_SYSCTL
1717 tbl
= kmemdup(tbl
, sizeof(ctl_forward_entry
), GFP_KERNEL
);
1721 tbl
[0].data
= &all
->data
[IPV4_DEVCONF_FORWARDING
- 1];
1722 tbl
[0].extra1
= all
;
1723 tbl
[0].extra2
= net
;
1727 #ifdef CONFIG_SYSCTL
1728 err
= __devinet_sysctl_register(net
, "all", all
);
1732 err
= __devinet_sysctl_register(net
, "default", dflt
);
1737 forw_hdr
= register_net_sysctl_table(net
, net_ipv4_path
, tbl
);
1738 if (forw_hdr
== NULL
)
1740 net
->ipv4
.forw_hdr
= forw_hdr
;
1743 net
->ipv4
.devconf_all
= all
;
1744 net
->ipv4
.devconf_dflt
= dflt
;
1747 #ifdef CONFIG_SYSCTL
1749 __devinet_sysctl_unregister(dflt
);
1751 __devinet_sysctl_unregister(all
);
1753 if (tbl
!= ctl_forward_entry
)
1757 if (dflt
!= &ipv4_devconf_dflt
)
1760 if (all
!= &ipv4_devconf
)
1766 static __net_exit
void devinet_exit_net(struct net
*net
)
1768 #ifdef CONFIG_SYSCTL
1769 struct ctl_table
*tbl
;
1771 tbl
= net
->ipv4
.forw_hdr
->ctl_table_arg
;
1772 unregister_net_sysctl_table(net
->ipv4
.forw_hdr
);
1773 __devinet_sysctl_unregister(net
->ipv4
.devconf_dflt
);
1774 __devinet_sysctl_unregister(net
->ipv4
.devconf_all
);
1777 kfree(net
->ipv4
.devconf_dflt
);
1778 kfree(net
->ipv4
.devconf_all
);
1781 static __net_initdata
struct pernet_operations devinet_ops
= {
1782 .init
= devinet_init_net
,
1783 .exit
= devinet_exit_net
,
1786 static struct rtnl_af_ops inet_af_ops
= {
1788 .fill_link_af
= inet_fill_link_af
,
1789 .get_link_af_size
= inet_get_link_af_size
,
1790 .validate_link_af
= inet_validate_link_af
,
1791 .set_link_af
= inet_set_link_af
,
1794 void __init
devinet_init(void)
1798 for (i
= 0; i
< IN4_ADDR_HSIZE
; i
++)
1799 INIT_HLIST_HEAD(&inet_addr_lst
[i
]);
1801 register_pernet_subsys(&devinet_ops
);
1803 register_gifconf(PF_INET
, inet_gifconf
);
1804 register_netdevice_notifier(&ip_netdev_notifier
);
1806 rtnl_af_register(&inet_af_ops
);
1808 rtnl_register(PF_INET
, RTM_NEWADDR
, inet_rtm_newaddr
, NULL
);
1809 rtnl_register(PF_INET
, RTM_DELADDR
, inet_rtm_deladdr
, NULL
);
1810 rtnl_register(PF_INET
, RTM_GETADDR
, NULL
, inet_dump_ifaddr
);