Linux Audio

Check our new training course

Loading...
v3.5.6
 
   1/*
   2 *	NET3	IP device support routines.
   3 *
   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.
   8 *
   9 *	Derived from the IP parts of dev.c 1.0.19
  10 * 		Authors:	Ross Biro
  11 *				Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  12 *				Mark Evans, <evansmp@uhura.aston.ac.uk>
  13 *
  14 *	Additional Authors:
  15 *		Alan Cox, <gw4pts@gw4pts.ampr.org>
  16 *		Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
  17 *
  18 *	Changes:
  19 *		Alexey Kuznetsov:	pa_* fields are replaced with ifaddr
  20 *					lists.
  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
  25 *					if no match found.
  26 */
  27
  28
  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>
  36#include <linux/mm.h>
  37#include <linux/socket.h>
  38#include <linux/sockios.h>
  39#include <linux/in.h>
  40#include <linux/errno.h>
  41#include <linux/interrupt.h>
  42#include <linux/if_addr.h>
  43#include <linux/if_ether.h>
  44#include <linux/inet.h>
  45#include <linux/netdevice.h>
  46#include <linux/etherdevice.h>
  47#include <linux/skbuff.h>
  48#include <linux/init.h>
  49#include <linux/notifier.h>
  50#include <linux/inetdevice.h>
  51#include <linux/igmp.h>
  52#include <linux/slab.h>
  53#include <linux/hash.h>
  54#ifdef CONFIG_SYSCTL
  55#include <linux/sysctl.h>
  56#endif
  57#include <linux/kmod.h>
 
  58
  59#include <net/arp.h>
  60#include <net/ip.h>
  61#include <net/route.h>
  62#include <net/ip_fib.h>
  63#include <net/rtnetlink.h>
  64#include <net/net_namespace.h>
 
  65
  66#include "fib_lookup.h"
 
 
 
  67
  68static struct ipv4_devconf ipv4_devconf = {
  69	.data = {
  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,
 
 
 
  74	},
  75};
  76
  77static struct ipv4_devconf ipv4_devconf_dflt = {
  78	.data = {
  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,
 
 
 
  84	},
  85};
  86
  87#define IPV4_DEVCONF_DFLT(net, attr) \
  88	IPV4_DEVCONF((*net->ipv4.devconf_dflt), attr)
  89
  90static const struct nla_policy ifa_ipv4_policy[IFA_MAX+1] = {
  91	[IFA_LOCAL]     	= { .type = NLA_U32 },
  92	[IFA_ADDRESS]   	= { .type = NLA_U32 },
  93	[IFA_BROADCAST] 	= { .type = NLA_U32 },
  94	[IFA_LABEL]     	= { .type = NLA_STRING, .len = IFNAMSIZ - 1 },
 
 
 
 
 
  95};
  96
  97/* inet_addr_hash's shifting is dependent upon this IN4_ADDR_HSIZE
  98 * value.  So if you change this define, make appropriate changes to
  99 * inet_addr_hash as well.
 100 */
 101#define IN4_ADDR_HSIZE	256
 
 
 
 
 
 
 
 102static struct hlist_head inet_addr_lst[IN4_ADDR_HSIZE];
 103static DEFINE_SPINLOCK(inet_addr_hash_lock);
 104
 105static inline unsigned int inet_addr_hash(struct net *net, __be32 addr)
 106{
 107	u32 val = (__force u32) addr ^ hash_ptr(net, 8);
 108
 109	return ((val ^ (val >> 8) ^ (val >> 16) ^ (val >> 24)) &
 110		(IN4_ADDR_HSIZE - 1));
 111}
 112
 113static void inet_hash_insert(struct net *net, struct in_ifaddr *ifa)
 114{
 115	unsigned int hash = inet_addr_hash(net, ifa->ifa_local);
 116
 117	spin_lock(&inet_addr_hash_lock);
 118	hlist_add_head_rcu(&ifa->hash, &inet_addr_lst[hash]);
 119	spin_unlock(&inet_addr_hash_lock);
 120}
 121
 122static void inet_hash_remove(struct in_ifaddr *ifa)
 123{
 124	spin_lock(&inet_addr_hash_lock);
 125	hlist_del_init_rcu(&ifa->hash);
 126	spin_unlock(&inet_addr_hash_lock);
 127}
 128
 129/**
 130 * __ip_dev_find - find the first device with a given source address.
 131 * @net: the net namespace
 132 * @addr: the source address
 133 * @devref: if true, take a reference on the found device
 134 *
 135 * If a caller uses devref=false, it should be protected by RCU, or RTNL
 136 */
 137struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref)
 138{
 139	unsigned int hash = inet_addr_hash(net, addr);
 140	struct net_device *result = NULL;
 141	struct in_ifaddr *ifa;
 142	struct hlist_node *node;
 143
 144	rcu_read_lock();
 145	hlist_for_each_entry_rcu(ifa, node, &inet_addr_lst[hash], hash) {
 146		struct net_device *dev = ifa->ifa_dev->dev;
 147
 148		if (!net_eq(dev_net(dev), net))
 149			continue;
 150		if (ifa->ifa_local == addr) {
 151			result = dev;
 152			break;
 153		}
 154	}
 155	if (!result) {
 156		struct flowi4 fl4 = { .daddr = addr };
 157		struct fib_result res = { 0 };
 158		struct fib_table *local;
 159
 160		/* Fallback to FIB local table so that communication
 161		 * over loopback subnets work.
 162		 */
 163		local = fib_get_table(net, RT_TABLE_LOCAL);
 164		if (local &&
 165		    !fib_table_lookup(local, &fl4, &res, FIB_LOOKUP_NOREF) &&
 166		    res.type == RTN_LOCAL)
 167			result = FIB_RES_DEV(res);
 
 
 168	}
 169	if (result && devref)
 170		dev_hold(result);
 171	rcu_read_unlock();
 172	return result;
 173}
 174EXPORT_SYMBOL(__ip_dev_find);
 175
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 176static void rtmsg_ifa(int event, struct in_ifaddr *, struct nlmsghdr *, u32);
 177
 178static BLOCKING_NOTIFIER_HEAD(inetaddr_chain);
 179static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
 
 
 180			 int destroy);
 181#ifdef CONFIG_SYSCTL
 182static void devinet_sysctl_register(struct in_device *idev);
 183static void devinet_sysctl_unregister(struct in_device *idev);
 184#else
 185static inline void devinet_sysctl_register(struct in_device *idev)
 186{
 
 187}
 188static inline void devinet_sysctl_unregister(struct in_device *idev)
 189{
 190}
 191#endif
 192
 193/* Locks all the inet devices. */
 194
 195static struct in_ifaddr *inet_alloc_ifa(void)
 196{
 197	return kzalloc(sizeof(struct in_ifaddr), GFP_KERNEL);
 198}
 199
 200static void inet_rcu_free_ifa(struct rcu_head *head)
 201{
 202	struct in_ifaddr *ifa = container_of(head, struct in_ifaddr, rcu_head);
 203	if (ifa->ifa_dev)
 204		in_dev_put(ifa->ifa_dev);
 205	kfree(ifa);
 206}
 207
 208static inline void inet_free_ifa(struct in_ifaddr *ifa)
 209{
 210	call_rcu(&ifa->rcu_head, inet_rcu_free_ifa);
 211}
 212
 
 
 
 
 
 
 
 
 213void in_dev_finish_destroy(struct in_device *idev)
 214{
 215	struct net_device *dev = idev->dev;
 216
 217	WARN_ON(idev->ifa_list);
 218	WARN_ON(idev->mc_list);
 219#ifdef NET_REFCNT_DEBUG
 220	pr_debug("%s: %p=%s\n", __func__, idev, dev ? dev->name : "NIL");
 221#endif
 222	dev_put(dev);
 223	if (!idev->dead)
 224		pr_err("Freeing alive in_device %p\n", idev);
 225	else
 226		kfree(idev);
 227}
 228EXPORT_SYMBOL(in_dev_finish_destroy);
 229
 230static struct in_device *inetdev_init(struct net_device *dev)
 231{
 232	struct in_device *in_dev;
 
 233
 234	ASSERT_RTNL();
 235
 236	in_dev = kzalloc(sizeof(*in_dev), GFP_KERNEL);
 237	if (!in_dev)
 238		goto out;
 239	memcpy(&in_dev->cnf, dev_net(dev)->ipv4.devconf_dflt,
 240			sizeof(in_dev->cnf));
 241	in_dev->cnf.sysctl = NULL;
 242	in_dev->dev = dev;
 243	in_dev->arp_parms = neigh_parms_alloc(dev, &arp_tbl);
 244	if (!in_dev->arp_parms)
 245		goto out_kfree;
 246	if (IPV4_DEVCONF(in_dev->cnf, FORWARDING))
 247		dev_disable_lro(dev);
 248	/* Reference in_dev->dev */
 249	dev_hold(dev);
 250	/* Account for reference dev->ip_ptr (below) */
 251	in_dev_hold(in_dev);
 252
 253	devinet_sysctl_register(in_dev);
 
 
 
 
 
 
 
 254	ip_mc_init_dev(in_dev);
 255	if (dev->flags & IFF_UP)
 256		ip_mc_up(in_dev);
 257
 258	/* we can receive as soon as ip_ptr is set -- do this last */
 259	rcu_assign_pointer(dev->ip_ptr, in_dev);
 260out:
 261	return in_dev;
 262out_kfree:
 263	kfree(in_dev);
 264	in_dev = NULL;
 265	goto out;
 266}
 267
 268static void in_dev_rcu_put(struct rcu_head *head)
 269{
 270	struct in_device *idev = container_of(head, struct in_device, rcu_head);
 271	in_dev_put(idev);
 272}
 273
 274static void inetdev_destroy(struct in_device *in_dev)
 275{
 276	struct in_ifaddr *ifa;
 277	struct net_device *dev;
 
 278
 279	ASSERT_RTNL();
 280
 281	dev = in_dev->dev;
 282
 283	in_dev->dead = 1;
 284
 285	ip_mc_destroy_dev(in_dev);
 286
 287	while ((ifa = in_dev->ifa_list) != NULL) {
 288		inet_del_ifa(in_dev, &in_dev->ifa_list, 0);
 289		inet_free_ifa(ifa);
 290	}
 291
 292	RCU_INIT_POINTER(dev->ip_ptr, NULL);
 293
 294	devinet_sysctl_unregister(in_dev);
 295	neigh_parms_release(&arp_tbl, in_dev->arp_parms);
 296	arp_ifdown(dev);
 297
 298	call_rcu(&in_dev->rcu_head, in_dev_rcu_put);
 299}
 300
 301int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b)
 302{
 
 
 303	rcu_read_lock();
 304	for_primary_ifa(in_dev) {
 305		if (inet_ifa_match(a, ifa)) {
 306			if (!b || inet_ifa_match(b, ifa)) {
 307				rcu_read_unlock();
 308				return 1;
 309			}
 310		}
 311	} endfor_ifa(in_dev);
 312	rcu_read_unlock();
 313	return 0;
 314}
 315
 316static void __inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
 317			 int destroy, struct nlmsghdr *nlh, u32 pid)
 
 318{
 319	struct in_ifaddr *promote = NULL;
 320	struct in_ifaddr *ifa, *ifa1 = *ifap;
 321	struct in_ifaddr *last_prim = in_dev->ifa_list;
 322	struct in_ifaddr *prev_prom = NULL;
 323	int do_promote = IN_DEV_PROMOTE_SECONDARIES(in_dev);
 324
 325	ASSERT_RTNL();
 326
 
 
 
 
 
 327	/* 1. Deleting primary ifaddr forces deletion all secondaries
 328	 * unless alias promotion is set
 329	 **/
 330
 331	if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
 332		struct in_ifaddr **ifap1 = &ifa1->ifa_next;
 333
 334		while ((ifa = *ifap1) != NULL) {
 335			if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
 336			    ifa1->ifa_scope <= ifa->ifa_scope)
 337				last_prim = ifa;
 338
 339			if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
 340			    ifa1->ifa_mask != ifa->ifa_mask ||
 341			    !inet_ifa_match(ifa1->ifa_address, ifa)) {
 342				ifap1 = &ifa->ifa_next;
 343				prev_prom = ifa;
 344				continue;
 345			}
 346
 347			if (!do_promote) {
 348				inet_hash_remove(ifa);
 349				*ifap1 = ifa->ifa_next;
 350
 351				rtmsg_ifa(RTM_DELADDR, ifa, nlh, pid);
 352				blocking_notifier_call_chain(&inetaddr_chain,
 353						NETDEV_DOWN, ifa);
 354				inet_free_ifa(ifa);
 355			} else {
 356				promote = ifa;
 357				break;
 358			}
 359		}
 360	}
 361
 362	/* On promotion all secondaries from subnet are changing
 363	 * the primary IP, we must remove all their routes silently
 364	 * and later to add them back with new prefsrc. Do this
 365	 * while all addresses are on the device list.
 366	 */
 367	for (ifa = promote; ifa; ifa = ifa->ifa_next) {
 368		if (ifa1->ifa_mask == ifa->ifa_mask &&
 369		    inet_ifa_match(ifa1->ifa_address, ifa))
 370			fib_del_ifaddr(ifa, ifa1);
 371	}
 372
 
 373	/* 2. Unlink it */
 374
 375	*ifap = ifa1->ifa_next;
 376	inet_hash_remove(ifa1);
 377
 378	/* 3. Announce address deletion */
 379
 380	/* Send message first, then call notifier.
 381	   At first sight, FIB update triggered by notifier
 382	   will refer to already deleted ifaddr, that could confuse
 383	   netlink listeners. It is not true: look, gated sees
 384	   that route deleted and if it still thinks that ifaddr
 385	   is valid, it will try to restore deleted routes... Grr.
 386	   So that, this order is correct.
 387	 */
 388	rtmsg_ifa(RTM_DELADDR, ifa1, nlh, pid);
 389	blocking_notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
 390
 391	if (promote) {
 392		struct in_ifaddr *next_sec = promote->ifa_next;
 393
 
 394		if (prev_prom) {
 395			prev_prom->ifa_next = promote->ifa_next;
 396			promote->ifa_next = last_prim->ifa_next;
 397			last_prim->ifa_next = promote;
 
 
 
 
 398		}
 399
 400		promote->ifa_flags &= ~IFA_F_SECONDARY;
 401		rtmsg_ifa(RTM_NEWADDR, promote, nlh, pid);
 402		blocking_notifier_call_chain(&inetaddr_chain,
 403				NETDEV_UP, promote);
 404		for (ifa = next_sec; ifa; ifa = ifa->ifa_next) {
 
 405			if (ifa1->ifa_mask != ifa->ifa_mask ||
 406			    !inet_ifa_match(ifa1->ifa_address, ifa))
 407					continue;
 408			fib_add_ifaddr(ifa);
 409		}
 410
 411	}
 412	if (destroy)
 413		inet_free_ifa(ifa1);
 414}
 415
 416static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
 
 417			 int destroy)
 418{
 419	__inet_del_ifa(in_dev, ifap, destroy, NULL, 0);
 420}
 421
 
 
 
 
 422static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
 423			     u32 pid)
 424{
 
 425	struct in_device *in_dev = ifa->ifa_dev;
 426	struct in_ifaddr *ifa1, **ifap, **last_primary;
 
 
 427
 428	ASSERT_RTNL();
 429
 430	if (!ifa->ifa_local) {
 431		inet_free_ifa(ifa);
 432		return 0;
 433	}
 434
 435	ifa->ifa_flags &= ~IFA_F_SECONDARY;
 436	last_primary = &in_dev->ifa_list;
 437
 438	for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL;
 439	     ifap = &ifa1->ifa_next) {
 
 
 
 
 
 440		if (!(ifa1->ifa_flags & IFA_F_SECONDARY) &&
 441		    ifa->ifa_scope <= ifa1->ifa_scope)
 442			last_primary = &ifa1->ifa_next;
 443		if (ifa1->ifa_mask == ifa->ifa_mask &&
 444		    inet_ifa_match(ifa1->ifa_address, ifa)) {
 445			if (ifa1->ifa_local == ifa->ifa_local) {
 446				inet_free_ifa(ifa);
 447				return -EEXIST;
 448			}
 449			if (ifa1->ifa_scope != ifa->ifa_scope) {
 
 450				inet_free_ifa(ifa);
 451				return -EINVAL;
 452			}
 453			ifa->ifa_flags |= IFA_F_SECONDARY;
 454		}
 
 
 
 455	}
 456
 457	if (!(ifa->ifa_flags & IFA_F_SECONDARY)) {
 458		net_srandom(ifa->ifa_local);
 459		ifap = last_primary;
 
 
 
 
 
 
 
 
 
 
 
 
 
 460	}
 461
 462	ifa->ifa_next = *ifap;
 463	*ifap = ifa;
 
 
 
 464
 465	inet_hash_insert(dev_net(in_dev->dev), ifa);
 466
 
 
 
 467	/* Send message first, then call notifier.
 468	   Notifier will trigger FIB update, so that
 469	   listeners of netlink will know about new ifaddr */
 470	rtmsg_ifa(RTM_NEWADDR, ifa, nlh, pid);
 471	blocking_notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
 472
 473	return 0;
 474}
 475
 476static int inet_insert_ifa(struct in_ifaddr *ifa)
 477{
 478	return __inet_insert_ifa(ifa, NULL, 0);
 479}
 480
 481static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
 482{
 483	struct in_device *in_dev = __in_dev_get_rtnl(dev);
 484
 485	ASSERT_RTNL();
 486
 487	if (!in_dev) {
 488		inet_free_ifa(ifa);
 489		return -ENOBUFS;
 490	}
 491	ipv4_devconf_setall(in_dev);
 
 492	if (ifa->ifa_dev != in_dev) {
 493		WARN_ON(ifa->ifa_dev);
 494		in_dev_hold(in_dev);
 495		ifa->ifa_dev = in_dev;
 496	}
 497	if (ipv4_is_loopback(ifa->ifa_local))
 498		ifa->ifa_scope = RT_SCOPE_HOST;
 499	return inet_insert_ifa(ifa);
 500}
 501
 502/* Caller must hold RCU or RTNL :
 503 * We dont take a reference on found in_device
 504 */
 505struct in_device *inetdev_by_index(struct net *net, int ifindex)
 506{
 507	struct net_device *dev;
 508	struct in_device *in_dev = NULL;
 509
 510	rcu_read_lock();
 511	dev = dev_get_by_index_rcu(net, ifindex);
 512	if (dev)
 513		in_dev = rcu_dereference_rtnl(dev->ip_ptr);
 514	rcu_read_unlock();
 515	return in_dev;
 516}
 517EXPORT_SYMBOL(inetdev_by_index);
 518
 519/* Called only from RTNL semaphored context. No locks. */
 520
 521struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
 522				    __be32 mask)
 523{
 
 
 524	ASSERT_RTNL();
 525
 526	for_primary_ifa(in_dev) {
 527		if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
 528			return ifa;
 529	} endfor_ifa(in_dev);
 530	return NULL;
 531}
 532
 533static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 534{
 535	struct net *net = sock_net(skb->sk);
 
 536	struct nlattr *tb[IFA_MAX+1];
 537	struct in_device *in_dev;
 538	struct ifaddrmsg *ifm;
 539	struct in_ifaddr *ifa, **ifap;
 540	int err = -EINVAL;
 541
 542	ASSERT_RTNL();
 543
 544	err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy);
 
 545	if (err < 0)
 546		goto errout;
 547
 548	ifm = nlmsg_data(nlh);
 549	in_dev = inetdev_by_index(net, ifm->ifa_index);
 550	if (in_dev == NULL) {
 
 551		err = -ENODEV;
 552		goto errout;
 553	}
 554
 555	for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
 556	     ifap = &ifa->ifa_next) {
 557		if (tb[IFA_LOCAL] &&
 558		    ifa->ifa_local != nla_get_be32(tb[IFA_LOCAL]))
 559			continue;
 560
 561		if (tb[IFA_LABEL] && nla_strcmp(tb[IFA_LABEL], ifa->ifa_label))
 562			continue;
 563
 564		if (tb[IFA_ADDRESS] &&
 565		    (ifm->ifa_prefixlen != ifa->ifa_prefixlen ||
 566		    !inet_ifa_match(nla_get_be32(tb[IFA_ADDRESS]), ifa)))
 567			continue;
 568
 569		__inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).pid);
 
 
 570		return 0;
 571	}
 572
 
 573	err = -EADDRNOTAVAIL;
 574errout:
 575	return err;
 576}
 577
 578static struct in_ifaddr *rtm_to_ifaddr(struct net *net, struct nlmsghdr *nlh)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 579{
 580	struct nlattr *tb[IFA_MAX+1];
 581	struct in_ifaddr *ifa;
 582	struct ifaddrmsg *ifm;
 583	struct net_device *dev;
 584	struct in_device *in_dev;
 585	int err;
 586
 587	err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy);
 
 588	if (err < 0)
 589		goto errout;
 590
 591	ifm = nlmsg_data(nlh);
 592	err = -EINVAL;
 593	if (ifm->ifa_prefixlen > 32 || tb[IFA_LOCAL] == NULL)
 
 
 594		goto errout;
 
 
 
 
 
 
 595
 596	dev = __dev_get_by_index(net, ifm->ifa_index);
 597	err = -ENODEV;
 598	if (dev == NULL)
 
 599		goto errout;
 
 600
 601	in_dev = __in_dev_get_rtnl(dev);
 602	err = -ENOBUFS;
 603	if (in_dev == NULL)
 604		goto errout;
 605
 606	ifa = inet_alloc_ifa();
 607	if (ifa == NULL)
 608		/*
 609		 * A potential indev allocation can be left alive, it stays
 610		 * assigned to its device and is destroy with it.
 611		 */
 612		goto errout;
 613
 614	ipv4_devconf_setall(in_dev);
 
 615	in_dev_hold(in_dev);
 616
 617	if (tb[IFA_ADDRESS] == NULL)
 618		tb[IFA_ADDRESS] = tb[IFA_LOCAL];
 619
 620	INIT_HLIST_NODE(&ifa->hash);
 621	ifa->ifa_prefixlen = ifm->ifa_prefixlen;
 622	ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
 623	ifa->ifa_flags = ifm->ifa_flags;
 
 624	ifa->ifa_scope = ifm->ifa_scope;
 625	ifa->ifa_dev = in_dev;
 626
 627	ifa->ifa_local = nla_get_be32(tb[IFA_LOCAL]);
 628	ifa->ifa_address = nla_get_be32(tb[IFA_ADDRESS]);
 629
 630	if (tb[IFA_BROADCAST])
 631		ifa->ifa_broadcast = nla_get_be32(tb[IFA_BROADCAST]);
 632
 633	if (tb[IFA_LABEL])
 634		nla_strlcpy(ifa->ifa_label, tb[IFA_LABEL], IFNAMSIZ);
 635	else
 636		memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
 637
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 638	return ifa;
 639
 
 
 640errout:
 641	return ERR_PTR(err);
 642}
 643
 644static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 645{
 646	struct net *net = sock_net(skb->sk);
 647	struct in_ifaddr *ifa;
 
 
 
 648
 649	ASSERT_RTNL();
 650
 651	ifa = rtm_to_ifaddr(net, nlh);
 652	if (IS_ERR(ifa))
 653		return PTR_ERR(ifa);
 654
 655	return __inet_insert_ifa(ifa, nlh, NETLINK_CB(skb).pid);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 656}
 657
 658/*
 659 *	Determine a default network mask, based on the IP address.
 660 */
 661
 662static inline int inet_abc_len(__be32 addr)
 663{
 664	int rc = -1;	/* Something else, probably a multicast. */
 665
 666	if (ipv4_is_zeronet(addr))
 667		rc = 0;
 668	else {
 669		__u32 haddr = ntohl(addr);
 670
 671		if (IN_CLASSA(haddr))
 672			rc = 8;
 673		else if (IN_CLASSB(haddr))
 674			rc = 16;
 675		else if (IN_CLASSC(haddr))
 676			rc = 24;
 
 
 677	}
 678
 679	return rc;
 680}
 681
 682
 683int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
 684{
 685	struct ifreq ifr;
 686	struct sockaddr_in sin_orig;
 687	struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
 
 688	struct in_device *in_dev;
 689	struct in_ifaddr **ifap = NULL;
 690	struct in_ifaddr *ifa = NULL;
 691	struct net_device *dev;
 692	char *colon;
 693	int ret = -EFAULT;
 694	int tryaddrmatch = 0;
 695
 696	/*
 697	 *	Fetch the caller's info block into kernel space
 698	 */
 699
 700	if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
 701		goto out;
 702	ifr.ifr_name[IFNAMSIZ - 1] = 0;
 703
 704	/* save original address for comparison */
 705	memcpy(&sin_orig, sin, sizeof(*sin));
 706
 707	colon = strchr(ifr.ifr_name, ':');
 708	if (colon)
 709		*colon = 0;
 710
 711	dev_load(net, ifr.ifr_name);
 712
 713	switch (cmd) {
 714	case SIOCGIFADDR:	/* Get interface address */
 715	case SIOCGIFBRDADDR:	/* Get the broadcast address */
 716	case SIOCGIFDSTADDR:	/* Get the destination address */
 717	case SIOCGIFNETMASK:	/* Get the netmask for the interface */
 718		/* Note that these ioctls will not sleep,
 719		   so that we do not impose a lock.
 720		   One day we will be forced to put shlock here (I mean SMP)
 721		 */
 722		tryaddrmatch = (sin_orig.sin_family == AF_INET);
 723		memset(sin, 0, sizeof(*sin));
 724		sin->sin_family = AF_INET;
 725		break;
 726
 727	case SIOCSIFFLAGS:
 728		ret = -EACCES;
 729		if (!capable(CAP_NET_ADMIN))
 730			goto out;
 731		break;
 732	case SIOCSIFADDR:	/* Set interface address (and family) */
 733	case SIOCSIFBRDADDR:	/* Set the broadcast address */
 734	case SIOCSIFDSTADDR:	/* Set the destination address */
 735	case SIOCSIFNETMASK: 	/* Set the netmask for the interface */
 736		ret = -EACCES;
 737		if (!capable(CAP_NET_ADMIN))
 738			goto out;
 739		ret = -EINVAL;
 740		if (sin->sin_family != AF_INET)
 741			goto out;
 742		break;
 743	default:
 744		ret = -EINVAL;
 745		goto out;
 746	}
 747
 748	rtnl_lock();
 749
 750	ret = -ENODEV;
 751	dev = __dev_get_by_name(net, ifr.ifr_name);
 752	if (!dev)
 753		goto done;
 754
 755	if (colon)
 756		*colon = ':';
 757
 758	in_dev = __in_dev_get_rtnl(dev);
 759	if (in_dev) {
 760		if (tryaddrmatch) {
 761			/* Matthias Andree */
 762			/* compare label and address (4.4BSD style) */
 763			/* note: we only do this for a limited set of ioctls
 764			   and only if the original address family was AF_INET.
 765			   This is checked above. */
 766			for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
 
 
 767			     ifap = &ifa->ifa_next) {
 768				if (!strcmp(ifr.ifr_name, ifa->ifa_label) &&
 769				    sin_orig.sin_addr.s_addr ==
 770							ifa->ifa_local) {
 771					break; /* found */
 772				}
 773			}
 774		}
 775		/* we didn't get a match, maybe the application is
 776		   4.3BSD-style and passed in junk so we fall back to
 777		   comparing just the label */
 778		if (!ifa) {
 779			for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
 
 780			     ifap = &ifa->ifa_next)
 781				if (!strcmp(ifr.ifr_name, ifa->ifa_label))
 782					break;
 783		}
 784	}
 785
 786	ret = -EADDRNOTAVAIL;
 787	if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
 788		goto done;
 789
 790	switch (cmd) {
 791	case SIOCGIFADDR:	/* Get interface address */
 
 792		sin->sin_addr.s_addr = ifa->ifa_local;
 793		goto rarok;
 794
 795	case SIOCGIFBRDADDR:	/* Get the broadcast address */
 
 796		sin->sin_addr.s_addr = ifa->ifa_broadcast;
 797		goto rarok;
 798
 799	case SIOCGIFDSTADDR:	/* Get the destination address */
 
 800		sin->sin_addr.s_addr = ifa->ifa_address;
 801		goto rarok;
 802
 803	case SIOCGIFNETMASK:	/* Get the netmask for the interface */
 
 804		sin->sin_addr.s_addr = ifa->ifa_mask;
 805		goto rarok;
 806
 807	case SIOCSIFFLAGS:
 808		if (colon) {
 809			ret = -EADDRNOTAVAIL;
 810			if (!ifa)
 811				break;
 812			ret = 0;
 813			if (!(ifr.ifr_flags & IFF_UP))
 814				inet_del_ifa(in_dev, ifap, 1);
 815			break;
 816		}
 817		ret = dev_change_flags(dev, ifr.ifr_flags);
 818		break;
 819
 820	case SIOCSIFADDR:	/* Set interface address (and family) */
 821		ret = -EINVAL;
 822		if (inet_abc_len(sin->sin_addr.s_addr) < 0)
 823			break;
 824
 825		if (!ifa) {
 826			ret = -ENOBUFS;
 827			ifa = inet_alloc_ifa();
 828			INIT_HLIST_NODE(&ifa->hash);
 829			if (!ifa)
 830				break;
 
 831			if (colon)
 832				memcpy(ifa->ifa_label, ifr.ifr_name, IFNAMSIZ);
 833			else
 834				memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
 835		} else {
 836			ret = 0;
 837			if (ifa->ifa_local == sin->sin_addr.s_addr)
 838				break;
 839			inet_del_ifa(in_dev, ifap, 0);
 840			ifa->ifa_broadcast = 0;
 841			ifa->ifa_scope = 0;
 842		}
 843
 844		ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;
 845
 846		if (!(dev->flags & IFF_POINTOPOINT)) {
 847			ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
 848			ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
 849			if ((dev->flags & IFF_BROADCAST) &&
 850			    ifa->ifa_prefixlen < 31)
 851				ifa->ifa_broadcast = ifa->ifa_address |
 852						     ~ifa->ifa_mask;
 853		} else {
 854			ifa->ifa_prefixlen = 32;
 855			ifa->ifa_mask = inet_make_mask(32);
 856		}
 
 857		ret = inet_set_ifa(dev, ifa);
 858		break;
 859
 860	case SIOCSIFBRDADDR:	/* Set the broadcast address */
 861		ret = 0;
 862		if (ifa->ifa_broadcast != sin->sin_addr.s_addr) {
 863			inet_del_ifa(in_dev, ifap, 0);
 864			ifa->ifa_broadcast = sin->sin_addr.s_addr;
 865			inet_insert_ifa(ifa);
 866		}
 867		break;
 868
 869	case SIOCSIFDSTADDR:	/* Set the destination address */
 870		ret = 0;
 871		if (ifa->ifa_address == sin->sin_addr.s_addr)
 872			break;
 873		ret = -EINVAL;
 874		if (inet_abc_len(sin->sin_addr.s_addr) < 0)
 875			break;
 876		ret = 0;
 877		inet_del_ifa(in_dev, ifap, 0);
 878		ifa->ifa_address = sin->sin_addr.s_addr;
 879		inet_insert_ifa(ifa);
 880		break;
 881
 882	case SIOCSIFNETMASK: 	/* Set the netmask for the interface */
 883
 884		/*
 885		 *	The mask we set must be legal.
 886		 */
 887		ret = -EINVAL;
 888		if (bad_mask(sin->sin_addr.s_addr, 0))
 889			break;
 890		ret = 0;
 891		if (ifa->ifa_mask != sin->sin_addr.s_addr) {
 892			__be32 old_mask = ifa->ifa_mask;
 893			inet_del_ifa(in_dev, ifap, 0);
 894			ifa->ifa_mask = sin->sin_addr.s_addr;
 895			ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
 896
 897			/* See if current broadcast address matches
 898			 * with current netmask, then recalculate
 899			 * the broadcast address. Otherwise it's a
 900			 * funny address, so don't touch it since
 901			 * the user seems to know what (s)he's doing...
 902			 */
 903			if ((dev->flags & IFF_BROADCAST) &&
 904			    (ifa->ifa_prefixlen < 31) &&
 905			    (ifa->ifa_broadcast ==
 906			     (ifa->ifa_local|~old_mask))) {
 907				ifa->ifa_broadcast = (ifa->ifa_local |
 908						      ~sin->sin_addr.s_addr);
 909			}
 910			inet_insert_ifa(ifa);
 911		}
 912		break;
 913	}
 914done:
 915	rtnl_unlock();
 916out:
 917	return ret;
 918rarok:
 919	rtnl_unlock();
 920	ret = copy_to_user(arg, &ifr, sizeof(struct ifreq)) ? -EFAULT : 0;
 921	goto out;
 922}
 923
 924static int inet_gifconf(struct net_device *dev, char __user *buf, int len)
 925{
 926	struct in_device *in_dev = __in_dev_get_rtnl(dev);
 927	struct in_ifaddr *ifa;
 928	struct ifreq ifr;
 929	int done = 0;
 930
 
 
 
 931	if (!in_dev)
 932		goto out;
 933
 934	for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
 935		if (!buf) {
 936			done += sizeof(ifr);
 937			continue;
 938		}
 939		if (len < (int) sizeof(ifr))
 940			break;
 941		memset(&ifr, 0, sizeof(struct ifreq));
 942		if (ifa->ifa_label)
 943			strcpy(ifr.ifr_name, ifa->ifa_label);
 944		else
 945			strcpy(ifr.ifr_name, dev->name);
 946
 947		(*(struct sockaddr_in *)&ifr.ifr_addr).sin_family = AF_INET;
 948		(*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr =
 949								ifa->ifa_local;
 950
 951		if (copy_to_user(buf, &ifr, sizeof(struct ifreq))) {
 952			done = -EFAULT;
 953			break;
 954		}
 955		buf  += sizeof(struct ifreq);
 956		len  -= sizeof(struct ifreq);
 957		done += sizeof(struct ifreq);
 958	}
 959out:
 960	return done;
 961}
 962
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 963__be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope)
 964{
 
 965	__be32 addr = 0;
 
 966	struct in_device *in_dev;
 967	struct net *net = dev_net(dev);
 
 968
 969	rcu_read_lock();
 970	in_dev = __in_dev_get_rcu(dev);
 971	if (!in_dev)
 972		goto no_in_dev;
 973
 974	for_primary_ifa(in_dev) {
 975		if (ifa->ifa_scope > scope)
 
 
 
 
 
 976			continue;
 977		if (!dst || inet_ifa_match(dst, ifa)) {
 978			addr = ifa->ifa_local;
 979			break;
 980		}
 981		if (!addr)
 982			addr = ifa->ifa_local;
 983	} endfor_ifa(in_dev);
 984
 985	if (addr)
 986		goto out_unlock;
 987no_in_dev:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 988
 989	/* Not loopback addresses on loopback should be preferred
 990	   in this case. It is importnat that lo is the first interface
 991	   in dev_base list.
 992	 */
 993	for_each_netdev_rcu(net, dev) {
 
 
 
 994		in_dev = __in_dev_get_rcu(dev);
 995		if (!in_dev)
 996			continue;
 997
 998		for_primary_ifa(in_dev) {
 999			if (ifa->ifa_scope != RT_SCOPE_LINK &&
1000			    ifa->ifa_scope <= scope) {
1001				addr = ifa->ifa_local;
1002				goto out_unlock;
1003			}
1004		} endfor_ifa(in_dev);
1005	}
1006out_unlock:
1007	rcu_read_unlock();
1008	return addr;
1009}
1010EXPORT_SYMBOL(inet_select_addr);
1011
1012static __be32 confirm_addr_indev(struct in_device *in_dev, __be32 dst,
1013			      __be32 local, int scope)
1014{
1015	int same = 0;
 
1016	__be32 addr = 0;
 
 
 
 
 
 
 
1017
1018	for_ifa(in_dev) {
1019		if (!addr &&
1020		    (local == ifa->ifa_local || !local) &&
1021		    ifa->ifa_scope <= scope) {
1022			addr = ifa->ifa_local;
1023			if (same)
1024				break;
1025		}
1026		if (!same) {
1027			same = (!local || inet_ifa_match(local, ifa)) &&
1028				(!dst || inet_ifa_match(dst, ifa));
1029			if (same && addr) {
1030				if (local || !dst)
1031					break;
1032				/* Is the selected addr into dst subnet? */
1033				if (inet_ifa_match(addr, ifa))
1034					break;
1035				/* No, then can we use new local src? */
1036				if (ifa->ifa_scope <= scope) {
1037					addr = ifa->ifa_local;
1038					break;
1039				}
1040				/* search for large dst subnet for addr */
1041				same = 0;
1042			}
1043		}
1044	} endfor_ifa(in_dev);
1045
1046	return same ? addr : 0;
1047}
1048
1049/*
1050 * Confirm that local IP address exists using wildcards:
1051 * - in_dev: only on this interface, 0=any interface
 
1052 * - dst: only in the same subnet as dst, 0=any dst
1053 * - local: address, 0=autoselect the local address
1054 * - scope: maximum allowed scope value for the local address
1055 */
1056__be32 inet_confirm_addr(struct in_device *in_dev,
1057			 __be32 dst, __be32 local, int scope)
1058{
1059	__be32 addr = 0;
1060	struct net_device *dev;
1061	struct net *net;
1062
1063	if (scope != RT_SCOPE_LINK)
1064		return confirm_addr_indev(in_dev, dst, local, scope);
1065
1066	net = dev_net(in_dev->dev);
1067	rcu_read_lock();
1068	for_each_netdev_rcu(net, dev) {
1069		in_dev = __in_dev_get_rcu(dev);
1070		if (in_dev) {
1071			addr = confirm_addr_indev(in_dev, dst, local, scope);
1072			if (addr)
1073				break;
1074		}
1075	}
1076	rcu_read_unlock();
1077
1078	return addr;
1079}
1080EXPORT_SYMBOL(inet_confirm_addr);
1081
1082/*
1083 *	Device notifier
1084 */
1085
1086int register_inetaddr_notifier(struct notifier_block *nb)
1087{
1088	return blocking_notifier_chain_register(&inetaddr_chain, nb);
1089}
1090EXPORT_SYMBOL(register_inetaddr_notifier);
1091
1092int unregister_inetaddr_notifier(struct notifier_block *nb)
1093{
1094	return blocking_notifier_chain_unregister(&inetaddr_chain, nb);
1095}
1096EXPORT_SYMBOL(unregister_inetaddr_notifier);
1097
 
 
 
 
 
 
 
 
 
 
 
 
 
