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 <linux/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/sched/signal.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>
59 #include <linux/netconf.h>
63 #include <net/route.h>
64 #include <net/ip_fib.h>
65 #include <net/rtnetlink.h>
66 #include <net/net_namespace.h>
67 #include <net/addrconf.h>
69 static struct ipv4_devconf ipv4_devconf
= {
71 [IPV4_DEVCONF_ACCEPT_REDIRECTS
- 1] = 1,
72 [IPV4_DEVCONF_SEND_REDIRECTS
- 1] = 1,
73 [IPV4_DEVCONF_SECURE_REDIRECTS
- 1] = 1,
74 [IPV4_DEVCONF_SHARED_MEDIA
- 1] = 1,
75 [IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL
- 1] = 10000 /*ms*/,
76 [IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL
- 1] = 1000 /*ms*/,
80 static struct ipv4_devconf ipv4_devconf_dflt
= {
82 [IPV4_DEVCONF_ACCEPT_REDIRECTS
- 1] = 1,
83 [IPV4_DEVCONF_SEND_REDIRECTS
- 1] = 1,
84 [IPV4_DEVCONF_SECURE_REDIRECTS
- 1] = 1,
85 [IPV4_DEVCONF_SHARED_MEDIA
- 1] = 1,
86 [IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE
- 1] = 1,
87 [IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL
- 1] = 10000 /*ms*/,
88 [IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL
- 1] = 1000 /*ms*/,
92 #define IPV4_DEVCONF_DFLT(net, attr) \
93 IPV4_DEVCONF((*net->ipv4.devconf_dflt), attr)
95 static const struct nla_policy ifa_ipv4_policy
[IFA_MAX
+1] = {
96 [IFA_LOCAL
] = { .type
= NLA_U32
},
97 [IFA_ADDRESS
] = { .type
= NLA_U32
},
98 [IFA_BROADCAST
] = { .type
= NLA_U32
},
99 [IFA_LABEL
] = { .type
= NLA_STRING
, .len
= IFNAMSIZ
- 1 },
100 [IFA_CACHEINFO
] = { .len
= sizeof(struct ifa_cacheinfo
) },
101 [IFA_FLAGS
] = { .type
= NLA_U32
},
102 [IFA_RT_PRIORITY
] = { .type
= NLA_U32
},
103 [IFA_TARGET_NETNSID
] = { .type
= NLA_S32
},
106 struct inet_fill_args
{
115 #define IN4_ADDR_HSIZE_SHIFT 8
116 #define IN4_ADDR_HSIZE (1U << IN4_ADDR_HSIZE_SHIFT)
118 static struct hlist_head inet_addr_lst
[IN4_ADDR_HSIZE
];
120 static u32
inet_addr_hash(const struct net
*net
, __be32 addr
)
122 u32 val
= (__force u32
) addr
^ net_hash_mix(net
);
124 return hash_32(val
, IN4_ADDR_HSIZE_SHIFT
);
127 static void inet_hash_insert(struct net
*net
, struct in_ifaddr
*ifa
)
129 u32 hash
= inet_addr_hash(net
, ifa
->ifa_local
);
132 hlist_add_head_rcu(&ifa
->hash
, &inet_addr_lst
[hash
]);
135 static void inet_hash_remove(struct in_ifaddr
*ifa
)
138 hlist_del_init_rcu(&ifa
->hash
);
142 * __ip_dev_find - find the first device with a given source address.
143 * @net: the net namespace
144 * @addr: the source address
145 * @devref: if true, take a reference on the found device
147 * If a caller uses devref=false, it should be protected by RCU, or RTNL
149 struct net_device
*__ip_dev_find(struct net
*net
, __be32 addr
, bool devref
)
151 struct net_device
*result
= NULL
;
152 struct in_ifaddr
*ifa
;
155 ifa
= inet_lookup_ifaddr_rcu(net
, addr
);
157 struct flowi4 fl4
= { .daddr
= addr
};
158 struct fib_result res
= { 0 };
159 struct fib_table
*local
;
161 /* Fallback to FIB local table so that communication
162 * over loopback subnets work.
164 local
= fib_get_table(net
, RT_TABLE_LOCAL
);
166 !fib_table_lookup(local
, &fl4
, &res
, FIB_LOOKUP_NOREF
) &&
167 res
.type
== RTN_LOCAL
)
168 result
= FIB_RES_DEV(res
);
170 result
= ifa
->ifa_dev
->dev
;
172 if (result
&& devref
)
177 EXPORT_SYMBOL(__ip_dev_find
);
179 /* called under RCU lock */
180 struct in_ifaddr
*inet_lookup_ifaddr_rcu(struct net
*net
, __be32 addr
)
182 u32 hash
= inet_addr_hash(net
, addr
);
183 struct in_ifaddr
*ifa
;
185 hlist_for_each_entry_rcu(ifa
, &inet_addr_lst
[hash
], hash
)
186 if (ifa
->ifa_local
== addr
&&
187 net_eq(dev_net(ifa
->ifa_dev
->dev
), net
))
193 static void rtmsg_ifa(int event
, struct in_ifaddr
*, struct nlmsghdr
*, u32
);
195 static BLOCKING_NOTIFIER_HEAD(inetaddr_chain
);
196 static BLOCKING_NOTIFIER_HEAD(inetaddr_validator_chain
);
197 static void inet_del_ifa(struct in_device
*in_dev
, struct in_ifaddr
**ifap
,
200 static int devinet_sysctl_register(struct in_device
*idev
);
201 static void devinet_sysctl_unregister(struct in_device
*idev
);
203 static int devinet_sysctl_register(struct in_device
*idev
)
207 static void devinet_sysctl_unregister(struct in_device
*idev
)
212 /* Locks all the inet devices. */
214 static struct in_ifaddr
*inet_alloc_ifa(void)
216 return kzalloc(sizeof(struct in_ifaddr
), GFP_KERNEL
);
219 static void inet_rcu_free_ifa(struct rcu_head
*head
)
221 struct in_ifaddr
*ifa
= container_of(head
, struct in_ifaddr
, rcu_head
);
223 in_dev_put(ifa
->ifa_dev
);
227 static void inet_free_ifa(struct in_ifaddr
*ifa
)
229 call_rcu(&ifa
->rcu_head
, inet_rcu_free_ifa
);
232 void in_dev_finish_destroy(struct in_device
*idev
)
234 struct net_device
*dev
= idev
->dev
;
236 WARN_ON(idev
->ifa_list
);
237 WARN_ON(idev
->mc_list
);
238 kfree(rcu_dereference_protected(idev
->mc_hash
, 1));
239 #ifdef NET_REFCNT_DEBUG
240 pr_debug("%s: %p=%s\n", __func__
, idev
, dev
? dev
->name
: "NIL");
244 pr_err("Freeing alive in_device %p\n", idev
);
248 EXPORT_SYMBOL(in_dev_finish_destroy
);
250 static struct in_device
*inetdev_init(struct net_device
*dev
)
252 struct in_device
*in_dev
;
257 in_dev
= kzalloc(sizeof(*in_dev
), GFP_KERNEL
);
260 memcpy(&in_dev
->cnf
, dev_net(dev
)->ipv4
.devconf_dflt
,
261 sizeof(in_dev
->cnf
));
262 in_dev
->cnf
.sysctl
= NULL
;
264 in_dev
->arp_parms
= neigh_parms_alloc(dev
, &arp_tbl
);
265 if (!in_dev
->arp_parms
)
267 if (IPV4_DEVCONF(in_dev
->cnf
, FORWARDING
))
268 dev_disable_lro(dev
);
269 /* Reference in_dev->dev */
271 /* Account for reference dev->ip_ptr (below) */
272 refcount_set(&in_dev
->refcnt
, 1);
274 err
= devinet_sysctl_register(in_dev
);
281 ip_mc_init_dev(in_dev
);
282 if (dev
->flags
& IFF_UP
)
285 /* we can receive as soon as ip_ptr is set -- do this last */
286 rcu_assign_pointer(dev
->ip_ptr
, in_dev
);
288 return in_dev
?: ERR_PTR(err
);
295 static void in_dev_rcu_put(struct rcu_head
*head
)
297 struct in_device
*idev
= container_of(head
, struct in_device
, rcu_head
);
301 static void inetdev_destroy(struct in_device
*in_dev
)
303 struct in_ifaddr
*ifa
;
304 struct net_device
*dev
;
312 ip_mc_destroy_dev(in_dev
);
314 while ((ifa
= in_dev
->ifa_list
) != NULL
) {
315 inet_del_ifa(in_dev
, &in_dev
->ifa_list
, 0);
319 RCU_INIT_POINTER(dev
->ip_ptr
, NULL
);
321 devinet_sysctl_unregister(in_dev
);
322 neigh_parms_release(&arp_tbl
, in_dev
->arp_parms
);
325 call_rcu(&in_dev
->rcu_head
, in_dev_rcu_put
);
328 int inet_addr_onlink(struct in_device
*in_dev
, __be32 a
, __be32 b
)
331 for_primary_ifa(in_dev
) {
332 if (inet_ifa_match(a
, ifa
)) {
333 if (!b
|| inet_ifa_match(b
, ifa
)) {
338 } endfor_ifa(in_dev
);
343 static void __inet_del_ifa(struct in_device
*in_dev
, struct in_ifaddr
**ifap
,
344 int destroy
, struct nlmsghdr
*nlh
, u32 portid
)
346 struct in_ifaddr
*promote
= NULL
;
347 struct in_ifaddr
*ifa
, *ifa1
= *ifap
;
348 struct in_ifaddr
*last_prim
= in_dev
->ifa_list
;
349 struct in_ifaddr
*prev_prom
= NULL
;
350 int do_promote
= IN_DEV_PROMOTE_SECONDARIES(in_dev
);
357 /* 1. Deleting primary ifaddr forces deletion all secondaries
358 * unless alias promotion is set
361 if (!(ifa1
->ifa_flags
& IFA_F_SECONDARY
)) {
362 struct in_ifaddr
**ifap1
= &ifa1
->ifa_next
;
364 while ((ifa
= *ifap1
) != NULL
) {
365 if (!(ifa
->ifa_flags
& IFA_F_SECONDARY
) &&
366 ifa1
->ifa_scope
<= ifa
->ifa_scope
)
369 if (!(ifa
->ifa_flags
& IFA_F_SECONDARY
) ||
370 ifa1
->ifa_mask
!= ifa
->ifa_mask
||
371 !inet_ifa_match(ifa1
->ifa_address
, ifa
)) {
372 ifap1
= &ifa
->ifa_next
;
378 inet_hash_remove(ifa
);
379 *ifap1
= ifa
->ifa_next
;
381 rtmsg_ifa(RTM_DELADDR
, ifa
, nlh
, portid
);
382 blocking_notifier_call_chain(&inetaddr_chain
,
392 /* On promotion all secondaries from subnet are changing
393 * the primary IP, we must remove all their routes silently
394 * and later to add them back with new prefsrc. Do this
395 * while all addresses are on the device list.
397 for (ifa
= promote
; ifa
; ifa
= ifa
->ifa_next
) {
398 if (ifa1
->ifa_mask
== ifa
->ifa_mask
&&
399 inet_ifa_match(ifa1
->ifa_address
, ifa
))
400 fib_del_ifaddr(ifa
, ifa1
);
406 *ifap
= ifa1
->ifa_next
;
407 inet_hash_remove(ifa1
);
409 /* 3. Announce address deletion */
411 /* Send message first, then call notifier.
412 At first sight, FIB update triggered by notifier
413 will refer to already deleted ifaddr, that could confuse
414 netlink listeners. It is not true: look, gated sees
415 that route deleted and if it still thinks that ifaddr
416 is valid, it will try to restore deleted routes... Grr.
417 So that, this order is correct.
419 rtmsg_ifa(RTM_DELADDR
, ifa1
, nlh
, portid
);
420 blocking_notifier_call_chain(&inetaddr_chain
, NETDEV_DOWN
, ifa1
);
423 struct in_ifaddr
*next_sec
= promote
->ifa_next
;
426 prev_prom
->ifa_next
= promote
->ifa_next
;
427 promote
->ifa_next
= last_prim
->ifa_next
;
428 last_prim
->ifa_next
= promote
;
431 promote
->ifa_flags
&= ~IFA_F_SECONDARY
;
432 rtmsg_ifa(RTM_NEWADDR
, promote
, nlh
, portid
);
433 blocking_notifier_call_chain(&inetaddr_chain
,
435 for (ifa
= next_sec
; ifa
; ifa
= ifa
->ifa_next
) {
436 if (ifa1
->ifa_mask
!= ifa
->ifa_mask
||
437 !inet_ifa_match(ifa1
->ifa_address
, ifa
))
447 static void inet_del_ifa(struct in_device
*in_dev
, struct in_ifaddr
**ifap
,
450 __inet_del_ifa(in_dev
, ifap
, destroy
, NULL
, 0);
453 static void check_lifetime(struct work_struct
*work
);
455 static DECLARE_DELAYED_WORK(check_lifetime_work
, check_lifetime
);
457 static int __inet_insert_ifa(struct in_ifaddr
*ifa
, struct nlmsghdr
*nlh
,
458 u32 portid
, struct netlink_ext_ack
*extack
)
460 struct in_device
*in_dev
= ifa
->ifa_dev
;
461 struct in_ifaddr
*ifa1
, **ifap
, **last_primary
;
462 struct in_validator_info ivi
;
467 if (!ifa
->ifa_local
) {
472 ifa
->ifa_flags
&= ~IFA_F_SECONDARY
;
473 last_primary
= &in_dev
->ifa_list
;
475 for (ifap
= &in_dev
->ifa_list
; (ifa1
= *ifap
) != NULL
;
476 ifap
= &ifa1
->ifa_next
) {
477 if (!(ifa1
->ifa_flags
& IFA_F_SECONDARY
) &&
478 ifa
->ifa_scope
<= ifa1
->ifa_scope
)
479 last_primary
= &ifa1
->ifa_next
;
480 if (ifa1
->ifa_mask
== ifa
->ifa_mask
&&
481 inet_ifa_match(ifa1
->ifa_address
, ifa
)) {
482 if (ifa1
->ifa_local
== ifa
->ifa_local
) {
486 if (ifa1
->ifa_scope
!= ifa
->ifa_scope
) {
490 ifa
->ifa_flags
|= IFA_F_SECONDARY
;
494 /* Allow any devices that wish to register ifaddr validtors to weigh
495 * in now, before changes are committed. The rntl lock is serializing
496 * access here, so the state should not change between a validator call
497 * and a final notify on commit. This isn't invoked on promotion under
498 * the assumption that validators are checking the address itself, and
501 ivi
.ivi_addr
= ifa
->ifa_address
;
502 ivi
.ivi_dev
= ifa
->ifa_dev
;
504 ret
= blocking_notifier_call_chain(&inetaddr_validator_chain
,
506 ret
= notifier_to_errno(ret
);
512 if (!(ifa
->ifa_flags
& IFA_F_SECONDARY
)) {
513 prandom_seed((__force u32
) ifa
->ifa_local
);
517 ifa
->ifa_next
= *ifap
;
520 inet_hash_insert(dev_net(in_dev
->dev
), ifa
);
522 cancel_delayed_work(&check_lifetime_work
);
523 queue_delayed_work(system_power_efficient_wq
, &check_lifetime_work
, 0);
525 /* Send message first, then call notifier.
526 Notifier will trigger FIB update, so that
527 listeners of netlink will know about new ifaddr */
528 rtmsg_ifa(RTM_NEWADDR
, ifa
, nlh
, portid
);
529 blocking_notifier_call_chain(&inetaddr_chain
, NETDEV_UP
, ifa
);
534 static int inet_insert_ifa(struct in_ifaddr
*ifa
)
536 return __inet_insert_ifa(ifa
, NULL
, 0, NULL
);
539 static int inet_set_ifa(struct net_device
*dev
, struct in_ifaddr
*ifa
)
541 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
549 ipv4_devconf_setall(in_dev
);
550 neigh_parms_data_state_setall(in_dev
->arp_parms
);
551 if (ifa
->ifa_dev
!= in_dev
) {
552 WARN_ON(ifa
->ifa_dev
);
554 ifa
->ifa_dev
= in_dev
;
556 if (ipv4_is_loopback(ifa
->ifa_local
))
557 ifa
->ifa_scope
= RT_SCOPE_HOST
;
558 return inet_insert_ifa(ifa
);
561 /* Caller must hold RCU or RTNL :
562 * We dont take a reference on found in_device
564 struct in_device
*inetdev_by_index(struct net
*net
, int ifindex
)
566 struct net_device
*dev
;
567 struct in_device
*in_dev
= NULL
;
570 dev
= dev_get_by_index_rcu(net
, ifindex
);
572 in_dev
= rcu_dereference_rtnl(dev
->ip_ptr
);
576 EXPORT_SYMBOL(inetdev_by_index
);
578 /* Called only from RTNL semaphored context. No locks. */
580 struct in_ifaddr
*inet_ifa_byprefix(struct in_device
*in_dev
, __be32 prefix
,
585 for_primary_ifa(in_dev
) {
586 if (ifa
->ifa_mask
== mask
&& inet_ifa_match(prefix
, ifa
))
588 } endfor_ifa(in_dev
);
592 static int ip_mc_config(struct sock
*sk
, bool join
, const struct in_ifaddr
*ifa
)
594 struct ip_mreqn mreq
= {
595 .imr_multiaddr
.s_addr
= ifa
->ifa_address
,
596 .imr_ifindex
= ifa
->ifa_dev
->dev
->ifindex
,
604 ret
= ip_mc_join_group(sk
, &mreq
);
606 ret
= ip_mc_leave_group(sk
, &mreq
);
612 static int inet_rtm_deladdr(struct sk_buff
*skb
, struct nlmsghdr
*nlh
,
613 struct netlink_ext_ack
*extack
)
615 struct net
*net
= sock_net(skb
->sk
);
616 struct nlattr
*tb
[IFA_MAX
+1];
617 struct in_device
*in_dev
;
618 struct ifaddrmsg
*ifm
;
619 struct in_ifaddr
*ifa
, **ifap
;
624 err
= nlmsg_parse(nlh
, sizeof(*ifm
), tb
, IFA_MAX
, ifa_ipv4_policy
,
629 ifm
= nlmsg_data(nlh
);
630 in_dev
= inetdev_by_index(net
, ifm
->ifa_index
);
636 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
637 ifap
= &ifa
->ifa_next
) {
639 ifa
->ifa_local
!= nla_get_in_addr(tb
[IFA_LOCAL
]))
642 if (tb
[IFA_LABEL
] && nla_strcmp(tb
[IFA_LABEL
], ifa
->ifa_label
))
645 if (tb
[IFA_ADDRESS
] &&
646 (ifm
->ifa_prefixlen
!= ifa
->ifa_prefixlen
||
647 !inet_ifa_match(nla_get_in_addr(tb
[IFA_ADDRESS
]), ifa
)))
650 if (ipv4_is_multicast(ifa
->ifa_address
))
651 ip_mc_config(net
->ipv4
.mc_autojoin_sk
, false, ifa
);
652 __inet_del_ifa(in_dev
, ifap
, 1, nlh
, NETLINK_CB(skb
).portid
);
656 err
= -EADDRNOTAVAIL
;
661 #define INFINITY_LIFE_TIME 0xFFFFFFFF
663 static void check_lifetime(struct work_struct
*work
)
665 unsigned long now
, next
, next_sec
, next_sched
;
666 struct in_ifaddr
*ifa
;
667 struct hlist_node
*n
;
671 next
= round_jiffies_up(now
+ ADDR_CHECK_FREQUENCY
);
673 for (i
= 0; i
< IN4_ADDR_HSIZE
; i
++) {
674 bool change_needed
= false;
677 hlist_for_each_entry_rcu(ifa
, &inet_addr_lst
[i
], hash
) {
680 if (ifa
->ifa_flags
& IFA_F_PERMANENT
)
683 /* We try to batch several events at once. */
684 age
= (now
- ifa
->ifa_tstamp
+
685 ADDRCONF_TIMER_FUZZ_MINUS
) / HZ
;
687 if (ifa
->ifa_valid_lft
!= INFINITY_LIFE_TIME
&&
688 age
>= ifa
->ifa_valid_lft
) {
689 change_needed
= true;
690 } else if (ifa
->ifa_preferred_lft
==
691 INFINITY_LIFE_TIME
) {
693 } else if (age
>= ifa
->ifa_preferred_lft
) {
694 if (time_before(ifa
->ifa_tstamp
+
695 ifa
->ifa_valid_lft
* HZ
, next
))
696 next
= ifa
->ifa_tstamp
+
697 ifa
->ifa_valid_lft
* HZ
;
699 if (!(ifa
->ifa_flags
& IFA_F_DEPRECATED
))
700 change_needed
= true;
701 } else if (time_before(ifa
->ifa_tstamp
+
702 ifa
->ifa_preferred_lft
* HZ
,
704 next
= ifa
->ifa_tstamp
+
705 ifa
->ifa_preferred_lft
* HZ
;
712 hlist_for_each_entry_safe(ifa
, n
, &inet_addr_lst
[i
], hash
) {
715 if (ifa
->ifa_flags
& IFA_F_PERMANENT
)
718 /* We try to batch several events at once. */
719 age
= (now
- ifa
->ifa_tstamp
+
720 ADDRCONF_TIMER_FUZZ_MINUS
) / HZ
;
722 if (ifa
->ifa_valid_lft
!= INFINITY_LIFE_TIME
&&
723 age
>= ifa
->ifa_valid_lft
) {
724 struct in_ifaddr
**ifap
;
726 for (ifap
= &ifa
->ifa_dev
->ifa_list
;
727 *ifap
!= NULL
; ifap
= &(*ifap
)->ifa_next
) {
729 inet_del_ifa(ifa
->ifa_dev
,
734 } else if (ifa
->ifa_preferred_lft
!=
735 INFINITY_LIFE_TIME
&&
736 age
>= ifa
->ifa_preferred_lft
&&
737 !(ifa
->ifa_flags
& IFA_F_DEPRECATED
)) {
738 ifa
->ifa_flags
|= IFA_F_DEPRECATED
;
739 rtmsg_ifa(RTM_NEWADDR
, ifa
, NULL
, 0);
745 next_sec
= round_jiffies_up(next
);
748 /* If rounded timeout is accurate enough, accept it. */
749 if (time_before(next_sec
, next
+ ADDRCONF_TIMER_FUZZ
))
750 next_sched
= next_sec
;
753 /* And minimum interval is ADDRCONF_TIMER_FUZZ_MAX. */
754 if (time_before(next_sched
, now
+ ADDRCONF_TIMER_FUZZ_MAX
))
755 next_sched
= now
+ ADDRCONF_TIMER_FUZZ_MAX
;
757 queue_delayed_work(system_power_efficient_wq
, &check_lifetime_work
,
761 static void set_ifa_lifetime(struct in_ifaddr
*ifa
, __u32 valid_lft
,
764 unsigned long timeout
;
766 ifa
->ifa_flags
&= ~(IFA_F_PERMANENT
| IFA_F_DEPRECATED
);
768 timeout
= addrconf_timeout_fixup(valid_lft
, HZ
);
769 if (addrconf_finite_timeout(timeout
))
770 ifa
->ifa_valid_lft
= timeout
;
772 ifa
->ifa_flags
|= IFA_F_PERMANENT
;
774 timeout
= addrconf_timeout_fixup(prefered_lft
, HZ
);
775 if (addrconf_finite_timeout(timeout
)) {
777 ifa
->ifa_flags
|= IFA_F_DEPRECATED
;
778 ifa
->ifa_preferred_lft
= timeout
;
780 ifa
->ifa_tstamp
= jiffies
;
781 if (!ifa
->ifa_cstamp
)
782 ifa
->ifa_cstamp
= ifa
->ifa_tstamp
;
785 static struct in_ifaddr
*rtm_to_ifaddr(struct net
*net
, struct nlmsghdr
*nlh
,
786 __u32
*pvalid_lft
, __u32
*pprefered_lft
,
787 struct netlink_ext_ack
*extack
)
789 struct nlattr
*tb
[IFA_MAX
+1];
790 struct in_ifaddr
*ifa
;
791 struct ifaddrmsg
*ifm
;
792 struct net_device
*dev
;
793 struct in_device
*in_dev
;
796 err
= nlmsg_parse(nlh
, sizeof(*ifm
), tb
, IFA_MAX
, ifa_ipv4_policy
,
801 ifm
= nlmsg_data(nlh
);
803 if (ifm
->ifa_prefixlen
> 32 || !tb
[IFA_LOCAL
])
806 dev
= __dev_get_by_index(net
, ifm
->ifa_index
);
811 in_dev
= __in_dev_get_rtnl(dev
);
816 ifa
= inet_alloc_ifa();
819 * A potential indev allocation can be left alive, it stays
820 * assigned to its device and is destroy with it.
824 ipv4_devconf_setall(in_dev
);
825 neigh_parms_data_state_setall(in_dev
->arp_parms
);
828 if (!tb
[IFA_ADDRESS
])
829 tb
[IFA_ADDRESS
] = tb
[IFA_LOCAL
];
831 INIT_HLIST_NODE(&ifa
->hash
);
832 ifa
->ifa_prefixlen
= ifm
->ifa_prefixlen
;
833 ifa
->ifa_mask
= inet_make_mask(ifm
->ifa_prefixlen
);
834 ifa
->ifa_flags
= tb
[IFA_FLAGS
] ? nla_get_u32(tb
[IFA_FLAGS
]) :
836 ifa
->ifa_scope
= ifm
->ifa_scope
;
837 ifa
->ifa_dev
= in_dev
;
839 ifa
->ifa_local
= nla_get_in_addr(tb
[IFA_LOCAL
]);
840 ifa
->ifa_address
= nla_get_in_addr(tb
[IFA_ADDRESS
]);
842 if (tb
[IFA_BROADCAST
])
843 ifa
->ifa_broadcast
= nla_get_in_addr(tb
[IFA_BROADCAST
]);
846 nla_strlcpy(ifa
->ifa_label
, tb
[IFA_LABEL
], IFNAMSIZ
);
848 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
850 if (tb
[IFA_RT_PRIORITY
])
851 ifa
->ifa_rt_priority
= nla_get_u32(tb
[IFA_RT_PRIORITY
]);
853 if (tb
[IFA_CACHEINFO
]) {
854 struct ifa_cacheinfo
*ci
;
856 ci
= nla_data(tb
[IFA_CACHEINFO
]);
857 if (!ci
->ifa_valid
|| ci
->ifa_prefered
> ci
->ifa_valid
) {
861 *pvalid_lft
= ci
->ifa_valid
;
862 *pprefered_lft
= ci
->ifa_prefered
;
873 static struct in_ifaddr
*find_matching_ifa(struct in_ifaddr
*ifa
)
875 struct in_device
*in_dev
= ifa
->ifa_dev
;
876 struct in_ifaddr
*ifa1
, **ifap
;
881 for (ifap
= &in_dev
->ifa_list
; (ifa1
= *ifap
) != NULL
;
882 ifap
= &ifa1
->ifa_next
) {
883 if (ifa1
->ifa_mask
== ifa
->ifa_mask
&&
884 inet_ifa_match(ifa1
->ifa_address
, ifa
) &&
885 ifa1
->ifa_local
== ifa
->ifa_local
)
891 static int inet_rtm_newaddr(struct sk_buff
*skb
, struct nlmsghdr
*nlh
,
892 struct netlink_ext_ack
*extack
)
894 struct net
*net
= sock_net(skb
->sk
);
895 struct in_ifaddr
*ifa
;
896 struct in_ifaddr
*ifa_existing
;
897 __u32 valid_lft
= INFINITY_LIFE_TIME
;
898 __u32 prefered_lft
= INFINITY_LIFE_TIME
;
902 ifa
= rtm_to_ifaddr(net
, nlh
, &valid_lft
, &prefered_lft
, extack
);
906 ifa_existing
= find_matching_ifa(ifa
);
908 /* It would be best to check for !NLM_F_CREATE here but
909 * userspace already relies on not having to provide this.
911 set_ifa_lifetime(ifa
, valid_lft
, prefered_lft
);
912 if (ifa
->ifa_flags
& IFA_F_MCAUTOJOIN
) {
913 int ret
= ip_mc_config(net
->ipv4
.mc_autojoin_sk
,
921 return __inet_insert_ifa(ifa
, nlh
, NETLINK_CB(skb
).portid
,
924 u32 new_metric
= ifa
->ifa_rt_priority
;
928 if (nlh
->nlmsg_flags
& NLM_F_EXCL
||
929 !(nlh
->nlmsg_flags
& NLM_F_REPLACE
))
933 if (ifa
->ifa_rt_priority
!= new_metric
) {
934 fib_modify_prefix_metric(ifa
, new_metric
);
935 ifa
->ifa_rt_priority
= new_metric
;
938 set_ifa_lifetime(ifa
, valid_lft
, prefered_lft
);
939 cancel_delayed_work(&check_lifetime_work
);
940 queue_delayed_work(system_power_efficient_wq
,
941 &check_lifetime_work
, 0);
942 rtmsg_ifa(RTM_NEWADDR
, ifa
, nlh
, NETLINK_CB(skb
).portid
);
948 * Determine a default network mask, based on the IP address.
951 static int inet_abc_len(__be32 addr
)
953 int rc
= -1; /* Something else, probably a multicast. */
955 if (ipv4_is_zeronet(addr
))
958 __u32 haddr
= ntohl(addr
);
960 if (IN_CLASSA(haddr
))
962 else if (IN_CLASSB(haddr
))
964 else if (IN_CLASSC(haddr
))
972 int devinet_ioctl(struct net
*net
, unsigned int cmd
, struct ifreq
*ifr
)
974 struct sockaddr_in sin_orig
;
975 struct sockaddr_in
*sin
= (struct sockaddr_in
*)&ifr
->ifr_addr
;
976 struct in_device
*in_dev
;
977 struct in_ifaddr
**ifap
= NULL
;
978 struct in_ifaddr
*ifa
= NULL
;
979 struct net_device
*dev
;
982 int tryaddrmatch
= 0;
984 ifr
->ifr_name
[IFNAMSIZ
- 1] = 0;
986 /* save original address for comparison */
987 memcpy(&sin_orig
, sin
, sizeof(*sin
));
989 colon
= strchr(ifr
->ifr_name
, ':');
993 dev_load(net
, ifr
->ifr_name
);
996 case SIOCGIFADDR
: /* Get interface address */
997 case SIOCGIFBRDADDR
: /* Get the broadcast address */
998 case SIOCGIFDSTADDR
: /* Get the destination address */
999 case SIOCGIFNETMASK
: /* Get the netmask for the interface */
1000 /* Note that these ioctls will not sleep,
1001 so that we do not impose a lock.
1002 One day we will be forced to put shlock here (I mean SMP)
1004 tryaddrmatch
= (sin_orig
.sin_family
== AF_INET
);
1005 memset(sin
, 0, sizeof(*sin
));
1006 sin
->sin_family
= AF_INET
;
1011 if (!ns_capable(net
->user_ns
, CAP_NET_ADMIN
))
1014 case SIOCSIFADDR
: /* Set interface address (and family) */
1015 case SIOCSIFBRDADDR
: /* Set the broadcast address */
1016 case SIOCSIFDSTADDR
: /* Set the destination address */
1017 case SIOCSIFNETMASK
: /* Set the netmask for the interface */
1019 if (!ns_capable(net
->user_ns
, CAP_NET_ADMIN
))
1022 if (sin
->sin_family
!= AF_INET
)
1033 dev
= __dev_get_by_name(net
, ifr
->ifr_name
);
1040 in_dev
= __in_dev_get_rtnl(dev
);
1043 /* Matthias Andree */
1044 /* compare label and address (4.4BSD style) */
1045 /* note: we only do this for a limited set of ioctls
1046 and only if the original address family was AF_INET.
1047 This is checked above. */
1048 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
1049 ifap
= &ifa
->ifa_next
) {
1050 if (!strcmp(ifr
->ifr_name
, ifa
->ifa_label
) &&
1051 sin_orig
.sin_addr
.s_addr
==
1057 /* we didn't get a match, maybe the application is
1058 4.3BSD-style and passed in junk so we fall back to
1059 comparing just the label */
1061 for (ifap
= &in_dev
->ifa_list
; (ifa
= *ifap
) != NULL
;
1062 ifap
= &ifa
->ifa_next
)
1063 if (!strcmp(ifr
->ifr_name
, ifa
->ifa_label
))
1068 ret
= -EADDRNOTAVAIL
;
1069 if (!ifa
&& cmd
!= SIOCSIFADDR
&& cmd
!= SIOCSIFFLAGS
)
1073 case SIOCGIFADDR
: /* Get interface address */
1075 sin
->sin_addr
.s_addr
= ifa
->ifa_local
;
1078 case SIOCGIFBRDADDR
: /* Get the broadcast address */
1080 sin
->sin_addr
.s_addr
= ifa
->ifa_broadcast
;
1083 case SIOCGIFDSTADDR
: /* Get the destination address */
1085 sin
->sin_addr
.s_addr
= ifa
->ifa_address
;
1088 case SIOCGIFNETMASK
: /* Get the netmask for the interface */
1090 sin
->sin_addr
.s_addr
= ifa
->ifa_mask
;
1095 ret
= -EADDRNOTAVAIL
;
1099 if (!(ifr
->ifr_flags
& IFF_UP
))
1100 inet_del_ifa(in_dev
, ifap
, 1);
1103 ret
= dev_change_flags(dev
, ifr
->ifr_flags
);
1106 case SIOCSIFADDR
: /* Set interface address (and family) */
1108 if (inet_abc_len(sin
->sin_addr
.s_addr
) < 0)
1113 ifa
= inet_alloc_ifa();
1116 INIT_HLIST_NODE(&ifa
->hash
);
1118 memcpy(ifa
->ifa_label
, ifr
->ifr_name
, IFNAMSIZ
);
1120 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
1123 if (ifa
->ifa_local
== sin
->sin_addr
.s_addr
)
1125 inet_del_ifa(in_dev
, ifap
, 0);
1126 ifa
->ifa_broadcast
= 0;
1130 ifa
->ifa_address
= ifa
->ifa_local
= sin
->sin_addr
.s_addr
;
1132 if (!(dev
->flags
& IFF_POINTOPOINT
)) {
1133 ifa
->ifa_prefixlen
= inet_abc_len(ifa
->ifa_address
);
1134 ifa
->ifa_mask
= inet_make_mask(ifa
->ifa_prefixlen
);
1135 if ((dev
->flags
& IFF_BROADCAST
) &&
1136 ifa
->ifa_prefixlen
< 31)
1137 ifa
->ifa_broadcast
= ifa
->ifa_address
|
1140 ifa
->ifa_prefixlen
= 32;
1141 ifa
->ifa_mask
= inet_make_mask(32);
1143 set_ifa_lifetime(ifa
, INFINITY_LIFE_TIME
, INFINITY_LIFE_TIME
);
1144 ret
= inet_set_ifa(dev
, ifa
);
1147 case SIOCSIFBRDADDR
: /* Set the broadcast address */
1149 if (ifa
->ifa_broadcast
!= sin
->sin_addr
.s_addr
) {
1150 inet_del_ifa(in_dev
, ifap
, 0);
1151 ifa
->ifa_broadcast
= sin
->sin_addr
.s_addr
;
1152 inet_insert_ifa(ifa
);
1156 case SIOCSIFDSTADDR
: /* Set the destination address */
1158 if (ifa
->ifa_address
== sin
->sin_addr
.s_addr
)
1161 if (inet_abc_len(sin
->sin_addr
.s_addr
) < 0)
1164 inet_del_ifa(in_dev
, ifap
, 0);
1165 ifa
->ifa_address
= sin
->sin_addr
.s_addr
;
1166 inet_insert_ifa(ifa
);
1169 case SIOCSIFNETMASK
: /* Set the netmask for the interface */
1172 * The mask we set must be legal.
1175 if (bad_mask(sin
->sin_addr
.s_addr
, 0))
1178 if (ifa
->ifa_mask
!= sin
->sin_addr
.s_addr
) {
1179 __be32 old_mask
= ifa
->ifa_mask
;
1180 inet_del_ifa(in_dev
, ifap
, 0);
1181 ifa
->ifa_mask
= sin
->sin_addr
.s_addr
;
1182 ifa
->ifa_prefixlen
= inet_mask_len(ifa
->ifa_mask
);
1184 /* See if current broadcast address matches
1185 * with current netmask, then recalculate
1186 * the broadcast address. Otherwise it's a
1187 * funny address, so don't touch it since
1188 * the user seems to know what (s)he's doing...
1190 if ((dev
->flags
& IFF_BROADCAST
) &&
1191 (ifa
->ifa_prefixlen
< 31) &&
1192 (ifa
->ifa_broadcast
==
1193 (ifa
->ifa_local
|~old_mask
))) {
1194 ifa
->ifa_broadcast
= (ifa
->ifa_local
|
1195 ~sin
->sin_addr
.s_addr
);
1197 inet_insert_ifa(ifa
);
1207 static int inet_gifconf(struct net_device
*dev
, char __user
*buf
, int len
, int size
)
1209 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
1210 struct in_ifaddr
*ifa
;
1214 if (WARN_ON(size
> sizeof(struct ifreq
)))
1220 for (ifa
= in_dev
->ifa_list
; ifa
; ifa
= ifa
->ifa_next
) {
1227 memset(&ifr
, 0, sizeof(struct ifreq
));
1228 strcpy(ifr
.ifr_name
, ifa
->ifa_label
);
1230 (*(struct sockaddr_in
*)&ifr
.ifr_addr
).sin_family
= AF_INET
;
1231 (*(struct sockaddr_in
*)&ifr
.ifr_addr
).sin_addr
.s_addr
=
1234 if (copy_to_user(buf
+ done
, &ifr
, size
)) {
1245 static __be32
in_dev_select_addr(const struct in_device
*in_dev
,
1248 for_primary_ifa(in_dev
) {
1249 if (ifa
->ifa_scope
!= RT_SCOPE_LINK
&&
1250 ifa
->ifa_scope
<= scope
)
1251 return ifa
->ifa_local
;
1252 } endfor_ifa(in_dev
);
1257 __be32
inet_select_addr(const struct net_device
*dev
, __be32 dst
, int scope
)
1260 struct in_device
*in_dev
;
1261 struct net
*net
= dev_net(dev
);
1265 in_dev
= __in_dev_get_rcu(dev
);
1269 for_primary_ifa(in_dev
) {
1270 if (ifa
->ifa_scope
> scope
)
1272 if (!dst
|| inet_ifa_match(dst
, ifa
)) {
1273 addr
= ifa
->ifa_local
;
1277 addr
= ifa
->ifa_local
;
1278 } endfor_ifa(in_dev
);
1283 master_idx
= l3mdev_master_ifindex_rcu(dev
);
1285 /* For VRFs, the VRF device takes the place of the loopback device,
1286 * with addresses on it being preferred. Note in such cases the
1287 * loopback device will be among the devices that fail the master_idx
1288 * equality check in the loop below.
1291 (dev
= dev_get_by_index_rcu(net
, master_idx
)) &&
1292 (in_dev
= __in_dev_get_rcu(dev
))) {
1293 addr
= in_dev_select_addr(in_dev
, scope
);
1298 /* Not loopback addresses on loopback should be preferred
1299 in this case. It is important that lo is the first interface
1302 for_each_netdev_rcu(net
, dev
) {
1303 if (l3mdev_master_ifindex_rcu(dev
) != master_idx
)
1306 in_dev
= __in_dev_get_rcu(dev
);
1310 addr
= in_dev_select_addr(in_dev
, scope
);
1318 EXPORT_SYMBOL(inet_select_addr
);
1320 static __be32
confirm_addr_indev(struct in_device
*in_dev
, __be32 dst
,
1321 __be32 local
, int scope
)
1328 (local
== ifa
->ifa_local
|| !local
) &&
1329 ifa
->ifa_scope
<= scope
) {
1330 addr
= ifa
->ifa_local
;
1335 same
= (!local
|| inet_ifa_match(local
, ifa
)) &&
1336 (!dst
|| inet_ifa_match(dst
, ifa
));
1340 /* Is the selected addr into dst subnet? */
1341 if (inet_ifa_match(addr
, ifa
))
1343 /* No, then can we use new local src? */
1344 if (ifa
->ifa_scope
<= scope
) {
1345 addr
= ifa
->ifa_local
;
1348 /* search for large dst subnet for addr */
1352 } endfor_ifa(in_dev
);
1354 return same
? addr
: 0;
1358 * Confirm that local IP address exists using wildcards:
1359 * - net: netns to check, cannot be NULL
1360 * - in_dev: only on this interface, NULL=any interface
1361 * - dst: only in the same subnet as dst, 0=any dst
1362 * - local: address, 0=autoselect the local address
1363 * - scope: maximum allowed scope value for the local address
1365 __be32
inet_confirm_addr(struct net
*net
, struct in_device
*in_dev
,
1366 __be32 dst
, __be32 local
, int scope
)
1369 struct net_device
*dev
;
1372 return confirm_addr_indev(in_dev
, dst
, local
, scope
);
1375 for_each_netdev_rcu(net
, dev
) {
1376 in_dev
= __in_dev_get_rcu(dev
);
1378 addr
= confirm_addr_indev(in_dev
, dst
, local
, scope
);
1387 EXPORT_SYMBOL(inet_confirm_addr
);
1393 int register_inetaddr_notifier(struct notifier_block
*nb
)
1395 return blocking_notifier_chain_register(&inetaddr_chain
, nb
);
1397 EXPORT_SYMBOL(register_inetaddr_notifier
);
1399 int unregister_inetaddr_notifier(struct notifier_block
*nb
)
1401 return blocking_notifier_chain_unregister(&inetaddr_chain
, nb
);
1403 EXPORT_SYMBOL(unregister_inetaddr_notifier
);
1405 int register_inetaddr_validator_notifier(struct notifier_block
*nb
)
1407 return blocking_notifier_chain_register(&inetaddr_validator_chain
, nb
);
1409 EXPORT_SYMBOL(register_inetaddr_validator_notifier
);
1411 int unregister_inetaddr_validator_notifier(struct notifier_block
*nb
)
1413 return blocking_notifier_chain_unregister(&inetaddr_validator_chain
,
1416 EXPORT_SYMBOL(unregister_inetaddr_validator_notifier
);
1418 /* Rename ifa_labels for a device name change. Make some effort to preserve
1419 * existing alias numbering and to create unique labels if possible.
1421 static void inetdev_changename(struct net_device
*dev
, struct in_device
*in_dev
)
1423 struct in_ifaddr
*ifa
;
1426 for (ifa
= in_dev
->ifa_list
; ifa
; ifa
= ifa
->ifa_next
) {
1427 char old
[IFNAMSIZ
], *dot
;
1429 memcpy(old
, ifa
->ifa_label
, IFNAMSIZ
);
1430 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
1433 dot
= strchr(old
, ':');
1435 sprintf(old
, ":%d", named
);
1438 if (strlen(dot
) + strlen(dev
->name
) < IFNAMSIZ
)
1439 strcat(ifa
->ifa_label
, dot
);
1441 strcpy(ifa
->ifa_label
+ (IFNAMSIZ
- strlen(dot
) - 1), dot
);
1443 rtmsg_ifa(RTM_NEWADDR
, ifa
, NULL
, 0);
1447 static bool inetdev_valid_mtu(unsigned int mtu
)
1449 return mtu
>= IPV4_MIN_MTU
;
1452 static void inetdev_send_gratuitous_arp(struct net_device
*dev
,
1453 struct in_device
*in_dev
)
1456 struct in_ifaddr
*ifa
;
1458 for (ifa
= in_dev
->ifa_list
; ifa
;
1459 ifa
= ifa
->ifa_next
) {
1460 arp_send(ARPOP_REQUEST
, ETH_P_ARP
,
1461 ifa
->ifa_local
, dev
,
1462 ifa
->ifa_local
, NULL
,
1463 dev
->dev_addr
, NULL
);
1467 /* Called only under RTNL semaphore */
1469 static int inetdev_event(struct notifier_block
*this, unsigned long event
,
1472 struct net_device
*dev
= netdev_notifier_info_to_dev(ptr
);
1473 struct in_device
*in_dev
= __in_dev_get_rtnl(dev
);
1478 if (event
== NETDEV_REGISTER
) {
1479 in_dev
= inetdev_init(dev
);
1481 return notifier_from_errno(PTR_ERR(in_dev
));
1482 if (dev
->flags
& IFF_LOOPBACK
) {
1483 IN_DEV_CONF_SET(in_dev
, NOXFRM
, 1);
1484 IN_DEV_CONF_SET(in_dev
, NOPOLICY
, 1);
1486 } else if (event
== NETDEV_CHANGEMTU
) {
1487 /* Re-enabling IP */
1488 if (inetdev_valid_mtu(dev
->mtu
))
1489 in_dev
= inetdev_init(dev
);
1495 case NETDEV_REGISTER
:
1496 pr_debug("%s: bug\n", __func__
);
1497 RCU_INIT_POINTER(dev
->ip_ptr
, NULL
);
1500 if (!inetdev_valid_mtu(dev
->mtu
))
1502 if (dev
->flags
& IFF_LOOPBACK
) {
1503 struct in_ifaddr
*ifa
= inet_alloc_ifa();
1506 INIT_HLIST_NODE(&ifa
->hash
);
1508 ifa
->ifa_address
= htonl(INADDR_LOOPBACK
);
1509 ifa
->ifa_prefixlen
= 8;
1510 ifa
->ifa_mask
= inet_make_mask(8);
1511 in_dev_hold(in_dev
);
1512 ifa
->ifa_dev
= in_dev
;
1513 ifa
->ifa_scope
= RT_SCOPE_HOST
;
1514 memcpy(ifa
->ifa_label
, dev
->name
, IFNAMSIZ
);
1515 set_ifa_lifetime(ifa
, INFINITY_LIFE_TIME
,
1516 INFINITY_LIFE_TIME
);
1517 ipv4_devconf_setall(in_dev
);
1518 neigh_parms_data_state_setall(in_dev
->arp_parms
);
1519 inet_insert_ifa(ifa
);
1524 case NETDEV_CHANGEADDR
:
1525 if (!IN_DEV_ARP_NOTIFY(in_dev
))
1528 case NETDEV_NOTIFY_PEERS
:
1529 /* Send gratuitous ARP to notify of link change */
1530 inetdev_send_gratuitous_arp(dev
, in_dev
);
1535 case NETDEV_PRE_TYPE_CHANGE
:
1536 ip_mc_unmap(in_dev
);
1538 case NETDEV_POST_TYPE_CHANGE
:
1539 ip_mc_remap(in_dev
);
1541 case NETDEV_CHANGEMTU
:
1542 if (inetdev_valid_mtu(dev
->mtu
))
1544 /* disable IP when MTU is not enough */
1546 case NETDEV_UNREGISTER
:
1547 inetdev_destroy(in_dev
);
1549 case NETDEV_CHANGENAME
:
1550 /* Do not notify about label change, this event is
1551 * not interesting to applications using netlink.
1553 inetdev_changename(dev
, in_dev
);
1555 devinet_sysctl_unregister(in_dev
);
1556 devinet_sysctl_register(in_dev
);
1563 static struct notifier_block ip_netdev_notifier
= {
1564 .notifier_call
= inetdev_event
,
1567 static size_t inet_nlmsg_size(void)
1569 return NLMSG_ALIGN(sizeof(struct ifaddrmsg
))
1570 + nla_total_size(4) /* IFA_ADDRESS */
1571 + nla_total_size(4) /* IFA_LOCAL */
1572 + nla_total_size(4) /* IFA_BROADCAST */
1573 + nla_total_size(IFNAMSIZ
) /* IFA_LABEL */
1574 + nla_total_size(4) /* IFA_FLAGS */
1575 + nla_total_size(4) /* IFA_RT_PRIORITY */
1576 + nla_total_size(sizeof(struct ifa_cacheinfo
)); /* IFA_CACHEINFO */
1579 static inline u32
cstamp_delta(unsigned long cstamp
)
1581 return (cstamp
- INITIAL_JIFFIES
) * 100UL / HZ
;
1584 static int put_cacheinfo(struct sk_buff
*skb
, unsigned long cstamp
,
1585 unsigned long tstamp
, u32 preferred
, u32 valid
)
1587 struct ifa_cacheinfo ci
;
1589 ci
.cstamp
= cstamp_delta(cstamp
);
1590 ci
.tstamp
= cstamp_delta(tstamp
);
1591 ci
.ifa_prefered
= preferred
;
1592 ci
.ifa_valid
= valid
;
1594 return nla_put(skb
, IFA_CACHEINFO
, sizeof(ci
), &ci
);
1597 static int inet_fill_ifaddr(struct sk_buff
*skb
, struct in_ifaddr
*ifa
,
1598 struct inet_fill_args
*args
)
1600 struct ifaddrmsg
*ifm
;
1601 struct nlmsghdr
*nlh
;
1602 u32 preferred
, valid
;
1604 nlh
= nlmsg_put(skb
, args
->portid
, args
->seq
, args
->event
, sizeof(*ifm
),
1609 ifm
= nlmsg_data(nlh
);
1610 ifm
->ifa_family
= AF_INET
;
1611 ifm
->ifa_prefixlen
= ifa
->ifa_prefixlen
;
1612 ifm
->ifa_flags
= ifa
->ifa_flags
;
1613 ifm
->ifa_scope
= ifa
->ifa_scope
;
1614 ifm
->ifa_index
= ifa
->ifa_dev
->dev
->ifindex
;
1616 if (args
->netnsid
>= 0 &&
1617 nla_put_s32(skb
, IFA_TARGET_NETNSID
, args
->netnsid
))
1618 goto nla_put_failure
;
1620 if (!(ifm
->ifa_flags
& IFA_F_PERMANENT
)) {
1621 preferred
= ifa
->ifa_preferred_lft
;
1622 valid
= ifa
->ifa_valid_lft
;
1623 if (preferred
!= INFINITY_LIFE_TIME
) {
1624 long tval
= (jiffies
- ifa
->ifa_tstamp
) / HZ
;
1626 if (preferred
> tval
)
1630 if (valid
!= INFINITY_LIFE_TIME
) {
1638 preferred
= INFINITY_LIFE_TIME
;
1639 valid
= INFINITY_LIFE_TIME
;
1641 if ((ifa
->ifa_address
&&
1642 nla_put_in_addr(skb
, IFA_ADDRESS
, ifa
->ifa_address
)) ||
1644 nla_put_in_addr(skb
, IFA_LOCAL
, ifa
->ifa_local
)) ||
1645 (ifa
->ifa_broadcast
&&
1646 nla_put_in_addr(skb
, IFA_BROADCAST
, ifa
->ifa_broadcast
)) ||
1647 (ifa
->ifa_label
[0] &&
1648 nla_put_string(skb
, IFA_LABEL
, ifa
->ifa_label
)) ||
1649 nla_put_u32(skb
, IFA_FLAGS
, ifa
->ifa_flags
) ||
1650 (ifa
->ifa_rt_priority
&&
1651 nla_put_u32(skb
, IFA_RT_PRIORITY
, ifa
->ifa_rt_priority
)) ||
1652 put_cacheinfo(skb
, ifa
->ifa_cstamp
, ifa
->ifa_tstamp
,
1654 goto nla_put_failure
;
1656 nlmsg_end(skb
, nlh
);
1660 nlmsg_cancel(skb
, nlh
);
1664 static int inet_valid_dump_ifaddr_req(const struct nlmsghdr
*nlh
,
1665 struct inet_fill_args
*fillargs
,
1666 struct net
**tgt_net
, struct sock
*sk
,
1667 struct netlink_callback
*cb
)
1669 struct netlink_ext_ack
*extack
= cb
->extack
;
1670 struct nlattr
*tb
[IFA_MAX
+1];
1671 struct ifaddrmsg
*ifm
;
1674 if (nlh
->nlmsg_len
< nlmsg_msg_size(sizeof(*ifm
))) {
1675 NL_SET_ERR_MSG(extack
, "ipv4: Invalid header for address dump request");
1679 ifm
= nlmsg_data(nlh
);
1680 if (ifm
->ifa_prefixlen
|| ifm
->ifa_flags
|| ifm
->ifa_scope
) {
1681 NL_SET_ERR_MSG(extack
, "ipv4: Invalid values in header for address dump request");
1685 fillargs
->ifindex
= ifm
->ifa_index
;
1686 if (fillargs
->ifindex
) {
1687 cb
->answer_flags
|= NLM_F_DUMP_FILTERED
;
1688 fillargs
->flags
|= NLM_F_DUMP_FILTERED
;
1691 err
= nlmsg_parse_strict(nlh
, sizeof(*ifm
), tb
, IFA_MAX
,
1692 ifa_ipv4_policy
, extack
);
1696 for (i
= 0; i
<= IFA_MAX
; ++i
) {
1700 if (i
== IFA_TARGET_NETNSID
) {
1703 fillargs
->netnsid
= nla_get_s32(tb
[i
]);
1705 net
= rtnl_get_net_ns_capable(sk
, fillargs
->netnsid
);
1707 fillargs
->netnsid
= -1;
1708 NL_SET_ERR_MSG(extack
, "ipv4: Invalid target network namespace id");
1709 return PTR_ERR(net
);
1713 NL_SET_ERR_MSG(extack
, "ipv4: Unsupported attribute in dump request");
1721 static int in_dev_dump_addr(struct in_device
*in_dev
, struct sk_buff
*skb
,
1722 struct netlink_callback
*cb
, int s_ip_idx
,
1723 struct inet_fill_args
*fillargs
)
1725 struct in_ifaddr
*ifa
;
1729 for (ifa
= in_dev
->ifa_list
; ifa
; ifa
= ifa
->ifa_next
, ip_idx
++) {
1730 if (ip_idx
< s_ip_idx
)
1733 err
= inet_fill_ifaddr(skb
, ifa
, fillargs
);
1737 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
1742 cb
->args
[2] = ip_idx
;
1747 static int inet_dump_ifaddr(struct sk_buff
*skb
, struct netlink_callback
*cb
)
1749 const struct nlmsghdr
*nlh
= cb
->nlh
;
1750 struct inet_fill_args fillargs
= {
1751 .portid
= NETLINK_CB(cb
->skb
).portid
,
1752 .seq
= nlh
->nlmsg_seq
,
1753 .event
= RTM_NEWADDR
,
1754 .flags
= NLM_F_MULTI
,
1757 struct net
*net
= sock_net(skb
->sk
);
1758 struct net
*tgt_net
= net
;
1762 struct net_device
*dev
;
1763 struct in_device
*in_dev
;
1764 struct hlist_head
*head
;
1768 s_idx
= idx
= cb
->args
[1];
1769 s_ip_idx
= cb
->args
[2];
1771 if (cb
->strict_check
) {
1772 err
= inet_valid_dump_ifaddr_req(nlh
, &fillargs
, &tgt_net
,
1778 if (fillargs
.ifindex
) {
1779 dev
= __dev_get_by_index(tgt_net
, fillargs
.ifindex
);
1785 in_dev
= __in_dev_get_rtnl(dev
);
1787 err
= in_dev_dump_addr(in_dev
, skb
, cb
, s_ip_idx
,
1794 for (h
= s_h
; h
< NETDEV_HASHENTRIES
; h
++, s_idx
= 0) {
1796 head
= &tgt_net
->dev_index_head
[h
];
1798 cb
->seq
= atomic_read(&tgt_net
->ipv4
.dev_addr_genid
) ^
1799 tgt_net
->dev_base_seq
;
1800 hlist_for_each_entry_rcu(dev
, head
, index_hlist
) {
1803 if (h
> s_h
|| idx
> s_idx
)
1805 in_dev
= __in_dev_get_rcu(dev
);
1809 err
= in_dev_dump_addr(in_dev
, skb
, cb
, s_ip_idx
,
1825 if (fillargs
.netnsid
>= 0)
1828 return err
< 0 ? err
: skb
->len
;
1831 static void rtmsg_ifa(int event
, struct in_ifaddr
*ifa
, struct nlmsghdr
*nlh
,
1834 struct inet_fill_args fillargs
= {
1836 .seq
= nlh
? nlh
->nlmsg_seq
: 0,
1841 struct sk_buff
*skb
;
1845 net
= dev_net(ifa
->ifa_dev
->dev
);
1846 skb
= nlmsg_new(inet_nlmsg_size(), GFP_KERNEL
);
1850 err
= inet_fill_ifaddr(skb
, ifa
, &fillargs
);
1852 /* -EMSGSIZE implies BUG in inet_nlmsg_size() */
1853 WARN_ON(err
== -EMSGSIZE
);
1857 rtnl_notify(skb
, net
, portid
, RTNLGRP_IPV4_IFADDR
, nlh
, GFP_KERNEL
);
1861 rtnl_set_sk_err(net
, RTNLGRP_IPV4_IFADDR
, err
);
1864 static size_t inet_get_link_af_size(const struct net_device
*dev
,
1865 u32 ext_filter_mask
)
1867 struct in_device
*in_dev
= rcu_dereference_rtnl(dev
->ip_ptr
);
1872 return nla_total_size(IPV4_DEVCONF_MAX
* 4); /* IFLA_INET_CONF */
1875 static int inet_fill_link_af(struct sk_buff
*skb
, const struct net_device
*dev
,
1876 u32 ext_filter_mask
)
1878 struct in_device
*in_dev
= rcu_dereference_rtnl(dev
->ip_ptr
);
1885 nla
= nla_reserve(skb
, IFLA_INET_CONF
, IPV4_DEVCONF_MAX
* 4);
1889 for (i
= 0; i
< IPV4_DEVCONF_MAX
; i
++)
1890 ((u32
*) nla_data(nla
))[i
] = in_dev
->cnf
.data
[i
];
1895 static const struct nla_policy inet_af_policy
[IFLA_INET_MAX
+1] = {
1896 [IFLA_INET_CONF
] = { .type
= NLA_NESTED
},
1899 static int inet_validate_link_af(const struct net_device
*dev
,
1900 const struct nlattr
*nla
)
1902 struct nlattr
*a
, *tb
[IFLA_INET_MAX
+1];
1905 if (dev
&& !__in_dev_get_rcu(dev
))
1906 return -EAFNOSUPPORT
;
1908 err
= nla_parse_nested(tb
, IFLA_INET_MAX
, nla
, inet_af_policy
, NULL
);
1912 if (tb
[IFLA_INET_CONF
]) {
1913 nla_for_each_nested(a
, tb
[IFLA_INET_CONF
], rem
) {
1914 int cfgid
= nla_type(a
);
1919 if (cfgid
<= 0 || cfgid
> IPV4_DEVCONF_MAX
)
1927 static int inet_set_link_af(struct net_device
*dev
, const struct nlattr
*nla
)
1929 struct in_device
*in_dev
= __in_dev_get_rcu(dev
);
1930 struct nlattr
*a
, *tb
[IFLA_INET_MAX
+1];
1934 return -EAFNOSUPPORT
;
1936 if (nla_parse_nested(tb
, IFLA_INET_MAX
, nla
, NULL
, NULL
) < 0)
1939 if (tb
[IFLA_INET_CONF
]) {
1940 nla_for_each_nested(a
, tb
[IFLA_INET_CONF
], rem
)
1941 ipv4_devconf_set(in_dev
, nla_type(a
), nla_get_u32(a
));
1947 static int inet_netconf_msgsize_devconf(int type
)
1949 int size
= NLMSG_ALIGN(sizeof(struct netconfmsg
))
1950 + nla_total_size(4); /* NETCONFA_IFINDEX */
1953 if (type
== NETCONFA_ALL
)
1956 if (all
|| type
== NETCONFA_FORWARDING
)
1957 size
+= nla_total_size(4);
1958 if (all
|| type
== NETCONFA_RP_FILTER
)
1959 size
+= nla_total_size(4);
1960 if (all
|| type
== NETCONFA_MC_FORWARDING
)
1961 size
+= nla_total_size(4);
1962 if (all
|| type
== NETCONFA_BC_FORWARDING
)
1963 size
+= nla_total_size(4);
1964 if (all
|| type
== NETCONFA_PROXY_NEIGH
)
1965 size
+= nla_total_size(4);
1966 if (all
|| type
== NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN
)
1967 size
+= nla_total_size(4);
1972 static int inet_netconf_fill_devconf(struct sk_buff
*skb
, int ifindex
,
1973 struct ipv4_devconf
*devconf
, u32 portid
,
1974 u32 seq
, int event
, unsigned int flags
,
1977 struct nlmsghdr
*nlh
;
1978 struct netconfmsg
*ncm
;
1981 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct netconfmsg
),
1986 if (type
== NETCONFA_ALL
)
1989 ncm
= nlmsg_data(nlh
);
1990 ncm
->ncm_family
= AF_INET
;
1992 if (nla_put_s32(skb
, NETCONFA_IFINDEX
, ifindex
) < 0)
1993 goto nla_put_failure
;
1998 if ((all
|| type
== NETCONFA_FORWARDING
) &&
1999 nla_put_s32(skb
, NETCONFA_FORWARDING
,
2000 IPV4_DEVCONF(*devconf
, FORWARDING
)) < 0)
2001 goto nla_put_failure
;
2002 if ((all
|| type
== NETCONFA_RP_FILTER
) &&
2003 nla_put_s32(skb
, NETCONFA_RP_FILTER
,
2004 IPV4_DEVCONF(*devconf
, RP_FILTER
)) < 0)
2005 goto nla_put_failure
;
2006 if ((all
|| type
== NETCONFA_MC_FORWARDING
) &&
2007 nla_put_s32(skb
, NETCONFA_MC_FORWARDING
,
2008 IPV4_DEVCONF(*devconf
, MC_FORWARDING
)) < 0)
2009 goto nla_put_failure
;
2010 if ((all
|| type
== NETCONFA_BC_FORWARDING
) &&
2011 nla_put_s32(skb
, NETCONFA_BC_FORWARDING
,
2012 IPV4_DEVCONF(*devconf
, BC_FORWARDING
)) < 0)
2013 goto nla_put_failure
;
2014 if ((all
|| type
== NETCONFA_PROXY_NEIGH
) &&
2015 nla_put_s32(skb
, NETCONFA_PROXY_NEIGH
,
2016 IPV4_DEVCONF(*devconf
, PROXY_ARP
)) < 0)
2017 goto nla_put_failure
;
2018 if ((all
|| type
== NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN
) &&
2019 nla_put_s32(skb
, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN
,
2020 IPV4_DEVCONF(*devconf
, IGNORE_ROUTES_WITH_LINKDOWN
)) < 0)
2021 goto nla_put_failure
;
2024 nlmsg_end(skb
, nlh
);
2028 nlmsg_cancel(skb
, nlh
);
2032 void inet_netconf_notify_devconf(struct net
*net
, int event
, int type
,
2033 int ifindex
, struct ipv4_devconf
*devconf
)
2035 struct sk_buff
*skb
;
2038 skb
= nlmsg_new(inet_netconf_msgsize_devconf(type
), GFP_KERNEL
);
2042 err
= inet_netconf_fill_devconf(skb
, ifindex
, devconf
, 0, 0,
2045 /* -EMSGSIZE implies BUG in inet_netconf_msgsize_devconf() */
2046 WARN_ON(err
== -EMSGSIZE
);
2050 rtnl_notify(skb
, net
, 0, RTNLGRP_IPV4_NETCONF
, NULL
, GFP_KERNEL
);
2054 rtnl_set_sk_err(net
, RTNLGRP_IPV4_NETCONF
, err
);
2057 static const struct nla_policy devconf_ipv4_policy
[NETCONFA_MAX
+1] = {
2058 [NETCONFA_IFINDEX
] = { .len
= sizeof(int) },
2059 [NETCONFA_FORWARDING
] = { .len
= sizeof(int) },
2060 [NETCONFA_RP_FILTER
] = { .len
= sizeof(int) },
2061 [NETCONFA_PROXY_NEIGH
] = { .len
= sizeof(int) },
2062 [NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN
] = { .len
= sizeof(int) },
2065 static int inet_netconf_get_devconf(struct sk_buff
*in_skb
,
2066 struct nlmsghdr
*nlh
,
2067 struct netlink_ext_ack
*extack
)
2069 struct net
*net
= sock_net(in_skb
->sk
);
2070 struct nlattr
*tb
[NETCONFA_MAX
+1];
2071 struct netconfmsg
*ncm
;
2072 struct sk_buff
*skb
;
2073 struct ipv4_devconf
*devconf
;
2074 struct in_device
*in_dev
;
2075 struct net_device
*dev
;
2079 err
= nlmsg_parse(nlh
, sizeof(*ncm
), tb
, NETCONFA_MAX
,
2080 devconf_ipv4_policy
, extack
);
2085 if (!tb
[NETCONFA_IFINDEX
])
2088 ifindex
= nla_get_s32(tb
[NETCONFA_IFINDEX
]);
2090 case NETCONFA_IFINDEX_ALL
:
2091 devconf
= net
->ipv4
.devconf_all
;
2093 case NETCONFA_IFINDEX_DEFAULT
:
2094 devconf
= net
->ipv4
.devconf_dflt
;
2097 dev
= __dev_get_by_index(net
, ifindex
);
2100 in_dev
= __in_dev_get_rtnl(dev
);
2103 devconf
= &in_dev
->cnf
;
2108 skb
= nlmsg_new(inet_netconf_msgsize_devconf(NETCONFA_ALL
), GFP_KERNEL
);
2112 err
= inet_netconf_fill_devconf(skb
, ifindex
, devconf
,
2113 NETLINK_CB(in_skb
).portid
,
2114 nlh
->nlmsg_seq
, RTM_NEWNETCONF
, 0,
2117 /* -EMSGSIZE implies BUG in inet_netconf_msgsize_devconf() */
2118 WARN_ON(err
== -EMSGSIZE
);
2122 err
= rtnl_unicast(skb
, net
, NETLINK_CB(in_skb
).portid
);
2127 static int inet_netconf_dump_devconf(struct sk_buff
*skb
,
2128 struct netlink_callback
*cb
)
2130 const struct nlmsghdr
*nlh
= cb
->nlh
;
2131 struct net
*net
= sock_net(skb
->sk
);
2134 struct net_device
*dev
;
2135 struct in_device
*in_dev
;
2136 struct hlist_head
*head
;
2138 if (cb
->strict_check
) {
2139 struct netlink_ext_ack
*extack
= cb
->extack
;
2140 struct netconfmsg
*ncm
;
2142 if (nlh
->nlmsg_len
< nlmsg_msg_size(sizeof(*ncm
))) {
2143 NL_SET_ERR_MSG(extack
, "ipv4: Invalid header for netconf dump request");
2147 if (nlmsg_attrlen(nlh
, sizeof(*ncm
))) {
2148 NL_SET_ERR_MSG(extack
, "ipv4: Invalid data after header in netconf dump request");
2154 s_idx
= idx
= cb
->args
[1];
2156 for (h
= s_h
; h
< NETDEV_HASHENTRIES
; h
++, s_idx
= 0) {
2158 head
= &net
->dev_index_head
[h
];
2160 cb
->seq
= atomic_read(&net
->ipv4
.dev_addr_genid
) ^
2162 hlist_for_each_entry_rcu(dev
, head
, index_hlist
) {
2165 in_dev
= __in_dev_get_rcu(dev
);
2169 if (inet_netconf_fill_devconf(skb
, dev
->ifindex
,
2171 NETLINK_CB(cb
->skb
).portid
,
2175 NETCONFA_ALL
) < 0) {
2179 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
2185 if (h
== NETDEV_HASHENTRIES
) {
2186 if (inet_netconf_fill_devconf(skb
, NETCONFA_IFINDEX_ALL
,
2187 net
->ipv4
.devconf_all
,
2188 NETLINK_CB(cb
->skb
).portid
,
2190 RTM_NEWNETCONF
, NLM_F_MULTI
,
2196 if (h
== NETDEV_HASHENTRIES
+ 1) {
2197 if (inet_netconf_fill_devconf(skb
, NETCONFA_IFINDEX_DEFAULT
,
2198 net
->ipv4
.devconf_dflt
,
2199 NETLINK_CB(cb
->skb
).portid
,
2201 RTM_NEWNETCONF
, NLM_F_MULTI
,
2214 #ifdef CONFIG_SYSCTL
2216 static void devinet_copy_dflt_conf(struct net
*net
, int i
)
2218 struct net_device
*dev
;
2221 for_each_netdev_rcu(net
, dev
) {
2222 struct in_device
*in_dev
;
2224 in_dev
= __in_dev_get_rcu(dev
);
2225 if (in_dev
&& !test_bit(i
, in_dev
->cnf
.state
))
2226 in_dev
->cnf
.data
[i
] = net
->ipv4
.devconf_dflt
->data
[i
];
2231 /* called with RTNL locked */
2232 static void inet_forward_change(struct net
*net
)
2234 struct net_device
*dev
;
2235 int on
= IPV4_DEVCONF_ALL(net
, FORWARDING
);
2237 IPV4_DEVCONF_ALL(net
, ACCEPT_REDIRECTS
) = !on
;
2238 IPV4_DEVCONF_DFLT(net
, FORWARDING
) = on
;
2239 inet_netconf_notify_devconf(net
, RTM_NEWNETCONF
,
2240 NETCONFA_FORWARDING
,
2241 NETCONFA_IFINDEX_ALL
,
2242 net
->ipv4
.devconf_all
);
2243 inet_netconf_notify_devconf(net
, RTM_NEWNETCONF
,
2244 NETCONFA_FORWARDING
,
2245 NETCONFA_IFINDEX_DEFAULT
,
2246 net
->ipv4
.devconf_dflt
);
2248 for_each_netdev(net
, dev
) {
2249 struct in_device
*in_dev
;
2252 dev_disable_lro(dev
);
2254 in_dev
= __in_dev_get_rtnl(dev
);
2256 IN_DEV_CONF_SET(in_dev
, FORWARDING
, on
);
2257 inet_netconf_notify_devconf(net
, RTM_NEWNETCONF
,
2258 NETCONFA_FORWARDING
,
2259 dev
->ifindex
, &in_dev
->cnf
);
2264 static int devinet_conf_ifindex(struct net
*net
, struct ipv4_devconf
*cnf
)
2266 if (cnf
== net
->ipv4
.devconf_dflt
)
2267 return NETCONFA_IFINDEX_DEFAULT
;
2268 else if (cnf
== net
->ipv4
.devconf_all
)
2269 return NETCONFA_IFINDEX_ALL
;
2271 struct in_device
*idev
2272 = container_of(cnf
, struct in_device
, cnf
);
2273 return idev
->dev
->ifindex
;
2277 static int devinet_conf_proc(struct ctl_table
*ctl
, int write
,
2278 void __user
*buffer
,
2279 size_t *lenp
, loff_t
*ppos
)
2281 int old_value
= *(int *)ctl
->data
;
2282 int ret
= proc_dointvec(ctl
, write
, buffer
, lenp
, ppos
);
2283 int new_value
= *(int *)ctl
->data
;
2286 struct ipv4_devconf
*cnf
= ctl
->extra1
;
2287 struct net
*net
= ctl
->extra2
;
2288 int i
= (int *)ctl
->data
- cnf
->data
;
2291 set_bit(i
, cnf
->state
);
2293 if (cnf
== net
->ipv4
.devconf_dflt
)
2294 devinet_copy_dflt_conf(net
, i
);
2295 if (i
== IPV4_DEVCONF_ACCEPT_LOCAL
- 1 ||
2296 i
== IPV4_DEVCONF_ROUTE_LOCALNET
- 1)
2297 if ((new_value
== 0) && (old_value
!= 0))
2298 rt_cache_flush(net
);
2300 if (i
== IPV4_DEVCONF_BC_FORWARDING
- 1 &&
2301 new_value
!= old_value
)
2302 rt_cache_flush(net
);
2304 if (i
== IPV4_DEVCONF_RP_FILTER
- 1 &&
2305 new_value
!= old_value
) {
2306 ifindex
= devinet_conf_ifindex(net
, cnf
);
2307 inet_netconf_notify_devconf(net
, RTM_NEWNETCONF
,
2311 if (i
== IPV4_DEVCONF_PROXY_ARP
- 1 &&
2312 new_value
!= old_value
) {
2313 ifindex
= devinet_conf_ifindex(net
, cnf
);
2314 inet_netconf_notify_devconf(net
, RTM_NEWNETCONF
,
2315 NETCONFA_PROXY_NEIGH
,
2318 if (i
== IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN
- 1 &&
2319 new_value
!= old_value
) {
2320 ifindex
= devinet_conf_ifindex(net
, cnf
);
2321 inet_netconf_notify_devconf(net
, RTM_NEWNETCONF
,
2322 NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN
,
2330 static int devinet_sysctl_forward(struct ctl_table
*ctl
, int write
,
2331 void __user
*buffer
,
2332 size_t *lenp
, loff_t
*ppos
)
2334 int *valp
= ctl
->data
;
2337 int ret
= proc_dointvec(ctl
, write
, buffer
, lenp
, ppos
);
2339 if (write
&& *valp
!= val
) {
2340 struct net
*net
= ctl
->extra2
;
2342 if (valp
!= &IPV4_DEVCONF_DFLT(net
, FORWARDING
)) {
2343 if (!rtnl_trylock()) {
2344 /* Restore the original values before restarting */
2347 return restart_syscall();
2349 if (valp
== &IPV4_DEVCONF_ALL(net
, FORWARDING
)) {
2350 inet_forward_change(net
);
2352 struct ipv4_devconf
*cnf
= ctl
->extra1
;
2353 struct in_device
*idev
=
2354 container_of(cnf
, struct in_device
, cnf
);
2356 dev_disable_lro(idev
->dev
);
2357 inet_netconf_notify_devconf(net
, RTM_NEWNETCONF
,
2358 NETCONFA_FORWARDING
,
2363 rt_cache_flush(net
);
2365 inet_netconf_notify_devconf(net
, RTM_NEWNETCONF
,
2366 NETCONFA_FORWARDING
,
2367 NETCONFA_IFINDEX_DEFAULT
,
2368 net
->ipv4
.devconf_dflt
);
2374 static int ipv4_doint_and_flush(struct ctl_table
*ctl
, int write
,
2375 void __user
*buffer
,
2376 size_t *lenp
, loff_t
*ppos
)
2378 int *valp
= ctl
->data
;
2380 int ret
= proc_dointvec(ctl
, write
, buffer
, lenp
, ppos
);
2381 struct net
*net
= ctl
->extra2
;
2383 if (write
&& *valp
!= val
)
2384 rt_cache_flush(net
);
2389 #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc) \
2392 .data = ipv4_devconf.data + \
2393 IPV4_DEVCONF_ ## attr - 1, \
2394 .maxlen = sizeof(int), \
2396 .proc_handler = proc, \
2397 .extra1 = &ipv4_devconf, \
2400 #define DEVINET_SYSCTL_RW_ENTRY(attr, name) \
2401 DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc)
2403 #define DEVINET_SYSCTL_RO_ENTRY(attr, name) \
2404 DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc)
2406 #define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc) \
2407 DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc)
2409 #define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \
2410 DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush)
2412 static struct devinet_sysctl_table
{
2413 struct ctl_table_header
*sysctl_header
;
2414 struct ctl_table devinet_vars
[__IPV4_DEVCONF_MAX
];
2415 } devinet_sysctl
= {
2417 DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING
, "forwarding",
2418 devinet_sysctl_forward
),
2419 DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING
, "mc_forwarding"),
2420 DEVINET_SYSCTL_RW_ENTRY(BC_FORWARDING
, "bc_forwarding"),
2422 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS
, "accept_redirects"),
2423 DEVINET_SYSCTL_RW_ENTRY(SECURE_REDIRECTS
, "secure_redirects"),
2424 DEVINET_SYSCTL_RW_ENTRY(SHARED_MEDIA
, "shared_media"),
2425 DEVINET_SYSCTL_RW_ENTRY(RP_FILTER
, "rp_filter"),
2426 DEVINET_SYSCTL_RW_ENTRY(SEND_REDIRECTS
, "send_redirects"),
2427 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE
,
2428 "accept_source_route"),
2429 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_LOCAL
, "accept_local"),
2430 DEVINET_SYSCTL_RW_ENTRY(SRC_VMARK
, "src_valid_mark"),
2431 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP
, "proxy_arp"),
2432 DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID
, "medium_id"),
2433 DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY
, "bootp_relay"),
2434 DEVINET_SYSCTL_RW_ENTRY(LOG_MARTIANS
, "log_martians"),
2435 DEVINET_SYSCTL_RW_ENTRY(TAG
, "tag"),
2436 DEVINET_SYSCTL_RW_ENTRY(ARPFILTER
, "arp_filter"),
2437 DEVINET_SYSCTL_RW_ENTRY(ARP_ANNOUNCE
, "arp_announce"),
2438 DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE
, "arp_ignore"),
2439 DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT
, "arp_accept"),
2440 DEVINET_SYSCTL_RW_ENTRY(ARP_NOTIFY
, "arp_notify"),
2441 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP_PVLAN
, "proxy_arp_pvlan"),
2442 DEVINET_SYSCTL_RW_ENTRY(FORCE_IGMP_VERSION
,
2443 "force_igmp_version"),
2444 DEVINET_SYSCTL_RW_ENTRY(IGMPV2_UNSOLICITED_REPORT_INTERVAL
,
2445 "igmpv2_unsolicited_report_interval"),
2446 DEVINET_SYSCTL_RW_ENTRY(IGMPV3_UNSOLICITED_REPORT_INTERVAL
,
2447 "igmpv3_unsolicited_report_interval"),
2448 DEVINET_SYSCTL_RW_ENTRY(IGNORE_ROUTES_WITH_LINKDOWN
,
2449 "ignore_routes_with_linkdown"),
2450 DEVINET_SYSCTL_RW_ENTRY(DROP_GRATUITOUS_ARP
,
2451 "drop_gratuitous_arp"),
2453 DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM
, "disable_xfrm"),
2454 DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY
, "disable_policy"),
2455 DEVINET_SYSCTL_FLUSHING_ENTRY(PROMOTE_SECONDARIES
,
2456 "promote_secondaries"),
2457 DEVINET_SYSCTL_FLUSHING_ENTRY(ROUTE_LOCALNET
,
2459 DEVINET_SYSCTL_FLUSHING_ENTRY(DROP_UNICAST_IN_L2_MULTICAST
,
2460 "drop_unicast_in_l2_multicast"),
2464 static int __devinet_sysctl_register(struct net
*net
, char *dev_name
,
2465 int ifindex
, struct ipv4_devconf
*p
)
2468 struct devinet_sysctl_table
*t
;
2469 char path
[sizeof("net/ipv4/conf/") + IFNAMSIZ
];
2471 t
= kmemdup(&devinet_sysctl
, sizeof(*t
), GFP_KERNEL
);
2475 for (i
= 0; i
< ARRAY_SIZE(t
->devinet_vars
) - 1; i
++) {
2476 t
->devinet_vars
[i
].data
+= (char *)p
- (char *)&ipv4_devconf
;
2477 t
->devinet_vars
[i
].extra1
= p
;
2478 t
->devinet_vars
[i
].extra2
= net
;
2481 snprintf(path
, sizeof(path
), "net/ipv4/conf/%s", dev_name
);
2483 t
->sysctl_header
= register_net_sysctl(net
, path
, t
->devinet_vars
);
2484 if (!t
->sysctl_header
)
2489 inet_netconf_notify_devconf(net
, RTM_NEWNETCONF
, NETCONFA_ALL
,
2499 static void __devinet_sysctl_unregister(struct net
*net
,
2500 struct ipv4_devconf
*cnf
, int ifindex
)
2502 struct devinet_sysctl_table
*t
= cnf
->sysctl
;
2506 unregister_net_sysctl_table(t
->sysctl_header
);
2510 inet_netconf_notify_devconf(net
, RTM_DELNETCONF
, 0, ifindex
, NULL
);
2513 static int devinet_sysctl_register(struct in_device
*idev
)
2517 if (!sysctl_dev_name_is_allowed(idev
->dev
->name
))
2520 err
= neigh_sysctl_register(idev
->dev
, idev
->arp_parms
, NULL
);
2523 err
= __devinet_sysctl_register(dev_net(idev
->dev
), idev
->dev
->name
,
2524 idev
->dev
->ifindex
, &idev
->cnf
);
2526 neigh_sysctl_unregister(idev
->arp_parms
);
2530 static void devinet_sysctl_unregister(struct in_device
*idev
)
2532 struct net
*net
= dev_net(idev
->dev
);
2534 __devinet_sysctl_unregister(net
, &idev
->cnf
, idev
->dev
->ifindex
);
2535 neigh_sysctl_unregister(idev
->arp_parms
);
2538 static struct ctl_table ctl_forward_entry
[] = {
2540 .procname
= "ip_forward",
2541 .data
= &ipv4_devconf
.data
[
2542 IPV4_DEVCONF_FORWARDING
- 1],
2543 .maxlen
= sizeof(int),
2545 .proc_handler
= devinet_sysctl_forward
,
2546 .extra1
= &ipv4_devconf
,
2547 .extra2
= &init_net
,
2553 static __net_init
int devinet_init_net(struct net
*net
)
2556 struct ipv4_devconf
*all
, *dflt
;
2557 #ifdef CONFIG_SYSCTL
2558 struct ctl_table
*tbl
= ctl_forward_entry
;
2559 struct ctl_table_header
*forw_hdr
;
2563 all
= &ipv4_devconf
;
2564 dflt
= &ipv4_devconf_dflt
;
2566 if (!net_eq(net
, &init_net
)) {
2567 all
= kmemdup(all
, sizeof(ipv4_devconf
), GFP_KERNEL
);
2571 dflt
= kmemdup(dflt
, sizeof(ipv4_devconf_dflt
), GFP_KERNEL
);
2573 goto err_alloc_dflt
;
2575 #ifdef CONFIG_SYSCTL
2576 tbl
= kmemdup(tbl
, sizeof(ctl_forward_entry
), GFP_KERNEL
);
2580 tbl
[0].data
= &all
->data
[IPV4_DEVCONF_FORWARDING
- 1];
2581 tbl
[0].extra1
= all
;
2582 tbl
[0].extra2
= net
;
2586 #ifdef CONFIG_SYSCTL
2587 err
= __devinet_sysctl_register(net
, "all", NETCONFA_IFINDEX_ALL
, all
);
2591 err
= __devinet_sysctl_register(net
, "default",
2592 NETCONFA_IFINDEX_DEFAULT
, dflt
);
2597 forw_hdr
= register_net_sysctl(net
, "net/ipv4", tbl
);
2600 net
->ipv4
.forw_hdr
= forw_hdr
;
2603 net
->ipv4
.devconf_all
= all
;
2604 net
->ipv4
.devconf_dflt
= dflt
;
2607 #ifdef CONFIG_SYSCTL
2609 __devinet_sysctl_unregister(net
, dflt
, NETCONFA_IFINDEX_DEFAULT
);
2611 __devinet_sysctl_unregister(net
, all
, NETCONFA_IFINDEX_ALL
);
2613 if (tbl
!= ctl_forward_entry
)
2617 if (dflt
!= &ipv4_devconf_dflt
)
2620 if (all
!= &ipv4_devconf
)
2626 static __net_exit
void devinet_exit_net(struct net
*net
)
2628 #ifdef CONFIG_SYSCTL
2629 struct ctl_table
*tbl
;
2631 tbl
= net
->ipv4
.forw_hdr
->ctl_table_arg
;
2632 unregister_net_sysctl_table(net
->ipv4
.forw_hdr
);
2633 __devinet_sysctl_unregister(net
, net
->ipv4
.devconf_dflt
,
2634 NETCONFA_IFINDEX_DEFAULT
);
2635 __devinet_sysctl_unregister(net
, net
->ipv4
.devconf_all
,
2636 NETCONFA_IFINDEX_ALL
);
2639 kfree(net
->ipv4
.devconf_dflt
);
2640 kfree(net
->ipv4
.devconf_all
);
2643 static __net_initdata
struct pernet_operations devinet_ops
= {
2644 .init
= devinet_init_net
,
2645 .exit
= devinet_exit_net
,
2648 static struct rtnl_af_ops inet_af_ops __read_mostly
= {
2650 .fill_link_af
= inet_fill_link_af
,
2651 .get_link_af_size
= inet_get_link_af_size
,
2652 .validate_link_af
= inet_validate_link_af
,
2653 .set_link_af
= inet_set_link_af
,
2656 void __init
devinet_init(void)
2660 for (i
= 0; i
< IN4_ADDR_HSIZE
; i
++)
2661 INIT_HLIST_HEAD(&inet_addr_lst
[i
]);
2663 register_pernet_subsys(&devinet_ops
);
2665 register_gifconf(PF_INET
, inet_gifconf
);
2666 register_netdevice_notifier(&ip_netdev_notifier
);
2668 queue_delayed_work(system_power_efficient_wq
, &check_lifetime_work
, 0);
2670 rtnl_af_register(&inet_af_ops
);
2672 rtnl_register(PF_INET
, RTM_NEWADDR
, inet_rtm_newaddr
, NULL
, 0);
2673 rtnl_register(PF_INET
, RTM_DELADDR
, inet_rtm_deladdr
, NULL
, 0);
2674 rtnl_register(PF_INET
, RTM_GETADDR
, NULL
, inet_dump_ifaddr
, 0);
2675 rtnl_register(PF_INET
, RTM_GETNETCONF
, inet_netconf_get_devconf
,
2676 inet_netconf_dump_devconf
, 0);