bat_iv_ogm.c 42.3 KB
Newer Older
1
/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
 *
 * 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
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA
 */

#include "main.h"
#include "translation-table.h"
#include "originator.h"
#include "routing.h"
#include "gateway_common.h"
#include "gateway_client.h"
#include "hard-interface.h"
#include "send.h"
28
#include "bat_algo.h"
29
#include "network-coding.h"
30

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
/**
 * 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
 */
static void batadv_ring_buffer_set(uint8_t lq_recv[], uint8_t *lq_index,
				   uint8_t value)
{
	lq_recv[*lq_index] = value;
	*lq_index = (*lq_index + 1) % BATADV_TQ_GLOBAL_WINDOW_SIZE;
}

/**
 * batadv_ring_buffer_set - compute the average of all non-zero values stored
 * in the given ring buffer
 * @lq_recv: pointer to the ring buffer
 *
 * Returns computed average value.
 */
static uint8_t batadv_ring_buffer_avg(const uint8_t lq_recv[])
{
	const uint8_t *ptr;
	uint16_t count = 0, i = 0, sum = 0;

	ptr = lq_recv;

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

		i++;
		ptr++;
	}

	if (count == 0)
		return 0;

	return (uint8_t)(sum / count);
}
73 74 75 76
static struct batadv_neigh_node *
batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface,
			const uint8_t *neigh_addr,
			struct batadv_orig_node *orig_node,
77
			struct batadv_orig_node *orig_neigh)
78
{
79
	struct batadv_neigh_node *neigh_node;
80

81
	neigh_node = batadv_neigh_node_new(hard_iface, neigh_addr);
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
	if (!neigh_node)
		goto out;

	INIT_LIST_HEAD(&neigh_node->bonding_list);

	neigh_node->orig_node = orig_neigh;
	neigh_node->if_incoming = hard_iface;

	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);

out:
	return neigh_node;
}

98
static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
99
{
100
	struct batadv_ogm_packet *batadv_ogm_packet;
101
	unsigned char *ogm_buff;
102
	uint32_t random_seqno;
103
	int res = -ENOMEM;
104 105 106

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

109 110 111
	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)
112 113
		goto out;

114 115 116
	hard_iface->bat_iv.ogm_buff = ogm_buff;

	batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
117 118 119 120 121 122 123
	batadv_ogm_packet->header.packet_type = BATADV_IV_OGM;
	batadv_ogm_packet->header.version = BATADV_COMPAT_VERSION;
	batadv_ogm_packet->header.ttl = 2;
	batadv_ogm_packet->flags = BATADV_NO_FLAGS;
	batadv_ogm_packet->tq = BATADV_TQ_MAX_VALUE;
	batadv_ogm_packet->tt_num_changes = 0;
	batadv_ogm_packet->ttvn = 0;
124 125 126 127 128

	res = 0;

out:
	return res;
129 130
}

131
static void batadv_iv_ogm_iface_disable(struct batadv_hard_iface *hard_iface)
132
{
133 134
	kfree(hard_iface->bat_iv.ogm_buff);
	hard_iface->bat_iv.ogm_buff = NULL;
135 136
}

137
static void batadv_iv_ogm_iface_update_mac(struct batadv_hard_iface *hard_iface)
138
{
139
	struct batadv_ogm_packet *batadv_ogm_packet;
140
	unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
141

142
	batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
143
	memcpy(batadv_ogm_packet->orig,
144
	       hard_iface->net_dev->dev_addr, ETH_ALEN);
145
	memcpy(batadv_ogm_packet->prev_sender,
146
	       hard_iface->net_dev->dev_addr, ETH_ALEN);
147 148
}

149 150
static void
batadv_iv_ogm_primary_iface_set(struct batadv_hard_iface *hard_iface)
151
{
152
	struct batadv_ogm_packet *batadv_ogm_packet;
153
	unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
154

155
	batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
156 157
	batadv_ogm_packet->flags = BATADV_PRIMARIES_FIRST_HOP;
	batadv_ogm_packet->header.ttl = BATADV_TTL;
158 159
}

160
/* when do we schedule our own ogm to be sent */
161
static unsigned long
162
batadv_iv_ogm_emit_send_time(const struct batadv_priv *bat_priv)
163
{
164 165 166
	unsigned int msecs;

	msecs = atomic_read(&bat_priv->orig_interval) - BATADV_JITTER;
167
	msecs += prandom_u32() % (2 * BATADV_JITTER);
168 169

	return jiffies + msecs_to_jiffies(msecs);
170 171 172
}

/* when do we schedule a ogm packet to be sent */
173
static unsigned long batadv_iv_ogm_fwd_send_time(void)
174
{
175
	return jiffies + msecs_to_jiffies(prandom_u32() % (BATADV_JITTER / 2));
176 177 178
}

/* apply hop penalty for a normal link */
179 180
static uint8_t batadv_hop_penalty(uint8_t tq,
				  const struct batadv_priv *bat_priv)
181 182
{
	int hop_penalty = atomic_read(&bat_priv->hop_penalty);
183 184 185 186 187 188
	int new_tq;

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

	return new_tq;
189 190
}

191
/* is there another aggregated packet here? */
192 193
static int batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len,
				     int tt_num_changes)
194
{
195 196
	int next_buff_pos = 0;

197
	next_buff_pos += buff_pos + BATADV_OGM_HLEN;
198
	next_buff_pos += batadv_tt_len(tt_num_changes);
199 200

	return (next_buff_pos <= packet_len) &&
201
	       (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES);
202 203
}

204
/* send a batman ogm to a given interface */
205 206
static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet,
				     struct batadv_hard_iface *hard_iface)
