bat_iv_ogm.c 61.1 KB
Newer Older
1
/* Copyright (C) 2007-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 "bat_algo.h"
19
#include "main.h"
20 21 22 23 24 25 26 27 28 29 30 31 32 33

#include <linux/atomic.h>
#include <linux/bitmap.h>
#include <linux/bitops.h>
#include <linux/bug.h>
#include <linux/byteorder/generic.h>
#include <linux/cache.h>
#include <linux/errno.h>
#include <linux/etherdevice.h>
#include <linux/fs.h>
#include <linux/if_ether.h>
#include <linux/init.h>
#include <linux/jiffies.h>
#include <linux/list.h>
34
#include <linux/kref.h>
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#include <linux/netdevice.h>
#include <linux/pkt_sched.h>
#include <linux/printk.h>
#include <linux/random.h>
#include <linux/rculist.h>
#include <linux/rcupdate.h>
#include <linux/seq_file.h>
#include <linux/skbuff.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/stddef.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/workqueue.h>

#include "bitarray.h"
#include "hard-interface.h"
#include "hash.h"
#include "network-coding.h"
54
#include "originator.h"
55
#include "packet.h"
56 57
#include "routing.h"
#include "send.h"
58
#include "translation-table.h"
59

60
/**
61
 * enum batadv_dup_status - duplicate status
62
 * @BATADV_NO_DUP: the packet is no duplicate
63 64 65 66 67 68 69 70 71 72 73 74
 * @BATADV_ORIG_DUP: OGM is a duplicate in the originator (but not for the
 *  neighbor)
 * @BATADV_NEIGH_DUP: OGM is a duplicate for the neighbor
 * @BATADV_PROTECTED: originator is currently protected (after reboot)
 */
enum batadv_dup_status {
	BATADV_NO_DUP = 0,
	BATADV_ORIG_DUP,
	BATADV_NEIGH_DUP,
	BATADV_PROTECTED,
};

75 76 77 78 79 80
/**
 * batadv_ring_buffer_set - update the ring buffer with the given value
 * @lq_recv: pointer to the ring buffer
 * @lq_index: index to store the value at
 * @value: value to store in the ring buffer
 */
81
static void batadv_ring_buffer_set(u8 lq_recv[], u8 *lq_index, u8 value)
82 83 84 85 86 87
{
	lq_recv[*lq_index] = value;
	*lq_index = (*lq_index + 1) % BATADV_TQ_GLOBAL_WINDOW_SIZE;
}

/**
88
 * batadv_ring_buffer_avg - compute the average of all non-zero values stored
89 90 91
 * in the given ring buffer
 * @lq_recv: pointer to the ring buffer
 *
92
 * Return: computed average value.
93
 */
94
static u8 batadv_ring_buffer_avg(const u8 lq_recv[])
95
{
96 97 98 99
	const u8 *ptr;
	u16 count = 0;
	u16 i = 0;
	u16 sum = 0;
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115

	ptr = lq_recv;

	while (i < BATADV_TQ_GLOBAL_WINDOW_SIZE) {
		if (*ptr != 0) {
			count++;
			sum += *ptr;
		}

		i++;
		ptr++;
	}

	if (count == 0)
		return 0;

116
	return (u8)(sum / count);
117
}
118

119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
/**
 * batadv_iv_ogm_orig_free - free the private resources allocated for this
 *  orig_node
 * @orig_node: the orig_node for which the resources have to be free'd
 */
static void batadv_iv_ogm_orig_free(struct batadv_orig_node *orig_node)
{
	kfree(orig_node->bat_iv.bcast_own);
	kfree(orig_node->bat_iv.bcast_own_sum);
}

/**
 * batadv_iv_ogm_orig_add_if - change the private structures of the orig_node to
 *  include the new hard-interface
 * @orig_node: the orig_node that has to be changed
 * @max_if_num: the current amount of interfaces
 *
136
 * Return: 0 on success, a negative error code otherwise.
137 138 139 140 141
 */
static int batadv_iv_ogm_orig_add_if(struct batadv_orig_node *orig_node,
				     int max_if_num)
{
	void *data_ptr;
142
	size_t old_size;
143 144 145 146 147
	int ret = -ENOMEM;

	spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);

	old_size = (max_if_num - 1) * sizeof(unsigned long) * BATADV_NUM_WORDS;
148 149 150
	data_ptr = kmalloc_array(max_if_num,
				 BATADV_NUM_WORDS * sizeof(unsigned long),
				 GFP_ATOMIC);
151 152 153 154 155 156 157
	if (!data_ptr)
		goto unlock;

	memcpy(data_ptr, orig_node->bat_iv.bcast_own, old_size);
	kfree(orig_node->bat_iv.bcast_own);
	orig_node->bat_iv.bcast_own = data_ptr;

158
	data_ptr = kmalloc_array(max_if_num, sizeof(u8), GFP_ATOMIC);
159 160 161 162 163 164
	if (!data_ptr) {
		kfree(orig_node->bat_iv.bcast_own);
		goto unlock;
	}

	memcpy(data_ptr, orig_node->bat_iv.bcast_own_sum,
165
	       (max_if_num - 1) * sizeof(u8));
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
	kfree(orig_node->bat_iv.bcast_own_sum);
	orig_node->bat_iv.bcast_own_sum = data_ptr;

	ret = 0;

unlock:
	spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);

	return ret;
}

/**
 * batadv_iv_ogm_orig_del_if - change the private structures of the orig_node to
 *  exclude the removed interface
 * @orig_node: the orig_node that has to be changed
 * @max_if_num: the current amount of interfaces
 * @del_if_num: the index of the interface being removed
 *
184
 * Return: 0 on success, a negative error code otherwise.
185 186 187 188
 */
static int batadv_iv_ogm_orig_del_if(struct batadv_orig_node *orig_node,
				     int max_if_num, int del_if_num)
{
189 190
	int ret = -ENOMEM;
	size_t chunk_size, if_offset;
191 192 193 194 195 196 197 198 199
	void *data_ptr = NULL;

	spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);

	/* last interface was removed */
	if (max_if_num == 0)
		goto free_bcast_own;

	chunk_size = sizeof(unsigned long) * BATADV_NUM_WORDS;
200
	data_ptr = kmalloc_array(max_if_num, chunk_size, GFP_ATOMIC);
201 202 203 204 205 206 207
	if (!data_ptr)
		goto unlock;

	/* copy first part */
	memcpy(data_ptr, orig_node->bat_iv.bcast_own, del_if_num * chunk_size);

	/* copy second part */
208
	if_offset = (del_if_num + 1) * chunk_size;
209
	memcpy((char *)data_ptr + del_if_num * chunk_size,
210
	       (uint8_t *)orig_node->bat_iv.bcast_own + if_offset,
211 212 213 214 215 216 217 218 219
	       (max_if_num - del_if_num) * chunk_size);

free_bcast_own:
	kfree(orig_node->bat_iv.bcast_own);
	orig_node->bat_iv.bcast_own = data_ptr;

	if (max_if_num == 0)
		goto free_own_sum;

220
	data_ptr = kmalloc_array(max_if_num, sizeof(u8), GFP_ATOMIC);
221 222 223 224 225 226
	if (!data_ptr) {
		kfree(orig_node->bat_iv.bcast_own);
		goto unlock;
	}

	memcpy(data_ptr, orig_node->bat_iv.bcast_own_sum,
227
	       del_if_num * sizeof(u8));
228

229 230
	if_offset = (del_if_num + 1) * sizeof(u8);
	memcpy((char *)data_ptr + del_if_num * sizeof(u8),
231
	       orig_node->bat_iv.bcast_own_sum + if_offset,
232
	       (max_if_num - del_if_num) * sizeof(u8));
233 234 235 236 237 238 239 240 241 242 243 244

free_own_sum:
	kfree(orig_node->bat_iv.bcast_own_sum);
	orig_node->bat_iv.bcast_own_sum = data_ptr;

	ret = 0;
unlock:
	spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);

	return ret;
}

245 246 247 248 249
/**
 * batadv_iv_ogm_orig_get - retrieve or create (if does not exist) an originator
 * @bat_priv: the bat priv with all the soft interface information
 * @addr: mac address of the originator
 *
250
 * Return: the originator object corresponding to the passed mac address or NULL
251 252 253 254
 * on failure.
 * If the object does not exists it is created an initialised.
 */
static struct batadv_orig_node *
255
batadv_iv_ogm_orig_get(struct batadv_priv *bat_priv, const u8 *addr)
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
{
	struct batadv_orig_node *orig_node;
	int size, hash_added;

	orig_node = batadv_orig_hash_find(bat_priv, addr);
	if (orig_node)
		return orig_node;

	orig_node = batadv_orig_node_new(bat_priv, addr);
	if (!orig_node)
		return NULL;

	spin_lock_init(&orig_node->bat_iv.ogm_cnt_lock);

	size = bat_priv->num_ifaces * sizeof(unsigned long) * BATADV_NUM_WORDS;
	orig_node->bat_iv.bcast_own = kzalloc(size, GFP_ATOMIC);
	if (!orig_node->bat_iv.bcast_own)
		goto free_orig_node;

275
	size = bat_priv->num_ifaces * sizeof(u8);
276 277
	orig_node->bat_iv.bcast_own_sum = kzalloc(size, GFP_ATOMIC);
	if (!orig_node->bat_iv.bcast_own_sum)
278
		goto free_orig_node;
279 280 281 282 283

	hash_added = batadv_hash_add(bat_priv->orig_hash, batadv_compare_orig,
				     batadv_choose_orig, orig_node,
				     &orig_node->hash_entry);
	if (hash_added != 0)
284
		goto free_orig_node;
285 286 287 288

	return orig_node;

free_orig_node:
289
	/* free twice, as batadv_orig_node_new sets refcount to 2 */
290 291
	batadv_orig_node_put(orig_node);
	batadv_orig_node_put(orig_node);
292 293 294 295

	return NULL;
}

296 297
static struct batadv_neigh_node *
batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface,
298
			const u8 *neigh_addr,
299
			struct batadv_orig_node *orig_node,
300
			struct batadv_orig_node *orig_neigh)
301
{
302
	struct batadv_neigh_node *neigh_node;
303

304
	neigh_node = batadv_neigh_node_new(orig_node, hard_iface, neigh_addr);
305 306 307
	if (!neigh_node)
		goto out;

308
	neigh_node->orig_node = orig_neigh;
309 310 311 312 313

out:
	return neigh_node;
}

