originator.c 38.1 KB
Newer Older
1
/* Copyright (C) 2009-2016  B.A.T.M.A.N. contributors:
2 3 4 5 6 7 8 9 10 11 12 13 14
 *
 * Marek Lindner, Simon Wunderlich
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
15
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
16 17
 */

18
#include "originator.h"
19
#include "main.h"
20 21 22 23 24 25

#include <linux/errno.h>
#include <linux/etherdevice.h>
#include <linux/fs.h>
#include <linux/jiffies.h>
#include <linux/kernel.h>
26
#include <linux/kref.h>
27 28 29
#include <linux/list.h>
#include <linux/lockdep.h>
#include <linux/netdevice.h>
30
#include <linux/rculist.h>
31 32 33 34 35
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/workqueue.h>

36
#include "distributed-arp-table.h"
37
#include "fragmentation.h"
38 39
#include "gateway_client.h"
#include "hard-interface.h"
40
#include "hash.h"
41
#include "multicast.h"
42 43 44
#include "network-coding.h"
#include "routing.h"
#include "translation-table.h"
45

46 47 48
/* hash class keys */
static struct lock_class_key batadv_orig_hash_lock_class_key;

49
static void batadv_purge_orig(struct work_struct *work);
50

51
/**
52 53 54
 * batadv_compare_orig - comparing function used in the originator hash table
 * @node: node in the local table
 * @data2: second object to compare the node to
55 56 57
 *
 * Return: 1 if they are the same originator
 */
58
int batadv_compare_orig(const struct hlist_node *node, const void *data2)
59
{
60 61
	const void *data1 = container_of(node, struct batadv_orig_node,
					 hash_entry);
62

63
	return batadv_compare_eth(data1, data2);
64 65
}

66 67 68 69 70
/**
 * batadv_orig_node_vlan_get - get an orig_node_vlan object
 * @orig_node: the originator serving the VLAN
 * @vid: the VLAN identifier
 *
71
 * Return: the vlan object identified by vid and belonging to orig_node or NULL
72 73 74 75 76 77 78 79 80
 * if it does not exist.
 */
struct batadv_orig_node_vlan *
batadv_orig_node_vlan_get(struct batadv_orig_node *orig_node,
			  unsigned short vid)
{
	struct batadv_orig_node_vlan *vlan = NULL, *tmp;

	rcu_read_lock();
81
	hlist_for_each_entry_rcu(tmp, &orig_node->vlan_list, list) {
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
		if (tmp->vid != vid)
			continue;

		if (!atomic_inc_not_zero(&tmp->refcount))
			continue;

		vlan = tmp;

		break;
	}
	rcu_read_unlock();

	return vlan;
}

/**
 * batadv_orig_node_vlan_new - search and possibly create an orig_node_vlan
 *  object
 * @orig_node: the originator serving the VLAN
 * @vid: the VLAN identifier
 *
103
 * Return: NULL in case of failure or the vlan object identified by vid and
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
 * belonging to orig_node otherwise. The object is created and added to the list
 * if it does not exist.
 *
 * The object is returned with refcounter increased by 1.
 */
struct batadv_orig_node_vlan *
batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node,
			  unsigned short vid)
{
	struct batadv_orig_node_vlan *vlan;

	spin_lock_bh(&orig_node->vlan_list_lock);

	/* first look if an object for this vid already exists */
	vlan = batadv_orig_node_vlan_get(orig_node, vid);
	if (vlan)
		goto out;

	vlan = kzalloc(sizeof(*vlan), GFP_ATOMIC);
	if (!vlan)
		goto out;

	atomic_set(&vlan->refcount, 2);
	vlan->vid = vid;

129
	hlist_add_head_rcu(&vlan->list, &orig_node->vlan_list);
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147

out:
	spin_unlock_bh(&orig_node->vlan_list_lock);

	return vlan;
}

/**
 * batadv_orig_node_vlan_free_ref - decrement the refcounter and possibly free
 *  the originator-vlan object
 * @orig_vlan: the originator-vlan object to release
 */
void batadv_orig_node_vlan_free_ref(struct batadv_orig_node_vlan *orig_vlan)
{
	if (atomic_dec_and_test(&orig_vlan->refcount))
		kfree_rcu(orig_vlan, rcu);
}

148
int batadv_originator_init(struct batadv_priv *bat_priv)
149 150
{
	if (bat_priv->orig_hash)
151
		return 0;
152

153
	bat_priv->orig_hash = batadv_hash_new(1024);
154 155 156 157

	if (!bat_priv->orig_hash)
		goto err;

158 159 160
	batadv_hash_set_lock_class(bat_priv->orig_hash,
				   &batadv_orig_hash_lock_class_key);

161 162 163 164 165
	INIT_DELAYED_WORK(&bat_priv->orig_work, batadv_purge_orig);
	queue_delayed_work(batadv_event_workqueue,
			   &bat_priv->orig_work,
			   msecs_to_jiffies(BATADV_ORIG_WORK_PERIOD));

166
	return 0;
167 168

err:
169
	return -ENOMEM;
170 171
}

172
/**
173 174
 * batadv_neigh_ifinfo_release - release neigh_ifinfo from lists and queue for
 *  free after rcu grace period
175
 * @ref: kref pointer of the neigh_ifinfo
176
 */