207
{
208
	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
209 210 211
	char *fwd_str;
	uint8_t packet_num;
	int16_t buff_pos;
212
	struct batadv_ogm_packet *batadv_ogm_packet;
213
	struct sk_buff *skb;
214
	uint8_t *packet_pos;
215

216
	if (hard_iface->if_status != BATADV_IF_ACTIVE)
217 218 219 220
		return;

	packet_num = 0;
	buff_pos = 0;
221 222
	packet_pos = forw_packet->skb->data;
	batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos;
223 224

	/* adjust all flags and log packets */
225
	while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len,
226
					 batadv_ogm_packet->tt_num_changes)) {
227
		/* we might have aggregated direct link packets with an
228 229
		 * ordinary base packet
		 */
230 231
		if (forw_packet->direct_link_flags & BIT(packet_num) &&
		    forw_packet->if_incoming == hard_iface)
232
			batadv_ogm_packet->flags |= BATADV_DIRECTLINK;
233
		else
234
			batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK;
235

236 237 238 239 240
		if (packet_num > 0 || !forw_packet->own)
			fwd_str = "Forwarding";
		else
			fwd_str = "Sending own";

241
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
242 243
			   "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s, ttvn %d) on interface %s [%pM]\n",
			   fwd_str, (packet_num > 0 ? "aggregated " : ""),
244 245 246 247
			   batadv_ogm_packet->orig,
			   ntohl(batadv_ogm_packet->seqno),
			   batadv_ogm_packet->tq, batadv_ogm_packet->header.ttl,
			   (batadv_ogm_packet->flags & BATADV_DIRECTLINK ?
248
			    "on" : "off"),
249
			   batadv_ogm_packet->ttvn, hard_iface->net_dev->name,
250
			   hard_iface->net_dev->dev_addr);
251

252
		buff_pos += BATADV_OGM_HLEN;
253
		buff_pos += batadv_tt_len(batadv_ogm_packet->tt_num_changes);
254
		packet_num++;
255 256
		packet_pos = forw_packet->skb->data + buff_pos;
		batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos;
257 258 259 260
	}

	/* create clone because function is called more than once */
	skb = skb_clone(forw_packet->skb, GFP_ATOMIC);
261
	if (skb) {
262 263
		batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_TX);
		batadv_add_counter(bat_priv, BATADV_CNT_MGMT_TX_BYTES,
264
				   skb->len + ETH_HLEN);
265
		batadv_send_skb_packet(skb, hard_iface, batadv_broadcast_addr);
266
	}
267 268 269
}

/* send a batman ogm packet */
270
static void batadv_iv_ogm_emit(struct batadv_forw_packet *forw_packet)
271
{
272
	struct batadv_hard_iface *hard_iface;
273
	struct net_device *soft_iface;
274 275
	struct batadv_priv *bat_priv;
	struct batadv_hard_iface *primary_if = NULL;
276
	struct batadv_ogm_packet *batadv_ogm_packet;
277
	unsigned char directlink;
278
	uint8_t *packet_pos;
279

280 281
	packet_pos = forw_packet->skb->data;
	batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos;
282
	directlink = (batadv_ogm_packet->flags & BATADV_DIRECTLINK ? 1 : 0);
283 284

	if (!forw_packet->if_incoming) {
285
		pr_err("Error - can't forward packet: incoming iface not specified\n");
286 287 288 289 290 291
		goto out;
	}

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

292
	if (forw_packet->if_incoming->if_status != BATADV_IF_ACTIVE)
293 294
		goto out;

295
	primary_if = batadv_primary_if_get_selected(bat_priv);
296 297 298
	if (!primary_if)
		goto out;

299 300 301
	/* multihomed peer assumed
	 * non-primary OGMs are only broadcasted on their interface
	 */
302
	if ((directlink && (batadv_ogm_packet->header.ttl == 1)) ||
303 304
	    (forw_packet->own && (forw_packet->if_incoming != primary_if))) {
		/* FIXME: what about aggregated packets ? */
305
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
306 307
			   "%s packet (originator %pM, seqno %u, TTL %d) on interface %s [%pM]\n",
			   (forw_packet->own ? "Sending own" : "Forwarding"),
308 309 310
			   batadv_ogm_packet->orig,
			   ntohl(batadv_ogm_packet->seqno),
			   batadv_ogm_packet->header.ttl,
311 312
			   forw_packet->if_incoming->net_dev->name,
			   forw_packet->if_incoming->net_dev->dev_addr);
313 314

		/* skb is only used once and than forw_packet is free'd */
315 316
		batadv_send_skb_packet(forw_packet->skb,
				       forw_packet->if_incoming,
317
				       batadv_broadcast_addr);
318 319 320 321 322 323 324
		forw_packet->skb = NULL;

		goto out;
	}

	/* broadcast on every interface */
	rcu_read_lock();
325
	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
326 327 328
		if (hard_iface->soft_iface != soft_iface)
			continue;

329
		batadv_iv_ogm_send_to_if(forw_packet, hard_iface);
330 331 332 333 334
	}
	rcu_read_unlock();

out:
	if (primary_if)
335
		batadv_hardif_free_ref(primary_if);
336 337 338
}

/* return true if new_packet can be aggregated with forw_packet */
339
static bool
340
batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet,
341
			    struct batadv_priv *bat_priv,
342 343
			    int packet_len, unsigned long send_time,
			    bool directlink,
344 345
			    const struct batadv_hard_iface *if_incoming,
			    const struct batadv_forw_packet *forw_packet)
346
{
347
	struct batadv_ogm_packet *batadv_ogm_packet;
348
	int aggregated_bytes = forw_packet->packet_len + packet_len;
349
	struct batadv_hard_iface *primary_if = NULL;
350
	bool res = false;
351
	unsigned long aggregation_end_time;
352

353
	batadv_ogm_packet = (struct batadv_ogm_packet *)forw_packet->skb->data;
354 355
	aggregation_end_time = send_time;
	aggregation_end_time += msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS);
356

357
	/* we can aggregate the current packet to this aggregated packet
358 359 360 361 362 363 364
	 * if:
	 *
	 * - the send time is within our MAX_AGGREGATION_MS time
	 * - the resulting packet wont be bigger than
	 *   MAX_AGGREGATION_BYTES
	 */
	if (time_before(send_time, forw_packet->send_time) &&
365 366
	    time_after_eq(aggregation_end_time, forw_packet->send_time) &&
	    (aggregated_bytes <= BATADV_MAX_AGGREGATION_BYTES)) {
367
		/* check aggregation compatibility
368 369 370 371 372 373
		 * -> 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
		 */
374
		primary_if = batadv_primary_if_get_selected(bat_priv);
375 376 377 378
		if (!primary_if)
			goto out;

		/* packets without direct link flag and high TTL
379 380
		 * are flooded through the net
		 */
381
		if ((!directlink) &&
382 383
		    (!(batadv_ogm_packet->flags & BATADV_DIRECTLINK)) &&
		    (batadv_ogm_packet->header.ttl != 1) &&
384 385

		    /* own packets originating non-primary
386 387
		     * interfaces leave only that interface
		     */
388 389 390 391 392 393 394
		    ((!forw_packet->own) ||
		     (forw_packet->if_incoming == primary_if))) {
			res = true;
			goto out;
		}

		/* if the incoming packet is sent via this one
395 396
		 * interface only - we still can aggregate
		 */
397
		if ((directlink) &&
398
		    (new_bat_ogm_packet->header.ttl == 1) &&
399 400 401 402
		    (forw_packet->if_incoming == if_incoming) &&

		    /* packets from direct neighbors or
		     * own secondary interface packets
403 404
		     * (= secondary interface packets in general)
		     */
405
		    (batadv_ogm_packet->flags & BATADV_DIRECTLINK ||
406 407 408 409 410 411 412 413 414
		     (forw_packet->own &&
		      forw_packet->if_incoming != primary_if))) {
			res = true;
			goto out;
		}
	}