314
static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
315
{
316
	struct batadv_ogm_packet *batadv_ogm_packet;
317
	unsigned char *ogm_buff;
318
	u32 random_seqno;
319 320 321

	/* randomize initial seqno to avoid collision */
	get_random_bytes(&random_seqno, sizeof(random_seqno));
322
	atomic_set(&hard_iface->bat_iv.ogm_seqno, random_seqno);
323

324 325 326
	hard_iface->bat_iv.ogm_buff_len = BATADV_OGM_HLEN;
	ogm_buff = kmalloc(hard_iface->bat_iv.ogm_buff_len, GFP_ATOMIC);
	if (!ogm_buff)
327
		return -ENOMEM;
328

329 330 331
	hard_iface->bat_iv.ogm_buff = ogm_buff;

	batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
332 333 334
	batadv_ogm_packet->packet_type = BATADV_IV_OGM;
	batadv_ogm_packet->version = BATADV_COMPAT_VERSION;
	batadv_ogm_packet->ttl = 2;
335
	batadv_ogm_packet->flags = BATADV_NO_FLAGS;
336
	batadv_ogm_packet->reserved = 0;
337
	batadv_ogm_packet->tq = BATADV_TQ_MAX_VALUE;
338

339
	return 0;
340 341
}

342
static void batadv_iv_ogm_iface_disable(struct batadv_hard_iface *hard_iface)
343
{
344 345
	kfree(hard_iface->bat_iv.ogm_buff);
	hard_iface->bat_iv.ogm_buff = NULL;
346 347
}

348
static void batadv_iv_ogm_iface_update_mac(struct batadv_hard_iface *hard_iface)
349
{
350
	struct batadv_ogm_packet *batadv_ogm_packet;
351
	unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
352

353
	batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
354 355 356 357
	ether_addr_copy(batadv_ogm_packet->orig,
			hard_iface->net_dev->dev_addr);
	ether_addr_copy(batadv_ogm_packet->prev_sender,
			hard_iface->net_dev->dev_addr);
358 359
}

360 361
static void
batadv_iv_ogm_primary_iface_set(struct batadv_hard_iface *hard_iface)
362
{
363
	struct batadv_ogm_packet *batadv_ogm_packet;
364
	unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
365

366
	batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
367
	batadv_ogm_packet->ttl = BATADV_TTL;
368 369
}

370
/* when do we schedule our own ogm to be sent */
371
static unsigned long
372
batadv_iv_ogm_emit_send_time(const struct batadv_priv *bat_priv)
373
{
374 375 376
	unsigned int msecs;

	msecs = atomic_read(&bat_priv->orig_interval) - BATADV_JITTER;
377
	msecs += prandom_u32() % (2 * BATADV_JITTER);
378 379

	return jiffies + msecs_to_jiffies(msecs);
380 381 382
}

/* when do we schedule a ogm packet to be sent */
383
static unsigned long batadv_iv_ogm_fwd_send_time(void)
384
{
385
	return jiffies + msecs_to_jiffies(prandom_u32() % (BATADV_JITTER / 2));
386 387 388
}

/* apply hop penalty for a normal link */
389
static u8 batadv_hop_penalty(u8 tq, const struct batadv_priv *bat_priv)
390 391
{
	int hop_penalty = atomic_read(&bat_priv->hop_penalty);
392 393 394 395 396 397
	int new_tq;

	new_tq = tq * (BATADV_TQ_MAX_VALUE - hop_penalty);
	new_tq /= BATADV_TQ_MAX_VALUE;

	return new_tq;
398 399
}

400 401 402 403 404 405 406 407
/**
 * batadv_iv_ogm_aggr_packet - checks if there is another OGM attached
 * @buff_pos: current position in the skb
 * @packet_len: total length of the skb
 * @tvlv_len: tvlv length of the previously considered OGM
 *
 * Return: true if there is enough space for another OGM, false otherwise.
 */
408 409
static bool batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len,
				      __be16 tvlv_len)
410
{
411 412
	int next_buff_pos = 0;

413
	next_buff_pos += buff_pos + BATADV_OGM_HLEN;
414
	next_buff_pos += ntohs(tvlv_len);
415 416

	return (next_buff_pos <= packet_len) &&
417
	       (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES);
418 419
}

420
/* send a batman ogm to a given interface */
421 422
static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet,
				     struct batadv_hard_iface *hard_iface)
423
{
424
	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
425
	const char *fwd_str;
426 427
	u8 packet_num;
	s16 buff_pos;
428
	struct batadv_ogm_packet *batadv_ogm_packet;
429
	struct sk_buff *skb;
430
	u8 *packet_pos;
431

432
	if (hard_iface->if_status != BATADV_IF_ACTIVE)
433 434 435 436
		return;

	packet_num = 0;
	buff_pos = 0;
437 438
	packet_pos = forw_packet->skb->data;
	batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos;
439 440

	/* adjust all flags and log packets */
441
	while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len,
442
					 batadv_ogm_packet->tvlv_len)) {
443
		/* we might have aggregated direct link packets with an
444 445
		 * ordinary base packet
		 */
446 447
		if (forw_packet->direct_link_flags & BIT(packet_num) &&
		    forw_packet->if_incoming == hard_iface)
448
			batadv_ogm_packet->flags |= BATADV_DIRECTLINK;
449
		else
450
			batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK;
451

452 453 454 455 456
		if (packet_num > 0 || !forw_packet->own)
			fwd_str = "Forwarding";
		else
			fwd_str = "Sending own";

457
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
458
			   "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s) on interface %s [%pM]\n",
459
			   fwd_str, (packet_num > 0 ? "aggregated " : ""),
460 461
			   batadv_ogm_packet->orig,
			   ntohl(batadv_ogm_packet->seqno),
462
			   batadv_ogm_packet->tq, batadv_ogm_packet->ttl,
463
			   ((batadv_ogm_packet->flags & BATADV_DIRECTLINK) ?
464
			    "on" : "off"),
465
			   hard_iface->net_dev->name,
466
			   hard_iface->net_dev->dev_addr);
467

468
		buff_pos += BATADV_OGM_HLEN;
469
		buff_pos += ntohs(batadv_ogm_packet->tvlv_len);
470
		packet_num++;
471 472
		packet_pos = forw_packet->skb->data + buff_pos;
		batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos;
473 474 475 476
	}

	/* create clone because function is called more than once */
	skb = skb_clone(forw_packet->skb, GFP_ATOMIC);
477
	if (skb) {
478 479
		batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_TX);
		batadv_add_counter(bat_priv, BATADV_CNT_MGMT_TX_BYTES,
480
				   skb->len + ETH_HLEN);
481
		batadv_send_skb_packet(skb, hard_iface, batadv_broadcast_addr);
482
	}
483 484 485
}

/* send a batman ogm packet */
486
static void batadv_iv_ogm_emit(struct batadv_forw_packet *forw_packet)
487 488
{
	struct net_device *soft_iface;
489 490
	struct batadv_priv *bat_priv;
	struct batadv_hard_iface *primary_if = NULL;
491 492

	if (!forw_packet->if_incoming) {
493
		pr_err("Error - can't forward packet: incoming iface not specified\n");
494 495 496 497 498 499
		goto out;
	}

	soft_iface = forw_packet->if_incoming->soft_iface;
	bat_priv = netdev_priv(soft_iface);

500
	if (WARN_ON(!forw_packet->if_outgoing))
501 502
		goto out;

503
	if (WARN_ON(forw_packet->if_outgoing->soft_iface != soft_iface))
504 505
		goto out;

506
	if (forw_packet->if_incoming->if_status != BATADV_IF_ACTIVE)
507 508
		goto out;

509 510 511
	primary_if = batadv_primary_if_get_selected(bat_priv);
	if (!primary_if)
		goto out;
512

513 514
	/* only for one specific outgoing interface */
	batadv_iv_ogm_send_to_if(forw_packet, forw_packet->if_outgoing);
515 516 517

out:
	if (primary_if)
518
		batadv_hardif_put(primary_if);
519 520
}

521 522 523 524 525 526 527
/**
 * batadv_iv_ogm_can_aggregate - find out if an OGM can be aggregated on an
 *  existing forward packet
 * @new_bat_ogm_packet: OGM packet to be aggregated
 * @bat_priv: the bat priv with all the soft interface information
 * @packet_len: (total) length of the OGM
 * @send_time: timestamp (jiffies) when the packet is to be sent
528
 * @directlink: true if this is a direct link packet
529 530 531 532
 * @if_incoming: interface where the packet was received
 * @if_outgoing: interface for which the retransmission should be considered
 * @forw_packet: the forwarded packet which should be checked
 *
533
 * Return: true if new_packet can be aggregated with forw_packet
534
 */
535
static bool
536
batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet,
537
			    struct batadv_priv *bat_priv,
538 539
			    int packet_len, unsigned long send_time,
			    bool directlink,
540
			    const struct batadv_hard_iface *if_incoming,
541
			    const struct batadv_hard_iface *if_outgoing,
542
			    const struct batadv_forw_packet *forw_packet)
543
{
544
	struct batadv_ogm_packet *batadv_ogm_packet;
545
	int aggregated_bytes = forw_packet->packet_len + packet_len;
546
	struct batadv_hard_iface *primary_if = NULL;
547
	bool res = false;
548
	unsigned long aggregation_end_time;
549

550
	batadv_ogm_packet = (struct batadv_ogm_packet *)forw_packet->skb->data;
551 552
	aggregation_end_time = send_time;
	aggregation_end_time += msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS);
553

554
	/* we can aggregate the current packet to this aggregated packet
555 556 557 558 559
	 * if:
	 *
	 * - the send time is within our MAX_AGGREGATION_MS time
	 * - the resulting packet wont be bigger than
	 *   MAX_AGGREGATION_BYTES
560
	 * otherwise aggregation is not possible
561
	 */
562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
	if (!time_before(send_time, forw_packet->send_time) ||
	    !time_after_eq(aggregation_end_time, forw_packet->send_time))
		return false;

	if (aggregated_bytes > BATADV_MAX_AGGREGATION_BYTES)
		return false;

	/* packet is not leaving on the same interface. */
	if (forw_packet->if_outgoing != if_outgoing)
		return false;

	/* check aggregation compatibility
	 * -> direct link packets are broadcasted on
	 *    their interface only
	 * -> aggregate packet if the current packet is
	 *    a "global" packet as well as the base
	 *    packet
	 */
	primary_if = batadv_primary_if_get_selected(bat_priv);
	if (!primary_if)
		return false;