177
static void batadv_neigh_ifinfo_release(struct kref *ref)
178
{
179 180 181 182
	struct batadv_neigh_ifinfo *neigh_ifinfo;

	neigh_ifinfo = container_of(ref, struct batadv_neigh_ifinfo, refcount);

183 184 185 186
	if (neigh_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
		batadv_hardif_free_ref(neigh_ifinfo->if_outgoing);

	kfree_rcu(neigh_ifinfo, rcu);
187 188 189
}

/**
190
 * batadv_neigh_ifinfo_free_ref - decrement the refcounter and possibly release
191 192 193 194 195
 *  the neigh_ifinfo
 * @neigh_ifinfo: the neigh_ifinfo object to release
 */
void batadv_neigh_ifinfo_free_ref(struct batadv_neigh_ifinfo *neigh_ifinfo)
{
196
	kref_put(&neigh_ifinfo->refcount, batadv_neigh_ifinfo_release);
197 198
}

199
/**
200 201
 * batadv_hardif_neigh_release - release hardif neigh node from lists and
 *  queue for free after rcu grace period
202
 * @ref: kref pointer of the neigh_node
203
 */
204
static void batadv_hardif_neigh_release(struct kref *ref)
205
{
206 207 208 209 210
	struct batadv_hardif_neigh_node *hardif_neigh;

	hardif_neigh = container_of(ref, struct batadv_hardif_neigh_node,
				    refcount);

211 212 213
	spin_lock_bh(&hardif_neigh->if_incoming->neigh_list_lock);
	hlist_del_init_rcu(&hardif_neigh->list);
	spin_unlock_bh(&hardif_neigh->if_incoming->neigh_list_lock);
214

215 216
	batadv_hardif_free_ref(hardif_neigh->if_incoming);
	kfree_rcu(hardif_neigh, rcu);
217 218 219 220
}

/**
 * batadv_hardif_neigh_free_ref - decrement the hardif neighbors refcounter
221
 *  and possibly release it
222 223 224 225
 * @hardif_neigh: hardif neigh neighbor to free
 */
void batadv_hardif_neigh_free_ref(struct batadv_hardif_neigh_node *hardif_neigh)
{
226
	kref_put(&hardif_neigh->refcount, batadv_hardif_neigh_release);
227 228
}

229
/**
230 231
 * batadv_neigh_node_release - release neigh_node from lists and queue for
 *  free after rcu grace period
232
 * @ref: kref pointer of the neigh_node
233
 */
234
static void batadv_neigh_node_release(struct kref *ref)
235 236
{
	struct hlist_node *node_tmp;
237
	struct batadv_neigh_node *neigh_node;
238
	struct batadv_hardif_neigh_node *hardif_neigh;
239
	struct batadv_neigh_ifinfo *neigh_ifinfo;
240
	struct batadv_algo_ops *bao;
241

242
	neigh_node = container_of(ref, struct batadv_neigh_node, refcount);
243
	bao = neigh_node->orig_node->bat_priv->bat_algo_ops;
244 245 246

	hlist_for_each_entry_safe(neigh_ifinfo, node_tmp,
				  &neigh_node->ifinfo_list, list) {
247
		batadv_neigh_ifinfo_free_ref(neigh_ifinfo);
248
	}
249

250 251 252 253
	hardif_neigh = batadv_hardif_neigh_get(neigh_node->if_incoming,
					       neigh_node->addr);
	if (hardif_neigh) {
		/* batadv_hardif_neigh_get() increases refcount too */
254 255
		batadv_hardif_neigh_free_ref(hardif_neigh);
		batadv_hardif_neigh_free_ref(hardif_neigh);
256 257
	}

258 259 260
	if (bao->bat_neigh_free)
		bao->bat_neigh_free(neigh_node);

261
	batadv_hardif_free_ref(neigh_node->if_incoming);
262

263
	kfree_rcu(neigh_node, rcu);
264 265 266
}

/**
267 268
 * batadv_neigh_node_free_ref - decrement the neighbors refcounter and possibly
 *  release it
269 270
 * @neigh_node: neigh neighbor to free
 */
271
void batadv_neigh_node_free_ref(struct batadv_neigh_node *neigh_node)
272
{
273
	kref_put(&neigh_node->refcount, batadv_neigh_node_release);
274 275
}

276 277 278 279 280 281
/**
 * batadv_orig_node_get_router - router to the originator depending on iface
 * @orig_node: the orig node for the router
 * @if_outgoing: the interface where the payload packet has been received or
 *  the OGM should be sent to
 *
282
 * Return: the neighbor which should be router for this orig_node/iface.
283 284 285
 *
 * The object is returned with refcounter increased by 1.
 */
286
struct batadv_neigh_node *
287 288
batadv_orig_router_get(struct batadv_orig_node *orig_node,
		       const struct batadv_hard_iface *if_outgoing)
289
{
290 291
	struct batadv_orig_ifinfo *orig_ifinfo;
	struct batadv_neigh_node *router = NULL;
292 293

	rcu_read_lock();
294 295 296 297 298 299 300
	hlist_for_each_entry_rcu(orig_ifinfo, &orig_node->ifinfo_list, list) {
		if (orig_ifinfo->if_outgoing != if_outgoing)
			continue;

		router = rcu_dereference(orig_ifinfo->router);
		break;
	}
301

302
	if (router && !kref_get_unless_zero(&router->refcount))
303 304 305 306 307 308
		router = NULL;

	rcu_read_unlock();
	return router;
}

309 310 311 312 313
/**
 * batadv_orig_ifinfo_get - find the ifinfo from an orig_node
 * @orig_node: the orig node to be queried
 * @if_outgoing: the interface for which the ifinfo should be acquired
 *
314
 * Return: the requested orig_ifinfo or NULL if not found.
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
 *
 * The object is returned with refcounter increased by 1.
 */
struct batadv_orig_ifinfo *
batadv_orig_ifinfo_get(struct batadv_orig_node *orig_node,
		       struct batadv_hard_iface *if_outgoing)
{
	struct batadv_orig_ifinfo *tmp, *orig_ifinfo = NULL;

	rcu_read_lock();
	hlist_for_each_entry_rcu(tmp, &orig_node->ifinfo_list,
				 list) {
		if (tmp->if_outgoing != if_outgoing)
			continue;

330
		if (!kref_get_unless_zero(&tmp->refcount))
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
			continue;

		orig_ifinfo = tmp;
		break;
	}
	rcu_read_unlock();

	return orig_ifinfo;
}

/**
 * batadv_orig_ifinfo_new - search and possibly create an orig_ifinfo object
 * @orig_node: the orig node to be queried
 * @if_outgoing: the interface for which the ifinfo should be acquired
 *
346
 * Return: NULL in case of failure or the orig_ifinfo object for the if_outgoing
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
 * interface otherwise. The object is created and added to the list
 * if it does not exist.
 *
 * The object is returned with refcounter increased by 1.
 */
struct batadv_orig_ifinfo *
batadv_orig_ifinfo_new(struct batadv_orig_node *orig_node,
		       struct batadv_hard_iface *if_outgoing)
{
	struct batadv_orig_ifinfo *orig_ifinfo = NULL;
	unsigned long reset_time;

	spin_lock_bh(&orig_node->neigh_list_lock);

	orig_ifinfo = batadv_orig_ifinfo_get(orig_node, if_outgoing);
	if (orig_ifinfo)
		goto out;

	orig_ifinfo = kzalloc(sizeof(*orig_ifinfo), GFP_ATOMIC);
	if (!orig_ifinfo)
		goto out;

	if (if_outgoing != BATADV_IF_DEFAULT &&
370
	    !kref_get_unless_zero(&if_outgoing->refcount)) {
371 372 373 374 375 376 377 378 379 380
		kfree(orig_ifinfo);
		orig_ifinfo = NULL;
		goto out;
	}

	reset_time = jiffies - 1;
	reset_time -= msecs_to_jiffies(BATADV_RESET_PROTECTION_MS);
	orig_ifinfo->batman_seqno_reset = reset_time;
	orig_ifinfo->if_outgoing = if_outgoing;
	INIT_HLIST_NODE(&orig_ifinfo->list);
381 382
	kref_init(&orig_ifinfo->refcount);
	kref_get(&orig_ifinfo->refcount);
383 384 385 386 387 388 389
	hlist_add_head_rcu(&orig_ifinfo->list,
			   &orig_node->ifinfo_list);
out:
	spin_unlock_bh(&orig_node->neigh_list_lock);
	return orig_ifinfo;
}

390 391
/**
 * batadv_neigh_ifinfo_get - find the ifinfo from an neigh_node
392
 * @neigh: the neigh node to be queried
393 394 395 396
 * @if_outgoing: the interface for which the ifinfo should be acquired
 *
 * The object is returned with refcounter increased by 1.
 *
397
 * Return: the requested neigh_ifinfo or NULL if not found
398 399 400 401 402 403 404 405 406 407 408 409 410 411
 */
struct batadv_neigh_ifinfo *
batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh,
			struct batadv_hard_iface *if_outgoing)
{
	struct batadv_neigh_ifinfo *neigh_ifinfo = NULL,
				   *tmp_neigh_ifinfo;