out:
	if (primary_if)
415
		batadv_hardif_free_ref(primary_if);
416 417 418 419
	return res;
}

/* create a new aggregated packet and add this packet to it */
420 421 422
static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,
					int packet_len, unsigned long send_time,
					bool direct_link,
423
					struct batadv_hard_iface *if_incoming,
424
					int own_packet)
425
{
426 427
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
	struct batadv_forw_packet *forw_packet_aggr;
428
	unsigned char *skb_buff;
429
	unsigned int skb_size;
430 431 432 433 434 435

	if (!atomic_inc_not_zero(&if_incoming->refcount))
		return;

	/* own packet should always be scheduled */
	if (!own_packet) {
436
		if (!batadv_atomic_dec_not_zero(&bat_priv->batman_queue_left)) {
437
			batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
438
				   "batman packet queue full\n");
439 440 441 442 443 444 445 446 447 448 449 450
			goto out;
		}
	}

	forw_packet_aggr = kmalloc(sizeof(*forw_packet_aggr), GFP_ATOMIC);
	if (!forw_packet_aggr) {
		if (!own_packet)
			atomic_inc(&bat_priv->batman_queue_left);
		goto out;
	}

	if ((atomic_read(&bat_priv->aggregated_ogms)) &&
451
	    (packet_len < BATADV_MAX_AGGREGATION_BYTES))
452
		skb_size = BATADV_MAX_AGGREGATION_BYTES;
453
	else
454 455
		skb_size = packet_len;

456
	skb_size += ETH_HLEN;
457

458
	forw_packet_aggr->skb = netdev_alloc_skb_ip_align(NULL, skb_size);
459 460 461 462 463 464
	if (!forw_packet_aggr->skb) {
		if (!own_packet)
			atomic_inc(&bat_priv->batman_queue_left);
		kfree(forw_packet_aggr);
		goto out;
	}
465
	skb_reserve(forw_packet_aggr->skb, ETH_HLEN);
466 467 468 469 470 471 472 473

	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;
	forw_packet_aggr->num_packets = 0;
474
	forw_packet_aggr->direct_link_flags = BATADV_NO_FLAGS;
475 476 477 478 479 480 481 482 483 484 485 486 487
	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,
488
			  batadv_send_outstanding_bat_ogm_packet);
489
	queue_delayed_work(batadv_event_workqueue,
490 491 492 493 494
			   &forw_packet_aggr->delayed_work,
			   send_time - jiffies);

	return;
out:
495
	batadv_hardif_free_ref(if_incoming);
496 497 498
}

/* aggregate a new packet into the existing ogm packet */
499
static void batadv_iv_ogm_aggregate(struct batadv_forw_packet *forw_packet_aggr,
500 501
				    const unsigned char *packet_buff,
				    int packet_len, bool direct_link)
502 503
{
	unsigned char *skb_buff;
504
	unsigned long new_direct_link_flag;
505 506 507 508 509 510 511

	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 */
512 513 514 515
	if (direct_link) {
		new_direct_link_flag = BIT(forw_packet_aggr->num_packets);
		forw_packet_aggr->direct_link_flags |= new_direct_link_flag;
	}
516 517
}

518
static void batadv_iv_ogm_queue_add(struct batadv_priv *bat_priv,
519 520
				    unsigned char *packet_buff,
				    int packet_len,
521
				    struct batadv_hard_iface *if_incoming,
522
				    int own_packet, unsigned long send_time)
523
{
524
	/* _aggr -> pointer to the packet we want to aggregate with
525 526
	 * _pos -> pointer to the position in the queue
	 */
527 528
	struct batadv_forw_packet *forw_packet_aggr = NULL;
	struct batadv_forw_packet *forw_packet_pos = NULL;
529
	struct batadv_ogm_packet *batadv_ogm_packet;
530
	bool direct_link;
531
	unsigned long max_aggregation_jiffies;
532

533 534
	batadv_ogm_packet = (struct batadv_ogm_packet *)packet_buff;
	direct_link = batadv_ogm_packet->flags & BATADV_DIRECTLINK ? 1 : 0;
535
	max_aggregation_jiffies = msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS);
536 537 538 539 540

	/* 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 */
	if ((atomic_read(&bat_priv->aggregated_ogms)) && (!own_packet)) {
541
		hlist_for_each_entry(forw_packet_pos,
542
				     &bat_priv->forw_bat_list, list) {
543
			if (batadv_iv_ogm_can_aggregate(batadv_ogm_packet,
544 545 546 547
							bat_priv, packet_len,
							send_time, direct_link,
							if_incoming,
							forw_packet_pos)) {
548 549 550 551 552 553 554
				forw_packet_aggr = forw_packet_pos;
				break;
			}
		}
	}

	/* nothing to aggregate with - either aggregation disabled or no
555 556
	 * suitable aggregation packet found
	 */
557 558 559 560
	if (!forw_packet_aggr) {
		/* the following section can run without the lock */
		spin_unlock_bh(&bat_priv->forw_bat_list_lock);

561
		/* if we could not aggregate this packet with one of the others
562 563 564
		 * we hold it back for a while, so that it might be aggregated
		 * later on
		 */
565 566
		if (!own_packet && atomic_read(&bat_priv->aggregated_ogms))
			send_time += max_aggregation_jiffies;
567

568 569 570
		batadv_iv_ogm_aggregate_new(packet_buff, packet_len,
					    send_time, direct_link,
					    if_incoming, own_packet);
571
	} else {
572 573
		batadv_iv_ogm_aggregate(forw_packet_aggr, packet_buff,
					packet_len, direct_link);
574 575 576 577
		spin_unlock_bh(&bat_priv->forw_bat_list_lock);
	}
}

578
static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node,
579
				  const struct ethhdr *ethhdr,
580
				  struct batadv_ogm_packet *batadv_ogm_packet,
581 582
				  bool is_single_hop_neigh,
				  bool is_from_best_next_hop,
