1 /* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors: 2 * 3 * Marek Lindner, Simon Wunderlich 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of version 2 of the GNU General Public 7 * License as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 17 * 02110-1301, USA 18 */ 19 20 #include "main.h" 21 #include "translation-table.h" 22 #include "ring_buffer.h" 23 #include "originator.h" 24 #include "routing.h" 25 #include "gateway_common.h" 26 #include "gateway_client.h" 27 #include "hard-interface.h" 28 #include "send.h" 29 #include "bat_algo.h" 30 31 static struct batadv_neigh_node * 32 batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface, 33 const uint8_t *neigh_addr, 34 struct batadv_orig_node *orig_node, 35 struct batadv_orig_node *orig_neigh, __be32 seqno) 36 { 37 struct batadv_neigh_node *neigh_node; 38 39 neigh_node = batadv_neigh_node_new(hard_iface, neigh_addr, 40 ntohl(seqno)); 41 if (!neigh_node) 42 goto out; 43 44 INIT_LIST_HEAD(&neigh_node->bonding_list); 45 46 neigh_node->orig_node = orig_neigh; 47 neigh_node->if_incoming = hard_iface; 48 49 spin_lock_bh(&orig_node->neigh_list_lock); 50 hlist_add_head_rcu(&neigh_node->list, &orig_node->neigh_list); 51 spin_unlock_bh(&orig_node->neigh_list_lock); 52 53 out: 54 return neigh_node; 55 } 56 57 static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface) 58 { 59 struct batadv_ogm_packet *batadv_ogm_packet; 60 uint32_t random_seqno; 61 int res = -ENOMEM; 62 63 /* randomize initial seqno to avoid collision */ 64 get_random_bytes(&random_seqno, sizeof(random_seqno)); 65 atomic_set(&hard_iface->seqno, random_seqno); 66 67 hard_iface->packet_len = BATADV_OGM_HLEN; 68 hard_iface->packet_buff = kmalloc(hard_iface->packet_len, GFP_ATOMIC); 69 70 if (!hard_iface->packet_buff) 71 goto out; 72 73 batadv_ogm_packet = (struct batadv_ogm_packet *)hard_iface->packet_buff; 74 batadv_ogm_packet->header.packet_type = BATADV_IV_OGM; 75 batadv_ogm_packet->header.version = BATADV_COMPAT_VERSION; 76 batadv_ogm_packet->header.ttl = 2; 77 batadv_ogm_packet->flags = BATADV_NO_FLAGS; 78 batadv_ogm_packet->tq = BATADV_TQ_MAX_VALUE; 79 batadv_ogm_packet->tt_num_changes = 0; 80 batadv_ogm_packet->ttvn = 0; 81 82 res = 0; 83 84 out: 85 return res; 86 } 87 88 static void batadv_iv_ogm_iface_disable(struct batadv_hard_iface *hard_iface) 89 { 90 kfree(hard_iface->packet_buff); 91 hard_iface->packet_buff = NULL; 92 } 93 94 static void batadv_iv_ogm_iface_update_mac(struct batadv_hard_iface *hard_iface) 95 { 96 struct batadv_ogm_packet *batadv_ogm_packet; 97 98 batadv_ogm_packet = (struct batadv_ogm_packet *)hard_iface->packet_buff; 99 memcpy(batadv_ogm_packet->orig, 100 hard_iface->net_dev->dev_addr, ETH_ALEN); 101 memcpy(batadv_ogm_packet->prev_sender, 102 hard_iface->net_dev->dev_addr, ETH_ALEN); 103 } 104 105 static void 106 batadv_iv_ogm_primary_iface_set(struct batadv_hard_iface *hard_iface) 107 { 108 struct batadv_ogm_packet *batadv_ogm_packet; 109 110 batadv_ogm_packet = (struct batadv_ogm_packet *)hard_iface->packet_buff; 111 batadv_ogm_packet->flags = BATADV_PRIMARIES_FIRST_HOP; 112 batadv_ogm_packet->header.ttl = BATADV_TTL; 113 } 114 115 /* when do we schedule our own ogm to be sent */ 116 static unsigned long 117 batadv_iv_ogm_emit_send_time(const struct batadv_priv *bat_priv) 118 { 119 unsigned int msecs; 120 121 msecs = atomic_read(&bat_priv->orig_interval) - BATADV_JITTER; 122 msecs += (random32() % 2 * BATADV_JITTER); 123 124 return jiffies + msecs_to_jiffies(msecs); 125 } 126 127 /* when do we schedule a ogm packet to be sent */ 128 static unsigned long batadv_iv_ogm_fwd_send_time(void) 129 { 130 return jiffies + msecs_to_jiffies(random32() % (BATADV_JITTER / 2)); 131 } 132 133 /* apply hop penalty for a normal link */ 134 static uint8_t batadv_hop_penalty(uint8_t tq, 135 const struct batadv_priv *bat_priv) 136 { 137 int hop_penalty = atomic_read(&bat_priv->hop_penalty); 138 int new_tq; 139 140 new_tq = tq * (BATADV_TQ_MAX_VALUE - hop_penalty); 141 new_tq /= BATADV_TQ_MAX_VALUE; 142 143 return new_tq; 144 } 145 146 /* is there another aggregated packet here? */ 147 static int batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len, 148 int tt_num_changes) 149 { 150 int next_buff_pos = 0; 151 152 next_buff_pos += buff_pos + BATADV_OGM_HLEN; 153 next_buff_pos += batadv_tt_len(tt_num_changes); 154 155 return (next_buff_pos <= packet_len) && 156 (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES); 157 } 158 159 /* send a batman ogm to a given interface */ 160 static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet, 161 struct batadv_hard_iface *hard_iface) 162 { 163 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); 164 char *fwd_str; 165 uint8_t packet_num; 166 int16_t buff_pos; 167 struct batadv_ogm_packet *batadv_ogm_packet; 168 struct sk_buff *skb; 169 170 if (hard_iface->if_status != BATADV_IF_ACTIVE) 171 return; 172 173 packet_num = 0; 174 buff_pos = 0; 175 batadv_ogm_packet = (struct batadv_ogm_packet *)forw_packet->skb->data; 176 177 /* adjust all flags and log packets */ 178 while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len, 179 batadv_ogm_packet->tt_num_changes)) { 180 181 /* we might have aggregated direct link packets with an 182 * ordinary base packet 183 */ 184 if ((forw_packet->direct_link_flags & (1 << packet_num)) && 185 (forw_packet->if_incoming == hard_iface)) 186 batadv_ogm_packet->flags |= BATADV_DIRECTLINK; 187 else 188 batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK; 189 190 fwd_str = (packet_num > 0 ? "Forwarding" : (forw_packet->own ? 191 "Sending own" : 192 "Forwarding")); 193 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 194 "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s, ttvn %d) on interface %s [%pM]\n", 195 fwd_str, (packet_num > 0 ? "aggregated " : ""), 196 batadv_ogm_packet->orig, 197 ntohl(batadv_ogm_packet->seqno), 198 batadv_ogm_packet->tq, batadv_ogm_packet->header.ttl, 199 (batadv_ogm_packet->flags & BATADV_DIRECTLINK ? 200 "on" : "off"), 201 batadv_ogm_packet->ttvn, hard_iface->net_dev->name, 202 hard_iface->net_dev->dev_addr); 203 204 buff_pos += BATADV_OGM_HLEN; 205 buff_pos += batadv_tt_len(batadv_ogm_packet->tt_num_changes); 206 packet_num++; 207 batadv_ogm_packet = (struct batadv_ogm_packet *) 208 (forw_packet->skb->data + buff_pos); 209 } 210 211 /* create clone because function is called more than once */ 212 skb = skb_clone(forw_packet->skb, GFP_ATOMIC); 213 if (skb) { 214 batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_TX); 215 batadv_add_counter(bat_priv, BATADV_CNT_MGMT_TX_BYTES, 216 skb->len + ETH_HLEN); 217 batadv_send_skb_packet(skb, hard_iface, batadv_broadcast_addr); 218 } 219 } 220 221 /* send a batman ogm packet */ 222 static void batadv_iv_ogm_emit(struct batadv_forw_packet *forw_packet) 223 { 224 struct batadv_hard_iface *hard_iface; 225 struct net_device *soft_iface; 226 struct batadv_priv *bat_priv; 227 struct batadv_hard_iface *primary_if = NULL; 228 struct batadv_ogm_packet *batadv_ogm_packet; 229 unsigned char directlink; 230 231 batadv_ogm_packet = (struct batadv_ogm_packet *) 232 (forw_packet->skb->data); 233 directlink = (batadv_ogm_packet->flags & BATADV_DIRECTLINK ? 1 : 0); 234 235 if (!forw_packet->if_incoming) { 236 pr_err("Error - can't forward packet: incoming iface not specified\n"); 237 goto out; 238 } 239 240 soft_iface = forw_packet->if_incoming->soft_iface; 241 bat_priv = netdev_priv(soft_iface); 242 243 if (forw_packet->if_incoming->if_status != BATADV_IF_ACTIVE) 244 goto out; 245 246 primary_if = batadv_primary_if_get_selected(bat_priv); 247 if (!primary_if) 248 goto out; 249 250 /* multihomed peer assumed 251 * non-primary OGMs are only broadcasted on their interface 252 */ 253 if ((directlink && (batadv_ogm_packet->header.ttl == 1)) || 254 (forw_packet->own && (forw_packet->if_incoming != primary_if))) { 255 256 /* FIXME: what about aggregated packets ? */ 257 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 258 "%s packet (originator %pM, seqno %u, TTL %d) on interface %s [%pM]\n", 259 (forw_packet->own ? "Sending own" : "Forwarding"), 260 batadv_ogm_packet->orig, 261 ntohl(batadv_ogm_packet->seqno), 262 batadv_ogm_packet->header.ttl, 263 forw_packet->if_incoming->net_dev->name, 264 forw_packet->if_incoming->net_dev->dev_addr); 265 266 /* skb is only used once and than forw_packet is free'd */ 267 batadv_send_skb_packet(forw_packet->skb, 268 forw_packet->if_incoming, 269 batadv_broadcast_addr); 270 forw_packet->skb = NULL; 271 272 goto out; 273 } 274 275 /* broadcast on every interface */ 276 rcu_read_lock(); 277 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 278 if (hard_iface->soft_iface != soft_iface) 279 continue; 280 281 batadv_iv_ogm_send_to_if(forw_packet, hard_iface); 282 } 283 rcu_read_unlock(); 284 285 out: 286 if (primary_if) 287 batadv_hardif_free_ref(primary_if); 288 } 289 290 /* return true if new_packet can be aggregated with forw_packet */ 291 static bool 292 batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet, 293 struct batadv_priv *bat_priv, 294 int packet_len, unsigned long send_time, 295 bool directlink, 296 const struct batadv_hard_iface *if_incoming, 297 const struct batadv_forw_packet *forw_packet) 298 { 299 struct batadv_ogm_packet *batadv_ogm_packet; 300 int aggregated_bytes = forw_packet->packet_len + packet_len; 301 struct batadv_hard_iface *primary_if = NULL; 302 bool res = false; 303 unsigned long aggregation_end_time; 304 305 batadv_ogm_packet = (struct batadv_ogm_packet *)forw_packet->skb->data; 306 aggregation_end_time = send_time; 307 aggregation_end_time += msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS); 308 309 /* we can aggregate the current packet to this aggregated packet 310 * if: 311 * 312 * - the send time is within our MAX_AGGREGATION_MS time 313 * - the resulting packet wont be bigger than 314 * MAX_AGGREGATION_BYTES 315 */ 316 if (time_before(send_time, forw_packet->send_time) && 317 time_after_eq(aggregation_end_time, forw_packet->send_time) && 318 (aggregated_bytes <= BATADV_MAX_AGGREGATION_BYTES)) { 319 320 /* check aggregation compatibility 321 * -> direct link packets are broadcasted on 322 * their interface only 323 * -> aggregate packet if the current packet is 324 * a "global" packet as well as the base 325 * packet 326 */ 327 primary_if = batadv_primary_if_get_selected(bat_priv); 328 if (!primary_if) 329 goto out; 330 331 /* packets without direct link flag and high TTL 332 * are flooded through the net 333 */ 334 if ((!directlink) && 335 (!(batadv_ogm_packet->flags & BATADV_DIRECTLINK)) && 336 (batadv_ogm_packet->header.ttl != 1) && 337 338 /* own packets originating non-primary 339 * interfaces leave only that interface 340 */ 341 ((!forw_packet->own) || 342 (forw_packet->if_incoming == primary_if))) { 343 res = true; 344 goto out; 345 } 346 347 /* if the incoming packet is sent via this one 348 * interface only - we still can aggregate 349 */ 350 if ((directlink) && 351 (new_bat_ogm_packet->header.ttl == 1) && 352 (forw_packet->if_incoming == if_incoming) && 353 354 /* packets from direct neighbors or 355 * own secondary interface packets 356 * (= secondary interface packets in general) 357 */ 358 (batadv_ogm_packet->flags & BATADV_DIRECTLINK || 359 (forw_packet->own && 360 forw_packet->if_incoming != primary_if))) { 361 res = true; 362 goto out; 363 } 364 } 365 366 out: 367 if (primary_if) 368 batadv_hardif_free_ref(primary_if); 369 return res; 370 } 371 372 /* create a new aggregated packet and add this packet to it */ 373 static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff, 374 int packet_len, unsigned long send_time, 375 bool direct_link, 376 struct batadv_hard_iface *if_incoming, 377 int own_packet) 378 { 379 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); 380 struct batadv_forw_packet *forw_packet_aggr; 381 unsigned char *skb_buff; 382 unsigned int skb_size; 383 384 if (!atomic_inc_not_zero(&if_incoming->refcount)) 385 return; 386 387 /* own packet should always be scheduled */ 388 if (!own_packet) { 389 if (!batadv_atomic_dec_not_zero(&bat_priv->batman_queue_left)) { 390 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 391 "batman packet queue full\n"); 392 goto out; 393 } 394 } 395 396 forw_packet_aggr = kmalloc(sizeof(*forw_packet_aggr), GFP_ATOMIC); 397 if (!forw_packet_aggr) { 398 if (!own_packet) 399 atomic_inc(&bat_priv->batman_queue_left); 400 goto out; 401 } 402 403 if ((atomic_read(&bat_priv->aggregated_ogms)) && 404 (packet_len < BATADV_MAX_AGGREGATION_BYTES)) 405 skb_size = BATADV_MAX_AGGREGATION_BYTES + ETH_HLEN; 406 else 407 skb_size = packet_len + ETH_HLEN; 408 409 forw_packet_aggr->skb = dev_alloc_skb(skb_size); 410 if (!forw_packet_aggr->skb) { 411 if (!own_packet) 412 atomic_inc(&bat_priv->batman_queue_left); 413 kfree(forw_packet_aggr); 414 goto out; 415 } 416 skb_reserve(forw_packet_aggr->skb, ETH_HLEN); 417 418 INIT_HLIST_NODE(&forw_packet_aggr->list); 419 420 skb_buff = skb_put(forw_packet_aggr->skb, packet_len); 421 forw_packet_aggr->packet_len = packet_len; 422 memcpy(skb_buff, packet_buff, packet_len); 423 424 forw_packet_aggr->own = own_packet; 425 forw_packet_aggr->if_incoming = if_incoming; 426 forw_packet_aggr->num_packets = 0; 427 forw_packet_aggr->direct_link_flags = BATADV_NO_FLAGS; 428 forw_packet_aggr->send_time = send_time; 429 430 /* save packet direct link flag status */ 431 if (direct_link) 432 forw_packet_aggr->direct_link_flags |= 1; 433 434 /* add new packet to packet list */ 435 spin_lock_bh(&bat_priv->forw_bat_list_lock); 436 hlist_add_head(&forw_packet_aggr->list, &bat_priv->forw_bat_list); 437 spin_unlock_bh(&bat_priv->forw_bat_list_lock); 438 439 /* start timer for this packet */ 440 INIT_DELAYED_WORK(&forw_packet_aggr->delayed_work, 441 batadv_send_outstanding_bat_ogm_packet); 442 queue_delayed_work(batadv_event_workqueue, 443 &forw_packet_aggr->delayed_work, 444 send_time - jiffies); 445 446 return; 447 out: 448 batadv_hardif_free_ref(if_incoming); 449 } 450 451 /* aggregate a new packet into the existing ogm packet */ 452 static void batadv_iv_ogm_aggregate(struct batadv_forw_packet *forw_packet_aggr, 453 const unsigned char *packet_buff, 454 int packet_len, bool direct_link) 455 { 456 unsigned char *skb_buff; 457 458 skb_buff = skb_put(forw_packet_aggr->skb, packet_len); 459 memcpy(skb_buff, packet_buff, packet_len); 460 forw_packet_aggr->packet_len += packet_len; 461 forw_packet_aggr->num_packets++; 462 463 /* save packet direct link flag status */ 464 if (direct_link) 465 forw_packet_aggr->direct_link_flags |= 466 (1 << forw_packet_aggr->num_packets); 467 } 468 469 static void batadv_iv_ogm_queue_add(struct batadv_priv *bat_priv, 470 unsigned char *packet_buff, 471 int packet_len, 472 struct batadv_hard_iface *if_incoming, 473 int own_packet, unsigned long send_time) 474 { 475 /* _aggr -> pointer to the packet we want to aggregate with 476 * _pos -> pointer to the position in the queue 477 */ 478 struct batadv_forw_packet *forw_packet_aggr = NULL; 479 struct batadv_forw_packet *forw_packet_pos = NULL; 480 struct hlist_node *tmp_node; 481 struct batadv_ogm_packet *batadv_ogm_packet; 482 bool direct_link; 483 unsigned long max_aggregation_jiffies; 484 485 batadv_ogm_packet = (struct batadv_ogm_packet *)packet_buff; 486 direct_link = batadv_ogm_packet->flags & BATADV_DIRECTLINK ? 1 : 0; 487 max_aggregation_jiffies = msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS); 488 489 /* find position for the packet in the forward queue */ 490 spin_lock_bh(&bat_priv->forw_bat_list_lock); 491 /* own packets are not to be aggregated */ 492 if ((atomic_read(&bat_priv->aggregated_ogms)) && (!own_packet)) { 493 hlist_for_each_entry(forw_packet_pos, tmp_node, 494 &bat_priv->forw_bat_list, list) { 495 if (batadv_iv_ogm_can_aggregate(batadv_ogm_packet, 496 bat_priv, packet_len, 497 send_time, direct_link, 498 if_incoming, 499 forw_packet_pos)) { 500 forw_packet_aggr = forw_packet_pos; 501 break; 502 } 503 } 504 } 505 506 /* nothing to aggregate with - either aggregation disabled or no 507 * suitable aggregation packet found 508 */ 509 if (!forw_packet_aggr) { 510 /* the following section can run without the lock */ 511 spin_unlock_bh(&bat_priv->forw_bat_list_lock); 512 513 /* if we could not aggregate this packet with one of the others 514 * we hold it back for a while, so that it might be aggregated 515 * later on 516 */ 517 if (!own_packet && atomic_read(&bat_priv->aggregated_ogms)) 518 send_time += max_aggregation_jiffies; 519 520 batadv_iv_ogm_aggregate_new(packet_buff, packet_len, 521 send_time, direct_link, 522 if_incoming, own_packet); 523 } else { 524 batadv_iv_ogm_aggregate(forw_packet_aggr, packet_buff, 525 packet_len, direct_link); 526 spin_unlock_bh(&bat_priv->forw_bat_list_lock); 527 } 528 } 529 530 static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node, 531 const struct ethhdr *ethhdr, 532 struct batadv_ogm_packet *batadv_ogm_packet, 533 bool is_single_hop_neigh, 534 bool is_from_best_next_hop, 535 struct batadv_hard_iface *if_incoming) 536 { 537 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); 538 uint8_t tt_num_changes; 539 540 if (batadv_ogm_packet->header.ttl <= 1) { 541 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, "ttl exceeded\n"); 542 return; 543 } 544 545 if (!is_from_best_next_hop) { 546 /* Mark the forwarded packet when it is not coming from our 547 * best next hop. We still need to forward the packet for our 548 * neighbor link quality detection to work in case the packet 549 * originated from a single hop neighbor. Otherwise we can 550 * simply drop the ogm. 551 */ 552 if (is_single_hop_neigh) 553 batadv_ogm_packet->flags |= BATADV_NOT_BEST_NEXT_HOP; 554 else 555 return; 556 } 557 558 tt_num_changes = batadv_ogm_packet->tt_num_changes; 559 560 batadv_ogm_packet->header.ttl--; 561 memcpy(batadv_ogm_packet->prev_sender, ethhdr->h_source, ETH_ALEN); 562 563 /* apply hop penalty */ 564 batadv_ogm_packet->tq = batadv_hop_penalty(batadv_ogm_packet->tq, 565 bat_priv); 566 567 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 568 "Forwarding packet: tq: %i, ttl: %i\n", 569 batadv_ogm_packet->tq, batadv_ogm_packet->header.ttl); 570 571 /* switch of primaries first hop flag when forwarding */ 572 batadv_ogm_packet->flags &= ~BATADV_PRIMARIES_FIRST_HOP; 573 if (is_single_hop_neigh) 574 batadv_ogm_packet->flags |= BATADV_DIRECTLINK; 575 else 576 batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK; 577 578 batadv_iv_ogm_queue_add(bat_priv, (unsigned char *)batadv_ogm_packet, 579 BATADV_OGM_HLEN + batadv_tt_len(tt_num_changes), 580 if_incoming, 0, batadv_iv_ogm_fwd_send_time()); 581 } 582 583 static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface) 584 { 585 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); 586 struct batadv_ogm_packet *batadv_ogm_packet; 587 struct batadv_hard_iface *primary_if; 588 int vis_server, tt_num_changes = 0; 589 590 vis_server = atomic_read(&bat_priv->vis_mode); 591 primary_if = batadv_primary_if_get_selected(bat_priv); 592 593 if (hard_iface == primary_if) 594 tt_num_changes = batadv_tt_append_diff(bat_priv, 595 &hard_iface->packet_buff, 596 &hard_iface->packet_len, 597 BATADV_OGM_HLEN); 598 599 batadv_ogm_packet = (struct batadv_ogm_packet *)hard_iface->packet_buff; 600 601 /* change sequence number to network order */ 602 batadv_ogm_packet->seqno = 603 htonl((uint32_t)atomic_read(&hard_iface->seqno)); 604 atomic_inc(&hard_iface->seqno); 605 606 batadv_ogm_packet->ttvn = atomic_read(&bat_priv->ttvn); 607 batadv_ogm_packet->tt_crc = htons(bat_priv->tt_crc); 608 if (tt_num_changes >= 0) 609 batadv_ogm_packet->tt_num_changes = tt_num_changes; 610 611 if (vis_server == BATADV_VIS_TYPE_SERVER_SYNC) 612 batadv_ogm_packet->flags |= BATADV_VIS_SERVER; 613 else 614 batadv_ogm_packet->flags &= ~BATADV_VIS_SERVER; 615 616 if ((hard_iface == primary_if) && 617 (atomic_read(&bat_priv->gw_mode) == BATADV_GW_MODE_SERVER)) 618 batadv_ogm_packet->gw_flags = 619 (uint8_t)atomic_read(&bat_priv->gw_bandwidth); 620 else 621 batadv_ogm_packet->gw_flags = BATADV_NO_FLAGS; 622 623 batadv_slide_own_bcast_window(hard_iface); 624 batadv_iv_ogm_queue_add(bat_priv, hard_iface->packet_buff, 625 hard_iface->packet_len, hard_iface, 1, 626 batadv_iv_ogm_emit_send_time(bat_priv)); 627 628 if (primary_if) 629 batadv_hardif_free_ref(primary_if); 630 } 631 632 static void 633 batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv, 634 struct batadv_orig_node *orig_node, 635 const struct ethhdr *ethhdr, 636 const struct batadv_ogm_packet *batadv_ogm_packet, 637 struct batadv_hard_iface *if_incoming, 638 const unsigned char *tt_buff, 639 int is_duplicate) 640 { 641 struct batadv_neigh_node *neigh_node = NULL, *tmp_neigh_node = NULL; 642 struct batadv_neigh_node *router = NULL; 643 struct batadv_orig_node *orig_node_tmp; 644 struct hlist_node *node; 645 int if_num; 646 uint8_t sum_orig, sum_neigh; 647 uint8_t *neigh_addr; 648 649 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 650 "update_originator(): Searching and updating originator entry of received packet\n"); 651 652 rcu_read_lock(); 653 hlist_for_each_entry_rcu(tmp_neigh_node, node, 654 &orig_node->neigh_list, list) { 655 neigh_addr = tmp_neigh_node->addr; 656 if (batadv_compare_eth(neigh_addr, ethhdr->h_source) && 657 tmp_neigh_node->if_incoming == if_incoming && 658 atomic_inc_not_zero(&tmp_neigh_node->refcount)) { 659 if (neigh_node) 660 batadv_neigh_node_free_ref(neigh_node); 661 neigh_node = tmp_neigh_node; 662 continue; 663 } 664 665 if (is_duplicate) 666 continue; 667 668 spin_lock_bh(&tmp_neigh_node->lq_update_lock); 669 batadv_ring_buffer_set(tmp_neigh_node->tq_recv, 670 &tmp_neigh_node->tq_index, 0); 671 tmp_neigh_node->tq_avg = 672 batadv_ring_buffer_avg(tmp_neigh_node->tq_recv); 673 spin_unlock_bh(&tmp_neigh_node->lq_update_lock); 674 } 675 676 if (!neigh_node) { 677 struct batadv_orig_node *orig_tmp; 678 679 orig_tmp = batadv_get_orig_node(bat_priv, ethhdr->h_source); 680 if (!orig_tmp) 681 goto unlock; 682 683 neigh_node = batadv_iv_ogm_neigh_new(if_incoming, 684 ethhdr->h_source, 685 orig_node, orig_tmp, 686 batadv_ogm_packet->seqno); 687 688 batadv_orig_node_free_ref(orig_tmp); 689 if (!neigh_node) 690 goto unlock; 691 } else 692 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 693 "Updating existing last-hop neighbor of originator\n"); 694 695 rcu_read_unlock(); 696 697 orig_node->flags = batadv_ogm_packet->flags; 698 neigh_node->last_seen = jiffies; 699 700 spin_lock_bh(&neigh_node->lq_update_lock); 701 batadv_ring_buffer_set(neigh_node->tq_recv, 702 &neigh_node->tq_index, 703 batadv_ogm_packet->tq); 704 neigh_node->tq_avg = batadv_ring_buffer_avg(neigh_node->tq_recv); 705 spin_unlock_bh(&neigh_node->lq_update_lock); 706 707 if (!is_duplicate) { 708 orig_node->last_ttl = batadv_ogm_packet->header.ttl; 709 neigh_node->last_ttl = batadv_ogm_packet->header.ttl; 710 } 711 712 batadv_bonding_candidate_add(orig_node, neigh_node); 713 714 /* if this neighbor already is our next hop there is nothing 715 * to change 716 */ 717 router = batadv_orig_node_get_router(orig_node); 718 if (router == neigh_node) 719 goto update_tt; 720 721 /* if this neighbor does not offer a better TQ we won't consider it */ 722 if (router && (router->tq_avg > neigh_node->tq_avg)) 723 goto update_tt; 724 725 /* if the TQ is the same and the link not more symmetric we 726 * won't consider it either 727 */ 728 if (router && (neigh_node->tq_avg == router->tq_avg)) { 729 orig_node_tmp = router->orig_node; 730 spin_lock_bh(&orig_node_tmp->ogm_cnt_lock); 731 if_num = router->if_incoming->if_num; 732 sum_orig = orig_node_tmp->bcast_own_sum[if_num]; 733 spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock); 734 735 orig_node_tmp = neigh_node->orig_node; 736 spin_lock_bh(&orig_node_tmp->ogm_cnt_lock); 737 if_num = neigh_node->if_incoming->if_num; 738 sum_neigh = orig_node_tmp->bcast_own_sum[if_num]; 739 spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock); 740 741 if (sum_orig >= sum_neigh) 742 goto update_tt; 743 } 744 745 batadv_update_route(bat_priv, orig_node, neigh_node); 746 747 update_tt: 748 /* I have to check for transtable changes only if the OGM has been 749 * sent through a primary interface 750 */ 751 if (((batadv_ogm_packet->orig != ethhdr->h_source) && 752 (batadv_ogm_packet->header.ttl > 2)) || 753 (batadv_ogm_packet->flags & BATADV_PRIMARIES_FIRST_HOP)) 754 batadv_tt_update_orig(bat_priv, orig_node, tt_buff, 755 batadv_ogm_packet->tt_num_changes, 756 batadv_ogm_packet->ttvn, 757 ntohs(batadv_ogm_packet->tt_crc)); 758 759 if (orig_node->gw_flags != batadv_ogm_packet->gw_flags) 760 batadv_gw_node_update(bat_priv, orig_node, 761 batadv_ogm_packet->gw_flags); 762 763 orig_node->gw_flags = batadv_ogm_packet->gw_flags; 764 765 /* restart gateway selection if fast or late switching was enabled */ 766 if ((orig_node->gw_flags) && 767 (atomic_read(&bat_priv->gw_mode) == BATADV_GW_MODE_CLIENT) && 768 (atomic_read(&bat_priv->gw_sel_class) > 2)) 769 batadv_gw_check_election(bat_priv, orig_node); 770 771 goto out; 772 773 unlock: 774 rcu_read_unlock(); 775 out: 776 if (neigh_node) 777 batadv_neigh_node_free_ref(neigh_node); 778 if (router) 779 batadv_neigh_node_free_ref(router); 780 } 781 782 static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node, 783 struct batadv_orig_node *orig_neigh_node, 784 struct batadv_ogm_packet *batadv_ogm_packet, 785 struct batadv_hard_iface *if_incoming) 786 { 787 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); 788 struct batadv_neigh_node *neigh_node = NULL, *tmp_neigh_node; 789 struct hlist_node *node; 790 uint8_t total_count; 791 uint8_t orig_eq_count, neigh_rq_count, neigh_rq_inv, tq_own; 792 unsigned int neigh_rq_inv_cube, neigh_rq_max_cube; 793 int tq_asym_penalty, inv_asym_penalty, ret = 0; 794 unsigned int combined_tq; 795 796 /* find corresponding one hop neighbor */ 797 rcu_read_lock(); 798 hlist_for_each_entry_rcu(tmp_neigh_node, node, 799 &orig_neigh_node->neigh_list, list) { 800 801 if (!batadv_compare_eth(tmp_neigh_node->addr, 802 orig_neigh_node->orig)) 803 continue; 804 805 if (tmp_neigh_node->if_incoming != if_incoming) 806 continue; 807 808 if (!atomic_inc_not_zero(&tmp_neigh_node->refcount)) 809 continue; 810 811 neigh_node = tmp_neigh_node; 812 break; 813 } 814 rcu_read_unlock(); 815 816 if (!neigh_node) 817 neigh_node = batadv_iv_ogm_neigh_new(if_incoming, 818 orig_neigh_node->orig, 819 orig_neigh_node, 820 orig_neigh_node, 821 batadv_ogm_packet->seqno); 822 823 if (!neigh_node) 824 goto out; 825 826 /* if orig_node is direct neighbor update neigh_node last_seen */ 827 if (orig_node == orig_neigh_node) 828 neigh_node->last_seen = jiffies; 829 830 orig_node->last_seen = jiffies; 831 832 /* find packet count of corresponding one hop neighbor */ 833 spin_lock_bh(&orig_node->ogm_cnt_lock); 834 orig_eq_count = orig_neigh_node->bcast_own_sum[if_incoming->if_num]; 835 neigh_rq_count = neigh_node->real_packet_count; 836 spin_unlock_bh(&orig_node->ogm_cnt_lock); 837 838 /* pay attention to not get a value bigger than 100 % */ 839 total_count = (orig_eq_count > neigh_rq_count ? 840 neigh_rq_count : orig_eq_count); 841 842 /* if we have too few packets (too less data) we set tq_own to zero 843 * if we receive too few packets it is not considered bidirectional 844 */ 845 if (total_count < BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM || 846 neigh_rq_count < BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM) 847 tq_own = 0; 848 else 849 /* neigh_node->real_packet_count is never zero as we 850 * only purge old information when getting new 851 * information 852 */ 853 tq_own = (BATADV_TQ_MAX_VALUE * total_count) / neigh_rq_count; 854 855 /* 1 - ((1-x) ** 3), normalized to TQ_MAX_VALUE this does 856 * affect the nearly-symmetric links only a little, but 857 * punishes asymmetric links more. This will give a value 858 * between 0 and TQ_MAX_VALUE 859 */ 860 neigh_rq_inv = BATADV_TQ_LOCAL_WINDOW_SIZE - neigh_rq_count; 861 neigh_rq_inv_cube = neigh_rq_inv * neigh_rq_inv * neigh_rq_inv; 862 neigh_rq_max_cube = BATADV_TQ_LOCAL_WINDOW_SIZE * 863 BATADV_TQ_LOCAL_WINDOW_SIZE * 864 BATADV_TQ_LOCAL_WINDOW_SIZE; 865 inv_asym_penalty = BATADV_TQ_MAX_VALUE * neigh_rq_inv_cube; 866 inv_asym_penalty /= neigh_rq_max_cube; 867 tq_asym_penalty = BATADV_TQ_MAX_VALUE - inv_asym_penalty; 868 869 combined_tq = batadv_ogm_packet->tq * tq_own * tq_asym_penalty; 870 combined_tq /= BATADV_TQ_MAX_VALUE * BATADV_TQ_MAX_VALUE; 871 batadv_ogm_packet->tq = combined_tq; 872 873 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 874 "bidirectional: orig = %-15pM neigh = %-15pM => own_bcast = %2i, real recv = %2i, local tq: %3i, asym_penalty: %3i, total tq: %3i\n", 875 orig_node->orig, orig_neigh_node->orig, total_count, 876 neigh_rq_count, tq_own, 877 tq_asym_penalty, batadv_ogm_packet->tq); 878 879 /* if link has the minimum required transmission quality 880 * consider it bidirectional 881 */ 882 if (batadv_ogm_packet->tq >= BATADV_TQ_TOTAL_BIDRECT_LIMIT) 883 ret = 1; 884 885 out: 886 if (neigh_node) 887 batadv_neigh_node_free_ref(neigh_node); 888 return ret; 889 } 890 891 /* processes a batman packet for all interfaces, adjusts the sequence number and 892 * finds out whether it is a duplicate. 893 * returns: 894 * 1 the packet is a duplicate 895 * 0 the packet has not yet been received 896 * -1 the packet is old and has been received while the seqno window 897 * was protected. Caller should drop it. 898 */ 899 static int 900 batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, 901 const struct batadv_ogm_packet *batadv_ogm_packet, 902 const struct batadv_hard_iface *if_incoming) 903 { 904 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); 905 struct batadv_orig_node *orig_node; 906 struct batadv_neigh_node *tmp_neigh_node; 907 struct hlist_node *node; 908 int is_duplicate = 0; 909 int32_t seq_diff; 910 int need_update = 0; 911 int set_mark, ret = -1; 912 uint32_t seqno = ntohl(batadv_ogm_packet->seqno); 913 uint8_t *neigh_addr; 914 915 orig_node = batadv_get_orig_node(bat_priv, batadv_ogm_packet->orig); 916 if (!orig_node) 917 return 0; 918 919 spin_lock_bh(&orig_node->ogm_cnt_lock); 920 seq_diff = seqno - orig_node->last_real_seqno; 921 922 /* signalize caller that the packet is to be dropped. */ 923 if (!hlist_empty(&orig_node->neigh_list) && 924 batadv_window_protected(bat_priv, seq_diff, 925 &orig_node->batman_seqno_reset)) 926 goto out; 927 928 rcu_read_lock(); 929 hlist_for_each_entry_rcu(tmp_neigh_node, node, 930 &orig_node->neigh_list, list) { 931 932 is_duplicate |= batadv_test_bit(tmp_neigh_node->real_bits, 933 orig_node->last_real_seqno, 934 seqno); 935 936 neigh_addr = tmp_neigh_node->addr; 937 if (batadv_compare_eth(neigh_addr, ethhdr->h_source) && 938 tmp_neigh_node->if_incoming == if_incoming) 939 set_mark = 1; 940 else 941 set_mark = 0; 942 943 /* if the window moved, set the update flag. */ 944 need_update |= batadv_bit_get_packet(bat_priv, 945 tmp_neigh_node->real_bits, 946 seq_diff, set_mark); 947 948 tmp_neigh_node->real_packet_count = 949 bitmap_weight(tmp_neigh_node->real_bits, 950 BATADV_TQ_LOCAL_WINDOW_SIZE); 951 } 952 rcu_read_unlock(); 953 954 if (need_update) { 955 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 956 "updating last_seqno: old %u, new %u\n", 957 orig_node->last_real_seqno, seqno); 958 orig_node->last_real_seqno = seqno; 959 } 960 961 ret = is_duplicate; 962 963 out: 964 spin_unlock_bh(&orig_node->ogm_cnt_lock); 965 batadv_orig_node_free_ref(orig_node); 966 return ret; 967 } 968 969 static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, 970 struct batadv_ogm_packet *batadv_ogm_packet, 971 const unsigned char *tt_buff, 972 struct batadv_hard_iface *if_incoming) 973 { 974 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); 975 struct batadv_hard_iface *hard_iface; 976 struct batadv_orig_node *orig_neigh_node, *orig_node; 977 struct batadv_neigh_node *router = NULL, *router_router = NULL; 978 struct batadv_neigh_node *orig_neigh_router = NULL; 979 int has_directlink_flag; 980 int is_my_addr = 0, is_my_orig = 0, is_my_oldorig = 0; 981 int is_broadcast = 0, is_bidirect; 982 bool is_single_hop_neigh = false; 983 bool is_from_best_next_hop = false; 984 int is_duplicate, sameseq, simlar_ttl; 985 uint32_t if_incoming_seqno; 986 uint8_t *prev_sender; 987 988 /* Silently drop when the batman packet is actually not a 989 * correct packet. 990 * 991 * This might happen if a packet is padded (e.g. Ethernet has a 992 * minimum frame length of 64 byte) and the aggregation interprets 993 * it as an additional length. 994 * 995 * TODO: A more sane solution would be to have a bit in the 996 * batadv_ogm_packet to detect whether the packet is the last 997 * packet in an aggregation. Here we expect that the padding 998 * is always zero (or not 0x01) 999 */ 1000 if (batadv_ogm_packet->header.packet_type != BATADV_IV_OGM) 1001 return; 1002 1003 /* could be changed by schedule_own_packet() */ 1004 if_incoming_seqno = atomic_read(&if_incoming->seqno); 1005 1006 if (batadv_ogm_packet->flags & BATADV_DIRECTLINK) 1007 has_directlink_flag = 1; 1008 else 1009 has_directlink_flag = 0; 1010 1011 if (batadv_compare_eth(ethhdr->h_source, batadv_ogm_packet->orig)) 1012 is_single_hop_neigh = true; 1013 1014 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1015 "Received BATMAN packet via NB: %pM, IF: %s [%pM] (from OG: %pM, via prev OG: %pM, seqno %u, ttvn %u, crc %u, changes %u, td %d, TTL %d, V %d, IDF %d)\n", 1016 ethhdr->h_source, if_incoming->net_dev->name, 1017 if_incoming->net_dev->dev_addr, batadv_ogm_packet->orig, 1018 batadv_ogm_packet->prev_sender, 1019 ntohl(batadv_ogm_packet->seqno), batadv_ogm_packet->ttvn, 1020 ntohs(batadv_ogm_packet->tt_crc), 1021 batadv_ogm_packet->tt_num_changes, batadv_ogm_packet->tq, 1022 batadv_ogm_packet->header.ttl, 1023 batadv_ogm_packet->header.version, has_directlink_flag); 1024 1025 rcu_read_lock(); 1026 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 1027 if (hard_iface->if_status != BATADV_IF_ACTIVE) 1028 continue; 1029 1030 if (hard_iface->soft_iface != if_incoming->soft_iface) 1031 continue; 1032 1033 if (batadv_compare_eth(ethhdr->h_source, 1034 hard_iface->net_dev->dev_addr)) 1035 is_my_addr = 1; 1036 1037 if (batadv_compare_eth(batadv_ogm_packet->orig, 1038 hard_iface->net_dev->dev_addr)) 1039 is_my_orig = 1; 1040 1041 if (batadv_compare_eth(batadv_ogm_packet->prev_sender, 1042 hard_iface->net_dev->dev_addr)) 1043 is_my_oldorig = 1; 1044 1045 if (is_broadcast_ether_addr(ethhdr->h_source)) 1046 is_broadcast = 1; 1047 } 1048 rcu_read_unlock(); 1049 1050 if (batadv_ogm_packet->header.version != BATADV_COMPAT_VERSION) { 1051 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1052 "Drop packet: incompatible batman version (%i)\n", 1053 batadv_ogm_packet->header.version); 1054 return; 1055 } 1056 1057 if (is_my_addr) { 1058 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1059 "Drop packet: received my own broadcast (sender: %pM)\n", 1060 ethhdr->h_source); 1061 return; 1062 } 1063 1064 if (is_broadcast) { 1065 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1066 "Drop packet: ignoring all packets with broadcast source addr (sender: %pM)\n", 1067 ethhdr->h_source); 1068 return; 1069 } 1070 1071 if (is_my_orig) { 1072 unsigned long *word; 1073 int offset; 1074 int32_t bit_pos; 1075 int16_t if_num; 1076 uint8_t *weight; 1077 1078 orig_neigh_node = batadv_get_orig_node(bat_priv, 1079 ethhdr->h_source); 1080 if (!orig_neigh_node) 1081 return; 1082 1083 /* neighbor has to indicate direct link and it has to 1084 * come via the corresponding interface 1085 * save packet seqno for bidirectional check 1086 */ 1087 if (has_directlink_flag && 1088 batadv_compare_eth(if_incoming->net_dev->dev_addr, 1089 batadv_ogm_packet->orig)) { 1090 if_num = if_incoming->if_num; 1091 offset = if_num * BATADV_NUM_WORDS; 1092 1093 spin_lock_bh(&orig_neigh_node->ogm_cnt_lock); 1094 word = &(orig_neigh_node->bcast_own[offset]); 1095 bit_pos = if_incoming_seqno - 2; 1096 bit_pos -= ntohl(batadv_ogm_packet->seqno); 1097 batadv_set_bit(word, bit_pos); 1098 weight = &orig_neigh_node->bcast_own_sum[if_num]; 1099 *weight = bitmap_weight(word, 1100 BATADV_TQ_LOCAL_WINDOW_SIZE); 1101 spin_unlock_bh(&orig_neigh_node->ogm_cnt_lock); 1102 } 1103 1104 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1105 "Drop packet: originator packet from myself (via neighbor)\n"); 1106 batadv_orig_node_free_ref(orig_neigh_node); 1107 return; 1108 } 1109 1110 if (is_my_oldorig) { 1111 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1112 "Drop packet: ignoring all rebroadcast echos (sender: %pM)\n", 1113 ethhdr->h_source); 1114 return; 1115 } 1116 1117 if (batadv_ogm_packet->flags & BATADV_NOT_BEST_NEXT_HOP) { 1118 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1119 "Drop packet: ignoring all packets not forwarded from the best next hop (sender: %pM)\n", 1120 ethhdr->h_source); 1121 return; 1122 } 1123 1124 orig_node = batadv_get_orig_node(bat_priv, batadv_ogm_packet->orig); 1125 if (!orig_node) 1126 return; 1127 1128 is_duplicate = batadv_iv_ogm_update_seqnos(ethhdr, batadv_ogm_packet, 1129 if_incoming); 1130 1131 if (is_duplicate == -1) { 1132 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1133 "Drop packet: packet within seqno protection time (sender: %pM)\n", 1134 ethhdr->h_source); 1135 goto out; 1136 } 1137 1138 if (batadv_ogm_packet->tq == 0) { 1139 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1140 "Drop packet: originator packet with tq equal 0\n"); 1141 goto out; 1142 } 1143 1144 router = batadv_orig_node_get_router(orig_node); 1145 if (router) 1146 router_router = batadv_orig_node_get_router(router->orig_node); 1147 1148 if ((router && router->tq_avg != 0) && 1149 (batadv_compare_eth(router->addr, ethhdr->h_source))) 1150 is_from_best_next_hop = true; 1151 1152 prev_sender = batadv_ogm_packet->prev_sender; 1153 /* avoid temporary routing loops */ 1154 if (router && router_router && 1155 (batadv_compare_eth(router->addr, prev_sender)) && 1156 !(batadv_compare_eth(batadv_ogm_packet->orig, prev_sender)) && 1157 (batadv_compare_eth(router->addr, router_router->addr))) { 1158 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1159 "Drop packet: ignoring all rebroadcast packets that may make me loop (sender: %pM)\n", 1160 ethhdr->h_source); 1161 goto out; 1162 } 1163 1164 /* if sender is a direct neighbor the sender mac equals 1165 * originator mac 1166 */ 1167 orig_neigh_node = (is_single_hop_neigh ? 1168 orig_node : 1169 batadv_get_orig_node(bat_priv, ethhdr->h_source)); 1170 if (!orig_neigh_node) 1171 goto out; 1172 1173 orig_neigh_router = batadv_orig_node_get_router(orig_neigh_node); 1174 1175 /* drop packet if sender is not a direct neighbor and if we 1176 * don't route towards it 1177 */ 1178 if (!is_single_hop_neigh && (!orig_neigh_router)) { 1179 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1180 "Drop packet: OGM via unknown neighbor!\n"); 1181 goto out_neigh; 1182 } 1183 1184 is_bidirect = batadv_iv_ogm_calc_tq(orig_node, orig_neigh_node, 1185 batadv_ogm_packet, if_incoming); 1186 1187 batadv_bonding_save_primary(orig_node, orig_neigh_node, 1188 batadv_ogm_packet); 1189 1190 /* update ranking if it is not a duplicate or has the same 1191 * seqno and similar ttl as the non-duplicate 1192 */ 1193 sameseq = orig_node->last_real_seqno == ntohl(batadv_ogm_packet->seqno); 1194 simlar_ttl = orig_node->last_ttl - 3 <= batadv_ogm_packet->header.ttl; 1195 if (is_bidirect && (!is_duplicate || (sameseq && simlar_ttl))) 1196 batadv_iv_ogm_orig_update(bat_priv, orig_node, ethhdr, 1197 batadv_ogm_packet, if_incoming, 1198 tt_buff, is_duplicate); 1199 1200 /* is single hop (direct) neighbor */ 1201 if (is_single_hop_neigh) { 1202 1203 /* mark direct link on incoming interface */ 1204 batadv_iv_ogm_forward(orig_node, ethhdr, batadv_ogm_packet, 1205 is_single_hop_neigh, 1206 is_from_best_next_hop, if_incoming); 1207 1208 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1209 "Forwarding packet: rebroadcast neighbor packet with direct link flag\n"); 1210 goto out_neigh; 1211 } 1212 1213 /* multihop originator */ 1214 if (!is_bidirect) { 1215 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1216 "Drop packet: not received via bidirectional link\n"); 1217 goto out_neigh; 1218 } 1219 1220 if (is_duplicate) { 1221 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1222 "Drop packet: duplicate packet received\n"); 1223 goto out_neigh; 1224 } 1225 1226 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1227 "Forwarding packet: rebroadcast originator packet\n"); 1228 batadv_iv_ogm_forward(orig_node, ethhdr, batadv_ogm_packet, 1229 is_single_hop_neigh, is_from_best_next_hop, 1230 if_incoming); 1231 1232 out_neigh: 1233 if ((orig_neigh_node) && (!is_single_hop_neigh)) 1234 batadv_orig_node_free_ref(orig_neigh_node); 1235 out: 1236 if (router) 1237 batadv_neigh_node_free_ref(router); 1238 if (router_router) 1239 batadv_neigh_node_free_ref(router_router); 1240 if (orig_neigh_router) 1241 batadv_neigh_node_free_ref(orig_neigh_router); 1242 1243 batadv_orig_node_free_ref(orig_node); 1244 } 1245 1246 static int batadv_iv_ogm_receive(struct sk_buff *skb, 1247 struct batadv_hard_iface *if_incoming) 1248 { 1249 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); 1250 struct batadv_ogm_packet *batadv_ogm_packet; 1251 struct ethhdr *ethhdr; 1252 int buff_pos = 0, packet_len; 1253 unsigned char *tt_buff, *packet_buff; 1254 bool ret; 1255 1256 ret = batadv_check_management_packet(skb, if_incoming, BATADV_OGM_HLEN); 1257 if (!ret) 1258 return NET_RX_DROP; 1259 1260 /* did we receive a B.A.T.M.A.N. IV OGM packet on an interface 1261 * that does not have B.A.T.M.A.N. IV enabled ? 1262 */ 1263 if (bat_priv->bat_algo_ops->bat_ogm_emit != batadv_iv_ogm_emit) 1264 return NET_RX_DROP; 1265 1266 batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_RX); 1267 batadv_add_counter(bat_priv, BATADV_CNT_MGMT_RX_BYTES, 1268 skb->len + ETH_HLEN); 1269 1270 packet_len = skb_headlen(skb); 1271 ethhdr = (struct ethhdr *)skb_mac_header(skb); 1272 packet_buff = skb->data; 1273 batadv_ogm_packet = (struct batadv_ogm_packet *)packet_buff; 1274 1275 /* unpack the aggregated packets and process them one by one */ 1276 do { 1277 tt_buff = packet_buff + buff_pos + BATADV_OGM_HLEN; 1278 1279 batadv_iv_ogm_process(ethhdr, batadv_ogm_packet, tt_buff, 1280 if_incoming); 1281 1282 buff_pos += BATADV_OGM_HLEN; 1283 buff_pos += batadv_tt_len(batadv_ogm_packet->tt_num_changes); 1284 1285 batadv_ogm_packet = (struct batadv_ogm_packet *) 1286 (packet_buff + buff_pos); 1287 } while (batadv_iv_ogm_aggr_packet(buff_pos, packet_len, 1288 batadv_ogm_packet->tt_num_changes)); 1289 1290 kfree_skb(skb); 1291 return NET_RX_SUCCESS; 1292 } 1293 1294 static struct batadv_algo_ops batadv_batman_iv __read_mostly = { 1295 .name = "BATMAN_IV", 1296 .bat_iface_enable = batadv_iv_ogm_iface_enable, 1297 .bat_iface_disable = batadv_iv_ogm_iface_disable, 1298 .bat_iface_update_mac = batadv_iv_ogm_iface_update_mac, 1299 .bat_primary_iface_set = batadv_iv_ogm_primary_iface_set, 1300 .bat_ogm_schedule = batadv_iv_ogm_schedule, 1301 .bat_ogm_emit = batadv_iv_ogm_emit, 1302 }; 1303 1304 int __init batadv_iv_init(void) 1305 { 1306 int ret; 1307 1308 /* batman originator packet */ 1309 ret = batadv_recv_handler_register(BATADV_IV_OGM, 1310 batadv_iv_ogm_receive); 1311 if (ret < 0) 1312 goto out; 1313 1314 ret = batadv_algo_register(&batadv_batman_iv); 1315 if (ret < 0) 1316 goto handler_unregister; 1317 1318 goto out; 1319 1320 handler_unregister: 1321 batadv_recv_handler_unregister(BATADV_IV_OGM); 1322 out: 1323 return ret; 1324 } 1325