1098/* Rename ifa_labels for a device name change. Make some effort to preserve
1099 * existing alias numbering and to create unique labels if possible.
1100*/
1101static void inetdev_changename(struct net_device *dev, struct in_device *in_dev)
1102{
1103	struct in_ifaddr *ifa;
1104	int named = 0;
1105
1106	for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
1107		char old[IFNAMSIZ], *dot;
1108
1109		memcpy(old, ifa->ifa_label, IFNAMSIZ);
1110		memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1111		if (named++ == 0)
1112			goto skip;
1113		dot = strchr(old, ':');
1114		if (dot == NULL) {
1115			sprintf(old, ":%d", named);
1116			dot = old;
1117		}
1118		if (strlen(dot) + strlen(dev->name) < IFNAMSIZ)
1119			strcat(ifa->ifa_label, dot);
1120		else
1121			strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
1122skip:
1123		rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
1124	}
1125}
1126
1127static inline bool inetdev_valid_mtu(unsigned int mtu)
1128{
1129	return mtu >= 68;
1130}
1131
1132static void inetdev_send_gratuitous_arp(struct net_device *dev,
1133					struct in_device *in_dev)
1134
1135{
1136	struct in_ifaddr *ifa;
1137
1138	for (ifa = in_dev->ifa_list; ifa;
1139	     ifa = ifa->ifa_next) {
1140		arp_send(ARPOP_REQUEST, ETH_P_ARP,
1141			 ifa->ifa_local, dev,
1142			 ifa->ifa_local, NULL,
1143			 dev->dev_addr, NULL);
1144	}
1145}
1146
1147/* Called only under RTNL semaphore */
1148
1149static int inetdev_event(struct notifier_block *this, unsigned long event,
1150			 void *ptr)
1151{
1152	struct net_device *dev = ptr;
1153	struct in_device *in_dev = __in_dev_get_rtnl(dev);
1154
1155	ASSERT_RTNL();
1156
1157	if (!in_dev) {
1158		if (event == NETDEV_REGISTER) {
1159			in_dev = inetdev_init(dev);
1160			if (!in_dev)
1161				return notifier_from_errno(-ENOMEM);
1162			if (dev->flags & IFF_LOOPBACK) {
1163				IN_DEV_CONF_SET(in_dev, NOXFRM, 1);
1164				IN_DEV_CONF_SET(in_dev, NOPOLICY, 1);
1165			}
1166		} else if (event == NETDEV_CHANGEMTU) {
1167			/* Re-enabling IP */
1168			if (inetdev_valid_mtu(dev->mtu))
1169				in_dev = inetdev_init(dev);
1170		}
1171		goto out;
1172	}
1173
1174	switch (event) {
1175	case NETDEV_REGISTER:
1176		pr_debug("%s: bug\n", __func__);
1177		RCU_INIT_POINTER(dev->ip_ptr, NULL);
1178		break;
1179	case NETDEV_UP:
1180		if (!inetdev_valid_mtu(dev->mtu))
1181			break;
1182		if (dev->flags & IFF_LOOPBACK) {
1183			struct in_ifaddr *ifa = inet_alloc_ifa();
1184
1185			if (ifa) {
1186				INIT_HLIST_NODE(&ifa->hash);
1187				ifa->ifa_local =
1188				  ifa->ifa_address = htonl(INADDR_LOOPBACK);
1189				ifa->ifa_prefixlen = 8;
1190				ifa->ifa_mask = inet_make_mask(8);
1191				in_dev_hold(in_dev);
1192				ifa->ifa_dev = in_dev;
1193				ifa->ifa_scope = RT_SCOPE_HOST;
1194				memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
 
 
 
 
1195				inet_insert_ifa(ifa);
1196			}
1197		}
1198		ip_mc_up(in_dev);
1199		/* fall through */
1200	case NETDEV_CHANGEADDR:
1201		if (!IN_DEV_ARP_NOTIFY(in_dev))
1202			break;
1203		/* fall through */
1204	case NETDEV_NOTIFY_PEERS:
1205		/* Send gratuitous ARP to notify of link change */
1206		inetdev_send_gratuitous_arp(dev, in_dev);
1207		break;
1208	case NETDEV_DOWN:
1209		ip_mc_down(in_dev);
1210		break;
1211	case NETDEV_PRE_TYPE_CHANGE:
1212		ip_mc_unmap(in_dev);
1213		break;
1214	case NETDEV_POST_TYPE_CHANGE:
1215		ip_mc_remap(in_dev);
1216		break;
1217	case NETDEV_CHANGEMTU:
1218		if (inetdev_valid_mtu(dev->mtu))
1219			break;
1220		/* disable IP when MTU is not enough */
 
1221	case NETDEV_UNREGISTER:
1222		inetdev_destroy(in_dev);
1223		break;
1224	case NETDEV_CHANGENAME:
1225		/* Do not notify about label change, this event is
1226		 * not interesting to applications using netlink.
1227		 */
1228		inetdev_changename(dev, in_dev);
1229
1230		devinet_sysctl_unregister(in_dev);
1231		devinet_sysctl_register(in_dev);
1232		break;
1233	}
1234out:
1235	return NOTIFY_DONE;
1236}
1237
1238static struct notifier_block ip_netdev_notifier = {
1239	.notifier_call = inetdev_event,
1240};
1241
1242static inline size_t inet_nlmsg_size(void)
1243{
1244	return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
1245	       + nla_total_size(4) /* IFA_ADDRESS */
1246	       + nla_total_size(4) /* IFA_LOCAL */
1247	       + nla_total_size(4) /* IFA_BROADCAST */
1248	       + nla_total_size(IFNAMSIZ); /* IFA_LABEL */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1249}
1250
1251static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
1252			    u32 pid, u32 seq, int event, unsigned int flags)
1253{
1254	struct ifaddrmsg *ifm;
1255	struct nlmsghdr  *nlh;
 
1256
1257	nlh = nlmsg_put(skb, pid, seq, event, sizeof(*ifm), flags);
1258	if (nlh == NULL)
 
1259		return -EMSGSIZE;
1260
1261	ifm = nlmsg_data(nlh);
1262	ifm->ifa_family = AF_INET;
1263	ifm->ifa_prefixlen = ifa->ifa_prefixlen;
1264	ifm->ifa_flags = ifa->ifa_flags|IFA_F_PERMANENT;
1265	ifm->ifa_scope = ifa->ifa_scope;
1266	ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
1267
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1268	if ((ifa->ifa_address &&
1269	     nla_put_be32(skb, IFA_ADDRESS, ifa->ifa_address)) ||
1270	    (ifa->ifa_local &&
1271	     nla_put_be32(skb, IFA_LOCAL, ifa->ifa_local)) ||
1272	    (ifa->ifa_broadcast &&
1273	     nla_put_be32(skb, IFA_BROADCAST, ifa->ifa_broadcast)) ||
1274	    (ifa->ifa_label[0] &&
1275	     nla_put_string(skb, IFA_LABEL, ifa->ifa_label)))
 
 
 
 
 
 
 
1276		goto nla_put_failure;
1277
1278	return nlmsg_end(skb, nlh);
 
1279
1280nla_put_failure:
1281	nlmsg_cancel(skb, nlh);
1282	return -EMSGSIZE;
1283}
1284
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1285static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1286{
 
 
 
 
 
 
 
 
1287	struct net *net = sock_net(skb->sk);
 
1288	int h, s_h;
1289	int idx, s_idx;
1290	int ip_idx, s_ip_idx;
1291	struct net_device *dev;
1292	struct in_device *in_dev;
1293	struct in_ifaddr *ifa;
1294	struct hlist_head *head;
1295	struct hlist_node *node;
1296
1297	s_h = cb->args[0];
1298	s_idx = idx = cb->args[1];
1299	s_ip_idx = ip_idx = cb->args[2];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1300
1301	for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
1302		idx = 0;
1303		head = &net->dev_index_head[h];
1304		rcu_read_lock();
1305		hlist_for_each_entry_rcu(dev, node, head, index_hlist) {
 
1306			if (idx < s_idx)
1307				goto cont;
1308			if (h > s_h || idx > s_idx)
1309				s_ip_idx = 0;
1310			in_dev = __in_dev_get_rcu(dev);
1311			if (!in_dev)
1312				goto cont;
1313
1314			for (ifa = in_dev->ifa_list, ip_idx = 0; ifa;
1315			     ifa = ifa->ifa_next, ip_idx++) {
1316				if (ip_idx < s_ip_idx)
1317					continue;
1318				if (inet_fill_ifaddr(skb, ifa,
1319					     NETLINK_CB(cb->skb).pid,
1320					     cb->nlh->nlmsg_seq,
1321					     RTM_NEWADDR, NLM_F_MULTI) <= 0) {
1322					rcu_read_unlock();
1323					goto done;
1324				}
1325			}
1326cont:
1327			idx++;
1328		}
1329		rcu_read_unlock();
1330	}
1331
1332done:
1333	cb->args[0] = h;
1334	cb->args[1] = idx;
1335	cb->args[2] = ip_idx;
 
 
1336
1337	return skb->len;
1338}
1339
1340static void rtmsg_ifa(int event, struct in_ifaddr *ifa, struct nlmsghdr *nlh,
1341		      u32 pid)
1342{
 
 
 
 
 
 
 
1343	struct sk_buff *skb;
1344	u32 seq = nlh ? nlh->nlmsg_seq : 0;
1345	int err = -ENOBUFS;
1346	struct net *net;
1347
1348	net = dev_net(ifa->ifa_dev->dev);
1349	skb = nlmsg_new(inet_nlmsg_size(), GFP_KERNEL);
1350	if (skb == NULL)
1351		goto errout;
1352
1353	err = inet_fill_ifaddr(skb, ifa, pid, seq, event, 0);
1354	if (err < 0) {
1355		/* -EMSGSIZE implies BUG in inet_nlmsg_size() */
1356		WARN_ON(err == -EMSGSIZE);
1357		kfree_skb(skb);
1358		goto errout;
1359	}
1360	rtnl_notify(skb, net, pid, RTNLGRP_IPV4_IFADDR, nlh, GFP_KERNEL);
1361	return;
1362errout:
1363	if (err < 0)
1364		rtnl_set_sk_err(net, RTNLGRP_IPV4_IFADDR, err);
1365}
1366
1367static size_t inet_get_link_af_size(const struct net_device *dev)
 