	rcu_read_lock();
	hlist_for_each_entry_rcu(tmp_neigh_ifinfo, &neigh->ifinfo_list,
				 list) {
		if (tmp_neigh_ifinfo->if_outgoing != if_outgoing)
			continue;

412
		if (!kref_get_unless_zero(&tmp_neigh_ifinfo->refcount))
413 414 415 416 417 418 419 420 421 422 423 424
			continue;

		neigh_ifinfo = tmp_neigh_ifinfo;
		break;
	}
	rcu_read_unlock();

	return neigh_ifinfo;
}

/**
 * batadv_neigh_ifinfo_new - search and possibly create an neigh_ifinfo object
425
 * @neigh: the neigh node to be queried
426 427
 * @if_outgoing: the interface for which the ifinfo should be acquired
 *
428
 * Return: NULL in case of failure or the neigh_ifinfo object for the
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449
 * if_outgoing interface otherwise. The object is created and added to the list
 * if it does not exist.
 *
 * The object is returned with refcounter increased by 1.
 */
struct batadv_neigh_ifinfo *
batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh,
			struct batadv_hard_iface *if_outgoing)
{
	struct batadv_neigh_ifinfo *neigh_ifinfo;

	spin_lock_bh(&neigh->ifinfo_lock);

	neigh_ifinfo = batadv_neigh_ifinfo_get(neigh, if_outgoing);
	if (neigh_ifinfo)
		goto out;

	neigh_ifinfo = kzalloc(sizeof(*neigh_ifinfo), GFP_ATOMIC);
	if (!neigh_ifinfo)
		goto out;

450
	if (if_outgoing && !kref_get_unless_zero(&if_outgoing->refcount)) {
451 452 453 454 455 456
		kfree(neigh_ifinfo);
		neigh_ifinfo = NULL;
		goto out;
	}

	INIT_HLIST_NODE(&neigh_ifinfo->list);
457 458
	kref_init(&neigh_ifinfo->refcount);
	kref_get(&neigh_ifinfo->refcount);
459 460 461 462 463 464 465 466 467 468
	neigh_ifinfo->if_outgoing = if_outgoing;

	hlist_add_head_rcu(&neigh_ifinfo->list, &neigh->ifinfo_list);

out:
	spin_unlock_bh(&neigh->ifinfo_lock);

	return neigh_ifinfo;
}

469 470 471 472 473 474 475 476
/**
 * batadv_neigh_node_get - retrieve a neighbour from the list
 * @orig_node: originator which the neighbour belongs to
 * @hard_iface: the interface where this neighbour is connected to
 * @addr: the address of the neighbour
 *
 * Looks for and possibly returns a neighbour belonging to this originator list
 * which is connected through the provided hard interface.
477 478
 *
 * Return: neighbor when found. Othwerwise NULL
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494
 */
static struct batadv_neigh_node *
batadv_neigh_node_get(const struct batadv_orig_node *orig_node,
		      const struct batadv_hard_iface *hard_iface,
		      const u8 *addr)
{
	struct batadv_neigh_node *tmp_neigh_node, *res = NULL;

	rcu_read_lock();
	hlist_for_each_entry_rcu(tmp_neigh_node, &orig_node->neigh_list, list) {
		if (!batadv_compare_eth(tmp_neigh_node->addr, addr))
			continue;

		if (tmp_neigh_node->if_incoming != hard_iface)
			continue;

495
		if (!kref_get_unless_zero(&tmp_neigh_node->refcount))
496 497 498 499 500 501 502 503 504 505
			continue;

		res = tmp_neigh_node;
		break;
	}
	rcu_read_unlock();

	return res;
}

506 507 508 509 510
/**
 * batadv_hardif_neigh_create - create a hardif neighbour node
 * @hard_iface: the interface this neighbour is connected to
 * @neigh_addr: the interface address of the neighbour to retrieve
 *
511
 * Return: the hardif neighbour node if found or created or NULL otherwise.
512 513 514 515 516
 */
static struct batadv_hardif_neigh_node *
batadv_hardif_neigh_create(struct batadv_hard_iface *hard_iface,
			   const u8 *neigh_addr)
{
517
	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
518 519 520 521 522 523 524 525 526
	struct batadv_hardif_neigh_node *hardif_neigh = NULL;

	spin_lock_bh(&hard_iface->neigh_list_lock);

	/* check if neighbor hasn't been added in the meantime */
	hardif_neigh = batadv_hardif_neigh_get(hard_iface, neigh_addr);
	if (hardif_neigh)
		goto out;

527
	if (!kref_get_unless_zero(&hard_iface->refcount))
528 529 530 531 532 533 534 535 536 537 538 539 540
		goto out;

	hardif_neigh = kzalloc(sizeof(*hardif_neigh), GFP_ATOMIC);
	if (!hardif_neigh) {
		batadv_hardif_free_ref(hard_iface);
		goto out;
	}

	INIT_HLIST_NODE(&hardif_neigh->list);
	ether_addr_copy(hardif_neigh->addr, neigh_addr);
	hardif_neigh->if_incoming = hard_iface;
	hardif_neigh->last_seen = jiffies;

541
	kref_init(&hardif_neigh->refcount);
542

543 544 545
	if (bat_priv->bat_algo_ops->bat_hardif_neigh_init)
		bat_priv->bat_algo_ops->bat_hardif_neigh_init(hardif_neigh);

546 547 548 549 550 551 552 553 554 555 556 557 558
	hlist_add_head(&hardif_neigh->list, &hard_iface->neigh_list);

out:
	spin_unlock_bh(&hard_iface->neigh_list_lock);
	return hardif_neigh;
}