583

584 585 586 587 588 589 590 591 592 593 594 595 596 597 598
	/* packets without direct link flag and high TTL
	 * are flooded through the net
	 */
	if (!directlink &&
	    !(batadv_ogm_packet->flags & BATADV_DIRECTLINK) &&
	    batadv_ogm_packet->ttl != 1 &&

	    /* own packets originating non-primary
	     * interfaces leave only that interface
	     */
	    (!forw_packet->own ||
	     forw_packet->if_incoming == primary_if)) {
		res = true;
		goto out;
	}
599

600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
	/* if the incoming packet is sent via this one
	 * interface only - we still can aggregate
	 */
	if (directlink &&
	    new_bat_ogm_packet->ttl == 1 &&
	    forw_packet->if_incoming == if_incoming &&

	    /* packets from direct neighbors or
	     * own secondary interface packets
	     * (= secondary interface packets in general)
	     */
	    (batadv_ogm_packet->flags & BATADV_DIRECTLINK ||
	     (forw_packet->own &&
	      forw_packet->if_incoming != primary_if))) {
		res = true;
		goto out;
616 617 618 619
	}

out:
	if (primary_if)
620
		batadv_hardif_put(primary_if);
621 622 623
	return res;
}

624 625
/**
 * batadv_iv_ogm_aggregate_new - create a new aggregated packet and add this
626 627 628 629 630 631 632 633 634
 *  packet to it.
 * @packet_buff: pointer to the OGM
 * @packet_len: (total) length of the OGM
 * @send_time: timestamp (jiffies) when the packet is to be sent
 * @direct_link: whether this OGM has direct link status
 * @if_incoming: interface where the packet was received
 * @if_outgoing: interface for which the retransmission should be considered
 * @own_packet: true if it is a self-generated ogm
 */
635 636 637
static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,
					int packet_len, unsigned long send_time,
					bool direct_link,
638
					struct batadv_hard_iface *if_incoming,
639
					struct batadv_hard_iface *if_outgoing,
640
					int own_packet)
641
{
642 643
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
	struct batadv_forw_packet *forw_packet_aggr;
644
	unsigned char *skb_buff;
645
	unsigned int skb_size;
646

647
	if (!kref_get_unless_zero(&if_incoming->refcount))
648 649
		return;

650
	if (!kref_get_unless_zero(&if_outgoing->refcount))
651 652
		goto out_free_incoming;

653 654
	/* own packet should always be scheduled */
	if (!own_packet) {
655
		if (!batadv_atomic_dec_not_zero(&bat_priv->batman_queue_left)) {
656
			batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
657
				   "batman packet queue full\n");
658
			goto out_free_outgoing;
659 660 661 662
		}
	}

	forw_packet_aggr = kmalloc(sizeof(*forw_packet_aggr), GFP_ATOMIC);
663 664
	if (!forw_packet_aggr)
		goto out_nomem;
665

666 667
	if (atomic_read(&bat_priv->aggregated_ogms) &&
	    packet_len < BATADV_MAX_AGGREGATION_BYTES)
668
		skb_size = BATADV_MAX_AGGREGATION_BYTES;
669
	else
670 671
		skb_size = packet_len;

672
	skb_size += ETH_HLEN;
673

674
	forw_packet_aggr->skb = netdev_alloc_skb_ip_align(NULL, skb_size);
675 676
	if (!forw_packet_aggr->skb)
		goto out_free_forw_packet;
677
	forw_packet_aggr->skb->priority = TC_PRIO_CONTROL;
678
	skb_reserve(forw_packet_aggr->skb, ETH_HLEN);
679 680 681 682 683 684 685

	skb_buff = skb_put(forw_packet_aggr->skb, packet_len);
	forw_packet_aggr->packet_len = packet_len;
	memcpy(skb_buff, packet_buff, packet_len);

	forw_packet_aggr->own = own_packet;
	forw_packet_aggr->if_incoming = if_incoming;
686
	forw_packet_aggr->if_outgoing = if_outgoing;
687
	forw_packet_aggr->num_packets = 0;
688
	forw_packet_aggr->direct_link_flags = BATADV_NO_FLAGS;
689 690 691 692 693 694 695 696 697 698 699 700 701
	forw_packet_aggr->send_time = send_time;

	/* save packet direct link flag status */
	if (direct_link)
		forw_packet_aggr->direct_link_flags |= 1;

	/* add new packet to packet list */
	spin_lock_bh(&bat_priv->forw_bat_list_lock);
	hlist_add_head(&forw_packet_aggr->list, &bat_priv->forw_bat_list);
	spin_unlock_bh(&bat_priv->forw_bat_list_lock);

	/* start timer for this packet */
	INIT_DELAYED_WORK(&forw_packet_aggr->delayed_work,
702
			  batadv_send_outstanding_bat_ogm_packet);
703
	queue_delayed_work(batadv_event_workqueue,
704 705 706 707
			   &forw_packet_aggr->delayed_work,
			   send_time - jiffies);

	return;
708 709 710 711 712 713
out_free_forw_packet:
	kfree(forw_packet_aggr);
out_nomem:
	if (!own_packet)
		atomic_inc(&bat_priv->batman_queue_left);
out_free_outgoing:
714
	batadv_hardif_put(if_outgoing);
715
out_free_incoming:
716
	batadv_hardif_put(if_incoming);
717 718 719
}

/* aggregate a new packet into the existing ogm packet */
720
static void batadv_iv_ogm_aggregate(struct batadv_forw_packet *forw_packet_aggr,
721 722
				    const unsigned char *packet_buff,
				    int packet_len, bool direct_link)
723 724
{
	unsigned char *skb_buff;
725
	unsigned long new_direct_link_flag;
726 727 728 729 730 731 732

	skb_buff = skb_put(forw_packet_aggr->skb, packet_len);
	memcpy(skb_buff, packet_buff, packet_len);
	forw_packet_aggr->packet_len += packet_len;
	forw_packet_aggr->num_packets++;

	/* save packet direct link flag status */
733 734 735 736
	if (direct_link) {
		new_direct_link_flag = BIT(forw_packet_aggr->num_packets);
		forw_packet_aggr->direct_link_flags |= new_direct_link_flag;
	}
737 738
}

739 740 741 742 743 744 745 746 747 748
/**
 * batadv_iv_ogm_queue_add - queue up an OGM for transmission
 * @bat_priv: the bat priv with all the soft interface information
 * @packet_buff: pointer to the OGM
 * @packet_len: (total) length of the OGM
 * @if_incoming: interface where the packet was received
 * @if_outgoing: interface for which the retransmission should be considered
 * @own_packet: true if it is a self-generated ogm
 * @send_time: timestamp (jiffies) when the packet is to be sent
 */
749
static void batadv_iv_ogm_queue_add(struct batadv_priv *bat_priv,
750 751
				    unsigned char *packet_buff,
				    int packet_len,
752
				    struct batadv_hard_iface *if_incoming,
753
				    struct batadv_hard_iface *if_outgoing,
754
				    int own_packet, unsigned long send_time)
755
{
756
	/* _aggr -> pointer to the packet we want to aggregate with
757 758
	 * _pos -> pointer to the position in the queue
	 */
759 760
	struct batadv_forw_packet *forw_packet_aggr = NULL;
	struct batadv_forw_packet *forw_packet_pos = NULL;
761
	struct batadv_ogm_packet *batadv_ogm_packet;
762
	bool direct_link;
763
	unsigned long max_aggregation_jiffies;
764

765
	batadv_ogm_packet = (struct batadv_ogm_packet *)packet_buff;
766
	direct_link = !!(batadv_ogm_packet->flags & BATADV_DIRECTLINK);
767
	max_aggregation_jiffies = msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS);
768 769 770 771

	/* find position for the packet in the forward queue */
	spin_lock_bh(&bat_priv->forw_bat_list_lock);
	/* own packets are not to be aggregated */
772
	if (atomic_read(&bat_priv->aggregated_ogms) && !own_packet) {
773
		hlist_for_each_entry(forw_packet_pos,
774
				     &bat_priv->forw_bat_list, list) {
775
			if (batadv_iv_ogm_can_aggregate(batadv_ogm_packet,
776 777 778
							bat_priv, packet_len,
							send_time, direct_link,
							if_incoming,
779
							if_outgoing,
780
							forw_packet_pos)) {
781 782 783 784 785 786 787
				forw_packet_aggr = forw_packet_pos;
				break;
			}
		}
	}

	/* nothing to aggregate with - either aggregation disabled or no
788 789
	 * suitable aggregation packet found
	 */
790 791 792 793
	if (!forw_packet_aggr) {
		/* the following section can run without the lock */
		spin_unlock_bh(&bat_priv->forw_bat_list_lock);

794
		/* if we could not aggregate this packet with one of the others
795 796 797
		 * we hold it back for a while, so that it might be aggregated
		 * later on
		 */
798 799
		if (!own_packet && atomic_read(&bat_priv->aggregated_ogms))
			send_time += max_aggregation_jiffies;
800

801 802
		batadv_iv_ogm_aggregate_new(packet_buff, packet_len,
					    send_time, direct_link,
803 804
					    if_incoming, if_outgoing,
					    own_packet);
805
	} else {
806 807
		batadv_iv_ogm_aggregate(forw_packet_aggr, packet_buff,
					packet_len, direct_link);
808 809 810 811
		spin_unlock_bh(&bat_priv->forw_bat_list_lock);
	}
}

812
static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node,
813
				  const struct ethhdr *ethhdr,
814
				  struct batadv_ogm_packet *batadv_ogm_packet,
815 816
				  bool is_single_hop_neigh,
				  bool is_from_best_next_hop,
817 818
				  struct batadv_hard_iface *if_incoming,
				  struct batadv_hard_iface *if_outgoing)
819
{
820
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
821
	u16 tvlv_len;
822

823
	if (batadv_ogm_packet->ttl <= 1) {
824
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv, "ttl exceeded\n");
825 826 827
		return;
	}

828 829 830 831 832 833 834 835
	if (!is_from_best_next_hop) {
		/* Mark the forwarded packet when it is not coming from our
		 * best next hop. We still need to forward the packet for our
		 * neighbor link quality detection to work in case the packet
		 * originated from a single hop neighbor. Otherwise we can
		 * simply drop the ogm.
		 */
		if (is_single_hop_neigh)
836
			batadv_ogm_packet->flags |= BATADV_NOT_BEST_NEXT_HOP;
837 838 839
		else
			return;
	}