1368{
1369	struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr);
1370
1371	if (!in_dev)
1372		return 0;
1373
1374	return nla_total_size(IPV4_DEVCONF_MAX * 4); /* IFLA_INET_CONF */
1375}
1376
1377static int inet_fill_link_af(struct sk_buff *skb, const struct net_device *dev)
 
1378{
1379	struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr);
1380	struct nlattr *nla;
1381	int i;
1382
1383	if (!in_dev)
1384		return -ENODATA;
1385
1386	nla = nla_reserve(skb, IFLA_INET_CONF, IPV4_DEVCONF_MAX * 4);
1387	if (nla == NULL)
1388		return -EMSGSIZE;
1389
1390	for (i = 0; i < IPV4_DEVCONF_MAX; i++)
1391		((u32 *) nla_data(nla))[i] = in_dev->cnf.data[i];
1392
1393	return 0;
1394}
1395
1396static const struct nla_policy inet_af_policy[IFLA_INET_MAX+1] = {
1397	[IFLA_INET_CONF]	= { .type = NLA_NESTED },
1398};
1399
1400static int inet_validate_link_af(const struct net_device *dev,
1401				 const struct nlattr *nla)
 
1402{
1403	struct nlattr *a, *tb[IFLA_INET_MAX+1];
1404	int err, rem;
1405
1406	if (dev && !__in_dev_get_rtnl(dev))
1407		return -EAFNOSUPPORT;
1408
1409	err = nla_parse_nested(tb, IFLA_INET_MAX, nla, inet_af_policy);
 
1410	if (err < 0)
1411		return err;
1412
1413	if (tb[IFLA_INET_CONF]) {
1414		nla_for_each_nested(a, tb[IFLA_INET_CONF], rem) {
1415			int cfgid = nla_type(a);
1416
1417			if (nla_len(a) < 4)
1418				return -EINVAL;
1419
1420			if (cfgid <= 0 || cfgid > IPV4_DEVCONF_MAX)
1421				return -EINVAL;
1422		}
1423	}
1424
1425	return 0;
1426}
1427
1428static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla)
 
1429{
1430	struct in_device *in_dev = __in_dev_get_rtnl(dev);
1431	struct nlattr *a, *tb[IFLA_INET_MAX+1];
1432	int rem;
1433
1434	if (!in_dev)
1435		return -EAFNOSUPPORT;
1436
1437	if (nla_parse_nested(tb, IFLA_INET_MAX, nla, NULL) < 0)
1438		BUG();
1439
1440	if (tb[IFLA_INET_CONF]) {
1441		nla_for_each_nested(a, tb[IFLA_INET_CONF], rem)
1442			ipv4_devconf_set(in_dev, nla_type(a), nla_get_u32(a));
1443	}
1444
1445	return 0;
1446}
1447
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1448#ifdef CONFIG_SYSCTL
1449
1450static void devinet_copy_dflt_conf(struct net *net, int i)
1451{
1452	struct net_device *dev;
1453
1454	rcu_read_lock();
1455	for_each_netdev_rcu(net, dev) {
1456		struct in_device *in_dev;
1457
1458		in_dev = __in_dev_get_rcu(dev);
1459		if (in_dev && !test_bit(i, in_dev->cnf.state))
1460			in_dev->cnf.data[i] = net->ipv4.devconf_dflt->data[i];
1461	}
1462	rcu_read_unlock();
1463}
1464
1465/* called with RTNL locked */
1466static void inet_forward_change(struct net *net)
1467{
1468	struct net_device *dev;
1469	int on = IPV4_DEVCONF_ALL(net, FORWARDING);
1470
1471	IPV4_DEVCONF_ALL(net, ACCEPT_REDIRECTS) = !on;
1472	IPV4_DEVCONF_DFLT(net, FORWARDING) = on;
 
 
 
 
 
 
 
 
1473
1474	for_each_netdev(net, dev) {
1475		struct in_device *in_dev;
 
1476		if (on)
1477			dev_disable_lro(dev);
1478		rcu_read_lock();
1479		in_dev = __in_dev_get_rcu(dev);
1480		if (in_dev)
1481			IN_DEV_CONF_SET(in_dev, FORWARDING, on);
1482		rcu_read_unlock();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1483	}
1484}
1485
1486static int devinet_conf_proc(ctl_table *ctl, int write,
1487			     void __user *buffer,
1488			     size_t *lenp, loff_t *ppos)
1489{
1490	int old_value = *(int *)ctl->data;
1491	int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
1492	int new_value = *(int *)ctl->data;
1493
1494	if (write) {
1495		struct ipv4_devconf *cnf = ctl->extra1;
1496		struct net *net = ctl->extra2;
1497		int i = (int *)ctl->data - cnf->data;
 
1498
1499		set_bit(i, cnf->state);
1500
1501		if (cnf == net->ipv4.devconf_dflt)
1502			devinet_copy_dflt_conf(net, i);
1503		if (i == IPV4_DEVCONF_ACCEPT_LOCAL - 1)
 
1504			if ((new_value == 0) && (old_value != 0))
1505				rt_cache_flush(net, 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1506	}
1507
1508	return ret;
1509}
1510
1511static int devinet_sysctl_forward(ctl_table *ctl, int write,
1512				  void __user *buffer,
1513				  size_t *lenp, loff_t *ppos)
1514{
1515	int *valp = ctl->data;
1516	int val = *valp;
1517	loff_t pos = *ppos;
1518	int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
 
1519
1520	if (write && *valp != val) {
1521		struct net *net = ctl->extra2;
 
 
1522
 
1523		if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) {
1524			if (!rtnl_trylock()) {
1525				/* Restore the original values before restarting */
1526				*valp = val;
1527				*ppos = pos;
1528				return restart_syscall();
1529			}
1530			if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) {
1531				inet_forward_change(net);
1532			} else if (*valp) {
1533				struct ipv4_devconf *cnf = ctl->extra1;
1534				struct in_device *idev =
1535					container_of(cnf, struct in_device, cnf);
1536				dev_disable_lro(idev->dev);
 
 
 
 
 
1537			}
1538			rtnl_unlock();
1539			rt_cache_flush(net, 0);
1540		}
 
 
 
 
1541	}
1542
1543	return ret;
1544}
1545
1546static int ipv4_doint_and_flush(ctl_table *ctl, int write,
1547				void __user *buffer,
1548				size_t *lenp, loff_t *ppos)
1549{
1550	int *valp = ctl->data;
1551	int val = *valp;
1552	int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
1553	struct net *net = ctl->extra2;
1554
1555	if (write && *valp != val)
1556		rt_cache_flush(net, 0);
1557
1558	return ret;
1559}
1560
1561#define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc) \
1562	{ \
1563		.procname	= name, \
1564		.data		= ipv4_devconf.data + \
1565				  IPV4_DEVCONF_ ## attr - 1, \
1566		.maxlen		= sizeof(int), \
1567		.mode		= mval, \
1568		.proc_handler	= proc, \
1569		.extra1		= &ipv4_devconf, \
1570	}
1571
1572#define DEVINET_SYSCTL_RW_ENTRY(attr, name) \
1573	DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc)
1574
1575#define DEVINET_SYSCTL_RO_ENTRY(attr, name) \
1576	DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc)
1577
1578#define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc) \
1579	DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc)
1580
1581#define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \
1582	DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush)
1583
1584static struct devinet_sysctl_table {
1585	struct ctl_table_header *sysctl_header;
1586	struct ctl_table devinet_vars[__IPV4_DEVCONF_MAX];
1587} devinet_sysctl = {
1588	.devinet_vars = {
1589		DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding",
1590					     devinet_sysctl_forward),
1591		DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING, "mc_forwarding"),
 
1592
1593		DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS, "accept_redirects"),
1594		DEVINET_SYSCTL_RW_ENTRY(SECURE_REDIRECTS, "secure_redirects"),
1595		DEVINET_SYSCTL_RW_ENTRY(SHARED_MEDIA, "shared_media"),
1596		DEVINET_SYSCTL_RW_ENTRY(RP_FILTER, "rp_filter"),
1597		DEVINET_SYSCTL_RW_ENTRY(SEND_REDIRECTS, "send_redirects"),
1598		DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE,
1599					"accept_source_route"),
1600		DEVINET_SYSCTL_RW_ENTRY(ACCEPT_LOCAL, "accept_local"),
1601		DEVINET_SYSCTL_RW_ENTRY(SRC_VMARK, "src_valid_mark"),
1602		DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP, "proxy_arp"),
1603		DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID, "medium_id"),
1604		DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY, "bootp_relay"),
1605		DEVINET_SYSCTL_RW_ENTRY(LOG_MARTIANS, "log_martians"),
1606		DEVINET_SYSCTL_RW_ENTRY(TAG, "tag"),
1607		DEVINET_SYSCTL_RW_ENTRY(ARPFILTER, "arp_filter"),
1608		DEVINET_SYSCTL_RW_ENTRY(ARP_ANNOUNCE, "arp_announce"),
1609		DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE, "arp_ignore"),
1610		DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT, "arp_accept"),
1611		DEVINET_SYSCTL_RW_ENTRY(ARP_NOTIFY, "arp_notify"),
 
 
1612		DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP_PVLAN, "proxy_arp_pvlan"),
 
 
 
 
 
 
 
 
 
 
1613
1614		DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM, "disable_xfrm"),
1615		DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY, "disable_policy"),
1616		DEVINET_SYSCTL_FLUSHING_ENTRY(FORCE_IGMP_VERSION,
1617					      "force_igmp_version"),
1618		DEVINET_SYSCTL_FLUSHING_ENTRY(PROMOTE_SECONDARIES,
1619					      "promote_secondaries"),
 
 
 
 
1620	},
1621};
1622
1623static int __devinet_sysctl_register(struct net *net, char *dev_name,
1624					struct ipv4_devconf *p)
1625{
1626	int i;
1627	struct devinet_sysctl_table *t;
1628	char path[sizeof("net/ipv4/conf/") + IFNAMSIZ];
1629
1630	t = kmemdup(&devinet_sysctl, sizeof(*t), GFP_KERNEL);
1631	if (!t)
1632		goto out;
1633
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;
1638	}
1639
1640	snprintf(path, sizeof(path), "net/ipv4/conf/%s", dev_name);
1641
1642	t->sysctl_header = register_net_sysctl(net, path, t->devinet_vars);
1643	if (!t->sysctl_header)
1644		goto free;
1645
1646	p->sysctl = t;
 
 
 
1647	return 0;
1648
1649free:
1650	kfree(t);
1651out:
1652	return -ENOBUFS;
1653}
1654
1655static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf)
 
