1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (C) B.A.T.M.A.N. contributors: 3 * 4 * Marek Lindner, Simon Wunderlich 5 */ 6 7 #include "routing.h" 8 #include "main.h" 9 10 #include <linux/atomic.h> 11 #include <linux/build_bug.h> 12 #include <linux/byteorder/generic.h> 13 #include <linux/compiler.h> 14 #include <linux/errno.h> 15 #include <linux/etherdevice.h> 16 #include <linux/if_ether.h> 17 #include <linux/jiffies.h> 18 #include <linux/kref.h> 19 #include <linux/netdevice.h> 20 #include <linux/printk.h> 21 #include <linux/rculist.h> 22 #include <linux/rcupdate.h> 23 #include <linux/skbuff.h> 24 #include <linux/spinlock.h> 25 #include <linux/stddef.h> 26 #include <uapi/linux/batadv_packet.h> 27 28 #include "bitarray.h" 29 #include "bridge_loop_avoidance.h" 30 #include "distributed-arp-table.h" 31 #include "fragmentation.h" 32 #include "hard-interface.h" 33 #include "log.h" 34 #include "mesh-interface.h" 35 #include "originator.h" 36 #include "send.h" 37 #include "tp_meter.h" 38 #include "translation-table.h" 39 #include "tvlv.h" 40 41 static int batadv_route_unicast_packet(struct sk_buff *skb, 42 struct batadv_hard_iface *recv_if); 43 44 /** 45 * _batadv_update_route() - set the router for this originator 46 * @bat_priv: the bat priv with all the mesh interface information 47 * @orig_node: orig node which is to be configured 48 * @recv_if: the receive interface for which this route is set 49 * @neigh_node: neighbor which should be the next router 50 * 51 * This function does not perform any error checks 52 */ 53 static void _batadv_update_route(struct batadv_priv *bat_priv, 54 struct batadv_orig_node *orig_node, 55 struct batadv_hard_iface *recv_if, 56 struct batadv_neigh_node *neigh_node) 57 { 58 struct batadv_orig_ifinfo *orig_ifinfo; 59 struct batadv_neigh_node *curr_router; 60 61 orig_ifinfo = batadv_orig_ifinfo_get(orig_node, recv_if); 62 if (!orig_ifinfo) 63 return; 64 65 spin_lock_bh(&orig_node->neigh_list_lock); 66 /* curr_router used earlier may not be the current orig_ifinfo->router 67 * anymore because it was dereferenced outside of the neigh_list_lock 68 * protected region. After the new best neighbor has replace the current 69 * best neighbor the reference counter needs to decrease. Consequently, 70 * the code needs to ensure the curr_router variable contains a pointer 71 * to the replaced best neighbor. 72 */ 73 74 /* increase refcount of new best neighbor */ 75 if (neigh_node) 76 kref_get(&neigh_node->refcount); 77 78 curr_router = rcu_replace_pointer(orig_ifinfo->router, neigh_node, 79 true); 80 spin_unlock_bh(&orig_node->neigh_list_lock); 81 batadv_orig_ifinfo_put(orig_ifinfo); 82 83 /* route deleted */ 84 if (curr_router && !neigh_node) { 85 batadv_dbg(BATADV_DBG_ROUTES, bat_priv, 86 "Deleting route towards: %pM\n", orig_node->orig); 87 batadv_tt_global_del_orig(bat_priv, orig_node, -1, 88 "Deleted route towards originator"); 89 90 /* route added */ 91 } else if (!curr_router && neigh_node) { 92 batadv_dbg(BATADV_DBG_ROUTES, bat_priv, 93 "Adding route towards: %pM (via %pM)\n", 94 orig_node->orig, neigh_node->addr); 95 /* route changed */ 96 } else if (neigh_node && curr_router) { 97 batadv_dbg(BATADV_DBG_ROUTES, bat_priv, 98 "Changing route towards: %pM (now via %pM - was via %pM)\n", 99 orig_node->orig, neigh_node->addr, 100 curr_router->addr); 101 } 102 103 /* decrease refcount of previous best neighbor */ 104 batadv_neigh_node_put(curr_router); 105 } 106 107 /** 108 * batadv_update_route() - set the router for this originator 109 * @bat_priv: the bat priv with all the mesh interface information 110 * @orig_node: orig node which is to be configured 111 * @recv_if: the receive interface for which this route is set 112 * @neigh_node: neighbor which should be the next router 113 */ 114 void batadv_update_route(struct batadv_priv *bat_priv, 115 struct batadv_orig_node *orig_node, 116 struct batadv_hard_iface *recv_if, 117 struct batadv_neigh_node *neigh_node) 118 { 119 struct batadv_neigh_node *router = NULL; 120 121 if (!orig_node) 122 goto out; 123 124 router = batadv_orig_router_get(orig_node, recv_if); 125 126 if (router != neigh_node) 127 _batadv_update_route(bat_priv, orig_node, recv_if, neigh_node); 128 129 out: 130 batadv_neigh_node_put(router); 131 } 132 133 /** 134 * batadv_window_protected() - checks whether the host restarted and is in the 135 * protection time. 136 * @bat_priv: the bat priv with all the mesh interface information 137 * @seq_num_diff: difference between the current/received sequence number and 138 * the last sequence number 139 * @seq_old_max_diff: maximum age of sequence number not considered as restart 140 * @last_reset: jiffies timestamp of the last reset, will be updated when reset 141 * is detected 142 * @protection_started: is set to true if the protection window was started, 143 * doesn't change otherwise. 144 * 145 * Return: 146 * false if the packet is to be accepted. 147 * true if the packet is to be ignored. 148 */ 149 bool batadv_window_protected(struct batadv_priv *bat_priv, s32 seq_num_diff, 150 s32 seq_old_max_diff, unsigned long *last_reset, 151 bool *protection_started) 152 { 153 if (seq_num_diff <= -seq_old_max_diff || 154 seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) { 155 if (!batadv_has_timed_out(*last_reset, 156 BATADV_RESET_PROTECTION_MS)) 157 return true; 158 159 *last_reset = jiffies; 160 if (protection_started) 161 *protection_started = true; 162 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 163 "old packet received, start protection\n"); 164 } 165 166 return false; 167 } 168 169 /** 170 * batadv_check_management_packet() - Check preconditions for management packets 171 * @skb: incoming packet buffer 172 * @hard_iface: incoming hard interface 173 * @header_len: minimal header length of packet type 174 * 175 * Warning: This function may reallocate the skb data buffer via 176 * skb_cow()/skb_linearize()/... Any pointer into the skb data (e.g. 177 * obtained from skb->data or eth_hdr()) before this call must be 178 * considered invalid afterwards and has to be reacquired. 179 * 180 * Return: true when management preconditions are met, false otherwise 181 */ 182 bool batadv_check_management_packet(struct sk_buff *skb, 183 struct batadv_hard_iface *hard_iface, 184 int header_len) 185 { 186 struct ethhdr *ethhdr; 187 188 /* drop packet if it has not necessary minimum size */ 189 if (unlikely(!pskb_may_pull(skb, header_len))) 190 return false; 191 192 ethhdr = eth_hdr(skb); 193 194 /* packet with broadcast indication but unicast recipient */ 195 if (!is_broadcast_ether_addr(ethhdr->h_dest)) 196 return false; 197 198 /* packet with invalid sender address */ 199 if (!is_valid_ether_addr(ethhdr->h_source)) 200 return false; 201 202 /* create a copy of the skb, if needed, to modify it. */ 203 if (skb_cow(skb, 0) < 0) 204 return false; 205 206 /* keep skb linear */ 207 if (skb_linearize(skb) < 0) 208 return false; 209 210 return true; 211 } 212 213 /** 214 * batadv_skb_decrement_ttl() - decrement ttl in a batman-adv header, csum-safe 215 * @skb: the received packet with @skb->data pointing to the batman-adv header 216 * 217 * Supports the following packet types, all of which carry the TTL at offset 2: 218 * 219 * - batadv_ogm_packet 220 * - batadv_ogm2_packet 221 * - batadv_icmp_header 222 * - batadv_icmp_packet 223 * - batadv_icmp_tp_packet 224 * - batadv_icmp_packet_rr 225 * - batadv_unicast_packet 226 * - batadv_frag_packet 227 * - batadv_bcast_packet 228 * - batadv_mcast_packet 229 * - batadv_coded_packet 230 * - batadv_unicast_tvlv_packet 231 * 232 * Return: true if the packet may be forwarded (ttl decremented), 233 * false if it must be dropped (ttl would expire) 234 */ 235 static bool batadv_skb_decrement_ttl(struct sk_buff *skb) 236 { 237 static const size_t ttl_offset = 2; 238 u8 *ttl_pos; 239 240 BUILD_BUG_ON(offsetof(struct batadv_ogm_packet, ttl) != ttl_offset); 241 BUILD_BUG_ON(offsetof(struct batadv_ogm2_packet, ttl) != ttl_offset); 242 BUILD_BUG_ON(offsetof(struct batadv_icmp_header, ttl) != ttl_offset); 243 BUILD_BUG_ON(offsetof(struct batadv_icmp_packet, ttl) != ttl_offset); 244 BUILD_BUG_ON(offsetof(struct batadv_icmp_tp_packet, ttl) != ttl_offset); 245 BUILD_BUG_ON(offsetof(struct batadv_icmp_packet_rr, ttl) != ttl_offset); 246 BUILD_BUG_ON(offsetof(struct batadv_unicast_packet, ttl) != ttl_offset); 247 BUILD_BUG_ON(offsetof(struct batadv_frag_packet, ttl) != ttl_offset); 248 BUILD_BUG_ON(offsetof(struct batadv_bcast_packet, ttl) != ttl_offset); 249 BUILD_BUG_ON(offsetof(struct batadv_mcast_packet, ttl) != ttl_offset); 250 BUILD_BUG_ON(offsetof(struct batadv_coded_packet, ttl) != ttl_offset); 251 BUILD_BUG_ON(offsetof(struct batadv_unicast_tvlv_packet, ttl) != ttl_offset); 252 253 ttl_pos = skb->data + ttl_offset; 254 255 /* would expire on this hop -> drop, leave header + csum untouched */ 256 if (*ttl_pos < 2) 257 return false; 258 259 skb_postpull_rcsum(skb, ttl_pos, 1); 260 (*ttl_pos)--; 261 skb_postpush_rcsum(skb, ttl_pos, 1); 262 263 return true; 264 } 265 266 /** 267 * batadv_recv_my_icmp_packet() - receive an icmp packet locally 268 * @bat_priv: the bat priv with all the mesh interface information 269 * @skb: icmp packet to process 270 * 271 * Return: NET_RX_SUCCESS on success or NET_RX_DROP in case of failure 272 */ 273 static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv, 274 struct sk_buff *skb) 275 { 276 struct batadv_hard_iface *primary_if = NULL; 277 struct batadv_orig_node *orig_node = NULL; 278 struct batadv_icmp_header *icmph; 279 int ret = NET_RX_DROP; 280 int res; 281 282 icmph = (struct batadv_icmp_header *)skb->data; 283 284 switch (icmph->msg_type) { 285 case BATADV_ECHO_REQUEST: 286 /* answer echo request (ping) */ 287 primary_if = batadv_primary_if_get_selected(bat_priv); 288 if (!primary_if) 289 goto out; 290 291 /* get routing information */ 292 orig_node = batadv_orig_hash_find(bat_priv, icmph->orig); 293 if (!orig_node) 294 goto out; 295 296 /* create a copy of the skb, if needed, to modify it. */ 297 if (skb_cow(skb, ETH_HLEN) < 0) 298 goto out; 299 300 icmph = (struct batadv_icmp_header *)skb->data; 301 302 ether_addr_copy(icmph->dst, icmph->orig); 303 ether_addr_copy(icmph->orig, primary_if->net_dev->dev_addr); 304 icmph->msg_type = BATADV_ECHO_REPLY; 305 icmph->ttl = BATADV_TTL; 306 307 res = batadv_send_skb_to_orig(skb, orig_node, NULL); 308 if (res == NET_XMIT_SUCCESS) 309 ret = NET_RX_SUCCESS; 310 311 /* skb was consumed */ 312 skb = NULL; 313 break; 314 case BATADV_TP: 315 if (!pskb_may_pull(skb, sizeof(struct batadv_icmp_tp_packet))) 316 goto out; 317 318 batadv_tp_meter_recv(bat_priv, skb); 319 ret = NET_RX_SUCCESS; 320 /* skb was consumed */ 321 skb = NULL; 322 goto out; 323 default: 324 /* drop unknown type */ 325 goto out; 326 } 327 out: 328 batadv_hardif_put(primary_if); 329 batadv_orig_node_put(orig_node); 330 331 kfree_skb(skb); 332 333 return ret; 334 } 335 336 /** 337 * batadv_recv_icmp_ttl_exceeded() - handle an ICMP packet that hit TTL 0 338 * @bat_priv: the bat priv with all the mesh interface information 339 * @skb: ICMP packet whose TTL has expired 340 * 341 * For traceroute-style ICMP echo requests, send a TTL exceeded reply back to 342 * the source. Other ICMP types are simply dropped. 343 * 344 * Return: NET_RX_SUCCESS if the reply was queued, NET_RX_DROP otherwise 345 */ 346 static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv, 347 struct sk_buff *skb) 348 { 349 struct batadv_hard_iface *primary_if = NULL; 350 struct batadv_orig_node *orig_node = NULL; 351 struct batadv_icmp_packet *icmp_packet; 352 int ret = NET_RX_DROP; 353 int res; 354 355 icmp_packet = (struct batadv_icmp_packet *)skb->data; 356 357 /* send TTL exceeded if packet is an echo request (traceroute) */ 358 if (icmp_packet->msg_type != BATADV_ECHO_REQUEST) { 359 pr_debug("Warning - can't forward icmp packet from %pM to %pM: ttl exceeded\n", 360 icmp_packet->orig, icmp_packet->dst); 361 goto out; 362 } 363 364 primary_if = batadv_primary_if_get_selected(bat_priv); 365 if (!primary_if) 366 goto out; 367 368 /* get routing information */ 369 orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig); 370 if (!orig_node) 371 goto out; 372 373 /* create a copy of the skb, if needed, to modify it. */ 374 if (skb_cow(skb, ETH_HLEN) < 0) 375 goto out; 376 377 icmp_packet = (struct batadv_icmp_packet *)skb->data; 378 379 ether_addr_copy(icmp_packet->dst, icmp_packet->orig); 380 ether_addr_copy(icmp_packet->orig, primary_if->net_dev->dev_addr); 381 icmp_packet->msg_type = BATADV_TTL_EXCEEDED; 382 icmp_packet->ttl = BATADV_TTL; 383 384 res = batadv_send_skb_to_orig(skb, orig_node, NULL); 385 if (res == NET_XMIT_SUCCESS) 386 ret = NET_RX_SUCCESS; 387 388 /* skb was consumed */ 389 skb = NULL; 390 391 out: 392 batadv_hardif_put(primary_if); 393 batadv_orig_node_put(orig_node); 394 395 kfree_skb(skb); 396 397 return ret; 398 } 399 400 /** 401 * batadv_recv_icmp_packet() - Process incoming icmp packet 402 * @skb: incoming packet buffer 403 * @recv_if: incoming hard interface 404 * 405 * Return: NET_RX_SUCCESS on success or NET_RX_DROP in case of failure 406 */ 407 int batadv_recv_icmp_packet(struct sk_buff *skb, 408 struct batadv_hard_iface *recv_if) 409 { 410 struct batadv_priv *bat_priv = netdev_priv(recv_if->mesh_iface); 411 int hdr_size = sizeof(struct batadv_icmp_header); 412 struct batadv_icmp_packet_rr *icmp_packet_rr; 413 struct batadv_orig_node *orig_node = NULL; 414 struct batadv_icmp_header *icmph; 415 struct ethhdr *ethhdr; 416 int ret = NET_RX_DROP; 417 int res; 418 419 /* drop packet if it has not necessary minimum size */ 420 if (unlikely(!pskb_may_pull(skb, hdr_size))) 421 goto free_skb; 422 423 ethhdr = eth_hdr(skb); 424 425 /* packet with unicast indication but non-unicast recipient */ 426 if (!is_valid_ether_addr(ethhdr->h_dest)) 427 goto free_skb; 428 429 /* packet with broadcast/multicast sender address */ 430 if (is_multicast_ether_addr(ethhdr->h_source)) 431 goto free_skb; 432 433 /* not for me */ 434 if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest)) 435 goto free_skb; 436 437 icmph = (struct batadv_icmp_header *)skb->data; 438 439 /* add record route information if not full */ 440 if ((icmph->msg_type == BATADV_ECHO_REPLY || 441 icmph->msg_type == BATADV_ECHO_REQUEST) && 442 skb->len >= sizeof(struct batadv_icmp_packet_rr)) { 443 if (skb_linearize(skb) < 0) 444 goto free_skb; 445 446 /* create a copy of the skb, if needed, to modify it. */ 447 if (skb_cow(skb, ETH_HLEN) < 0) 448 goto free_skb; 449 450 ethhdr = eth_hdr(skb); 451 icmph = (struct batadv_icmp_header *)skb->data; 452 icmp_packet_rr = (struct batadv_icmp_packet_rr *)icmph; 453 if (icmp_packet_rr->rr_cur >= BATADV_RR_LEN) 454 goto free_skb; 455 456 ether_addr_copy(icmp_packet_rr->rr[icmp_packet_rr->rr_cur], 457 ethhdr->h_dest); 458 icmp_packet_rr->rr_cur++; 459 } 460 461 /* packet for me */ 462 if (batadv_is_my_mac(bat_priv, icmph->dst)) 463 return batadv_recv_my_icmp_packet(bat_priv, skb); 464 465 /* TTL exceeded */ 466 if (icmph->ttl < 2) 467 return batadv_recv_icmp_ttl_exceeded(bat_priv, skb); 468 469 /* get routing information */ 470 orig_node = batadv_orig_hash_find(bat_priv, icmph->dst); 471 if (!orig_node) 472 goto free_skb; 473 474 /* create a copy of the skb, if needed, to modify it. */ 475 if (skb_cow(skb, ETH_HLEN) < 0) 476 goto put_orig_node; 477 478 icmph = (struct batadv_icmp_header *)skb->data; 479 480 /* decrement ttl */ 481 icmph->ttl--; 482 483 /* route it */ 484 res = batadv_send_skb_to_orig(skb, orig_node, recv_if); 485 if (res == NET_XMIT_SUCCESS) 486 ret = NET_RX_SUCCESS; 487 488 /* skb was consumed */ 489 skb = NULL; 490 491 put_orig_node: 492 batadv_orig_node_put(orig_node); 493 free_skb: 494 kfree_skb(skb); 495 496 return ret; 497 } 498 499 /** 500 * batadv_check_unicast_packet() - Check for malformed unicast packets 501 * @bat_priv: the bat priv with all the mesh interface information 502 * @skb: packet to check 503 * @hdr_size: size of header to pull 504 * 505 * Checks for short header and bad addresses in the given packet. 506 * 507 * Return: negative value when check fails and 0 otherwise. The negative value 508 * depends on the reason: -ENODATA for bad header, -EBADR for broadcast 509 * destination or source, and -EREMOTE for non-local (other host) destination. 510 */ 511 static int batadv_check_unicast_packet(struct batadv_priv *bat_priv, 512 struct sk_buff *skb, int hdr_size) 513 { 514 struct ethhdr *ethhdr; 515 516 /* drop packet if it has not necessary minimum size */ 517 if (unlikely(!pskb_may_pull(skb, hdr_size))) 518 return -ENODATA; 519 520 ethhdr = eth_hdr(skb); 521 522 /* packet with unicast indication but non-unicast recipient */ 523 if (!is_valid_ether_addr(ethhdr->h_dest)) 524 return -EBADR; 525 526 /* packet with broadcast/multicast sender address */ 527 if (is_multicast_ether_addr(ethhdr->h_source)) 528 return -EBADR; 529 530 /* not for me */ 531 if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest)) 532 return -EREMOTE; 533 534 return 0; 535 } 536 537 /** 538 * batadv_last_bonding_get() - Get last_bonding_candidate of orig_node 539 * @orig_node: originator node whose last bonding candidate should be retrieved 540 * 541 * Return: last bonding candidate of router or NULL if not found 542 * 543 * The object is returned with refcounter increased by 1. 544 */ 545 static struct batadv_orig_ifinfo * 546 batadv_last_bonding_get(struct batadv_orig_node *orig_node) 547 { 548 struct batadv_orig_ifinfo *last_bonding_candidate; 549 550 spin_lock_bh(&orig_node->neigh_list_lock); 551 last_bonding_candidate = orig_node->last_bonding_candidate; 552 553 if (last_bonding_candidate) 554 kref_get(&last_bonding_candidate->refcount); 555 spin_unlock_bh(&orig_node->neigh_list_lock); 556 557 return last_bonding_candidate; 558 } 559 560 /** 561 * batadv_last_bonding_replace() - Replace last_bonding_candidate of orig_node 562 * @orig_node: originator node whose bonding candidates should be replaced 563 * @new_candidate: new bonding candidate or NULL 564 */ 565 static void 566 batadv_last_bonding_replace(struct batadv_orig_node *orig_node, 567 struct batadv_orig_ifinfo *new_candidate) 568 { 569 struct batadv_orig_ifinfo *old_candidate; 570 571 spin_lock_bh(&orig_node->neigh_list_lock); 572 old_candidate = orig_node->last_bonding_candidate; 573 574 if (new_candidate) 575 kref_get(&new_candidate->refcount); 576 orig_node->last_bonding_candidate = new_candidate; 577 spin_unlock_bh(&orig_node->neigh_list_lock); 578 579 batadv_orig_ifinfo_put(old_candidate); 580 } 581 582 /** 583 * batadv_find_router() - find a suitable router for this originator 584 * @bat_priv: the bat priv with all the mesh interface information 585 * @orig_node: the destination node 586 * @recv_if: pointer to interface this packet was received on 587 * 588 * Return: the router which should be used for this orig_node on 589 * this interface, or NULL if not available. 590 */ 591 struct batadv_neigh_node * 592 batadv_find_router(struct batadv_priv *bat_priv, 593 struct batadv_orig_node *orig_node, 594 struct batadv_hard_iface *recv_if) 595 { 596 struct batadv_neigh_node *first_candidate_router = NULL; 597 struct batadv_neigh_node *next_candidate_router = NULL; 598 struct batadv_neigh_node *last_cand_router = NULL; 599 struct batadv_orig_ifinfo *first_candidate = NULL; 600 struct batadv_algo_ops *bao = bat_priv->algo_ops; 601 struct batadv_orig_ifinfo *next_candidate = NULL; 602 struct batadv_neigh_node *cand_router = NULL; 603 struct batadv_orig_ifinfo *last_candidate; 604 bool last_candidate_found = false; 605 struct batadv_neigh_node *router; 606 struct batadv_orig_ifinfo *cand; 607 608 if (!orig_node) 609 return NULL; 610 611 router = batadv_orig_router_get(orig_node, recv_if); 612 613 if (!router) 614 return router; 615 616 /* only consider bonding for recv_if == BATADV_IF_DEFAULT (first hop) 617 * and if activated. 618 */ 619 if (!(recv_if == BATADV_IF_DEFAULT && READ_ONCE(bat_priv->bonding))) 620 return router; 621 622 /* bonding: loop through the list of possible routers found 623 * for the various outgoing interfaces and find a candidate after 624 * the last chosen bonding candidate (next_candidate). If no such 625 * router is found, use the first candidate found (the previously 626 * chosen bonding candidate might have been the last one in the list). 627 * If this can't be found either, return the previously chosen 628 * router - obviously there are no other candidates. 629 */ 630 rcu_read_lock(); 631 last_candidate = batadv_last_bonding_get(orig_node); 632 if (last_candidate) 633 last_cand_router = rcu_dereference(last_candidate->router); 634 635 hlist_for_each_entry_rcu(cand, &orig_node->ifinfo_list, list) { 636 /* acquire some structures and references ... */ 637 if (!kref_get_unless_zero(&cand->refcount)) 638 continue; 639 640 cand_router = rcu_dereference(cand->router); 641 if (!cand_router) 642 goto next; 643 644 if (!kref_get_unless_zero(&cand_router->refcount)) { 645 cand_router = NULL; 646 goto next; 647 } 648 649 /* alternative candidate should be good enough to be 650 * considered 651 */ 652 if (!bao->neigh.is_similar_or_better(cand_router, 653 cand->if_outgoing, router, 654 recv_if)) 655 goto next; 656 657 /* don't use the same router twice */ 658 if (last_cand_router == cand_router) 659 goto next; 660 661 /* mark the first possible candidate */ 662 if (!first_candidate) { 663 kref_get(&cand_router->refcount); 664 kref_get(&cand->refcount); 665 first_candidate = cand; 666 first_candidate_router = cand_router; 667 } 668 669 /* check if the loop has already passed the previously selected 670 * candidate ... this function should select the next candidate 671 * AFTER the previously used bonding candidate. 672 */ 673 if (!last_candidate || last_candidate_found) { 674 next_candidate = cand; 675 next_candidate_router = cand_router; 676 break; 677 } 678 679 if (last_candidate == cand) 680 last_candidate_found = true; 681 next: 682 /* free references */ 683 if (cand_router) { 684 batadv_neigh_node_put(cand_router); 685 cand_router = NULL; 686 } 687 batadv_orig_ifinfo_put(cand); 688 } 689 rcu_read_unlock(); 690 691 /* After finding candidates, handle the three cases: 692 * 1) there is a next candidate, use that 693 * 2) there is no next candidate, use the first of the list 694 * 3) there is no candidate at all, return the default router 695 */ 696 if (next_candidate) { 697 batadv_neigh_node_put(router); 698 699 kref_get(&next_candidate_router->refcount); 700 router = next_candidate_router; 701 batadv_last_bonding_replace(orig_node, next_candidate); 702 } else if (first_candidate) { 703 batadv_neigh_node_put(router); 704 705 kref_get(&first_candidate_router->refcount); 706 router = first_candidate_router; 707 batadv_last_bonding_replace(orig_node, first_candidate); 708 } else { 709 batadv_last_bonding_replace(orig_node, NULL); 710 } 711 712 /* cleanup of candidates */ 713 if (first_candidate) { 714 batadv_neigh_node_put(first_candidate_router); 715 batadv_orig_ifinfo_put(first_candidate); 716 } 717 718 if (next_candidate) { 719 batadv_neigh_node_put(next_candidate_router); 720 batadv_orig_ifinfo_put(next_candidate); 721 } 722 723 batadv_orig_ifinfo_put(last_candidate); 724 725 return router; 726 } 727 728 /** 729 * batadv_route_unicast_packet() - forward a unicast packet towards its 730 * destination originator 731 * @skb: the received unicast packet 732 * @recv_if: interface on which the packet was received 733 * 734 * Decrement the TTL, look up the originator for the destination address and 735 * hand the packet over to batadv_send_skb_to_orig() for transmission. Drop 736 * the packet when the TTL is exhausted or no route exists. 737 * 738 * Return: NET_RX_SUCCESS if the packet was forwarded, NET_RX_DROP otherwise 739 */ 740 static int batadv_route_unicast_packet(struct sk_buff *skb, 741 struct batadv_hard_iface *recv_if) 742 { 743 struct batadv_priv *bat_priv = netdev_priv(recv_if->mesh_iface); 744 struct batadv_unicast_packet *unicast_packet; 745 struct batadv_orig_node *orig_node = NULL; 746 struct ethhdr *ethhdr = eth_hdr(skb); 747 int ret = NET_RX_DROP; 748 unsigned int len; 749 int hdr_len; 750 int res; 751 752 unicast_packet = (struct batadv_unicast_packet *)skb->data; 753 754 /* TTL exceeded */ 755 if (unicast_packet->ttl < 2) { 756 pr_debug("Warning - can't forward unicast packet from %pM to %pM: ttl exceeded\n", 757 ethhdr->h_source, unicast_packet->dest); 758 goto free_skb; 759 } 760 761 /* get routing information */ 762 orig_node = batadv_orig_hash_find(bat_priv, unicast_packet->dest); 763 764 if (!orig_node) 765 goto free_skb; 766 767 /* create a copy of the skb, if needed, to modify it. */ 768 if (skb_cow(skb, ETH_HLEN) < 0) 769 goto put_orig_node; 770 771 /* decrement ttl */ 772 unicast_packet = (struct batadv_unicast_packet *)skb->data; 773 unicast_packet->ttl--; 774 775 switch (unicast_packet->packet_type) { 776 case BATADV_UNICAST_4ADDR: 777 hdr_len = sizeof(struct batadv_unicast_4addr_packet); 778 break; 779 case BATADV_UNICAST: 780 hdr_len = sizeof(struct batadv_unicast_packet); 781 break; 782 default: 783 /* other packet types not supported - yet */ 784 hdr_len = -1; 785 break; 786 } 787 788 if (hdr_len > 0) 789 batadv_skb_set_priority(skb, hdr_len); 790 791 len = skb->len; 792 res = batadv_send_skb_to_orig(skb, orig_node, recv_if); 793 794 /* translate transmit result into receive result */ 795 if (res == NET_XMIT_SUCCESS) { 796 ret = NET_RX_SUCCESS; 797 /* skb was transmitted and consumed */ 798 batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD); 799 batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES, 800 len + ETH_HLEN); 801 } 802 803 /* skb was consumed */ 804 skb = NULL; 805 806 put_orig_node: 807 batadv_orig_node_put(orig_node); 808 free_skb: 809 kfree_skb(skb); 810 811 return ret; 812 } 813 814 /** 815 * batadv_reroute_unicast_packet() - update the unicast header for re-routing 816 * @bat_priv: the bat priv with all the mesh interface information 817 * @skb: unicast packet to process 818 * @unicast_packet: the unicast header to be updated 819 * @dst_addr: the payload destination 820 * @vid: VLAN identifier 821 * 822 * Search the translation table for dst_addr and update the unicast header with 823 * the new corresponding information (originator address where the destination 824 * client currently is and its known TTVN) 825 * 826 * Return: true if the packet header has been updated, false otherwise 827 */ 828 static bool 829 batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, struct sk_buff *skb, 830 struct batadv_unicast_packet *unicast_packet, 831 u8 *dst_addr, unsigned short vid) 832 { 833 struct batadv_hard_iface *primary_if = NULL; 834 struct batadv_orig_node *orig_node = NULL; 835 const u8 *orig_addr; 836 bool ret = false; 837 u8 orig_ttvn; 838 839 if (batadv_is_my_client(bat_priv, dst_addr, vid)) { 840 primary_if = batadv_primary_if_get_selected(bat_priv); 841 if (!primary_if) 842 goto out; 843 orig_addr = primary_if->net_dev->dev_addr; 844 orig_ttvn = (u8)atomic_read(&bat_priv->tt.vn); 845 } else { 846 orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr, 847 vid); 848 if (!orig_node) 849 goto out; 850 851 if (batadv_compare_eth(orig_node->orig, unicast_packet->dest)) 852 goto out; 853 854 orig_addr = orig_node->orig; 855 orig_ttvn = READ_ONCE(orig_node->last_ttvn); 856 } 857 858 /* update the packet header */ 859 skb_postpull_rcsum(skb, unicast_packet, sizeof(*unicast_packet)); 860 ether_addr_copy(unicast_packet->dest, orig_addr); 861 unicast_packet->ttvn = orig_ttvn; 862 skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet)); 863 864 ret = true; 865 out: 866 batadv_hardif_put(primary_if); 867 batadv_orig_node_put(orig_node); 868 869 return ret; 870 } 871 872 /** 873 * batadv_check_unicast_ttvn() - check and adjust the TTVN of a unicast packet 874 * @bat_priv: the bat priv with all the mesh interface information 875 * @skb: the unicast packet to check 876 * @hdr_len: length of the unicast header preceding the payload 877 * 878 * Warning: This function may reallocate the skb data buffer via 879 * pskb_may_pull()/batadv_get_vid()/... Any pointer into the skb data (e.g. 880 * obtained from skb->data or eth_hdr()) before this call must be considered 881 * invalid afterwards and has to be reacquired. 882 * 883 * Return: true if the packet may be processed further, false if has to be 884 * dropped by the caller 885 */ 886 static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv, 887 struct sk_buff *skb, int hdr_len) 888 { 889 struct batadv_unicast_packet *unicast_packet; 890 struct batadv_hard_iface *primary_if; 891 struct batadv_orig_node *orig_node; 892 struct ethhdr *ethhdr; 893 unsigned short vid; 894 int is_old_ttvn; 895 u8 curr_ttvn; 896 u8 old_ttvn; 897 898 /* check if there is enough data before accessing it */ 899 if (!pskb_may_pull(skb, hdr_len + ETH_HLEN)) 900 return false; 901 902 /* create a copy of the skb (in case of for re-routing) to modify it. */ 903 if (skb_cow(skb, sizeof(*unicast_packet)) < 0) 904 return false; 905 906 vid = batadv_get_vid(skb, hdr_len); 907 unicast_packet = (struct batadv_unicast_packet *)skb->data; 908 ethhdr = (struct ethhdr *)(skb->data + hdr_len); 909 910 /* do not reroute multicast frames in a unicast header */ 911 if (is_multicast_ether_addr(ethhdr->h_dest)) 912 return true; 913 914 /* check if the destination client was served by this node and it is now 915 * roaming. In this case, it means that the node has got a ROAM_ADV 916 * message and that it knows the new destination in the mesh to re-route 917 * the packet to 918 */ 919 if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) { 920 if (batadv_reroute_unicast_packet(bat_priv, skb, unicast_packet, 921 ethhdr->h_dest, vid)) 922 batadv_dbg_ratelimited(BATADV_DBG_TT, 923 bat_priv, 924 "Rerouting unicast packet to %pM (dst=%pM): Local Roaming\n", 925 unicast_packet->dest, 926 ethhdr->h_dest); 927 /* at this point the mesh destination should have been 928 * substituted with the originator address found in the global 929 * table. If not, let the packet go untouched anyway because 930 * there is nothing the node can do 931 */ 932 return true; 933 } 934 935 /* retrieve the TTVN known by this node for the packet destination. This 936 * value is used later to check if the node which sent (or re-routed 937 * last time) the packet had an updated information or not 938 */ 939 curr_ttvn = (u8)atomic_read(&bat_priv->tt.vn); 940 if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) { 941 orig_node = batadv_orig_hash_find(bat_priv, 942 unicast_packet->dest); 943 /* if it is not possible to find the orig_node representing the 944 * destination, the packet can immediately be dropped as it will 945 * not be possible to deliver it 946 */ 947 if (!orig_node) 948 return false; 949 950 curr_ttvn = READ_ONCE(orig_node->last_ttvn); 951 batadv_orig_node_put(orig_node); 952 } 953 954 /* check if the TTVN contained in the packet is fresher than what the 955 * node knows 956 */ 957 is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn); 958 if (!is_old_ttvn) 959 return true; 960 961 old_ttvn = unicast_packet->ttvn; 962 /* the packet was forged based on outdated network information. Its 963 * destination can possibly be updated and forwarded towards the new 964 * target host 965 */ 966 if (batadv_reroute_unicast_packet(bat_priv, skb, unicast_packet, 967 ethhdr->h_dest, vid)) { 968 batadv_dbg_ratelimited(BATADV_DBG_TT, bat_priv, 969 "Rerouting unicast packet to %pM (dst=%pM): TTVN mismatch old_ttvn=%u new_ttvn=%u\n", 970 unicast_packet->dest, ethhdr->h_dest, 971 old_ttvn, curr_ttvn); 972 return true; 973 } 974 975 /* the packet has not been re-routed: either the destination is 976 * currently served by this node or there is no destination at all and 977 * it is possible to drop the packet 978 */ 979 if (!batadv_is_my_client(bat_priv, ethhdr->h_dest, vid)) 980 return false; 981 982 /* update the header in order to let the packet be delivered to this 983 * node's mesh interface 984 */ 985 primary_if = batadv_primary_if_get_selected(bat_priv); 986 if (!primary_if) 987 return false; 988 989 /* update the packet header */ 990 skb_postpull_rcsum(skb, unicast_packet, sizeof(*unicast_packet)); 991 ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr); 992 unicast_packet->ttvn = curr_ttvn; 993 skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet)); 994 995 batadv_hardif_put(primary_if); 996 997 return true; 998 } 999 1000 /** 1001 * batadv_recv_unhandled_unicast_packet() - receive and process packets which 1002 * are in the unicast number space but not yet known to the implementation 1003 * @skb: unicast tvlv packet to process 1004 * @recv_if: pointer to interface this packet was received on 1005 * 1006 * Return: NET_RX_SUCCESS on success or NET_RX_DROP in case of failure 1007 */ 1008 int batadv_recv_unhandled_unicast_packet(struct sk_buff *skb, 1009 struct batadv_hard_iface *recv_if) 1010 { 1011 struct batadv_priv *bat_priv = netdev_priv(recv_if->mesh_iface); 1012 struct batadv_unicast_packet *unicast_packet; 1013 int hdr_size = sizeof(*unicast_packet); 1014 int check; 1015 1016 check = batadv_check_unicast_packet(bat_priv, skb, hdr_size); 1017 if (check < 0) 1018 goto free_skb; 1019 1020 /* we don't know about this type, drop it. */ 1021 unicast_packet = (struct batadv_unicast_packet *)skb->data; 1022 if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) 1023 goto free_skb; 1024 1025 return batadv_route_unicast_packet(skb, recv_if); 1026 1027 free_skb: 1028 kfree_skb(skb); 1029 return NET_RX_DROP; 1030 } 1031 1032 /** 1033 * batadv_recv_unicast_packet() - Process incoming unicast packet 1034 * @skb: incoming packet buffer 1035 * @recv_if: incoming hard interface 1036 * 1037 * Return: NET_RX_SUCCESS on success or NET_RX_DROP in case of failure 1038 */ 1039 int batadv_recv_unicast_packet(struct sk_buff *skb, 1040 struct batadv_hard_iface *recv_if) 1041 { 1042 struct batadv_priv *bat_priv = netdev_priv(recv_if->mesh_iface); 1043 struct batadv_unicast_4addr_packet *unicast_4addr_packet; 1044 struct batadv_unicast_packet *unicast_packet; 1045 struct batadv_orig_node *orig_node_gw = NULL; 1046 struct batadv_orig_node *orig_node = NULL; 1047 int hdr_size = sizeof(*unicast_packet); 1048 enum batadv_subtype subtype; 1049 int ret = NET_RX_DROP; 1050 u8 *orig_addr_gw; 1051 u8 *orig_addr; 1052 bool is4addr; 1053 bool is_gw; 1054 int check; 1055 1056 unicast_packet = (struct batadv_unicast_packet *)skb->data; 1057 is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR; 1058 /* the caller function should have already pulled 2 bytes */ 1059 if (is4addr) 1060 hdr_size = sizeof(*unicast_4addr_packet); 1061 1062 /* function returns -EREMOTE for promiscuous packets */ 1063 check = batadv_check_unicast_packet(bat_priv, skb, hdr_size); 1064 if (check < 0) 1065 goto free_skb; 1066 1067 if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size)) 1068 goto free_skb; 1069 1070 unicast_packet = (struct batadv_unicast_packet *)skb->data; 1071 1072 /* packet for me */ 1073 if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) { 1074 /* If this is a unicast packet from another backgone gw, 1075 * drop it. 1076 */ 1077 orig_addr_gw = eth_hdr(skb)->h_source; 1078 orig_node_gw = batadv_orig_hash_find(bat_priv, orig_addr_gw); 1079 if (orig_node_gw) { 1080 is_gw = batadv_bla_is_backbone_gw(skb, orig_node_gw, 1081 hdr_size); 1082 batadv_orig_node_put(orig_node_gw); 1083 if (is_gw) { 1084 orig_addr_gw = eth_hdr(skb)->h_source; 1085 batadv_dbg(BATADV_DBG_BLA, bat_priv, 1086 "%s(): Dropped unicast pkt received from another backbone gw %pM.\n", 1087 __func__, orig_addr_gw); 1088 goto free_skb; 1089 } 1090 } 1091 1092 if (is4addr) { 1093 unicast_4addr_packet = 1094 (struct batadv_unicast_4addr_packet *)skb->data; 1095 subtype = unicast_4addr_packet->subtype; 1096 batadv_dat_inc_counter(bat_priv, subtype); 1097 1098 /* Only payload data should be considered for speedy 1099 * join. For example, DAT also uses unicast 4addr 1100 * types, but those packets should not be considered 1101 * for speedy join, since the clients do not actually 1102 * reside at the sending originator. 1103 */ 1104 if (subtype == BATADV_P_DATA) { 1105 orig_addr = unicast_4addr_packet->src; 1106 orig_node = batadv_orig_hash_find(bat_priv, 1107 orig_addr); 1108 } 1109 } 1110 1111 if (batadv_dat_snoop_incoming_arp_request(bat_priv, skb, 1112 hdr_size)) 1113 goto rx_success; 1114 if (batadv_dat_snoop_incoming_arp_reply(bat_priv, skb, 1115 hdr_size)) 1116 goto rx_success; 1117 1118 batadv_dat_snoop_incoming_dhcp_ack(bat_priv, skb, hdr_size); 1119 1120 batadv_interface_rx(recv_if->mesh_iface, skb, hdr_size, 1121 orig_node); 1122 1123 rx_success: 1124 batadv_orig_node_put(orig_node); 1125 1126 return NET_RX_SUCCESS; 1127 } 1128 1129 ret = batadv_route_unicast_packet(skb, recv_if); 1130 /* skb was consumed */ 1131 skb = NULL; 1132 1133 free_skb: 1134 kfree_skb(skb); 1135 1136 return ret; 1137 } 1138 1139 /** 1140 * batadv_recv_unicast_tvlv() - receive and process unicast tvlv packets 1141 * @skb: unicast tvlv packet to process 1142 * @recv_if: pointer to interface this packet was received on 1143 * 1144 * Return: NET_RX_SUCCESS on success or NET_RX_DROP in case of failure 1145 */ 1146 int batadv_recv_unicast_tvlv(struct sk_buff *skb, 1147 struct batadv_hard_iface *recv_if) 1148 { 1149 struct batadv_priv *bat_priv = netdev_priv(recv_if->mesh_iface); 1150 struct batadv_unicast_tvlv_packet *unicast_tvlv_packet; 1151 int hdr_size = sizeof(*unicast_tvlv_packet); 1152 unsigned char *tvlv_buff; 1153 int ret = NET_RX_DROP; 1154 u16 tvlv_buff_len; 1155 1156 if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0) 1157 goto free_skb; 1158 1159 /* the header is likely to be modified while forwarding */ 1160 if (skb_cow(skb, hdr_size) < 0) 1161 goto free_skb; 1162 1163 /* packet needs to be linearized to access the tvlv content */ 1164 if (skb_linearize(skb) < 0) 1165 goto free_skb; 1166 1167 unicast_tvlv_packet = (struct batadv_unicast_tvlv_packet *)skb->data; 1168 1169 tvlv_buff = (unsigned char *)(skb->data + hdr_size); 1170 tvlv_buff_len = ntohs(unicast_tvlv_packet->tvlv_len); 1171 1172 if (tvlv_buff_len > skb->len - hdr_size) 1173 goto free_skb; 1174 1175 ret = batadv_tvlv_containers_process(bat_priv, BATADV_UNICAST_TVLV, 1176 NULL, skb, tvlv_buff, 1177 tvlv_buff_len); 1178 1179 if (ret != NET_RX_SUCCESS) { 1180 ret = batadv_route_unicast_packet(skb, recv_if); 1181 /* skb was consumed */ 1182 skb = NULL; 1183 } 1184 1185 free_skb: 1186 kfree_skb(skb); 1187 1188 return ret; 1189 } 1190 1191 /** 1192 * batadv_recv_frag_packet() - process received fragment 1193 * @skb: the received fragment 1194 * @recv_if: interface that the skb is received on 1195 * 1196 * This function does one of the three following things: 1) Forward fragment, if 1197 * the assembled packet will exceed our MTU; 2) Buffer fragment, if we still 1198 * lack further fragments; 3) Merge fragments, if we have all needed parts. 1199 * 1200 * Return: NET_RX_SUCCESS on success or NET_RX_DROP in case of failure 1201 */ 1202 int batadv_recv_frag_packet(struct sk_buff *skb, 1203 struct batadv_hard_iface *recv_if) 1204 { 1205 struct batadv_priv *bat_priv = netdev_priv(recv_if->mesh_iface); 1206 struct batadv_orig_node *orig_node_src = NULL; 1207 struct batadv_frag_packet *frag_packet; 1208 int ret = NET_RX_DROP; 1209 1210 if (batadv_check_unicast_packet(bat_priv, skb, 1211 sizeof(*frag_packet)) < 0) 1212 goto free_skb; 1213 1214 frag_packet = (struct batadv_frag_packet *)skb->data; 1215 orig_node_src = batadv_orig_hash_find(bat_priv, frag_packet->orig); 1216 if (!orig_node_src) 1217 goto free_skb; 1218 1219 skb->priority = frag_packet->priority + 256; 1220 1221 /* Route the fragment if it is not for us and too big to be merged. */ 1222 if (!batadv_is_my_mac(bat_priv, frag_packet->dest) && 1223 batadv_frag_skb_fwd(skb, recv_if, orig_node_src, &ret)) { 1224 /* skb was consumed */ 1225 skb = NULL; 1226 goto put_orig_node; 1227 } 1228 1229 batadv_inc_counter(bat_priv, BATADV_CNT_FRAG_RX); 1230 batadv_add_counter(bat_priv, BATADV_CNT_FRAG_RX_BYTES, skb->len); 1231 1232 /* Add fragment to buffer and merge if possible. */ 1233 if (!batadv_frag_skb_buffer(&skb, orig_node_src)) 1234 goto put_orig_node; 1235 1236 /* Deliver merged packet to the appropriate handler, if it was 1237 * merged 1238 */ 1239 if (skb) { 1240 batadv_batman_skb_recv(skb, recv_if->net_dev, 1241 &recv_if->batman_adv_ptype, NULL); 1242 /* skb was consumed */ 1243 skb = NULL; 1244 } 1245 1246 ret = NET_RX_SUCCESS; 1247 1248 put_orig_node: 1249 batadv_orig_node_put(orig_node_src); 1250 free_skb: 1251 kfree_skb(skb); 1252 1253 return ret; 1254 } 1255 1256 /** 1257 * batadv_recv_bcast_packet() - Process incoming broadcast packet 1258 * @skb: incoming packet buffer 1259 * @recv_if: incoming hard interface 1260 * 1261 * Return: NET_RX_SUCCESS on success or NET_RX_DROP in case of failure 1262 */ 1263 int batadv_recv_bcast_packet(struct sk_buff *skb, 1264 struct batadv_hard_iface *recv_if) 1265 { 1266 struct batadv_priv *bat_priv = netdev_priv(recv_if->mesh_iface); 1267 struct batadv_orig_node *orig_node = NULL; 1268 struct batadv_bcast_packet *bcast_packet; 1269 int hdr_size = sizeof(*bcast_packet); 1270 struct ethhdr *ethhdr; 1271 s32 seq_diff; 1272 u32 seqno; 1273 int ret; 1274 1275 /* drop packet if it has not necessary minimum size */ 1276 if (unlikely(!pskb_may_pull(skb, hdr_size))) 1277 goto free_skb; 1278 1279 ethhdr = eth_hdr(skb); 1280 1281 /* packet with broadcast indication but unicast recipient */ 1282 if (!is_broadcast_ether_addr(ethhdr->h_dest)) 1283 goto free_skb; 1284 1285 /* packet with broadcast/multicast sender address */ 1286 if (is_multicast_ether_addr(ethhdr->h_source)) 1287 goto free_skb; 1288 1289 /* ignore broadcasts sent by myself */ 1290 if (batadv_is_my_mac(bat_priv, ethhdr->h_source)) 1291 goto free_skb; 1292 1293 bcast_packet = (struct batadv_bcast_packet *)skb->data; 1294 1295 /* ignore broadcasts originated by myself */ 1296 if (batadv_is_my_mac(bat_priv, bcast_packet->orig)) 1297 goto free_skb; 1298 1299 /* create a copy of the skb, if needed, to modify it. */ 1300 if (skb_cow(skb, ETH_HLEN) < 0) 1301 goto free_skb; 1302 1303 bcast_packet = (struct batadv_bcast_packet *)skb->data; 1304 1305 if (!batadv_skb_decrement_ttl(skb)) 1306 goto free_skb; 1307 1308 orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig); 1309 1310 if (!orig_node) 1311 goto free_skb; 1312 1313 spin_lock_bh(&orig_node->bcast_seqno_lock); 1314 1315 seqno = ntohl(bcast_packet->seqno); 1316 /* check whether the packet is a duplicate */ 1317 if (batadv_test_bit(orig_node->bcast_bits, orig_node->last_bcast_seqno, 1318 seqno)) 1319 goto spin_unlock; 1320 1321 seq_diff = seqno - orig_node->last_bcast_seqno; 1322 1323 /* check whether the packet is old and the host just restarted. */ 1324 if (batadv_window_protected(bat_priv, seq_diff, 1325 BATADV_BCAST_MAX_AGE, 1326 &orig_node->bcast_seqno_reset, NULL)) 1327 goto spin_unlock; 1328 1329 /* mark broadcast in flood history, update window position 1330 * if required. 1331 */ 1332 if (batadv_bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1)) 1333 orig_node->last_bcast_seqno = seqno; 1334 1335 spin_unlock_bh(&orig_node->bcast_seqno_lock); 1336 1337 /* check whether this has been sent by another originator before */ 1338 if (batadv_bla_check_bcast_duplist(bat_priv, skb)) 1339 goto free_skb; 1340 1341 batadv_skb_set_priority(skb, sizeof(struct batadv_bcast_packet)); 1342 1343 /* rebroadcast packet */ 1344 ret = batadv_forw_bcast_packet(bat_priv, skb, 0, false); 1345 if (ret == NETDEV_TX_BUSY) 1346 goto free_skb; 1347 1348 /* don't hand the broadcast up if it is from an originator 1349 * from the same backbone. 1350 */ 1351 if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size)) 1352 goto free_skb; 1353 1354 if (batadv_dat_snoop_incoming_arp_request(bat_priv, skb, hdr_size)) 1355 goto rx_success; 1356 if (batadv_dat_snoop_incoming_arp_reply(bat_priv, skb, hdr_size)) 1357 goto rx_success; 1358 1359 batadv_dat_snoop_incoming_dhcp_ack(bat_priv, skb, hdr_size); 1360 1361 /* broadcast for me */ 1362 batadv_interface_rx(recv_if->mesh_iface, skb, hdr_size, orig_node); 1363 1364 rx_success: 1365 ret = NET_RX_SUCCESS; 1366 goto out; 1367 1368 spin_unlock: 1369 spin_unlock_bh(&orig_node->bcast_seqno_lock); 1370 free_skb: 1371 kfree_skb(skb); 1372 ret = NET_RX_DROP; 1373 out: 1374 batadv_orig_node_put(orig_node); 1375 return ret; 1376 } 1377 1378 #ifdef CONFIG_BATMAN_ADV_MCAST 1379 /** 1380 * batadv_recv_mcast_packet() - process received batman-adv multicast packet 1381 * @skb: the received batman-adv multicast packet 1382 * @recv_if: interface that the skb is received on 1383 * 1384 * Parses the given, received batman-adv multicast packet. Depending on the 1385 * contents of its TVLV forwards it and/or decapsulates it to hand it to the 1386 * mesh interface. 1387 * 1388 * Return: NET_RX_SUCCESS if the skb was locally received, NET_RX_DROP otherwise 1389 * or a negative errno code when the multicast tracker TVLV could not be 1390 * processed 1391 */ 1392 int batadv_recv_mcast_packet(struct sk_buff *skb, 1393 struct batadv_hard_iface *recv_if) 1394 { 1395 struct batadv_priv *bat_priv = netdev_priv(recv_if->mesh_iface); 1396 struct batadv_mcast_packet *mcast_packet; 1397 int hdr_size = sizeof(*mcast_packet); 1398 unsigned char *tvlv_buff; 1399 int ret = NET_RX_DROP; 1400 u16 tvlv_buff_len; 1401 1402 if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0) 1403 goto free_skb; 1404 1405 /* create a copy of the skb, if needed, to modify it. */ 1406 if (skb_cow(skb, ETH_HLEN) < 0) 1407 goto free_skb; 1408 1409 /* packet needs to be linearized to access the tvlv content */ 1410 if (skb_linearize(skb) < 0) 1411 goto free_skb; 1412 1413 mcast_packet = (struct batadv_mcast_packet *)skb->data; 1414 if (!batadv_skb_decrement_ttl(skb)) 1415 goto free_skb; 1416 1417 tvlv_buff = (unsigned char *)(skb->data + hdr_size); 1418 tvlv_buff_len = ntohs(mcast_packet->tvlv_len); 1419 1420 if (tvlv_buff_len > skb->len - hdr_size) 1421 goto free_skb; 1422 1423 /* the fields of an multicast payload are accessed assuming (at least) 1424 * 2-byte alignment, so a following packet must start at an even offset. 1425 */ 1426 if (tvlv_buff_len & 1) 1427 goto free_skb; 1428 1429 ret = batadv_tvlv_containers_process(bat_priv, BATADV_MCAST, NULL, skb, 1430 tvlv_buff, tvlv_buff_len); 1431 if (ret >= 0) { 1432 batadv_inc_counter(bat_priv, BATADV_CNT_MCAST_RX); 1433 batadv_add_counter(bat_priv, BATADV_CNT_MCAST_RX_BYTES, 1434 skb->len + ETH_HLEN); 1435 } 1436 1437 hdr_size += tvlv_buff_len; 1438 1439 if (ret == NET_RX_SUCCESS && (skb->len - hdr_size >= ETH_HLEN)) { 1440 batadv_inc_counter(bat_priv, BATADV_CNT_MCAST_RX_LOCAL); 1441 batadv_add_counter(bat_priv, BATADV_CNT_MCAST_RX_LOCAL_BYTES, 1442 skb->len - hdr_size); 1443 1444 batadv_interface_rx(bat_priv->mesh_iface, skb, hdr_size, NULL); 1445 /* skb was consumed */ 1446 skb = NULL; 1447 } 1448 1449 free_skb: 1450 kfree_skb(skb); 1451 1452 return ret; 1453 } 1454 #endif /* CONFIG_BATMAN_ADV_MCAST */ 1455