840

841
	tvlv_len = ntohs(batadv_ogm_packet->tvlv_len);
842

843
	batadv_ogm_packet->ttl--;
844
	ether_addr_copy(batadv_ogm_packet->prev_sender, ethhdr->h_source);
845 846

	/* apply hop penalty */
847
	batadv_ogm_packet->tq = batadv_hop_penalty(batadv_ogm_packet->tq,
848
						   bat_priv);
849

850
	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
851
		   "Forwarding packet: tq: %i, ttl: %i\n",
852
		   batadv_ogm_packet->tq, batadv_ogm_packet->ttl);
853

854
	if (is_single_hop_neigh)
855
		batadv_ogm_packet->flags |= BATADV_DIRECTLINK;
856
	else
857
		batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK;
858

859
	batadv_iv_ogm_queue_add(bat_priv, (unsigned char *)batadv_ogm_packet,
860
				BATADV_OGM_HLEN + tvlv_len,
861 862
				if_incoming, if_outgoing, 0,
				batadv_iv_ogm_fwd_send_time());
863 864
}

865 866 867 868 869 870 871 872 873 874 875 876 877
/**
 * batadv_iv_ogm_slide_own_bcast_window - bitshift own OGM broadcast windows for
 * the given interface
 * @hard_iface: the interface for which the windows have to be shifted
 */
static void
batadv_iv_ogm_slide_own_bcast_window(struct batadv_hard_iface *hard_iface)
{
	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
	struct batadv_hashtable *hash = bat_priv->orig_hash;
	struct hlist_head *head;
	struct batadv_orig_node *orig_node;
	unsigned long *word;
878
	u32 i;
879
	size_t word_index;
880
	u8 *w;
881
	int if_num;
882 883 884 885 886 887

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

		rcu_read_lock();
		hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
888
			spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
889
			word_index = hard_iface->if_num * BATADV_NUM_WORDS;
890
			word = &orig_node->bat_iv.bcast_own[word_index];
891 892

			batadv_bit_get_packet(bat_priv, word, 1, 0);
893 894
			if_num = hard_iface->if_num;
			w = &orig_node->bat_iv.bcast_own_sum[if_num];
895
			*w = bitmap_weight(word, BATADV_TQ_LOCAL_WINDOW_SIZE);
896
			spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
897 898 899 900 901
		}
		rcu_read_unlock();
	}
}

902
static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
903
{
904
	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
905
	unsigned char **ogm_buff = &hard_iface->bat_iv.ogm_buff;
906
	struct batadv_ogm_packet *batadv_ogm_packet;
907
	struct batadv_hard_iface *primary_if, *tmp_hard_iface;
908
	int *ogm_buff_len = &hard_iface->bat_iv.ogm_buff_len;
909 910
	u32 seqno;
	u16 tvlv_len = 0;
911
	unsigned long send_time;
912

913
	primary_if = batadv_primary_if_get_selected(bat_priv);
914

915 916 917 918 919
	if (hard_iface == primary_if) {
		/* tt changes have to be committed before the tvlv data is
		 * appended as it may alter the tt tvlv container
		 */
		batadv_tt_local_commit_changes(bat_priv);
920 921 922
		tvlv_len = batadv_tvlv_container_ogm_append(bat_priv, ogm_buff,
							    ogm_buff_len,
							    BATADV_OGM_HLEN);
923
	}
924

925
	batadv_ogm_packet = (struct batadv_ogm_packet *)(*ogm_buff);
926
	batadv_ogm_packet->tvlv_len = htons(tvlv_len);
927 928

	/* change sequence number to network order */
929
	seqno = (u32)atomic_read(&hard_iface->bat_iv.ogm_seqno);
930
	batadv_ogm_packet->seqno = htonl(seqno);
931
	atomic_inc(&hard_iface->bat_iv.ogm_seqno);
932

933
	batadv_iv_ogm_slide_own_bcast_window(hard_iface);
934

935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951
	send_time = batadv_iv_ogm_emit_send_time(bat_priv);

	if (hard_iface != primary_if) {
		/* OGMs from secondary interfaces are only scheduled on their
		 * respective interfaces.
		 */
		batadv_iv_ogm_queue_add(bat_priv, *ogm_buff, *ogm_buff_len,
					hard_iface, hard_iface, 1, send_time);
		goto out;
	}

	/* OGMs from primary interfaces are scheduled on all
	 * interfaces.
	 */
	rcu_read_lock();
	list_for_each_entry_rcu(tmp_hard_iface, &batadv_hardif_list, list) {
		if (tmp_hard_iface->soft_iface != hard_iface->soft_iface)
952
			continue;
953 954 955 956 957 958 959
		batadv_iv_ogm_queue_add(bat_priv, *ogm_buff,
					*ogm_buff_len, hard_iface,
					tmp_hard_iface, 1, send_time);
	}
	rcu_read_unlock();

out:
960
	if (primary_if)
961
		batadv_hardif_put(primary_if);
962 963
}

964 965 966 967 968
/**
 * batadv_iv_ogm_orig_update - use OGM to update corresponding data in an
 *  originator
 * @bat_priv: the bat priv with all the soft interface information
 * @orig_node: the orig node who originally emitted the ogm packet
969
 * @orig_ifinfo: ifinfo for the outgoing interface of the orig_node
970 971 972 973 974 975
 * @ethhdr: Ethernet header of the OGM
 * @batadv_ogm_packet: the ogm packet
 * @if_incoming: interface where the packet was received
 * @if_outgoing: interface for which the retransmission should be considered
 * @dup_status: the duplicate status of this ogm packet.
 */
976
static void
977 978
batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
			  struct batadv_orig_node *orig_node,
979
			  struct batadv_orig_ifinfo *orig_ifinfo,
980
			  const struct ethhdr *ethhdr,
981
			  const struct batadv_ogm_packet *batadv_ogm_packet,
982
			  struct batadv_hard_iface *if_incoming,
983
			  struct batadv_hard_iface *if_outgoing,
984
			  enum batadv_dup_status dup_status)
985
{
986 987
	struct batadv_neigh_ifinfo *neigh_ifinfo = NULL;
	struct batadv_neigh_ifinfo *router_ifinfo = NULL;
988 989
	struct batadv_neigh_node *neigh_node = NULL;
	struct batadv_neigh_node *tmp_neigh_node = NULL;
990 991
	struct batadv_neigh_node *router = NULL;
	struct batadv_orig_node *orig_node_tmp;
992
	int if_num;
993 994 995
	u8 sum_orig, sum_neigh;
	u8 *neigh_addr;
	u8 tq_avg;
996

997
	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
998
		   "update_originator(): Searching and updating originator entry of received packet\n");
999 1000

	rcu_read_lock();
1001
	hlist_for_each_entry_rcu(tmp_neigh_node,
1002
				 &orig_node->neigh_list, list) {
1003 1004 1005
		neigh_addr = tmp_neigh_node->addr;
		if (batadv_compare_eth(neigh_addr, ethhdr->h_source) &&
		    tmp_neigh_node->if_incoming == if_incoming &&
1006
		    kref_get_unless_zero(&tmp_neigh_node->refcount)) {
1007
			if (WARN(neigh_node, "too many matching neigh_nodes"))
1008
				batadv_neigh_node_put(neigh_node);
1009 1010 1011 1012
			neigh_node = tmp_neigh_node;
			continue;
		}

1013
		if (dup_status != BATADV_NO_DUP)
1014 1015
			continue;

1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
		/* only update the entry for this outgoing interface */
		neigh_ifinfo = batadv_neigh_ifinfo_get(tmp_neigh_node,
						       if_outgoing);
		if (!neigh_ifinfo)
			continue;

		spin_lock_bh(&tmp_neigh_node->ifinfo_lock);
		batadv_ring_buffer_set(neigh_ifinfo->bat_iv.tq_recv,
				       &neigh_ifinfo->bat_iv.tq_index, 0);
		tq_avg = batadv_ring_buffer_avg(neigh_ifinfo->bat_iv.tq_recv);
		neigh_ifinfo->bat_iv.tq_avg = tq_avg;
		spin_unlock_bh(&tmp_neigh_node->ifinfo_lock);

1029
		batadv_neigh_ifinfo_put(neigh_ifinfo);
1030
		neigh_ifinfo = NULL;
1031 1032 1033
	}

	if (!neigh_node) {
1034
		struct batadv_orig_node *orig_tmp;
1035

1036
		orig_tmp = batadv_iv_ogm_orig_get(bat_priv, ethhdr->h_source);
1037 1038 1039
		if (!orig_tmp)
			goto unlock;

1040 1041
		neigh_node = batadv_iv_ogm_neigh_new(if_incoming,
						     ethhdr->h_source,
1042
						     orig_node, orig_tmp);
1043

1044
		batadv_orig_node_put(orig_tmp);
1045 1046
		if (!neigh_node)
			goto unlock;
1047
	} else {
1048
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1049
			   "Updating existing last-hop neighbor of originator\n");
1050
	}
1051 1052

	rcu_read_unlock();
1053 1054 1055
	neigh_ifinfo = batadv_neigh_ifinfo_new(neigh_node, if_outgoing);
	if (!neigh_ifinfo)
		goto out;
1056

1057
	neigh_node->last_seen = jiffies;
1058

1059 1060 1061
	spin_lock_bh(&neigh_node->ifinfo_lock);
	batadv_ring_buffer_set(neigh_ifinfo->bat_iv.tq_recv,
			       &neigh_ifinfo->bat_iv.tq_index,
1062
			       batadv_ogm_packet->tq);
1063 1064 1065
	tq_avg = batadv_ring_buffer_avg(neigh_ifinfo->bat_iv.tq_recv);
	neigh_ifinfo->bat_iv.tq_avg = tq_avg;
	spin_unlock_bh(&neigh_node->ifinfo_lock);
1066

1067
	if (dup_status == BATADV_NO_DUP) {
1068
		orig_ifinfo->last_ttl = batadv_ogm_packet->ttl;
1069
		neigh_ifinfo->last_ttl = batadv_ogm_packet->ttl;
1070 1071 1072
	}

	/* if this neighbor already is our next hop there is nothing
1073 1074
	 * to change
	 */
1075
	router = batadv_orig_router_get(orig_node, if_outgoing);