1656{
1657	struct devinet_sysctl_table *t = cnf->sysctl;
1658
1659	if (t == NULL)
1660		return;
 
 
 
1661
1662	cnf->sysctl = NULL;
1663	unregister_net_sysctl_table(t->sysctl_header);
1664	kfree(t);
1665}
1666
1667static void devinet_sysctl_register(struct in_device *idev)
1668{
1669	neigh_sysctl_register(idev->dev, idev->arp_parms, "ipv4", NULL);
1670	__devinet_sysctl_register(dev_net(idev->dev), idev->dev->name,
1671					&idev->cnf);
 
 
 
 
 
 
 
 
 
 
1672}
1673
1674static void devinet_sysctl_unregister(struct in_device *idev)
1675{
1676	__devinet_sysctl_unregister(&idev->cnf);
 
 
1677	neigh_sysctl_unregister(idev->arp_parms);
1678}
1679
1680static struct ctl_table ctl_forward_entry[] = {
1681	{
1682		.procname	= "ip_forward",
1683		.data		= &ipv4_devconf.data[
1684					IPV4_DEVCONF_FORWARDING - 1],
1685		.maxlen		= sizeof(int),
1686		.mode		= 0644,
1687		.proc_handler	= devinet_sysctl_forward,
1688		.extra1		= &ipv4_devconf,
1689		.extra2		= &init_net,
1690	},
1691	{ },
1692};
1693#endif
1694
1695static __net_init int devinet_init_net(struct net *net)
1696{
1697	int err;
1698	struct ipv4_devconf *all, *dflt;
1699#ifdef CONFIG_SYSCTL
1700	struct ctl_table *tbl = ctl_forward_entry;
1701	struct ctl_table_header *forw_hdr;
1702#endif
1703
1704	err = -ENOMEM;
1705	all = &ipv4_devconf;
1706	dflt = &ipv4_devconf_dflt;
1707
1708	if (!net_eq(net, &init_net)) {
1709		all = kmemdup(all, sizeof(ipv4_devconf), GFP_KERNEL);
1710		if (all == NULL)
1711			goto err_alloc_all;
1712
1713		dflt = kmemdup(dflt, sizeof(ipv4_devconf_dflt), GFP_KERNEL);
1714		if (dflt == NULL)
1715			goto err_alloc_dflt;
1716
1717#ifdef CONFIG_SYSCTL
1718		tbl = kmemdup(tbl, sizeof(ctl_forward_entry), GFP_KERNEL);
1719		if (tbl == NULL)
1720			goto err_alloc_ctl;
1721
1722		tbl[0].data = &all->data[IPV4_DEVCONF_FORWARDING - 1];
1723		tbl[0].extra1 = all;
1724		tbl[0].extra2 = net;
1725#endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1726	}
1727
1728#ifdef CONFIG_SYSCTL
1729	err = __devinet_sysctl_register(net, "all", all);
1730	if (err < 0)
1731		goto err_reg_all;
1732
1733	err = __devinet_sysctl_register(net, "default", dflt);
 
1734	if (err < 0)
1735		goto err_reg_dflt;
1736
1737	err = -ENOMEM;
1738	forw_hdr = register_net_sysctl(net, "net/ipv4", tbl);
1739	if (forw_hdr == NULL)
 
1740		goto err_reg_ctl;
1741	net->ipv4.forw_hdr = forw_hdr;
1742#endif
1743
1744	net->ipv4.devconf_all = all;
1745	net->ipv4.devconf_dflt = dflt;
1746	return 0;
1747
1748#ifdef CONFIG_SYSCTL
1749err_reg_ctl:
1750	__devinet_sysctl_unregister(dflt);
1751err_reg_dflt:
1752	__devinet_sysctl_unregister(all);
1753err_reg_all:
1754	if (tbl != ctl_forward_entry)
1755		kfree(tbl);
1756err_alloc_ctl:
1757#endif
1758	if (dflt != &ipv4_devconf_dflt)
1759		kfree(dflt);
1760err_alloc_dflt:
1761	if (all != &ipv4_devconf)
1762		kfree(all);
1763err_alloc_all:
1764	return err;
1765}
1766
1767static __net_exit void devinet_exit_net(struct net *net)
1768{
1769#ifdef CONFIG_SYSCTL
1770	struct ctl_table *tbl;
1771
1772	tbl = net->ipv4.forw_hdr->ctl_table_arg;
1773	unregister_net_sysctl_table(net->ipv4.forw_hdr);
1774	__devinet_sysctl_unregister(net->ipv4.devconf_dflt);
1775	__devinet_sysctl_unregister(net->ipv4.devconf_all);
 
 
1776	kfree(tbl);
1777#endif
1778	kfree(net->ipv4.devconf_dflt);
1779	kfree(net->ipv4.devconf_all);
1780}
1781
1782static __net_initdata struct pernet_operations devinet_ops = {
1783	.init = devinet_init_net,
1784	.exit = devinet_exit_net,
1785};
1786
1787static struct rtnl_af_ops inet_af_ops = {
1788	.family		  = AF_INET,
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,
1793};
1794
1795void __init devinet_init(void)
1796{
1797	int i;
1798
1799	for (i = 0; i < IN4_ADDR_HSIZE; i++)
1800		INIT_HLIST_HEAD(&inet_addr_lst[i]);
1801
1802	register_pernet_subsys(&devinet_ops);
1803
1804	register_gifconf(PF_INET, inet_gifconf);
1805	register_netdevice_notifier(&ip_netdev_notifier);
1806
 
 
1807	rtnl_af_register(&inet_af_ops);
1808
1809	rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL, NULL);
1810	rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL, NULL);
1811	rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr, NULL);
 
 
1812}
1813
v6.8
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *	NET3	IP device support routines.
   4 *
 
 
 
 
 
   5 *	Derived from the IP parts of dev.c 1.0.19
   6 * 		Authors:	Ross Biro
   7 *				Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
   8 *				Mark Evans, <evansmp@uhura.aston.ac.uk>
   9 *
  10 *	Additional Authors:
  11 *		Alan Cox, <gw4pts@gw4pts.ampr.org>
  12 *		Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
  13 *
  14 *	Changes:
  15 *		Alexey Kuznetsov:	pa_* fields are replaced with ifaddr
  16 *					lists.
  17 *		Cyrus Durgin:		updated for kmod
  18 *		Matthias Andree:	in devinet_ioctl, compare label and
  19 *					address (4.4BSD alias style support),
  20 *					fall back to comparing just the label
  21 *					if no match found.
  22 */
  23
  24
  25#include <linux/uaccess.h>
  26#include <linux/bitops.h>
  27#include <linux/capability.h>
  28#include <linux/module.h>
  29#include <linux/types.h>
  30#include <linux/kernel.h>
  31#include <linux/sched/signal.h>
  32#include <linux/string.h>
  33#include <linux/mm.h>
  34#include <linux/socket.h>
  35#include <linux/sockios.h>
  36#include <linux/in.h>
  37#include <linux/errno.h>
  38#include <linux/interrupt.h>
  39#include <linux/if_addr.h>
  40#include <linux/if_ether.h>
  41#include <linux/inet.h>
  42#include <linux/netdevice.h>
  43#include <linux/etherdevice.h>
  44#include <linux/skbuff.h>
  45#include <linux/init.h>
  46#include <linux/notifier.h>
  47#include <linux/inetdevice.h>
  48#include <linux/igmp.h>
  49#include <linux/slab.h>
  50#include <linux/hash.h>
  51#ifdef CONFIG_SYSCTL
  52#include <linux/sysctl.h>
  53#endif
  54#include <linux/kmod.h>
  55#include <linux/netconf.h>
  56
  57#include <net/arp.h>
  58#include <net/ip.h>
  59#include <net/route.h>
  60#include <net/ip_fib.h>
  61#include <net/rtnetlink.h>
  62#include <net/net_namespace.h>
  63#include <net/addrconf.h>
  64
  65#define IPV6ONLY_FLAGS	\
  66		(IFA_F_NODAD | IFA_F_OPTIMISTIC | IFA_F_DADFAILED | \
  67		 IFA_F_HOMEADDRESS | IFA_F_TENTATIVE | \
  68		 IFA_F_MANAGETEMPADDR | IFA_F_STABLE_PRIVACY)
  69
  70static struct ipv4_devconf ipv4_devconf = {
  71	.data = {
  72		[IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1,
  73		[IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1,
  74		[IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1,
  75		[IPV4_DEVCONF_SHARED_MEDIA - 1] = 1,
  76		[IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL - 1] = 10000 /*ms*/,
  77		[IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL - 1] =  1000 /*ms*/,
  78		[IPV4_DEVCONF_ARP_EVICT_NOCARRIER - 1] = 1,
  79	},
  80};
  81
  82static struct ipv4_devconf ipv4_devconf_dflt = {
  83	.data = {
  84		[IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1,
  85		[IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1,
  86		[IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1,
  87		[IPV4_DEVCONF_SHARED_MEDIA - 1] = 1,
  88		[IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE - 1] = 1,
  89		[IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL - 1] = 10000 /*ms*/,
  90		[IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL - 1] =  1000 /*ms*/,
  91		[IPV4_DEVCONF_ARP_EVICT_NOCARRIER - 1] = 1,
  92	},
  93};
  94
  95#define IPV4_DEVCONF_DFLT(net, attr) \
  96	IPV4_DEVCONF((*net->ipv4.devconf_dflt), attr)
  97
  98static const struct nla_policy ifa_ipv4_policy[IFA_MAX+1] = {
  99	[IFA_LOCAL]     	= { .type = NLA_U32 },
 100	[IFA_ADDRESS]   	= { .type = NLA_U32 },
 101	[IFA_BROADCAST] 	= { .type = NLA_U32 },
 102	[IFA_LABEL]     	= { .type = NLA_STRING, .len = IFNAMSIZ - 1 },
 103	[IFA_CACHEINFO]		= { .len = sizeof(struct ifa_cacheinfo) },
 104	[IFA_FLAGS]		= { .type = NLA_U32 },
 105	[IFA_RT_PRIORITY]	= { .type = NLA_U32 },
 106	[IFA_TARGET_NETNSID]	= { .type = NLA_S32 },
 107	[IFA_PROTO]		= { .type = NLA_U8 },
 108};
 109
 110struct inet_fill_args {
 111	u32 portid;
 112	u32 seq;
 113	int event;
 114	unsigned int flags;
 115	int netnsid;
 116	int ifindex;
 117};
 118
 119#define IN4_ADDR_HSIZE_SHIFT	8
 120#define IN4_ADDR_HSIZE		(1U << IN4_ADDR_HSIZE_SHIFT)
 121
 122static struct hlist_head inet_addr_lst[IN4_ADDR_HSIZE];
 
 123
 124static u32 inet_addr_hash(const struct net *net, __be32 addr)
 125{
 126	u32 val = (__force u32) addr ^ net_hash_mix(net);
 127
 128	return hash_32(val, IN4_ADDR_HSIZE_SHIFT);
 
 129}
 130
 131static void inet_hash_insert(struct net *net, struct in_ifaddr *ifa)
 132{
 133	u32 hash = inet_addr_hash(net, ifa->ifa_local);
 134
 135	ASSERT_RTNL();
 136	hlist_add_head_rcu(&ifa->hash, &inet_addr_lst[hash]);
 
 137}
 138
 139static void inet_hash_remove(struct in_ifaddr *ifa)
 140{
 141	ASSERT_RTNL();
 142	hlist_del_init_rcu(&ifa->hash);
 
 143}
 144
 145/**
 146 * __ip_dev_find - find the first device with a given source address.
 147 * @net: the net namespace
 148 * @addr: the source address
 149 * @devref: if true, take a reference on the found device
 150 *
 151 * If a caller uses devref=false, it should be protected by RCU, or RTNL
 152 */
 153struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref)
 154{
 
 155	struct net_device *result = NULL;
 156	struct in_ifaddr *ifa;
 
 157
 158	rcu_read_lock();
 159	ifa = inet_lookup_ifaddr_rcu(net, addr);
 160	if (!ifa) {
 
 
 
 
 
 
 
 
 
 161		struct flowi4 fl4 = { .daddr = addr };
 162		struct fib_result res = { 0 };
 163		struct fib_table *local;
 164
 165		/* Fallback to FIB local table so that communication
 166		 * over loopback subnets work.
 167		 */
 168		local = fib_get_table(net, RT_TABLE_LOCAL);
 169		if (local &&
 170		    !fib_table_lookup(local, &fl4, &res, FIB_LOOKUP_NOREF) &&
 171		    res.type == RTN_LOCAL)
 172			result = FIB_RES_DEV(res);
 173	} else {
 174		result = ifa->ifa_dev->dev;
 175	}
 176	if (result && devref)
 177		dev_hold(result);
 178	rcu_read_unlock();
 179	return result;
 180}
 181EXPORT_SYMBOL(__ip_dev_find);
 182
 183/* called under RCU lock */
 184struct in_ifaddr *inet_lookup_ifaddr_rcu(struct net *net, __be32 addr)
 185{
 186	u32 hash = inet_addr_hash(net, addr);
 187	struct in_ifaddr *ifa;
 188
 189	hlist_for_each_entry_rcu(ifa, &inet_addr_lst[hash], hash)
 190		if (ifa->ifa_local == addr &&
 191		    net_eq(dev_net(ifa->ifa_dev->dev), net))
 192			return ifa;
 193
 194	return NULL;
 195}
 196
 197static void rtmsg_ifa(int event, struct in_ifaddr *, struct nlmsghdr *, u32);
 198
 199static BLOCKING_NOTIFIER_HEAD(inetaddr_chain);
 200static BLOCKING_NOTIFIER_HEAD(inetaddr_validator_chain);
 201static void inet_del_ifa(struct in_device *in_dev,
 202			 struct in_ifaddr __rcu **ifap,
 203			 int destroy);
 204#ifdef CONFIG_SYSCTL
 205static int devinet_sysctl_register(struct in_device *idev);
 206static void devinet_sysctl_unregister(struct in_device *idev);
 207#else
 208static int devinet_sysctl_register(struct in_device *idev)
 209{
 210	return 0;
 211}
 212static void devinet_sysctl_unregister(struct in_device *idev)
 213{
 214}
 215#endif
 216
 217/* Locks all the inet devices. */
 218
 219static struct in_ifaddr *inet_alloc_ifa(void)
 220{
 221	return kzalloc(sizeof(struct in_ifaddr), GFP_KERNEL_ACCOUNT);
 222}
 223
 224static void inet_rcu_free_ifa(struct rcu_head *head)
 225{
 226	struct in_ifaddr *ifa = container_of(head, struct in_ifaddr, rcu_head);
 227	if (ifa->ifa_dev)
 228		in_dev_put(ifa->ifa_dev);
 229	kfree(ifa);
 230}
 231
 232static void inet_free_ifa(struct in_ifaddr *ifa)
 233{
 234	call_rcu(&ifa->rcu_head, inet_rcu_free_ifa);
 235}
 236
 237static void in_dev_free_rcu(struct rcu_head *head)
 238{
 239	struct in_device *idev = container_of(head, struct in_device, rcu_head);
 240
 241	kfree(rcu_dereference_protected(idev->mc_hash, 1));
 242	kfree(idev);
 243}
 244
 245void in_dev_finish_destroy(struct in_device *idev)
 246{
 247	struct net_device *dev = idev->dev;
 248
 249	WARN_ON(idev->ifa_list);
 250	WARN_ON(idev->mc_list);
 251#ifdef NET_REFCNT_DEBUG
 252	pr_debug("%s: %p=%s\n", __func__, idev, dev ? dev->name : "NIL");
 253#endif
 254	netdev_put(dev, &idev->dev_tracker);
 255	if (!idev->dead)
 256		pr_err("Freeing alive in_device %p\n", idev);
 257	else
 258		call_rcu(&idev->rcu_head, in_dev_free_rcu);
 259}
 260EXPORT_SYMBOL(in_dev_finish_destroy);
 261
 262static struct in_device *inetdev_init(struct net_device *dev)
 263{
 264	struct in_device *in_dev;
 265	int err = -ENOMEM;
 266
 267	ASSERT_RTNL();
 268
 269	in_dev = kzalloc(sizeof(*in_dev), GFP_KERNEL);
 270	if (!in_dev)
 271		goto out;
 272	memcpy(&in_dev->cnf, dev_net(dev)->ipv4.devconf_dflt,
 273			sizeof(in_dev->cnf));
 274	in_dev->cnf.sysctl = NULL;
 275	in_dev->dev = dev;
 276	in_dev->arp_parms = neigh_parms_alloc(dev, &arp_tbl);
 277	if (!in_dev->arp_parms)
 278		goto out_kfree;
 279	if (IPV4_DEVCONF(in_dev->cnf, FORWARDING))
 280		dev_disable_lro(dev);
 281	/* Reference in_dev->dev */
 282	netdev_hold(dev, &in_dev->dev_tracker, GFP_KERNEL);
 283	/* Account for reference dev->ip_ptr (below) */
 284	refcount_set(&in_dev->refcnt, 1);
 285
 286	err = devinet_sysctl_register(in_dev);
 287	if (err) {
 288		in_dev->dead = 1;
 289		neigh_parms_release(&arp_tbl, in_dev->arp_parms);
 290		in_dev_put(in_dev);
 291		in_dev = NULL;
 292		goto out;
 293	}
 294	ip_mc_init_dev(in_dev);
 295	if (dev->flags & IFF_UP)
 296		ip_mc_up(in_dev);
 297
 298	/* we can receive as soon as ip_ptr is set -- do this last */
 299	rcu_assign_pointer(dev->ip_ptr, in_dev);
 300out:
 301	return in_dev ?: ERR_PTR(err);
 302out_kfree:
 303	kfree(in_dev);
 304	in_dev = NULL;
 305	goto out;
 306}
 307
 
 
 
 
 
 
 308static void inetdev_destroy(struct in_device *in_dev)
 309{
 
 310	struct net_device *dev;
 311	struct in_ifaddr *ifa;
 312
 313	ASSERT_RTNL();
 314
 315	dev = in_dev->dev;
 316
 317	in_dev->dead = 1;
 318
 319	ip_mc_destroy_dev(in_dev);
 320
 321	while ((ifa = rtnl_dereference(in_dev->ifa_list)) != NULL) {
 322		inet_del_ifa(in_dev, &in_dev->ifa_list, 0);
 323		inet_free_ifa(ifa);
 324	}
 325
 326	RCU_INIT_POINTER(dev->ip_ptr, NULL);
 327
 328	devinet_sysctl_unregister(in_dev);
 329	neigh_parms_release(&arp_tbl, in_dev->arp_parms);
 330	arp_ifdown(dev);
 331
 332	in_dev_put(in_dev);
 333}
 334
 335int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b)
 336{
 337	const struct in_ifaddr *ifa;
 338
 339	rcu_read_lock();
 340	in_dev_for_each_ifa_rcu(ifa, in_dev) {
 341		if (inet_ifa_match(a, ifa)) {
 342			if (!b || inet_ifa_match(b, ifa)) {
 343				rcu_read_unlock();
 344				return 1;
 345			}
 346		}
 347	}
 348	rcu_read_unlock();
 349	return 0;
 350}
 351
 352static void __inet_del_ifa(struct in_device *in_dev,
 353			   struct in_ifaddr __rcu **ifap,
 354			   int destroy, struct nlmsghdr *nlh, u32 portid)
 355{
 356	struct in_ifaddr *promote = NULL;
 357	struct in_ifaddr *ifa, *ifa1;
 358	struct in_ifaddr __rcu **last_prim;
 359	struct in_ifaddr *prev_prom = NULL;
 360	int do_promote = IN_DEV_PROMOTE_SECONDARIES(in_dev);
 361
 362	ASSERT_RTNL();
 363
 364	ifa1 = rtnl_dereference(*ifap);
 365	last_prim = ifap;
 366	if (in_dev->dead)
 367		goto no_promotions;
 368
 369	/* 1. Deleting primary ifaddr forces deletion all secondaries
 370	 * unless alias promotion is set
 371	 **/
 372
 373	if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
 374		struct in_ifaddr __rcu **ifap1 = &ifa1->ifa_next;
 375
 376		while ((ifa = rtnl_dereference(*ifap1)) != NULL) {
 377			if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
 378			    ifa1->ifa_scope <= ifa->ifa_scope)
 379				last_prim = &ifa->ifa_next;
 380
 381			if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
 382			    ifa1->ifa_mask != ifa->ifa_mask ||
 383			    !inet_ifa_match(ifa1->ifa_address, ifa)) {
 384				ifap1 = &ifa->ifa_next;
 385				prev_prom = ifa;
 386				continue;
 387			}
 388
 389			if (!do_promote) {
 390				inet_hash_remove(ifa);
 391				*ifap1 = ifa->ifa_next;
 392
 393				rtmsg_ifa(RTM_DELADDR, ifa, nlh, portid);
 394				blocking_notifier_call_chain(&inetaddr_chain,
 395						NETDEV_DOWN, ifa);
 396				inet_free_ifa(ifa);
 397			} else {
 398				promote = ifa;
 399				break;
 400			}
 401		}
 402	}
 403
 404	/* On promotion all secondaries from subnet are changing
 405	 * the primary IP, we must remove all their routes silently
 406	 * and later to add them back with new prefsrc. Do this
 407	 * while all addresses are on the device list.
 408	 */
 409	for (ifa = promote; ifa; ifa = rtnl_dereference(ifa->ifa_next)) {
 410		if (ifa1->ifa_mask == ifa->ifa_mask &&
 411		    inet_ifa_match(ifa1->ifa_address, ifa))
 412			fib_del_ifaddr(ifa, ifa1);
 413	}
 414
 415no_promotions:
 416	/* 2. Unlink it */
 417
 418	*ifap = ifa1->ifa_next;
 419	inet_hash_remove(ifa1);
 420
 421	/* 3. Announce address deletion */
 422
 423	/* Send message first, then call notifier.
 424	   At first sight, FIB update triggered by notifier
 425	   will refer to already deleted ifaddr, that could confuse
 426	   netlink listeners. It is not true: look, gated sees
 427	   that route deleted and if it still thinks that ifaddr
 428	   is valid, it will try to restore deleted routes... Grr.
 429	   So that, this order is correct.
 430	 */
 431	rtmsg_ifa(RTM_DELADDR, ifa1, nlh, portid);
 432	blocking_notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
 433
 434	if (promote) {
 435		struct in_ifaddr *next_sec;
 436
 437		next_sec = rtnl_dereference(promote->ifa_next);
 438		if (prev_prom) {
 439			struct in_ifaddr *last_sec;
 440
 441			rcu_assign_pointer(prev_prom->ifa_next, next_sec);
 442
 443			last_sec = rtnl_dereference(*last_prim);
 444			rcu_assign_pointer(promote->ifa_next, last_sec);
 445			rcu_assign_pointer(*last_prim, promote);
 446		}
 447
 448		promote->ifa_flags &= ~IFA_F_SECONDARY;
 449		rtmsg_ifa(RTM_NEWADDR, promote, nlh, portid);
 450		blocking_notifier_call_chain(&inetaddr_chain,
 451				NETDEV_UP, promote);
 452		for (ifa = next_sec; ifa;
 453		     ifa = rtnl_dereference(ifa->ifa_next)) {
 454			if (ifa1->ifa_mask != ifa->ifa_mask ||
 455			    !inet_ifa_match(ifa1->ifa_address, ifa))
 456					continue;
 457			fib_add_ifaddr(ifa);
 458		}
 459
 460	}
 461	if (destroy)
 462		inet_free_ifa(ifa1);
 463}
 464
 465static void inet_del_ifa(struct in_device *in_dev,
 466			 struct in_ifaddr __rcu **ifap,
 467			 int destroy)
 468{
 469	__inet_del_ifa(in_dev, ifap, destroy, NULL, 0);
 470}
 471
 472static void check_lifetime(struct work_struct *work);
 473
 474static DECLARE_DELAYED_WORK(check_lifetime_work, check_lifetime);
 475
 476static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
 477			     u32 portid, struct netlink_ext_ack *extack)
 478{
 479	struct in_ifaddr __rcu **last_primary, **ifap;
 480	struct in_device *in_dev = ifa->ifa_dev;
 481	struct in_validator_info ivi;
 482	struct in_ifaddr *ifa1;
 483	int ret;
 484
 485	ASSERT_RTNL();
 486
 487	if (!ifa->ifa_local) {
 488		inet_free_ifa(ifa);
 489		return 0;
 490	}
 491
 492	ifa->ifa_flags &= ~IFA_F_SECONDARY;
 493	last_primary = &in_dev->ifa_list;
 494
 495	/* Don't set IPv6 only flags to IPv4 addresses */
 496	ifa->ifa_flags &= ~IPV6ONLY_FLAGS;
 497
 498	ifap = &in_dev->ifa_list;
 499	ifa1 = rtnl_dereference(*ifap);
 500
 501	while (ifa1) {
 502		if (!(ifa1->ifa_flags & IFA_F_SECONDARY) &&
 503		    ifa->ifa_scope <= ifa1->ifa_scope)
 504			last_primary = &ifa1->ifa_next;
 505		if (ifa1->ifa_mask == ifa->ifa_mask &&
 506		    inet_ifa_match(ifa1->ifa_address, ifa)) {
 507			if (ifa1->ifa_local == ifa->ifa_local) {
 508				inet_free_ifa(ifa);
 509				return -EEXIST;
 510			}
 511			if (ifa1->ifa_scope != ifa->ifa_scope) {
 512				NL_SET_ERR_MSG(extack, "ipv4: Invalid scope value");
 513				inet_free_ifa(ifa);
 514				return -EINVAL;
 515			}
 516			ifa->ifa_flags |= IFA_F_SECONDARY;
 517		}
 518
 519		ifap = &ifa1->ifa_next;
 520		ifa1 = rtnl_dereference(*ifap);
 521	}
 522
 523	/* Allow any devices that wish to register ifaddr validtors to weigh
 524	 * in now, before changes are committed.  The rntl lock is serializing
 525	 * access here, so the state should not change between a validator call
 526	 * and a final notify on commit.  This isn't invoked on promotion under
 527	 * the assumption that validators are checking the address itself, and
 528	 * not the flags.
 529	 */
 530	ivi.ivi_addr = ifa->ifa_address;
 531	ivi.ivi_dev = ifa->ifa_dev;
 532	ivi.extack = extack;
 533	ret = blocking_notifier_call_chain(&inetaddr_validator_chain,
 534					   NETDEV_UP, &ivi);
 535	ret = notifier_to_errno(ret);
 536	if (ret) {
 537		inet_free_ifa(ifa);
 538		return ret;
 539	}
 540
 541	if (!(ifa->ifa_flags & IFA_F_SECONDARY))
 542		ifap = last_primary;
 543
 544	rcu_assign_pointer(ifa->ifa_next, *ifap);
 545	rcu_assign_pointer(*ifap, ifa);
 546
 547	inet_hash_insert(dev_net(in_dev->dev), ifa);
 548
 549	cancel_delayed_work(&check_lifetime_work);
 550	queue_delayed_work(system_power_efficient_wq, &check_lifetime_work, 0);
 551
 552	/* Send message first, then call notifier.
 553	   Notifier will trigger FIB update, so that
 554	   listeners of netlink will know about new ifaddr */
 555	rtmsg_ifa(RTM_NEWADDR, ifa, nlh, portid);
 556	blocking_notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
 557
 558	return 0;
 559}
 560
 561static int inet_insert_ifa(struct in_ifaddr *ifa)
 562{
 563	return __inet_insert_ifa(ifa, NULL, 0, NULL);
 564}
 565
 566static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
 567{
 568	struct in_device *in_dev = __in_dev_get_rtnl(dev);
 569
 570	ASSERT_RTNL();
 571
 572	if (!in_dev) {
 573		inet_free_ifa(ifa);
 574		return -ENOBUFS;
 575	}
 576	ipv4_devconf_setall(in_dev);
 577	neigh_parms_data_state_setall(in_dev->arp_parms);
 578	if (ifa->ifa_dev != in_dev) {
 579		WARN_ON(ifa->ifa_dev);
 580		in_dev_hold(in_dev);
 581		ifa->ifa_dev = in_dev;
 582	}
 583	if (ipv4_is_loopback(ifa->ifa_local))
 584		ifa->ifa_scope = RT_SCOPE_HOST;
 585	return inet_insert_ifa(ifa);
 586}
 587
 588/* Caller must hold RCU or RTNL :
 589 * We dont take a reference on found in_device
 590 */
 591struct in_device *inetdev_by_index(struct net *net, int ifindex)
 592{
 593	struct net_device *dev;
 594	struct in_device *in_dev = NULL;
 595
 596	rcu_read_lock();
 597	dev = dev_get_by_index_rcu(net, ifindex);
 598	if (dev)
 599		in_dev = rcu_dereference_rtnl(dev->ip_ptr);
 600	rcu_read_unlock();
 601	return in_dev;
 602}
 603EXPORT_SYMBOL(inetdev_by_index);
 604
 605/* Called only from RTNL semaphored context. No locks. */
 606
 607struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
 608				    __be32 mask)
 609{
 610	struct in_ifaddr *ifa;
 611
 612	ASSERT_RTNL();
 613
 614	in_dev_for_each_ifa_rtnl(ifa, in_dev) {
 615		if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
 616			return ifa;
 617	}
 618	return NULL;
 619}
 620
 621static int ip_mc_autojoin_config(struct net *net, bool join,
 622				 const struct in_ifaddr *ifa)
 623{
 624#if defined(CONFIG_IP_MULTICAST)
 625	struct ip_mreqn mreq = {
 626		.imr_multiaddr.s_addr = ifa->ifa_address,
 627		.imr_ifindex = ifa->ifa_dev->dev->ifindex,
 628	};
 629	struct sock *sk = net->ipv4.mc_autojoin_sk;
 630	int ret;
 631
 632	ASSERT_RTNL();
 633
 634	lock_sock(sk);
 635	if (join)
 636		ret = ip_mc_join_group(sk, &mreq);
 637	else
 638		ret = ip_mc_leave_group(sk, &mreq);
 639	release_sock(sk);
 640
 641	return ret;
 642#else
 643	return -EOPNOTSUPP;
 644#endif
 645}
 646
 647static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh,
 648			    struct netlink_ext_ack *extack)
 649{
 650	struct net *net = sock_net(skb->sk);
 651	struct in_ifaddr __rcu **ifap;
 652	struct nlattr *tb[IFA_MAX+1];
 653	struct in_device *in_dev;
 654	struct ifaddrmsg *ifm;
 655	struct in_ifaddr *ifa;
 656	int err;
 657
 658	ASSERT_RTNL();
 659
 660	err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
 661				     ifa_ipv4_policy, extack);
 662	if (err < 0)
 663		goto errout;
 664
 665	ifm = nlmsg_data(nlh);
 666	in_dev = inetdev_by_index(net, ifm->ifa_index);
 667	if (!in_dev) {
 668		NL_SET_ERR_MSG(extack, "ipv4: Device not found");
 669		err = -ENODEV;
 670		goto errout;
 671	}
 672
 673	for (ifap = &in_dev->ifa_list; (ifa = rtnl_dereference(*ifap)) != NULL;
 674	     ifap = &ifa->ifa_next) {
 675		if (tb[IFA_LOCAL] &&
 676		    ifa->ifa_local != nla_get_in_addr(tb[IFA_LOCAL]))
 677			continue;
 678
 679		if (tb[IFA_LABEL] && nla_strcmp(tb[IFA_LABEL], ifa->ifa_label))
 680			continue;
 681
 682		if (tb[IFA_ADDRESS] &&
 683		    (ifm->ifa_prefixlen != ifa->ifa_prefixlen ||
 684		    !inet_ifa_match(nla_get_in_addr(tb[IFA_ADDRESS]), ifa)))
 685			continue;
 686
 687		if (ipv4_is_multicast(ifa->ifa_address))
 688			ip_mc_autojoin_config(net, false, ifa);
 689		__inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).portid);
 690		return 0;
 691	}
 692
 693	NL_SET_ERR_MSG(extack, "ipv4: Address not found");
 694	err = -EADDRNOTAVAIL;
 695errout:
 696	return err;
 697}
 698
 699#define INFINITY_LIFE_TIME	0xFFFFFFFF
 700
 701static void check_lifetime(struct work_struct *work)
 702{
 703	unsigned long now, next, next_sec, next_sched;
 704	struct in_ifaddr *ifa;
 705	struct hlist_node *n;
 706	int i;
 707
 708	now = jiffies;
 709	next = round_jiffies_up(now + ADDR_CHECK_FREQUENCY);
 710
 711	for (i = 0; i < IN4_ADDR_HSIZE; i++) {
 712		bool change_needed = false;
 713
 714		rcu_read_lock();
 715		hlist_for_each_entry_rcu(ifa, &inet_addr_lst[i], hash) {
 716			unsigned long age;
 717
 718			if (ifa->ifa_flags & IFA_F_PERMANENT)
 719				continue;
 720
 721			/* We try to batch several events at once. */
 722			age = (now - ifa->ifa_tstamp +
 723			       ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
 724
 725			if (ifa->ifa_valid_lft != INFINITY_LIFE_TIME &&
 726			    age >= ifa->ifa_valid_lft) {
 727				change_needed = true;
 728			} else if (ifa->ifa_preferred_lft ==
 729				   INFINITY_LIFE_TIME) {
 730				continue;
 731			} else if (age >= ifa->ifa_preferred_lft) {
 732				if (time_before(ifa->ifa_tstamp +
 733						ifa->ifa_valid_lft * HZ, next))
 734					next = ifa->ifa_tstamp +
 735					       ifa->ifa_valid_lft * HZ;
 736
 737				if (!(ifa->ifa_flags & IFA_F_DEPRECATED))
 738					change_needed = true;
 739			} else if (time_before(ifa->ifa_tstamp +
 740					       ifa->ifa_preferred_lft * HZ,
 741					       next)) {
 742				next = ifa->ifa_tstamp +
 743				       ifa->ifa_preferred_lft * HZ;
 744			}
 745		}
 746		rcu_read_unlock();
 747		if (!change_needed)
 748			continue;
 749		rtnl_lock();
 750		hlist_for_each_entry_safe(ifa, n, &inet_addr_lst[i], hash) {
 751			unsigned long age;
 752
 753			if (ifa->ifa_flags & IFA_F_PERMANENT)
 754				continue;
 755
 756			/* We try to batch several events at once. */
 757			age = (now - ifa->ifa_tstamp +
 758			       ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
 759
 760			if (ifa->ifa_valid_lft != INFINITY_LIFE_TIME &&
 761			    age >= ifa->ifa_valid_lft) {
 762				struct in_ifaddr __rcu **ifap;
 763				struct in_ifaddr *tmp;
 764
 765				ifap = &ifa->ifa_dev->ifa_list;
 766				tmp = rtnl_dereference(*ifap);
 767				while (tmp) {
 768					if (tmp == ifa) {
 769						inet_del_ifa(ifa->ifa_dev,
 770							     ifap, 1);
 771						break;
 772					}
 773					ifap = &tmp->ifa_next;
 774					tmp = rtnl_dereference(*ifap);
 775				}
 776			} else if (ifa->ifa_preferred_lft !=
 777				   INFINITY_LIFE_TIME &&
 778				   age >= ifa->ifa_preferred_lft &&
 779				   !(ifa->ifa_flags & IFA_F_DEPRECATED)) {
 780				ifa->ifa_flags |= IFA_F_DEPRECATED;
 781				rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
 782			}
 783		}
 784		rtnl_unlock();
 785	}
 786
 787	next_sec = round_jiffies_up(next);
 788	next_sched = next;
 789
 790	/* If rounded timeout is accurate enough, accept it. */
 791	if (time_before(next_sec, next + ADDRCONF_TIMER_FUZZ))
 792		next_sched = next_sec;
 793
 794	now = jiffies;
 795	/* And minimum interval is ADDRCONF_TIMER_FUZZ_MAX. */
 796	if (time_before(next_sched, now + ADDRCONF_TIMER_FUZZ_MAX))
 797		next_sched = now + ADDRCONF_TIMER_FUZZ_MAX;
 798
 799	queue_delayed_work(system_power_efficient_wq, &check_lifetime_work,
 800			next_sched - now);
 801}
 802
 803static void set_ifa_lifetime(struct in_ifaddr *ifa, __u32 valid_lft,
 804			     __u32 prefered_lft)
 805{
 806	unsigned long timeout;
 807
 808	ifa->ifa_flags &= ~(IFA_F_PERMANENT | IFA_F_DEPRECATED);
 809
 810	timeout = addrconf_timeout_fixup(valid_lft, HZ);
 811	if (addrconf_finite_timeout(timeout))
 812		ifa->ifa_valid_lft = timeout;
 813	else
 814		ifa->ifa_flags |= IFA_F_PERMANENT;
 815
 816	timeout = addrconf_timeout_fixup(prefered_lft, HZ);
 817	if (addrconf_finite_timeout(timeout)) {
 818		if (timeout == 0)
 819			ifa->ifa_flags |= IFA_F_DEPRECATED;
 820		ifa->ifa_preferred_lft = timeout;
 821	}
 822	ifa->ifa_tstamp = jiffies;
 823	if (!ifa->ifa_cstamp)
 824		ifa->ifa_cstamp = ifa->ifa_tstamp;
 825}
 826
 827static struct in_ifaddr *rtm_to_ifaddr(struct net *net, struct nlmsghdr *nlh,
 828				       __u32 *pvalid_lft, __u32 *pprefered_lft,
 829				       struct netlink_ext_ack *extack)
 830{
 831	struct nlattr *tb[IFA_MAX+1];
 832	struct in_ifaddr *ifa;
 833	struct ifaddrmsg *ifm;
 834	struct net_device *dev;
 835	struct in_device *in_dev;
 836	int err;
 837
 838	err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
 839				     ifa_ipv4_policy, extack);
 840	if (err < 0)
 841		goto errout;
 842
 843	ifm = nlmsg_data(nlh);
 844	err = -EINVAL;
 845
 846	if (ifm->ifa_prefixlen > 32) {
 847		NL_SET_ERR_MSG(extack, "ipv4: Invalid prefix length");
 848		goto errout;
 849	}
 850
 851	if (!tb[IFA_LOCAL]) {
 852		NL_SET_ERR_MSG(extack, "ipv4: Local address is not supplied");
 853		goto errout;
 854	}
 855
 856	dev = __dev_get_by_index(net, ifm->ifa_index);
 857	err = -ENODEV;
 858	if (!dev) {
 859		NL_SET_ERR_MSG(extack, "ipv4: Device not found");
 860		goto errout;
 861	}
 862
 863	in_dev = __in_dev_get_rtnl(dev);
 864	err = -ENOBUFS;
 865	if (!in_dev)
 866		goto errout;
 867
 868	ifa = inet_alloc_ifa();
 869	if (!ifa)
 870		/*
 871		 * A potential indev allocation can be left alive, it stays
 872		 * assigned to its device and is destroy with it.
 873		 */
 874		goto errout;
 875
 876	ipv4_devconf_setall(in_dev);
 877	neigh_parms_data_state_setall(in_dev->arp_parms);
 878	in_dev_hold(in_dev);
 879
 880	if (!tb[IFA_ADDRESS])
 881		tb[IFA_ADDRESS] = tb[IFA_LOCAL];
 882
 883	INIT_HLIST_NODE(&ifa->hash);
 884	ifa->ifa_prefixlen = ifm->ifa_prefixlen;
 885	ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
 886	ifa->ifa_flags = tb[IFA_FLAGS] ? nla_get_u32(tb[IFA_FLAGS]) :
 887					 ifm->ifa_flags;
 888	ifa->ifa_scope = ifm->ifa_scope;
 889	ifa->ifa_dev = in_dev;
 890
 891	ifa->ifa_local = nla_get_in_addr(tb[IFA_LOCAL]);
 892	ifa->ifa_address = nla_get_in_addr(tb[IFA_ADDRESS]);
 893
 894	if (tb[IFA_BROADCAST])
 895		ifa->ifa_broadcast = nla_get_in_addr(tb[IFA_BROADCAST]);
 896
 897	if (tb[IFA_LABEL])
 898		nla_strscpy(ifa->ifa_label, tb[IFA_LABEL], IFNAMSIZ);
 899	else
 900		memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
 901
 902	if (tb[IFA_RT_PRIORITY])
 903		ifa->ifa_rt_priority = nla_get_u32(tb[IFA_RT_PRIORITY]);
 904
 905	if (tb[IFA_PROTO])
 906		ifa->ifa_proto = nla_get_u8(tb[IFA_PROTO]);
 907
 908	if (tb[IFA_CACHEINFO]) {
 909		struct ifa_cacheinfo *ci;
 910
 911		ci = nla_data(tb[IFA_CACHEINFO]);
 912		if (!ci->ifa_valid || ci->ifa_prefered > ci->ifa_valid) {
 913			NL_SET_ERR_MSG(extack, "ipv4: address lifetime invalid");
 914			err = -EINVAL;
 915			goto errout_free;
 916		}
 917		*pvalid_lft = ci->ifa_valid;
 918		*pprefered_lft = ci->ifa_prefered;
 919	}
 920
 921	return ifa;
 922
 923errout_free:
 924	inet_free_ifa(ifa);
 925errout:
 926	return ERR_PTR(err);
 927}
 928
 929static struct in_ifaddr *find_matching_ifa(struct in_ifaddr *ifa)
 930{
 931	struct in_device *in_dev = ifa->ifa_dev;
 932	struct in_ifaddr *ifa1;
 933
 934	if (!ifa->ifa_local)
 935		return NULL;
 936
 937	in_dev_for_each_ifa_rtnl(ifa1, in_dev) {
 938		if (ifa1->ifa_mask == ifa->ifa_mask &&
 939		    inet_ifa_match(ifa1->ifa_address, ifa) &&
 940		    ifa1->ifa_local == ifa->ifa_local)
 941			return ifa1;
 942	}
 943	return NULL;
 944}
 945
 946static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
 947			    struct netlink_ext_ack *extack)
 948{
 949	struct net *net = sock_net(skb->sk);
 950	struct in_ifaddr *ifa;
 951	struct in_ifaddr *ifa_existing;
 952	__u32 valid_lft = INFINITY_LIFE_TIME;
 953	__u32 prefered_lft = INFINITY_LIFE_TIME;
 954
 955	ASSERT_RTNL();
 956
 957	ifa = rtm_to_ifaddr(net, nlh, &valid_lft, &prefered_lft, extack);
 958	if (IS_ERR(ifa))
 959		return PTR_ERR(ifa);
 960
 961	ifa_existing = find_matching_ifa(ifa);
 962	if (!ifa_existing) {
 963		/* It would be best to check for !NLM_F_CREATE here but
 964		 * userspace already relies on not having to provide this.
 965		 */
 966		set_ifa_lifetime(ifa, valid_lft, prefered_lft);
 967		if (ifa->ifa_flags & IFA_F_MCAUTOJOIN) {
 968			int ret = ip_mc_autojoin_config(net, true, ifa);
 969
 970			if (ret < 0) {
 971				NL_SET_ERR_MSG(extack, "ipv4: Multicast auto join failed");
 972				inet_free_ifa(ifa);
 973				return ret;
 974			}
 975		}
 976		return __inet_insert_ifa(ifa, nlh, NETLINK_CB(skb).portid,
 977					 extack);
 978	} else {
 979		u32 new_metric = ifa->ifa_rt_priority;
 980		u8 new_proto = ifa->ifa_proto;
 981
 982		inet_free_ifa(ifa);
 983
 984		if (nlh->nlmsg_flags & NLM_F_EXCL ||
 985		    !(nlh->nlmsg_flags & NLM_F_REPLACE)) {
 986			NL_SET_ERR_MSG(extack, "ipv4: Address already assigned");
 987			return -EEXIST;
 988		}
 989		ifa = ifa_existing;
 990
 991		if (ifa->ifa_rt_priority != new_metric) {
 992			fib_modify_prefix_metric(ifa, new_metric);
 993			ifa->ifa_rt_priority = new_metric;
 994		}
 995
 996		ifa->ifa_proto = new_proto;
 997
 998		set_ifa_lifetime(ifa, valid_lft, prefered_lft);
 999		cancel_delayed_work(&check_lifetime_work);
1000		queue_delayed_work(system_power_efficient_wq,
1001				&check_lifetime_work, 0);
1002		rtmsg_ifa(RTM_NEWADDR, ifa, nlh, NETLINK_CB(skb).portid);
1003	}
1004	return 0;
1005}
1006
1007/*
1008 *	Determine a default network mask, based on the IP address.
1009 */
1010
1011static int inet_abc_len(__be32 addr)
1012{
1013	int rc = -1;	/* Something else, probably a multicast. */
1014
1015	if (ipv4_is_zeronet(addr) || ipv4_is_lbcast(addr))
1016		rc = 0;
1017	else {
1018		__u32 haddr = ntohl(addr);
 
1019		if (IN_CLASSA(haddr))
1020			rc = 8;
1021		else if (IN_CLASSB(haddr))
1022			rc = 16;
1023		else if (IN_CLASSC(haddr))
1024			rc = 24;
1025		else if (IN_CLASSE(haddr))
1026			rc = 32;
1027	}
1028
1029	return rc;
1030}
1031
1032
1033int devinet_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr)
1034{
 
1035	struct sockaddr_in sin_orig;
1036	struct sockaddr_in *sin = (struct sockaddr_in *)&ifr->ifr_addr;
1037	struct in_ifaddr __rcu **ifap = NULL;
1038	struct in_device *in_dev;
 
1039	struct in_ifaddr *ifa = NULL;
1040	struct net_device *dev;
1041	char *colon;
1042	int ret = -EFAULT;
1043	int tryaddrmatch = 0;
1044
1045	ifr->ifr_name[IFNAMSIZ - 1] = 0;
 
 
 
 
 
 
1046
1047	/* save original address for comparison */
1048	memcpy(&sin_orig, sin, sizeof(*sin));
1049
1050	colon = strchr(ifr->ifr_name, ':');
1051	if (colon)
1052		*colon = 0;
1053
1054	dev_load(net, ifr->ifr_name);
1055
1056	switch (cmd) {
1057	case SIOCGIFADDR:	/* Get interface address */
1058	case SIOCGIFBRDADDR:	/* Get the broadcast address */
1059	case SIOCGIFDSTADDR:	/* Get the destination address */
1060	case SIOCGIFNETMASK:	/* Get the netmask for the interface */
1061		/* Note that these ioctls will not sleep,
1062		   so that we do not impose a lock.
1063		   One day we will be forced to put shlock here (I mean SMP)
1064		 */
1065		tryaddrmatch = (sin_orig.sin_family == AF_INET);
1066		memset(sin, 0, sizeof(*sin));
1067		sin->sin_family = AF_INET;
1068		break;
1069
1070	case SIOCSIFFLAGS:
1071		ret = -EPERM;
1072		if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
1073			goto out;
1074		break;
1075	case SIOCSIFADDR:	/* Set interface address (and family) */
1076	case SIOCSIFBRDADDR:	/* Set the broadcast address */
1077	case SIOCSIFDSTADDR:	/* Set the destination address */
1078	case SIOCSIFNETMASK: 	/* Set the netmask for the interface */
1079		ret = -EPERM;
1080		if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
1081			goto out;
1082		ret = -EINVAL;
1083		if (sin->sin_family != AF_INET)
1084			goto out;
1085		break;
1086	default:
1087		ret = -EINVAL;
1088		goto out;
1089	}
1090
1091	rtnl_lock();
1092
1093	ret = -ENODEV;
1094	dev = __dev_get_by_name(net, ifr->ifr_name);
1095	if (!dev)
1096		goto done;
1097
1098	if (colon)
1099		*colon = ':';
1100
1101	in_dev = __in_dev_get_rtnl(dev);
1102	if (in_dev) {
1103		if (tryaddrmatch) {
1104			/* Matthias Andree */
1105			/* compare label and address (4.4BSD style) */
1106			/* note: we only do this for a limited set of ioctls
1107			   and only if the original address family was AF_INET.
1108			   This is checked above. */
1109
1110			for (ifap = &in_dev->ifa_list;
1111			     (ifa = rtnl_dereference(*ifap)) != NULL;
1112			     ifap = &ifa->ifa_next) {
1113				if (!strcmp(ifr->ifr_name, ifa->ifa_label) &&
1114				    sin_orig.sin_addr.s_addr ==
1115							ifa->ifa_local) {
1116					break; /* found */
1117				}
1118			}
1119		}
1120		/* we didn't get a match, maybe the application is
1121		   4.3BSD-style and passed in junk so we fall back to
1122		   comparing just the label */
1123		if (!ifa) {
1124			for (ifap = &in_dev->ifa_list;
1125			     (ifa = rtnl_dereference(*ifap)) != NULL;
1126			     ifap = &ifa->ifa_next)
1127				if (!strcmp(ifr->ifr_name, ifa->ifa_label))
1128					break;
1129		}
1130	}
1131
1132	ret = -EADDRNOTAVAIL;
1133	if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
1134		goto done;
1135
1136	switch (cmd) {
1137	case SIOCGIFADDR:	/* Get interface address */
1138		ret = 0;
1139		sin->sin_addr.s_addr = ifa->ifa_local;
1140		break;
1141
1142	case SIOCGIFBRDADDR:	/* Get the broadcast address */
1143		ret = 0;
1144		sin->sin_addr.s_addr = ifa->ifa_broadcast;
1145		break;
1146
1147	case SIOCGIFDSTADDR:	/* Get the destination address */
1148		ret = 0;
1149		sin->sin_addr.s_addr = ifa->ifa_address;
1150		break;
1151
1152	case SIOCGIFNETMASK:	/* Get the netmask for the interface */
1153		ret = 0;
1154		sin->sin_addr.s_addr = ifa->ifa_mask;
1155		break;
1156
1157	case SIOCSIFFLAGS:
1158		if (colon) {
1159			ret = -EADDRNOTAVAIL;
1160			if (!ifa)
1161				break;
1162			ret = 0;
1163			if (!(ifr->ifr_flags & IFF_UP))
1164				inet_del_ifa(in_dev, ifap, 1);
1165			break;
1166		}
1167		ret = dev_change_flags(dev, ifr->ifr_flags, NULL);
1168		break;
1169
1170	case SIOCSIFADDR:	/* Set interface address (and family) */
1171		ret = -EINVAL;
1172		if (inet_abc_len(sin->sin_addr.s_addr) < 0)
1173			break;
1174
1175		if (!ifa) {
1176			ret = -ENOBUFS;
1177			ifa = inet_alloc_ifa();
 
1178			if (!ifa)
1179				break;
1180			INIT_HLIST_NODE(&ifa->hash);
1181			if (colon)
1182				memcpy(ifa->ifa_label, ifr->ifr_name, IFNAMSIZ);
1183			else
1184				memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1185		} else {
1186			ret = 0;
1187			if (ifa->ifa_local == sin->sin_addr.s_addr)
1188				break;
1189			inet_del_ifa(in_dev, ifap, 0);
1190			ifa->ifa_broadcast = 0;
1191			ifa->ifa_scope = 0;
1192		}
1193
1194		ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;
1195
1196		if (!(dev->flags & IFF_POINTOPOINT)) {
1197			ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
1198			ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
1199			if ((dev->flags & IFF_BROADCAST) &&
1200			    ifa->ifa_prefixlen < 31)
1201				ifa->ifa_broadcast = ifa->ifa_address |
1202						     ~ifa->ifa_mask;
1203		} else {
1204			ifa->ifa_prefixlen = 32;
1205			ifa->ifa_mask = inet_make_mask(32);
1206		}
1207		set_ifa_lifetime(ifa, INFINITY_LIFE_TIME, INFINITY_LIFE_TIME);
1208		ret = inet_set_ifa(dev, ifa);
1209		break;
1210
1211	case SIOCSIFBRDADDR:	/* Set the broadcast address */
1212		ret = 0;
1213		if (ifa->ifa_broadcast != sin->sin_addr.s_addr) {
1214			inet_del_ifa(in_dev, ifap, 0);
1215			ifa->ifa_broadcast = sin->sin_addr.s_addr;
1216			inet_insert_ifa(ifa);
1217		}
1218		break;
1219
1220	case SIOCSIFDSTADDR:	/* Set the destination address */
1221		ret = 0;
1222		if (ifa->ifa_address == sin->sin_addr.s_addr)
1223			break;
1224		ret = -EINVAL;
1225		if (inet_abc_len(sin->sin_addr.s_addr) < 0)
1226			break;
1227		ret = 0;
1228		inet_del_ifa(in_dev, ifap, 0);
1229		ifa->ifa_address = sin->sin_addr.s_addr;
1230		inet_insert_ifa(ifa);
1231		break;
1232
1233	case SIOCSIFNETMASK: 	/* Set the netmask for the interface */
1234
1235		/*
1236		 *	The mask we set must be legal.
1237		 */
1238		ret = -EINVAL;
1239		if (bad_mask(sin->sin_addr.s_addr, 0))
1240			break;
1241		ret = 0;
1242		if (ifa->ifa_mask != sin->sin_addr.s_addr) {
1243			__be32 old_mask = ifa->ifa_mask;
1244			inet_del_ifa(in_dev, ifap, 0);
1245			ifa->ifa_mask = sin->sin_addr.s_addr;
1246			ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
1247
1248			/* See if current broadcast address matches
1249			 * with current netmask, then recalculate
1250			 * the broadcast address. Otherwise it's a
1251			 * funny address, so don't touch it since
1252			 * the user seems to know what (s)he's doing...
1253			 */
1254			if ((dev->flags & IFF_BROADCAST) &&
1255			    (ifa->ifa_prefixlen < 31) &&
1256			    (ifa->ifa_broadcast ==
1257			     (ifa->ifa_local|~old_mask))) {
1258				ifa->ifa_broadcast = (ifa->ifa_local |
1259						      ~sin->sin_addr.s_addr);
1260			}
1261			inet_insert_ifa(ifa);
1262		}
1263		break;
1264	}
1265done:
1266	rtnl_unlock();
1267out:
1268	return ret;
 
 
 
 
1269}
1270
1271int inet_gifconf(struct net_device *dev, char __user *buf, int len, int size)
1272{
1273	struct in_device *in_dev = __in_dev_get_rtnl(dev);
1274	const struct in_ifaddr *ifa;
1275	struct ifreq ifr;
1276	int done = 0;
1277
1278	if (WARN_ON(size > sizeof(struct ifreq)))
1279		goto out;
1280
1281	if (!in_dev)
1282		goto out;
1283
1284	in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1285		if (!buf) {
1286			done += size;
1287			continue;
1288		}
1289		if (len < size)
1290			break;
1291		memset(&ifr, 0, sizeof(struct ifreq));
1292		strcpy(ifr.ifr_name, ifa->ifa_label);
 
 
 
1293
1294		(*(struct sockaddr_in *)&ifr.ifr_addr).sin_family = AF_INET;
1295		(*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr =
1296								ifa->ifa_local;
1297
1298		if (copy_to_user(buf + done, &ifr, size)) {
1299			done = -EFAULT;
1300			break;
1301		}
1302		len  -= size;
1303		done += size;
 
1304	}
1305out:
1306	return done;
1307}
1308
1309static __be32 in_dev_select_addr(const struct in_device *in_dev,
1310				 int scope)
1311{
1312	const struct in_ifaddr *ifa;
1313
1314	in_dev_for_each_ifa_rcu(ifa, in_dev) {
1315		if (ifa->ifa_flags & IFA_F_SECONDARY)
1316			continue;
1317		if (ifa->ifa_scope != RT_SCOPE_LINK &&
1318		    ifa->ifa_scope <= scope)
1319			return ifa->ifa_local;
1320	}
1321
1322	return 0;
1323}
1324
1325__be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope)
1326{
1327	const struct in_ifaddr *ifa;
1328	__be32 addr = 0;
1329	unsigned char localnet_scope = RT_SCOPE_HOST;
1330	struct in_device *in_dev;
1331	struct net *net = dev_net(dev);
1332	int master_idx;
1333
1334	rcu_read_lock();
1335	in_dev = __in_dev_get_rcu(dev);
1336	if (!in_dev)
1337		goto no_in_dev;
1338
1339	if (unlikely(IN_DEV_ROUTE_LOCALNET(in_dev)))
1340		localnet_scope = RT_SCOPE_LINK;
1341
1342	in_dev_for_each_ifa_rcu(ifa, in_dev) {
1343		if (ifa->ifa_flags & IFA_F_SECONDARY)
1344			continue;
1345		if (min(ifa->ifa_scope, localnet_scope) > scope)
1346			continue;
1347		if (!dst || inet_ifa_match(dst, ifa)) {
1348			addr = ifa->ifa_local;
1349			break;
1350		}
1351		if (!addr)
1352			addr = ifa->ifa_local;
1353	}
1354
1355	if (addr)
1356		goto out_unlock;
1357no_in_dev:
1358	master_idx = l3mdev_master_ifindex_rcu(dev);
1359
1360	/* For VRFs, the VRF device takes the place of the loopback device,
1361	 * with addresses on it being preferred.  Note in such cases the
1362	 * loopback device will be among the devices that fail the master_idx
1363	 * equality check in the loop below.
1364	 */
1365	if (master_idx &&
1366	    (dev = dev_get_by_index_rcu(net, master_idx)) &&
1367	    (in_dev = __in_dev_get_rcu(dev))) {
1368		addr = in_dev_select_addr(in_dev, scope);
1369		if (addr)
1370			goto out_unlock;
1371	}
1372
1373	/* Not loopback addresses on loopback should be preferred
1374	   in this case. It is important that lo is the first interface
1375	   in dev_base list.
1376	 */
1377	for_each_netdev_rcu(net, dev) {
1378		if (l3mdev_master_ifindex_rcu(dev) != master_idx)
1379			continue;
1380
1381		in_dev = __in_dev_get_rcu(dev);
1382		if (!in_dev)
1383			continue;
1384
1385		addr = in_dev_select_addr(in_dev, scope);
1386		if (addr)
1387			goto out_unlock;
 
 
 
 
1388	}
1389out_unlock:
1390	rcu_read_unlock();
1391	return addr;
1392}
1393EXPORT_SYMBOL(inet_select_addr);
1394
1395static __be32 confirm_addr_indev(struct in_device *in_dev, __be32 dst,
1396			      __be32 local, int scope)
1397{
1398	unsigned char localnet_scope = RT_SCOPE_HOST;
1399	const struct in_ifaddr *ifa;
1400	__be32 addr = 0;
1401	int same = 0;
1402
1403	if (unlikely(IN_DEV_ROUTE_LOCALNET(in_dev)))
1404		localnet_scope = RT_SCOPE_LINK;
1405
1406	in_dev_for_each_ifa_rcu(ifa, in_dev) {
1407		unsigned char min_scope = min(ifa->ifa_scope, localnet_scope);
1408
 
1409		if (!addr &&
1410		    (local == ifa->ifa_local || !local) &&
1411		    min_scope <= scope) {
1412			addr = ifa->ifa_local;
1413			if (same)
1414				break;
1415		}
1416		if (!same) {
1417			same = (!local || inet_ifa_match(local, ifa)) &&
1418				(!dst || inet_ifa_match(dst, ifa));
1419			if (same && addr) {
1420				if (local || !dst)
1421					break;
1422				/* Is the selected addr into dst subnet? */
1423				if (inet_ifa_match(addr, ifa))
1424					break;
1425				/* No, then can we use new local src? */
1426				if (min_scope <= scope) {
1427					addr = ifa->ifa_local;
1428					break;
1429				}
1430				/* search for large dst subnet for addr */
1431				same = 0;
1432			}
1433		}
1434	}
1435
1436	return same ? addr : 0;
1437}
1438
1439/*
1440 * Confirm that local IP address exists using wildcards:
1441 * - net: netns to check, cannot be NULL
1442 * - in_dev: only on this interface, NULL=any interface
1443 * - dst: only in the same subnet as dst, 0=any dst
1444 * - local: address, 0=autoselect the local address
1445 * - scope: maximum allowed scope value for the local address
1446 */
1447__be32 inet_confirm_addr(struct net *net, struct in_device *in_dev,
1448			 __be32 dst, __be32 local, int scope)
1449{
1450	__be32 addr = 0;
1451	struct net_device *dev;
 
1452
1453	if (in_dev)
1454		return confirm_addr_indev(in_dev, dst, local, scope);
1455
 
1456	rcu_read_lock();
1457	for_each_netdev_rcu(net, dev) {
1458		in_dev = __in_dev_get_rcu(dev);
1459		if (in_dev) {
1460			addr = confirm_addr_indev(in_dev, dst, local, scope);
1461			if (addr)
1462				break;
1463		}
1464	}
1465	rcu_read_unlock();
1466
1467	return addr;
1468}
1469EXPORT_SYMBOL(inet_confirm_addr);
1470
1471/*
1472 *	Device notifier
1473 */
1474
1475int register_inetaddr_notifier(struct notifier_block *nb)
1476{
1477	return blocking_notifier_chain_register(&inetaddr_chain, nb);
1478}
1479EXPORT_SYMBOL(register_inetaddr_notifier);
1480
1481int unregister_inetaddr_notifier(struct notifier_block *nb)
1482{
1483	return blocking_notifier_chain_unregister(&inetaddr_chain, nb);
1484}
1485EXPORT_SYMBOL(unregister_inetaddr_notifier);
1486
1487int register_inetaddr_validator_notifier(struct notifier_block *nb)
1488{
1489	return blocking_notifier_chain_register(&inetaddr_validator_chain, nb);
1490}
1491EXPORT_SYMBOL(register_inetaddr_validator_notifier);
1492
1493int unregister_inetaddr_validator_notifier(struct notifier_block *nb)
1494{
1495	return blocking_notifier_chain_unregister(&inetaddr_validator_chain,
1496	    nb);
1497}
1498EXPORT_SYMBOL(unregister_inetaddr_validator_notifier);
1499
1500/* Rename ifa_labels for a device name change. Make some effort to preserve
1501 * existing alias numbering and to create unique labels if possible.
1502*/
1503static void inetdev_changename(struct net_device *dev, struct in_device *in_dev)
1504{
1505	struct in_ifaddr *ifa;
1506	int named = 0;
1507
1508	in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1509		char old[IFNAMSIZ], *dot;
1510
1511		memcpy(old, ifa->ifa_label, IFNAMSIZ);
1512		memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1513		if (named++ == 0)
1514			goto skip;
1515		dot = strchr(old, ':');
1516		if (!dot) {
1517			sprintf(old, ":%d", named);
1518			dot = old;
1519		}
1520		if (strlen(dot) + strlen(dev->name) < IFNAMSIZ)
1521			strcat(ifa->ifa_label, dot);
1522		else
1523			strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
1524skip:
1525		rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
1526	}
1527}
1528
 
 
 
 
 