/**
 * batadv_hardif_neigh_get_or_create - retrieve or create a hardif neighbour
 *  node
 * @hard_iface: the interface this neighbour is connected to
 * @neigh_addr: the interface address of the neighbour to retrieve
 *
559
 * Return: the hardif neighbour node if found or created or NULL otherwise.
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
 */
static struct batadv_hardif_neigh_node *
batadv_hardif_neigh_get_or_create(struct batadv_hard_iface *hard_iface,
				  const u8 *neigh_addr)
{
	struct batadv_hardif_neigh_node *hardif_neigh = NULL;

	/* first check without locking to avoid the overhead */
	hardif_neigh = batadv_hardif_neigh_get(hard_iface, neigh_addr);
	if (hardif_neigh)
		return hardif_neigh;

	return batadv_hardif_neigh_create(hard_iface, neigh_addr);
}

/**
 * batadv_hardif_neigh_get - retrieve a hardif neighbour from the list
 * @hard_iface: the interface where this neighbour is connected to
 * @neigh_addr: the address of the neighbour
 *
 * Looks for and possibly returns a neighbour belonging to this hard interface.
581 582
 *
 * Return: neighbor when found. Othwerwise NULL
583 584 585 586 587 588 589 590 591 592 593 594 595
 */
struct batadv_hardif_neigh_node *
batadv_hardif_neigh_get(const struct batadv_hard_iface *hard_iface,
			const u8 *neigh_addr)
{
	struct batadv_hardif_neigh_node *tmp_hardif_neigh, *hardif_neigh = NULL;

	rcu_read_lock();
	hlist_for_each_entry_rcu(tmp_hardif_neigh,
				 &hard_iface->neigh_list, list) {
		if (!batadv_compare_eth(tmp_hardif_neigh->addr, neigh_addr))
			continue;

596
		if (!kref_get_unless_zero(&tmp_hardif_neigh->refcount))
597 598 599 600 601 602 603 604 605 606
			continue;

		hardif_neigh = tmp_hardif_neigh;
		break;
	}
	rcu_read_unlock();

	return hardif_neigh;
}

607 608
/**
 * batadv_neigh_node_new - create and init a new neigh_node object
609
 * @orig_node: originator object representing the neighbour
610 611 612 613
 * @hard_iface: the interface where the neighbour is connected to
 * @neigh_addr: the mac address of the neighbour interface
 *
 * Allocates a new neigh_node object and initialises all the generic fields.
614 615
 *
 * Return: neighbor when found. Othwerwise NULL
616
 */
617
struct batadv_neigh_node *
618 619 620
batadv_neigh_node_new(struct batadv_orig_node *orig_node,
		      struct batadv_hard_iface *hard_iface,
		      const u8 *neigh_addr)
621
{
622
	struct batadv_neigh_node *neigh_node;
623
	struct batadv_hardif_neigh_node *hardif_neigh = NULL;
624

625 626 627 628
	neigh_node = batadv_neigh_node_get(orig_node, hard_iface, neigh_addr);
	if (neigh_node)
		goto out;

629 630 631 632 633
	hardif_neigh = batadv_hardif_neigh_get_or_create(hard_iface,
							 neigh_addr);
	if (!hardif_neigh)
		goto out;

634
	neigh_node = kzalloc(sizeof(*neigh_node), GFP_ATOMIC);
635
	if (!neigh_node)
636
		goto out;
637

638
	if (!kref_get_unless_zero(&hard_iface->refcount)) {
639 640 641 642 643
		kfree(neigh_node);
		neigh_node = NULL;
		goto out;
	}

644
	INIT_HLIST_NODE(&neigh_node->list);
645 646
	INIT_HLIST_HEAD(&neigh_node->ifinfo_list);
	spin_lock_init(&neigh_node->ifinfo_lock);
647

648
	ether_addr_copy(neigh_node->addr, neigh_addr);
649 650 651
	neigh_node->if_incoming = hard_iface;
	neigh_node->orig_node = orig_node;

652
	/* extra reference for return */
653 654
	kref_init(&neigh_node->refcount);
	kref_get(&neigh_node->refcount);
655

656 657 658 659
	spin_lock_bh(&orig_node->neigh_list_lock);
	hlist_add_head_rcu(&neigh_node->list, &orig_node->neigh_list);
	spin_unlock_bh(&orig_node->neigh_list_lock);

660
	/* increment unique neighbor refcount */
661
	kref_get(&hardif_neigh->refcount);
662

663 664 665 666
	batadv_dbg(BATADV_DBG_BATMAN, orig_node->bat_priv,
		   "Creating new neighbor %pM for orig_node %pM on interface %s\n",
		   neigh_addr, orig_node->orig, hard_iface->net_dev->name);

667
out:
668 669
	if (hardif_neigh)
		batadv_hardif_neigh_free_ref(hardif_neigh);
670 671 672
	return neigh_node;
}

673 674 675 676 677
/**
 * batadv_hardif_neigh_seq_print_text - print the single hop neighbour list
 * @seq: neighbour table seq_file struct
 * @offset: not used
 *
678
 * Return: always 0
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706
 */
int batadv_hardif_neigh_seq_print_text(struct seq_file *seq, void *offset)
{
	struct net_device *net_dev = (struct net_device *)seq->private;
	struct batadv_priv *bat_priv = netdev_priv(net_dev);
	struct batadv_hard_iface *primary_if;

	primary_if = batadv_seq_print_text_primary_if_get(seq);
	if (!primary_if)
		return 0;

	seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s %s)]\n",
		   BATADV_SOURCE_VERSION, primary_if->net_dev->name,
		   primary_if->net_dev->dev_addr, net_dev->name,
		   bat_priv->bat_algo_ops->name);

	batadv_hardif_free_ref(primary_if);

	if (!bat_priv->bat_algo_ops->bat_neigh_print) {
		seq_puts(seq,
			 "No printing function for this routing protocol\n");
		return 0;
	}

	bat_priv->bat_algo_ops->bat_neigh_print(bat_priv, seq);
	return 0;
}

707
/**
708 709
 * batadv_orig_ifinfo_release - release orig_ifinfo from lists and queue for
 *  free after rcu grace period
710
 * @ref: kref pointer of the orig_ifinfo
711
 */