583
				  struct batadv_hard_iface *if_incoming)
584
{
585
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
586 587
	uint8_t tt_num_changes;

588
	if (batadv_ogm_packet->header.ttl <= 1) {
589
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv, "ttl exceeded\n");
590 591 592
		return;
	}

593 594 595 596 597 598 599 600
	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)
601
			batadv_ogm_packet->flags |= BATADV_NOT_BEST_NEXT_HOP;
602 603 604
		else
			return;
	}
605

606
	tt_num_changes = batadv_ogm_packet->tt_num_changes;
607

608 609
	batadv_ogm_packet->header.ttl--;
	memcpy(batadv_ogm_packet->prev_sender, ethhdr->h_source, ETH_ALEN);
610 611

	/* apply hop penalty */
612
	batadv_ogm_packet->tq = batadv_hop_penalty(batadv_ogm_packet->tq,
613
						   bat_priv);
614

615
	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
616
		   "Forwarding packet: tq: %i, ttl: %i\n",
617
		   batadv_ogm_packet->tq, batadv_ogm_packet->header.ttl);
618 619

	/* switch of primaries first hop flag when forwarding */
620
	batadv_ogm_packet->flags &= ~BATADV_PRIMARIES_FIRST_HOP;
621
	if (is_single_hop_neigh)
622
		batadv_ogm_packet->flags |= BATADV_DIRECTLINK;
623
	else
624
		batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK;
625

626
	batadv_iv_ogm_queue_add(bat_priv, (unsigned char *)batadv_ogm_packet,
627
				BATADV_OGM_HLEN + batadv_tt_len(tt_num_changes),
628
				if_incoming, 0, batadv_iv_ogm_fwd_send_time());
629 630
}

631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665
/**
 * 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;
	uint32_t i;
	size_t word_index;
	uint8_t *w;

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

		rcu_read_lock();
		hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
			spin_lock_bh(&orig_node->ogm_cnt_lock);
			word_index = hard_iface->if_num * BATADV_NUM_WORDS;
			word = &(orig_node->bcast_own[word_index]);

			batadv_bit_get_packet(bat_priv, word, 1, 0);
			w = &orig_node->bcast_own_sum[hard_iface->if_num];
			*w = bitmap_weight(word, BATADV_TQ_LOCAL_WINDOW_SIZE);
			spin_unlock_bh(&orig_node->ogm_cnt_lock);
		}
		rcu_read_unlock();
	}
}

666
static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
667
{
668
	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
669
	unsigned char **ogm_buff = &hard_iface->bat_iv.ogm_buff;
670
	struct batadv_ogm_packet *batadv_ogm_packet;
671
	struct batadv_hard_iface *primary_if;
672
	int *ogm_buff_len = &hard_iface->bat_iv.ogm_buff_len;
673
	int vis_server, tt_num_changes = 0;
674 675
	uint32_t seqno;
	uint8_t bandwidth;
676 677

	vis_server = atomic_read(&bat_priv->vis_mode);
678
	primary_if = batadv_primary_if_get_selected(bat_priv);
679

680
	if (hard_iface == primary_if)
681 682
		tt_num_changes = batadv_tt_append_diff(bat_priv, ogm_buff,
						       ogm_buff_len,
683
						       BATADV_OGM_HLEN);
684

685
	batadv_ogm_packet = (struct batadv_ogm_packet *)(*ogm_buff);
686 687

	/* change sequence number to network order */
688
	seqno = (uint32_t)atomic_read(&hard_iface->bat_iv.ogm_seqno);
689
	batadv_ogm_packet->seqno = htonl(seqno);
690
	atomic_inc(&hard_iface->bat_iv.ogm_seqno);
691

692 693
	batadv_ogm_packet->ttvn = atomic_read(&bat_priv->tt.vn);
	batadv_ogm_packet->tt_crc = htons(bat_priv->tt.local_crc);
694
	if (tt_num_changes >= 0)
695
		batadv_ogm_packet->tt_num_changes = tt_num_changes;
696

697
	if (vis_server == BATADV_VIS_TYPE_SERVER_SYNC)
698
		batadv_ogm_packet->flags |= BATADV_VIS_SERVER;
699
	else
700
		batadv_ogm_packet->flags &= ~BATADV_VIS_SERVER;
701

702 703 704 705 706
	if (hard_iface == primary_if &&
	    atomic_read(&bat_priv->gw_mode) == BATADV_GW_MODE_SERVER) {
		bandwidth = (uint8_t)atomic_read(&bat_priv->gw_bandwidth);
		batadv_ogm_packet->gw_flags = bandwidth;
	} else {
707
		batadv_ogm_packet->gw_flags = BATADV_NO_FLAGS;
708
	}
709

710
	batadv_iv_ogm_slide_own_bcast_window(hard_iface);
711 712
	batadv_iv_ogm_queue_add(bat_priv, hard_iface->bat_iv.ogm_buff,
				hard_iface->bat_iv.ogm_buff_len, hard_iface, 1,
713
				batadv_iv_ogm_emit_send_time(bat_priv));
714 715

	if (primary_if)
716
		batadv_hardif_free_ref(primary_if);
717 718
}

719
static void
720 721
batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
			  struct batadv_orig_node *orig_node,
722
			  const struct ethhdr *ethhdr,
723
			  const struct batadv_ogm_packet *batadv_ogm_packet,
724
			  struct batadv_hard_iface *if_incoming,
725 726
			  const unsigned char *tt_buff,
			  int is_duplicate)
727
{
728 729 730
	struct batadv_neigh_node *neigh_node = NULL, *tmp_neigh_node = NULL;
	struct batadv_neigh_node *router = NULL;
	struct batadv_orig_node *orig_node_tmp;
731
	int if_num;
732
	uint8_t sum_orig, sum_neigh;
733
	uint8_t *neigh_addr;
734
	uint8_t tq_avg;
735

736
	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
737
		   "update_originator(): Searching and updating originator entry of received packet\n");
738 739

	rcu_read_lock();