1529static void inetdev_send_gratuitous_arp(struct net_device *dev,
1530					struct in_device *in_dev)
1531
1532{
1533	const struct in_ifaddr *ifa;
1534
1535	in_dev_for_each_ifa_rtnl(ifa, in_dev) {
 
1536		arp_send(ARPOP_REQUEST, ETH_P_ARP,
1537			 ifa->ifa_local, dev,
1538			 ifa->ifa_local, NULL,
1539			 dev->dev_addr, NULL);
1540	}
1541}
1542
1543/* Called only under RTNL semaphore */
1544
1545static int inetdev_event(struct notifier_block *this, unsigned long event,
1546			 void *ptr)
1547{
1548	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1549	struct in_device *in_dev = __in_dev_get_rtnl(dev);
1550
1551	ASSERT_RTNL();
1552
1553	if (!in_dev) {
1554		if (event == NETDEV_REGISTER) {
1555			in_dev = inetdev_init(dev);
1556			if (IS_ERR(in_dev))
1557				return notifier_from_errno(PTR_ERR(in_dev));
1558			if (dev->flags & IFF_LOOPBACK) {
1559				IN_DEV_CONF_SET(in_dev, NOXFRM, 1);
1560				IN_DEV_CONF_SET(in_dev, NOPOLICY, 1);
1561			}
1562		} else if (event == NETDEV_CHANGEMTU) {
1563			/* Re-enabling IP */
1564			if (inetdev_valid_mtu(dev->mtu))
1565				in_dev = inetdev_init(dev);
1566		}
1567		goto out;
1568	}
1569
1570	switch (event) {
1571	case NETDEV_REGISTER:
1572		pr_debug("%s: bug\n", __func__);
1573		RCU_INIT_POINTER(dev->ip_ptr, NULL);
1574		break;
1575	case NETDEV_UP:
1576		if (!inetdev_valid_mtu(dev->mtu))
1577			break;
1578		if (dev->flags & IFF_LOOPBACK) {
1579			struct in_ifaddr *ifa = inet_alloc_ifa();
1580
1581			if (ifa) {
1582				INIT_HLIST_NODE(&ifa->hash);
1583				ifa->ifa_local =
1584				  ifa->ifa_address = htonl(INADDR_LOOPBACK);
1585				ifa->ifa_prefixlen = 8;
1586				ifa->ifa_mask = inet_make_mask(8);
1587				in_dev_hold(in_dev);
1588				ifa->ifa_dev = in_dev;
1589				ifa->ifa_scope = RT_SCOPE_HOST;
1590				memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1591				set_ifa_lifetime(ifa, INFINITY_LIFE_TIME,
1592						 INFINITY_LIFE_TIME);
1593				ipv4_devconf_setall(in_dev);
1594				neigh_parms_data_state_setall(in_dev->arp_parms);
1595				inet_insert_ifa(ifa);
1596			}
1597		}
1598		ip_mc_up(in_dev);
1599		fallthrough;
1600	case NETDEV_CHANGEADDR:
1601		if (!IN_DEV_ARP_NOTIFY(in_dev))
1602			break;
1603		fallthrough;
1604	case NETDEV_NOTIFY_PEERS:
1605		/* Send gratuitous ARP to notify of link change */
1606		inetdev_send_gratuitous_arp(dev, in_dev);
1607		break;
1608	case NETDEV_DOWN:
1609		ip_mc_down(in_dev);
1610		break;
1611	case NETDEV_PRE_TYPE_CHANGE:
1612		ip_mc_unmap(in_dev);
1613		break;
1614	case NETDEV_POST_TYPE_CHANGE:
1615		ip_mc_remap(in_dev);
1616		break;
1617	case NETDEV_CHANGEMTU:
1618		if (inetdev_valid_mtu(dev->mtu))
1619			break;
1620		/* disable IP when MTU is not enough */
1621		fallthrough;
1622	case NETDEV_UNREGISTER:
1623		inetdev_destroy(in_dev);
1624		break;
1625	case NETDEV_CHANGENAME:
1626		/* Do not notify about label change, this event is
1627		 * not interesting to applications using netlink.
1628		 */
1629		inetdev_changename(dev, in_dev);
1630
1631		devinet_sysctl_unregister(in_dev);
1632		devinet_sysctl_register(in_dev);
1633		break;
1634	}
1635out:
1636	return NOTIFY_DONE;
1637}
1638
1639static struct notifier_block ip_netdev_notifier = {
1640	.notifier_call = inetdev_event,
1641};
1642
1643static size_t inet_nlmsg_size(void)
1644{
1645	return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
1646	       + nla_total_size(4) /* IFA_ADDRESS */
1647	       + nla_total_size(4) /* IFA_LOCAL */
1648	       + nla_total_size(4) /* IFA_BROADCAST */
1649	       + nla_total_size(IFNAMSIZ) /* IFA_LABEL */
1650	       + nla_total_size(4)  /* IFA_FLAGS */
1651	       + nla_total_size(1)  /* IFA_PROTO */
1652	       + nla_total_size(4)  /* IFA_RT_PRIORITY */
1653	       + nla_total_size(sizeof(struct ifa_cacheinfo)); /* IFA_CACHEINFO */
1654}
1655
1656static inline u32 cstamp_delta(unsigned long cstamp)
1657{
1658	return (cstamp - INITIAL_JIFFIES) * 100UL / HZ;
1659}
1660
1661static int put_cacheinfo(struct sk_buff *skb, unsigned long cstamp,
1662			 unsigned long tstamp, u32 preferred, u32 valid)
1663{
1664	struct ifa_cacheinfo ci;
1665
1666	ci.cstamp = cstamp_delta(cstamp);
1667	ci.tstamp = cstamp_delta(tstamp);
1668	ci.ifa_prefered = preferred;
1669	ci.ifa_valid = valid;
1670
1671	return nla_put(skb, IFA_CACHEINFO, sizeof(ci), &ci);
1672}
1673
1674static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
1675			    struct inet_fill_args *args)
1676{
1677	struct ifaddrmsg *ifm;
1678	struct nlmsghdr  *nlh;
1679	u32 preferred, valid;
1680
1681	nlh = nlmsg_put(skb, args->portid, args->seq, args->event, sizeof(*ifm),
1682			args->flags);
1683	if (!nlh)
1684		return -EMSGSIZE;
1685
1686	ifm = nlmsg_data(nlh);
1687	ifm->ifa_family = AF_INET;
1688	ifm->ifa_prefixlen = ifa->ifa_prefixlen;
1689	ifm->ifa_flags = ifa->ifa_flags;
1690	ifm->ifa_scope = ifa->ifa_scope;
1691	ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
1692
1693	if (args->netnsid >= 0 &&
1694	    nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid))
1695		goto nla_put_failure;
1696
1697	if (!(ifm->ifa_flags & IFA_F_PERMANENT)) {
1698		preferred = ifa->ifa_preferred_lft;
1699		valid = ifa->ifa_valid_lft;
1700		if (preferred != INFINITY_LIFE_TIME) {
1701			long tval = (jiffies - ifa->ifa_tstamp) / HZ;
1702
1703			if (preferred > tval)
1704				preferred -= tval;
1705			else
1706				preferred = 0;
1707			if (valid != INFINITY_LIFE_TIME) {
1708				if (valid > tval)
1709					valid -= tval;
1710				else
1711					valid = 0;
1712			}
1713		}
1714	} else {
1715		preferred = INFINITY_LIFE_TIME;
1716		valid = INFINITY_LIFE_TIME;
1717	}
1718	if ((ifa->ifa_address &&
1719	     nla_put_in_addr(skb, IFA_ADDRESS, ifa->ifa_address)) ||
1720	    (ifa->ifa_local &&
1721	     nla_put_in_addr(skb, IFA_LOCAL, ifa->ifa_local)) ||
1722	    (ifa->ifa_broadcast &&
1723	     nla_put_in_addr(skb, IFA_BROADCAST, ifa->ifa_broadcast)) ||
1724	    (ifa->ifa_label[0] &&
1725	     nla_put_string(skb, IFA_LABEL, ifa->ifa_label)) ||
1726	    (ifa->ifa_proto &&
1727	     nla_put_u8(skb, IFA_PROTO, ifa->ifa_proto)) ||
1728	    nla_put_u32(skb, IFA_FLAGS, ifa->ifa_flags) ||
1729	    (ifa->ifa_rt_priority &&
1730	     nla_put_u32(skb, IFA_RT_PRIORITY, ifa->ifa_rt_priority)) ||
1731	    put_cacheinfo(skb, ifa->ifa_cstamp, ifa->ifa_tstamp,
1732			  preferred, valid))
1733		goto nla_put_failure;
1734
1735	nlmsg_end(skb, nlh);
1736	return 0;
1737
1738nla_put_failure:
1739	nlmsg_cancel(skb, nlh);
1740	return -EMSGSIZE;
1741}
1742
1743static int inet_valid_dump_ifaddr_req(const struct nlmsghdr *nlh,
1744				      struct inet_fill_args *fillargs,
1745				      struct net **tgt_net, struct sock *sk,
1746				      struct netlink_callback *cb)
1747{
1748	struct netlink_ext_ack *extack = cb->extack;
1749	struct nlattr *tb[IFA_MAX+1];
1750	struct ifaddrmsg *ifm;
1751	int err, i;
1752
1753	if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) {
1754		NL_SET_ERR_MSG(extack, "ipv4: Invalid header for address dump request");
1755		return -EINVAL;
1756	}
1757
1758	ifm = nlmsg_data(nlh);
1759	if (ifm->ifa_prefixlen || ifm->ifa_flags || ifm->ifa_scope) {
1760		NL_SET_ERR_MSG(extack, "ipv4: Invalid values in header for address dump request");
1761		return -EINVAL;
1762	}
1763
1764	fillargs->ifindex = ifm->ifa_index;
1765	if (fillargs->ifindex) {
1766		cb->answer_flags |= NLM_F_DUMP_FILTERED;
1767		fillargs->flags |= NLM_F_DUMP_FILTERED;
1768	}
1769
1770	err = nlmsg_parse_deprecated_strict(nlh, sizeof(*ifm), tb, IFA_MAX,
1771					    ifa_ipv4_policy, extack);
1772	if (err < 0)
1773		return err;
1774
1775	for (i = 0; i <= IFA_MAX; ++i) {
1776		if (!tb[i])
1777			continue;
1778
1779		if (i == IFA_TARGET_NETNSID) {
1780			struct net *net;
1781
1782			fillargs->netnsid = nla_get_s32(tb[i]);
1783
1784			net = rtnl_get_net_ns_capable(sk, fillargs->netnsid);
1785			if (IS_ERR(net)) {
1786				fillargs->netnsid = -1;
1787				NL_SET_ERR_MSG(extack, "ipv4: Invalid target network namespace id");
1788				return PTR_ERR(net);
1789			}
1790			*tgt_net = net;
1791		} else {
1792			NL_SET_ERR_MSG(extack, "ipv4: Unsupported attribute in dump request");
1793			return -EINVAL;
1794		}
1795	}
1796
1797	return 0;
1798}
1799
1800static int in_dev_dump_addr(struct in_device *in_dev, struct sk_buff *skb,
1801			    struct netlink_callback *cb, int s_ip_idx,
1802			    struct inet_fill_args *fillargs)
1803{
1804	struct in_ifaddr *ifa;
1805	int ip_idx = 0;
1806	int err;
1807
1808	in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1809		if (ip_idx < s_ip_idx) {
1810			ip_idx++;
1811			continue;
1812		}
1813		err = inet_fill_ifaddr(skb, ifa, fillargs);
1814		if (err < 0)
1815			goto done;
1816
1817		nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1818		ip_idx++;
1819	}
1820	err = 0;
1821
1822done:
1823	cb->args[2] = ip_idx;
1824
1825	return err;
1826}
1827
1828/* Combine dev_addr_genid and dev_base_seq to detect changes.
1829 */
1830static u32 inet_base_seq(const struct net *net)
1831{
1832	u32 res = atomic_read(&net->ipv4.dev_addr_genid) +
1833		  net->dev_base_seq;
1834
1835	/* Must not return 0 (see nl_dump_check_consistent()).
1836	 * Chose a value far away from 0.
1837	 */
1838	if (!res)
1839		res = 0x80000000;
1840	return res;
1841}
1842
1843static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1844{
1845	const struct nlmsghdr *nlh = cb->nlh;
1846	struct inet_fill_args fillargs = {
1847		.portid = NETLINK_CB(cb->skb).portid,
1848		.seq = nlh->nlmsg_seq,
1849		.event = RTM_NEWADDR,
1850		.flags = NLM_F_MULTI,
1851		.netnsid = -1,
1852	};
1853	struct net *net = sock_net(skb->sk);
1854	struct net *tgt_net = net;
1855	int h, s_h;
1856	int idx, s_idx;
1857	int s_ip_idx;
1858	struct net_device *dev;
1859	struct in_device *in_dev;
 
1860	struct hlist_head *head;
1861	int err = 0;
1862
1863	s_h = cb->args[0];
1864	s_idx = idx = cb->args[1];
1865	s_ip_idx = cb->args[2];
1866
1867	if (cb->strict_check) {
1868		err = inet_valid_dump_ifaddr_req(nlh, &fillargs, &tgt_net,
1869						 skb->sk, cb);
1870		if (err < 0)
1871			goto put_tgt_net;
1872
1873		err = 0;
1874		if (fillargs.ifindex) {
1875			dev = __dev_get_by_index(tgt_net, fillargs.ifindex);
1876			if (!dev) {
1877				err = -ENODEV;
1878				goto put_tgt_net;
1879			}
1880
1881			in_dev = __in_dev_get_rtnl(dev);
1882			if (in_dev) {
1883				err = in_dev_dump_addr(in_dev, skb, cb, s_ip_idx,
1884						       &fillargs);
1885			}
1886			goto put_tgt_net;
1887		}
1888	}
1889
1890	for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
1891		idx = 0;
1892		head = &tgt_net->dev_index_head[h];
1893		rcu_read_lock();
1894		cb->seq = inet_base_seq(tgt_net);
1895		hlist_for_each_entry_rcu(dev, head, index_hlist) {
1896			if (idx < s_idx)
1897				goto cont;
1898			if (h > s_h || idx > s_idx)
1899				s_ip_idx = 0;
1900			in_dev = __in_dev_get_rcu(dev);
1901			if (!in_dev)
1902				goto cont;
1903
1904			err = in_dev_dump_addr(in_dev, skb, cb, s_ip_idx,
1905					       &fillargs);
1906			if (err < 0) {
1907				rcu_read_unlock();
1908				goto done;
 
 
 
 
 
 
1909			}
1910cont:
1911			idx++;
1912		}
1913		rcu_read_unlock();
1914	}
1915
1916done:
1917	cb->args[0] = h;
1918	cb->args[1] = idx;
1919put_tgt_net:
1920	if (fillargs.netnsid >= 0)
1921		put_net(tgt_net);
1922
1923	return skb->len ? : err;
1924}
1925
1926static void rtmsg_ifa(int event, struct in_ifaddr *ifa, struct nlmsghdr *nlh,
1927		      u32 portid)
1928{
1929	struct inet_fill_args fillargs = {
1930		.portid = portid,
1931		.seq = nlh ? nlh->nlmsg_seq : 0,
1932		.event = event,
1933		.flags = 0,
1934		.netnsid = -1,
1935	};
1936	struct sk_buff *skb;
 
1937	int err = -ENOBUFS;
1938	struct net *net;
1939
1940	net = dev_net(ifa->ifa_dev->dev);
1941	skb = nlmsg_new(inet_nlmsg_size(), GFP_KERNEL);
1942	if (!skb)
1943		goto errout;
1944
1945	err = inet_fill_ifaddr(skb, ifa, &fillargs);
1946	if (err < 0) {
1947		/* -EMSGSIZE implies BUG in inet_nlmsg_size() */
1948		WARN_ON(err == -EMSGSIZE);
1949		kfree_skb(skb);
1950		goto errout;
1951	}
1952	rtnl_notify(skb, net, portid, RTNLGRP_IPV4_IFADDR, nlh, GFP_KERNEL);
1953	return;
1954errout:
1955	if (err < 0)
1956		rtnl_set_sk_err(net, RTNLGRP_IPV4_IFADDR, err);
1957}
1958
1959static size_t inet_get_link_af_size(const struct net_device *dev,
1960				    u32 ext_filter_mask)
1961{
1962	struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr);
1963
1964	if (!in_dev)
1965		return 0;
1966
1967	return nla_total_size(IPV4_DEVCONF_MAX * 4); /* IFLA_INET_CONF */
1968}
1969
1970static int inet_fill_link_af(struct sk_buff *skb, const struct net_device *dev,
1971			     u32 ext_filter_mask)
1972{
1973	struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr);
1974	struct nlattr *nla;
1975	int i;
1976
1977	if (!in_dev)
1978		return -ENODATA;
1979
1980	nla = nla_reserve(skb, IFLA_INET_CONF, IPV4_DEVCONF_MAX * 4);
1981	if (!nla)
1982		return -EMSGSIZE;
1983
1984	for (i = 0; i < IPV4_DEVCONF_MAX; i++)
1985		((u32 *) nla_data(nla))[i] = in_dev->cnf.data[i];
1986
1987	return 0;
1988}
1989
1990static const struct nla_policy inet_af_policy[IFLA_INET_MAX+1] = {
1991	[IFLA_INET_CONF]	= { .type = NLA_NESTED },
1992};
1993
1994static int inet_validate_link_af(const struct net_device *dev,
1995				 const struct nlattr *nla,
1996				 struct netlink_ext_ack *extack)
1997{
1998	struct nlattr *a, *tb[IFLA_INET_MAX+1];
1999	int err, rem;
2000
2001	if (dev && !__in_dev_get_rtnl(dev))
2002		return -EAFNOSUPPORT;
2003
2004	err = nla_parse_nested_deprecated(tb, IFLA_INET_MAX, nla,
2005					  inet_af_policy, extack);
2006	if (err < 0)
2007		return err;
2008
2009	if (tb[IFLA_INET_CONF]) {
2010		nla_for_each_nested(a, tb[IFLA_INET_CONF], rem) {
2011			int cfgid = nla_type(a);
2012
2013			if (nla_len(a) < 4)
2014				return -EINVAL;
2015
2016			if (cfgid <= 0 || cfgid > IPV4_DEVCONF_MAX)
2017				return -EINVAL;
2018		}
2019	}
2020
2021	return 0;
2022}
2023
2024static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla,
2025			    struct netlink_ext_ack *extack)
2026{
2027	struct in_device *in_dev = __in_dev_get_rtnl(dev);
2028	struct nlattr *a, *tb[IFLA_INET_MAX+1];
2029	int rem;
2030
2031	if (!in_dev)
2032		return -EAFNOSUPPORT;
2033
2034	if (nla_parse_nested_deprecated(tb, IFLA_INET_MAX, nla, NULL, NULL) < 0)
2035		return -EINVAL;
2036
2037	if (tb[IFLA_INET_CONF]) {
2038		nla_for_each_nested(a, tb[IFLA_INET_CONF], rem)
2039			ipv4_devconf_set(in_dev, nla_type(a), nla_get_u32(a));
2040	}
2041
2042	return 0;
2043}
2044
2045static int inet_netconf_msgsize_devconf(int type)
2046{
2047	int size = NLMSG_ALIGN(sizeof(struct netconfmsg))
2048		   + nla_total_size(4);	/* NETCONFA_IFINDEX */
2049	bool all = false;
2050
2051	if (type == NETCONFA_ALL)
2052		all = true;
2053
2054	if (all || type == NETCONFA_FORWARDING)
2055		size += nla_total_size(4);
2056	if (all || type == NETCONFA_RP_FILTER)
2057		size += nla_total_size(4);
2058	if (all || type == NETCONFA_MC_FORWARDING)
2059		size += nla_total_size(4);
2060	if (all || type == NETCONFA_BC_FORWARDING)
2061		size += nla_total_size(4);
2062	if (all || type == NETCONFA_PROXY_NEIGH)
2063		size += nla_total_size(4);
2064	if (all || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN)
2065		size += nla_total_size(4);
2066
2067	return size;
2068}
2069
2070static int inet_netconf_fill_devconf(struct sk_buff *skb, int ifindex,
2071				     struct ipv4_devconf *devconf, u32 portid,
2072				     u32 seq, int event, unsigned int flags,
2073				     int type)
2074{
2075	struct nlmsghdr  *nlh;
2076	struct netconfmsg *ncm;
2077	bool all = false;
2078
2079	nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct netconfmsg),
2080			flags);
2081	if (!nlh)
2082		return -EMSGSIZE;
2083
2084	if (type == NETCONFA_ALL)
2085		all = true;
2086
2087	ncm = nlmsg_data(nlh);
2088	ncm->ncm_family = AF_INET;
2089
2090	if (nla_put_s32(skb, NETCONFA_IFINDEX, ifindex) < 0)
2091		goto nla_put_failure;
2092
2093	if (!devconf)
2094		goto out;
2095
2096	if ((all || type == NETCONFA_FORWARDING) &&
2097	    nla_put_s32(skb, NETCONFA_FORWARDING,
2098			IPV4_DEVCONF(*devconf, FORWARDING)) < 0)
2099		goto nla_put_failure;
2100	if ((all || type == NETCONFA_RP_FILTER) &&
2101	    nla_put_s32(skb, NETCONFA_RP_FILTER,
2102			IPV4_DEVCONF(*devconf, RP_FILTER)) < 0)
2103		goto nla_put_failure;
2104	if ((all || type == NETCONFA_MC_FORWARDING) &&
2105	    nla_put_s32(skb, NETCONFA_MC_FORWARDING,
2106			IPV4_DEVCONF(*devconf, MC_FORWARDING)) < 0)
2107		goto nla_put_failure;
2108	if ((all || type == NETCONFA_BC_FORWARDING) &&
2109	    nla_put_s32(skb, NETCONFA_BC_FORWARDING,
2110			IPV4_DEVCONF(*devconf, BC_FORWARDING)) < 0)
2111		goto nla_put_failure;
2112	if ((all || type == NETCONFA_PROXY_NEIGH) &&
2113	    nla_put_s32(skb, NETCONFA_PROXY_NEIGH,
2114			IPV4_DEVCONF(*devconf, PROXY_ARP)) < 0)
2115		goto nla_put_failure;
2116	if ((all || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN) &&
2117	    nla_put_s32(skb, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
2118			IPV4_DEVCONF(*devconf, IGNORE_ROUTES_WITH_LINKDOWN)) < 0)
2119		goto nla_put_failure;
2120
2121out:
2122	nlmsg_end(skb, nlh);
2123	return 0;
2124
2125nla_put_failure:
2126	nlmsg_cancel(skb, nlh);
2127	return -EMSGSIZE;
2128}
2129
2130void inet_netconf_notify_devconf(struct net *net, int event, int type,
2131				 int ifindex, struct ipv4_devconf *devconf)
2132{
2133	struct sk_buff *skb;
2134	int err = -ENOBUFS;
2135
2136	skb = nlmsg_new(inet_netconf_msgsize_devconf(type), GFP_KERNEL);
2137	if (!skb)
2138		goto errout;
2139
2140	err = inet_netconf_fill_devconf(skb, ifindex, devconf, 0, 0,
2141					event, 0, type);
2142	if (err < 0) {
2143		/* -EMSGSIZE implies BUG in inet_netconf_msgsize_devconf() */
2144		WARN_ON(err == -EMSGSIZE);
2145		kfree_skb(skb);
2146		goto errout;
2147	}
2148	rtnl_notify(skb, net, 0, RTNLGRP_IPV4_NETCONF, NULL, GFP_KERNEL);
2149	return;
2150errout:
2151	if (err < 0)
2152		rtnl_set_sk_err(net, RTNLGRP_IPV4_NETCONF, err);
2153}
2154
2155static const struct nla_policy devconf_ipv4_policy[NETCONFA_MAX+1] = {
2156	[NETCONFA_IFINDEX]	= { .len = sizeof(int) },
2157	[NETCONFA_FORWARDING]	= { .len = sizeof(int) },
2158	[NETCONFA_RP_FILTER]	= { .len = sizeof(int) },
2159	[NETCONFA_PROXY_NEIGH]	= { .len = sizeof(int) },
2160	[NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN]	= { .len = sizeof(int) },
2161};
2162
2163static int inet_netconf_valid_get_req(struct sk_buff *skb,
2164				      const struct nlmsghdr *nlh,
2165				      struct nlattr **tb,
2166				      struct netlink_ext_ack *extack)
2167{
2168	int i, err;
2169
2170	if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(struct netconfmsg))) {
2171		NL_SET_ERR_MSG(extack, "ipv4: Invalid header for netconf get request");
2172		return -EINVAL;
2173	}
2174
2175	if (!netlink_strict_get_check(skb))
2176		return nlmsg_parse_deprecated(nlh, sizeof(struct netconfmsg),
2177					      tb, NETCONFA_MAX,
2178					      devconf_ipv4_policy, extack);
2179
2180	err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct netconfmsg),
2181					    tb, NETCONFA_MAX,
2182					    devconf_ipv4_policy, extack);
2183	if (err)
2184		return err;
2185
2186	for (i = 0; i <= NETCONFA_MAX; i++) {
2187		if (!tb[i])
2188			continue;
2189
2190		switch (i) {
2191		case NETCONFA_IFINDEX:
2192			break;
2193		default:
2194			NL_SET_ERR_MSG(extack, "ipv4: Unsupported attribute in netconf get request");
2195			return -EINVAL;
2196		}
2197	}
2198
2199	return 0;
2200}
2201
2202static int inet_netconf_get_devconf(struct sk_buff *in_skb,
2203				    struct nlmsghdr *nlh,
2204				    struct netlink_ext_ack *extack)
2205{
2206	struct net *net = sock_net(in_skb->sk);
2207	struct nlattr *tb[NETCONFA_MAX+1];
2208	struct sk_buff *skb;
2209	struct ipv4_devconf *devconf;
2210	struct in_device *in_dev;
2211	struct net_device *dev;
2212	int ifindex;
2213	int err;
2214
2215	err = inet_netconf_valid_get_req(in_skb, nlh, tb, extack);
2216	if (err)
2217		goto errout;
2218
2219	err = -EINVAL;
2220	if (!tb[NETCONFA_IFINDEX])
2221		goto errout;
2222
2223	ifindex = nla_get_s32(tb[NETCONFA_IFINDEX]);
2224	switch (ifindex) {
2225	case NETCONFA_IFINDEX_ALL:
2226		devconf = net->ipv4.devconf_all;
2227		break;
2228	case NETCONFA_IFINDEX_DEFAULT:
2229		devconf = net->ipv4.devconf_dflt;
2230		break;
2231	default:
2232		dev = __dev_get_by_index(net, ifindex);
2233		if (!dev)
2234			goto errout;
2235		in_dev = __in_dev_get_rtnl(dev);
2236		if (!in_dev)
2237			goto errout;
2238		devconf = &in_dev->cnf;
2239		break;
2240	}
2241
2242	err = -ENOBUFS;
2243	skb = nlmsg_new(inet_netconf_msgsize_devconf(NETCONFA_ALL), GFP_KERNEL);
2244	if (!skb)
2245		goto errout;
2246
2247	err = inet_netconf_fill_devconf(skb, ifindex, devconf,
2248					NETLINK_CB(in_skb).portid,
2249					nlh->nlmsg_seq, RTM_NEWNETCONF, 0,
2250					NETCONFA_ALL);
2251	if (err < 0) {
2252		/* -EMSGSIZE implies BUG in inet_netconf_msgsize_devconf() */
2253		WARN_ON(err == -EMSGSIZE);
2254		kfree_skb(skb);
2255		goto errout;
2256	}
2257	err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
2258errout:
2259	return err;
2260}
2261
2262static int inet_netconf_dump_devconf(struct sk_buff *skb,
2263				     struct netlink_callback *cb)
2264{
2265	const struct nlmsghdr *nlh = cb->nlh;
2266	struct net *net = sock_net(skb->sk);
2267	int h, s_h;
2268	int idx, s_idx;
2269	struct net_device *dev;
2270	struct in_device *in_dev;
2271	struct hlist_head *head;
2272
2273	if (cb->strict_check) {
2274		struct netlink_ext_ack *extack = cb->extack;
2275		struct netconfmsg *ncm;
2276
2277		if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ncm))) {
2278			NL_SET_ERR_MSG(extack, "ipv4: Invalid header for netconf dump request");
2279			return -EINVAL;
2280		}
2281
2282		if (nlmsg_attrlen(nlh, sizeof(*ncm))) {
2283			NL_SET_ERR_MSG(extack, "ipv4: Invalid data after header in netconf dump request");
2284			return -EINVAL;
2285		}
2286	}
2287
2288	s_h = cb->args[0];
2289	s_idx = idx = cb->args[1];
2290
2291	for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
2292		idx = 0;
2293		head = &net->dev_index_head[h];
2294		rcu_read_lock();
2295		cb->seq = inet_base_seq(net);
2296		hlist_for_each_entry_rcu(dev, head, index_hlist) {
2297			if (idx < s_idx)
2298				goto cont;
2299			in_dev = __in_dev_get_rcu(dev);
2300			if (!in_dev)
2301				goto cont;
2302
2303			if (inet_netconf_fill_devconf(skb, dev->ifindex,
2304						      &in_dev->cnf,
2305						      NETLINK_CB(cb->skb).portid,
2306						      nlh->nlmsg_seq,
2307						      RTM_NEWNETCONF,
2308						      NLM_F_MULTI,
2309						      NETCONFA_ALL) < 0) {
2310				rcu_read_unlock();
2311				goto done;
2312			}
2313			nl_dump_check_consistent(cb, nlmsg_hdr(skb));
2314cont:
2315			idx++;
2316		}
2317		rcu_read_unlock();
2318	}
2319	if (h == NETDEV_HASHENTRIES) {
2320		if (inet_netconf_fill_devconf(skb, NETCONFA_IFINDEX_ALL,
2321					      net->ipv4.devconf_all,
2322					      NETLINK_CB(cb->skb).portid,
2323					      nlh->nlmsg_seq,
2324					      RTM_NEWNETCONF, NLM_F_MULTI,
2325					      NETCONFA_ALL) < 0)
2326			goto done;
2327		else
2328			h++;
2329	}
2330	if (h == NETDEV_HASHENTRIES + 1) {
2331		if (inet_netconf_fill_devconf(skb, NETCONFA_IFINDEX_DEFAULT,
2332					      net->ipv4.devconf_dflt,
2333					      NETLINK_CB(cb->skb).portid,
2334					      nlh->nlmsg_seq,
2335					      RTM_NEWNETCONF, NLM_F_MULTI,
2336					      NETCONFA_ALL) < 0)
2337			goto done;
2338		else
2339			h++;
2340	}
2341done:
2342	cb->args[0] = h;
2343	cb->args[1] = idx;
2344
2345	return skb->len;
2346}
2347
2348#ifdef CONFIG_SYSCTL
2349
2350static void devinet_copy_dflt_conf(struct net *net, int i)
2351{
2352	struct net_device *dev;
2353
2354	rcu_read_lock();
2355	for_each_netdev_rcu(net, dev) {
2356		struct in_device *in_dev;
2357
2358		in_dev = __in_dev_get_rcu(dev);
2359		if (in_dev && !test_bit(i, in_dev->cnf.state))
2360			in_dev->cnf.data[i] = net->ipv4.devconf_dflt->data[i];
2361	}
2362	rcu_read_unlock();
2363}
2364
2365/* called with RTNL locked */
2366static void inet_forward_change(struct net *net)
2367{
2368	struct net_device *dev;
2369	int on = IPV4_DEVCONF_ALL(net, FORWARDING);
2370
2371	IPV4_DEVCONF_ALL(net, ACCEPT_REDIRECTS) = !on;
2372	IPV4_DEVCONF_DFLT(net, FORWARDING) = on;
2373	inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2374				    NETCONFA_FORWARDING,
2375				    NETCONFA_IFINDEX_ALL,
2376				    net->ipv4.devconf_all);
2377	inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2378				    NETCONFA_FORWARDING,
2379				    NETCONFA_IFINDEX_DEFAULT,
2380				    net->ipv4.devconf_dflt);
2381
2382	for_each_netdev(net, dev) {
2383		struct in_device *in_dev;
2384
2385		if (on)
2386			dev_disable_lro(dev);
2387
2388		in_dev = __in_dev_get_rtnl(dev);
2389		if (in_dev) {
2390			IN_DEV_CONF_SET(in_dev, FORWARDING, on);
2391			inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2392						    NETCONFA_FORWARDING,
2393						    dev->ifindex, &in_dev->cnf);
2394		}
2395	}
2396}
2397
2398static int devinet_conf_ifindex(struct net *net, struct ipv4_devconf *cnf)
2399{
2400	if (cnf == net->ipv4.devconf_dflt)
2401		return NETCONFA_IFINDEX_DEFAULT;
2402	else if (cnf == net->ipv4.devconf_all)
2403		return NETCONFA_IFINDEX_ALL;
2404	else {
2405		struct in_device *idev
2406			= container_of(cnf, struct in_device, cnf);
2407		return idev->dev->ifindex;
2408	}
2409}
2410
2411static int devinet_conf_proc(struct ctl_table *ctl, int write,
2412			     void *buffer, size_t *lenp, loff_t *ppos)
 