712
static void batadv_orig_ifinfo_release(struct kref *ref)
713
{
714
	struct batadv_orig_ifinfo *orig_ifinfo;
715
	struct batadv_neigh_node *router;
716

717 718
	orig_ifinfo = container_of(ref, struct batadv_orig_ifinfo, refcount);

719
	if (orig_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
720
		batadv_hardif_free_ref(orig_ifinfo->if_outgoing);
721

722 723 724
	/* this is the last reference to this object */
	router = rcu_dereference_protected(orig_ifinfo->router, true);
	if (router)
725 726 727
		batadv_neigh_node_free_ref(router);

	kfree_rcu(orig_ifinfo, rcu);
728 729 730
}

/**
731 732
 * batadv_orig_ifinfo_free_ref - decrement the refcounter and possibly release
 *  the orig_ifinfo
733 734
 * @orig_ifinfo: the orig_ifinfo object to release
 */
735
void batadv_orig_ifinfo_free_ref(struct batadv_orig_ifinfo *orig_ifinfo)
736
{
737
	kref_put(&orig_ifinfo->refcount, batadv_orig_ifinfo_release);
738 739 740
}

/**
741 742
 * batadv_orig_node_free_rcu - free the orig_node
 * @rcu: rcu pointer of the orig_node
743
 */
744
static void batadv_orig_node_free_rcu(struct rcu_head *rcu)
745
{
746 747 748 749 750 751 752 753 754 755 756 757 758
	struct batadv_orig_node *orig_node;

	orig_node = container_of(rcu, struct batadv_orig_node, rcu);

	batadv_mcast_purge_orig(orig_node);

	batadv_frag_purge_orig(orig_node, NULL);

	if (orig_node->bat_priv->bat_algo_ops->bat_orig_free)
		orig_node->bat_priv->bat_algo_ops->bat_orig_free(orig_node);

	kfree(orig_node->tt_buff);
	kfree(orig_node);
759 760
}

761 762 763 764 765 766
/**
 * batadv_orig_node_release - release orig_node from lists and queue for
 *  free after rcu grace period
 * @orig_node: the orig node to free
 */
static void batadv_orig_node_release(struct batadv_orig_node *orig_node)
767
{
768
	struct hlist_node *node_tmp;
769
	struct batadv_neigh_node *neigh_node;
770
	struct batadv_orig_ifinfo *orig_ifinfo;
771

772 773
	spin_lock_bh(&orig_node->neigh_list_lock);

774
	/* for all neighbors towards this originator ... */
775
	hlist_for_each_entry_safe(neigh_node, node_tmp,
776
				  &orig_node->neigh_list, list) {
777
		hlist_del_rcu(&neigh_node->list);
778
		batadv_neigh_node_free_ref(neigh_node);
779 780
	}

781 782 783
	hlist_for_each_entry_safe(orig_ifinfo, node_tmp,
				  &orig_node->ifinfo_list, list) {
		hlist_del_rcu(&orig_ifinfo->list);
784
		batadv_orig_ifinfo_free_ref(orig_ifinfo);
785
	}
786 787
	spin_unlock_bh(&orig_node->neigh_list_lock);

788 789 790
	/* Free nc_nodes */
	batadv_nc_purge_orig(orig_node->bat_priv, orig_node, NULL);

791
	call_rcu(&orig_node->rcu, batadv_orig_node_free_rcu);
792 793
}

794 795
/**
 * batadv_orig_node_free_ref - decrement the orig node refcounter and possibly
796
 *  release it
797 798
 * @orig_node: the orig node to free
 */
799
void batadv_orig_node_free_ref(struct batadv_orig_node *orig_node)
800 801
{
	if (atomic_dec_and_test(&orig_node->refcount))
802
		batadv_orig_node_release(orig_node);
803 804
}

805
void batadv_originator_free(struct batadv_priv *bat_priv)
806
{
807
	struct batadv_hashtable *hash = bat_priv->orig_hash;
808
	struct hlist_node *node_tmp;
809 810
	struct hlist_head *head;
	spinlock_t *list_lock; /* spinlock to protect write access */
811
	struct batadv_orig_node *orig_node;
812
	u32 i;
813 814

	if (!hash)
815 816 817 818 819
		return;

	cancel_delayed_work_sync(&bat_priv->orig_work);

	bat_priv->orig_hash = NULL;
820 821 822 823 824 825

	for (i = 0; i < hash->size; i++) {
		head = &hash->table[i];
		list_lock = &hash->list_locks[i];

		spin_lock_bh(list_lock);
826
		hlist_for_each_entry_safe(orig_node, node_tmp,
827
					  head, hash_entry) {
828
			hlist_del_rcu(&orig_node->hash_entry);
829
			batadv_orig_node_free_ref(orig_node);
830 831 832 833
		}
		spin_unlock_bh(list_lock);
	}

834
	batadv_hash_destroy(hash);
835 836
}

837 838 839 840 841 842 843
/**
 * batadv_orig_node_new - creates a new orig_node
 * @bat_priv: the bat priv with all the soft interface information
 * @addr: the mac address of the originator
 *
 * Creates a new originator object and initialise all the generic fields.
 * The new object is not added to the originator list.
844 845
 *
 * Return: the newly created object or NULL on failure.
846
 */
847
struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv,
848
					      const u8 *addr)
849
{
850
	struct batadv_orig_node *orig_node;
851
	struct batadv_orig_node_vlan *vlan;
852
	unsigned long reset_time;
853
	int i;
854

855 856
	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
		   "Creating new originator: %pM\n", addr);
857

858
	orig_node = kzalloc(sizeof(*orig_node), GFP_ATOMIC);
859 860 861
	if (!orig_node)
		return NULL;

862
	INIT_HLIST_HEAD(&orig_node->neigh_list);
863
	INIT_HLIST_HEAD(&orig_node->vlan_list);
864
	INIT_HLIST_HEAD(&orig_node->ifinfo_list);
865
	spin_lock_init(&orig_node->bcast_seqno_lock);
866
	spin_lock_init(&orig_node->neigh_list_lock);
867
	spin_lock_init(&orig_node->tt_buff_lock);
868
	spin_lock_init(&orig_node->tt_lock);
869
	spin_lock_init(&orig_node->vlan_list_lock);
870

871 872
	batadv_nc_init_orig(orig_node);

873 874
	/* extra reference for return */
	atomic_set(&orig_node->refcount, 2);
875

876
	orig_node->bat_priv = bat_priv;
877
	ether_addr_copy(orig_node->orig, addr);
878
	batadv_dat_init_orig_node_addr(orig_node);
879
	atomic_set(&orig_node->last_ttvn, 0);
880
	orig_node->tt_buff = NULL;
881
	orig_node->tt_buff_len = 0;
882
	orig_node->last_seen = jiffies;
883 884
	reset_time = jiffies - 1 - msecs_to_jiffies(BATADV_RESET_PROTECTION_MS);
	orig_node->bcast_seqno_reset = reset_time;