740
	hlist_for_each_entry_rcu(tmp_neigh_node,
741
				 &orig_node->neigh_list, list) {
742 743 744 745
		neigh_addr = tmp_neigh_node->addr;
		if (batadv_compare_eth(neigh_addr, ethhdr->h_source) &&
		    tmp_neigh_node->if_incoming == if_incoming &&
		    atomic_inc_not_zero(&tmp_neigh_node->refcount)) {
746
			if (WARN(neigh_node, "too many matching neigh_nodes"))
747
				batadv_neigh_node_free_ref(neigh_node);
748 749 750 751 752 753 754
			neigh_node = tmp_neigh_node;
			continue;
		}

		if (is_duplicate)
			continue;

755
		spin_lock_bh(&tmp_neigh_node->lq_update_lock);
756 757
		batadv_ring_buffer_set(tmp_neigh_node->tq_recv,
				       &tmp_neigh_node->tq_index, 0);
758 759
		tq_avg = batadv_ring_buffer_avg(tmp_neigh_node->tq_recv);
		tmp_neigh_node->tq_avg = tq_avg;
760
		spin_unlock_bh(&tmp_neigh_node->lq_update_lock);
761 762 763
	}

	if (!neigh_node) {
764
		struct batadv_orig_node *orig_tmp;
765

766
		orig_tmp = batadv_get_orig_node(bat_priv, ethhdr->h_source);
767 768 769
		if (!orig_tmp)
			goto unlock;

770 771
		neigh_node = batadv_iv_ogm_neigh_new(if_incoming,
						     ethhdr->h_source,
772
						     orig_node, orig_tmp);
773

774
		batadv_orig_node_free_ref(orig_tmp);
775 776 777
		if (!neigh_node)
			goto unlock;
	} else
778
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
779
			   "Updating existing last-hop neighbor of originator\n");
780 781 782

	rcu_read_unlock();

783
	orig_node->flags = batadv_ogm_packet->flags;
784
	neigh_node->last_seen = jiffies;
785

786
	spin_lock_bh(&neigh_node->lq_update_lock);
787 788
	batadv_ring_buffer_set(neigh_node->tq_recv,
			       &neigh_node->tq_index,
789
			       batadv_ogm_packet->tq);
790
	neigh_node->tq_avg = batadv_ring_buffer_avg(neigh_node->tq_recv);
791
	spin_unlock_bh(&neigh_node->lq_update_lock);
792 793

	if (!is_duplicate) {
794 795
		orig_node->last_ttl = batadv_ogm_packet->header.ttl;
		neigh_node->last_ttl = batadv_ogm_packet->header.ttl;
796 797
	}

798
	batadv_bonding_candidate_add(orig_node, neigh_node);
799 800

	/* if this neighbor already is our next hop there is nothing
801 802
	 * to change
	 */
803
	router = batadv_orig_node_get_router(orig_node);
804 805 806 807 808 809 810 811
	if (router == neigh_node)
		goto update_tt;

	/* if this neighbor does not offer a better TQ we won't consider it */
	if (router && (router->tq_avg > neigh_node->tq_avg))
		goto update_tt;

	/* if the TQ is the same and the link not more symmetric we
812 813
	 * won't consider it either
	 */
814 815 816
	if (router && (neigh_node->tq_avg == router->tq_avg)) {
		orig_node_tmp = router->orig_node;
		spin_lock_bh(&orig_node_tmp->ogm_cnt_lock);
817 818
		if_num = router->if_incoming->if_num;
		sum_orig = orig_node_tmp->bcast_own_sum[if_num];
819 820 821 822
		spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock);

		orig_node_tmp = neigh_node->orig_node;
		spin_lock_bh(&orig_node_tmp->ogm_cnt_lock);
823 824
		if_num = neigh_node->if_incoming->if_num;
		sum_neigh = orig_node_tmp->bcast_own_sum[if_num];
825 826
		spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock);

827
		if (sum_orig >= sum_neigh)
828 829 830
			goto update_tt;
	}

831
	batadv_update_route(bat_priv, orig_node, neigh_node);
832 833 834

update_tt:
	/* I have to check for transtable changes only if the OGM has been
835 836
	 * sent through a primary interface
	 */
837 838 839
	if (((batadv_ogm_packet->orig != ethhdr->h_source) &&
	     (batadv_ogm_packet->header.ttl > 2)) ||
	    (batadv_ogm_packet->flags & BATADV_PRIMARIES_FIRST_HOP))
840
		batadv_tt_update_orig(bat_priv, orig_node, tt_buff,
841 842 843
				      batadv_ogm_packet->tt_num_changes,
				      batadv_ogm_packet->ttvn,
				      ntohs(batadv_ogm_packet->tt_crc));
844

845
	if (orig_node->gw_flags != batadv_ogm_packet->gw_flags)
846
		batadv_gw_node_update(bat_priv, orig_node,
847
				      batadv_ogm_packet->gw_flags);
848

849
	orig_node->gw_flags = batadv_ogm_packet->gw_flags;
850 851 852

	/* restart gateway selection if fast or late switching was enabled */
	if ((orig_node->gw_flags) &&
853
	    (atomic_read(&bat_priv->gw_mode) == BATADV_GW_MODE_CLIENT) &&
854
	    (atomic_read(&bat_priv->gw_sel_class) > 2))
855
		batadv_gw_check_election(bat_priv, orig_node);
856 857 858 859 860 861 862

	goto out;

unlock:
	rcu_read_unlock();
out:
	if (neigh_node)
863
		batadv_neigh_node_free_ref(neigh_node);
864
	if (router)
865
		batadv_neigh_node_free_ref(router);
866 867
}

868 869
static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
				 struct batadv_orig_node *orig_neigh_node,
870
				 struct batadv_ogm_packet *batadv_ogm_packet,
871
				 struct batadv_hard_iface *if_incoming)