1076
	if (router == neigh_node)
1077
		goto out;
1078

1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089
	if (router) {
		router_ifinfo = batadv_neigh_ifinfo_get(router, if_outgoing);
		if (!router_ifinfo)
			goto out;

		/* if this neighbor does not offer a better TQ we won't
		 * consider it
		 */
		if (router_ifinfo->bat_iv.tq_avg > neigh_ifinfo->bat_iv.tq_avg)
			goto out;
	}
1090 1091

	/* if the TQ is the same and the link not more symmetric we
1092 1093
	 * won't consider it either
	 */
1094
	if (router_ifinfo &&
1095
	    neigh_ifinfo->bat_iv.tq_avg == router_ifinfo->bat_iv.tq_avg) {
1096
		orig_node_tmp = router->orig_node;
1097
		spin_lock_bh(&orig_node_tmp->bat_iv.ogm_cnt_lock);
1098
		if_num = router->if_incoming->if_num;
1099 1100
		sum_orig = orig_node_tmp->bat_iv.bcast_own_sum[if_num];
		spin_unlock_bh(&orig_node_tmp->bat_iv.ogm_cnt_lock);
1101 1102

		orig_node_tmp = neigh_node->orig_node;
1103
		spin_lock_bh(&orig_node_tmp->bat_iv.ogm_cnt_lock);
1104
		if_num = neigh_node->if_incoming->if_num;
1105 1106
		sum_neigh = orig_node_tmp->bat_iv.bcast_own_sum[if_num];
		spin_unlock_bh(&orig_node_tmp->bat_iv.ogm_cnt_lock);
1107

1108
		if (sum_orig >= sum_neigh)
1109
			goto out;
1110 1111
	}

1112
	batadv_update_route(bat_priv, orig_node, if_outgoing, neigh_node);
1113 1114 1115 1116 1117 1118
	goto out;

unlock:
	rcu_read_unlock();
out:
	if (neigh_node)
1119
		batadv_neigh_node_put(neigh_node);
1120
	if (router)
1121
		batadv_neigh_node_put(router);
1122
	if (neigh_ifinfo)
1123
		batadv_neigh_ifinfo_put(neigh_ifinfo);
1124
	if (router_ifinfo)
1125
		batadv_neigh_ifinfo_put(router_ifinfo);
1126 1127
}

1128 1129 1130 1131 1132 1133 1134 1135
/**
 * batadv_iv_ogm_calc_tq - calculate tq for current received ogm packet
 * @orig_node: the orig node who originally emitted the ogm packet
 * @orig_neigh_node: the orig node struct of the neighbor who sent the packet
 * @batadv_ogm_packet: the ogm packet
 * @if_incoming: interface where the packet was received
 * @if_outgoing: interface for which the retransmission should be considered
 *
1136
 * Return: 1 if the link can be considered bidirectional, 0 otherwise
1137
 */
1138 1139
static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
				 struct batadv_orig_node *orig_neigh_node,
1140
				 struct batadv_ogm_packet *batadv_ogm_packet,
1141 1142
				 struct batadv_hard_iface *if_incoming,
				 struct batadv_hard_iface *if_outgoing)
1143
{
1144 1145
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
	struct batadv_neigh_node *neigh_node = NULL, *tmp_neigh_node;
1146
	struct batadv_neigh_ifinfo *neigh_ifinfo;
1147 1148
	u8 total_count;
	u8 orig_eq_count, neigh_rq_count, neigh_rq_inv, tq_own;
1149
	unsigned int neigh_rq_inv_cube, neigh_rq_max_cube;
1150
	int tq_asym_penalty, inv_asym_penalty, if_num, ret = 0;
1151
	unsigned int combined_tq;
S
Simon Wunderlich 已提交
1152
	int tq_iface_penalty;
1153 1154 1155

	/* find corresponding one hop neighbor */
	rcu_read_lock();
1156
	hlist_for_each_entry_rcu(tmp_neigh_node,
1157
				 &orig_neigh_node->neigh_list, list) {
1158 1159
		if (!batadv_compare_eth(tmp_neigh_node->addr,
					orig_neigh_node->orig))
1160 1161 1162 1163 1164
			continue;

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

1165
		if (!kref_get_unless_zero(&tmp_neigh_node->refcount))
1166 1167 1168 1169 1170 1171 1172 1173
			continue;

		neigh_node = tmp_neigh_node;
		break;
	}
	rcu_read_unlock();

	if (!neigh_node)
1174 1175 1176
		neigh_node = batadv_iv_ogm_neigh_new(if_incoming,
						     orig_neigh_node->orig,
						     orig_neigh_node,
1177
						     orig_neigh_node);
1178 1179 1180 1181

	if (!neigh_node)
		goto out;

1182
	/* if orig_node is direct neighbor update neigh_node last_seen */
1183
	if (orig_node == orig_neigh_node)
1184
		neigh_node->last_seen = jiffies;
1185

1186
	orig_node->last_seen = jiffies;
1187 1188

	/* find packet count of corresponding one hop neighbor */
1189 1190 1191
	spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
	if_num = if_incoming->if_num;
	orig_eq_count = orig_neigh_node->bat_iv.bcast_own_sum[if_num];
1192 1193 1194
	neigh_ifinfo = batadv_neigh_ifinfo_new(neigh_node, if_outgoing);
	if (neigh_ifinfo) {
		neigh_rq_count = neigh_ifinfo->bat_iv.real_packet_count;
1195
		batadv_neigh_ifinfo_put(neigh_ifinfo);
1196 1197 1198
	} else {
		neigh_rq_count = 0;
	}
1199
	spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
1200 1201

	/* pay attention to not get a value bigger than 100 % */
1202 1203 1204 1205
	if (orig_eq_count > neigh_rq_count)
		total_count = neigh_rq_count;
	else
		total_count = orig_eq_count;
1206

1207 1208 1209
	/* if we have too few packets (too less data) we set tq_own to zero
	 * if we receive too few packets it is not considered bidirectional
	 */
1210 1211
	if (total_count < BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM ||
	    neigh_rq_count < BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM)
1212 1213 1214 1215
		tq_own = 0;
	else
		/* neigh_node->real_packet_count is never zero as we
		 * only purge old information when getting new
1216 1217
		 * information
		 */
1218
		tq_own = (BATADV_TQ_MAX_VALUE * total_count) /	neigh_rq_count;
1219

1220
	/* 1 - ((1-x) ** 3), normalized to TQ_MAX_VALUE this does
1221 1222 1223 1224
	 * affect the nearly-symmetric links only a little, but
	 * punishes asymmetric links more.  This will give a value
	 * between 0 and TQ_MAX_VALUE
	 */
1225 1226 1227 1228 1229 1230 1231 1232 1233
	neigh_rq_inv = BATADV_TQ_LOCAL_WINDOW_SIZE - neigh_rq_count;
	neigh_rq_inv_cube = neigh_rq_inv * neigh_rq_inv * neigh_rq_inv;
	neigh_rq_max_cube = BATADV_TQ_LOCAL_WINDOW_SIZE *
			    BATADV_TQ_LOCAL_WINDOW_SIZE *
			    BATADV_TQ_LOCAL_WINDOW_SIZE;
	inv_asym_penalty = BATADV_TQ_MAX_VALUE * neigh_rq_inv_cube;
	inv_asym_penalty /= neigh_rq_max_cube;
	tq_asym_penalty = BATADV_TQ_MAX_VALUE - inv_asym_penalty;

S
Simon Wunderlich 已提交
1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
	/* penalize if the OGM is forwarded on the same interface. WiFi
	 * interfaces and other half duplex devices suffer from throughput
	 * drops as they can't send and receive at the same time.
	 */
	tq_iface_penalty = BATADV_TQ_MAX_VALUE;
	if (if_outgoing && (if_incoming == if_outgoing) &&
	    batadv_is_wifi_netdev(if_outgoing->net_dev))
		tq_iface_penalty = batadv_hop_penalty(BATADV_TQ_MAX_VALUE,
						      bat_priv);

	combined_tq = batadv_ogm_packet->tq *
		      tq_own *
		      tq_asym_penalty *
		      tq_iface_penalty;
	combined_tq /= BATADV_TQ_MAX_VALUE *
		       BATADV_TQ_MAX_VALUE *
		       BATADV_TQ_MAX_VALUE;
1251
	batadv_ogm_packet->tq = combined_tq;
1252

1253
	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
S
Simon Wunderlich 已提交
1254
		   "bidirectional: orig = %-15pM neigh = %-15pM => own_bcast = %2i, real recv = %2i, local tq: %3i, asym_penalty: %3i, iface_penalty: %3i, total tq: %3i, if_incoming = %s, if_outgoing = %s\n",
1255
		   orig_node->orig, orig_neigh_node->orig, total_count,
S
Simon Wunderlich 已提交
1256 1257 1258
		   neigh_rq_count, tq_own, tq_asym_penalty, tq_iface_penalty,
		   batadv_ogm_packet->tq, if_incoming->net_dev->name,
		   if_outgoing ? if_outgoing->net_dev->name : "DEFAULT");
1259 1260

	/* if link has the minimum required transmission quality
1261 1262
	 * consider it bidirectional
	 */
1263
	if (batadv_ogm_packet->tq >= BATADV_TQ_TOTAL_BIDRECT_LIMIT)
1264 1265 1266 1267
		ret = 1;

out:
	if (neigh_node)
1268
		batadv_neigh_node_put(neigh_node);
1269 1270 1271
	return ret;
}

1272 1273 1274 1275 1276 1277
/**
 * batadv_iv_ogm_update_seqnos -  process a batman packet for all interfaces,
 *  adjust the sequence number and find out whether it is a duplicate
 * @ethhdr: ethernet header of the packet
 * @batadv_ogm_packet: OGM packet to be considered
 * @if_incoming: interface on which the OGM packet was received
1278
 * @if_outgoing: interface for which the retransmission should be considered
1279
 *
1280
 * Return: duplicate status as enum batadv_dup_status
1281
 */
1282
static enum batadv_dup_status
1283
batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
1284
			    const struct batadv_ogm_packet *batadv_ogm_packet,
1285 1286
			    const struct batadv_hard_iface *if_incoming,
			    struct batadv_hard_iface *if_outgoing)