885

886 887
#ifdef CONFIG_BATMAN_ADV_MCAST
	orig_node->mcast_flags = BATADV_NO_FLAGS;
888 889 890 891
	INIT_HLIST_NODE(&orig_node->mcast_want_all_unsnoopables_node);
	INIT_HLIST_NODE(&orig_node->mcast_want_all_ipv4_node);
	INIT_HLIST_NODE(&orig_node->mcast_want_all_ipv6_node);
	spin_lock_init(&orig_node->mcast_handler_lock);
892
#endif
893

894 895 896 897 898 899 900 901 902 903
	/* create a vlan object for the "untagged" LAN */
	vlan = batadv_orig_node_vlan_new(orig_node, BATADV_NO_FLAGS);
	if (!vlan)
		goto free_orig_node;
	/* batadv_orig_node_vlan_new() increases the refcounter.
	 * Immediately release vlan since it is not needed anymore in this
	 * context
	 */
	batadv_orig_node_vlan_free_ref(vlan);

904 905 906 907 908 909
	for (i = 0; i < BATADV_FRAG_BUFFER_COUNT; i++) {
		INIT_HLIST_HEAD(&orig_node->fragments[i].head);
		spin_lock_init(&orig_node->fragments[i].lock);
		orig_node->fragments[i].size = 0;
	}

910 911 912 913 914 915
	return orig_node;
free_orig_node:
	kfree(orig_node);
	return NULL;
}

916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956
/**
 * batadv_purge_neigh_ifinfo - purge obsolete ifinfo entries from neighbor
 * @bat_priv: the bat priv with all the soft interface information
 * @neigh: orig node which is to be checked
 */
static void
batadv_purge_neigh_ifinfo(struct batadv_priv *bat_priv,
			  struct batadv_neigh_node *neigh)
{
	struct batadv_neigh_ifinfo *neigh_ifinfo;
	struct batadv_hard_iface *if_outgoing;
	struct hlist_node *node_tmp;

	spin_lock_bh(&neigh->ifinfo_lock);

	/* for all ifinfo objects for this neighinator */
	hlist_for_each_entry_safe(neigh_ifinfo, node_tmp,
				  &neigh->ifinfo_list, list) {
		if_outgoing = neigh_ifinfo->if_outgoing;

		/* always keep the default interface */
		if (if_outgoing == BATADV_IF_DEFAULT)
			continue;

		/* don't purge if the interface is not (going) down */
		if ((if_outgoing->if_status != BATADV_IF_INACTIVE) &&
		    (if_outgoing->if_status != BATADV_IF_NOT_IN_USE) &&
		    (if_outgoing->if_status != BATADV_IF_TO_BE_REMOVED))
			continue;

		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
			   "neighbor/ifinfo purge: neighbor %pM, iface: %s\n",
			   neigh->addr, if_outgoing->net_dev->name);

		hlist_del_rcu(&neigh_ifinfo->list);
		batadv_neigh_ifinfo_free_ref(neigh_ifinfo);
	}

	spin_unlock_bh(&neigh->ifinfo_lock);
}

957 958 959 960 961
/**
 * batadv_purge_orig_ifinfo - purge obsolete ifinfo entries from originator
 * @bat_priv: the bat priv with all the soft interface information
 * @orig_node: orig node which is to be checked
 *
962
 * Return: true if any ifinfo entry was purged, false otherwise.
963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997
 */
static bool
batadv_purge_orig_ifinfo(struct batadv_priv *bat_priv,
			 struct batadv_orig_node *orig_node)
{
	struct batadv_orig_ifinfo *orig_ifinfo;
	struct batadv_hard_iface *if_outgoing;
	struct hlist_node *node_tmp;
	bool ifinfo_purged = false;

	spin_lock_bh(&orig_node->neigh_list_lock);

	/* for all ifinfo objects for this originator */
	hlist_for_each_entry_safe(orig_ifinfo, node_tmp,
				  &orig_node->ifinfo_list, list) {
		if_outgoing = orig_ifinfo->if_outgoing;

		/* always keep the default interface */
		if (if_outgoing == BATADV_IF_DEFAULT)
			continue;

		/* don't purge if the interface is not (going) down */
		if ((if_outgoing->if_status != BATADV_IF_INACTIVE) &&
		    (if_outgoing->if_status != BATADV_IF_NOT_IN_USE) &&
		    (if_outgoing->if_status != BATADV_IF_TO_BE_REMOVED))
			continue;

		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
			   "router/ifinfo purge: originator %pM, iface: %s\n",
			   orig_node->orig, if_outgoing->net_dev->name);

		ifinfo_purged = true;

		hlist_del_rcu(&orig_ifinfo->list);
		batadv_orig_ifinfo_free_ref(orig_ifinfo);
S
Simon Wunderlich 已提交
998 999 1000 1001
		if (orig_node->last_bonding_candidate == orig_ifinfo) {
			orig_node->last_bonding_candidate = NULL;
			batadv_orig_ifinfo_free_ref(orig_ifinfo);
		}
1002 1003 1004 1005 1006 1007 1008
	}

	spin_unlock_bh(&orig_node->neigh_list_lock);

	return ifinfo_purged;
}

1009 1010 1011 1012 1013
/**
 * batadv_purge_orig_neighbors - purges neighbors from originator
 * @bat_priv: the bat priv with all the soft interface information
 * @orig_node: orig node which is to be checked
 *
1014
 * Return: true if any neighbor was purged, false otherwise
1015
 */
1016 1017
static bool
batadv_purge_orig_neighbors(struct batadv_priv *bat_priv,
1018
			    struct batadv_orig_node *orig_node)