872
{
873 874
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
	struct batadv_neigh_node *neigh_node = NULL, *tmp_neigh_node;
875
	uint8_t total_count;
876 877 878 879
	uint8_t orig_eq_count, neigh_rq_count, neigh_rq_inv, tq_own;
	unsigned int neigh_rq_inv_cube, neigh_rq_max_cube;
	int tq_asym_penalty, inv_asym_penalty, ret = 0;
	unsigned int combined_tq;
880 881 882

	/* find corresponding one hop neighbor */
	rcu_read_lock();
883
	hlist_for_each_entry_rcu(tmp_neigh_node,
884
				 &orig_neigh_node->neigh_list, list) {
885 886
		if (!batadv_compare_eth(tmp_neigh_node->addr,
					orig_neigh_node->orig))
887 888 889 890 891 892 893 894 895 896 897 898 899 900
			continue;

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

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

		neigh_node = tmp_neigh_node;
		break;
	}
	rcu_read_unlock();

	if (!neigh_node)
901 902 903
		neigh_node = batadv_iv_ogm_neigh_new(if_incoming,
						     orig_neigh_node->orig,
						     orig_neigh_node,
904
						     orig_neigh_node);
905 906 907 908

	if (!neigh_node)
		goto out;

909
	/* if orig_node is direct neighbor update neigh_node last_seen */
910
	if (orig_node == orig_neigh_node)
911
		neigh_node->last_seen = jiffies;
912

913
	orig_node->last_seen = jiffies;
914 915 916 917 918 919 920 921

	/* find packet count of corresponding one hop neighbor */
	spin_lock_bh(&orig_node->ogm_cnt_lock);
	orig_eq_count = orig_neigh_node->bcast_own_sum[if_incoming->if_num];
	neigh_rq_count = neigh_node->real_packet_count;
	spin_unlock_bh(&orig_node->ogm_cnt_lock);

	/* pay attention to not get a value bigger than 100 % */
922 923 924 925
	if (orig_eq_count > neigh_rq_count)
		total_count = neigh_rq_count;
	else
		total_count = orig_eq_count;
926

927 928 929
	/* 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
	 */
930 931
	if (total_count < BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM ||
	    neigh_rq_count < BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM)
932 933 934 935
		tq_own = 0;
	else
		/* neigh_node->real_packet_count is never zero as we
		 * only purge old information when getting new
936 937
		 * information
		 */
938
		tq_own = (BATADV_TQ_MAX_VALUE * total_count) /	neigh_rq_count;
939

940
	/* 1 - ((1-x) ** 3), normalized to TQ_MAX_VALUE this does
941 942 943 944
	 * affect the nearly-symmetric links only a little, but
	 * punishes asymmetric links more.  This will give a value
	 * between 0 and TQ_MAX_VALUE
	 */
945 946 947 948 949 950 951 952 953
	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;

954
	combined_tq = batadv_ogm_packet->tq * tq_own * tq_asym_penalty;
955
	combined_tq /= BATADV_TQ_MAX_VALUE * BATADV_TQ_MAX_VALUE;
956
	batadv_ogm_packet->tq = combined_tq;
957

958
	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
959 960 961
		   "bidirectional: orig = %-15pM neigh = %-15pM => own_bcast = %2i, real recv = %2i, local tq: %3i, asym_penalty: %3i, total tq: %3i\n",
		   orig_node->orig, orig_neigh_node->orig, total_count,
		   neigh_rq_count, tq_own,
962
		   tq_asym_penalty, batadv_ogm_packet->tq);
963 964

	/* if link has the minimum required transmission quality
965 966
	 * consider it bidirectional
	 */
967
	if (batadv_ogm_packet->tq >= BATADV_TQ_TOTAL_BIDRECT_LIMIT)
968 969 970 971
		ret = 1;

out:
	if (neigh_node)
972
		batadv_neigh_node_free_ref(neigh_node);
973 974 975 976 977 978 979 980 981 982 983
	return ret;
}

/* processes a batman packet for all interfaces, adjusts the sequence number and
 * finds out whether it is a duplicate.
 * returns:
 *   1 the packet is a duplicate
 *   0 the packet has not yet been received
 *  -1 the packet is old and has been received while the seqno window
 *     was protected. Caller should drop it.
 */
984 985
static int
batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
986
			    const struct batadv_ogm_packet *batadv_ogm_packet,
987
			    const struct batadv_hard_iface *if_incoming)
988
{
989 990 991
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
	struct batadv_orig_node *orig_node;
	struct batadv_neigh_node *tmp_neigh_node;
992 993 994 995
	int is_duplicate = 0;
	int32_t seq_diff;
	int need_update = 0;
	int set_mark, ret = -1;
996
	uint32_t seqno = ntohl(batadv_ogm_packet->seqno);
997
	uint8_t *neigh_addr;
998
	uint8_t packet_count;
999

1000
	orig_node = batadv_get_orig_node(bat_priv, batadv_ogm_packet->orig);
1001 1002 1003 1004
	if (!orig_node)
		return 0;

	spin_lock_bh(&orig_node->ogm_cnt_lock);
1005
	seq_diff = seqno - orig_node->last_real_seqno;
1006 1007

	/* signalize caller that the packet is to be dropped. */
1008
	if (!hlist_empty(&orig_node->neigh_list) &&
1009 1010
	    batadv_window_protected(bat_priv, seq_diff,
				    &orig_node->batman_seqno_reset))
1011 1012 1013
		goto out;

	rcu_read_lock();
1014
	hlist_for_each_entry_rcu(tmp_neigh_node,
1015
				 &orig_node->neigh_list, list) {
1016 1017 1018
		is_duplicate |= batadv_test_bit(tmp_neigh_node->real_bits,
						orig_node->last_real_seqno,
						seqno);
1019

1020 1021 1022
		neigh_addr = tmp_neigh_node->addr;
		if (batadv_compare_eth(neigh_addr, ethhdr->h_source) &&
		    tmp_neigh_node->if_incoming == if_incoming)
1023 1024 1025 1026 1027
			set_mark = 1;
		else
			set_mark = 0;

		/* if the window moved, set the update flag. */
1028 1029 1030
		need_update |= batadv_bit_get_packet(bat_priv,
						     tmp_neigh_node->real_bits,
						     seq_diff, set_mark);
1031

1032 1033 1034
		packet_count = bitmap_weight(tmp_neigh_node->real_bits,
					     BATADV_TQ_LOCAL_WINDOW_SIZE);
		tmp_neigh_node->real_packet_count = packet_count;
1035 1036 1037 1038
	}
	rcu_read_unlock();

	if (need_update) {
1039
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1040 1041
			   "updating last_seqno: old %u, new %u\n",
			   orig_node->last_real_seqno, seqno);
1042
		orig_node->last_real_seqno = seqno;
1043 1044 1045 1046 1047 1048
	}

	ret = is_duplicate;

out:
	spin_unlock_bh(&orig_node->ogm_cnt_lock);
1049
	batadv_orig_node_free_ref(orig_node);
1050 1051 1052
	return ret;
}

1053
static void batadv_iv_ogm_process(const struct ethhdr *ethhdr,
1054
				  struct batadv_ogm_packet *batadv_ogm_packet,
1055
				  const unsigned char *tt_buff,
1056
				  struct batadv_hard_iface *if_incoming)