1287
{
1288 1289
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
	struct batadv_orig_node *orig_node;
1290
	struct batadv_orig_ifinfo *orig_ifinfo = NULL;
1291 1292
	struct batadv_neigh_node *neigh_node;
	struct batadv_neigh_ifinfo *neigh_ifinfo;
1293
	int is_dup;
1294
	s32 seq_diff;
1295
	int need_update = 0;
1296 1297
	int set_mark;
	enum batadv_dup_status ret = BATADV_NO_DUP;
1298 1299 1300
	u32 seqno = ntohl(batadv_ogm_packet->seqno);
	u8 *neigh_addr;
	u8 packet_count;
1301
	unsigned long *bitmap;
1302

1303
	orig_node = batadv_iv_ogm_orig_get(bat_priv, batadv_ogm_packet->orig);
1304
	if (!orig_node)
1305
		return BATADV_NO_DUP;
1306

1307 1308
	orig_ifinfo = batadv_orig_ifinfo_new(orig_node, if_outgoing);
	if (WARN_ON(!orig_ifinfo)) {
1309
		batadv_orig_node_put(orig_node);
1310 1311 1312
		return 0;
	}

1313
	spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
1314
	seq_diff = seqno - orig_ifinfo->last_real_seqno;
1315 1316

	/* signalize caller that the packet is to be dropped. */
1317
	if (!hlist_empty(&orig_node->neigh_list) &&
1318
	    batadv_window_protected(bat_priv, seq_diff,
1319 1320
				    BATADV_TQ_LOCAL_WINDOW_SIZE,
				    &orig_ifinfo->batman_seqno_reset, NULL)) {
1321
		ret = BATADV_PROTECTED;
1322
		goto out;
1323
	}
1324 1325

	rcu_read_lock();
1326 1327 1328 1329 1330 1331 1332 1333
	hlist_for_each_entry_rcu(neigh_node, &orig_node->neigh_list, list) {
		neigh_ifinfo = batadv_neigh_ifinfo_new(neigh_node,
						       if_outgoing);
		if (!neigh_ifinfo)
			continue;

		neigh_addr = neigh_node->addr;
		is_dup = batadv_test_bit(neigh_ifinfo->bat_iv.real_bits,
1334
					 orig_ifinfo->last_real_seqno,
1335 1336
					 seqno);

1337
		if (batadv_compare_eth(neigh_addr, ethhdr->h_source) &&
1338
		    neigh_node->if_incoming == if_incoming) {
1339
			set_mark = 1;
1340 1341 1342
			if (is_dup)
				ret = BATADV_NEIGH_DUP;
		} else {
1343
			set_mark = 0;
1344 1345 1346
			if (is_dup && (ret != BATADV_NEIGH_DUP))
				ret = BATADV_ORIG_DUP;
		}
1347 1348

		/* if the window moved, set the update flag. */
1349
		bitmap = neigh_ifinfo->bat_iv.real_bits;
1350
		need_update |= batadv_bit_get_packet(bat_priv, bitmap,
1351
						     seq_diff, set_mark);
1352

1353
		packet_count = bitmap_weight(bitmap,
1354
					     BATADV_TQ_LOCAL_WINDOW_SIZE);
1355
		neigh_ifinfo->bat_iv.real_packet_count = packet_count;
1356
		batadv_neigh_ifinfo_put(neigh_ifinfo);
1357 1358 1359 1360
	}
	rcu_read_unlock();

	if (need_update) {
1361
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1362 1363 1364 1365
			   "%s updating last_seqno: old %u, new %u\n",
			   if_outgoing ? if_outgoing->net_dev->name : "DEFAULT",
			   orig_ifinfo->last_real_seqno, seqno);
		orig_ifinfo->last_real_seqno = seqno;
1366 1367 1368
	}

out:
1369
	spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
1370
	batadv_orig_node_put(orig_node);
1371
	batadv_orig_ifinfo_put(orig_ifinfo);
1372 1373 1374
	return ret;
}

1375 1376 1377
/**
 * batadv_iv_ogm_process_per_outif - process a batman iv OGM for an outgoing if
 * @skb: the skb containing the OGM
1378
 * @ogm_offset: offset from skb->data to start of ogm header
1379 1380 1381 1382 1383 1384 1385 1386 1387
 * @orig_node: the (cached) orig node for the originator of this OGM
 * @if_incoming: the interface where this packet was received
 * @if_outgoing: the interface for which the packet should be considered
 */
static void
batadv_iv_ogm_process_per_outif(const struct sk_buff *skb, int ogm_offset,
				struct batadv_orig_node *orig_node,
				struct batadv_hard_iface *if_incoming,
				struct batadv_hard_iface *if_outgoing)
1388
{
1389
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1390
	struct batadv_hardif_neigh_node *hardif_neigh = NULL;
1391 1392
	struct batadv_neigh_node *router = NULL;
	struct batadv_neigh_node *router_router = NULL;
1393 1394
	struct batadv_orig_node *orig_neigh_node;
	struct batadv_orig_ifinfo *orig_ifinfo;
1395
	struct batadv_neigh_node *orig_neigh_router = NULL;
1396
	struct batadv_neigh_ifinfo *router_ifinfo = NULL;
1397
	struct batadv_ogm_packet *ogm_packet;
1398
	enum batadv_dup_status dup_status;
1399 1400 1401 1402 1403
	bool is_from_best_next_hop = false;
	bool is_single_hop_neigh = false;
	bool sameseq, similar_ttl;
	struct sk_buff *skb_priv;
	struct ethhdr *ethhdr;
1404
	u8 *prev_sender;
1405
	int is_bidirect;
1406

1407 1408
	/* create a private copy of the skb, as some functions change tq value
	 * and/or flags.
1409
	 */
1410 1411
	skb_priv = skb_copy(skb, GFP_ATOMIC);
	if (!skb_priv)
1412 1413
		return;

1414 1415
	ethhdr = eth_hdr(skb_priv);
	ogm_packet = (struct batadv_ogm_packet *)(skb_priv->data + ogm_offset);
1416

1417 1418 1419
	dup_status = batadv_iv_ogm_update_seqnos(ethhdr, ogm_packet,
						 if_incoming, if_outgoing);
	if (batadv_compare_eth(ethhdr->h_source, ogm_packet->orig))
1420
		is_single_hop_neigh = true;
1421

1422
	if (dup_status == BATADV_PROTECTED) {
1423
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1424 1425
			   "Drop packet: packet within seqno protection time (sender: %pM)\n",
			   ethhdr->h_source);
1426 1427 1428
		goto out;
	}

1429
	if (ogm_packet->tq == 0) {
1430
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1431
			   "Drop packet: originator packet with tq equal 0\n");
1432 1433 1434
		goto out;
	}

1435 1436 1437 1438 1439 1440 1441
	if (is_single_hop_neigh) {
		hardif_neigh = batadv_hardif_neigh_get(if_incoming,
						       ethhdr->h_source);
		if (hardif_neigh)
			hardif_neigh->last_seen = jiffies;
	}

1442
	router = batadv_orig_router_get(orig_node, if_outgoing);
1443
	if (router) {
1444 1445 1446
		router_router = batadv_orig_router_get(router->orig_node,
						       if_outgoing);
		router_ifinfo = batadv_neigh_ifinfo_get(router, if_outgoing);
1447
	}
1448

1449
	if ((router_ifinfo && router_ifinfo->bat_iv.tq_avg != 0) &&
1450
	    (batadv_compare_eth(router->addr, ethhdr->h_source)))
1451 1452
		is_from_best_next_hop = true;

1453
	prev_sender = ogm_packet->prev_sender;
1454 1455
	/* avoid temporary routing loops */
	if (router && router_router &&
1456
	    (batadv_compare_eth(router->addr, prev_sender)) &&
1457
	    !(batadv_compare_eth(ogm_packet->orig, prev_sender)) &&
1458
	    (batadv_compare_eth(router->addr, router_router->addr))) {
1459
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1460 1461
			   "Drop packet: ignoring all rebroadcast packets that may make me loop (sender: %pM)\n",
			   ethhdr->h_source);
1462 1463 1464
		goto out;
	}

1465 1466
	if (if_outgoing == BATADV_IF_DEFAULT)
		batadv_tvlv_ogm_receive(bat_priv, ogm_packet, orig_node);
1467

1468
	/* if sender is a direct neighbor the sender mac equals
1469 1470
	 * originator mac
	 */
1471 1472 1473
	if (is_single_hop_neigh)
		orig_neigh_node = orig_node;
	else
1474 1475
		orig_neigh_node = batadv_iv_ogm_orig_get(bat_priv,
							 ethhdr->h_source);
1476

1477 1478 1479
	if (!orig_neigh_node)
		goto out;

1480 1481
	/* Update nc_nodes of the originator */
	batadv_nc_update_nc_node(bat_priv, orig_node, orig_neigh_node,
1482
				 ogm_packet, is_single_hop_neigh);
1483

1484 1485
	orig_neigh_router = batadv_orig_router_get(orig_neigh_node,
						   if_outgoing);
1486 1487

	/* drop packet if sender is not a direct neighbor and if we
1488 1489
	 * don't route towards it
	 */
1490
	if (!is_single_hop_neigh && (!orig_neigh_router)) {
1491
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1492
			   "Drop packet: OGM via unknown neighbor!\n");
1493 1494 1495
		goto out_neigh;
	}

1496
	is_bidirect = batadv_iv_ogm_calc_tq(orig_node, orig_neigh_node,
1497 1498
					    ogm_packet, if_incoming,
					    if_outgoing);
1499 1500

	/* update ranking if it is not a duplicate or has the same
1501 1502
	 * seqno and similar ttl as the non-duplicate
	 */
1503 1504 1505 1506 1507 1508 1509
	orig_ifinfo = batadv_orig_ifinfo_new(orig_node, if_outgoing);
	if (!orig_ifinfo)
		goto out_neigh;

	sameseq = orig_ifinfo->last_real_seqno == ntohl(ogm_packet->seqno);
	similar_ttl = (orig_ifinfo->last_ttl - 3) <= ogm_packet->ttl;

1510
	if (is_bidirect && ((dup_status == BATADV_NO_DUP) ||
1511 1512 1513 1514 1515 1516
			    (sameseq && similar_ttl))) {
		batadv_iv_ogm_orig_update(bat_priv, orig_node,
					  orig_ifinfo, ethhdr,
					  ogm_packet, if_incoming,
					  if_outgoing, dup_status);
	}
1517
	batadv_orig_ifinfo_put(orig_ifinfo);
1518

