1 /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: 2 * 3 * Marek Lindner, Simon Wunderlich, Antonio Quartulli 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, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #include "main.h" 19 #include "translation-table.h" 20 #include "soft-interface.h" 21 #include "hard-interface.h" 22 #include "send.h" 23 #include "hash.h" 24 #include "originator.h" 25 #include "routing.h" 26 #include "bridge_loop_avoidance.h" 27 28 #include <linux/crc32c.h> 29 30 /* hash class keys */ 31 static struct lock_class_key batadv_tt_local_hash_lock_class_key; 32 static struct lock_class_key batadv_tt_global_hash_lock_class_key; 33 34 static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client, 35 unsigned short vid, 36 struct batadv_orig_node *orig_node); 37 static void batadv_tt_purge(struct work_struct *work); 38 static void 39 batadv_tt_global_del_orig_list(struct batadv_tt_global_entry *tt_global_entry); 40 static void batadv_tt_global_del(struct batadv_priv *bat_priv, 41 struct batadv_orig_node *orig_node, 42 const unsigned char *addr, 43 unsigned short vid, const char *message, 44 bool roaming); 45 46 /* returns 1 if they are the same mac addr */ 47 static int batadv_compare_tt(const struct hlist_node *node, const void *data2) 48 { 49 const void *data1 = container_of(node, struct batadv_tt_common_entry, 50 hash_entry); 51 52 return batadv_compare_eth(data1, data2); 53 } 54 55 /** 56 * batadv_choose_tt - return the index of the tt entry in the hash table 57 * @data: pointer to the tt_common_entry object to map 58 * @size: the size of the hash table 59 * 60 * Returns the hash index where the object represented by 'data' should be 61 * stored at. 62 */ 63 static inline uint32_t batadv_choose_tt(const void *data, uint32_t size) 64 { 65 struct batadv_tt_common_entry *tt; 66 uint32_t hash = 0; 67 68 tt = (struct batadv_tt_common_entry *)data; 69 hash = batadv_hash_bytes(hash, &tt->addr, ETH_ALEN); 70 hash = batadv_hash_bytes(hash, &tt->vid, sizeof(tt->vid)); 71 72 hash += (hash << 3); 73 hash ^= (hash >> 11); 74 hash += (hash << 15); 75 76 return hash % size; 77 } 78 79 /** 80 * batadv_tt_hash_find - look for a client in the given hash table 81 * @hash: the hash table to search 82 * @addr: the mac address of the client to look for 83 * @vid: VLAN identifier 84 * 85 * Returns a pointer to the tt_common struct belonging to the searched client if 86 * found, NULL otherwise. 87 */ 88 static struct batadv_tt_common_entry * 89 batadv_tt_hash_find(struct batadv_hashtable *hash, const uint8_t *addr, 90 unsigned short vid) 91 { 92 struct hlist_head *head; 93 struct batadv_tt_common_entry to_search, *tt, *tt_tmp = NULL; 94 uint32_t index; 95 96 if (!hash) 97 return NULL; 98 99 memcpy(to_search.addr, addr, ETH_ALEN); 100 to_search.vid = vid; 101 102 index = batadv_choose_tt(&to_search, hash->size); 103 head = &hash->table[index]; 104 105 rcu_read_lock(); 106 hlist_for_each_entry_rcu(tt, head, hash_entry) { 107 if (!batadv_compare_eth(tt, addr)) 108 continue; 109 110 if (tt->vid != vid) 111 continue; 112 113 if (!atomic_inc_not_zero(&tt->refcount)) 114 continue; 115 116 tt_tmp = tt; 117 break; 118 } 119 rcu_read_unlock(); 120 121 return tt_tmp; 122 } 123 124 /** 125 * batadv_tt_local_hash_find - search the local table for a given client 126 * @bat_priv: the bat priv with all the soft interface information 127 * @addr: the mac address of the client to look for 128 * @vid: VLAN identifier 129 * 130 * Returns a pointer to the corresponding tt_local_entry struct if the client is 131 * found, NULL otherwise. 132 */ 133 static struct batadv_tt_local_entry * 134 batadv_tt_local_hash_find(struct batadv_priv *bat_priv, const uint8_t *addr, 135 unsigned short vid) 136 { 137 struct batadv_tt_common_entry *tt_common_entry; 138 struct batadv_tt_local_entry *tt_local_entry = NULL; 139 140 tt_common_entry = batadv_tt_hash_find(bat_priv->tt.local_hash, addr, 141 vid); 142 if (tt_common_entry) 143 tt_local_entry = container_of(tt_common_entry, 144 struct batadv_tt_local_entry, 145 common); 146 return tt_local_entry; 147 } 148 149 /** 150 * batadv_tt_global_hash_find - search the global table for a given client 151 * @bat_priv: the bat priv with all the soft interface information 152 * @addr: the mac address of the client to look for 153 * @vid: VLAN identifier 154 * 155 * Returns a pointer to the corresponding tt_global_entry struct if the client 156 * is found, NULL otherwise. 157 */ 158 static struct batadv_tt_global_entry * 159 batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const uint8_t *addr, 160 unsigned short vid) 161 { 162 struct batadv_tt_common_entry *tt_common_entry; 163 struct batadv_tt_global_entry *tt_global_entry = NULL; 164 165 tt_common_entry = batadv_tt_hash_find(bat_priv->tt.global_hash, addr, 166 vid); 167 if (tt_common_entry) 168 tt_global_entry = container_of(tt_common_entry, 169 struct batadv_tt_global_entry, 170 common); 171 return tt_global_entry; 172 } 173 174 static void 175 batadv_tt_local_entry_free_ref(struct batadv_tt_local_entry *tt_local_entry) 176 { 177 if (atomic_dec_and_test(&tt_local_entry->common.refcount)) 178 kfree_rcu(tt_local_entry, common.rcu); 179 } 180 181 /** 182 * batadv_tt_global_entry_free_ref - decrement the refcounter for a 183 * tt_global_entry and possibly free it 184 * @tt_global_entry: the object to free 185 */ 186 static void 187 batadv_tt_global_entry_free_ref(struct batadv_tt_global_entry *tt_global_entry) 188 { 189 if (atomic_dec_and_test(&tt_global_entry->common.refcount)) { 190 batadv_tt_global_del_orig_list(tt_global_entry); 191 kfree_rcu(tt_global_entry, common.rcu); 192 } 193 } 194 195 static void batadv_tt_orig_list_entry_free_rcu(struct rcu_head *rcu) 196 { 197 struct batadv_tt_orig_list_entry *orig_entry; 198 199 orig_entry = container_of(rcu, struct batadv_tt_orig_list_entry, rcu); 200 201 /* We are in an rcu callback here, therefore we cannot use 202 * batadv_orig_node_free_ref() and its call_rcu(): 203 * An rcu_barrier() wouldn't wait for that to finish 204 */ 205 batadv_orig_node_free_ref_now(orig_entry->orig_node); 206 kfree(orig_entry); 207 } 208 209 /** 210 * batadv_tt_local_size_mod - change the size by v of the local table identified 211 * by vid 212 * @bat_priv: the bat priv with all the soft interface information 213 * @vid: the VLAN identifier of the sub-table to change 214 * @v: the amount to sum to the local table size 215 */ 216 static void batadv_tt_local_size_mod(struct batadv_priv *bat_priv, 217 unsigned short vid, int v) 218 { 219 struct batadv_softif_vlan *vlan; 220 221 vlan = batadv_softif_vlan_get(bat_priv, vid); 222 if (!vlan) 223 return; 224 225 atomic_add(v, &vlan->tt.num_entries); 226 227 batadv_softif_vlan_free_ref(vlan); 228 } 229 230 /** 231 * batadv_tt_local_size_inc - increase by one the local table size for the given 232 * vid 233 * @bat_priv: the bat priv with all the soft interface information 234 * @vid: the VLAN identifier 235 */ 236 static void batadv_tt_local_size_inc(struct batadv_priv *bat_priv, 237 unsigned short vid) 238 { 239 batadv_tt_local_size_mod(bat_priv, vid, 1); 240 } 241 242 /** 243 * batadv_tt_local_size_dec - decrease by one the local table size for the given 244 * vid 245 * @bat_priv: the bat priv with all the soft interface information 246 * @vid: the VLAN identifier 247 */ 248 static void batadv_tt_local_size_dec(struct batadv_priv *bat_priv, 249 unsigned short vid) 250 { 251 batadv_tt_local_size_mod(bat_priv, vid, -1); 252 } 253 254 /** 255 * batadv_tt_global_size_mod - change the size by v of the local table 256 * identified by vid 257 * @bat_priv: the bat priv with all the soft interface information 258 * @vid: the VLAN identifier 259 * @v: the amount to sum to the global table size 260 */ 261 static void batadv_tt_global_size_mod(struct batadv_orig_node *orig_node, 262 unsigned short vid, int v) 263 { 264 struct batadv_orig_node_vlan *vlan; 265 266 vlan = batadv_orig_node_vlan_new(orig_node, vid); 267 if (!vlan) 268 return; 269 270 if (atomic_add_return(v, &vlan->tt.num_entries) == 0) { 271 spin_lock_bh(&orig_node->vlan_list_lock); 272 list_del_rcu(&vlan->list); 273 spin_unlock_bh(&orig_node->vlan_list_lock); 274 batadv_orig_node_vlan_free_ref(vlan); 275 } 276 277 batadv_orig_node_vlan_free_ref(vlan); 278 } 279 280 /** 281 * batadv_tt_global_size_inc - increase by one the global table size for the 282 * given vid 283 * @orig_node: the originator which global table size has to be decreased 284 * @vid: the vlan identifier 285 */ 286 static void batadv_tt_global_size_inc(struct batadv_orig_node *orig_node, 287 unsigned short vid) 288 { 289 batadv_tt_global_size_mod(orig_node, vid, 1); 290 } 291 292 /** 293 * batadv_tt_global_size_dec - decrease by one the global table size for the 294 * given vid 295 * @orig_node: the originator which global table size has to be decreased 296 * @vid: the vlan identifier 297 */ 298 static void batadv_tt_global_size_dec(struct batadv_orig_node *orig_node, 299 unsigned short vid) 300 { 301 batadv_tt_global_size_mod(orig_node, vid, -1); 302 } 303 304 static void 305 batadv_tt_orig_list_entry_free_ref(struct batadv_tt_orig_list_entry *orig_entry) 306 { 307 if (!atomic_dec_and_test(&orig_entry->refcount)) 308 return; 309 310 call_rcu(&orig_entry->rcu, batadv_tt_orig_list_entry_free_rcu); 311 } 312 313 /** 314 * batadv_tt_local_event - store a local TT event (ADD/DEL) 315 * @bat_priv: the bat priv with all the soft interface information 316 * @tt_local_entry: the TT entry involved in the event 317 * @event_flags: flags to store in the event structure 318 */ 319 static void batadv_tt_local_event(struct batadv_priv *bat_priv, 320 struct batadv_tt_local_entry *tt_local_entry, 321 uint8_t event_flags) 322 { 323 struct batadv_tt_change_node *tt_change_node, *entry, *safe; 324 struct batadv_tt_common_entry *common = &tt_local_entry->common; 325 uint8_t flags = common->flags | event_flags; 326 bool event_removed = false; 327 bool del_op_requested, del_op_entry; 328 329 tt_change_node = kmalloc(sizeof(*tt_change_node), GFP_ATOMIC); 330 if (!tt_change_node) 331 return; 332 333 tt_change_node->change.flags = flags; 334 memset(tt_change_node->change.reserved, 0, 335 sizeof(tt_change_node->change.reserved)); 336 memcpy(tt_change_node->change.addr, common->addr, ETH_ALEN); 337 tt_change_node->change.vid = htons(common->vid); 338 339 del_op_requested = flags & BATADV_TT_CLIENT_DEL; 340 341 /* check for ADD+DEL or DEL+ADD events */ 342 spin_lock_bh(&bat_priv->tt.changes_list_lock); 343 list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list, 344 list) { 345 if (!batadv_compare_eth(entry->change.addr, common->addr)) 346 continue; 347 348 /* DEL+ADD in the same orig interval have no effect and can be 349 * removed to avoid silly behaviour on the receiver side. The 350 * other way around (ADD+DEL) can happen in case of roaming of 351 * a client still in the NEW state. Roaming of NEW clients is 352 * now possible due to automatically recognition of "temporary" 353 * clients 354 */ 355 del_op_entry = entry->change.flags & BATADV_TT_CLIENT_DEL; 356 if (!del_op_requested && del_op_entry) 357 goto del; 358 if (del_op_requested && !del_op_entry) 359 goto del; 360 361 /* this is a second add in the same originator interval. It 362 * means that flags have been changed: update them! 363 */ 364 if (!del_op_requested && !del_op_entry) 365 entry->change.flags = flags; 366 367 continue; 368 del: 369 list_del(&entry->list); 370 kfree(entry); 371 kfree(tt_change_node); 372 event_removed = true; 373 goto unlock; 374 } 375 376 /* track the change in the OGMinterval list */ 377 list_add_tail(&tt_change_node->list, &bat_priv->tt.changes_list); 378 379 unlock: 380 spin_unlock_bh(&bat_priv->tt.changes_list_lock); 381 382 if (event_removed) 383 atomic_dec(&bat_priv->tt.local_changes); 384 else 385 atomic_inc(&bat_priv->tt.local_changes); 386 } 387 388 /** 389 * batadv_tt_len - compute length in bytes of given number of tt changes 390 * @changes_num: number of tt changes 391 * 392 * Returns computed length in bytes. 393 */ 394 static int batadv_tt_len(int changes_num) 395 { 396 return changes_num * sizeof(struct batadv_tvlv_tt_change); 397 } 398 399 /** 400 * batadv_tt_entries - compute the number of entries fitting in tt_len bytes 401 * @tt_len: available space 402 * 403 * Returns the number of entries. 404 */ 405 static uint16_t batadv_tt_entries(uint16_t tt_len) 406 { 407 return tt_len / batadv_tt_len(1); 408 } 409 410 /** 411 * batadv_tt_local_table_transmit_size - calculates the local translation table 412 * size when transmitted over the air 413 * @bat_priv: the bat priv with all the soft interface information 414 * 415 * Returns local translation table size in bytes. 416 */ 417 static int batadv_tt_local_table_transmit_size(struct batadv_priv *bat_priv) 418 { 419 uint16_t num_vlan = 0, tt_local_entries = 0; 420 struct batadv_softif_vlan *vlan; 421 int hdr_size; 422 423 rcu_read_lock(); 424 hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) { 425 num_vlan++; 426 tt_local_entries += atomic_read(&vlan->tt.num_entries); 427 } 428 rcu_read_unlock(); 429 430 /* header size of tvlv encapsulated tt response payload */ 431 hdr_size = sizeof(struct batadv_unicast_tvlv_packet); 432 hdr_size += sizeof(struct batadv_tvlv_hdr); 433 hdr_size += sizeof(struct batadv_tvlv_tt_data); 434 hdr_size += num_vlan * sizeof(struct batadv_tvlv_tt_vlan_data); 435 436 return hdr_size + batadv_tt_len(tt_local_entries); 437 } 438 439 static int batadv_tt_local_init(struct batadv_priv *bat_priv) 440 { 441 if (bat_priv->tt.local_hash) 442 return 0; 443 444 bat_priv->tt.local_hash = batadv_hash_new(1024); 445 446 if (!bat_priv->tt.local_hash) 447 return -ENOMEM; 448 449 batadv_hash_set_lock_class(bat_priv->tt.local_hash, 450 &batadv_tt_local_hash_lock_class_key); 451 452 return 0; 453 } 454 455 static void batadv_tt_global_free(struct batadv_priv *bat_priv, 456 struct batadv_tt_global_entry *tt_global, 457 const char *message) 458 { 459 batadv_dbg(BATADV_DBG_TT, bat_priv, 460 "Deleting global tt entry %pM (vid: %d): %s\n", 461 tt_global->common.addr, 462 BATADV_PRINT_VID(tt_global->common.vid), message); 463 464 batadv_hash_remove(bat_priv->tt.global_hash, batadv_compare_tt, 465 batadv_choose_tt, &tt_global->common); 466 batadv_tt_global_entry_free_ref(tt_global); 467 } 468 469 /** 470 * batadv_tt_local_add - add a new client to the local table or update an 471 * existing client 472 * @soft_iface: netdev struct of the mesh interface 473 * @addr: the mac address of the client to add 474 * @vid: VLAN identifier 475 * @ifindex: index of the interface where the client is connected to (useful to 476 * identify wireless clients) 477 * @mark: the value contained in the skb->mark field of the received packet (if 478 * any) 479 * 480 * Returns true if the client was successfully added, false otherwise. 481 */ 482 bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr, 483 unsigned short vid, int ifindex, uint32_t mark) 484 { 485 struct batadv_priv *bat_priv = netdev_priv(soft_iface); 486 struct batadv_tt_local_entry *tt_local; 487 struct batadv_tt_global_entry *tt_global; 488 struct net_device *in_dev = NULL; 489 struct hlist_head *head; 490 struct batadv_tt_orig_list_entry *orig_entry; 491 int hash_added, table_size, packet_size_max; 492 bool ret = false, roamed_back = false; 493 uint8_t remote_flags; 494 uint32_t match_mark; 495 496 if (ifindex != BATADV_NULL_IFINDEX) 497 in_dev = dev_get_by_index(&init_net, ifindex); 498 499 tt_local = batadv_tt_local_hash_find(bat_priv, addr, vid); 500 tt_global = batadv_tt_global_hash_find(bat_priv, addr, vid); 501 502 if (tt_local) { 503 tt_local->last_seen = jiffies; 504 if (tt_local->common.flags & BATADV_TT_CLIENT_PENDING) { 505 batadv_dbg(BATADV_DBG_TT, bat_priv, 506 "Re-adding pending client %pM (vid: %d)\n", 507 addr, BATADV_PRINT_VID(vid)); 508 /* whatever the reason why the PENDING flag was set, 509 * this is a client which was enqueued to be removed in 510 * this orig_interval. Since it popped up again, the 511 * flag can be reset like it was never enqueued 512 */ 513 tt_local->common.flags &= ~BATADV_TT_CLIENT_PENDING; 514 goto add_event; 515 } 516 517 if (tt_local->common.flags & BATADV_TT_CLIENT_ROAM) { 518 batadv_dbg(BATADV_DBG_TT, bat_priv, 519 "Roaming client %pM (vid: %d) came back to its original location\n", 520 addr, BATADV_PRINT_VID(vid)); 521 /* the ROAM flag is set because this client roamed away 522 * and the node got a roaming_advertisement message. Now 523 * that the client popped up again at its original 524 * location such flag can be unset 525 */ 526 tt_local->common.flags &= ~BATADV_TT_CLIENT_ROAM; 527 roamed_back = true; 528 } 529 goto check_roaming; 530 } 531 532 /* Ignore the client if we cannot send it in a full table response. */ 533 table_size = batadv_tt_local_table_transmit_size(bat_priv); 534 table_size += batadv_tt_len(1); 535 packet_size_max = atomic_read(&bat_priv->packet_size_max); 536 if (table_size > packet_size_max) { 537 net_ratelimited_function(batadv_info, soft_iface, 538 "Local translation table size (%i) exceeds maximum packet size (%i); Ignoring new local tt entry: %pM\n", 539 table_size, packet_size_max, addr); 540 goto out; 541 } 542 543 tt_local = kmalloc(sizeof(*tt_local), GFP_ATOMIC); 544 if (!tt_local) 545 goto out; 546 547 batadv_dbg(BATADV_DBG_TT, bat_priv, 548 "Creating new local tt entry: %pM (vid: %d, ttvn: %d)\n", 549 addr, BATADV_PRINT_VID(vid), 550 (uint8_t)atomic_read(&bat_priv->tt.vn)); 551 552 memcpy(tt_local->common.addr, addr, ETH_ALEN); 553 /* The local entry has to be marked as NEW to avoid to send it in 554 * a full table response going out before the next ttvn increment 555 * (consistency check) 556 */ 557 tt_local->common.flags = BATADV_TT_CLIENT_NEW; 558 tt_local->common.vid = vid; 559 if (batadv_is_wifi_netdev(in_dev)) 560 tt_local->common.flags |= BATADV_TT_CLIENT_WIFI; 561 atomic_set(&tt_local->common.refcount, 2); 562 tt_local->last_seen = jiffies; 563 tt_local->common.added_at = tt_local->last_seen; 564 565 /* the batman interface mac address should never be purged */ 566 if (batadv_compare_eth(addr, soft_iface->dev_addr)) 567 tt_local->common.flags |= BATADV_TT_CLIENT_NOPURGE; 568 569 hash_added = batadv_hash_add(bat_priv->tt.local_hash, batadv_compare_tt, 570 batadv_choose_tt, &tt_local->common, 571 &tt_local->common.hash_entry); 572 573 if (unlikely(hash_added != 0)) { 574 /* remove the reference for the hash */ 575 batadv_tt_local_entry_free_ref(tt_local); 576 goto out; 577 } 578 579 add_event: 580 batadv_tt_local_event(bat_priv, tt_local, BATADV_NO_FLAGS); 581 582 check_roaming: 583 /* Check whether it is a roaming, but don't do anything if the roaming 584 * process has already been handled 585 */ 586 if (tt_global && !(tt_global->common.flags & BATADV_TT_CLIENT_ROAM)) { 587 /* These node are probably going to update their tt table */ 588 head = &tt_global->orig_list; 589 rcu_read_lock(); 590 hlist_for_each_entry_rcu(orig_entry, head, list) { 591 batadv_send_roam_adv(bat_priv, tt_global->common.addr, 592 tt_global->common.vid, 593 orig_entry->orig_node); 594 } 595 rcu_read_unlock(); 596 if (roamed_back) { 597 batadv_tt_global_free(bat_priv, tt_global, 598 "Roaming canceled"); 599 tt_global = NULL; 600 } else { 601 /* The global entry has to be marked as ROAMING and 602 * has to be kept for consistency purpose 603 */ 604 tt_global->common.flags |= BATADV_TT_CLIENT_ROAM; 605 tt_global->roam_at = jiffies; 606 } 607 } 608 609 /* store the current remote flags before altering them. This helps 610 * understanding is flags are changing or not 611 */ 612 remote_flags = tt_local->common.flags & BATADV_TT_REMOTE_MASK; 613 614 if (batadv_is_wifi_netdev(in_dev)) 615 tt_local->common.flags |= BATADV_TT_CLIENT_WIFI; 616 else 617 tt_local->common.flags &= ~BATADV_TT_CLIENT_WIFI; 618 619 /* check the mark in the skb: if it's equal to the configured 620 * isolation_mark, it means the packet is coming from an isolated 621 * non-mesh client 622 */ 623 match_mark = (mark & bat_priv->isolation_mark_mask); 624 if (bat_priv->isolation_mark_mask && 625 match_mark == bat_priv->isolation_mark) 626 tt_local->common.flags |= BATADV_TT_CLIENT_ISOLA; 627 else 628 tt_local->common.flags &= ~BATADV_TT_CLIENT_ISOLA; 629 630 /* if any "dynamic" flag has been modified, resend an ADD event for this 631 * entry so that all the nodes can get the new flags 632 */ 633 if (remote_flags ^ (tt_local->common.flags & BATADV_TT_REMOTE_MASK)) 634 batadv_tt_local_event(bat_priv, tt_local, BATADV_NO_FLAGS); 635 636 ret = true; 637 out: 638 if (in_dev) 639 dev_put(in_dev); 640 if (tt_local) 641 batadv_tt_local_entry_free_ref(tt_local); 642 if (tt_global) 643 batadv_tt_global_entry_free_ref(tt_global); 644 return ret; 645 } 646 647 /** 648 * batadv_tt_prepare_tvlv_global_data - prepare the TVLV TT header to send 649 * within a TT Response directed to another node 650 * @orig_node: originator for which the TT data has to be prepared 651 * @tt_data: uninitialised pointer to the address of the TVLV buffer 652 * @tt_change: uninitialised pointer to the address of the area where the TT 653 * changed can be stored 654 * @tt_len: pointer to the length to reserve to the tt_change. if -1 this 655 * function reserves the amount of space needed to send the entire global TT 656 * table. In case of success the value is updated with the real amount of 657 * reserved bytes 658 659 * Allocate the needed amount of memory for the entire TT TVLV and write its 660 * header made up by one tvlv_tt_data object and a series of tvlv_tt_vlan_data 661 * objects, one per active VLAN served by the originator node. 662 * 663 * Return the size of the allocated buffer or 0 in case of failure. 664 */ 665 static uint16_t 666 batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node, 667 struct batadv_tvlv_tt_data **tt_data, 668 struct batadv_tvlv_tt_change **tt_change, 669 int32_t *tt_len) 670 { 671 uint16_t num_vlan = 0, num_entries = 0, change_offset, tvlv_len; 672 struct batadv_tvlv_tt_vlan_data *tt_vlan; 673 struct batadv_orig_node_vlan *vlan; 674 uint8_t *tt_change_ptr; 675 676 rcu_read_lock(); 677 list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) { 678 num_vlan++; 679 num_entries += atomic_read(&vlan->tt.num_entries); 680 } 681 682 change_offset = sizeof(**tt_data); 683 change_offset += num_vlan * sizeof(*tt_vlan); 684 685 /* if tt_len is negative, allocate the space needed by the full table */ 686 if (*tt_len < 0) 687 *tt_len = batadv_tt_len(num_entries); 688 689 tvlv_len = *tt_len; 690 tvlv_len += change_offset; 691 692 *tt_data = kmalloc(tvlv_len, GFP_ATOMIC); 693 if (!*tt_data) { 694 *tt_len = 0; 695 goto out; 696 } 697 698 (*tt_data)->flags = BATADV_NO_FLAGS; 699 (*tt_data)->ttvn = atomic_read(&orig_node->last_ttvn); 700 (*tt_data)->num_vlan = htons(num_vlan); 701 702 tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(*tt_data + 1); 703 list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) { 704 tt_vlan->vid = htons(vlan->vid); 705 tt_vlan->crc = htonl(vlan->tt.crc); 706 707 tt_vlan++; 708 } 709 710 tt_change_ptr = (uint8_t *)*tt_data + change_offset; 711 *tt_change = (struct batadv_tvlv_tt_change *)tt_change_ptr; 712 713 out: 714 rcu_read_unlock(); 715 return tvlv_len; 716 } 717 718 /** 719 * batadv_tt_prepare_tvlv_local_data - allocate and prepare the TT TVLV for this 720 * node 721 * @bat_priv: the bat priv with all the soft interface information 722 * @tt_data: uninitialised pointer to the address of the TVLV buffer 723 * @tt_change: uninitialised pointer to the address of the area where the TT 724 * changes can be stored 725 * @tt_len: pointer to the length to reserve to the tt_change. if -1 this 726 * function reserves the amount of space needed to send the entire local TT 727 * table. In case of success the value is updated with the real amount of 728 * reserved bytes 729 * 730 * Allocate the needed amount of memory for the entire TT TVLV and write its 731 * header made up by one tvlv_tt_data object and a series of tvlv_tt_vlan_data 732 * objects, one per active VLAN. 733 * 734 * Return the size of the allocated buffer or 0 in case of failure. 735 */ 736 static uint16_t 737 batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv, 738 struct batadv_tvlv_tt_data **tt_data, 739 struct batadv_tvlv_tt_change **tt_change, 740 int32_t *tt_len) 741 { 742 struct batadv_tvlv_tt_vlan_data *tt_vlan; 743 struct batadv_softif_vlan *vlan; 744 uint16_t num_vlan = 0, num_entries = 0, tvlv_len; 745 uint8_t *tt_change_ptr; 746 int change_offset; 747 748 rcu_read_lock(); 749 hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) { 750 num_vlan++; 751 num_entries += atomic_read(&vlan->tt.num_entries); 752 } 753 754 change_offset = sizeof(**tt_data); 755 change_offset += num_vlan * sizeof(*tt_vlan); 756 757 /* if tt_len is negative, allocate the space needed by the full table */ 758 if (*tt_len < 0) 759 *tt_len = batadv_tt_len(num_entries); 760 761 tvlv_len = *tt_len; 762 tvlv_len += change_offset; 763 764 *tt_data = kmalloc(tvlv_len, GFP_ATOMIC); 765 if (!*tt_data) { 766 tvlv_len = 0; 767 goto out; 768 } 769 770 (*tt_data)->flags = BATADV_NO_FLAGS; 771 (*tt_data)->ttvn = atomic_read(&bat_priv->tt.vn); 772 (*tt_data)->num_vlan = htons(num_vlan); 773 774 tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(*tt_data + 1); 775 hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) { 776 tt_vlan->vid = htons(vlan->vid); 777 tt_vlan->crc = htonl(vlan->tt.crc); 778 779 tt_vlan++; 780 } 781 782 tt_change_ptr = (uint8_t *)*tt_data + change_offset; 783 *tt_change = (struct batadv_tvlv_tt_change *)tt_change_ptr; 784 785 out: 786 rcu_read_unlock(); 787 return tvlv_len; 788 } 789 790 /** 791 * batadv_tt_tvlv_container_update - update the translation table tvlv container 792 * after local tt changes have been committed 793 * @bat_priv: the bat priv with all the soft interface information 794 */ 795 static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv) 796 { 797 struct batadv_tt_change_node *entry, *safe; 798 struct batadv_tvlv_tt_data *tt_data; 799 struct batadv_tvlv_tt_change *tt_change; 800 int tt_diff_len, tt_change_len = 0; 801 int tt_diff_entries_num = 0, tt_diff_entries_count = 0; 802 uint16_t tvlv_len; 803 804 tt_diff_entries_num = atomic_read(&bat_priv->tt.local_changes); 805 tt_diff_len = batadv_tt_len(tt_diff_entries_num); 806 807 /* if we have too many changes for one packet don't send any 808 * and wait for the tt table request which will be fragmented 809 */ 810 if (tt_diff_len > bat_priv->soft_iface->mtu) 811 tt_diff_len = 0; 812 813 tvlv_len = batadv_tt_prepare_tvlv_local_data(bat_priv, &tt_data, 814 &tt_change, &tt_diff_len); 815 if (!tvlv_len) 816 return; 817 818 tt_data->flags = BATADV_TT_OGM_DIFF; 819 820 if (tt_diff_len == 0) 821 goto container_register; 822 823 spin_lock_bh(&bat_priv->tt.changes_list_lock); 824 atomic_set(&bat_priv->tt.local_changes, 0); 825 826 list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list, 827 list) { 828 if (tt_diff_entries_count < tt_diff_entries_num) { 829 memcpy(tt_change + tt_diff_entries_count, 830 &entry->change, 831 sizeof(struct batadv_tvlv_tt_change)); 832 tt_diff_entries_count++; 833 } 834 list_del(&entry->list); 835 kfree(entry); 836 } 837 spin_unlock_bh(&bat_priv->tt.changes_list_lock); 838 839 /* Keep the buffer for possible tt_request */ 840 spin_lock_bh(&bat_priv->tt.last_changeset_lock); 841 kfree(bat_priv->tt.last_changeset); 842 bat_priv->tt.last_changeset_len = 0; 843 bat_priv->tt.last_changeset = NULL; 844 tt_change_len = batadv_tt_len(tt_diff_entries_count); 845 /* check whether this new OGM has no changes due to size problems */ 846 if (tt_diff_entries_count > 0) { 847 /* if kmalloc() fails we will reply with the full table 848 * instead of providing the diff 849 */ 850 bat_priv->tt.last_changeset = kzalloc(tt_diff_len, GFP_ATOMIC); 851 if (bat_priv->tt.last_changeset) { 852 memcpy(bat_priv->tt.last_changeset, 853 tt_change, tt_change_len); 854 bat_priv->tt.last_changeset_len = tt_diff_len; 855 } 856 } 857 spin_unlock_bh(&bat_priv->tt.last_changeset_lock); 858 859 container_register: 860 batadv_tvlv_container_register(bat_priv, BATADV_TVLV_TT, 1, tt_data, 861 tvlv_len); 862 kfree(tt_data); 863 } 864 865 int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset) 866 { 867 struct net_device *net_dev = (struct net_device *)seq->private; 868 struct batadv_priv *bat_priv = netdev_priv(net_dev); 869 struct batadv_hashtable *hash = bat_priv->tt.local_hash; 870 struct batadv_tt_common_entry *tt_common_entry; 871 struct batadv_tt_local_entry *tt_local; 872 struct batadv_hard_iface *primary_if; 873 struct batadv_softif_vlan *vlan; 874 struct hlist_head *head; 875 unsigned short vid; 876 uint32_t i; 877 int last_seen_secs; 878 int last_seen_msecs; 879 unsigned long last_seen_jiffies; 880 bool no_purge; 881 uint16_t np_flag = BATADV_TT_CLIENT_NOPURGE; 882 883 primary_if = batadv_seq_print_text_primary_if_get(seq); 884 if (!primary_if) 885 goto out; 886 887 seq_printf(seq, 888 "Locally retrieved addresses (from %s) announced via TT (TTVN: %u):\n", 889 net_dev->name, (uint8_t)atomic_read(&bat_priv->tt.vn)); 890 seq_printf(seq, " %-13s %s %-8s %-9s (%-10s)\n", "Client", "VID", 891 "Flags", "Last seen", "CRC"); 892 893 for (i = 0; i < hash->size; i++) { 894 head = &hash->table[i]; 895 896 rcu_read_lock(); 897 hlist_for_each_entry_rcu(tt_common_entry, 898 head, hash_entry) { 899 tt_local = container_of(tt_common_entry, 900 struct batadv_tt_local_entry, 901 common); 902 vid = tt_common_entry->vid; 903 last_seen_jiffies = jiffies - tt_local->last_seen; 904 last_seen_msecs = jiffies_to_msecs(last_seen_jiffies); 905 last_seen_secs = last_seen_msecs / 1000; 906 last_seen_msecs = last_seen_msecs % 1000; 907 908 no_purge = tt_common_entry->flags & np_flag; 909 910 vlan = batadv_softif_vlan_get(bat_priv, vid); 911 if (!vlan) { 912 seq_printf(seq, "Cannot retrieve VLAN %d\n", 913 BATADV_PRINT_VID(vid)); 914 continue; 915 } 916 917 seq_printf(seq, 918 " * %pM %4i [%c%c%c%c%c%c] %3u.%03u (%#.8x)\n", 919 tt_common_entry->addr, 920 BATADV_PRINT_VID(tt_common_entry->vid), 921 (tt_common_entry->flags & 922 BATADV_TT_CLIENT_ROAM ? 'R' : '.'), 923 no_purge ? 'P' : '.', 924 (tt_common_entry->flags & 925 BATADV_TT_CLIENT_NEW ? 'N' : '.'), 926 (tt_common_entry->flags & 927 BATADV_TT_CLIENT_PENDING ? 'X' : '.'), 928 (tt_common_entry->flags & 929 BATADV_TT_CLIENT_WIFI ? 'W' : '.'), 930 (tt_common_entry->flags & 931 BATADV_TT_CLIENT_ISOLA ? 'I' : '.'), 932 no_purge ? 0 : last_seen_secs, 933 no_purge ? 0 : last_seen_msecs, 934 vlan->tt.crc); 935 936 batadv_softif_vlan_free_ref(vlan); 937 } 938 rcu_read_unlock(); 939 } 940 out: 941 if (primary_if) 942 batadv_hardif_free_ref(primary_if); 943 return 0; 944 } 945 946 static void 947 batadv_tt_local_set_pending(struct batadv_priv *bat_priv, 948 struct batadv_tt_local_entry *tt_local_entry, 949 uint16_t flags, const char *message) 950 { 951 batadv_tt_local_event(bat_priv, tt_local_entry, flags); 952 953 /* The local client has to be marked as "pending to be removed" but has 954 * to be kept in the table in order to send it in a full table 955 * response issued before the net ttvn increment (consistency check) 956 */ 957 tt_local_entry->common.flags |= BATADV_TT_CLIENT_PENDING; 958 959 batadv_dbg(BATADV_DBG_TT, bat_priv, 960 "Local tt entry (%pM, vid: %d) pending to be removed: %s\n", 961 tt_local_entry->common.addr, 962 BATADV_PRINT_VID(tt_local_entry->common.vid), message); 963 } 964 965 /** 966 * batadv_tt_local_remove - logically remove an entry from the local table 967 * @bat_priv: the bat priv with all the soft interface information 968 * @addr: the MAC address of the client to remove 969 * @vid: VLAN identifier 970 * @message: message to append to the log on deletion 971 * @roaming: true if the deletion is due to a roaming event 972 * 973 * Returns the flags assigned to the local entry before being deleted 974 */ 975 uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv, 976 const uint8_t *addr, unsigned short vid, 977 const char *message, bool roaming) 978 { 979 struct batadv_tt_local_entry *tt_local_entry; 980 uint16_t flags, curr_flags = BATADV_NO_FLAGS; 981 982 tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid); 983 if (!tt_local_entry) 984 goto out; 985 986 curr_flags = tt_local_entry->common.flags; 987 988 flags = BATADV_TT_CLIENT_DEL; 989 /* if this global entry addition is due to a roaming, the node has to 990 * mark the local entry as "roamed" in order to correctly reroute 991 * packets later 992 */ 993 if (roaming) { 994 flags |= BATADV_TT_CLIENT_ROAM; 995 /* mark the local client as ROAMed */ 996 tt_local_entry->common.flags |= BATADV_TT_CLIENT_ROAM; 997 } 998 999 if (!(tt_local_entry->common.flags & BATADV_TT_CLIENT_NEW)) { 1000 batadv_tt_local_set_pending(bat_priv, tt_local_entry, flags, 1001 message); 1002 goto out; 1003 } 1004 /* if this client has been added right now, it is possible to 1005 * immediately purge it 1006 */ 1007 batadv_tt_local_event(bat_priv, tt_local_entry, BATADV_TT_CLIENT_DEL); 1008 hlist_del_rcu(&tt_local_entry->common.hash_entry); 1009 batadv_tt_local_entry_free_ref(tt_local_entry); 1010 1011 out: 1012 if (tt_local_entry) 1013 batadv_tt_local_entry_free_ref(tt_local_entry); 1014 1015 return curr_flags; 1016 } 1017 1018 /** 1019 * batadv_tt_local_purge_list - purge inactive tt local entries 1020 * @bat_priv: the bat priv with all the soft interface information 1021 * @head: pointer to the list containing the local tt entries 1022 * @timeout: parameter deciding whether a given tt local entry is considered 1023 * inactive or not 1024 */ 1025 static void batadv_tt_local_purge_list(struct batadv_priv *bat_priv, 1026 struct hlist_head *head, 1027 int timeout) 1028 { 1029 struct batadv_tt_local_entry *tt_local_entry; 1030 struct batadv_tt_common_entry *tt_common_entry; 1031 struct hlist_node *node_tmp; 1032 1033 hlist_for_each_entry_safe(tt_common_entry, node_tmp, head, 1034 hash_entry) { 1035 tt_local_entry = container_of(tt_common_entry, 1036 struct batadv_tt_local_entry, 1037 common); 1038 if (tt_local_entry->common.flags & BATADV_TT_CLIENT_NOPURGE) 1039 continue; 1040 1041 /* entry already marked for deletion */ 1042 if (tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING) 1043 continue; 1044 1045 if (!batadv_has_timed_out(tt_local_entry->last_seen, timeout)) 1046 continue; 1047 1048 batadv_tt_local_set_pending(bat_priv, tt_local_entry, 1049 BATADV_TT_CLIENT_DEL, "timed out"); 1050 } 1051 } 1052 1053 /** 1054 * batadv_tt_local_purge - purge inactive tt local entries 1055 * @bat_priv: the bat priv with all the soft interface information 1056 * @timeout: parameter deciding whether a given tt local entry is considered 1057 * inactive or not 1058 */ 1059 static void batadv_tt_local_purge(struct batadv_priv *bat_priv, 1060 int timeout) 1061 { 1062 struct batadv_hashtable *hash = bat_priv->tt.local_hash; 1063 struct hlist_head *head; 1064 spinlock_t *list_lock; /* protects write access to the hash lists */ 1065 uint32_t i; 1066 1067 for (i = 0; i < hash->size; i++) { 1068 head = &hash->table[i]; 1069 list_lock = &hash->list_locks[i]; 1070 1071 spin_lock_bh(list_lock); 1072 batadv_tt_local_purge_list(bat_priv, head, timeout); 1073 spin_unlock_bh(list_lock); 1074 } 1075 } 1076 1077 static void batadv_tt_local_table_free(struct batadv_priv *bat_priv) 1078 { 1079 struct batadv_hashtable *hash; 1080 spinlock_t *list_lock; /* protects write access to the hash lists */ 1081 struct batadv_tt_common_entry *tt_common_entry; 1082 struct batadv_tt_local_entry *tt_local; 1083 struct hlist_node *node_tmp; 1084 struct hlist_head *head; 1085 uint32_t i; 1086 1087 if (!bat_priv->tt.local_hash) 1088 return; 1089 1090 hash = bat_priv->tt.local_hash; 1091 1092 for (i = 0; i < hash->size; i++) { 1093 head = &hash->table[i]; 1094 list_lock = &hash->list_locks[i]; 1095 1096 spin_lock_bh(list_lock); 1097 hlist_for_each_entry_safe(tt_common_entry, node_tmp, 1098 head, hash_entry) { 1099 hlist_del_rcu(&tt_common_entry->hash_entry); 1100 tt_local = container_of(tt_common_entry, 1101 struct batadv_tt_local_entry, 1102 common); 1103 batadv_tt_local_entry_free_ref(tt_local); 1104 } 1105 spin_unlock_bh(list_lock); 1106 } 1107 1108 batadv_hash_destroy(hash); 1109 1110 bat_priv->tt.local_hash = NULL; 1111 } 1112 1113 static int batadv_tt_global_init(struct batadv_priv *bat_priv) 1114 { 1115 if (bat_priv->tt.global_hash) 1116 return 0; 1117 1118 bat_priv->tt.global_hash = batadv_hash_new(1024); 1119 1120 if (!bat_priv->tt.global_hash) 1121 return -ENOMEM; 1122 1123 batadv_hash_set_lock_class(bat_priv->tt.global_hash, 1124 &batadv_tt_global_hash_lock_class_key); 1125 1126 return 0; 1127 } 1128 1129 static void batadv_tt_changes_list_free(struct batadv_priv *bat_priv) 1130 { 1131 struct batadv_tt_change_node *entry, *safe; 1132 1133 spin_lock_bh(&bat_priv->tt.changes_list_lock); 1134 1135 list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list, 1136 list) { 1137 list_del(&entry->list); 1138 kfree(entry); 1139 } 1140 1141 atomic_set(&bat_priv->tt.local_changes, 0); 1142 spin_unlock_bh(&bat_priv->tt.changes_list_lock); 1143 } 1144 1145 /* retrieves the orig_tt_list_entry belonging to orig_node from the 1146 * batadv_tt_global_entry list 1147 * 1148 * returns it with an increased refcounter, NULL if not found 1149 */ 1150 static struct batadv_tt_orig_list_entry * 1151 batadv_tt_global_orig_entry_find(const struct batadv_tt_global_entry *entry, 1152 const struct batadv_orig_node *orig_node) 1153 { 1154 struct batadv_tt_orig_list_entry *tmp_orig_entry, *orig_entry = NULL; 1155 const struct hlist_head *head; 1156 1157 rcu_read_lock(); 1158 head = &entry->orig_list; 1159 hlist_for_each_entry_rcu(tmp_orig_entry, head, list) { 1160 if (tmp_orig_entry->orig_node != orig_node) 1161 continue; 1162 if (!atomic_inc_not_zero(&tmp_orig_entry->refcount)) 1163 continue; 1164 1165 orig_entry = tmp_orig_entry; 1166 break; 1167 } 1168 rcu_read_unlock(); 1169 1170 return orig_entry; 1171 } 1172 1173 /* find out if an orig_node is already in the list of a tt_global_entry. 1174 * returns true if found, false otherwise 1175 */ 1176 static bool 1177 batadv_tt_global_entry_has_orig(const struct batadv_tt_global_entry *entry, 1178 const struct batadv_orig_node *orig_node) 1179 { 1180 struct batadv_tt_orig_list_entry *orig_entry; 1181 bool found = false; 1182 1183 orig_entry = batadv_tt_global_orig_entry_find(entry, orig_node); 1184 if (orig_entry) { 1185 found = true; 1186 batadv_tt_orig_list_entry_free_ref(orig_entry); 1187 } 1188 1189 return found; 1190 } 1191 1192 static void 1193 batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global, 1194 struct batadv_orig_node *orig_node, int ttvn) 1195 { 1196 struct batadv_tt_orig_list_entry *orig_entry; 1197 1198 orig_entry = batadv_tt_global_orig_entry_find(tt_global, orig_node); 1199 if (orig_entry) { 1200 /* refresh the ttvn: the current value could be a bogus one that 1201 * was added during a "temporary client detection" 1202 */ 1203 orig_entry->ttvn = ttvn; 1204 goto out; 1205 } 1206 1207 orig_entry = kzalloc(sizeof(*orig_entry), GFP_ATOMIC); 1208 if (!orig_entry) 1209 goto out; 1210 1211 INIT_HLIST_NODE(&orig_entry->list); 1212 atomic_inc(&orig_node->refcount); 1213 batadv_tt_global_size_inc(orig_node, tt_global->common.vid); 1214 orig_entry->orig_node = orig_node; 1215 orig_entry->ttvn = ttvn; 1216 atomic_set(&orig_entry->refcount, 2); 1217 1218 spin_lock_bh(&tt_global->list_lock); 1219 hlist_add_head_rcu(&orig_entry->list, 1220 &tt_global->orig_list); 1221 spin_unlock_bh(&tt_global->list_lock); 1222 out: 1223 if (orig_entry) 1224 batadv_tt_orig_list_entry_free_ref(orig_entry); 1225 } 1226 1227 /** 1228 * batadv_tt_global_add - add a new TT global entry or update an existing one 1229 * @bat_priv: the bat priv with all the soft interface information 1230 * @orig_node: the originator announcing the client 1231 * @tt_addr: the mac address of the non-mesh client 1232 * @vid: VLAN identifier 1233 * @flags: TT flags that have to be set for this non-mesh client 1234 * @ttvn: the tt version number ever announcing this non-mesh client 1235 * 1236 * Add a new TT global entry for the given originator. If the entry already 1237 * exists add a new reference to the given originator (a global entry can have 1238 * references to multiple originators) and adjust the flags attribute to reflect 1239 * the function argument. 1240 * If a TT local entry exists for this non-mesh client remove it. 1241 * 1242 * The caller must hold orig_node refcount. 1243 * 1244 * Return true if the new entry has been added, false otherwise 1245 */ 1246 static bool batadv_tt_global_add(struct batadv_priv *bat_priv, 1247 struct batadv_orig_node *orig_node, 1248 const unsigned char *tt_addr, 1249 unsigned short vid, uint16_t flags, 1250 uint8_t ttvn) 1251 { 1252 struct batadv_tt_global_entry *tt_global_entry; 1253 struct batadv_tt_local_entry *tt_local_entry; 1254 bool ret = false; 1255 int hash_added; 1256 struct batadv_tt_common_entry *common; 1257 uint16_t local_flags; 1258 1259 /* ignore global entries from backbone nodes */ 1260 if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig, vid)) 1261 return true; 1262 1263 tt_global_entry = batadv_tt_global_hash_find(bat_priv, tt_addr, vid); 1264 tt_local_entry = batadv_tt_local_hash_find(bat_priv, tt_addr, vid); 1265 1266 /* if the node already has a local client for this entry, it has to wait 1267 * for a roaming advertisement instead of manually messing up the global 1268 * table 1269 */ 1270 if ((flags & BATADV_TT_CLIENT_TEMP) && tt_local_entry && 1271 !(tt_local_entry->common.flags & BATADV_TT_CLIENT_NEW)) 1272 goto out; 1273 1274 if (!tt_global_entry) { 1275 tt_global_entry = kzalloc(sizeof(*tt_global_entry), GFP_ATOMIC); 1276 if (!tt_global_entry) 1277 goto out; 1278 1279 common = &tt_global_entry->common; 1280 memcpy(common->addr, tt_addr, ETH_ALEN); 1281 common->vid = vid; 1282 1283 common->flags = flags; 1284 tt_global_entry->roam_at = 0; 1285 /* node must store current time in case of roaming. This is 1286 * needed to purge this entry out on timeout (if nobody claims 1287 * it) 1288 */ 1289 if (flags & BATADV_TT_CLIENT_ROAM) 1290 tt_global_entry->roam_at = jiffies; 1291 atomic_set(&common->refcount, 2); 1292 common->added_at = jiffies; 1293 1294 INIT_HLIST_HEAD(&tt_global_entry->orig_list); 1295 spin_lock_init(&tt_global_entry->list_lock); 1296 1297 hash_added = batadv_hash_add(bat_priv->tt.global_hash, 1298 batadv_compare_tt, 1299 batadv_choose_tt, common, 1300 &common->hash_entry); 1301 1302 if (unlikely(hash_added != 0)) { 1303 /* remove the reference for the hash */ 1304 batadv_tt_global_entry_free_ref(tt_global_entry); 1305 goto out_remove; 1306 } 1307 } else { 1308 common = &tt_global_entry->common; 1309 /* If there is already a global entry, we can use this one for 1310 * our processing. 1311 * But if we are trying to add a temporary client then here are 1312 * two options at this point: 1313 * 1) the global client is not a temporary client: the global 1314 * client has to be left as it is, temporary information 1315 * should never override any already known client state 1316 * 2) the global client is a temporary client: purge the 1317 * originator list and add the new one orig_entry 1318 */ 1319 if (flags & BATADV_TT_CLIENT_TEMP) { 1320 if (!(common->flags & BATADV_TT_CLIENT_TEMP)) 1321 goto out; 1322 if (batadv_tt_global_entry_has_orig(tt_global_entry, 1323 orig_node)) 1324 goto out_remove; 1325 batadv_tt_global_del_orig_list(tt_global_entry); 1326 goto add_orig_entry; 1327 } 1328 1329 /* if the client was temporary added before receiving the first 1330 * OGM announcing it, we have to clear the TEMP flag 1331 */ 1332 common->flags &= ~BATADV_TT_CLIENT_TEMP; 1333 1334 /* the change can carry possible "attribute" flags like the 1335 * TT_CLIENT_WIFI, therefore they have to be copied in the 1336 * client entry 1337 */ 1338 tt_global_entry->common.flags |= flags; 1339 1340 /* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only 1341 * one originator left in the list and we previously received a 1342 * delete + roaming change for this originator. 1343 * 1344 * We should first delete the old originator before adding the 1345 * new one. 1346 */ 1347 if (common->flags & BATADV_TT_CLIENT_ROAM) { 1348 batadv_tt_global_del_orig_list(tt_global_entry); 1349 common->flags &= ~BATADV_TT_CLIENT_ROAM; 1350 tt_global_entry->roam_at = 0; 1351 } 1352 } 1353 add_orig_entry: 1354 /* add the new orig_entry (if needed) or update it */ 1355 batadv_tt_global_orig_entry_add(tt_global_entry, orig_node, ttvn); 1356 1357 batadv_dbg(BATADV_DBG_TT, bat_priv, 1358 "Creating new global tt entry: %pM (vid: %d, via %pM)\n", 1359 common->addr, BATADV_PRINT_VID(common->vid), 1360 orig_node->orig); 1361 ret = true; 1362 1363 out_remove: 1364 1365 /* remove address from local hash if present */ 1366 local_flags = batadv_tt_local_remove(bat_priv, tt_addr, vid, 1367 "global tt received", 1368 flags & BATADV_TT_CLIENT_ROAM); 1369 tt_global_entry->common.flags |= local_flags & BATADV_TT_CLIENT_WIFI; 1370 1371 if (!(flags & BATADV_TT_CLIENT_ROAM)) 1372 /* this is a normal global add. Therefore the client is not in a 1373 * roaming state anymore. 1374 */ 1375 tt_global_entry->common.flags &= ~BATADV_TT_CLIENT_ROAM; 1376 1377 out: 1378 if (tt_global_entry) 1379 batadv_tt_global_entry_free_ref(tt_global_entry); 1380 if (tt_local_entry) 1381 batadv_tt_local_entry_free_ref(tt_local_entry); 1382 return ret; 1383 } 1384 1385 /** 1386 * batadv_transtable_best_orig - Get best originator list entry from tt entry 1387 * @bat_priv: the bat priv with all the soft interface information 1388 * @tt_global_entry: global translation table entry to be analyzed 1389 * 1390 * This functon assumes the caller holds rcu_read_lock(). 1391 * Returns best originator list entry or NULL on errors. 1392 */ 1393 static struct batadv_tt_orig_list_entry * 1394 batadv_transtable_best_orig(struct batadv_priv *bat_priv, 1395 struct batadv_tt_global_entry *tt_global_entry) 1396 { 1397 struct batadv_neigh_node *router, *best_router = NULL; 1398 struct batadv_algo_ops *bao = bat_priv->bat_algo_ops; 1399 struct hlist_head *head; 1400 struct batadv_tt_orig_list_entry *orig_entry, *best_entry = NULL; 1401 1402 head = &tt_global_entry->orig_list; 1403 hlist_for_each_entry_rcu(orig_entry, head, list) { 1404 router = batadv_orig_router_get(orig_entry->orig_node, 1405 BATADV_IF_DEFAULT); 1406 if (!router) 1407 continue; 1408 1409 if (best_router && 1410 bao->bat_neigh_cmp(router, BATADV_IF_DEFAULT, 1411 best_router, BATADV_IF_DEFAULT) <= 0) { 1412 batadv_neigh_node_free_ref(router); 1413 continue; 1414 } 1415 1416 /* release the refcount for the "old" best */ 1417 if (best_router) 1418 batadv_neigh_node_free_ref(best_router); 1419 1420 best_entry = orig_entry; 1421 best_router = router; 1422 } 1423 1424 if (best_router) 1425 batadv_neigh_node_free_ref(best_router); 1426 1427 return best_entry; 1428 } 1429 1430 /** 1431 * batadv_tt_global_print_entry - print all orig nodes who announce the address 1432 * for this global entry 1433 * @bat_priv: the bat priv with all the soft interface information 1434 * @tt_global_entry: global translation table entry to be printed 1435 * @seq: debugfs table seq_file struct 1436 * 1437 * This functon assumes the caller holds rcu_read_lock(). 1438 */ 1439 static void 1440 batadv_tt_global_print_entry(struct batadv_priv *bat_priv, 1441 struct batadv_tt_global_entry *tt_global_entry, 1442 struct seq_file *seq) 1443 { 1444 struct batadv_tt_orig_list_entry *orig_entry, *best_entry; 1445 struct batadv_tt_common_entry *tt_common_entry; 1446 struct batadv_orig_node_vlan *vlan; 1447 struct hlist_head *head; 1448 uint8_t last_ttvn; 1449 uint16_t flags; 1450 1451 tt_common_entry = &tt_global_entry->common; 1452 flags = tt_common_entry->flags; 1453 1454 best_entry = batadv_transtable_best_orig(bat_priv, tt_global_entry); 1455 if (best_entry) { 1456 vlan = batadv_orig_node_vlan_get(best_entry->orig_node, 1457 tt_common_entry->vid); 1458 if (!vlan) { 1459 seq_printf(seq, 1460 " * Cannot retrieve VLAN %d for originator %pM\n", 1461 BATADV_PRINT_VID(tt_common_entry->vid), 1462 best_entry->orig_node->orig); 1463 goto print_list; 1464 } 1465 1466 last_ttvn = atomic_read(&best_entry->orig_node->last_ttvn); 1467 seq_printf(seq, 1468 " %c %pM %4i (%3u) via %pM (%3u) (%#.8x) [%c%c%c%c]\n", 1469 '*', tt_global_entry->common.addr, 1470 BATADV_PRINT_VID(tt_global_entry->common.vid), 1471 best_entry->ttvn, best_entry->orig_node->orig, 1472 last_ttvn, vlan->tt.crc, 1473 (flags & BATADV_TT_CLIENT_ROAM ? 'R' : '.'), 1474 (flags & BATADV_TT_CLIENT_WIFI ? 'W' : '.'), 1475 (flags & BATADV_TT_CLIENT_ISOLA ? 'I' : '.'), 1476 (flags & BATADV_TT_CLIENT_TEMP ? 'T' : '.')); 1477 1478 batadv_orig_node_vlan_free_ref(vlan); 1479 } 1480 1481 print_list: 1482 head = &tt_global_entry->orig_list; 1483 1484 hlist_for_each_entry_rcu(orig_entry, head, list) { 1485 if (best_entry == orig_entry) 1486 continue; 1487 1488 vlan = batadv_orig_node_vlan_get(orig_entry->orig_node, 1489 tt_common_entry->vid); 1490 if (!vlan) { 1491 seq_printf(seq, 1492 " + Cannot retrieve VLAN %d for originator %pM\n", 1493 BATADV_PRINT_VID(tt_common_entry->vid), 1494 orig_entry->orig_node->orig); 1495 continue; 1496 } 1497 1498 last_ttvn = atomic_read(&orig_entry->orig_node->last_ttvn); 1499 seq_printf(seq, 1500 " %c %pM %4d (%3u) via %pM (%3u) (%#.8x) [%c%c%c%c]\n", 1501 '+', tt_global_entry->common.addr, 1502 BATADV_PRINT_VID(tt_global_entry->common.vid), 1503 orig_entry->ttvn, orig_entry->orig_node->orig, 1504 last_ttvn, vlan->tt.crc, 1505 (flags & BATADV_TT_CLIENT_ROAM ? 'R' : '.'), 1506 (flags & BATADV_TT_CLIENT_WIFI ? 'W' : '.'), 1507 (flags & BATADV_TT_CLIENT_ISOLA ? 'I' : '.'), 1508 (flags & BATADV_TT_CLIENT_TEMP ? 'T' : '.')); 1509 1510 batadv_orig_node_vlan_free_ref(vlan); 1511 } 1512 } 1513 1514 int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset) 1515 { 1516 struct net_device *net_dev = (struct net_device *)seq->private; 1517 struct batadv_priv *bat_priv = netdev_priv(net_dev); 1518 struct batadv_hashtable *hash = bat_priv->tt.global_hash; 1519 struct batadv_tt_common_entry *tt_common_entry; 1520 struct batadv_tt_global_entry *tt_global; 1521 struct batadv_hard_iface *primary_if; 1522 struct hlist_head *head; 1523 uint32_t i; 1524 1525 primary_if = batadv_seq_print_text_primary_if_get(seq); 1526 if (!primary_if) 1527 goto out; 1528 1529 seq_printf(seq, 1530 "Globally announced TT entries received via the mesh %s\n", 1531 net_dev->name); 1532 seq_printf(seq, " %-13s %s %s %-15s %s (%-10s) %s\n", 1533 "Client", "VID", "(TTVN)", "Originator", "(Curr TTVN)", 1534 "CRC", "Flags"); 1535 1536 for (i = 0; i < hash->size; i++) { 1537 head = &hash->table[i]; 1538 1539 rcu_read_lock(); 1540 hlist_for_each_entry_rcu(tt_common_entry, 1541 head, hash_entry) { 1542 tt_global = container_of(tt_common_entry, 1543 struct batadv_tt_global_entry, 1544 common); 1545 batadv_tt_global_print_entry(bat_priv, tt_global, seq); 1546 } 1547 rcu_read_unlock(); 1548 } 1549 out: 1550 if (primary_if) 1551 batadv_hardif_free_ref(primary_if); 1552 return 0; 1553 } 1554 1555 /* deletes the orig list of a tt_global_entry */ 1556 static void 1557 batadv_tt_global_del_orig_list(struct batadv_tt_global_entry *tt_global_entry) 1558 { 1559 struct hlist_head *head; 1560 struct hlist_node *safe; 1561 struct batadv_tt_orig_list_entry *orig_entry; 1562 1563 spin_lock_bh(&tt_global_entry->list_lock); 1564 head = &tt_global_entry->orig_list; 1565 hlist_for_each_entry_safe(orig_entry, safe, head, list) { 1566 hlist_del_rcu(&orig_entry->list); 1567 batadv_tt_global_size_dec(orig_entry->orig_node, 1568 tt_global_entry->common.vid); 1569 batadv_tt_orig_list_entry_free_ref(orig_entry); 1570 } 1571 spin_unlock_bh(&tt_global_entry->list_lock); 1572 } 1573 1574 static void 1575 batadv_tt_global_del_orig_entry(struct batadv_priv *bat_priv, 1576 struct batadv_tt_global_entry *tt_global_entry, 1577 struct batadv_orig_node *orig_node, 1578 const char *message) 1579 { 1580 struct hlist_head *head; 1581 struct hlist_node *safe; 1582 struct batadv_tt_orig_list_entry *orig_entry; 1583 unsigned short vid; 1584 1585 spin_lock_bh(&tt_global_entry->list_lock); 1586 head = &tt_global_entry->orig_list; 1587 hlist_for_each_entry_safe(orig_entry, safe, head, list) { 1588 if (orig_entry->orig_node == orig_node) { 1589 vid = tt_global_entry->common.vid; 1590 batadv_dbg(BATADV_DBG_TT, bat_priv, 1591 "Deleting %pM from global tt entry %pM (vid: %d): %s\n", 1592 orig_node->orig, 1593 tt_global_entry->common.addr, 1594 BATADV_PRINT_VID(vid), message); 1595 hlist_del_rcu(&orig_entry->list); 1596 batadv_tt_global_size_dec(orig_node, 1597 tt_global_entry->common.vid); 1598 batadv_tt_orig_list_entry_free_ref(orig_entry); 1599 } 1600 } 1601 spin_unlock_bh(&tt_global_entry->list_lock); 1602 } 1603 1604 /* If the client is to be deleted, we check if it is the last origantor entry 1605 * within tt_global entry. If yes, we set the BATADV_TT_CLIENT_ROAM flag and the 1606 * timer, otherwise we simply remove the originator scheduled for deletion. 1607 */ 1608 static void 1609 batadv_tt_global_del_roaming(struct batadv_priv *bat_priv, 1610 struct batadv_tt_global_entry *tt_global_entry, 1611 struct batadv_orig_node *orig_node, 1612 const char *message) 1613 { 1614 bool last_entry = true; 1615 struct hlist_head *head; 1616 struct batadv_tt_orig_list_entry *orig_entry; 1617 1618 /* no local entry exists, case 1: 1619 * Check if this is the last one or if other entries exist. 1620 */ 1621 1622 rcu_read_lock(); 1623 head = &tt_global_entry->orig_list; 1624 hlist_for_each_entry_rcu(orig_entry, head, list) { 1625 if (orig_entry->orig_node != orig_node) { 1626 last_entry = false; 1627 break; 1628 } 1629 } 1630 rcu_read_unlock(); 1631 1632 if (last_entry) { 1633 /* its the last one, mark for roaming. */ 1634 tt_global_entry->common.flags |= BATADV_TT_CLIENT_ROAM; 1635 tt_global_entry->roam_at = jiffies; 1636 } else 1637 /* there is another entry, we can simply delete this 1638 * one and can still use the other one. 1639 */ 1640 batadv_tt_global_del_orig_entry(bat_priv, tt_global_entry, 1641 orig_node, message); 1642 } 1643 1644 /** 1645 * batadv_tt_global_del - remove a client from the global table 1646 * @bat_priv: the bat priv with all the soft interface information 1647 * @orig_node: an originator serving this client 1648 * @addr: the mac address of the client 1649 * @vid: VLAN identifier 1650 * @message: a message explaining the reason for deleting the client to print 1651 * for debugging purpose 1652 * @roaming: true if the deletion has been triggered by a roaming event 1653 */ 1654 static void batadv_tt_global_del(struct batadv_priv *bat_priv, 1655 struct batadv_orig_node *orig_node, 1656 const unsigned char *addr, unsigned short vid, 1657 const char *message, bool roaming) 1658 { 1659 struct batadv_tt_global_entry *tt_global_entry; 1660 struct batadv_tt_local_entry *local_entry = NULL; 1661 1662 tt_global_entry = batadv_tt_global_hash_find(bat_priv, addr, vid); 1663 if (!tt_global_entry) 1664 goto out; 1665 1666 if (!roaming) { 1667 batadv_tt_global_del_orig_entry(bat_priv, tt_global_entry, 1668 orig_node, message); 1669 1670 if (hlist_empty(&tt_global_entry->orig_list)) 1671 batadv_tt_global_free(bat_priv, tt_global_entry, 1672 message); 1673 1674 goto out; 1675 } 1676 1677 /* if we are deleting a global entry due to a roam 1678 * event, there are two possibilities: 1679 * 1) the client roamed from node A to node B => if there 1680 * is only one originator left for this client, we mark 1681 * it with BATADV_TT_CLIENT_ROAM, we start a timer and we 1682 * wait for node B to claim it. In case of timeout 1683 * the entry is purged. 1684 * 1685 * If there are other originators left, we directly delete 1686 * the originator. 1687 * 2) the client roamed to us => we can directly delete 1688 * the global entry, since it is useless now. 1689 */ 1690 local_entry = batadv_tt_local_hash_find(bat_priv, 1691 tt_global_entry->common.addr, 1692 vid); 1693 if (local_entry) { 1694 /* local entry exists, case 2: client roamed to us. */ 1695 batadv_tt_global_del_orig_list(tt_global_entry); 1696 batadv_tt_global_free(bat_priv, tt_global_entry, message); 1697 } else 1698 /* no local entry exists, case 1: check for roaming */ 1699 batadv_tt_global_del_roaming(bat_priv, tt_global_entry, 1700 orig_node, message); 1701 1702 1703 out: 1704 if (tt_global_entry) 1705 batadv_tt_global_entry_free_ref(tt_global_entry); 1706 if (local_entry) 1707 batadv_tt_local_entry_free_ref(local_entry); 1708 } 1709 1710 /** 1711 * batadv_tt_global_del_orig - remove all the TT global entries belonging to the 1712 * given originator matching the provided vid 1713 * @bat_priv: the bat priv with all the soft interface information 1714 * @orig_node: the originator owning the entries to remove 1715 * @match_vid: the VLAN identifier to match. If negative all the entries will be 1716 * removed 1717 * @message: debug message to print as "reason" 1718 */ 1719 void batadv_tt_global_del_orig(struct batadv_priv *bat_priv, 1720 struct batadv_orig_node *orig_node, 1721 int32_t match_vid, 1722 const char *message) 1723 { 1724 struct batadv_tt_global_entry *tt_global; 1725 struct batadv_tt_common_entry *tt_common_entry; 1726 uint32_t i; 1727 struct batadv_hashtable *hash = bat_priv->tt.global_hash; 1728 struct hlist_node *safe; 1729 struct hlist_head *head; 1730 spinlock_t *list_lock; /* protects write access to the hash lists */ 1731 unsigned short vid; 1732 1733 if (!hash) 1734 return; 1735 1736 for (i = 0; i < hash->size; i++) { 1737 head = &hash->table[i]; 1738 list_lock = &hash->list_locks[i]; 1739 1740 spin_lock_bh(list_lock); 1741 hlist_for_each_entry_safe(tt_common_entry, safe, 1742 head, hash_entry) { 1743 /* remove only matching entries */ 1744 if (match_vid >= 0 && tt_common_entry->vid != match_vid) 1745 continue; 1746 1747 tt_global = container_of(tt_common_entry, 1748 struct batadv_tt_global_entry, 1749 common); 1750 1751 batadv_tt_global_del_orig_entry(bat_priv, tt_global, 1752 orig_node, message); 1753 1754 if (hlist_empty(&tt_global->orig_list)) { 1755 vid = tt_global->common.vid; 1756 batadv_dbg(BATADV_DBG_TT, bat_priv, 1757 "Deleting global tt entry %pM (vid: %d): %s\n", 1758 tt_global->common.addr, 1759 BATADV_PRINT_VID(vid), message); 1760 hlist_del_rcu(&tt_common_entry->hash_entry); 1761 batadv_tt_global_entry_free_ref(tt_global); 1762 } 1763 } 1764 spin_unlock_bh(list_lock); 1765 } 1766 orig_node->tt_initialised = false; 1767 } 1768 1769 static bool batadv_tt_global_to_purge(struct batadv_tt_global_entry *tt_global, 1770 char **msg) 1771 { 1772 bool purge = false; 1773 unsigned long roam_timeout = BATADV_TT_CLIENT_ROAM_TIMEOUT; 1774 unsigned long temp_timeout = BATADV_TT_CLIENT_TEMP_TIMEOUT; 1775 1776 if ((tt_global->common.flags & BATADV_TT_CLIENT_ROAM) && 1777 batadv_has_timed_out(tt_global->roam_at, roam_timeout)) { 1778 purge = true; 1779 *msg = "Roaming timeout\n"; 1780 } 1781 1782 if ((tt_global->common.flags & BATADV_TT_CLIENT_TEMP) && 1783 batadv_has_timed_out(tt_global->common.added_at, temp_timeout)) { 1784 purge = true; 1785 *msg = "Temporary client timeout\n"; 1786 } 1787 1788 return purge; 1789 } 1790 1791 static void batadv_tt_global_purge(struct batadv_priv *bat_priv) 1792 { 1793 struct batadv_hashtable *hash = bat_priv->tt.global_hash; 1794 struct hlist_head *head; 1795 struct hlist_node *node_tmp; 1796 spinlock_t *list_lock; /* protects write access to the hash lists */ 1797 uint32_t i; 1798 char *msg = NULL; 1799 struct batadv_tt_common_entry *tt_common; 1800 struct batadv_tt_global_entry *tt_global; 1801 1802 for (i = 0; i < hash->size; i++) { 1803 head = &hash->table[i]; 1804 list_lock = &hash->list_locks[i]; 1805 1806 spin_lock_bh(list_lock); 1807 hlist_for_each_entry_safe(tt_common, node_tmp, head, 1808 hash_entry) { 1809 tt_global = container_of(tt_common, 1810 struct batadv_tt_global_entry, 1811 common); 1812 1813 if (!batadv_tt_global_to_purge(tt_global, &msg)) 1814 continue; 1815 1816 batadv_dbg(BATADV_DBG_TT, bat_priv, 1817 "Deleting global tt entry %pM (vid: %d): %s\n", 1818 tt_global->common.addr, 1819 BATADV_PRINT_VID(tt_global->common.vid), 1820 msg); 1821 1822 hlist_del_rcu(&tt_common->hash_entry); 1823 1824 batadv_tt_global_entry_free_ref(tt_global); 1825 } 1826 spin_unlock_bh(list_lock); 1827 } 1828 } 1829 1830 static void batadv_tt_global_table_free(struct batadv_priv *bat_priv) 1831 { 1832 struct batadv_hashtable *hash; 1833 spinlock_t *list_lock; /* protects write access to the hash lists */ 1834 struct batadv_tt_common_entry *tt_common_entry; 1835 struct batadv_tt_global_entry *tt_global; 1836 struct hlist_node *node_tmp; 1837 struct hlist_head *head; 1838 uint32_t i; 1839 1840 if (!bat_priv->tt.global_hash) 1841 return; 1842 1843 hash = bat_priv->tt.global_hash; 1844 1845 for (i = 0; i < hash->size; i++) { 1846 head = &hash->table[i]; 1847 list_lock = &hash->list_locks[i]; 1848 1849 spin_lock_bh(list_lock); 1850 hlist_for_each_entry_safe(tt_common_entry, node_tmp, 1851 head, hash_entry) { 1852 hlist_del_rcu(&tt_common_entry->hash_entry); 1853 tt_global = container_of(tt_common_entry, 1854 struct batadv_tt_global_entry, 1855 common); 1856 batadv_tt_global_entry_free_ref(tt_global); 1857 } 1858 spin_unlock_bh(list_lock); 1859 } 1860 1861 batadv_hash_destroy(hash); 1862 1863 bat_priv->tt.global_hash = NULL; 1864 } 1865 1866 static bool 1867 _batadv_is_ap_isolated(struct batadv_tt_local_entry *tt_local_entry, 1868 struct batadv_tt_global_entry *tt_global_entry) 1869 { 1870 bool ret = false; 1871 1872 if (tt_local_entry->common.flags & BATADV_TT_CLIENT_WIFI && 1873 tt_global_entry->common.flags & BATADV_TT_CLIENT_WIFI) 1874 ret = true; 1875 1876 /* check if the two clients are marked as isolated */ 1877 if (tt_local_entry->common.flags & BATADV_TT_CLIENT_ISOLA && 1878 tt_global_entry->common.flags & BATADV_TT_CLIENT_ISOLA) 1879 ret = true; 1880 1881 return ret; 1882 } 1883 1884 /** 1885 * batadv_transtable_search - get the mesh destination for a given client 1886 * @bat_priv: the bat priv with all the soft interface information 1887 * @src: mac address of the source client 1888 * @addr: mac address of the destination client 1889 * @vid: VLAN identifier 1890 * 1891 * Returns a pointer to the originator that was selected as destination in the 1892 * mesh for contacting the client 'addr', NULL otherwise. 1893 * In case of multiple originators serving the same client, the function returns 1894 * the best one (best in terms of metric towards the destination node). 1895 * 1896 * If the two clients are AP isolated the function returns NULL. 1897 */ 1898 struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv, 1899 const uint8_t *src, 1900 const uint8_t *addr, 1901 unsigned short vid) 1902 { 1903 struct batadv_tt_local_entry *tt_local_entry = NULL; 1904 struct batadv_tt_global_entry *tt_global_entry = NULL; 1905 struct batadv_orig_node *orig_node = NULL; 1906 struct batadv_tt_orig_list_entry *best_entry; 1907 1908 if (src && batadv_vlan_ap_isola_get(bat_priv, vid)) { 1909 tt_local_entry = batadv_tt_local_hash_find(bat_priv, src, vid); 1910 if (!tt_local_entry || 1911 (tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING)) 1912 goto out; 1913 } 1914 1915 tt_global_entry = batadv_tt_global_hash_find(bat_priv, addr, vid); 1916 if (!tt_global_entry) 1917 goto out; 1918 1919 /* check whether the clients should not communicate due to AP 1920 * isolation 1921 */ 1922 if (tt_local_entry && 1923 _batadv_is_ap_isolated(tt_local_entry, tt_global_entry)) 1924 goto out; 1925 1926 rcu_read_lock(); 1927 best_entry = batadv_transtable_best_orig(bat_priv, tt_global_entry); 1928 /* found anything? */ 1929 if (best_entry) 1930 orig_node = best_entry->orig_node; 1931 if (orig_node && !atomic_inc_not_zero(&orig_node->refcount)) 1932 orig_node = NULL; 1933 rcu_read_unlock(); 1934 1935 out: 1936 if (tt_global_entry) 1937 batadv_tt_global_entry_free_ref(tt_global_entry); 1938 if (tt_local_entry) 1939 batadv_tt_local_entry_free_ref(tt_local_entry); 1940 1941 return orig_node; 1942 } 1943 1944 /** 1945 * batadv_tt_global_crc - calculates the checksum of the local table belonging 1946 * to the given orig_node 1947 * @bat_priv: the bat priv with all the soft interface information 1948 * @orig_node: originator for which the CRC should be computed 1949 * @vid: VLAN identifier for which the CRC32 has to be computed 1950 * 1951 * This function computes the checksum for the global table corresponding to a 1952 * specific originator. In particular, the checksum is computed as follows: For 1953 * each client connected to the originator the CRC32C of the MAC address and the 1954 * VID is computed and then all the CRC32Cs of the various clients are xor'ed 1955 * together. 1956 * 1957 * The idea behind is that CRC32C should be used as much as possible in order to 1958 * produce a unique hash of the table, but since the order which is used to feed 1959 * the CRC32C function affects the result and since every node in the network 1960 * probably sorts the clients differently, the hash function cannot be directly 1961 * computed over the entire table. Hence the CRC32C is used only on 1962 * the single client entry, while all the results are then xor'ed together 1963 * because the XOR operation can combine them all while trying to reduce the 1964 * noise as much as possible. 1965 * 1966 * Returns the checksum of the global table of a given originator. 1967 */ 1968 static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv, 1969 struct batadv_orig_node *orig_node, 1970 unsigned short vid) 1971 { 1972 struct batadv_hashtable *hash = bat_priv->tt.global_hash; 1973 struct batadv_tt_common_entry *tt_common; 1974 struct batadv_tt_global_entry *tt_global; 1975 struct hlist_head *head; 1976 uint32_t i, crc_tmp, crc = 0; 1977 uint8_t flags; 1978 1979 for (i = 0; i < hash->size; i++) { 1980 head = &hash->table[i]; 1981 1982 rcu_read_lock(); 1983 hlist_for_each_entry_rcu(tt_common, head, hash_entry) { 1984 tt_global = container_of(tt_common, 1985 struct batadv_tt_global_entry, 1986 common); 1987 /* compute the CRC only for entries belonging to the 1988 * VLAN identified by the vid passed as parameter 1989 */ 1990 if (tt_common->vid != vid) 1991 continue; 1992 1993 /* Roaming clients are in the global table for 1994 * consistency only. They don't have to be 1995 * taken into account while computing the 1996 * global crc 1997 */ 1998 if (tt_common->flags & BATADV_TT_CLIENT_ROAM) 1999 continue; 2000 /* Temporary clients have not been announced yet, so 2001 * they have to be skipped while computing the global 2002 * crc 2003 */ 2004 if (tt_common->flags & BATADV_TT_CLIENT_TEMP) 2005 continue; 2006 2007 /* find out if this global entry is announced by this 2008 * originator 2009 */ 2010 if (!batadv_tt_global_entry_has_orig(tt_global, 2011 orig_node)) 2012 continue; 2013 2014 crc_tmp = crc32c(0, &tt_common->vid, 2015 sizeof(tt_common->vid)); 2016 2017 /* compute the CRC on flags that have to be kept in sync 2018 * among nodes 2019 */ 2020 flags = tt_common->flags & BATADV_TT_SYNC_MASK; 2021 crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags)); 2022 2023 crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN); 2024 } 2025 rcu_read_unlock(); 2026 } 2027 2028 return crc; 2029 } 2030 2031 /** 2032 * batadv_tt_local_crc - calculates the checksum of the local table 2033 * @bat_priv: the bat priv with all the soft interface information 2034 * @vid: VLAN identifier for which the CRC32 has to be computed 2035 * 2036 * For details about the computation, please refer to the documentation for 2037 * batadv_tt_global_crc(). 2038 * 2039 * Returns the checksum of the local table 2040 */ 2041 static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv, 2042 unsigned short vid) 2043 { 2044 struct batadv_hashtable *hash = bat_priv->tt.local_hash; 2045 struct batadv_tt_common_entry *tt_common; 2046 struct hlist_head *head; 2047 uint32_t i, crc_tmp, crc = 0; 2048 uint8_t flags; 2049 2050 for (i = 0; i < hash->size; i++) { 2051 head = &hash->table[i]; 2052 2053 rcu_read_lock(); 2054 hlist_for_each_entry_rcu(tt_common, head, hash_entry) { 2055 /* compute the CRC only for entries belonging to the 2056 * VLAN identified by vid 2057 */ 2058 if (tt_common->vid != vid) 2059 continue; 2060 2061 /* not yet committed clients have not to be taken into 2062 * account while computing the CRC 2063 */ 2064 if (tt_common->flags & BATADV_TT_CLIENT_NEW) 2065 continue; 2066 2067 crc_tmp = crc32c(0, &tt_common->vid, 2068 sizeof(tt_common->vid)); 2069 2070 /* compute the CRC on flags that have to be kept in sync 2071 * among nodes 2072 */ 2073 flags = tt_common->flags & BATADV_TT_SYNC_MASK; 2074 crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags)); 2075 2076 crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN); 2077 } 2078 rcu_read_unlock(); 2079 } 2080 2081 return crc; 2082 } 2083 2084 static void batadv_tt_req_list_free(struct batadv_priv *bat_priv) 2085 { 2086 struct batadv_tt_req_node *node, *safe; 2087 2088 spin_lock_bh(&bat_priv->tt.req_list_lock); 2089 2090 list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) { 2091 list_del(&node->list); 2092 kfree(node); 2093 } 2094 2095 spin_unlock_bh(&bat_priv->tt.req_list_lock); 2096 } 2097 2098 static void batadv_tt_save_orig_buffer(struct batadv_priv *bat_priv, 2099 struct batadv_orig_node *orig_node, 2100 const void *tt_buff, 2101 uint16_t tt_buff_len) 2102 { 2103 /* Replace the old buffer only if I received something in the 2104 * last OGM (the OGM could carry no changes) 2105 */ 2106 spin_lock_bh(&orig_node->tt_buff_lock); 2107 if (tt_buff_len > 0) { 2108 kfree(orig_node->tt_buff); 2109 orig_node->tt_buff_len = 0; 2110 orig_node->tt_buff = kmalloc(tt_buff_len, GFP_ATOMIC); 2111 if (orig_node->tt_buff) { 2112 memcpy(orig_node->tt_buff, tt_buff, tt_buff_len); 2113 orig_node->tt_buff_len = tt_buff_len; 2114 } 2115 } 2116 spin_unlock_bh(&orig_node->tt_buff_lock); 2117 } 2118 2119 static void batadv_tt_req_purge(struct batadv_priv *bat_priv) 2120 { 2121 struct batadv_tt_req_node *node, *safe; 2122 2123 spin_lock_bh(&bat_priv->tt.req_list_lock); 2124 list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) { 2125 if (batadv_has_timed_out(node->issued_at, 2126 BATADV_TT_REQUEST_TIMEOUT)) { 2127 list_del(&node->list); 2128 kfree(node); 2129 } 2130 } 2131 spin_unlock_bh(&bat_priv->tt.req_list_lock); 2132 } 2133 2134 /* returns the pointer to the new tt_req_node struct if no request 2135 * has already been issued for this orig_node, NULL otherwise 2136 */ 2137 static struct batadv_tt_req_node * 2138 batadv_new_tt_req_node(struct batadv_priv *bat_priv, 2139 struct batadv_orig_node *orig_node) 2140 { 2141 struct batadv_tt_req_node *tt_req_node_tmp, *tt_req_node = NULL; 2142 2143 spin_lock_bh(&bat_priv->tt.req_list_lock); 2144 list_for_each_entry(tt_req_node_tmp, &bat_priv->tt.req_list, list) { 2145 if (batadv_compare_eth(tt_req_node_tmp, orig_node) && 2146 !batadv_has_timed_out(tt_req_node_tmp->issued_at, 2147 BATADV_TT_REQUEST_TIMEOUT)) 2148 goto unlock; 2149 } 2150 2151 tt_req_node = kmalloc(sizeof(*tt_req_node), GFP_ATOMIC); 2152 if (!tt_req_node) 2153 goto unlock; 2154 2155 memcpy(tt_req_node->addr, orig_node->orig, ETH_ALEN); 2156 tt_req_node->issued_at = jiffies; 2157 2158 list_add(&tt_req_node->list, &bat_priv->tt.req_list); 2159 unlock: 2160 spin_unlock_bh(&bat_priv->tt.req_list_lock); 2161 return tt_req_node; 2162 } 2163 2164 /** 2165 * batadv_tt_local_valid - verify that given tt entry is a valid one 2166 * @entry_ptr: to be checked local tt entry 2167 * @data_ptr: not used but definition required to satisfy the callback prototype 2168 * 2169 * Returns 1 if the entry is a valid, 0 otherwise. 2170 */ 2171 static int batadv_tt_local_valid(const void *entry_ptr, const void *data_ptr) 2172 { 2173 const struct batadv_tt_common_entry *tt_common_entry = entry_ptr; 2174 2175 if (tt_common_entry->flags & BATADV_TT_CLIENT_NEW) 2176 return 0; 2177 return 1; 2178 } 2179 2180 static int batadv_tt_global_valid(const void *entry_ptr, 2181 const void *data_ptr) 2182 { 2183 const struct batadv_tt_common_entry *tt_common_entry = entry_ptr; 2184 const struct batadv_tt_global_entry *tt_global_entry; 2185 const struct batadv_orig_node *orig_node = data_ptr; 2186 2187 if (tt_common_entry->flags & BATADV_TT_CLIENT_ROAM || 2188 tt_common_entry->flags & BATADV_TT_CLIENT_TEMP) 2189 return 0; 2190 2191 tt_global_entry = container_of(tt_common_entry, 2192 struct batadv_tt_global_entry, 2193 common); 2194 2195 return batadv_tt_global_entry_has_orig(tt_global_entry, orig_node); 2196 } 2197 2198 /** 2199 * batadv_tt_tvlv_generate - fill the tvlv buff with the tt entries from the 2200 * specified tt hash 2201 * @bat_priv: the bat priv with all the soft interface information 2202 * @hash: hash table containing the tt entries 2203 * @tt_len: expected tvlv tt data buffer length in number of bytes 2204 * @tvlv_buff: pointer to the buffer to fill with the TT data 2205 * @valid_cb: function to filter tt change entries 2206 * @cb_data: data passed to the filter function as argument 2207 */ 2208 static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv, 2209 struct batadv_hashtable *hash, 2210 void *tvlv_buff, uint16_t tt_len, 2211 int (*valid_cb)(const void *, const void *), 2212 void *cb_data) 2213 { 2214 struct batadv_tt_common_entry *tt_common_entry; 2215 struct batadv_tvlv_tt_change *tt_change; 2216 struct hlist_head *head; 2217 uint16_t tt_tot, tt_num_entries = 0; 2218 uint32_t i; 2219 2220 tt_tot = batadv_tt_entries(tt_len); 2221 tt_change = (struct batadv_tvlv_tt_change *)tvlv_buff; 2222 2223 rcu_read_lock(); 2224 for (i = 0; i < hash->size; i++) { 2225 head = &hash->table[i]; 2226 2227 hlist_for_each_entry_rcu(tt_common_entry, 2228 head, hash_entry) { 2229 if (tt_tot == tt_num_entries) 2230 break; 2231 2232 if ((valid_cb) && (!valid_cb(tt_common_entry, cb_data))) 2233 continue; 2234 2235 memcpy(tt_change->addr, tt_common_entry->addr, 2236 ETH_ALEN); 2237 tt_change->flags = tt_common_entry->flags; 2238 tt_change->vid = htons(tt_common_entry->vid); 2239 memset(tt_change->reserved, 0, 2240 sizeof(tt_change->reserved)); 2241 2242 tt_num_entries++; 2243 tt_change++; 2244 } 2245 } 2246 rcu_read_unlock(); 2247 } 2248 2249 /** 2250 * batadv_tt_global_check_crc - check if all the CRCs are correct 2251 * @orig_node: originator for which the CRCs have to be checked 2252 * @tt_vlan: pointer to the first tvlv VLAN entry 2253 * @num_vlan: number of tvlv VLAN entries 2254 * @create: if true, create VLAN objects if not found 2255 * 2256 * Return true if all the received CRCs match the locally stored ones, false 2257 * otherwise 2258 */ 2259 static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node, 2260 struct batadv_tvlv_tt_vlan_data *tt_vlan, 2261 uint16_t num_vlan) 2262 { 2263 struct batadv_tvlv_tt_vlan_data *tt_vlan_tmp; 2264 struct batadv_orig_node_vlan *vlan; 2265 int i; 2266 2267 /* check if each received CRC matches the locally stored one */ 2268 for (i = 0; i < num_vlan; i++) { 2269 tt_vlan_tmp = tt_vlan + i; 2270 2271 /* if orig_node is a backbone node for this VLAN, don't check 2272 * the CRC as we ignore all the global entries over it 2273 */ 2274 if (batadv_bla_is_backbone_gw_orig(orig_node->bat_priv, 2275 orig_node->orig, 2276 ntohs(tt_vlan_tmp->vid))) 2277 continue; 2278 2279 vlan = batadv_orig_node_vlan_get(orig_node, 2280 ntohs(tt_vlan_tmp->vid)); 2281 if (!vlan) 2282 return false; 2283 2284 if (vlan->tt.crc != ntohl(tt_vlan_tmp->crc)) 2285 return false; 2286 } 2287 2288 return true; 2289 } 2290 2291 /** 2292 * batadv_tt_local_update_crc - update all the local CRCs 2293 * @bat_priv: the bat priv with all the soft interface information 2294 */ 2295 static void batadv_tt_local_update_crc(struct batadv_priv *bat_priv) 2296 { 2297 struct batadv_softif_vlan *vlan; 2298 2299 /* recompute the global CRC for each VLAN */ 2300 rcu_read_lock(); 2301 hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) { 2302 vlan->tt.crc = batadv_tt_local_crc(bat_priv, vlan->vid); 2303 } 2304 rcu_read_unlock(); 2305 } 2306 2307 /** 2308 * batadv_tt_global_update_crc - update all the global CRCs for this orig_node 2309 * @bat_priv: the bat priv with all the soft interface information 2310 * @orig_node: the orig_node for which the CRCs have to be updated 2311 */ 2312 static void batadv_tt_global_update_crc(struct batadv_priv *bat_priv, 2313 struct batadv_orig_node *orig_node) 2314 { 2315 struct batadv_orig_node_vlan *vlan; 2316 uint32_t crc; 2317 2318 /* recompute the global CRC for each VLAN */ 2319 rcu_read_lock(); 2320 list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) { 2321 /* if orig_node is a backbone node for this VLAN, don't compute 2322 * the CRC as we ignore all the global entries over it 2323 */ 2324 if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig, 2325 vlan->vid)) 2326 continue; 2327 2328 crc = batadv_tt_global_crc(bat_priv, orig_node, vlan->vid); 2329 vlan->tt.crc = crc; 2330 } 2331 rcu_read_unlock(); 2332 } 2333 2334 /** 2335 * batadv_send_tt_request - send a TT Request message to a given node 2336 * @bat_priv: the bat priv with all the soft interface information 2337 * @dst_orig_node: the destination of the message 2338 * @ttvn: the version number that the source of the message is looking for 2339 * @tt_vlan: pointer to the first tvlv VLAN object to request 2340 * @num_vlan: number of tvlv VLAN entries 2341 * @full_table: ask for the entire translation table if true, while only for the 2342 * last TT diff otherwise 2343 */ 2344 static int batadv_send_tt_request(struct batadv_priv *bat_priv, 2345 struct batadv_orig_node *dst_orig_node, 2346 uint8_t ttvn, 2347 struct batadv_tvlv_tt_vlan_data *tt_vlan, 2348 uint16_t num_vlan, bool full_table) 2349 { 2350 struct batadv_tvlv_tt_data *tvlv_tt_data = NULL; 2351 struct batadv_tt_req_node *tt_req_node = NULL; 2352 struct batadv_tvlv_tt_vlan_data *tt_vlan_req; 2353 struct batadv_hard_iface *primary_if; 2354 bool ret = false; 2355 int i, size; 2356 2357 primary_if = batadv_primary_if_get_selected(bat_priv); 2358 if (!primary_if) 2359 goto out; 2360 2361 /* The new tt_req will be issued only if I'm not waiting for a 2362 * reply from the same orig_node yet 2363 */ 2364 tt_req_node = batadv_new_tt_req_node(bat_priv, dst_orig_node); 2365 if (!tt_req_node) 2366 goto out; 2367 2368 size = sizeof(*tvlv_tt_data) + sizeof(*tt_vlan_req) * num_vlan; 2369 tvlv_tt_data = kzalloc(size, GFP_ATOMIC); 2370 if (!tvlv_tt_data) 2371 goto out; 2372 2373 tvlv_tt_data->flags = BATADV_TT_REQUEST; 2374 tvlv_tt_data->ttvn = ttvn; 2375 tvlv_tt_data->num_vlan = htons(num_vlan); 2376 2377 /* send all the CRCs within the request. This is needed by intermediate 2378 * nodes to ensure they have the correct table before replying 2379 */ 2380 tt_vlan_req = (struct batadv_tvlv_tt_vlan_data *)(tvlv_tt_data + 1); 2381 for (i = 0; i < num_vlan; i++) { 2382 tt_vlan_req->vid = tt_vlan->vid; 2383 tt_vlan_req->crc = tt_vlan->crc; 2384 2385 tt_vlan_req++; 2386 tt_vlan++; 2387 } 2388 2389 if (full_table) 2390 tvlv_tt_data->flags |= BATADV_TT_FULL_TABLE; 2391 2392 batadv_dbg(BATADV_DBG_TT, bat_priv, "Sending TT_REQUEST to %pM [%c]\n", 2393 dst_orig_node->orig, full_table ? 'F' : '.'); 2394 2395 batadv_inc_counter(bat_priv, BATADV_CNT_TT_REQUEST_TX); 2396 batadv_tvlv_unicast_send(bat_priv, primary_if->net_dev->dev_addr, 2397 dst_orig_node->orig, BATADV_TVLV_TT, 1, 2398 tvlv_tt_data, size); 2399 ret = true; 2400 2401 out: 2402 if (primary_if) 2403 batadv_hardif_free_ref(primary_if); 2404 if (ret && tt_req_node) { 2405 spin_lock_bh(&bat_priv->tt.req_list_lock); 2406 list_del(&tt_req_node->list); 2407 spin_unlock_bh(&bat_priv->tt.req_list_lock); 2408 kfree(tt_req_node); 2409 } 2410 kfree(tvlv_tt_data); 2411 return ret; 2412 } 2413 2414 /** 2415 * batadv_send_other_tt_response - send reply to tt request concerning another 2416 * node's translation table 2417 * @bat_priv: the bat priv with all the soft interface information 2418 * @tt_data: tt data containing the tt request information 2419 * @req_src: mac address of tt request sender 2420 * @req_dst: mac address of tt request recipient 2421 * 2422 * Returns true if tt request reply was sent, false otherwise. 2423 */ 2424 static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv, 2425 struct batadv_tvlv_tt_data *tt_data, 2426 uint8_t *req_src, uint8_t *req_dst) 2427 { 2428 struct batadv_orig_node *req_dst_orig_node; 2429 struct batadv_orig_node *res_dst_orig_node = NULL; 2430 struct batadv_tvlv_tt_change *tt_change; 2431 struct batadv_tvlv_tt_data *tvlv_tt_data = NULL; 2432 struct batadv_tvlv_tt_vlan_data *tt_vlan; 2433 bool ret = false, full_table; 2434 uint8_t orig_ttvn, req_ttvn; 2435 uint16_t tvlv_len; 2436 int32_t tt_len; 2437 2438 batadv_dbg(BATADV_DBG_TT, bat_priv, 2439 "Received TT_REQUEST from %pM for ttvn: %u (%pM) [%c]\n", 2440 req_src, tt_data->ttvn, req_dst, 2441 (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.')); 2442 2443 /* Let's get the orig node of the REAL destination */ 2444 req_dst_orig_node = batadv_orig_hash_find(bat_priv, req_dst); 2445 if (!req_dst_orig_node) 2446 goto out; 2447 2448 res_dst_orig_node = batadv_orig_hash_find(bat_priv, req_src); 2449 if (!res_dst_orig_node) 2450 goto out; 2451 2452 orig_ttvn = (uint8_t)atomic_read(&req_dst_orig_node->last_ttvn); 2453 req_ttvn = tt_data->ttvn; 2454 2455 tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(tt_data + 1); 2456 /* this node doesn't have the requested data */ 2457 if (orig_ttvn != req_ttvn || 2458 !batadv_tt_global_check_crc(req_dst_orig_node, tt_vlan, 2459 ntohs(tt_data->num_vlan))) 2460 goto out; 2461 2462 /* If the full table has been explicitly requested */ 2463 if (tt_data->flags & BATADV_TT_FULL_TABLE || 2464 !req_dst_orig_node->tt_buff) 2465 full_table = true; 2466 else 2467 full_table = false; 2468 2469 /* TT fragmentation hasn't been implemented yet, so send as many 2470 * TT entries fit a single packet as possible only 2471 */ 2472 if (!full_table) { 2473 spin_lock_bh(&req_dst_orig_node->tt_buff_lock); 2474 tt_len = req_dst_orig_node->tt_buff_len; 2475 2476 tvlv_len = batadv_tt_prepare_tvlv_global_data(req_dst_orig_node, 2477 &tvlv_tt_data, 2478 &tt_change, 2479 &tt_len); 2480 if (!tt_len) 2481 goto unlock; 2482 2483 /* Copy the last orig_node's OGM buffer */ 2484 memcpy(tt_change, req_dst_orig_node->tt_buff, 2485 req_dst_orig_node->tt_buff_len); 2486 spin_unlock_bh(&req_dst_orig_node->tt_buff_lock); 2487 } else { 2488 /* allocate the tvlv, put the tt_data and all the tt_vlan_data 2489 * in the initial part 2490 */ 2491 tt_len = -1; 2492 tvlv_len = batadv_tt_prepare_tvlv_global_data(req_dst_orig_node, 2493 &tvlv_tt_data, 2494 &tt_change, 2495 &tt_len); 2496 if (!tt_len) 2497 goto out; 2498 2499 /* fill the rest of the tvlv with the real TT entries */ 2500 batadv_tt_tvlv_generate(bat_priv, bat_priv->tt.global_hash, 2501 tt_change, tt_len, 2502 batadv_tt_global_valid, 2503 req_dst_orig_node); 2504 } 2505 2506 /* Don't send the response, if larger than fragmented packet. */ 2507 tt_len = sizeof(struct batadv_unicast_tvlv_packet) + tvlv_len; 2508 if (tt_len > atomic_read(&bat_priv->packet_size_max)) { 2509 net_ratelimited_function(batadv_info, bat_priv->soft_iface, 2510 "Ignoring TT_REQUEST from %pM; Response size exceeds max packet size.\n", 2511 res_dst_orig_node->orig); 2512 goto out; 2513 } 2514 2515 tvlv_tt_data->flags = BATADV_TT_RESPONSE; 2516 tvlv_tt_data->ttvn = req_ttvn; 2517 2518 if (full_table) 2519 tvlv_tt_data->flags |= BATADV_TT_FULL_TABLE; 2520 2521 batadv_dbg(BATADV_DBG_TT, bat_priv, 2522 "Sending TT_RESPONSE %pM for %pM [%c] (ttvn: %u)\n", 2523 res_dst_orig_node->orig, req_dst_orig_node->orig, 2524 full_table ? 'F' : '.', req_ttvn); 2525 2526 batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_TX); 2527 2528 batadv_tvlv_unicast_send(bat_priv, req_dst_orig_node->orig, 2529 req_src, BATADV_TVLV_TT, 1, tvlv_tt_data, 2530 tvlv_len); 2531 2532 ret = true; 2533 goto out; 2534 2535 unlock: 2536 spin_unlock_bh(&req_dst_orig_node->tt_buff_lock); 2537 2538 out: 2539 if (res_dst_orig_node) 2540 batadv_orig_node_free_ref(res_dst_orig_node); 2541 if (req_dst_orig_node) 2542 batadv_orig_node_free_ref(req_dst_orig_node); 2543 kfree(tvlv_tt_data); 2544 return ret; 2545 } 2546 2547 /** 2548 * batadv_send_my_tt_response - send reply to tt request concerning this node's 2549 * translation table 2550 * @bat_priv: the bat priv with all the soft interface information 2551 * @tt_data: tt data containing the tt request information 2552 * @req_src: mac address of tt request sender 2553 * 2554 * Returns true if tt request reply was sent, false otherwise. 2555 */ 2556 static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv, 2557 struct batadv_tvlv_tt_data *tt_data, 2558 uint8_t *req_src) 2559 { 2560 struct batadv_tvlv_tt_data *tvlv_tt_data = NULL; 2561 struct batadv_hard_iface *primary_if = NULL; 2562 struct batadv_tvlv_tt_change *tt_change; 2563 struct batadv_orig_node *orig_node; 2564 uint8_t my_ttvn, req_ttvn; 2565 uint16_t tvlv_len; 2566 bool full_table; 2567 int32_t tt_len; 2568 2569 batadv_dbg(BATADV_DBG_TT, bat_priv, 2570 "Received TT_REQUEST from %pM for ttvn: %u (me) [%c]\n", 2571 req_src, tt_data->ttvn, 2572 (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.')); 2573 2574 spin_lock_bh(&bat_priv->tt.commit_lock); 2575 2576 my_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn); 2577 req_ttvn = tt_data->ttvn; 2578 2579 orig_node = batadv_orig_hash_find(bat_priv, req_src); 2580 if (!orig_node) 2581 goto out; 2582 2583 primary_if = batadv_primary_if_get_selected(bat_priv); 2584 if (!primary_if) 2585 goto out; 2586 2587 /* If the full table has been explicitly requested or the gap 2588 * is too big send the whole local translation table 2589 */ 2590 if (tt_data->flags & BATADV_TT_FULL_TABLE || my_ttvn != req_ttvn || 2591 !bat_priv->tt.last_changeset) 2592 full_table = true; 2593 else 2594 full_table = false; 2595 2596 /* TT fragmentation hasn't been implemented yet, so send as many 2597 * TT entries fit a single packet as possible only 2598 */ 2599 if (!full_table) { 2600 spin_lock_bh(&bat_priv->tt.last_changeset_lock); 2601 2602 tt_len = bat_priv->tt.last_changeset_len; 2603 tvlv_len = batadv_tt_prepare_tvlv_local_data(bat_priv, 2604 &tvlv_tt_data, 2605 &tt_change, 2606 &tt_len); 2607 if (!tt_len) 2608 goto unlock; 2609 2610 /* Copy the last orig_node's OGM buffer */ 2611 memcpy(tt_change, bat_priv->tt.last_changeset, 2612 bat_priv->tt.last_changeset_len); 2613 spin_unlock_bh(&bat_priv->tt.last_changeset_lock); 2614 } else { 2615 req_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn); 2616 2617 /* allocate the tvlv, put the tt_data and all the tt_vlan_data 2618 * in the initial part 2619 */ 2620 tt_len = -1; 2621 tvlv_len = batadv_tt_prepare_tvlv_local_data(bat_priv, 2622 &tvlv_tt_data, 2623 &tt_change, 2624 &tt_len); 2625 if (!tt_len) 2626 goto out; 2627 2628 /* fill the rest of the tvlv with the real TT entries */ 2629 batadv_tt_tvlv_generate(bat_priv, bat_priv->tt.local_hash, 2630 tt_change, tt_len, 2631 batadv_tt_local_valid, NULL); 2632 } 2633 2634 tvlv_tt_data->flags = BATADV_TT_RESPONSE; 2635 tvlv_tt_data->ttvn = req_ttvn; 2636 2637 if (full_table) 2638 tvlv_tt_data->flags |= BATADV_TT_FULL_TABLE; 2639 2640 batadv_dbg(BATADV_DBG_TT, bat_priv, 2641 "Sending TT_RESPONSE to %pM [%c] (ttvn: %u)\n", 2642 orig_node->orig, full_table ? 'F' : '.', req_ttvn); 2643 2644 batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_TX); 2645 2646 batadv_tvlv_unicast_send(bat_priv, primary_if->net_dev->dev_addr, 2647 req_src, BATADV_TVLV_TT, 1, tvlv_tt_data, 2648 tvlv_len); 2649 2650 goto out; 2651 2652 unlock: 2653 spin_unlock_bh(&bat_priv->tt.last_changeset_lock); 2654 out: 2655 spin_unlock_bh(&bat_priv->tt.commit_lock); 2656 if (orig_node) 2657 batadv_orig_node_free_ref(orig_node); 2658 if (primary_if) 2659 batadv_hardif_free_ref(primary_if); 2660 kfree(tvlv_tt_data); 2661 /* The packet was for this host, so it doesn't need to be re-routed */ 2662 return true; 2663 } 2664 2665 /** 2666 * batadv_send_tt_response - send reply to tt request 2667 * @bat_priv: the bat priv with all the soft interface information 2668 * @tt_data: tt data containing the tt request information 2669 * @req_src: mac address of tt request sender 2670 * @req_dst: mac address of tt request recipient 2671 * 2672 * Returns true if tt request reply was sent, false otherwise. 2673 */ 2674 static bool batadv_send_tt_response(struct batadv_priv *bat_priv, 2675 struct batadv_tvlv_tt_data *tt_data, 2676 uint8_t *req_src, uint8_t *req_dst) 2677 { 2678 if (batadv_is_my_mac(bat_priv, req_dst)) 2679 return batadv_send_my_tt_response(bat_priv, tt_data, req_src); 2680 else 2681 return batadv_send_other_tt_response(bat_priv, tt_data, 2682 req_src, req_dst); 2683 } 2684 2685 static void _batadv_tt_update_changes(struct batadv_priv *bat_priv, 2686 struct batadv_orig_node *orig_node, 2687 struct batadv_tvlv_tt_change *tt_change, 2688 uint16_t tt_num_changes, uint8_t ttvn) 2689 { 2690 int i; 2691 int roams; 2692 2693 for (i = 0; i < tt_num_changes; i++) { 2694 if ((tt_change + i)->flags & BATADV_TT_CLIENT_DEL) { 2695 roams = (tt_change + i)->flags & BATADV_TT_CLIENT_ROAM; 2696 batadv_tt_global_del(bat_priv, orig_node, 2697 (tt_change + i)->addr, 2698 ntohs((tt_change + i)->vid), 2699 "tt removed by changes", 2700 roams); 2701 } else { 2702 if (!batadv_tt_global_add(bat_priv, orig_node, 2703 (tt_change + i)->addr, 2704 ntohs((tt_change + i)->vid), 2705 (tt_change + i)->flags, ttvn)) 2706 /* In case of problem while storing a 2707 * global_entry, we stop the updating 2708 * procedure without committing the 2709 * ttvn change. This will avoid to send 2710 * corrupted data on tt_request 2711 */ 2712 return; 2713 } 2714 } 2715 orig_node->tt_initialised = true; 2716 } 2717 2718 static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv, 2719 struct batadv_tvlv_tt_change *tt_change, 2720 uint8_t ttvn, uint8_t *resp_src, 2721 uint16_t num_entries) 2722 { 2723 struct batadv_orig_node *orig_node; 2724 2725 orig_node = batadv_orig_hash_find(bat_priv, resp_src); 2726 if (!orig_node) 2727 goto out; 2728 2729 /* Purge the old table first.. */ 2730 batadv_tt_global_del_orig(bat_priv, orig_node, -1, 2731 "Received full table"); 2732 2733 _batadv_tt_update_changes(bat_priv, orig_node, tt_change, num_entries, 2734 ttvn); 2735 2736 spin_lock_bh(&orig_node->tt_buff_lock); 2737 kfree(orig_node->tt_buff); 2738 orig_node->tt_buff_len = 0; 2739 orig_node->tt_buff = NULL; 2740 spin_unlock_bh(&orig_node->tt_buff_lock); 2741 2742 atomic_set(&orig_node->last_ttvn, ttvn); 2743 2744 out: 2745 if (orig_node) 2746 batadv_orig_node_free_ref(orig_node); 2747 } 2748 2749 static void batadv_tt_update_changes(struct batadv_priv *bat_priv, 2750 struct batadv_orig_node *orig_node, 2751 uint16_t tt_num_changes, uint8_t ttvn, 2752 struct batadv_tvlv_tt_change *tt_change) 2753 { 2754 _batadv_tt_update_changes(bat_priv, orig_node, tt_change, 2755 tt_num_changes, ttvn); 2756 2757 batadv_tt_save_orig_buffer(bat_priv, orig_node, tt_change, 2758 batadv_tt_len(tt_num_changes)); 2759 atomic_set(&orig_node->last_ttvn, ttvn); 2760 } 2761 2762 /** 2763 * batadv_is_my_client - check if a client is served by the local node 2764 * @bat_priv: the bat priv with all the soft interface information 2765 * @addr: the mac adress of the client to check 2766 * @vid: VLAN identifier 2767 * 2768 * Returns true if the client is served by this node, false otherwise. 2769 */ 2770 bool batadv_is_my_client(struct batadv_priv *bat_priv, const uint8_t *addr, 2771 unsigned short vid) 2772 { 2773 struct batadv_tt_local_entry *tt_local_entry; 2774 bool ret = false; 2775 2776 tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid); 2777 if (!tt_local_entry) 2778 goto out; 2779 /* Check if the client has been logically deleted (but is kept for 2780 * consistency purpose) 2781 */ 2782 if ((tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING) || 2783 (tt_local_entry->common.flags & BATADV_TT_CLIENT_ROAM)) 2784 goto out; 2785 ret = true; 2786 out: 2787 if (tt_local_entry) 2788 batadv_tt_local_entry_free_ref(tt_local_entry); 2789 return ret; 2790 } 2791 2792 /** 2793 * batadv_handle_tt_response - process incoming tt reply 2794 * @bat_priv: the bat priv with all the soft interface information 2795 * @tt_data: tt data containing the tt request information 2796 * @resp_src: mac address of tt reply sender 2797 * @num_entries: number of tt change entries appended to the tt data 2798 */ 2799 static void batadv_handle_tt_response(struct batadv_priv *bat_priv, 2800 struct batadv_tvlv_tt_data *tt_data, 2801 uint8_t *resp_src, uint16_t num_entries) 2802 { 2803 struct batadv_tt_req_node *node, *safe; 2804 struct batadv_orig_node *orig_node = NULL; 2805 struct batadv_tvlv_tt_change *tt_change; 2806 uint8_t *tvlv_ptr = (uint8_t *)tt_data; 2807 uint16_t change_offset; 2808 2809 batadv_dbg(BATADV_DBG_TT, bat_priv, 2810 "Received TT_RESPONSE from %pM for ttvn %d t_size: %d [%c]\n", 2811 resp_src, tt_data->ttvn, num_entries, 2812 (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.')); 2813 2814 orig_node = batadv_orig_hash_find(bat_priv, resp_src); 2815 if (!orig_node) 2816 goto out; 2817 2818 spin_lock_bh(&orig_node->tt_lock); 2819 2820 change_offset = sizeof(struct batadv_tvlv_tt_vlan_data); 2821 change_offset *= ntohs(tt_data->num_vlan); 2822 change_offset += sizeof(*tt_data); 2823 tvlv_ptr += change_offset; 2824 2825 tt_change = (struct batadv_tvlv_tt_change *)tvlv_ptr; 2826 if (tt_data->flags & BATADV_TT_FULL_TABLE) { 2827 batadv_tt_fill_gtable(bat_priv, tt_change, tt_data->ttvn, 2828 resp_src, num_entries); 2829 } else { 2830 batadv_tt_update_changes(bat_priv, orig_node, num_entries, 2831 tt_data->ttvn, tt_change); 2832 } 2833 2834 /* Recalculate the CRC for this orig_node and store it */ 2835 batadv_tt_global_update_crc(bat_priv, orig_node); 2836 2837 spin_unlock_bh(&orig_node->tt_lock); 2838 2839 /* Delete the tt_req_node from pending tt_requests list */ 2840 spin_lock_bh(&bat_priv->tt.req_list_lock); 2841 list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) { 2842 if (!batadv_compare_eth(node->addr, resp_src)) 2843 continue; 2844 list_del(&node->list); 2845 kfree(node); 2846 } 2847 2848 spin_unlock_bh(&bat_priv->tt.req_list_lock); 2849 out: 2850 if (orig_node) 2851 batadv_orig_node_free_ref(orig_node); 2852 } 2853 2854 static void batadv_tt_roam_list_free(struct batadv_priv *bat_priv) 2855 { 2856 struct batadv_tt_roam_node *node, *safe; 2857 2858 spin_lock_bh(&bat_priv->tt.roam_list_lock); 2859 2860 list_for_each_entry_safe(node, safe, &bat_priv->tt.roam_list, list) { 2861 list_del(&node->list); 2862 kfree(node); 2863 } 2864 2865 spin_unlock_bh(&bat_priv->tt.roam_list_lock); 2866 } 2867 2868 static void batadv_tt_roam_purge(struct batadv_priv *bat_priv) 2869 { 2870 struct batadv_tt_roam_node *node, *safe; 2871 2872 spin_lock_bh(&bat_priv->tt.roam_list_lock); 2873 list_for_each_entry_safe(node, safe, &bat_priv->tt.roam_list, list) { 2874 if (!batadv_has_timed_out(node->first_time, 2875 BATADV_ROAMING_MAX_TIME)) 2876 continue; 2877 2878 list_del(&node->list); 2879 kfree(node); 2880 } 2881 spin_unlock_bh(&bat_priv->tt.roam_list_lock); 2882 } 2883 2884 /* This function checks whether the client already reached the 2885 * maximum number of possible roaming phases. In this case the ROAMING_ADV 2886 * will not be sent. 2887 * 2888 * returns true if the ROAMING_ADV can be sent, false otherwise 2889 */ 2890 static bool batadv_tt_check_roam_count(struct batadv_priv *bat_priv, 2891 uint8_t *client) 2892 { 2893 struct batadv_tt_roam_node *tt_roam_node; 2894 bool ret = false; 2895 2896 spin_lock_bh(&bat_priv->tt.roam_list_lock); 2897 /* The new tt_req will be issued only if I'm not waiting for a 2898 * reply from the same orig_node yet 2899 */ 2900 list_for_each_entry(tt_roam_node, &bat_priv->tt.roam_list, list) { 2901 if (!batadv_compare_eth(tt_roam_node->addr, client)) 2902 continue; 2903 2904 if (batadv_has_timed_out(tt_roam_node->first_time, 2905 BATADV_ROAMING_MAX_TIME)) 2906 continue; 2907 2908 if (!batadv_atomic_dec_not_zero(&tt_roam_node->counter)) 2909 /* Sorry, you roamed too many times! */ 2910 goto unlock; 2911 ret = true; 2912 break; 2913 } 2914 2915 if (!ret) { 2916 tt_roam_node = kmalloc(sizeof(*tt_roam_node), GFP_ATOMIC); 2917 if (!tt_roam_node) 2918 goto unlock; 2919 2920 tt_roam_node->first_time = jiffies; 2921 atomic_set(&tt_roam_node->counter, 2922 BATADV_ROAMING_MAX_COUNT - 1); 2923 memcpy(tt_roam_node->addr, client, ETH_ALEN); 2924 2925 list_add(&tt_roam_node->list, &bat_priv->tt.roam_list); 2926 ret = true; 2927 } 2928 2929 unlock: 2930 spin_unlock_bh(&bat_priv->tt.roam_list_lock); 2931 return ret; 2932 } 2933 2934 /** 2935 * batadv_send_roam_adv - send a roaming advertisement message 2936 * @bat_priv: the bat priv with all the soft interface information 2937 * @client: mac address of the roaming client 2938 * @vid: VLAN identifier 2939 * @orig_node: message destination 2940 * 2941 * Send a ROAMING_ADV message to the node which was previously serving this 2942 * client. This is done to inform the node that from now on all traffic destined 2943 * for this particular roamed client has to be forwarded to the sender of the 2944 * roaming message. 2945 */ 2946 static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client, 2947 unsigned short vid, 2948 struct batadv_orig_node *orig_node) 2949 { 2950 struct batadv_hard_iface *primary_if; 2951 struct batadv_tvlv_roam_adv tvlv_roam; 2952 2953 primary_if = batadv_primary_if_get_selected(bat_priv); 2954 if (!primary_if) 2955 goto out; 2956 2957 /* before going on we have to check whether the client has 2958 * already roamed to us too many times 2959 */ 2960 if (!batadv_tt_check_roam_count(bat_priv, client)) 2961 goto out; 2962 2963 batadv_dbg(BATADV_DBG_TT, bat_priv, 2964 "Sending ROAMING_ADV to %pM (client %pM, vid: %d)\n", 2965 orig_node->orig, client, BATADV_PRINT_VID(vid)); 2966 2967 batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_TX); 2968 2969 memcpy(tvlv_roam.client, client, sizeof(tvlv_roam.client)); 2970 tvlv_roam.vid = htons(vid); 2971 2972 batadv_tvlv_unicast_send(bat_priv, primary_if->net_dev->dev_addr, 2973 orig_node->orig, BATADV_TVLV_ROAM, 1, 2974 &tvlv_roam, sizeof(tvlv_roam)); 2975 2976 out: 2977 if (primary_if) 2978 batadv_hardif_free_ref(primary_if); 2979 } 2980 2981 static void batadv_tt_purge(struct work_struct *work) 2982 { 2983 struct delayed_work *delayed_work; 2984 struct batadv_priv_tt *priv_tt; 2985 struct batadv_priv *bat_priv; 2986 2987 delayed_work = container_of(work, struct delayed_work, work); 2988 priv_tt = container_of(delayed_work, struct batadv_priv_tt, work); 2989 bat_priv = container_of(priv_tt, struct batadv_priv, tt); 2990 2991 batadv_tt_local_purge(bat_priv, BATADV_TT_LOCAL_TIMEOUT); 2992 batadv_tt_global_purge(bat_priv); 2993 batadv_tt_req_purge(bat_priv); 2994 batadv_tt_roam_purge(bat_priv); 2995 2996 queue_delayed_work(batadv_event_workqueue, &bat_priv->tt.work, 2997 msecs_to_jiffies(BATADV_TT_WORK_PERIOD)); 2998 } 2999 3000 void batadv_tt_free(struct batadv_priv *bat_priv) 3001 { 3002 batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_TT, 1); 3003 batadv_tvlv_handler_unregister(bat_priv, BATADV_TVLV_TT, 1); 3004 3005 cancel_delayed_work_sync(&bat_priv->tt.work); 3006 3007 batadv_tt_local_table_free(bat_priv); 3008 batadv_tt_global_table_free(bat_priv); 3009 batadv_tt_req_list_free(bat_priv); 3010 batadv_tt_changes_list_free(bat_priv); 3011 batadv_tt_roam_list_free(bat_priv); 3012 3013 kfree(bat_priv->tt.last_changeset); 3014 } 3015 3016 /** 3017 * batadv_tt_local_set_flags - set or unset the specified flags on the local 3018 * table and possibly count them in the TT size 3019 * @bat_priv: the bat priv with all the soft interface information 3020 * @flags: the flag to switch 3021 * @enable: whether to set or unset the flag 3022 * @count: whether to increase the TT size by the number of changed entries 3023 */ 3024 static void batadv_tt_local_set_flags(struct batadv_priv *bat_priv, 3025 uint16_t flags, bool enable, bool count) 3026 { 3027 struct batadv_hashtable *hash = bat_priv->tt.local_hash; 3028 struct batadv_tt_common_entry *tt_common_entry; 3029 uint16_t changed_num = 0; 3030 struct hlist_head *head; 3031 uint32_t i; 3032 3033 if (!hash) 3034 return; 3035 3036 for (i = 0; i < hash->size; i++) { 3037 head = &hash->table[i]; 3038 3039 rcu_read_lock(); 3040 hlist_for_each_entry_rcu(tt_common_entry, 3041 head, hash_entry) { 3042 if (enable) { 3043 if ((tt_common_entry->flags & flags) == flags) 3044 continue; 3045 tt_common_entry->flags |= flags; 3046 } else { 3047 if (!(tt_common_entry->flags & flags)) 3048 continue; 3049 tt_common_entry->flags &= ~flags; 3050 } 3051 changed_num++; 3052 3053 if (!count) 3054 continue; 3055 3056 batadv_tt_local_size_inc(bat_priv, 3057 tt_common_entry->vid); 3058 } 3059 rcu_read_unlock(); 3060 } 3061 } 3062 3063 /* Purge out all the tt local entries marked with BATADV_TT_CLIENT_PENDING */ 3064 static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv) 3065 { 3066 struct batadv_hashtable *hash = bat_priv->tt.local_hash; 3067 struct batadv_tt_common_entry *tt_common; 3068 struct batadv_tt_local_entry *tt_local; 3069 struct hlist_node *node_tmp; 3070 struct hlist_head *head; 3071 spinlock_t *list_lock; /* protects write access to the hash lists */ 3072 uint32_t i; 3073 3074 if (!hash) 3075 return; 3076 3077 for (i = 0; i < hash->size; i++) { 3078 head = &hash->table[i]; 3079 list_lock = &hash->list_locks[i]; 3080 3081 spin_lock_bh(list_lock); 3082 hlist_for_each_entry_safe(tt_common, node_tmp, head, 3083 hash_entry) { 3084 if (!(tt_common->flags & BATADV_TT_CLIENT_PENDING)) 3085 continue; 3086 3087 batadv_dbg(BATADV_DBG_TT, bat_priv, 3088 "Deleting local tt entry (%pM, vid: %d): pending\n", 3089 tt_common->addr, 3090 BATADV_PRINT_VID(tt_common->vid)); 3091 3092 batadv_tt_local_size_dec(bat_priv, tt_common->vid); 3093 hlist_del_rcu(&tt_common->hash_entry); 3094 tt_local = container_of(tt_common, 3095 struct batadv_tt_local_entry, 3096 common); 3097 batadv_tt_local_entry_free_ref(tt_local); 3098 } 3099 spin_unlock_bh(list_lock); 3100 } 3101 } 3102 3103 /** 3104 * batadv_tt_local_commit_changes_nolock - commit all pending local tt changes 3105 * which have been queued in the time since the last commit 3106 * @bat_priv: the bat priv with all the soft interface information 3107 * 3108 * Caller must hold tt->commit_lock. 3109 */ 3110 static void batadv_tt_local_commit_changes_nolock(struct batadv_priv *bat_priv) 3111 { 3112 if (atomic_read(&bat_priv->tt.local_changes) < 1) { 3113 if (!batadv_atomic_dec_not_zero(&bat_priv->tt.ogm_append_cnt)) 3114 batadv_tt_tvlv_container_update(bat_priv); 3115 return; 3116 } 3117 3118 batadv_tt_local_set_flags(bat_priv, BATADV_TT_CLIENT_NEW, false, true); 3119 3120 batadv_tt_local_purge_pending_clients(bat_priv); 3121 batadv_tt_local_update_crc(bat_priv); 3122 3123 /* Increment the TTVN only once per OGM interval */ 3124 atomic_inc(&bat_priv->tt.vn); 3125 batadv_dbg(BATADV_DBG_TT, bat_priv, 3126 "Local changes committed, updating to ttvn %u\n", 3127 (uint8_t)atomic_read(&bat_priv->tt.vn)); 3128 3129 /* reset the sending counter */ 3130 atomic_set(&bat_priv->tt.ogm_append_cnt, BATADV_TT_OGM_APPEND_MAX); 3131 batadv_tt_tvlv_container_update(bat_priv); 3132 } 3133 3134 /** 3135 * batadv_tt_local_commit_changes - commit all pending local tt changes which 3136 * have been queued in the time since the last commit 3137 * @bat_priv: the bat priv with all the soft interface information 3138 */ 3139 void batadv_tt_local_commit_changes(struct batadv_priv *bat_priv) 3140 { 3141 spin_lock_bh(&bat_priv->tt.commit_lock); 3142 batadv_tt_local_commit_changes_nolock(bat_priv); 3143 spin_unlock_bh(&bat_priv->tt.commit_lock); 3144 } 3145 3146 bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, uint8_t *src, 3147 uint8_t *dst, unsigned short vid) 3148 { 3149 struct batadv_tt_local_entry *tt_local_entry = NULL; 3150 struct batadv_tt_global_entry *tt_global_entry = NULL; 3151 struct batadv_softif_vlan *vlan; 3152 bool ret = false; 3153 3154 vlan = batadv_softif_vlan_get(bat_priv, vid); 3155 if (!vlan || !atomic_read(&vlan->ap_isolation)) 3156 goto out; 3157 3158 tt_local_entry = batadv_tt_local_hash_find(bat_priv, dst, vid); 3159 if (!tt_local_entry) 3160 goto out; 3161 3162 tt_global_entry = batadv_tt_global_hash_find(bat_priv, src, vid); 3163 if (!tt_global_entry) 3164 goto out; 3165 3166 if (!_batadv_is_ap_isolated(tt_local_entry, tt_global_entry)) 3167 goto out; 3168 3169 ret = true; 3170 3171 out: 3172 if (vlan) 3173 batadv_softif_vlan_free_ref(vlan); 3174 if (tt_global_entry) 3175 batadv_tt_global_entry_free_ref(tt_global_entry); 3176 if (tt_local_entry) 3177 batadv_tt_local_entry_free_ref(tt_local_entry); 3178 return ret; 3179 } 3180 3181 /** 3182 * batadv_tt_update_orig - update global translation table with new tt 3183 * information received via ogms 3184 * @bat_priv: the bat priv with all the soft interface information 3185 * @orig: the orig_node of the ogm 3186 * @tt_vlan: pointer to the first tvlv VLAN entry 3187 * @tt_num_vlan: number of tvlv VLAN entries 3188 * @tt_change: pointer to the first entry in the TT buffer 3189 * @tt_num_changes: number of tt changes inside the tt buffer 3190 * @ttvn: translation table version number of this changeset 3191 * @tt_crc: crc32 checksum of orig node's translation table 3192 */ 3193 static void batadv_tt_update_orig(struct batadv_priv *bat_priv, 3194 struct batadv_orig_node *orig_node, 3195 const void *tt_buff, uint16_t tt_num_vlan, 3196 struct batadv_tvlv_tt_change *tt_change, 3197 uint16_t tt_num_changes, uint8_t ttvn) 3198 { 3199 uint8_t orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn); 3200 struct batadv_tvlv_tt_vlan_data *tt_vlan; 3201 bool full_table = true; 3202 3203 tt_vlan = (struct batadv_tvlv_tt_vlan_data *)tt_buff; 3204 /* orig table not initialised AND first diff is in the OGM OR the ttvn 3205 * increased by one -> we can apply the attached changes 3206 */ 3207 if ((!orig_node->tt_initialised && ttvn == 1) || 3208 ttvn - orig_ttvn == 1) { 3209 /* the OGM could not contain the changes due to their size or 3210 * because they have already been sent BATADV_TT_OGM_APPEND_MAX 3211 * times. 3212 * In this case send a tt request 3213 */ 3214 if (!tt_num_changes) { 3215 full_table = false; 3216 goto request_table; 3217 } 3218 3219 spin_lock_bh(&orig_node->tt_lock); 3220 3221 tt_change = (struct batadv_tvlv_tt_change *)tt_buff; 3222 batadv_tt_update_changes(bat_priv, orig_node, tt_num_changes, 3223 ttvn, tt_change); 3224 3225 /* Even if we received the precomputed crc with the OGM, we 3226 * prefer to recompute it to spot any possible inconsistency 3227 * in the global table 3228 */ 3229 batadv_tt_global_update_crc(bat_priv, orig_node); 3230 3231 spin_unlock_bh(&orig_node->tt_lock); 3232 3233 /* The ttvn alone is not enough to guarantee consistency 3234 * because a single value could represent different states 3235 * (due to the wrap around). Thus a node has to check whether 3236 * the resulting table (after applying the changes) is still 3237 * consistent or not. E.g. a node could disconnect while its 3238 * ttvn is X and reconnect on ttvn = X + TTVN_MAX: in this case 3239 * checking the CRC value is mandatory to detect the 3240 * inconsistency 3241 */ 3242 if (!batadv_tt_global_check_crc(orig_node, tt_vlan, 3243 tt_num_vlan)) 3244 goto request_table; 3245 } else { 3246 /* if we missed more than one change or our tables are not 3247 * in sync anymore -> request fresh tt data 3248 */ 3249 if (!orig_node->tt_initialised || ttvn != orig_ttvn || 3250 !batadv_tt_global_check_crc(orig_node, tt_vlan, 3251 tt_num_vlan)) { 3252 request_table: 3253 batadv_dbg(BATADV_DBG_TT, bat_priv, 3254 "TT inconsistency for %pM. Need to retrieve the correct information (ttvn: %u last_ttvn: %u num_changes: %u)\n", 3255 orig_node->orig, ttvn, orig_ttvn, 3256 tt_num_changes); 3257 batadv_send_tt_request(bat_priv, orig_node, ttvn, 3258 tt_vlan, tt_num_vlan, 3259 full_table); 3260 return; 3261 } 3262 } 3263 } 3264 3265 /** 3266 * batadv_tt_global_client_is_roaming - check if a client is marked as roaming 3267 * @bat_priv: the bat priv with all the soft interface information 3268 * @addr: the mac address of the client to check 3269 * @vid: VLAN identifier 3270 * 3271 * Returns true if we know that the client has moved from its old originator 3272 * to another one. This entry is still kept for consistency purposes and will be 3273 * deleted later by a DEL or because of timeout 3274 */ 3275 bool batadv_tt_global_client_is_roaming(struct batadv_priv *bat_priv, 3276 uint8_t *addr, unsigned short vid) 3277 { 3278 struct batadv_tt_global_entry *tt_global_entry; 3279 bool ret = false; 3280 3281 tt_global_entry = batadv_tt_global_hash_find(bat_priv, addr, vid); 3282 if (!tt_global_entry) 3283 goto out; 3284 3285 ret = tt_global_entry->common.flags & BATADV_TT_CLIENT_ROAM; 3286 batadv_tt_global_entry_free_ref(tt_global_entry); 3287 out: 3288 return ret; 3289 } 3290 3291 /** 3292 * batadv_tt_local_client_is_roaming - tells whether the client is roaming 3293 * @bat_priv: the bat priv with all the soft interface information 3294 * @addr: the mac address of the local client to query 3295 * @vid: VLAN identifier 3296 * 3297 * Returns true if the local client is known to be roaming (it is not served by 3298 * this node anymore) or not. If yes, the client is still present in the table 3299 * to keep the latter consistent with the node TTVN 3300 */ 3301 bool batadv_tt_local_client_is_roaming(struct batadv_priv *bat_priv, 3302 uint8_t *addr, unsigned short vid) 3303 { 3304 struct batadv_tt_local_entry *tt_local_entry; 3305 bool ret = false; 3306 3307 tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid); 3308 if (!tt_local_entry) 3309 goto out; 3310 3311 ret = tt_local_entry->common.flags & BATADV_TT_CLIENT_ROAM; 3312 batadv_tt_local_entry_free_ref(tt_local_entry); 3313 out: 3314 return ret; 3315 } 3316 3317 bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv, 3318 struct batadv_orig_node *orig_node, 3319 const unsigned char *addr, 3320 unsigned short vid) 3321 { 3322 bool ret = false; 3323 3324 if (!batadv_tt_global_add(bat_priv, orig_node, addr, vid, 3325 BATADV_TT_CLIENT_TEMP, 3326 atomic_read(&orig_node->last_ttvn))) 3327 goto out; 3328 3329 batadv_dbg(BATADV_DBG_TT, bat_priv, 3330 "Added temporary global client (addr: %pM, vid: %d, orig: %pM)\n", 3331 addr, BATADV_PRINT_VID(vid), orig_node->orig); 3332 ret = true; 3333 out: 3334 return ret; 3335 } 3336 3337 /** 3338 * batadv_tt_local_resize_to_mtu - resize the local translation table fit the 3339 * maximum packet size that can be transported through the mesh 3340 * @soft_iface: netdev struct of the mesh interface 3341 * 3342 * Remove entries older than 'timeout' and half timeout if more entries need 3343 * to be removed. 3344 */ 3345 void batadv_tt_local_resize_to_mtu(struct net_device *soft_iface) 3346 { 3347 struct batadv_priv *bat_priv = netdev_priv(soft_iface); 3348 int packet_size_max = atomic_read(&bat_priv->packet_size_max); 3349 int table_size, timeout = BATADV_TT_LOCAL_TIMEOUT / 2; 3350 bool reduced = false; 3351 3352 spin_lock_bh(&bat_priv->tt.commit_lock); 3353 3354 while (true) { 3355 table_size = batadv_tt_local_table_transmit_size(bat_priv); 3356 if (packet_size_max >= table_size) 3357 break; 3358 3359 batadv_tt_local_purge(bat_priv, timeout); 3360 batadv_tt_local_purge_pending_clients(bat_priv); 3361 3362 timeout /= 2; 3363 reduced = true; 3364 net_ratelimited_function(batadv_info, soft_iface, 3365 "Forced to purge local tt entries to fit new maximum fragment MTU (%i)\n", 3366 packet_size_max); 3367 } 3368 3369 /* commit these changes immediately, to avoid synchronization problem 3370 * with the TTVN 3371 */ 3372 if (reduced) 3373 batadv_tt_local_commit_changes_nolock(bat_priv); 3374 3375 spin_unlock_bh(&bat_priv->tt.commit_lock); 3376 } 3377 3378 /** 3379 * batadv_tt_tvlv_ogm_handler_v1 - process incoming tt tvlv container 3380 * @bat_priv: the bat priv with all the soft interface information 3381 * @orig: the orig_node of the ogm 3382 * @flags: flags indicating the tvlv state (see batadv_tvlv_handler_flags) 3383 * @tvlv_value: tvlv buffer containing the gateway data 3384 * @tvlv_value_len: tvlv buffer length 3385 */ 3386 static void batadv_tt_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv, 3387 struct batadv_orig_node *orig, 3388 uint8_t flags, void *tvlv_value, 3389 uint16_t tvlv_value_len) 3390 { 3391 struct batadv_tvlv_tt_vlan_data *tt_vlan; 3392 struct batadv_tvlv_tt_change *tt_change; 3393 struct batadv_tvlv_tt_data *tt_data; 3394 uint16_t num_entries, num_vlan; 3395 3396 if (tvlv_value_len < sizeof(*tt_data)) 3397 return; 3398 3399 tt_data = (struct batadv_tvlv_tt_data *)tvlv_value; 3400 tvlv_value_len -= sizeof(*tt_data); 3401 3402 num_vlan = ntohs(tt_data->num_vlan); 3403 3404 if (tvlv_value_len < sizeof(*tt_vlan) * num_vlan) 3405 return; 3406 3407 tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(tt_data + 1); 3408 tt_change = (struct batadv_tvlv_tt_change *)(tt_vlan + num_vlan); 3409 tvlv_value_len -= sizeof(*tt_vlan) * num_vlan; 3410 3411 num_entries = batadv_tt_entries(tvlv_value_len); 3412 3413 batadv_tt_update_orig(bat_priv, orig, tt_vlan, num_vlan, tt_change, 3414 num_entries, tt_data->ttvn); 3415 } 3416 3417 /** 3418 * batadv_tt_tvlv_unicast_handler_v1 - process incoming (unicast) tt tvlv 3419 * container 3420 * @bat_priv: the bat priv with all the soft interface information 3421 * @src: mac address of tt tvlv sender 3422 * @dst: mac address of tt tvlv recipient 3423 * @tvlv_value: tvlv buffer containing the tt data 3424 * @tvlv_value_len: tvlv buffer length 3425 * 3426 * Returns NET_RX_DROP if the tt tvlv is to be re-routed, NET_RX_SUCCESS 3427 * otherwise. 3428 */ 3429 static int batadv_tt_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv, 3430 uint8_t *src, uint8_t *dst, 3431 void *tvlv_value, 3432 uint16_t tvlv_value_len) 3433 { 3434 struct batadv_tvlv_tt_data *tt_data; 3435 uint16_t tt_vlan_len, tt_num_entries; 3436 char tt_flag; 3437 bool ret; 3438 3439 if (tvlv_value_len < sizeof(*tt_data)) 3440 return NET_RX_SUCCESS; 3441 3442 tt_data = (struct batadv_tvlv_tt_data *)tvlv_value; 3443 tvlv_value_len -= sizeof(*tt_data); 3444 3445 tt_vlan_len = sizeof(struct batadv_tvlv_tt_vlan_data); 3446 tt_vlan_len *= ntohs(tt_data->num_vlan); 3447 3448 if (tvlv_value_len < tt_vlan_len) 3449 return NET_RX_SUCCESS; 3450 3451 tvlv_value_len -= tt_vlan_len; 3452 tt_num_entries = batadv_tt_entries(tvlv_value_len); 3453 3454 switch (tt_data->flags & BATADV_TT_DATA_TYPE_MASK) { 3455 case BATADV_TT_REQUEST: 3456 batadv_inc_counter(bat_priv, BATADV_CNT_TT_REQUEST_RX); 3457 3458 /* If this node cannot provide a TT response the tt_request is 3459 * forwarded 3460 */ 3461 ret = batadv_send_tt_response(bat_priv, tt_data, src, dst); 3462 if (!ret) { 3463 if (tt_data->flags & BATADV_TT_FULL_TABLE) 3464 tt_flag = 'F'; 3465 else 3466 tt_flag = '.'; 3467 3468 batadv_dbg(BATADV_DBG_TT, bat_priv, 3469 "Routing TT_REQUEST to %pM [%c]\n", 3470 dst, tt_flag); 3471 /* tvlv API will re-route the packet */ 3472 return NET_RX_DROP; 3473 } 3474 break; 3475 case BATADV_TT_RESPONSE: 3476 batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_RX); 3477 3478 if (batadv_is_my_mac(bat_priv, dst)) { 3479 batadv_handle_tt_response(bat_priv, tt_data, 3480 src, tt_num_entries); 3481 return NET_RX_SUCCESS; 3482 } 3483 3484 if (tt_data->flags & BATADV_TT_FULL_TABLE) 3485 tt_flag = 'F'; 3486 else 3487 tt_flag = '.'; 3488 3489 batadv_dbg(BATADV_DBG_TT, bat_priv, 3490 "Routing TT_RESPONSE to %pM [%c]\n", dst, tt_flag); 3491 3492 /* tvlv API will re-route the packet */ 3493 return NET_RX_DROP; 3494 } 3495 3496 return NET_RX_SUCCESS; 3497 } 3498 3499 /** 3500 * batadv_roam_tvlv_unicast_handler_v1 - process incoming tt roam tvlv container 3501 * @bat_priv: the bat priv with all the soft interface information 3502 * @src: mac address of tt tvlv sender 3503 * @dst: mac address of tt tvlv recipient 3504 * @tvlv_value: tvlv buffer containing the tt data 3505 * @tvlv_value_len: tvlv buffer length 3506 * 3507 * Returns NET_RX_DROP if the tt roam tvlv is to be re-routed, NET_RX_SUCCESS 3508 * otherwise. 3509 */ 3510 static int batadv_roam_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv, 3511 uint8_t *src, uint8_t *dst, 3512 void *tvlv_value, 3513 uint16_t tvlv_value_len) 3514 { 3515 struct batadv_tvlv_roam_adv *roaming_adv; 3516 struct batadv_orig_node *orig_node = NULL; 3517 3518 /* If this node is not the intended recipient of the 3519 * roaming advertisement the packet is forwarded 3520 * (the tvlv API will re-route the packet). 3521 */ 3522 if (!batadv_is_my_mac(bat_priv, dst)) 3523 return NET_RX_DROP; 3524 3525 if (tvlv_value_len < sizeof(*roaming_adv)) 3526 goto out; 3527 3528 orig_node = batadv_orig_hash_find(bat_priv, src); 3529 if (!orig_node) 3530 goto out; 3531 3532 batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_RX); 3533 roaming_adv = (struct batadv_tvlv_roam_adv *)tvlv_value; 3534 3535 batadv_dbg(BATADV_DBG_TT, bat_priv, 3536 "Received ROAMING_ADV from %pM (client %pM)\n", 3537 src, roaming_adv->client); 3538 3539 batadv_tt_global_add(bat_priv, orig_node, roaming_adv->client, 3540 ntohs(roaming_adv->vid), BATADV_TT_CLIENT_ROAM, 3541 atomic_read(&orig_node->last_ttvn) + 1); 3542 3543 out: 3544 if (orig_node) 3545 batadv_orig_node_free_ref(orig_node); 3546 return NET_RX_SUCCESS; 3547 } 3548 3549 /** 3550 * batadv_tt_init - initialise the translation table internals 3551 * @bat_priv: the bat priv with all the soft interface information 3552 * 3553 * Return 0 on success or negative error number in case of failure. 3554 */ 3555 int batadv_tt_init(struct batadv_priv *bat_priv) 3556 { 3557 int ret; 3558 3559 /* synchronized flags must be remote */ 3560 BUILD_BUG_ON(!(BATADV_TT_SYNC_MASK & BATADV_TT_REMOTE_MASK)); 3561 3562 ret = batadv_tt_local_init(bat_priv); 3563 if (ret < 0) 3564 return ret; 3565 3566 ret = batadv_tt_global_init(bat_priv); 3567 if (ret < 0) 3568 return ret; 3569 3570 batadv_tvlv_handler_register(bat_priv, batadv_tt_tvlv_ogm_handler_v1, 3571 batadv_tt_tvlv_unicast_handler_v1, 3572 BATADV_TVLV_TT, 1, BATADV_NO_FLAGS); 3573 3574 batadv_tvlv_handler_register(bat_priv, NULL, 3575 batadv_roam_tvlv_unicast_handler_v1, 3576 BATADV_TVLV_ROAM, 1, BATADV_NO_FLAGS); 3577 3578 INIT_DELAYED_WORK(&bat_priv->tt.work, batadv_tt_purge); 3579 queue_delayed_work(batadv_event_workqueue, &bat_priv->tt.work, 3580 msecs_to_jiffies(BATADV_TT_WORK_PERIOD)); 3581 3582 return 1; 3583 } 3584 3585 /** 3586 * batadv_tt_global_is_isolated - check if a client is marked as isolated 3587 * @bat_priv: the bat priv with all the soft interface information 3588 * @addr: the mac address of the client 3589 * @vid: the identifier of the VLAN where this client is connected 3590 * 3591 * Returns true if the client is marked with the TT_CLIENT_ISOLA flag, false 3592 * otherwise 3593 */ 3594 bool batadv_tt_global_is_isolated(struct batadv_priv *bat_priv, 3595 const uint8_t *addr, unsigned short vid) 3596 { 3597 struct batadv_tt_global_entry *tt; 3598 bool ret; 3599 3600 tt = batadv_tt_global_hash_find(bat_priv, addr, vid); 3601 if (!tt) 3602 return false; 3603 3604 ret = tt->common.flags & BATADV_TT_CLIENT_ISOLA; 3605 3606 batadv_tt_global_entry_free_ref(tt); 3607 3608 return ret; 3609 } 3610