1057
{
1058 1059 1060 1061 1062
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
	struct batadv_hard_iface *hard_iface;
	struct batadv_orig_node *orig_neigh_node, *orig_node;
	struct batadv_neigh_node *router = NULL, *router_router = NULL;
	struct batadv_neigh_node *orig_neigh_router = NULL;
1063 1064
	int has_directlink_flag;
	int is_my_addr = 0, is_my_orig = 0, is_my_oldorig = 0;
1065
	int is_bidirect;
1066
	bool is_single_hop_neigh = false;
1067
	bool is_from_best_next_hop = false;
1068
	int is_duplicate, sameseq, simlar_ttl;
1069
	uint32_t if_incoming_seqno;
1070
	uint8_t *prev_sender;
1071 1072 1073 1074 1075 1076 1077 1078 1079

	/* 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
1080
	 * batadv_ogm_packet to detect whether the packet is the last
1081 1082 1083
	 * packet in an aggregation.  Here we expect that the padding
	 * is always zero (or not 0x01)
	 */
1084
	if (batadv_ogm_packet->header.packet_type != BATADV_IV_OGM)
1085 1086 1087
		return;

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

1090
	if (batadv_ogm_packet->flags & BATADV_DIRECTLINK)
1091 1092 1093
		has_directlink_flag = 1;
	else
		has_directlink_flag = 0;
1094

1095
	if (batadv_compare_eth(ethhdr->h_source, batadv_ogm_packet->orig))
1096
		is_single_hop_neigh = true;
1097

1098
	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1099
		   "Received BATMAN packet via NB: %pM, IF: %s [%pM] (from OG: %pM, via prev OG: %pM, seqno %u, ttvn %u, crc %#.4x, changes %u, tq %d, TTL %d, V %d, IDF %d)\n",
1100
		   ethhdr->h_source, if_incoming->net_dev->name,
1101 1102 1103 1104 1105 1106 1107
		   if_incoming->net_dev->dev_addr, batadv_ogm_packet->orig,
		   batadv_ogm_packet->prev_sender,
		   ntohl(batadv_ogm_packet->seqno), batadv_ogm_packet->ttvn,
		   ntohs(batadv_ogm_packet->tt_crc),
		   batadv_ogm_packet->tt_num_changes, batadv_ogm_packet->tq,
		   batadv_ogm_packet->header.ttl,
		   batadv_ogm_packet->header.version, has_directlink_flag);
1108 1109

	rcu_read_lock();
1110
	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
1111
		if (hard_iface->if_status != BATADV_IF_ACTIVE)
1112 1113 1114 1115 1116
			continue;

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

1117 1118
		if (batadv_compare_eth(ethhdr->h_source,
				       hard_iface->net_dev->dev_addr))
1119 1120
			is_my_addr = 1;

1121
		if (batadv_compare_eth(batadv_ogm_packet->orig,
1122
				       hard_iface->net_dev->dev_addr))
1123 1124
			is_my_orig = 1;

1125
		if (batadv_compare_eth(batadv_ogm_packet->prev_sender,
1126
				       hard_iface->net_dev->dev_addr))
1127 1128 1129 1130 1131
			is_my_oldorig = 1;
	}
	rcu_read_unlock();

	if (is_my_addr) {
1132
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1133 1134
			   "Drop packet: received my own broadcast (sender: %pM)\n",
			   ethhdr->h_source);
1135 1136 1137 1138 1139 1140
		return;
	}

	if (is_my_orig) {
		unsigned long *word;
		int offset;
1141
		int32_t bit_pos;
1142 1143
		int16_t if_num;
		uint8_t *weight;
1144

1145 1146
		orig_neigh_node = batadv_get_orig_node(bat_priv,
						       ethhdr->h_source);
1147 1148 1149 1150
		if (!orig_neigh_node)
			return;

		/* neighbor has to indicate direct link and it has to
1151 1152 1153
		 * come via the corresponding interface
		 * save packet seqno for bidirectional check
		 */
1154
		if (has_directlink_flag &&
1155
		    batadv_compare_eth(if_incoming->net_dev->dev_addr,
1156
				       batadv_ogm_packet->orig)) {
1157 1158
			if_num = if_incoming->if_num;
			offset = if_num * BATADV_NUM_WORDS;
1159 1160 1161

			spin_lock_bh(&orig_neigh_node->ogm_cnt_lock);
			word = &(orig_neigh_node->bcast_own[offset]);
1162
			bit_pos = if_incoming_seqno - 2;
1163
			bit_pos -= ntohl(batadv_ogm_packet->seqno);
1164
			batadv_set_bit(word, bit_pos);
1165 1166 1167
			weight = &orig_neigh_node->bcast_own_sum[if_num];
			*weight = bitmap_weight(word,
						BATADV_TQ_LOCAL_WINDOW_SIZE);
1168 1169 1170
			spin_unlock_bh(&orig_neigh_node->ogm_cnt_lock);
		}

1171
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1172
			   "Drop packet: originator packet from myself (via neighbor)\n");
1173
		batadv_orig_node_free_ref(orig_neigh_node);
1174 1175 1176 1177
		return;
	}

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

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

1191
	orig_node = batadv_get_orig_node(bat_priv, batadv_ogm_packet->orig);
1192 1193 1194
	if (!orig_node)
		return;

1195
	is_duplicate = batadv_iv_ogm_update_seqnos(ethhdr, batadv_ogm_packet,
1196
						   if_incoming);
1197 1198

	if (is_duplicate == -1) {
1199
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1200 1201
			   "Drop packet: packet within seqno protection time (sender: %pM)\n",
			   ethhdr->h_source);
1202 1203 1204
		goto out;
	}

1205
	if (batadv_ogm_packet->tq == 0) {
1206
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1207
			   "Drop packet: originator packet with tq equal 0\n");
1208 1209 1210
		goto out;
	}

1211
	router = batadv_orig_node_get_router(orig_node);
1212
	if (router)
1213
		router_router = batadv_orig_node_get_router(router->orig_node);
1214

1215
	if ((router && router->tq_avg != 0) &&
1216
	    (batadv_compare_eth(router->addr, ethhdr->h_source)))
1217 1218
		is_from_best_next_hop = true;

1219
	prev_sender = batadv_ogm_packet->prev_sender;
1220 1221
	/* avoid temporary routing loops */
	if (router && router_router &&
1222
	    (batadv_compare_eth(router->addr, prev_sender)) &&
1223
	    !(batadv_compare_eth(batadv_ogm_packet->orig, prev_sender)) &&
1224
	    (batadv_compare_eth(router->addr, router_router->addr))) {
1225
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1226 1227
			   "Drop packet: ignoring all rebroadcast packets that may make me loop (sender: %pM)\n",
			   ethhdr->h_source);
1228 1229 1230 1231
		goto out;
	}

	/* if sender is a direct neighbor the sender mac equals
1232 1233
	 * originator mac
	 */