2413{
2414	int old_value = *(int *)ctl->data;
2415	int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
2416	int new_value = *(int *)ctl->data;
2417
2418	if (write) {
2419		struct ipv4_devconf *cnf = ctl->extra1;
2420		struct net *net = ctl->extra2;
2421		int i = (int *)ctl->data - cnf->data;
2422		int ifindex;
2423
2424		set_bit(i, cnf->state);
2425
2426		if (cnf == net->ipv4.devconf_dflt)
2427			devinet_copy_dflt_conf(net, i);
2428		if (i == IPV4_DEVCONF_ACCEPT_LOCAL - 1 ||
2429		    i == IPV4_DEVCONF_ROUTE_LOCALNET - 1)
2430			if ((new_value == 0) && (old_value != 0))
2431				rt_cache_flush(net);
2432
2433		if (i == IPV4_DEVCONF_BC_FORWARDING - 1 &&
2434		    new_value != old_value)
2435			rt_cache_flush(net);
2436
2437		if (i == IPV4_DEVCONF_RP_FILTER - 1 &&
2438		    new_value != old_value) {
2439			ifindex = devinet_conf_ifindex(net, cnf);
2440			inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2441						    NETCONFA_RP_FILTER,
2442						    ifindex, cnf);
2443		}
2444		if (i == IPV4_DEVCONF_PROXY_ARP - 1 &&
2445		    new_value != old_value) {
2446			ifindex = devinet_conf_ifindex(net, cnf);
2447			inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2448						    NETCONFA_PROXY_NEIGH,
2449						    ifindex, cnf);
2450		}
2451		if (i == IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN - 1 &&
2452		    new_value != old_value) {
2453			ifindex = devinet_conf_ifindex(net, cnf);
2454			inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2455						    NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
2456						    ifindex, cnf);
2457		}
2458	}
2459
2460	return ret;
2461}
2462
2463static int devinet_sysctl_forward(struct ctl_table *ctl, int write,
2464				  void *buffer, size_t *lenp, loff_t *ppos)
 