1019
{
1020
	struct hlist_node *node_tmp;
1021
	struct batadv_neigh_node *neigh_node;
1022
	bool neigh_purged = false;
1023
	unsigned long last_seen;
1024
	struct batadv_hard_iface *if_incoming;
1025

1026 1027
	spin_lock_bh(&orig_node->neigh_list_lock);

1028
	/* for all neighbors towards this originator ... */
1029
	hlist_for_each_entry_safe(neigh_node, node_tmp,
1030
				  &orig_node->neigh_list, list) {
1031 1032 1033
		last_seen = neigh_node->last_seen;
		if_incoming = neigh_node->if_incoming;

1034
		if ((batadv_has_timed_out(last_seen, BATADV_PURGE_TIMEOUT)) ||
1035 1036 1037 1038 1039 1040
		    (if_incoming->if_status == BATADV_IF_INACTIVE) ||
		    (if_incoming->if_status == BATADV_IF_NOT_IN_USE) ||
		    (if_incoming->if_status == BATADV_IF_TO_BE_REMOVED)) {
			if ((if_incoming->if_status == BATADV_IF_INACTIVE) ||
			    (if_incoming->if_status == BATADV_IF_NOT_IN_USE) ||
			    (if_incoming->if_status == BATADV_IF_TO_BE_REMOVED))
1041
				batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1042 1043 1044
					   "neighbor purge: originator %pM, neighbor: %pM, iface: %s\n",
					   orig_node->orig, neigh_node->addr,
					   if_incoming->net_dev->name);
1045
			else
1046
				batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1047 1048 1049
					   "neighbor timeout: originator %pM, neighbor: %pM, last_seen: %u\n",
					   orig_node->orig, neigh_node->addr,
					   jiffies_to_msecs(last_seen));
1050 1051

			neigh_purged = true;
1052

1053
			hlist_del_rcu(&neigh_node->list);
1054
			batadv_neigh_node_free_ref(neigh_node);
1055 1056 1057 1058 1059
		} else {
			/* only necessary if not the whole neighbor is to be
			 * deleted, but some interface has been removed.
			 */
			batadv_purge_neigh_ifinfo(bat_priv, neigh_node);
1060 1061
		}
	}
1062 1063

	spin_unlock_bh(&orig_node->neigh_list_lock);
1064 1065 1066
	return neigh_purged;
}

1067 1068 1069 1070 1071 1072
/**
 * batadv_find_best_neighbor - finds the best neighbor after purging
 * @bat_priv: the bat priv with all the soft interface information
 * @orig_node: orig node which is to be checked
 * @if_outgoing: the interface for which the metric should be compared
 *
1073
 * Return: the current best neighbor, with refcount increased.
1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
 */
static struct batadv_neigh_node *
batadv_find_best_neighbor(struct batadv_priv *bat_priv,
			  struct batadv_orig_node *orig_node,
			  struct batadv_hard_iface *if_outgoing)
{
	struct batadv_neigh_node *best = NULL, *neigh;
	struct batadv_algo_ops *bao = bat_priv->bat_algo_ops;

	rcu_read_lock();
	hlist_for_each_entry_rcu(neigh, &orig_node->neigh_list, list) {
		if (best && (bao->bat_neigh_cmp(neigh, if_outgoing,
						best, if_outgoing) <= 0))
			continue;

1089
		if (!kref_get_unless_zero(&neigh->refcount))
1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101
			continue;

		if (best)
			batadv_neigh_node_free_ref(best);

		best = neigh;
	}
	rcu_read_unlock();

	return best;
}

1102 1103 1104 1105 1106 1107 1108 1109
/**
 * batadv_purge_orig_node - purges obsolete information from an orig_node
 * @bat_priv: the bat priv with all the soft interface information
 * @orig_node: orig node which is to be checked
 *
 * This function checks if the orig_node or substructures of it have become
 * obsolete, and purges this information if that's the case.
 *
1110
 * Return: true if the orig_node is to be removed, false otherwise.
1111
 */
1112 1113
static bool batadv_purge_orig_node(struct batadv_priv *bat_priv,
				   struct batadv_orig_node *orig_node)
1114
{
1115
	struct batadv_neigh_node *best_neigh_node;
1116
	struct batadv_hard_iface *hard_iface;
1117
	bool changed_ifinfo, changed_neigh;
1118

1119 1120
	if (batadv_has_timed_out(orig_node->last_seen,
				 2 * BATADV_PURGE_TIMEOUT)) {
1121
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1122 1123 1124
			   "Originator timeout: originator %pM, last_seen %u\n",
			   orig_node->orig,
			   jiffies_to_msecs(orig_node->last_seen));
1125 1126
		return true;
	}
1127 1128
	changed_ifinfo = batadv_purge_orig_ifinfo(bat_priv, orig_node);
	changed_neigh = batadv_purge_orig_neighbors(bat_priv, orig_node);
1129

1130
	if (!changed_ifinfo && !changed_neigh)
1131 1132
		return false;

1133
	/* first for NULL ... */
1134 1135
	best_neigh_node = batadv_find_best_neighbor(bat_priv, orig_node,
						    BATADV_IF_DEFAULT);
1136 1137
	batadv_update_route(bat_priv, orig_node, BATADV_IF_DEFAULT,
			    best_neigh_node);
1138 1139
	if (best_neigh_node)
		batadv_neigh_node_free_ref(best_neigh_node);
1140

1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
	/* ... then for all other interfaces. */
	rcu_read_lock();
	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
		if (hard_iface->if_status != BATADV_IF_ACTIVE)
			continue;

		if (hard_iface->soft_iface != bat_priv->soft_iface)
			continue;

		best_neigh_node = batadv_find_best_neighbor(bat_priv,
							    orig_node,
							    hard_iface);
		batadv_update_route(bat_priv, orig_node, hard_iface,
				    best_neigh_node);
		if (best_neigh_node)
			batadv_neigh_node_free_ref(best_neigh_node);
	}
	rcu_read_unlock();

1160 1161 1162
	return false;
}

1163
static void _batadv_purge_orig(struct batadv_priv *bat_priv)
1164
{
1165
	struct batadv_hashtable *hash = bat_priv->orig_hash;
1166
	struct hlist_node *node_tmp;
1167
	struct hlist_head *head;
1168
	spinlock_t *list_lock; /* spinlock to protect write access */
1169
	struct batadv_orig_node *orig_node;
1170
	u32 i;
1171 1172 1173 1174 1175 1176 1177

	if (!hash)
		return;

	/* for all origins... */
	for (i = 0; i < hash->size; i++) {
		head = &hash->table[i];
1178
		list_lock = &hash->list_locks[i];
1179

1180
		spin_lock_bh(list_lock);
1181
		hlist_for_each_entry_safe(orig_node, node_tmp,
1182
					  head, hash_entry) {
1183
			if (batadv_purge_orig_node(bat_priv, orig_node)) {
1184
				batadv_gw_node_delete(bat_priv, orig_node);
1185
				hlist_del_rcu(&orig_node->hash_entry);
1186 1187 1188
				batadv_tt_global_del_orig(orig_node->bat_priv,
							  orig_node, -1,
							  "originator timed out");
1189
				batadv_orig_node_free_ref(orig_node);
1190
				continue;
1191
			}
1192 1193 1194

			batadv_frag_purge_orig(orig_node,
					       batadv_frag_check_entry);
1195
		}
1196
		spin_unlock_bh(list_lock);
1197 1198
	}

1199
	batadv_gw_election(bat_priv);
1200 1201
}