1519 1520 1521 1522
	/* only forward for specific interface, not for the default one. */
	if (if_outgoing == BATADV_IF_DEFAULT)
		goto out_neigh;

1523 1524
	/* is single hop (direct) neighbor */
	if (is_single_hop_neigh) {
1525 1526 1527 1528 1529 1530 1531 1532 1533
		/* OGMs from secondary interfaces should only scheduled once
		 * per interface where it has been received, not multiple times
		 */
		if ((ogm_packet->ttl <= 2) &&
		    (if_incoming != if_outgoing)) {
			batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
				   "Drop packet: OGM from secondary interface and wrong outgoing interface\n");
			goto out_neigh;
		}
1534
		/* mark direct link on incoming interface */
1535
		batadv_iv_ogm_forward(orig_node, ethhdr, ogm_packet,
1536
				      is_single_hop_neigh,
1537 1538
				      is_from_best_next_hop, if_incoming,
				      if_outgoing);
1539

1540
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1541
			   "Forwarding packet: rebroadcast neighbor packet with direct link flag\n");
1542 1543 1544 1545
		goto out_neigh;
	}

	/* multihop originator */
1546
	if (!is_bidirect) {
1547
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1548
			   "Drop packet: not received via bidirectional link\n");
1549 1550 1551
		goto out_neigh;
	}

1552
	if (dup_status == BATADV_NEIGH_DUP) {
1553
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1554
			   "Drop packet: duplicate packet received\n");
1555 1556 1557
		goto out_neigh;
	}

1558
	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1559
		   "Forwarding packet: rebroadcast originator packet\n");
1560
	batadv_iv_ogm_forward(orig_node, ethhdr, ogm_packet,
1561
			      is_single_hop_neigh, is_from_best_next_hop,
1562
			      if_incoming, if_outgoing);
1563 1564 1565

out_neigh:
	if ((orig_neigh_node) && (!is_single_hop_neigh))
1566
		batadv_orig_node_put(orig_neigh_node);
1567
out:
1568
	if (router_ifinfo)
1569
		batadv_neigh_ifinfo_put(router_ifinfo);
1570
	if (router)
1571
		batadv_neigh_node_put(router);
1572
	if (router_router)
1573
		batadv_neigh_node_put(router_router);
1574
	if (orig_neigh_router)
1575
		batadv_neigh_node_put(orig_neigh_router);
1576
	if (hardif_neigh)
1577
		batadv_hardif_neigh_put(hardif_neigh);
1578

1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594
	kfree_skb(skb_priv);
}

/**
 * batadv_iv_ogm_process - process an incoming batman iv OGM
 * @skb: the skb containing the OGM
 * @ogm_offset: offset to the OGM which should be processed (for aggregates)
 * @if_incoming: the interface where this packet was receved
 */
static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset,
				  struct batadv_hard_iface *if_incoming)
{
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
	struct batadv_orig_node *orig_neigh_node, *orig_node;
	struct batadv_hard_iface *hard_iface;
	struct batadv_ogm_packet *ogm_packet;
1595
	u32 if_incoming_seqno;
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667
	bool has_directlink_flag;
	struct ethhdr *ethhdr;
	bool is_my_oldorig = false;
	bool is_my_addr = false;
	bool is_my_orig = false;

	ogm_packet = (struct batadv_ogm_packet *)(skb->data + ogm_offset);
	ethhdr = eth_hdr(skb);

	/* Silently drop when the batman packet is actually not a
	 * correct packet.
	 *
	 * This might happen if a packet is padded (e.g. Ethernet has a
	 * minimum frame length of 64 byte) and the aggregation interprets
	 * it as an additional length.
	 *
	 * TODO: A more sane solution would be to have a bit in the
	 * batadv_ogm_packet to detect whether the packet is the last
	 * packet in an aggregation.  Here we expect that the padding
	 * is always zero (or not 0x01)
	 */
	if (ogm_packet->packet_type != BATADV_IV_OGM)
		return;

	/* could be changed by schedule_own_packet() */
	if_incoming_seqno = atomic_read(&if_incoming->bat_iv.ogm_seqno);

	if (ogm_packet->flags & BATADV_DIRECTLINK)
		has_directlink_flag = true;
	else
		has_directlink_flag = false;

	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
		   "Received BATMAN packet via NB: %pM, IF: %s [%pM] (from OG: %pM, via prev OG: %pM, seqno %u, tq %d, TTL %d, V %d, IDF %d)\n",
		   ethhdr->h_source, if_incoming->net_dev->name,
		   if_incoming->net_dev->dev_addr, ogm_packet->orig,
		   ogm_packet->prev_sender, ntohl(ogm_packet->seqno),
		   ogm_packet->tq, ogm_packet->ttl,
		   ogm_packet->version, has_directlink_flag);

	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 != if_incoming->soft_iface)
			continue;

		if (batadv_compare_eth(ethhdr->h_source,
				       hard_iface->net_dev->dev_addr))
			is_my_addr = true;

		if (batadv_compare_eth(ogm_packet->orig,
				       hard_iface->net_dev->dev_addr))
			is_my_orig = true;

		if (batadv_compare_eth(ogm_packet->prev_sender,
				       hard_iface->net_dev->dev_addr))
			is_my_oldorig = true;
	}
	rcu_read_unlock();

	if (is_my_addr) {
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
			   "Drop packet: received my own broadcast (sender: %pM)\n",
			   ethhdr->h_source);
		return;
	}

	if (is_my_orig) {
		unsigned long *word;
		int offset;
1668 1669 1670
		s32 bit_pos;
		s16 if_num;
		u8 *weight;
1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687

		orig_neigh_node = batadv_iv_ogm_orig_get(bat_priv,
							 ethhdr->h_source);
		if (!orig_neigh_node)
			return;

		/* neighbor has to indicate direct link and it has to
		 * come via the corresponding interface
		 * save packet seqno for bidirectional check
		 */
		if (has_directlink_flag &&
		    batadv_compare_eth(if_incoming->net_dev->dev_addr,
				       ogm_packet->orig)) {
			if_num = if_incoming->if_num;
			offset = if_num * BATADV_NUM_WORDS;

			spin_lock_bh(&orig_neigh_node->bat_iv.ogm_cnt_lock);
1688
			word = &orig_neigh_node->bat_iv.bcast_own[offset];
1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699
			bit_pos = if_incoming_seqno - 2;
			bit_pos -= ntohl(ogm_packet->seqno);
			batadv_set_bit(word, bit_pos);
			weight = &orig_neigh_node->bat_iv.bcast_own_sum[if_num];
			*weight = bitmap_weight(word,
						BATADV_TQ_LOCAL_WINDOW_SIZE);
			spin_unlock_bh(&orig_neigh_node->bat_iv.ogm_cnt_lock);
		}

		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
			   "Drop packet: originator packet from myself (via neighbor)\n");
1700
		batadv_orig_node_put(orig_neigh_node);
1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737
		return;
	}

	if (is_my_oldorig) {
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
			   "Drop packet: ignoring all rebroadcast echos (sender: %pM)\n",
			   ethhdr->h_source);
		return;
	}

	if (ogm_packet->flags & BATADV_NOT_BEST_NEXT_HOP) {
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
			   "Drop packet: ignoring all packets not forwarded from the best next hop (sender: %pM)\n",
			   ethhdr->h_source);
		return;
	}

	orig_node = batadv_iv_ogm_orig_get(bat_priv, ogm_packet->orig);
	if (!orig_node)
		return;

	batadv_iv_ogm_process_per_outif(skb, ogm_offset, orig_node,
					if_incoming, BATADV_IF_DEFAULT);

	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;

		batadv_iv_ogm_process_per_outif(skb, ogm_offset, orig_node,
						if_incoming, hard_iface);
	}
	rcu_read_unlock();

1738
	batadv_orig_node_put(orig_node);
1739 1740
}

1741
static int batadv_iv_ogm_receive(struct sk_buff *skb,
1742
				 struct batadv_hard_iface *if_incoming)
1743
{
1744
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1745
	struct batadv_ogm_packet *ogm_packet;
1746
	u8 *packet_pos;
1747
	int ogm_offset;
1748
	bool ret;
1749

1750
	ret = batadv_check_management_packet(skb, if_incoming, BATADV_OGM_HLEN);
1751 1752
	if (!ret)
		return NET_RX_DROP;
1753

1754 1755 1756
	/* did we receive a B.A.T.M.A.N. IV OGM packet on an interface
	 * that does not have B.A.T.M.A.N. IV enabled ?
	 */
1757
	if (bat_priv->bat_algo_ops->bat_ogm_emit != batadv_iv_ogm_emit)
1758 1759
		return NET_RX_DROP;

1760 1761
	batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_RX);
	batadv_add_counter(bat_priv, BATADV_CNT_MGMT_RX_BYTES,
1762 1763
			   skb->len + ETH_HLEN);

1764 1765
	ogm_offset = 0;
	ogm_packet = (struct batadv_ogm_packet *)skb->data;
1766 1767

	/* unpack the aggregated packets and process them one by one */
1768 1769 1770
	while (batadv_iv_ogm_aggr_packet(ogm_offset, skb_headlen(skb),
					 ogm_packet->tvlv_len)) {
		batadv_iv_ogm_process(skb, ogm_offset, if_incoming);
1771

1772 1773
		ogm_offset += BATADV_OGM_HLEN;
		ogm_offset += ntohs(ogm_packet->tvlv_len);
1774

1775 1776
		packet_pos = skb->data + ogm_offset;
		ogm_packet = (struct batadv_ogm_packet *)packet_pos;
1777
	}
1778 1779 1780

	kfree_skb(skb);
	return NET_RX_SUCCESS;
1781
}
1782

1783 1784
/**
 * batadv_iv_ogm_orig_print_neigh - print neighbors for the originator table
1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807
 * @orig_node: the orig_node for which the neighbors are printed
 * @if_outgoing: outgoing interface for these entries
 * @seq: debugfs table seq_file struct
 *
 * Must be called while holding an rcu lock.
 */
static void
batadv_iv_ogm_orig_print_neigh(struct batadv_orig_node *orig_node,
			       struct batadv_hard_iface *if_outgoing,
			       struct seq_file *seq)
{
	struct batadv_neigh_node *neigh_node;
	struct batadv_neigh_ifinfo *n_ifinfo;