2465{
2466	int *valp = ctl->data;
2467	int val = *valp;
2468	loff_t pos = *ppos;
2469	struct net *net = ctl->extra2;
2470	int ret;
2471
2472	if (write && !ns_capable(net->user_ns, CAP_NET_ADMIN))
2473		return -EPERM;
2474
2475	ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
2476
2477	if (write && *valp != val) {
2478		if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) {
2479			if (!rtnl_trylock()) {
2480				/* Restore the original values before restarting */
2481				*valp = val;
2482				*ppos = pos;
2483				return restart_syscall();
2484			}
2485			if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) {
2486				inet_forward_change(net);
2487			} else {
2488				struct ipv4_devconf *cnf = ctl->extra1;
2489				struct in_device *idev =
2490					container_of(cnf, struct in_device, cnf);
2491				if (*valp)
2492					dev_disable_lro(idev->dev);
2493				inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2494							    NETCONFA_FORWARDING,
2495							    idev->dev->ifindex,
2496							    cnf);
2497			}
2498			rtnl_unlock();
2499			rt_cache_flush(net);
2500		} else
2501			inet_netconf_notify_devconf(net, RTM_NEWNETCONF,
2502						    NETCONFA_FORWARDING,
2503						    NETCONFA_IFINDEX_DEFAULT,
2504						    net->ipv4.devconf_dflt);
2505	}
2506
2507	return ret;
2508}
2509
2510static int ipv4_doint_and_flush(struct ctl_table *ctl, int write,
2511				void *buffer, size_t *lenp, loff_t *ppos)
 