1202
static void batadv_purge_orig(struct work_struct *work)
1203
{
1204 1205
	struct delayed_work *delayed_work;
	struct batadv_priv *bat_priv;
1206

1207 1208
	delayed_work = container_of(work, struct delayed_work, work);
	bat_priv = container_of(delayed_work, struct batadv_priv, orig_work);
1209
	_batadv_purge_orig(bat_priv);
1210 1211 1212
	queue_delayed_work(batadv_event_workqueue,
			   &bat_priv->orig_work,
			   msecs_to_jiffies(BATADV_ORIG_WORK_PERIOD));
1213 1214
}

1215
void batadv_purge_orig_ref(struct batadv_priv *bat_priv)
1216
{
1217
	_batadv_purge_orig(bat_priv);
1218 1219
}

1220
int batadv_orig_seq_print_text(struct seq_file *seq, void *offset)
1221 1222
{
	struct net_device *net_dev = (struct net_device *)seq->private;
1223 1224
	struct batadv_priv *bat_priv = netdev_priv(net_dev);
	struct batadv_hard_iface *primary_if;
1225

1226 1227
	primary_if = batadv_seq_print_text_primary_if_get(seq);
	if (!primary_if)
1228
		return 0;
1229

1230
	seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s %s)]\n",
1231
		   BATADV_SOURCE_VERSION, primary_if->net_dev->name,
1232 1233
		   primary_if->net_dev->dev_addr, net_dev->name,
		   bat_priv->bat_algo_ops->name);
1234

1235
	batadv_hardif_free_ref(primary_if);
1236

1237 1238 1239 1240
	if (!bat_priv->bat_algo_ops->bat_orig_print) {
		seq_puts(seq,
			 "No printing function for this routing protocol\n");
		return 0;
1241 1242
	}

1243 1244
	bat_priv->bat_algo_ops->bat_orig_print(bat_priv, seq,
					       BATADV_IF_DEFAULT);
1245

1246
	return 0;
1247 1248
}

1249 1250 1251 1252 1253 1254
/**
 * batadv_orig_hardif_seq_print_text - writes originator infos for a specific
 *  outgoing interface
 * @seq: debugfs table seq_file struct
 * @offset: not used
 *
1255
 * Return: 0
1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289
 */
int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset)
{
	struct net_device *net_dev = (struct net_device *)seq->private;
	struct batadv_hard_iface *hard_iface;
	struct batadv_priv *bat_priv;

	hard_iface = batadv_hardif_get_by_netdev(net_dev);

	if (!hard_iface || !hard_iface->soft_iface) {
		seq_puts(seq, "Interface not known to B.A.T.M.A.N.\n");
		goto out;
	}

	bat_priv = netdev_priv(hard_iface->soft_iface);
	if (!bat_priv->bat_algo_ops->bat_orig_print) {
		seq_puts(seq,
			 "No printing function for this routing protocol\n");
		goto out;
	}

	if (hard_iface->if_status != BATADV_IF_ACTIVE) {
		seq_puts(seq, "Interface not active\n");
		goto out;
	}

	seq_printf(seq, "[B.A.T.M.A.N. adv %s, IF/MAC: %s/%pM (%s %s)]\n",
		   BATADV_SOURCE_VERSION, hard_iface->net_dev->name,
		   hard_iface->net_dev->dev_addr,
		   hard_iface->soft_iface->name, bat_priv->bat_algo_ops->name);

	bat_priv->bat_algo_ops->bat_orig_print(bat_priv, seq, hard_iface);

out:
1290 1291
	if (hard_iface)
		batadv_hardif_free_ref(hard_iface);
1292 1293 1294
	return 0;
}

1295 1296
int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface,
			    int max_if_num)
1297
{
1298
	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
1299
	struct batadv_algo_ops *bao = bat_priv->bat_algo_ops;
1300
	struct batadv_hashtable *hash = bat_priv->orig_hash;
1301
	struct hlist_head *head;
1302
	struct batadv_orig_node *orig_node;
1303
	u32 i;
1304
	int ret;
1305 1306

	/* resize all orig nodes because orig_node->bcast_own(_sum) depend on
1307 1308
	 * if_num
	 */
1309 1310 1311
	for (i = 0; i < hash->size; i++) {
		head = &hash->table[i];

1312
		rcu_read_lock();
1313
		hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
1314 1315 1316 1317
			ret = 0;
			if (bao->bat_orig_add_if)
				ret = bao->bat_orig_add_if(orig_node,
							   max_if_num);
1318
			if (ret == -ENOMEM)
1319 1320
				goto err;
		}
1321
		rcu_read_unlock();
1322 1323 1324 1325 1326
	}

	return 0;

err:
1327
	rcu_read_unlock();
1328 1329 1330
	return -ENOMEM;
}

1331 1332
int batadv_orig_hash_del_if(struct batadv_hard_iface *hard_iface,
			    int max_if_num)
1333
{
1334
	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
1335
	struct batadv_hashtable *hash = bat_priv->orig_hash;
1336
	struct hlist_head *head;
1337 1338
	struct batadv_hard_iface *hard_iface_tmp;
	struct batadv_orig_node *orig_node;
1339
	struct batadv_algo_ops *bao = bat_priv->bat_algo_ops;
1340
	u32 i;
1341
	int ret;
1342 1343

	/* resize all orig nodes because orig_node->bcast_own(_sum) depend on
1344 1345
	 * if_num
	 */
1346 1347 1348
	for (i = 0; i < hash->size; i++) {
		head = &hash->table[i];

1349
		rcu_read_lock();
1350
		hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
1351 1352 1353 1354 1355
			ret = 0;
			if (bao->bat_orig_del_if)
				ret = bao->bat_orig_del_if(orig_node,
							   max_if_num,
							   hard_iface->if_num);
1356
			if (ret == -ENOMEM)
1357 1358
				goto err;
		}
1359
		rcu_read_unlock();
1360 1361 1362 1363
	}

	/* renumber remaining batman interfaces _inside_ of orig_hash_lock */
	rcu_read_lock();
1364
	list_for_each_entry_rcu(hard_iface_tmp, &batadv_hardif_list, list) {
1365
		if (hard_iface_tmp->if_status == BATADV_IF_NOT_IN_USE)
1366 1367
			continue;

1368
		if (hard_iface == hard_iface_tmp)
1369 1370
			continue;

1371
		if (hard_iface->soft_iface != hard_iface_tmp->soft_iface)
1372 1373
			continue;

1374 1375
		if (hard_iface_tmp->if_num > hard_iface->if_num)
			hard_iface_tmp->if_num--;
1376 1377 1378
	}
	rcu_read_unlock();

1379
	hard_iface->if_num = -1;
1380 1381 1382
	return 0;

err:
1383
	rcu_read_unlock();
1384 1385
	return -ENOMEM;
}