	hlist_for_each_entry_rcu(neigh_node, &orig_node->neigh_list, list) {
		n_ifinfo = batadv_neigh_ifinfo_get(neigh_node, if_outgoing);
		if (!n_ifinfo)
			continue;

		seq_printf(seq, " %pM (%3i)",
			   neigh_node->addr,
			   n_ifinfo->bat_iv.tq_avg);

1808
		batadv_neigh_ifinfo_put(n_ifinfo);
1809 1810 1811
	}
}

1812 1813 1814 1815
/**
 * batadv_iv_ogm_orig_print - print the originator table
 * @bat_priv: the bat priv with all the soft interface information
 * @seq: debugfs table seq_file struct
1816
 * @if_outgoing: the outgoing interface for which this should be printed
1817 1818
 */
static void batadv_iv_ogm_orig_print(struct batadv_priv *bat_priv,
1819 1820
				     struct seq_file *seq,
				     struct batadv_hard_iface *if_outgoing)
1821
{
1822
	struct batadv_neigh_node *neigh_node;
1823 1824 1825
	struct batadv_hashtable *hash = bat_priv->orig_hash;
	int last_seen_msecs, last_seen_secs;
	struct batadv_orig_node *orig_node;
1826
	struct batadv_neigh_ifinfo *n_ifinfo;
1827 1828 1829
	unsigned long last_seen_jiffies;
	struct hlist_head *head;
	int batman_count = 0;
1830
	u32 i;
1831 1832 1833 1834 1835 1836 1837 1838 1839 1840

	seq_printf(seq, "  %-15s %s (%s/%i) %17s [%10s]: %20s ...\n",
		   "Originator", "last-seen", "#", BATADV_TQ_MAX_VALUE,
		   "Nexthop", "outgoingIF", "Potential nexthops");

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

		rcu_read_lock();
		hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
1841
			neigh_node = batadv_orig_router_get(orig_node,
1842
							    if_outgoing);
1843 1844 1845
			if (!neigh_node)
				continue;

1846
			n_ifinfo = batadv_neigh_ifinfo_get(neigh_node,
1847
							   if_outgoing);
1848 1849 1850 1851
			if (!n_ifinfo)
				goto next;

			if (n_ifinfo->bat_iv.tq_avg == 0)
1852 1853 1854 1855 1856 1857 1858 1859 1860
				goto next;

			last_seen_jiffies = jiffies - orig_node->last_seen;
			last_seen_msecs = jiffies_to_msecs(last_seen_jiffies);
			last_seen_secs = last_seen_msecs / 1000;
			last_seen_msecs = last_seen_msecs % 1000;

			seq_printf(seq, "%pM %4i.%03is   (%3i) %pM [%10s]:",
				   orig_node->orig, last_seen_secs,
1861
				   last_seen_msecs, n_ifinfo->bat_iv.tq_avg,
1862 1863 1864
				   neigh_node->addr,
				   neigh_node->if_incoming->net_dev->name);

1865 1866
			batadv_iv_ogm_orig_print_neigh(orig_node, if_outgoing,
						       seq);
1867 1868 1869 1870
			seq_puts(seq, "\n");
			batman_count++;

next:
1871
			batadv_neigh_node_put(neigh_node);
1872
			if (n_ifinfo)
1873
				batadv_neigh_ifinfo_put(n_ifinfo);
1874 1875 1876 1877 1878 1879 1880 1881
		}
		rcu_read_unlock();
	}

	if (batman_count == 0)
		seq_puts(seq, "No batman nodes in range ...\n");
}

1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933
/**
 * batadv_iv_hardif_neigh_print - print a single hop neighbour node
 * @seq: neighbour table seq_file struct
 * @hardif_neigh: hardif neighbour information
 */
static void
batadv_iv_hardif_neigh_print(struct seq_file *seq,
			     struct batadv_hardif_neigh_node *hardif_neigh)
{
	int last_secs, last_msecs;

	last_secs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) / 1000;
	last_msecs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) % 1000;

	seq_printf(seq, "   %10s   %pM %4i.%03is\n",
		   hardif_neigh->if_incoming->net_dev->name,
		   hardif_neigh->addr, last_secs, last_msecs);
}

/**
 * batadv_iv_ogm_neigh_print - print the single hop neighbour list
 * @bat_priv: the bat priv with all the soft interface information
 * @seq: neighbour table seq_file struct
 */
static void batadv_iv_neigh_print(struct batadv_priv *bat_priv,
				  struct seq_file *seq)
{
	struct net_device *net_dev = (struct net_device *)seq->private;
	struct batadv_hardif_neigh_node *hardif_neigh;
	struct batadv_hard_iface *hard_iface;
	int batman_count = 0;

	seq_printf(seq, "   %10s        %-13s %s\n",
		   "IF", "Neighbor", "last-seen");

	rcu_read_lock();
	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
		if (hard_iface->soft_iface != net_dev)
			continue;

		hlist_for_each_entry_rcu(hardif_neigh,
					 &hard_iface->neigh_list, list) {
			batadv_iv_hardif_neigh_print(seq, hardif_neigh);
			batman_count++;
		}
	}
	rcu_read_unlock();

	if (batman_count == 0)
		seq_puts(seq, "No batman nodes in range ...\n");
}

1934 1935 1936
/**
 * batadv_iv_ogm_neigh_cmp - compare the metrics of two neighbors
 * @neigh1: the first neighbor object of the comparison
1937
 * @if_outgoing1: outgoing interface for the first neighbor
1938
 * @neigh2: the second neighbor object of the comparison
1939
 * @if_outgoing2: outgoing interface for the second neighbor
1940
 *
1941
 * Return: a value less, equal to or greater than 0 if the metric via neigh1 is
1942 1943 1944
 * lower, the same as or higher than the metric via neigh2
 */
static int batadv_iv_ogm_neigh_cmp(struct batadv_neigh_node *neigh1,
1945 1946 1947
				   struct batadv_hard_iface *if_outgoing1,
				   struct batadv_neigh_node *neigh2,
				   struct batadv_hard_iface *if_outgoing2)
1948
{
1949
	struct batadv_neigh_ifinfo *neigh1_ifinfo, *neigh2_ifinfo;
1950
	u8 tq1, tq2;
1951 1952 1953 1954
	int diff;

	neigh1_ifinfo = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
	neigh2_ifinfo = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);
1955

1956 1957 1958 1959
	if (!neigh1_ifinfo || !neigh2_ifinfo) {
		diff = 0;
		goto out;
	}
1960

1961 1962 1963 1964 1965 1966
	tq1 = neigh1_ifinfo->bat_iv.tq_avg;
	tq2 = neigh2_ifinfo->bat_iv.tq_avg;
	diff = tq1 - tq2;

out:
	if (neigh1_ifinfo)
1967
		batadv_neigh_ifinfo_put(neigh1_ifinfo);
1968
	if (neigh2_ifinfo)
1969
		batadv_neigh_ifinfo_put(neigh2_ifinfo);
1970 1971

	return diff;
1972 1973
}

1974
/**
1975 1976
 * batadv_iv_ogm_neigh_is_sob - check if neigh1 is similarly good or better
 *  than neigh2 from the metric prospective
1977
 * @neigh1: the first neighbor object of the comparison
1978
 * @if_outgoing1: outgoing interface for the first neighbor
1979
 * @neigh2: the second neighbor object of the comparison
1980
 * @if_outgoing2: outgoing interface for the second neighbor
1981
 *
1982
 * Return: true if the metric via neigh1 is equally good or better than
1983
 * the metric via neigh2, false otherwise.
1984
 */
1985
static bool
1986
batadv_iv_ogm_neigh_is_sob(struct batadv_neigh_node *neigh1,
1987 1988 1989
			   struct batadv_hard_iface *if_outgoing1,
			   struct batadv_neigh_node *neigh2,
			   struct batadv_hard_iface *if_outgoing2)
1990
{
1991
	struct batadv_neigh_ifinfo *neigh1_ifinfo, *neigh2_ifinfo;
1992
	u8 tq1, tq2;
1993
	bool ret;
1994

1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
	neigh1_ifinfo = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
	neigh2_ifinfo = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);

	/* we can't say that the metric is better */
	if (!neigh1_ifinfo || !neigh2_ifinfo) {
		ret = false;
		goto out;
	}

	tq1 = neigh1_ifinfo->bat_iv.tq_avg;
	tq2 = neigh2_ifinfo->bat_iv.tq_avg;
	ret = (tq1 - tq2) > -BATADV_TQ_SIMILARITY_THRESHOLD;

out:
	if (neigh1_ifinfo)
2010
		batadv_neigh_ifinfo_put(neigh1_ifinfo);
2011
	if (neigh2_ifinfo)
2012
		batadv_neigh_ifinfo_put(neigh2_ifinfo);
2013 2014

	return ret;
2015 2016
}

2017
static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
2018
	.name = "BATMAN_IV",
2019 2020 2021 2022 2023 2024
	.bat_iface_enable = batadv_iv_ogm_iface_enable,
	.bat_iface_disable = batadv_iv_ogm_iface_disable,
	.bat_iface_update_mac = batadv_iv_ogm_iface_update_mac,
	.bat_primary_iface_set = batadv_iv_ogm_primary_iface_set,
	.bat_ogm_schedule = batadv_iv_ogm_schedule,
	.bat_ogm_emit = batadv_iv_ogm_emit,
2025
	.bat_neigh_cmp = batadv_iv_ogm_neigh_cmp,
2026
	.bat_neigh_is_similar_or_better = batadv_iv_ogm_neigh_is_sob,
2027
	.bat_neigh_print = batadv_iv_neigh_print,
2028
	.bat_orig_print = batadv_iv_ogm_orig_print,
2029 2030 2031
	.bat_orig_free = batadv_iv_ogm_orig_free,
	.bat_orig_add_if = batadv_iv_ogm_orig_add_if,
	.bat_orig_del_if = batadv_iv_ogm_orig_del_if,
2032 2033
};

2034
int __init batadv_iv_init(void)
2035
{
2036 2037 2038
	int ret;

	/* batman originator packet */
2039 2040
	ret = batadv_recv_handler_register(BATADV_IV_OGM,
					   batadv_iv_ogm_receive);
2041 2042 2043
	if (ret < 0)
		goto out;

2044
	ret = batadv_algo_register(&batadv_batman_iv);
2045 2046 2047 2048 2049 2050
	if (ret < 0)
		goto handler_unregister;

	goto out;

handler_unregister:
2051
	batadv_recv_handler_unregister(BATADV_IV_OGM);
2052 2053
out:
	return ret;
2054
}