1234 1235 1236 1237 1238 1239
	if (is_single_hop_neigh)
		orig_neigh_node = orig_node;
	else
		orig_neigh_node = batadv_get_orig_node(bat_priv,
						       ethhdr->h_source);

1240 1241 1242
	if (!orig_neigh_node)
		goto out;

1243 1244 1245 1246
	/* Update nc_nodes of the originator */
	batadv_nc_update_nc_node(bat_priv, orig_node, orig_neigh_node,
				 batadv_ogm_packet, is_single_hop_neigh);

1247
	orig_neigh_router = batadv_orig_node_get_router(orig_neigh_node);
1248 1249

	/* drop packet if sender is not a direct neighbor and if we
1250 1251
	 * don't route towards it
	 */
1252
	if (!is_single_hop_neigh && (!orig_neigh_router)) {
1253
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1254
			   "Drop packet: OGM via unknown neighbor!\n");
1255 1256 1257
		goto out_neigh;
	}

1258
	is_bidirect = batadv_iv_ogm_calc_tq(orig_node, orig_neigh_node,
1259
					    batadv_ogm_packet, if_incoming);
1260

1261
	batadv_bonding_save_primary(orig_node, orig_neigh_node,
1262
				    batadv_ogm_packet);
1263 1264

	/* update ranking if it is not a duplicate or has the same
1265 1266
	 * seqno and similar ttl as the non-duplicate
	 */
1267 1268
	sameseq = orig_node->last_real_seqno == ntohl(batadv_ogm_packet->seqno);
	simlar_ttl = orig_node->last_ttl - 3 <= batadv_ogm_packet->header.ttl;
1269 1270
	if (is_bidirect && (!is_duplicate || (sameseq && simlar_ttl)))
		batadv_iv_ogm_orig_update(bat_priv, orig_node, ethhdr,
1271
					  batadv_ogm_packet, if_incoming,
1272
					  tt_buff, is_duplicate);
1273 1274 1275 1276

	/* is single hop (direct) neighbor */
	if (is_single_hop_neigh) {
		/* mark direct link on incoming interface */
1277
		batadv_iv_ogm_forward(orig_node, ethhdr, batadv_ogm_packet,
1278 1279
				      is_single_hop_neigh,
				      is_from_best_next_hop, if_incoming);
1280

1281
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1282
			   "Forwarding packet: rebroadcast neighbor packet with direct link flag\n");
1283 1284 1285 1286
		goto out_neigh;
	}

	/* multihop originator */
1287
	if (!is_bidirect) {
1288
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1289
			   "Drop packet: not received via bidirectional link\n");
1290 1291 1292 1293
		goto out_neigh;
	}

	if (is_duplicate) {
1294
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1295
			   "Drop packet: duplicate packet received\n");
1296 1297 1298
		goto out_neigh;
	}

1299
	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1300
		   "Forwarding packet: rebroadcast originator packet\n");
1301
	batadv_iv_ogm_forward(orig_node, ethhdr, batadv_ogm_packet,
1302 1303
			      is_single_hop_neigh, is_from_best_next_hop,
			      if_incoming);
1304 1305 1306

out_neigh:
	if ((orig_neigh_node) && (!is_single_hop_neigh))
1307
		batadv_orig_node_free_ref(orig_neigh_node);
1308 1309
out:
	if (router)
1310
		batadv_neigh_node_free_ref(router);
1311
	if (router_router)
1312
		batadv_neigh_node_free_ref(router_router);
1313
	if (orig_neigh_router)
1314
		batadv_neigh_node_free_ref(orig_neigh_router);
1315

1316
	batadv_orig_node_free_ref(orig_node);
1317 1318
}

1319
static int batadv_iv_ogm_receive(struct sk_buff *skb,
1320
				 struct batadv_hard_iface *if_incoming)
1321
{
1322
	struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1323
	struct batadv_ogm_packet *batadv_ogm_packet;
1324 1325 1326
	struct ethhdr *ethhdr;
	int buff_pos = 0, packet_len;
	unsigned char *tt_buff, *packet_buff;
1327
	bool ret;
1328
	uint8_t *packet_pos;
1329

1330
	ret = batadv_check_management_packet(skb, if_incoming, BATADV_OGM_HLEN);
1331 1332
	if (!ret)
		return NET_RX_DROP;
1333

1334 1335 1336
	/* 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 ?
	 */
1337
	if (bat_priv->bat_algo_ops->bat_ogm_emit != batadv_iv_ogm_emit)
1338 1339
		return NET_RX_DROP;

1340 1341
	batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_RX);
	batadv_add_counter(bat_priv, BATADV_CNT_MGMT_RX_BYTES,
1342 1343
			   skb->len + ETH_HLEN);

1344
	packet_len = skb_headlen(skb);
1345
	ethhdr = eth_hdr(skb);
1346
	packet_buff = skb->data;
1347
	batadv_ogm_packet = (struct batadv_ogm_packet *)packet_buff;
1348 1349

	/* unpack the aggregated packets and process them one by one */
1350 1351
	while (batadv_iv_ogm_aggr_packet(buff_pos, packet_len,
					 batadv_ogm_packet->tt_num_changes)) {
1352
		tt_buff = packet_buff + buff_pos + BATADV_OGM_HLEN;
1353

1354
		batadv_iv_ogm_process(ethhdr, batadv_ogm_packet, tt_buff,
1355
				      if_incoming);
1356

1357
		buff_pos += BATADV_OGM_HLEN;
1358
		buff_pos += batadv_tt_len(batadv_ogm_packet->tt_num_changes);
1359

1360 1361
		packet_pos = packet_buff + buff_pos;
		batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos;
1362
	}
1363 1364 1365

	kfree_skb(skb);
	return NET_RX_SUCCESS;
1366
}
1367

1368
static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
1369
	.name = "BATMAN_IV",
1370 1371 1372 1373 1374 1375
	.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,
1376 1377
};

1378
int __init batadv_iv_init(void)
1379
{
1380 1381 1382
	int ret;

	/* batman originator packet */
1383 1384
	ret = batadv_recv_handler_register(BATADV_IV_OGM,
					   batadv_iv_ogm_receive);
1385 1386 1387
	if (ret < 0)
		goto out;

1388
	ret = batadv_algo_register(&batadv_batman_iv);
1389 1390 1391 1392 1393 1394
	if (ret < 0)
		goto handler_unregister;

	goto out;

handler_unregister:
1395
	batadv_recv_handler_unregister(BATADV_IV_OGM);
1396 1397
out:
	return ret;
1398
}