2512{
2513	int *valp = ctl->data;
2514	int val = *valp;
2515	int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
2516	struct net *net = ctl->extra2;
2517
2518	if (write && *valp != val)
2519		rt_cache_flush(net);
2520
2521	return ret;
2522}
2523
2524#define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc) \
2525	{ \
2526		.procname	= name, \
2527		.data		= ipv4_devconf.data + \
2528				  IPV4_DEVCONF_ ## attr - 1, \
2529		.maxlen		= sizeof(int), \
2530		.mode		= mval, \
2531		.proc_handler	= proc, \
2532		.extra1		= &ipv4_devconf, \
2533	}
2534
2535#define DEVINET_SYSCTL_RW_ENTRY(attr, name) \
2536	DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc)
2537
2538#define DEVINET_SYSCTL_RO_ENTRY(attr, name) \
2539	DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc)
2540
2541#define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc) \
2542	DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc)
2543
2544#define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \
2545	DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush)
2546
2547static struct devinet_sysctl_table {
2548	struct ctl_table_header *sysctl_header;
2549	struct ctl_table devinet_vars[__IPV4_DEVCONF_MAX];
2550} devinet_sysctl = {
2551	.devinet_vars = {
2552		DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding",
2553					     devinet_sysctl_forward),
2554		DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING, "mc_forwarding"),
2555		DEVINET_SYSCTL_RW_ENTRY(BC_FORWARDING, "bc_forwarding"),
2556
2557		DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS, "accept_redirects"),
2558		DEVINET_SYSCTL_RW_ENTRY(SECURE_REDIRECTS, "secure_redirects"),
2559		DEVINET_SYSCTL_RW_ENTRY(SHARED_MEDIA, "shared_media"),
2560		DEVINET_SYSCTL_RW_ENTRY(RP_FILTER, "rp_filter"),
2561		DEVINET_SYSCTL_RW_ENTRY(SEND_REDIRECTS, "send_redirects"),
2562		DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE,
2563					"accept_source_route"),
2564		DEVINET_SYSCTL_RW_ENTRY(ACCEPT_LOCAL, "accept_local"),
2565		DEVINET_SYSCTL_RW_ENTRY(SRC_VMARK, "src_valid_mark"),
2566		DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP, "proxy_arp"),
2567		DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID, "medium_id"),
2568		DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY, "bootp_relay"),
2569		DEVINET_SYSCTL_RW_ENTRY(LOG_MARTIANS, "log_martians"),
2570		DEVINET_SYSCTL_RW_ENTRY(TAG, "tag"),
2571		DEVINET_SYSCTL_RW_ENTRY(ARPFILTER, "arp_filter"),
2572		DEVINET_SYSCTL_RW_ENTRY(ARP_ANNOUNCE, "arp_announce"),
2573		DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE, "arp_ignore"),
2574		DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT, "arp_accept"),
2575		DEVINET_SYSCTL_RW_ENTRY(ARP_NOTIFY, "arp_notify"),
2576		DEVINET_SYSCTL_RW_ENTRY(ARP_EVICT_NOCARRIER,
2577					"arp_evict_nocarrier"),
2578		DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP_PVLAN, "proxy_arp_pvlan"),
2579		DEVINET_SYSCTL_RW_ENTRY(FORCE_IGMP_VERSION,
2580					"force_igmp_version"),
2581		DEVINET_SYSCTL_RW_ENTRY(IGMPV2_UNSOLICITED_REPORT_INTERVAL,
2582					"igmpv2_unsolicited_report_interval"),
2583		DEVINET_SYSCTL_RW_ENTRY(IGMPV3_UNSOLICITED_REPORT_INTERVAL,
2584					"igmpv3_unsolicited_report_interval"),
2585		DEVINET_SYSCTL_RW_ENTRY(IGNORE_ROUTES_WITH_LINKDOWN,
2586					"ignore_routes_with_linkdown"),
2587		DEVINET_SYSCTL_RW_ENTRY(DROP_GRATUITOUS_ARP,
2588					"drop_gratuitous_arp"),
2589
2590		DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM, "disable_xfrm"),
2591		DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY, "disable_policy"),
 
 
2592		DEVINET_SYSCTL_FLUSHING_ENTRY(PROMOTE_SECONDARIES,
2593					      "promote_secondaries"),
2594		DEVINET_SYSCTL_FLUSHING_ENTRY(ROUTE_LOCALNET,
2595					      "route_localnet"),
2596		DEVINET_SYSCTL_FLUSHING_ENTRY(DROP_UNICAST_IN_L2_MULTICAST,
2597					      "drop_unicast_in_l2_multicast"),
2598	},
2599};
2600
2601static int __devinet_sysctl_register(struct net *net, char *dev_name,
2602				     int ifindex, struct ipv4_devconf *p)
2603{
2604	int i;
2605	struct devinet_sysctl_table *t;
2606	char path[sizeof("net/ipv4/conf/") + IFNAMSIZ];
2607
2608	t = kmemdup(&devinet_sysctl, sizeof(*t), GFP_KERNEL_ACCOUNT);
2609	if (!t)
2610		goto out;
2611
2612	for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
2613		t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
2614		t->devinet_vars[i].extra1 = p;
2615		t->devinet_vars[i].extra2 = net;
2616	}
2617
2618	snprintf(path, sizeof(path), "net/ipv4/conf/%s", dev_name);
2619
2620	t->sysctl_header = register_net_sysctl(net, path, t->devinet_vars);
2621	if (!t->sysctl_header)
2622		goto free;
2623
2624	p->sysctl = t;
2625
2626	inet_netconf_notify_devconf(net, RTM_NEWNETCONF, NETCONFA_ALL,
2627				    ifindex, p);
2628	return 0;
2629
2630free:
2631	kfree(t);
2632out:
2633	return -ENOMEM;
2634}
2635
2636static void __devinet_sysctl_unregister(struct net *net,
2637					struct ipv4_devconf *cnf, int ifindex)
2638{
2639	struct devinet_sysctl_table *t = cnf->sysctl;
2640
2641	if (t) {
2642		cnf->sysctl = NULL;
2643		unregister_net_sysctl_table(t->sysctl_header);
2644		kfree(t);
2645	}
2646
2647	inet_netconf_notify_devconf(net, RTM_DELNETCONF, 0, ifindex, NULL);
 
 
2648}
2649
2650static int devinet_sysctl_register(struct in_device *idev)
2651{
2652	int err;
2653
2654	if (!sysctl_dev_name_is_allowed(idev->dev->name))
2655		return -EINVAL;
2656
2657	err = neigh_sysctl_register(idev->dev, idev->arp_parms, NULL);
2658	if (err)
2659		return err;
2660	err = __devinet_sysctl_register(dev_net(idev->dev), idev->dev->name,
2661					idev->dev->ifindex, &idev->cnf);
2662	if (err)
2663		neigh_sysctl_unregister(idev->arp_parms);
2664	return err;
2665}
2666
2667static void devinet_sysctl_unregister(struct in_device *idev)
2668{
2669	struct net *net = dev_net(idev->dev);
2670
2671	__devinet_sysctl_unregister(net, &idev->cnf, idev->dev->ifindex);
2672	neigh_sysctl_unregister(idev->arp_parms);
2673}
2674
2675static struct ctl_table ctl_forward_entry[] = {
2676	{
2677		.procname	= "ip_forward",
2678		.data		= &ipv4_devconf.data[
2679					IPV4_DEVCONF_FORWARDING - 1],
2680		.maxlen		= sizeof(int),
2681		.mode		= 0644,
2682		.proc_handler	= devinet_sysctl_forward,
2683		.extra1		= &ipv4_devconf,
2684		.extra2		= &init_net,
2685	},
2686	{ },
2687};
2688#endif
2689
2690static __net_init int devinet_init_net(struct net *net)
2691{
2692	int err;
2693	struct ipv4_devconf *all, *dflt;
2694#ifdef CONFIG_SYSCTL
2695	struct ctl_table *tbl;
2696	struct ctl_table_header *forw_hdr;
2697#endif
2698
2699	err = -ENOMEM;
2700	all = kmemdup(&ipv4_devconf, sizeof(ipv4_devconf), GFP_KERNEL);
2701	if (!all)
2702		goto err_alloc_all;
2703
2704	dflt = kmemdup(&ipv4_devconf_dflt, sizeof(ipv4_devconf_dflt), GFP_KERNEL);
2705	if (!dflt)
2706		goto err_alloc_dflt;
 
 
 
 
2707
2708#ifdef CONFIG_SYSCTL
2709	tbl = kmemdup(ctl_forward_entry, sizeof(ctl_forward_entry), GFP_KERNEL);
2710	if (!tbl)
2711		goto err_alloc_ctl;
2712
2713	tbl[0].data = &all->data[IPV4_DEVCONF_FORWARDING - 1];
2714	tbl[0].extra1 = all;
2715	tbl[0].extra2 = net;
2716#endif
2717
2718	if (!net_eq(net, &init_net)) {
2719		switch (net_inherit_devconf()) {
2720		case 3:
2721			/* copy from the current netns */
2722			memcpy(all, current->nsproxy->net_ns->ipv4.devconf_all,
2723			       sizeof(ipv4_devconf));
2724			memcpy(dflt,
2725			       current->nsproxy->net_ns->ipv4.devconf_dflt,
2726			       sizeof(ipv4_devconf_dflt));
2727			break;
2728		case 0:
2729		case 1:
2730			/* copy from init_net */
2731			memcpy(all, init_net.ipv4.devconf_all,
2732			       sizeof(ipv4_devconf));
2733			memcpy(dflt, init_net.ipv4.devconf_dflt,
2734			       sizeof(ipv4_devconf_dflt));
2735			break;
2736		case 2:
2737			/* use compiled values */
2738			break;
2739		}
2740	}
2741
2742#ifdef CONFIG_SYSCTL
2743	err = __devinet_sysctl_register(net, "all", NETCONFA_IFINDEX_ALL, all);
2744	if (err < 0)
2745		goto err_reg_all;
2746
2747	err = __devinet_sysctl_register(net, "default",
2748					NETCONFA_IFINDEX_DEFAULT, dflt);
2749	if (err < 0)
2750		goto err_reg_dflt;
2751
2752	err = -ENOMEM;
2753	forw_hdr = register_net_sysctl_sz(net, "net/ipv4", tbl,
2754					  ARRAY_SIZE(ctl_forward_entry));
2755	if (!forw_hdr)
2756		goto err_reg_ctl;
2757	net->ipv4.forw_hdr = forw_hdr;
2758#endif
2759
2760	net->ipv4.devconf_all = all;
2761	net->ipv4.devconf_dflt = dflt;
2762	return 0;
2763
2764#ifdef CONFIG_SYSCTL
2765err_reg_ctl:
2766	__devinet_sysctl_unregister(net, dflt, NETCONFA_IFINDEX_DEFAULT);
2767err_reg_dflt:
2768	__devinet_sysctl_unregister(net, all, NETCONFA_IFINDEX_ALL);
2769err_reg_all:
2770	kfree(tbl);
 
2771err_alloc_ctl:
2772#endif
2773	kfree(dflt);
 
2774err_alloc_dflt:
2775	kfree(all);
 
2776err_alloc_all:
2777	return err;
2778}
2779
2780static __net_exit void devinet_exit_net(struct net *net)
2781{
2782#ifdef CONFIG_SYSCTL
2783	struct ctl_table *tbl;
2784
2785	tbl = net->ipv4.forw_hdr->ctl_table_arg;
2786	unregister_net_sysctl_table(net->ipv4.forw_hdr);
2787	__devinet_sysctl_unregister(net, net->ipv4.devconf_dflt,
2788				    NETCONFA_IFINDEX_DEFAULT);
2789	__devinet_sysctl_unregister(net, net->ipv4.devconf_all,
2790				    NETCONFA_IFINDEX_ALL);
2791	kfree(tbl);
2792#endif
2793	kfree(net->ipv4.devconf_dflt);
2794	kfree(net->ipv4.devconf_all);
2795}
2796
2797static __net_initdata struct pernet_operations devinet_ops = {
2798	.init = devinet_init_net,
2799	.exit = devinet_exit_net,
2800};
2801
2802static struct rtnl_af_ops inet_af_ops __read_mostly = {
2803	.family		  = AF_INET,
2804	.fill_link_af	  = inet_fill_link_af,
2805	.get_link_af_size = inet_get_link_af_size,
2806	.validate_link_af = inet_validate_link_af,
2807	.set_link_af	  = inet_set_link_af,
2808};
2809
2810void __init devinet_init(void)
2811{
2812	int i;
2813
2814	for (i = 0; i < IN4_ADDR_HSIZE; i++)
2815		INIT_HLIST_HEAD(&inet_addr_lst[i]);
2816
2817	register_pernet_subsys(&devinet_ops);
 
 
2818	register_netdevice_notifier(&ip_netdev_notifier);
2819
2820	queue_delayed_work(system_power_efficient_wq, &check_lifetime_work, 0);
2821
2822	rtnl_af_register(&inet_af_ops);
2823
2824	rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL, 0);
2825	rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL, 0);
2826	rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr, 0);
2827	rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf,
2828		      inet_netconf_dump_devconf, 0);
2829}