29 #include <asm/uaccess.h>
30 #include <linux/bitops.h>
31 #include <linux/capability.h>
32 #include <linux/module.h>
33 #include <linux/types.h>
34 #include <linux/kernel.h>
35 #include <linux/string.h>
37 #include <linux/socket.h>
40 #include <linux/errno.h>
43 #include <linux/if_ether.h>
45 #include <linux/netdevice.h>
51 #include <linux/igmp.h>
52 #include <linux/slab.h>
53 #include <linux/hash.h>
55 #include <linux/sysctl.h>
68 static struct ipv4_devconf ipv4_devconf = {
70 [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1,
71 [IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1,
72 [IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1,
73 [IPV4_DEVCONF_SHARED_MEDIA - 1] = 1,
77 static struct ipv4_devconf ipv4_devconf_dflt = {
79 [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1,
80 [IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1,
81 [IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1,
82 [IPV4_DEVCONF_SHARED_MEDIA - 1] = 1,
83 [IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE - 1] = 1,
87 #define IPV4_DEVCONF_DFLT(net, attr) \
88 IPV4_DEVCONF((*net->ipv4.devconf_dflt), attr)
97 #define IN4_ADDR_HSIZE_SHIFT 8
98 #define IN4_ADDR_HSIZE (1U << IN4_ADDR_HSIZE_SHIFT)
110 static void inet_hash_insert(
struct net *net,
struct in_ifaddr *ifa)
112 u32 hash = inet_addr_hash(net, ifa->ifa_local);
114 spin_lock(&inet_addr_hash_lock);
115 hlist_add_head_rcu(&ifa->hash, &inet_addr_lst[hash]);
116 spin_unlock(&inet_addr_hash_lock);
119 static void inet_hash_remove(
struct in_ifaddr *ifa)
121 spin_lock(&inet_addr_hash_lock);
122 hlist_del_init_rcu(&ifa->hash);
123 spin_unlock(&inet_addr_hash_lock);
136 u32 hash = inet_addr_hash(net, addr);
138 struct in_ifaddr *ifa;
142 hlist_for_each_entry_rcu(ifa, node, &inet_addr_lst[hash], hash) {
143 if (ifa->ifa_local == addr) {
146 if (!net_eq(dev_net(dev), net))
166 if (result && devref)
173 static void rtmsg_ifa(
int event,
struct in_ifaddr *,
struct nlmsghdr *,
u32);
176 static void inet_del_ifa(
struct in_device *in_dev,
struct in_ifaddr **ifap,
179 static void devinet_sysctl_register(
struct in_device *
idev);
180 static void devinet_sysctl_unregister(
struct in_device *
idev);
182 static void devinet_sysctl_register(
struct in_device *
idev)
185 static void devinet_sysctl_unregister(
struct in_device *
idev)
192 static struct in_ifaddr *inet_alloc_ifa(
void)
194 return kzalloc(
sizeof(
struct in_ifaddr),
GFP_KERNEL);
201 in_dev_put(ifa->ifa_dev);
205 static void inet_free_ifa(
struct in_ifaddr *ifa)
207 call_rcu(&ifa->rcu_head, inet_rcu_free_ifa);
216 #ifdef NET_REFCNT_DEBUG
217 pr_debug(
"%s: %p=%s\n", __func__, idev, dev ? dev->
name :
"NIL");
221 pr_err(
"Freeing alive in_device %p\n", idev);
227 static struct in_device *inetdev_init(
struct net_device *
dev)
229 struct in_device *in_dev;
233 in_dev = kzalloc(
sizeof(*in_dev),
GFP_KERNEL);
236 memcpy(&in_dev->cnf, dev_net(dev)->ipv4.devconf_dflt,
237 sizeof(in_dev->cnf));
238 in_dev->cnf.sysctl =
NULL;
241 if (!in_dev->arp_parms)
243 if (IPV4_DEVCONF(in_dev->cnf, FORWARDING))
250 devinet_sysctl_register(in_dev);
265 static void in_dev_rcu_put(
struct rcu_head *head)
271 static void inetdev_destroy(
struct in_device *in_dev)
273 struct in_ifaddr *ifa;
284 while ((ifa = in_dev->ifa_list) !=
NULL) {
285 inet_del_ifa(in_dev, &in_dev->ifa_list, 0);
291 devinet_sysctl_unregister(in_dev);
295 call_rcu(&in_dev->rcu_head, in_dev_rcu_put);
301 for_primary_ifa(in_dev) {
302 if (inet_ifa_match(a, ifa)) {
303 if (!b || inet_ifa_match(b, ifa)) {
308 } endfor_ifa(in_dev);
313 static void __inet_del_ifa(
struct in_device *in_dev,
struct in_ifaddr **ifap,
316 struct in_ifaddr *promote =
NULL;
317 struct in_ifaddr *ifa, *ifa1 = *ifap;
318 struct in_ifaddr *last_prim = in_dev->ifa_list;
319 struct in_ifaddr *prev_prom =
NULL;
320 int do_promote = IN_DEV_PROMOTE_SECONDARIES(in_dev);
329 struct in_ifaddr **ifap1 = &ifa1->ifa_next;
331 while ((ifa = *ifap1) !=
NULL) {
333 ifa1->ifa_scope <= ifa->ifa_scope)
337 ifa1->ifa_mask != ifa->ifa_mask ||
338 !inet_ifa_match(ifa1->ifa_address, ifa)) {
339 ifap1 = &ifa->ifa_next;
345 inet_hash_remove(ifa);
346 *ifap1 = ifa->ifa_next;
364 for (ifa = promote; ifa; ifa = ifa->ifa_next) {
365 if (ifa1->ifa_mask == ifa->ifa_mask &&
366 inet_ifa_match(ifa1->ifa_address, ifa))
372 *ifap = ifa1->ifa_next;
373 inet_hash_remove(ifa1);
389 struct in_ifaddr *next_sec = promote->ifa_next;
392 prev_prom->ifa_next = promote->ifa_next;
393 promote->ifa_next = last_prim->ifa_next;
394 last_prim->ifa_next = promote;
401 for (ifa = next_sec; ifa; ifa = ifa->ifa_next) {
402 if (ifa1->ifa_mask != ifa->ifa_mask ||
403 !inet_ifa_match(ifa1->ifa_address, ifa))
413 static void inet_del_ifa(
struct in_device *in_dev,
struct in_ifaddr **ifap,
416 __inet_del_ifa(in_dev, ifap, destroy,
NULL, 0);
419 static int __inet_insert_ifa(
struct in_ifaddr *ifa,
struct nlmsghdr *nlh,
422 struct in_device *in_dev = ifa->ifa_dev;
423 struct in_ifaddr *ifa1, **ifap, **last_primary;
427 if (!ifa->ifa_local) {
433 last_primary = &in_dev->ifa_list;
435 for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) !=
NULL;
436 ifap = &ifa1->ifa_next) {
438 ifa->ifa_scope <= ifa1->ifa_scope)
439 last_primary = &ifa1->ifa_next;
440 if (ifa1->ifa_mask == ifa->ifa_mask &&
441 inet_ifa_match(ifa1->ifa_address, ifa)) {
442 if (ifa1->ifa_local == ifa->ifa_local) {
446 if (ifa1->ifa_scope != ifa->ifa_scope) {
459 ifa->ifa_next = *ifap;
462 inet_hash_insert(dev_net(in_dev->dev), ifa);
473 static int inet_insert_ifa(
struct in_ifaddr *ifa)
475 return __inet_insert_ifa(ifa,
NULL, 0);
478 static int inet_set_ifa(
struct net_device *dev,
struct in_ifaddr *ifa)
480 struct in_device *in_dev = __in_dev_get_rtnl(dev);
488 ipv4_devconf_setall(in_dev);
489 if (ifa->ifa_dev != in_dev) {
492 ifa->ifa_dev = in_dev;
494 if (ipv4_is_loopback(ifa->ifa_local))
496 return inet_insert_ifa(ifa);
505 struct in_device *in_dev =
NULL;
523 for_primary_ifa(in_dev) {
524 if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
526 } endfor_ifa(in_dev);
532 struct net *net = sock_net(skb->
sk);
534 struct in_device *in_dev;
536 struct in_ifaddr *ifa, **ifap;
541 err = nlmsg_parse(nlh,
sizeof(*ifm), tb,
IFA_MAX, ifa_ipv4_policy);
545 ifm = nlmsg_data(nlh);
547 if (in_dev ==
NULL) {
552 for (ifap = &in_dev->ifa_list; (ifa = *ifap) !=
NULL;
553 ifap = &ifa->ifa_next) {
555 ifa->ifa_local != nla_get_be32(tb[
IFA_LOCAL]))
563 !inet_ifa_match(nla_get_be32(tb[
IFA_ADDRESS]), ifa)))
566 __inet_del_ifa(in_dev, ifap, 1, nlh,
NETLINK_CB(skb).portid);
575 static struct in_ifaddr *rtm_to_ifaddr(
struct net *net,
struct nlmsghdr *nlh)
578 struct in_ifaddr *ifa;
581 struct in_device *in_dev;
584 err = nlmsg_parse(nlh,
sizeof(*ifm), tb,
IFA_MAX, ifa_ipv4_policy);
588 ifm = nlmsg_data(nlh);
598 in_dev = __in_dev_get_rtnl(dev);
603 ifa = inet_alloc_ifa();
611 ipv4_devconf_setall(in_dev);
617 INIT_HLIST_NODE(&ifa->hash);
622 ifa->ifa_dev = in_dev;
624 ifa->ifa_local = nla_get_be32(tb[IFA_LOCAL]);
628 ifa->ifa_broadcast = nla_get_be32(tb[IFA_BROADCAST]);
641 static int inet_rtm_newaddr(
struct sk_buff *skb,
struct nlmsghdr *nlh,
void *arg)
643 struct net *net = sock_net(skb->
sk);
644 struct in_ifaddr *ifa;
648 ifa = rtm_to_ifaddr(net, nlh);
652 return __inet_insert_ifa(ifa, nlh,
NETLINK_CB(skb).portid);
659 static int inet_abc_len(
__be32 addr)
663 if (ipv4_is_zeronet(addr))
685 struct in_device *in_dev;
686 struct in_ifaddr **ifap =
NULL;
687 struct in_ifaddr *ifa =
NULL;
691 int tryaddrmatch = 0;
702 memcpy(&sin_orig, sin,
sizeof(*sin));
704 colon =
strchr(ifr.ifr_name,
':');
720 memset(sin, 0,
sizeof(*sin));
755 in_dev = __in_dev_get_rtnl(dev);
763 for (ifap = &in_dev->ifa_list; (ifa = *ifap) !=
NULL;
764 ifap = &ifa->ifa_next) {
765 if (!
strcmp(ifr.ifr_name, ifa->ifa_label) &&
776 for (ifap = &in_dev->ifa_list; (ifa = *ifap) !=
NULL;
777 ifap = &ifa->ifa_next)
778 if (!
strcmp(ifr.ifr_name, ifa->ifa_label))
789 sin->
sin_addr.s_addr = ifa->ifa_local;
793 sin->
sin_addr.s_addr = ifa->ifa_broadcast;
797 sin->
sin_addr.s_addr = ifa->ifa_address;
801 sin->
sin_addr.s_addr = ifa->ifa_mask;
810 if (!(ifr.ifr_flags &
IFF_UP))
811 inet_del_ifa(in_dev, ifap, 1);
819 if (inet_abc_len(sin->
sin_addr.s_addr) < 0)
824 ifa = inet_alloc_ifa();
825 INIT_HLIST_NODE(&ifa->hash);
834 if (ifa->ifa_local == sin->
sin_addr.s_addr)
836 inet_del_ifa(in_dev, ifap, 0);
837 ifa->ifa_broadcast = 0;
841 ifa->ifa_address = ifa->ifa_local = sin->
sin_addr.s_addr;
844 ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
845 ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
847 ifa->ifa_prefixlen < 31)
848 ifa->ifa_broadcast = ifa->ifa_address |
851 ifa->ifa_prefixlen = 32;
852 ifa->ifa_mask = inet_make_mask(32);
854 ret = inet_set_ifa(dev, ifa);
859 if (ifa->ifa_broadcast != sin->
sin_addr.s_addr) {
860 inet_del_ifa(in_dev, ifap, 0);
861 ifa->ifa_broadcast = sin->
sin_addr.s_addr;
862 inet_insert_ifa(ifa);
868 if (ifa->ifa_address == sin->
sin_addr.s_addr)
871 if (inet_abc_len(sin->
sin_addr.s_addr) < 0)
874 inet_del_ifa(in_dev, ifap, 0);
875 ifa->ifa_address = sin->
sin_addr.s_addr;
876 inet_insert_ifa(ifa);
885 if (bad_mask(sin->
sin_addr.s_addr, 0))
888 if (ifa->ifa_mask != sin->
sin_addr.s_addr) {
889 __be32 old_mask = ifa->ifa_mask;
890 inet_del_ifa(in_dev, ifap, 0);
891 ifa->ifa_mask = sin->
sin_addr.s_addr;
892 ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
901 (ifa->ifa_prefixlen < 31) &&
902 (ifa->ifa_broadcast ==
903 (ifa->ifa_local|~old_mask))) {
904 ifa->ifa_broadcast = (ifa->ifa_local |
907 inet_insert_ifa(ifa);
921 static int inet_gifconf(
struct net_device *dev,
char __user *
buf,
int len)
923 struct in_device *in_dev = __in_dev_get_rtnl(dev);
924 struct in_ifaddr *ifa;
931 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
936 if (len < (
int)
sizeof(ifr))
940 strcpy(ifr.ifr_name, ifa->ifa_label);
945 (*(
struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr =
952 buf +=
sizeof(
struct ifreq);
953 len -=
sizeof(
struct ifreq);
954 done +=
sizeof(
struct ifreq);
963 struct in_device *in_dev;
964 struct net *net = dev_net(dev);
967 in_dev = __in_dev_get_rcu(dev);
971 for_primary_ifa(in_dev) {
972 if (ifa->ifa_scope > scope)
974 if (!dst || inet_ifa_match(dst, ifa)) {
975 addr = ifa->ifa_local;
979 addr = ifa->ifa_local;
980 } endfor_ifa(in_dev);
991 in_dev = __in_dev_get_rcu(dev);
995 for_primary_ifa(in_dev) {
997 ifa->ifa_scope <= scope) {
998 addr = ifa->ifa_local;
1001 } endfor_ifa(in_dev);
1009 static __be32 confirm_addr_indev(
struct in_device *in_dev,
__be32 dst,
1017 (local == ifa->ifa_local || !local) &&
1018 ifa->ifa_scope <= scope) {
1019 addr = ifa->ifa_local;
1024 same = (!local || inet_ifa_match(local, ifa)) &&
1025 (!dst || inet_ifa_match(dst, ifa));
1030 if (inet_ifa_match(addr, ifa))
1033 if (ifa->ifa_scope <= scope) {
1034 addr = ifa->ifa_local;
1041 } endfor_ifa(in_dev);
1043 return same ? addr : 0;
1061 return confirm_addr_indev(in_dev, dst, local, scope);
1063 net = dev_net(in_dev->dev);
1066 in_dev = __in_dev_get_rcu(dev);
1068 addr = confirm_addr_indev(in_dev, dst, local, scope);
1098 static void inetdev_changename(
struct net_device *dev,
struct in_device *in_dev)
1100 struct in_ifaddr *ifa;
1103 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
1116 strcat(ifa->ifa_label, dot);
1124 static bool inetdev_valid_mtu(
unsigned int mtu)
1129 static void inetdev_send_gratuitous_arp(
struct net_device *dev,
1130 struct in_device *in_dev)
1133 struct in_ifaddr *ifa;
1135 for (ifa = in_dev->ifa_list; ifa;
1136 ifa = ifa->ifa_next) {
1138 ifa->ifa_local, dev,
1139 ifa->ifa_local,
NULL,
1150 struct in_device *in_dev = __in_dev_get_rtnl(dev);
1156 in_dev = inetdev_init(dev);
1158 return notifier_from_errno(-
ENOMEM);
1160 IN_DEV_CONF_SET(in_dev, NOXFRM, 1);
1161 IN_DEV_CONF_SET(in_dev, NOPOLICY, 1);
1165 if (inetdev_valid_mtu(dev->
mtu))
1166 in_dev = inetdev_init(dev);
1177 if (!inetdev_valid_mtu(dev->
mtu))
1180 struct in_ifaddr *ifa = inet_alloc_ifa();
1183 INIT_HLIST_NODE(&ifa->hash);
1186 ifa->ifa_prefixlen = 8;
1187 ifa->ifa_mask = inet_make_mask(8);
1188 in_dev_hold(in_dev);
1189 ifa->ifa_dev = in_dev;
1192 inet_insert_ifa(ifa);
1198 if (!IN_DEV_ARP_NOTIFY(in_dev))
1203 inetdev_send_gratuitous_arp(dev, in_dev);
1215 if (inetdev_valid_mtu(dev->
mtu))
1219 inetdev_destroy(in_dev);
1225 inetdev_changename(dev, in_dev);
1227 devinet_sysctl_unregister(in_dev);
1228 devinet_sysctl_register(in_dev);
1236 .notifier_call = inetdev_event,
1239 static size_t inet_nlmsg_size(
void)
1248 static int inet_fill_ifaddr(
struct sk_buff *skb,
struct in_ifaddr *ifa,
1249 u32 portid,
u32 seq,
int event,
unsigned int flags)
1254 nlh = nlmsg_put(skb, portid, seq, event,
sizeof(*ifm), flags);
1258 ifm = nlmsg_data(nlh);
1263 ifm->
ifa_index = ifa->ifa_dev->dev->ifindex;
1265 if ((ifa->ifa_address &&
1266 nla_put_be32(skb,
IFA_ADDRESS, ifa->ifa_address)) ||
1268 nla_put_be32(skb, IFA_LOCAL, ifa->ifa_local)) ||
1269 (ifa->ifa_broadcast &&
1270 nla_put_be32(skb, IFA_BROADCAST, ifa->ifa_broadcast)) ||
1271 (ifa->ifa_label[0] &&
1272 nla_put_string(skb, IFA_LABEL, ifa->ifa_label)))
1273 goto nla_put_failure;
1275 return nlmsg_end(skb, nlh);
1278 nlmsg_cancel(skb, nlh);
1284 struct net *net = sock_net(skb->
sk);
1287 int ip_idx, s_ip_idx;
1289 struct in_device *in_dev;
1290 struct in_ifaddr *ifa;
1295 s_idx = idx = cb->
args[1];
1296 s_ip_idx = ip_idx = cb->
args[2];
1302 hlist_for_each_entry_rcu(dev, node, head, index_hlist) {
1305 if (h > s_h || idx > s_idx)
1307 in_dev = __in_dev_get_rcu(dev);
1311 for (ifa = in_dev->ifa_list, ip_idx = 0; ifa;
1312 ifa = ifa->ifa_next, ip_idx++) {
1313 if (ip_idx < s_ip_idx)
1315 if (inet_fill_ifaddr(skb, ifa,
1332 cb->
args[2] = ip_idx;
1337 static void rtmsg_ifa(
int event,
struct in_ifaddr *ifa,
struct nlmsghdr *nlh,
1345 net = dev_net(ifa->ifa_dev->dev);
1346 skb = nlmsg_new(inet_nlmsg_size(),
GFP_KERNEL);
1350 err = inet_fill_ifaddr(skb, ifa, portid, seq, event, 0);
1364 static size_t inet_get_link_af_size(
const struct net_device *dev)
1371 return nla_total_size(IPV4_DEVCONF_MAX * 4);
1387 for (i = 0; i < IPV4_DEVCONF_MAX; i++)
1388 ((
u32 *) nla_data(nla))[
i] = in_dev->cnf.data[
i];
1397 static int inet_validate_link_af(
const struct net_device *dev,
1398 const struct nlattr *nla)
1403 if (dev && !__in_dev_get_rtnl(dev))
1406 err = nla_parse_nested(tb,
IFLA_INET_MAX, nla, inet_af_policy);
1417 if (cfgid <= 0 || cfgid > IPV4_DEVCONF_MAX)
1425 static int inet_set_link_af(
struct net_device *dev,
const struct nlattr *nla)
1427 struct in_device *in_dev = __in_dev_get_rtnl(dev);
1437 if (tb[IFLA_INET_CONF]) {
1439 ipv4_devconf_set(in_dev,
nla_type(a), nla_get_u32(a));
1445 #ifdef CONFIG_SYSCTL
1447 static void devinet_copy_dflt_conf(
struct net *net,
int i)
1453 struct in_device *in_dev;
1455 in_dev = __in_dev_get_rcu(dev);
1456 if (in_dev && !
test_bit(i, in_dev->cnf.state))
1457 in_dev->cnf.data[
i] = net->
ipv4.devconf_dflt->data[
i];
1463 static void inet_forward_change(
struct net *net)
1466 int on = IPV4_DEVCONF_ALL(net, FORWARDING);
1468 IPV4_DEVCONF_ALL(net, ACCEPT_REDIRECTS) = !on;
1472 struct in_device *in_dev;
1476 in_dev = __in_dev_get_rcu(dev);
1478 IN_DEV_CONF_SET(in_dev, FORWARDING, on);
1485 size_t *lenp, loff_t *ppos)
1487 int old_value = *(
int *)ctl->
data;
1489 int new_value = *(
int *)ctl->
data;
1492 struct ipv4_devconf *cnf = ctl->
extra1;
1493 struct net *net = ctl->
extra2;
1494 int i = (
int *)ctl->
data - cnf->data;
1498 if (cnf == net->
ipv4.devconf_dflt)
1499 devinet_copy_dflt_conf(net, i);
1500 if (i == IPV4_DEVCONF_ACCEPT_LOCAL - 1 ||
1501 i == IPV4_DEVCONF_ROUTE_LOCALNET - 1)
1502 if ((new_value == 0) && (old_value != 0))
1509 static int devinet_sysctl_forward(
ctl_table *ctl,
int write,
1510 void __user *buffer,
1511 size_t *lenp, loff_t *ppos)
1513 int *valp = ctl->
data;
1518 if (write && *valp != val) {
1519 struct net *net = ctl->
extra2;
1526 return restart_syscall();
1528 if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) {
1529 inet_forward_change(net);
1531 struct ipv4_devconf *cnf = ctl->
extra1;
1532 struct in_device *
idev =
1544 static int ipv4_doint_and_flush(
ctl_table *ctl,
int write,
1545 void __user *buffer,
1546 size_t *lenp, loff_t *ppos)
1548 int *valp = ctl->
data;
1551 struct net *net = ctl->
extra2;
1553 if (write && *valp != val)
1559 #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc) \
1562 .data = ipv4_devconf.data + \
1563 IPV4_DEVCONF_ ## attr - 1, \
1564 .maxlen = sizeof(int), \
1566 .proc_handler = proc, \
1567 .extra1 = &ipv4_devconf, \
1570 #define DEVINET_SYSCTL_RW_ENTRY(attr, name) \
1571 DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc)
1573 #define DEVINET_SYSCTL_RO_ENTRY(attr, name) \
1574 DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc)
1576 #define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc) \
1577 DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc)
1579 #define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \
1580 DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush)
1582 static struct devinet_sysctl_table {
1584 struct ctl_table devinet_vars[__IPV4_DEVCONF_MAX];
1585 } devinet_sysctl = {
1587 DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING,
"forwarding",
1588 devinet_sysctl_forward),
1589 DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING,
"mc_forwarding"),
1591 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS,
"accept_redirects"),
1592 DEVINET_SYSCTL_RW_ENTRY(SECURE_REDIRECTS,
"secure_redirects"),
1593 DEVINET_SYSCTL_RW_ENTRY(SHARED_MEDIA,
"shared_media"),
1594 DEVINET_SYSCTL_RW_ENTRY(RP_FILTER,
"rp_filter"),
1595 DEVINET_SYSCTL_RW_ENTRY(SEND_REDIRECTS,
"send_redirects"),
1596 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE,
1597 "accept_source_route"),
1598 DEVINET_SYSCTL_RW_ENTRY(ACCEPT_LOCAL,
"accept_local"),
1599 DEVINET_SYSCTL_RW_ENTRY(SRC_VMARK,
"src_valid_mark"),
1600 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP,
"proxy_arp"),
1601 DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID,
"medium_id"),
1602 DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY,
"bootp_relay"),
1603 DEVINET_SYSCTL_RW_ENTRY(LOG_MARTIANS,
"log_martians"),
1604 DEVINET_SYSCTL_RW_ENTRY(
TAG,
"tag"),
1605 DEVINET_SYSCTL_RW_ENTRY(ARPFILTER,
"arp_filter"),
1606 DEVINET_SYSCTL_RW_ENTRY(ARP_ANNOUNCE,
"arp_announce"),
1607 DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE,
"arp_ignore"),
1608 DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT,
"arp_accept"),
1609 DEVINET_SYSCTL_RW_ENTRY(ARP_NOTIFY,
"arp_notify"),
1610 DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP_PVLAN,
"proxy_arp_pvlan"),
1612 DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM,
"disable_xfrm"),
1613 DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY,
"disable_policy"),
1614 DEVINET_SYSCTL_FLUSHING_ENTRY(FORCE_IGMP_VERSION,
1615 "force_igmp_version"),
1616 DEVINET_SYSCTL_FLUSHING_ENTRY(PROMOTE_SECONDARIES,
1617 "promote_secondaries"),
1618 DEVINET_SYSCTL_FLUSHING_ENTRY(ROUTE_LOCALNET,
1623 static int __devinet_sysctl_register(
struct net *net,
char *dev_name,
1624 struct ipv4_devconf *
p)
1627 struct devinet_sysctl_table *
t;
1634 for (i = 0; i <
ARRAY_SIZE(t->devinet_vars) - 1; i++) {
1635 t->devinet_vars[
i].data += (
char *)p - (
char *)&ipv4_devconf;
1636 t->devinet_vars[
i].extra1 =
p;
1637 t->devinet_vars[
i].extra2 = net;
1643 if (!t->sysctl_header)
1655 static void __devinet_sysctl_unregister(
struct ipv4_devconf *cnf)
1657 struct devinet_sysctl_table *t = cnf->sysctl;
1667 static void devinet_sysctl_register(
struct in_device *
idev)
1670 __devinet_sysctl_register(dev_net(idev->dev), idev->dev->name,
1674 static void devinet_sysctl_unregister(
struct in_device *idev)
1676 __devinet_sysctl_unregister(&idev->cnf);
1680 static struct ctl_table ctl_forward_entry[] = {
1683 .data = &ipv4_devconf.data[
1684 IPV4_DEVCONF_FORWARDING - 1],
1685 .maxlen =
sizeof(
int),
1695 static __net_init int devinet_init_net(
struct net *net)
1698 struct ipv4_devconf *all, *dflt;
1699 #ifdef CONFIG_SYSCTL
1700 struct ctl_table *tbl = ctl_forward_entry;
1705 all = &ipv4_devconf;
1706 dflt = &ipv4_devconf_dflt;
1715 goto err_alloc_dflt;
1717 #ifdef CONFIG_SYSCTL
1722 tbl[0].
data = &all->data[IPV4_DEVCONF_FORWARDING - 1];
1728 #ifdef CONFIG_SYSCTL
1729 err = __devinet_sysctl_register(net,
"all", all);
1733 err = __devinet_sysctl_register(net,
"default", dflt);
1739 if (forw_hdr ==
NULL)
1741 net->
ipv4.forw_hdr = forw_hdr;
1744 net->
ipv4.devconf_all = all;
1745 net->
ipv4.devconf_dflt = dflt;
1748 #ifdef CONFIG_SYSCTL
1750 __devinet_sysctl_unregister(dflt);
1752 __devinet_sysctl_unregister(all);
1754 if (tbl != ctl_forward_entry)
1758 if (dflt != &ipv4_devconf_dflt)
1761 if (all != &ipv4_devconf)
1767 static __net_exit void devinet_exit_net(
struct net *net)
1769 #ifdef CONFIG_SYSCTL
1772 tbl = net->
ipv4.forw_hdr->ctl_table_arg;
1774 __devinet_sysctl_unregister(net->
ipv4.devconf_dflt);
1775 __devinet_sysctl_unregister(net->
ipv4.devconf_all);
1783 .init = devinet_init_net,
1784 .exit = devinet_exit_net,
1789 .fill_link_af = inet_fill_link_af,
1790 .get_link_af_size = inet_get_link_af_size,
1791 .validate_link_af = inet_validate_link_af,
1792 .set_link_af = inet_set_link_af,