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 uint8_t bcast_own_sum_orig, bcast_own_sum_neigh; 646 uint8_t *neigh_addr; 647 648 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 649 "update_originator(): Searching and updating originator entry of received packet\n"); 650 651 rcu_read_lock(); 652 hlist_for_each_entry_rcu(tmp_neigh_node, node, 653 &orig_node->neigh_list, list) { 654 neigh_addr = tmp_neigh_node->addr; 655 if (batadv_compare_eth(neigh_addr, ethhdr->h_source) && 656 tmp_neigh_node->if_incoming == if_incoming && 657 atomic_inc_not_zero(&tmp_neigh_node->refcount)) { 658 if (neigh_node) 659 batadv_neigh_node_free_ref(neigh_node); 660 neigh_node = tmp_neigh_node; 661 continue; 662 } 663 664 if (is_duplicate) 665 continue; 666 667 spin_lock_bh(&tmp_neigh_node->lq_update_lock); 668 batadv_ring_buffer_set(tmp_neigh_node->tq_recv, 669 &tmp_neigh_node->tq_index, 0); 670 tmp_neigh_node->tq_avg = 671 batadv_ring_buffer_avg(tmp_neigh_node->tq_recv); 672 spin_unlock_bh(&tmp_neigh_node->lq_update_lock); 673 } 674 675 if (!neigh_node) { 676 struct batadv_orig_node *orig_tmp; 677 678 orig_tmp = batadv_get_orig_node(bat_priv, ethhdr->h_source); 679 if (!orig_tmp) 680 goto unlock; 681 682 neigh_node = batadv_iv_ogm_neigh_new(if_incoming, 683 ethhdr->h_source, 684 orig_node, orig_tmp, 685 batadv_ogm_packet->seqno); 686 687 batadv_orig_node_free_ref(orig_tmp); 688 if (!neigh_node) 689 goto unlock; 690 } else 691 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 692 "Updating existing last-hop neighbor of originator\n"); 693 694 rcu_read_unlock(); 695 696 orig_node->flags = batadv_ogm_packet->flags; 697 neigh_node->last_seen = jiffies; 698 699 spin_lock_bh(&neigh_node->lq_update_lock); 700 batadv_ring_buffer_set(neigh_node->tq_recv, 701 &neigh_node->tq_index, 702 batadv_ogm_packet->tq); 703 neigh_node->tq_avg = batadv_ring_buffer_avg(neigh_node->tq_recv); 704 spin_unlock_bh(&neigh_node->lq_update_lock); 705 706 if (!is_duplicate) { 707 orig_node->last_ttl = batadv_ogm_packet->header.ttl; 708 neigh_node->last_ttl = batadv_ogm_packet->header.ttl; 709 } 710 711 batadv_bonding_candidate_add(orig_node, neigh_node); 712 713 /* if this neighbor already is our next hop there is nothing 714 * to change 715 */ 716 router = batadv_orig_node_get_router(orig_node); 717 if (router == neigh_node) 718 goto update_tt; 719 720 /* if this neighbor does not offer a better TQ we won't consider it */ 721 if (router && (router->tq_avg > neigh_node->tq_avg)) 722 goto update_tt; 723 724 /* if the TQ is the same and the link not more symmetric we 725 * won't consider it either 726 */ 727 if (router && (neigh_node->tq_avg == router->tq_avg)) { 728 orig_node_tmp = router->orig_node; 729 spin_lock_bh(&orig_node_tmp->ogm_cnt_lock); 730 bcast_own_sum_orig = 731 orig_node_tmp->bcast_own_sum[if_incoming->if_num]; 732 spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock); 733 734 orig_node_tmp = neigh_node->orig_node; 735 spin_lock_bh(&orig_node_tmp->ogm_cnt_lock); 736 bcast_own_sum_neigh = 737 orig_node_tmp->bcast_own_sum[if_incoming->if_num]; 738 spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock); 739 740 if (bcast_own_sum_orig >= bcast_own_sum_neigh) 741 goto update_tt; 742 } 743 744 batadv_update_route(bat_priv, orig_node, neigh_node); 745 746 update_tt: 747 /* I have to check for transtable changes only if the OGM has been 748 * sent through a primary interface 749 */ 750 if (((batadv_ogm_packet->orig != ethhdr->h_source) && 751 (batadv_ogm_packet->header.ttl > 2)) || 752 (batadv_ogm_packet->flags & BATADV_PRIMARIES_FIRST_HOP)) 753 batadv_tt_update_orig(bat_priv, orig_node, tt_buff, 754 batadv_ogm_packet->tt_num_changes, 755 batadv_ogm_packet->ttvn, 756 ntohs(batadv_ogm_packet->tt_crc)); 757 758 if (orig_node->gw_flags != batadv_ogm_packet->gw_flags) 759 batadv_gw_node_update(bat_priv, orig_node, 760 batadv_ogm_packet->gw_flags); 761 762 orig_node->gw_flags = batadv_ogm_packet->gw_flags; 763 764 /* restart gateway selection if fast or late switching was enabled */ 765 if ((orig_node->gw_flags) && 766 (atomic_read(&bat_priv->gw_mode) == BATADV_GW_MODE_CLIENT) && 767 (atomic_read(&bat_priv->gw_sel_class) > 2)) 768 batadv_gw_check_election(bat_priv, orig_node); 769 770 goto out; 771 772 unlock: 773 rcu_read_unlock(); 774 out: 775 if (neigh_node) 776 batadv_neigh_node_free_ref(neigh_node); 777 if (router) 778 batadv_neigh_node_free_ref(router); 779 } 780 781 static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node, 782 struct batadv_orig_node *orig_neigh_node, 783 struct batadv_ogm_packet *batadv_ogm_packet, 784 struct batadv_hard_iface *if_incoming) 785 { 786 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); 787 struct batadv_neigh_node *neigh_node = NULL, *tmp_neigh_node; 788 struct hlist_node *node; 789 uint8_t total_count; 790 uint8_t orig_eq_count, neigh_rq_count, neigh_rq_inv, tq_own; 791 unsigned int neigh_rq_inv_cube, neigh_rq_max_cube; 792 int tq_asym_penalty, inv_asym_penalty, ret = 0; 793 unsigned int combined_tq; 794 795 /* find corresponding one hop neighbor */ 796 rcu_read_lock(); 797 hlist_for_each_entry_rcu(tmp_neigh_node, node, 798 &orig_neigh_node->neigh_list, list) { 799 800 if (!batadv_compare_eth(tmp_neigh_node->addr, 801 orig_neigh_node->orig)) 802 continue; 803 804 if (tmp_neigh_node->if_incoming != if_incoming) 805 continue; 806 807 if (!atomic_inc_not_zero(&tmp_neigh_node->refcount)) 808 continue; 809 810 neigh_node = tmp_neigh_node; 811 break; 812 } 813 rcu_read_unlock(); 814 815 if (!neigh_node) 816 neigh_node = batadv_iv_ogm_neigh_new(if_incoming, 817 orig_neigh_node->orig, 818 orig_neigh_node, 819 orig_neigh_node, 820 batadv_ogm_packet->seqno); 821 822 if (!neigh_node) 823 goto out; 824 825 /* if orig_node is direct neighbor update neigh_node last_seen */ 826 if (orig_node == orig_neigh_node) 827 neigh_node->last_seen = jiffies; 828 829 orig_node->last_seen = jiffies; 830 831 /* find packet count of corresponding one hop neighbor */ 832 spin_lock_bh(&orig_node->ogm_cnt_lock); 833 orig_eq_count = orig_neigh_node->bcast_own_sum[if_incoming->if_num]; 834 neigh_rq_count = neigh_node->real_packet_count; 835 spin_unlock_bh(&orig_node->ogm_cnt_lock); 836 837 /* pay attention to not get a value bigger than 100 % */ 838 total_count = (orig_eq_count > neigh_rq_count ? 839 neigh_rq_count : orig_eq_count); 840 841 /* if we have too few packets (too less data) we set tq_own to zero 842 * if we receive too few packets it is not considered bidirectional 843 */ 844 if (total_count < BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM || 845 neigh_rq_count < BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM) 846 tq_own = 0; 847 else 848 /* neigh_node->real_packet_count is never zero as we 849 * only purge old information when getting new 850 * information 851 */ 852 tq_own = (BATADV_TQ_MAX_VALUE * total_count) / neigh_rq_count; 853 854 /* 1 - ((1-x) ** 3), normalized to TQ_MAX_VALUE this does 855 * affect the nearly-symmetric links only a little, but 856 * punishes asymmetric links more. This will give a value 857 * between 0 and TQ_MAX_VALUE 858 */ 859 neigh_rq_inv = BATADV_TQ_LOCAL_WINDOW_SIZE - neigh_rq_count; 860 neigh_rq_inv_cube = neigh_rq_inv * neigh_rq_inv * neigh_rq_inv; 861 neigh_rq_max_cube = BATADV_TQ_LOCAL_WINDOW_SIZE * 862 BATADV_TQ_LOCAL_WINDOW_SIZE * 863 BATADV_TQ_LOCAL_WINDOW_SIZE; 864 inv_asym_penalty = BATADV_TQ_MAX_VALUE * neigh_rq_inv_cube; 865 inv_asym_penalty /= neigh_rq_max_cube; 866 tq_asym_penalty = BATADV_TQ_MAX_VALUE - inv_asym_penalty; 867 868 combined_tq = batadv_ogm_packet->tq * tq_own * tq_asym_penalty; 869 combined_tq /= BATADV_TQ_MAX_VALUE * BATADV_TQ_MAX_VALUE; 870 batadv_ogm_packet->tq = combined_tq; 871 872 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 873 "bidirectional: orig = %-15pM neigh = %-15pM => own_bcast = %2i, real recv = %2i, local tq: %3i, asym_penalty: %3i, total tq: %3i\n", 874 orig_node->orig, orig_neigh_node->orig, total_count, 875 neigh_rq_count, tq_own, 876 tq_asym_penalty, batadv_ogm_packet->tq); 877 878 /* if link has the minimum required transmission quality 879 * consider it bidirectional 880 */ 881 if (batadv_ogm_packet->tq >= BATADV_TQ_TOTAL_BIDRECT_LIMIT) 882 ret = 1; 883 884 out: 885 if (neigh_node) 886 batadv_neigh_node_free_ref(neigh_node); 887 return ret; 888 } 889 890 /* processes a batman packet for all interfaces, adjusts the sequence number and 891 * finds out whether it is a duplicate. 892 * returns: 893 * 1 the packet is a duplicate 894 * 0 the packet has not yet been received 895 * -1 the packet is old and has been received while the seqno window 896 * was protected. Caller should drop it. 897 */ 898 static int 899 batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, 900 const struct batadv_ogm_packet *batadv_ogm_packet, 901 const struct batadv_hard_iface *if_incoming) 902 { 903 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); 904 struct batadv_orig_node *orig_node; 905 struct batadv_neigh_node *tmp_neigh_node; 906 struct hlist_node *node; 907 int is_duplicate = 0; 908 int32_t seq_diff; 909 int need_update = 0; 910 int set_mark, ret = -1; 911 uint32_t seqno = ntohl(batadv_ogm_packet->seqno); 912 uint8_t *neigh_addr; 913 914 orig_node = batadv_get_orig_node(bat_priv, batadv_ogm_packet->orig); 915 if (!orig_node) 916 return 0; 917 918 spin_lock_bh(&orig_node->ogm_cnt_lock); 919 seq_diff = seqno - orig_node->last_real_seqno; 920 921 /* signalize caller that the packet is to be dropped. */ 922 if (!hlist_empty(&orig_node->neigh_list) && 923 batadv_window_protected(bat_priv, seq_diff, 924 &orig_node->batman_seqno_reset)) 925 goto out; 926 927 rcu_read_lock(); 928 hlist_for_each_entry_rcu(tmp_neigh_node, node, 929 &orig_node->neigh_list, list) { 930 931 is_duplicate |= batadv_test_bit(tmp_neigh_node->real_bits, 932 orig_node->last_real_seqno, 933 seqno); 934 935 neigh_addr = tmp_neigh_node->addr; 936 if (batadv_compare_eth(neigh_addr, ethhdr->h_source) && 937 tmp_neigh_node->if_incoming == if_incoming) 938 set_mark = 1; 939 else 940 set_mark = 0; 941 942 /* if the window moved, set the update flag. */ 943 need_update |= batadv_bit_get_packet(bat_priv, 944 tmp_neigh_node->real_bits, 945 seq_diff, set_mark); 946 947 tmp_neigh_node->real_packet_count = 948 bitmap_weight(tmp_neigh_node->real_bits, 949 BATADV_TQ_LOCAL_WINDOW_SIZE); 950 } 951 rcu_read_unlock(); 952 953 if (need_update) { 954 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 955 "updating last_seqno: old %u, new %u\n", 956 orig_node->last_real_seqno, seqno); 957 orig_node->last_real_seqno = seqno; 958 } 959 960 ret = is_duplicate; 961 962 out: 963 spin_unlock_bh(&orig_node->ogm_cnt_lock); 964 batadv_orig_node_free_ref(orig_node); 965 return ret; 966 } 967 968 static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, 969 struct batadv_ogm_packet *batadv_ogm_packet, 970 const unsigned char *tt_buff, 971 struct batadv_hard_iface *if_incoming) 972 { 973 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); 974 struct batadv_hard_iface *hard_iface; 975 struct batadv_orig_node *orig_neigh_node, *orig_node; 976 struct batadv_neigh_node *router = NULL, *router_router = NULL; 977 struct batadv_neigh_node *orig_neigh_router = NULL; 978 int has_directlink_flag; 979 int is_my_addr = 0, is_my_orig = 0, is_my_oldorig = 0; 980 int is_broadcast = 0, is_bidirect; 981 bool is_single_hop_neigh = false; 982 bool is_from_best_next_hop = false; 983 int is_duplicate, sameseq, simlar_ttl; 984 uint32_t if_incoming_seqno; 985 uint8_t *prev_sender; 986 987 /* Silently drop when the batman packet is actually not a 988 * correct packet. 989 * 990 * This might happen if a packet is padded (e.g. Ethernet has a 991 * minimum frame length of 64 byte) and the aggregation interprets 992 * it as an additional length. 993 * 994 * TODO: A more sane solution would be to have a bit in the 995 * batadv_ogm_packet to detect whether the packet is the last 996 * packet in an aggregation. Here we expect that the padding 997 * is always zero (or not 0x01) 998 */ 999 if (batadv_ogm_packet->header.packet_type != BATADV_IV_OGM) 1000 return; 1001 1002 /* could be changed by schedule_own_packet() */ 1003 if_incoming_seqno = atomic_read(&if_incoming->seqno); 1004 1005 if (batadv_ogm_packet->flags & BATADV_DIRECTLINK) 1006 has_directlink_flag = 1; 1007 else 1008 has_directlink_flag = 0; 1009 1010 if (batadv_compare_eth(ethhdr->h_source, batadv_ogm_packet->orig)) 1011 is_single_hop_neigh = true; 1012 1013 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1014 "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", 1015 ethhdr->h_source, if_incoming->net_dev->name, 1016 if_incoming->net_dev->dev_addr, batadv_ogm_packet->orig, 1017 batadv_ogm_packet->prev_sender, 1018 ntohl(batadv_ogm_packet->seqno), batadv_ogm_packet->ttvn, 1019 ntohs(batadv_ogm_packet->tt_crc), 1020 batadv_ogm_packet->tt_num_changes, batadv_ogm_packet->tq, 1021 batadv_ogm_packet->header.ttl, 1022 batadv_ogm_packet->header.version, has_directlink_flag); 1023 1024 rcu_read_lock(); 1025 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 1026 if (hard_iface->if_status != BATADV_IF_ACTIVE) 1027 continue; 1028 1029 if (hard_iface->soft_iface != if_incoming->soft_iface) 1030 continue; 1031 1032 if (batadv_compare_eth(ethhdr->h_source, 1033 hard_iface->net_dev->dev_addr)) 1034 is_my_addr = 1; 1035 1036 if (batadv_compare_eth(batadv_ogm_packet->orig, 1037 hard_iface->net_dev->dev_addr)) 1038 is_my_orig = 1; 1039 1040 if (batadv_compare_eth(batadv_ogm_packet->prev_sender, 1041 hard_iface->net_dev->dev_addr)) 1042 is_my_oldorig = 1; 1043 1044 if (is_broadcast_ether_addr(ethhdr->h_source)) 1045 is_broadcast = 1; 1046 } 1047 rcu_read_unlock(); 1048 1049 if (batadv_ogm_packet->header.version != BATADV_COMPAT_VERSION) { 1050 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1051 "Drop packet: incompatible batman version (%i)\n", 1052 batadv_ogm_packet->header.version); 1053 return; 1054 } 1055 1056 if (is_my_addr) { 1057 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1058 "Drop packet: received my own broadcast (sender: %pM)\n", 1059 ethhdr->h_source); 1060 return; 1061 } 1062 1063 if (is_broadcast) { 1064 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1065 "Drop packet: ignoring all packets with broadcast source addr (sender: %pM)\n", 1066 ethhdr->h_source); 1067 return; 1068 } 1069 1070 if (is_my_orig) { 1071 unsigned long *word; 1072 int offset; 1073 int32_t bit_pos; 1074 int16_t if_num; 1075 uint8_t *weight; 1076 1077 orig_neigh_node = batadv_get_orig_node(bat_priv, 1078 ethhdr->h_source); 1079 if (!orig_neigh_node) 1080 return; 1081 1082 /* neighbor has to indicate direct link and it has to 1083 * come via the corresponding interface 1084 * save packet seqno for bidirectional check 1085 */ 1086 if (has_directlink_flag && 1087 batadv_compare_eth(if_incoming->net_dev->dev_addr, 1088 batadv_ogm_packet->orig)) { 1089 if_num = if_incoming->if_num; 1090 offset = if_num * BATADV_NUM_WORDS; 1091 1092 spin_lock_bh(&orig_neigh_node->ogm_cnt_lock); 1093 word = &(orig_neigh_node->bcast_own[offset]); 1094 bit_pos = if_incoming_seqno - 2; 1095 bit_pos -= ntohl(batadv_ogm_packet->seqno); 1096 batadv_set_bit(word, bit_pos); 1097 weight = &orig_neigh_node->bcast_own_sum[if_num]; 1098 *weight = bitmap_weight(word, 1099 BATADV_TQ_LOCAL_WINDOW_SIZE); 1100 spin_unlock_bh(&orig_neigh_node->ogm_cnt_lock); 1101 } 1102 1103 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1104 "Drop packet: originator packet from myself (via neighbor)\n"); 1105 batadv_orig_node_free_ref(orig_neigh_node); 1106 return; 1107 } 1108 1109 if (is_my_oldorig) { 1110 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1111 "Drop packet: ignoring all rebroadcast echos (sender: %pM)\n", 1112 ethhdr->h_source); 1113 return; 1114 } 1115 1116 if (batadv_ogm_packet->flags & BATADV_NOT_BEST_NEXT_HOP) { 1117 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1118 "Drop packet: ignoring all packets not forwarded from the best next hop (sender: %pM)\n", 1119 ethhdr->h_source); 1120 return; 1121 } 1122 1123 orig_node = batadv_get_orig_node(bat_priv, batadv_ogm_packet->orig); 1124 if (!orig_node) 1125 return; 1126 1127 is_duplicate = batadv_iv_ogm_update_seqnos(ethhdr, batadv_ogm_packet, 1128 if_incoming); 1129 1130 if (is_duplicate == -1) { 1131 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1132 "Drop packet: packet within seqno protection time (sender: %pM)\n", 1133 ethhdr->h_source); 1134 goto out; 1135 } 1136 1137 if (batadv_ogm_packet->tq == 0) { 1138 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1139 "Drop packet: originator packet with tq equal 0\n"); 1140 goto out; 1141 } 1142 1143 router = batadv_orig_node_get_router(orig_node); 1144 if (router) 1145 router_router = batadv_orig_node_get_router(router->orig_node); 1146 1147 if ((router && router->tq_avg != 0) && 1148 (batadv_compare_eth(router->addr, ethhdr->h_source))) 1149 is_from_best_next_hop = true; 1150 1151 prev_sender = batadv_ogm_packet->prev_sender; 1152 /* avoid temporary routing loops */ 1153 if (router && router_router && 1154 (batadv_compare_eth(router->addr, prev_sender)) && 1155 !(batadv_compare_eth(batadv_ogm_packet->orig, prev_sender)) && 1156 (batadv_compare_eth(router->addr, router_router->addr))) { 1157 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1158 "Drop packet: ignoring all rebroadcast packets that may make me loop (sender: %pM)\n", 1159 ethhdr->h_source); 1160 goto out; 1161 } 1162 1163 /* if sender is a direct neighbor the sender mac equals 1164 * originator mac 1165 */ 1166 orig_neigh_node = (is_single_hop_neigh ? 1167 orig_node : 1168 batadv_get_orig_node(bat_priv, ethhdr->h_source)); 1169 if (!orig_neigh_node) 1170 goto out; 1171 1172 orig_neigh_router = batadv_orig_node_get_router(orig_neigh_node); 1173 1174 /* drop packet if sender is not a direct neighbor and if we 1175 * don't route towards it 1176 */ 1177 if (!is_single_hop_neigh && (!orig_neigh_router)) { 1178 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1179 "Drop packet: OGM via unknown neighbor!\n"); 1180 goto out_neigh; 1181 } 1182 1183 is_bidirect = batadv_iv_ogm_calc_tq(orig_node, orig_neigh_node, 1184 batadv_ogm_packet, if_incoming); 1185 1186 batadv_bonding_save_primary(orig_node, orig_neigh_node, 1187 batadv_ogm_packet); 1188 1189 /* update ranking if it is not a duplicate or has the same 1190 * seqno and similar ttl as the non-duplicate 1191 */ 1192 sameseq = orig_node->last_real_seqno == ntohl(batadv_ogm_packet->seqno); 1193 simlar_ttl = orig_node->last_ttl - 3 <= batadv_ogm_packet->header.ttl; 1194 if (is_bidirect && (!is_duplicate || (sameseq && simlar_ttl))) 1195 batadv_iv_ogm_orig_update(bat_priv, orig_node, ethhdr, 1196 batadv_ogm_packet, if_incoming, 1197 tt_buff, is_duplicate); 1198 1199 /* is single hop (direct) neighbor */ 1200 if (is_single_hop_neigh) { 1201 1202 /* mark direct link on incoming interface */ 1203 batadv_iv_ogm_forward(orig_node, ethhdr, batadv_ogm_packet, 1204 is_single_hop_neigh, 1205 is_from_best_next_hop, if_incoming); 1206 1207 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1208 "Forwarding packet: rebroadcast neighbor packet with direct link flag\n"); 1209 goto out_neigh; 1210 } 1211 1212 /* multihop originator */ 1213 if (!is_bidirect) { 1214 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1215 "Drop packet: not received via bidirectional link\n"); 1216 goto out_neigh; 1217 } 1218 1219 if (is_duplicate) { 1220 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1221 "Drop packet: duplicate packet received\n"); 1222 goto out_neigh; 1223 } 1224 1225 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1226 "Forwarding packet: rebroadcast originator packet\n"); 1227 batadv_iv_ogm_forward(orig_node, ethhdr, batadv_ogm_packet, 1228 is_single_hop_neigh, is_from_best_next_hop, 1229 if_incoming); 1230 1231 out_neigh: 1232 if ((orig_neigh_node) && (!is_single_hop_neigh)) 1233 batadv_orig_node_free_ref(orig_neigh_node); 1234 out: 1235 if (router) 1236 batadv_neigh_node_free_ref(router); 1237 if (router_router) 1238 batadv_neigh_node_free_ref(router_router); 1239 if (orig_neigh_router) 1240 batadv_neigh_node_free_ref(orig_neigh_router); 1241 1242 batadv_orig_node_free_ref(orig_node); 1243 } 1244 1245 static int batadv_iv_ogm_receive(struct sk_buff *skb, 1246 struct batadv_hard_iface *if_incoming) 1247 { 1248 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); 1249 struct batadv_ogm_packet *batadv_ogm_packet; 1250 struct ethhdr *ethhdr; 1251 int buff_pos = 0, packet_len; 1252 unsigned char *tt_buff, *packet_buff; 1253 bool ret; 1254 1255 ret = batadv_check_management_packet(skb, if_incoming, BATADV_OGM_HLEN); 1256 if (!ret) 1257 return NET_RX_DROP; 1258 1259 /* did we receive a B.A.T.M.A.N. IV OGM packet on an interface 1260 * that does not have B.A.T.M.A.N. IV enabled ? 1261 */ 1262 if (bat_priv->bat_algo_ops->bat_ogm_emit != batadv_iv_ogm_emit) 1263 return NET_RX_DROP; 1264 1265 batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_RX); 1266 batadv_add_counter(bat_priv, BATADV_CNT_MGMT_RX_BYTES, 1267 skb->len + ETH_HLEN); 1268 1269 packet_len = skb_headlen(skb); 1270 ethhdr = (struct ethhdr *)skb_mac_header(skb); 1271 packet_buff = skb->data; 1272 batadv_ogm_packet = (struct batadv_ogm_packet *)packet_buff; 1273 1274 /* unpack the aggregated packets and process them one by one */ 1275 do { 1276 tt_buff = packet_buff + buff_pos + BATADV_OGM_HLEN; 1277 1278 batadv_iv_ogm_process(ethhdr, batadv_ogm_packet, tt_buff, 1279 if_incoming); 1280 1281 buff_pos += BATADV_OGM_HLEN; 1282 buff_pos += batadv_tt_len(batadv_ogm_packet->tt_num_changes); 1283 1284 batadv_ogm_packet = (struct batadv_ogm_packet *) 1285 (packet_buff + buff_pos); 1286 } while (batadv_iv_ogm_aggr_packet(buff_pos, packet_len, 1287 batadv_ogm_packet->tt_num_changes)); 1288 1289 kfree_skb(skb); 1290 return NET_RX_SUCCESS; 1291 } 1292 1293 static struct batadv_algo_ops batadv_batman_iv __read_mostly = { 1294 .name = "BATMAN_IV", 1295 .bat_iface_enable = batadv_iv_ogm_iface_enable, 1296 .bat_iface_disable = batadv_iv_ogm_iface_disable, 1297 .bat_iface_update_mac = batadv_iv_ogm_iface_update_mac, 1298 .bat_primary_iface_set = batadv_iv_ogm_primary_iface_set, 1299 .bat_ogm_schedule = batadv_iv_ogm_schedule, 1300 .bat_ogm_emit = batadv_iv_ogm_emit, 1301 }; 1302 1303 int __init batadv_iv_init(void) 1304 { 1305 int ret; 1306 1307 /* batman originator packet */ 1308 ret = batadv_recv_handler_register(BATADV_IV_OGM, 1309 batadv_iv_ogm_receive); 1310 if (ret < 0) 1311 goto out; 1312 1313 ret = batadv_algo_register(&batadv_batman_iv); 1314 if (ret < 0) 1315 goto handler_unregister; 1316 1317 goto out; 1318 1319 handler_unregister: 1320 batadv_recv_handler_unregister(BATADV_IV_OGM); 1321 out: 1322 return ret; 1323 } 1324