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 __be16 tmp_vid; 1979 1980 for (i = 0; i < hash->size; i++) { 1981 head = &hash->table[i]; 1982 1983 rcu_read_lock(); 1984 hlist_for_each_entry_rcu(tt_common, head, hash_entry) { 1985 tt_global = container_of(tt_common, 1986 struct batadv_tt_global_entry, 1987 common); 1988 /* compute the CRC only for entries belonging to the 1989 * VLAN identified by the vid passed as parameter 1990 */ 1991 if (tt_common->vid != vid) 1992 continue; 1993 1994 /* Roaming clients are in the global table for 1995 * consistency only. They don't have to be 1996 * taken into account while computing the 1997 * global crc 1998 */ 1999 if (tt_common->flags & BATADV_TT_CLIENT_ROAM) 2000 continue; 2001 /* Temporary clients have not been announced yet, so 2002 * they have to be skipped while computing the global 2003 * crc 2004 */ 2005 if (tt_common->flags & BATADV_TT_CLIENT_TEMP) 2006 continue; 2007 2008 /* find out if this global entry is announced by this 2009 * originator 2010 */ 2011 if (!batadv_tt_global_entry_has_orig(tt_global, 2012 orig_node)) 2013 continue; 2014 2015 /* use network order to read the VID: this ensures that 2016 * every node reads the bytes in the same order. 2017 */ 2018 tmp_vid = htons(tt_common->vid); 2019 crc_tmp = crc32c(0, &tmp_vid, sizeof(tmp_vid)); 2020 2021 /* compute the CRC on flags that have to be kept in sync 2022 * among nodes 2023 */ 2024 flags = tt_common->flags & BATADV_TT_SYNC_MASK; 2025 crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags)); 2026 2027 crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN); 2028 } 2029 rcu_read_unlock(); 2030 } 2031 2032 return crc; 2033 } 2034 2035 /** 2036 * batadv_tt_local_crc - calculates the checksum of the local table 2037 * @bat_priv: the bat priv with all the soft interface information 2038 * @vid: VLAN identifier for which the CRC32 has to be computed 2039 * 2040 * For details about the computation, please refer to the documentation for 2041 * batadv_tt_global_crc(). 2042 * 2043 * Returns the checksum of the local table 2044 */ 2045 static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv, 2046 unsigned short vid) 2047 { 2048 struct batadv_hashtable *hash = bat_priv->tt.local_hash; 2049 struct batadv_tt_common_entry *tt_common; 2050 struct hlist_head *head; 2051 uint32_t i, crc_tmp, crc = 0; 2052 uint8_t flags; 2053 __be16 tmp_vid; 2054 2055 for (i = 0; i < hash->size; i++) { 2056 head = &hash->table[i]; 2057 2058 rcu_read_lock(); 2059 hlist_for_each_entry_rcu(tt_common, head, hash_entry) { 2060 /* compute the CRC only for entries belonging to the 2061 * VLAN identified by vid 2062 */ 2063 if (tt_common->vid != vid) 2064 continue; 2065 2066 /* not yet committed clients have not to be taken into 2067 * account while computing the CRC 2068 */ 2069 if (tt_common->flags & BATADV_TT_CLIENT_NEW) 2070 continue; 2071 2072 /* use network order to read the VID: this ensures that 2073 * every node reads the bytes in the same order. 2074 */ 2075 tmp_vid = htons(tt_common->vid); 2076 crc_tmp = crc32c(0, &tmp_vid, sizeof(tmp_vid)); 2077 2078 /* compute the CRC on flags that have to be kept in sync 2079 * among nodes 2080 */ 2081 flags = tt_common->flags & BATADV_TT_SYNC_MASK; 2082 crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags)); 2083 2084 crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN); 2085 } 2086 rcu_read_unlock(); 2087 } 2088 2089 return crc; 2090 } 2091 2092 static void batadv_tt_req_list_free(struct batadv_priv *bat_priv) 2093 { 2094 struct batadv_tt_req_node *node, *safe; 2095 2096 spin_lock_bh(&bat_priv->tt.req_list_lock); 2097 2098 list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) { 2099 list_del(&node->list); 2100 kfree(node); 2101 } 2102 2103 spin_unlock_bh(&bat_priv->tt.req_list_lock); 2104 } 2105 2106 static void batadv_tt_save_orig_buffer(struct batadv_priv *bat_priv, 2107 struct batadv_orig_node *orig_node, 2108 const void *tt_buff, 2109 uint16_t tt_buff_len) 2110 { 2111 /* Replace the old buffer only if I received something in the 2112 * last OGM (the OGM could carry no changes) 2113 */ 2114 spin_lock_bh(&orig_node->tt_buff_lock); 2115 if (tt_buff_len > 0) { 2116 kfree(orig_node->tt_buff); 2117 orig_node->tt_buff_len = 0; 2118 orig_node->tt_buff = kmalloc(tt_buff_len, GFP_ATOMIC); 2119 if (orig_node->tt_buff) { 2120 memcpy(orig_node->tt_buff, tt_buff, tt_buff_len); 2121 orig_node->tt_buff_len = tt_buff_len; 2122 } 2123 } 2124 spin_unlock_bh(&orig_node->tt_buff_lock); 2125 } 2126 2127 static void batadv_tt_req_purge(struct batadv_priv *bat_priv) 2128 { 2129 struct batadv_tt_req_node *node, *safe; 2130 2131 spin_lock_bh(&bat_priv->tt.req_list_lock); 2132 list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) { 2133 if (batadv_has_timed_out(node->issued_at, 2134 BATADV_TT_REQUEST_TIMEOUT)) { 2135 list_del(&node->list); 2136 kfree(node); 2137 } 2138 } 2139 spin_unlock_bh(&bat_priv->tt.req_list_lock); 2140 } 2141 2142 /* returns the pointer to the new tt_req_node struct if no request 2143 * has already been issued for this orig_node, NULL otherwise 2144 */ 2145 static struct batadv_tt_req_node * 2146 batadv_new_tt_req_node(struct batadv_priv *bat_priv, 2147 struct batadv_orig_node *orig_node) 2148 { 2149 struct batadv_tt_req_node *tt_req_node_tmp, *tt_req_node = NULL; 2150 2151 spin_lock_bh(&bat_priv->tt.req_list_lock); 2152 list_for_each_entry(tt_req_node_tmp, &bat_priv->tt.req_list, list) { 2153 if (batadv_compare_eth(tt_req_node_tmp, orig_node) && 2154 !batadv_has_timed_out(tt_req_node_tmp->issued_at, 2155 BATADV_TT_REQUEST_TIMEOUT)) 2156 goto unlock; 2157 } 2158 2159 tt_req_node = kmalloc(sizeof(*tt_req_node), GFP_ATOMIC); 2160 if (!tt_req_node) 2161 goto unlock; 2162 2163 memcpy(tt_req_node->addr, orig_node->orig, ETH_ALEN); 2164 tt_req_node->issued_at = jiffies; 2165 2166 list_add(&tt_req_node->list, &bat_priv->tt.req_list); 2167 unlock: 2168 spin_unlock_bh(&bat_priv->tt.req_list_lock); 2169 return tt_req_node; 2170 } 2171 2172 /** 2173 * batadv_tt_local_valid - verify that given tt entry is a valid one 2174 * @entry_ptr: to be checked local tt entry 2175 * @data_ptr: not used but definition required to satisfy the callback prototype 2176 * 2177 * Returns 1 if the entry is a valid, 0 otherwise. 2178 */ 2179 static int batadv_tt_local_valid(const void *entry_ptr, const void *data_ptr) 2180 { 2181 const struct batadv_tt_common_entry *tt_common_entry = entry_ptr; 2182 2183 if (tt_common_entry->flags & BATADV_TT_CLIENT_NEW) 2184 return 0; 2185 return 1; 2186 } 2187 2188 static int batadv_tt_global_valid(const void *entry_ptr, 2189 const void *data_ptr) 2190 { 2191 const struct batadv_tt_common_entry *tt_common_entry = entry_ptr; 2192 const struct batadv_tt_global_entry *tt_global_entry; 2193 const struct batadv_orig_node *orig_node = data_ptr; 2194 2195 if (tt_common_entry->flags & BATADV_TT_CLIENT_ROAM || 2196 tt_common_entry->flags & BATADV_TT_CLIENT_TEMP) 2197 return 0; 2198 2199 tt_global_entry = container_of(tt_common_entry, 2200 struct batadv_tt_global_entry, 2201 common); 2202 2203 return batadv_tt_global_entry_has_orig(tt_global_entry, orig_node); 2204 } 2205 2206 /** 2207 * batadv_tt_tvlv_generate - fill the tvlv buff with the tt entries from the 2208 * specified tt hash 2209 * @bat_priv: the bat priv with all the soft interface information 2210 * @hash: hash table containing the tt entries 2211 * @tt_len: expected tvlv tt data buffer length in number of bytes 2212 * @tvlv_buff: pointer to the buffer to fill with the TT data 2213 * @valid_cb: function to filter tt change entries 2214 * @cb_data: data passed to the filter function as argument 2215 */ 2216 static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv, 2217 struct batadv_hashtable *hash, 2218 void *tvlv_buff, uint16_t tt_len, 2219 int (*valid_cb)(const void *, const void *), 2220 void *cb_data) 2221 { 2222 struct batadv_tt_common_entry *tt_common_entry; 2223 struct batadv_tvlv_tt_change *tt_change; 2224 struct hlist_head *head; 2225 uint16_t tt_tot, tt_num_entries = 0; 2226 uint32_t i; 2227 2228 tt_tot = batadv_tt_entries(tt_len); 2229 tt_change = (struct batadv_tvlv_tt_change *)tvlv_buff; 2230 2231 rcu_read_lock(); 2232 for (i = 0; i < hash->size; i++) { 2233 head = &hash->table[i]; 2234 2235 hlist_for_each_entry_rcu(tt_common_entry, 2236 head, hash_entry) { 2237 if (tt_tot == tt_num_entries) 2238 break; 2239 2240 if ((valid_cb) && (!valid_cb(tt_common_entry, cb_data))) 2241 continue; 2242 2243 memcpy(tt_change->addr, tt_common_entry->addr, 2244 ETH_ALEN); 2245 tt_change->flags = tt_common_entry->flags; 2246 tt_change->vid = htons(tt_common_entry->vid); 2247 memset(tt_change->reserved, 0, 2248 sizeof(tt_change->reserved)); 2249 2250 tt_num_entries++; 2251 tt_change++; 2252 } 2253 } 2254 rcu_read_unlock(); 2255 } 2256 2257 /** 2258 * batadv_tt_global_check_crc - check if all the CRCs are correct 2259 * @orig_node: originator for which the CRCs have to be checked 2260 * @tt_vlan: pointer to the first tvlv VLAN entry 2261 * @num_vlan: number of tvlv VLAN entries 2262 * @create: if true, create VLAN objects if not found 2263 * 2264 * Return true if all the received CRCs match the locally stored ones, false 2265 * otherwise 2266 */ 2267 static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node, 2268 struct batadv_tvlv_tt_vlan_data *tt_vlan, 2269 uint16_t num_vlan) 2270 { 2271 struct batadv_tvlv_tt_vlan_data *tt_vlan_tmp; 2272 struct batadv_orig_node_vlan *vlan; 2273 uint32_t crc; 2274 int i; 2275 2276 /* check if each received CRC matches the locally stored one */ 2277 for (i = 0; i < num_vlan; i++) { 2278 tt_vlan_tmp = tt_vlan + i; 2279 2280 /* if orig_node is a backbone node for this VLAN, don't check 2281 * the CRC as we ignore all the global entries over it 2282 */ 2283 if (batadv_bla_is_backbone_gw_orig(orig_node->bat_priv, 2284 orig_node->orig, 2285 ntohs(tt_vlan_tmp->vid))) 2286 continue; 2287 2288 vlan = batadv_orig_node_vlan_get(orig_node, 2289 ntohs(tt_vlan_tmp->vid)); 2290 if (!vlan) 2291 return false; 2292 2293 crc = vlan->tt.crc; 2294 batadv_orig_node_vlan_free_ref(vlan); 2295 2296 if (crc != ntohl(tt_vlan_tmp->crc)) 2297 return false; 2298 } 2299 2300 return true; 2301 } 2302 2303 /** 2304 * batadv_tt_local_update_crc - update all the local CRCs 2305 * @bat_priv: the bat priv with all the soft interface information 2306 */ 2307 static void batadv_tt_local_update_crc(struct batadv_priv *bat_priv) 2308 { 2309 struct batadv_softif_vlan *vlan; 2310 2311 /* recompute the global CRC for each VLAN */ 2312 rcu_read_lock(); 2313 hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) { 2314 vlan->tt.crc = batadv_tt_local_crc(bat_priv, vlan->vid); 2315 } 2316 rcu_read_unlock(); 2317 } 2318 2319 /** 2320 * batadv_tt_global_update_crc - update all the global CRCs for this orig_node 2321 * @bat_priv: the bat priv with all the soft interface information 2322 * @orig_node: the orig_node for which the CRCs have to be updated 2323 */ 2324 static void batadv_tt_global_update_crc(struct batadv_priv *bat_priv, 2325 struct batadv_orig_node *orig_node) 2326 { 2327 struct batadv_orig_node_vlan *vlan; 2328 uint32_t crc; 2329 2330 /* recompute the global CRC for each VLAN */ 2331 rcu_read_lock(); 2332 list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) { 2333 /* if orig_node is a backbone node for this VLAN, don't compute 2334 * the CRC as we ignore all the global entries over it 2335 */ 2336 if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig, 2337 vlan->vid)) 2338 continue; 2339 2340 crc = batadv_tt_global_crc(bat_priv, orig_node, vlan->vid); 2341 vlan->tt.crc = crc; 2342 } 2343 rcu_read_unlock(); 2344 } 2345 2346 /** 2347 * batadv_send_tt_request - send a TT Request message to a given node 2348 * @bat_priv: the bat priv with all the soft interface information 2349 * @dst_orig_node: the destination of the message 2350 * @ttvn: the version number that the source of the message is looking for 2351 * @tt_vlan: pointer to the first tvlv VLAN object to request 2352 * @num_vlan: number of tvlv VLAN entries 2353 * @full_table: ask for the entire translation table if true, while only for the 2354 * last TT diff otherwise 2355 */ 2356 static int batadv_send_tt_request(struct batadv_priv *bat_priv, 2357 struct batadv_orig_node *dst_orig_node, 2358 uint8_t ttvn, 2359 struct batadv_tvlv_tt_vlan_data *tt_vlan, 2360 uint16_t num_vlan, bool full_table) 2361 { 2362 struct batadv_tvlv_tt_data *tvlv_tt_data = NULL; 2363 struct batadv_tt_req_node *tt_req_node = NULL; 2364 struct batadv_tvlv_tt_vlan_data *tt_vlan_req; 2365 struct batadv_hard_iface *primary_if; 2366 bool ret = false; 2367 int i, size; 2368 2369 primary_if = batadv_primary_if_get_selected(bat_priv); 2370 if (!primary_if) 2371 goto out; 2372 2373 /* The new tt_req will be issued only if I'm not waiting for a 2374 * reply from the same orig_node yet 2375 */ 2376 tt_req_node = batadv_new_tt_req_node(bat_priv, dst_orig_node); 2377 if (!tt_req_node) 2378 goto out; 2379 2380 size = sizeof(*tvlv_tt_data) + sizeof(*tt_vlan_req) * num_vlan; 2381 tvlv_tt_data = kzalloc(size, GFP_ATOMIC); 2382 if (!tvlv_tt_data) 2383 goto out; 2384 2385 tvlv_tt_data->flags = BATADV_TT_REQUEST; 2386 tvlv_tt_data->ttvn = ttvn; 2387 tvlv_tt_data->num_vlan = htons(num_vlan); 2388 2389 /* send all the CRCs within the request. This is needed by intermediate 2390 * nodes to ensure they have the correct table before replying 2391 */ 2392 tt_vlan_req = (struct batadv_tvlv_tt_vlan_data *)(tvlv_tt_data + 1); 2393 for (i = 0; i < num_vlan; i++) { 2394 tt_vlan_req->vid = tt_vlan->vid; 2395 tt_vlan_req->crc = tt_vlan->crc; 2396 2397 tt_vlan_req++; 2398 tt_vlan++; 2399 } 2400 2401 if (full_table) 2402 tvlv_tt_data->flags |= BATADV_TT_FULL_TABLE; 2403 2404 batadv_dbg(BATADV_DBG_TT, bat_priv, "Sending TT_REQUEST to %pM [%c]\n", 2405 dst_orig_node->orig, full_table ? 'F' : '.'); 2406 2407 batadv_inc_counter(bat_priv, BATADV_CNT_TT_REQUEST_TX); 2408 batadv_tvlv_unicast_send(bat_priv, primary_if->net_dev->dev_addr, 2409 dst_orig_node->orig, BATADV_TVLV_TT, 1, 2410 tvlv_tt_data, size); 2411 ret = true; 2412 2413 out: 2414 if (primary_if) 2415 batadv_hardif_free_ref(primary_if); 2416 if (ret && tt_req_node) { 2417 spin_lock_bh(&bat_priv->tt.req_list_lock); 2418 list_del(&tt_req_node->list); 2419 spin_unlock_bh(&bat_priv->tt.req_list_lock); 2420 kfree(tt_req_node); 2421 } 2422 kfree(tvlv_tt_data); 2423 return ret; 2424 } 2425 2426 /** 2427 * batadv_send_other_tt_response - send reply to tt request concerning another 2428 * node's translation table 2429 * @bat_priv: the bat priv with all the soft interface information 2430 * @tt_data: tt data containing the tt request information 2431 * @req_src: mac address of tt request sender 2432 * @req_dst: mac address of tt request recipient 2433 * 2434 * Returns true if tt request reply was sent, false otherwise. 2435 */ 2436 static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv, 2437 struct batadv_tvlv_tt_data *tt_data, 2438 uint8_t *req_src, uint8_t *req_dst) 2439 { 2440 struct batadv_orig_node *req_dst_orig_node; 2441 struct batadv_orig_node *res_dst_orig_node = NULL; 2442 struct batadv_tvlv_tt_change *tt_change; 2443 struct batadv_tvlv_tt_data *tvlv_tt_data = NULL; 2444 struct batadv_tvlv_tt_vlan_data *tt_vlan; 2445 bool ret = false, full_table; 2446 uint8_t orig_ttvn, req_ttvn; 2447 uint16_t tvlv_len; 2448 int32_t tt_len; 2449 2450 batadv_dbg(BATADV_DBG_TT, bat_priv, 2451 "Received TT_REQUEST from %pM for ttvn: %u (%pM) [%c]\n", 2452 req_src, tt_data->ttvn, req_dst, 2453 (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.')); 2454 2455 /* Let's get the orig node of the REAL destination */ 2456 req_dst_orig_node = batadv_orig_hash_find(bat_priv, req_dst); 2457 if (!req_dst_orig_node) 2458 goto out; 2459 2460 res_dst_orig_node = batadv_orig_hash_find(bat_priv, req_src); 2461 if (!res_dst_orig_node) 2462 goto out; 2463 2464 orig_ttvn = (uint8_t)atomic_read(&req_dst_orig_node->last_ttvn); 2465 req_ttvn = tt_data->ttvn; 2466 2467 tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(tt_data + 1); 2468 /* this node doesn't have the requested data */ 2469 if (orig_ttvn != req_ttvn || 2470 !batadv_tt_global_check_crc(req_dst_orig_node, tt_vlan, 2471 ntohs(tt_data->num_vlan))) 2472 goto out; 2473 2474 /* If the full table has been explicitly requested */ 2475 if (tt_data->flags & BATADV_TT_FULL_TABLE || 2476 !req_dst_orig_node->tt_buff) 2477 full_table = true; 2478 else 2479 full_table = false; 2480 2481 /* TT fragmentation hasn't been implemented yet, so send as many 2482 * TT entries fit a single packet as possible only 2483 */ 2484 if (!full_table) { 2485 spin_lock_bh(&req_dst_orig_node->tt_buff_lock); 2486 tt_len = req_dst_orig_node->tt_buff_len; 2487 2488 tvlv_len = batadv_tt_prepare_tvlv_global_data(req_dst_orig_node, 2489 &tvlv_tt_data, 2490 &tt_change, 2491 &tt_len); 2492 if (!tt_len) 2493 goto unlock; 2494 2495 /* Copy the last orig_node's OGM buffer */ 2496 memcpy(tt_change, req_dst_orig_node->tt_buff, 2497 req_dst_orig_node->tt_buff_len); 2498 spin_unlock_bh(&req_dst_orig_node->tt_buff_lock); 2499 } else { 2500 /* allocate the tvlv, put the tt_data and all the tt_vlan_data 2501 * in the initial part 2502 */ 2503 tt_len = -1; 2504 tvlv_len = batadv_tt_prepare_tvlv_global_data(req_dst_orig_node, 2505 &tvlv_tt_data, 2506 &tt_change, 2507 &tt_len); 2508 if (!tt_len) 2509 goto out; 2510 2511 /* fill the rest of the tvlv with the real TT entries */ 2512 batadv_tt_tvlv_generate(bat_priv, bat_priv->tt.global_hash, 2513 tt_change, tt_len, 2514 batadv_tt_global_valid, 2515 req_dst_orig_node); 2516 } 2517 2518 /* Don't send the response, if larger than fragmented packet. */ 2519 tt_len = sizeof(struct batadv_unicast_tvlv_packet) + tvlv_len; 2520 if (tt_len > atomic_read(&bat_priv->packet_size_max)) { 2521 net_ratelimited_function(batadv_info, bat_priv->soft_iface, 2522 "Ignoring TT_REQUEST from %pM; Response size exceeds max packet size.\n", 2523 res_dst_orig_node->orig); 2524 goto out; 2525 } 2526 2527 tvlv_tt_data->flags = BATADV_TT_RESPONSE; 2528 tvlv_tt_data->ttvn = req_ttvn; 2529 2530 if (full_table) 2531 tvlv_tt_data->flags |= BATADV_TT_FULL_TABLE; 2532 2533 batadv_dbg(BATADV_DBG_TT, bat_priv, 2534 "Sending TT_RESPONSE %pM for %pM [%c] (ttvn: %u)\n", 2535 res_dst_orig_node->orig, req_dst_orig_node->orig, 2536 full_table ? 'F' : '.', req_ttvn); 2537 2538 batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_TX); 2539 2540 batadv_tvlv_unicast_send(bat_priv, req_dst_orig_node->orig, 2541 req_src, BATADV_TVLV_TT, 1, tvlv_tt_data, 2542 tvlv_len); 2543 2544 ret = true; 2545 goto out; 2546 2547 unlock: 2548 spin_unlock_bh(&req_dst_orig_node->tt_buff_lock); 2549 2550 out: 2551 if (res_dst_orig_node) 2552 batadv_orig_node_free_ref(res_dst_orig_node); 2553 if (req_dst_orig_node) 2554 batadv_orig_node_free_ref(req_dst_orig_node); 2555 kfree(tvlv_tt_data); 2556 return ret; 2557 } 2558 2559 /** 2560 * batadv_send_my_tt_response - send reply to tt request concerning this node's 2561 * translation table 2562 * @bat_priv: the bat priv with all the soft interface information 2563 * @tt_data: tt data containing the tt request information 2564 * @req_src: mac address of tt request sender 2565 * 2566 * Returns true if tt request reply was sent, false otherwise. 2567 */ 2568 static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv, 2569 struct batadv_tvlv_tt_data *tt_data, 2570 uint8_t *req_src) 2571 { 2572 struct batadv_tvlv_tt_data *tvlv_tt_data = NULL; 2573 struct batadv_hard_iface *primary_if = NULL; 2574 struct batadv_tvlv_tt_change *tt_change; 2575 struct batadv_orig_node *orig_node; 2576 uint8_t my_ttvn, req_ttvn; 2577 uint16_t tvlv_len; 2578 bool full_table; 2579 int32_t tt_len; 2580 2581 batadv_dbg(BATADV_DBG_TT, bat_priv, 2582 "Received TT_REQUEST from %pM for ttvn: %u (me) [%c]\n", 2583 req_src, tt_data->ttvn, 2584 (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.')); 2585 2586 spin_lock_bh(&bat_priv->tt.commit_lock); 2587 2588 my_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn); 2589 req_ttvn = tt_data->ttvn; 2590 2591 orig_node = batadv_orig_hash_find(bat_priv, req_src); 2592 if (!orig_node) 2593 goto out; 2594 2595 primary_if = batadv_primary_if_get_selected(bat_priv); 2596 if (!primary_if) 2597 goto out; 2598 2599 /* If the full table has been explicitly requested or the gap 2600 * is too big send the whole local translation table 2601 */ 2602 if (tt_data->flags & BATADV_TT_FULL_TABLE || my_ttvn != req_ttvn || 2603 !bat_priv->tt.last_changeset) 2604 full_table = true; 2605 else 2606 full_table = false; 2607 2608 /* TT fragmentation hasn't been implemented yet, so send as many 2609 * TT entries fit a single packet as possible only 2610 */ 2611 if (!full_table) { 2612 spin_lock_bh(&bat_priv->tt.last_changeset_lock); 2613 2614 tt_len = bat_priv->tt.last_changeset_len; 2615 tvlv_len = batadv_tt_prepare_tvlv_local_data(bat_priv, 2616 &tvlv_tt_data, 2617 &tt_change, 2618 &tt_len); 2619 if (!tt_len) 2620 goto unlock; 2621 2622 /* Copy the last orig_node's OGM buffer */ 2623 memcpy(tt_change, bat_priv->tt.last_changeset, 2624 bat_priv->tt.last_changeset_len); 2625 spin_unlock_bh(&bat_priv->tt.last_changeset_lock); 2626 } else { 2627 req_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn); 2628 2629 /* allocate the tvlv, put the tt_data and all the tt_vlan_data 2630 * in the initial part 2631 */ 2632 tt_len = -1; 2633 tvlv_len = batadv_tt_prepare_tvlv_local_data(bat_priv, 2634 &tvlv_tt_data, 2635 &tt_change, 2636 &tt_len); 2637 if (!tt_len) 2638 goto out; 2639 2640 /* fill the rest of the tvlv with the real TT entries */ 2641 batadv_tt_tvlv_generate(bat_priv, bat_priv->tt.local_hash, 2642 tt_change, tt_len, 2643 batadv_tt_local_valid, NULL); 2644 } 2645 2646 tvlv_tt_data->flags = BATADV_TT_RESPONSE; 2647 tvlv_tt_data->ttvn = req_ttvn; 2648 2649 if (full_table) 2650 tvlv_tt_data->flags |= BATADV_TT_FULL_TABLE; 2651 2652 batadv_dbg(BATADV_DBG_TT, bat_priv, 2653 "Sending TT_RESPONSE to %pM [%c] (ttvn: %u)\n", 2654 orig_node->orig, full_table ? 'F' : '.', req_ttvn); 2655 2656 batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_TX); 2657 2658 batadv_tvlv_unicast_send(bat_priv, primary_if->net_dev->dev_addr, 2659 req_src, BATADV_TVLV_TT, 1, tvlv_tt_data, 2660 tvlv_len); 2661 2662 goto out; 2663 2664 unlock: 2665 spin_unlock_bh(&bat_priv->tt.last_changeset_lock); 2666 out: 2667 spin_unlock_bh(&bat_priv->tt.commit_lock); 2668 if (orig_node) 2669 batadv_orig_node_free_ref(orig_node); 2670 if (primary_if) 2671 batadv_hardif_free_ref(primary_if); 2672 kfree(tvlv_tt_data); 2673 /* The packet was for this host, so it doesn't need to be re-routed */ 2674 return true; 2675 } 2676 2677 /** 2678 * batadv_send_tt_response - send reply to tt request 2679 * @bat_priv: the bat priv with all the soft interface information 2680 * @tt_data: tt data containing the tt request information 2681 * @req_src: mac address of tt request sender 2682 * @req_dst: mac address of tt request recipient 2683 * 2684 * Returns true if tt request reply was sent, false otherwise. 2685 */ 2686 static bool batadv_send_tt_response(struct batadv_priv *bat_priv, 2687 struct batadv_tvlv_tt_data *tt_data, 2688 uint8_t *req_src, uint8_t *req_dst) 2689 { 2690 if (batadv_is_my_mac(bat_priv, req_dst)) 2691 return batadv_send_my_tt_response(bat_priv, tt_data, req_src); 2692 else 2693 return batadv_send_other_tt_response(bat_priv, tt_data, 2694 req_src, req_dst); 2695 } 2696 2697 static void _batadv_tt_update_changes(struct batadv_priv *bat_priv, 2698 struct batadv_orig_node *orig_node, 2699 struct batadv_tvlv_tt_change *tt_change, 2700 uint16_t tt_num_changes, uint8_t ttvn) 2701 { 2702 int i; 2703 int roams; 2704 2705 for (i = 0; i < tt_num_changes; i++) { 2706 if ((tt_change + i)->flags & BATADV_TT_CLIENT_DEL) { 2707 roams = (tt_change + i)->flags & BATADV_TT_CLIENT_ROAM; 2708 batadv_tt_global_del(bat_priv, orig_node, 2709 (tt_change + i)->addr, 2710 ntohs((tt_change + i)->vid), 2711 "tt removed by changes", 2712 roams); 2713 } else { 2714 if (!batadv_tt_global_add(bat_priv, orig_node, 2715 (tt_change + i)->addr, 2716 ntohs((tt_change + i)->vid), 2717 (tt_change + i)->flags, ttvn)) 2718 /* In case of problem while storing a 2719 * global_entry, we stop the updating 2720 * procedure without committing the 2721 * ttvn change. This will avoid to send 2722 * corrupted data on tt_request 2723 */ 2724 return; 2725 } 2726 } 2727 orig_node->tt_initialised = true; 2728 } 2729 2730 static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv, 2731 struct batadv_tvlv_tt_change *tt_change, 2732 uint8_t ttvn, uint8_t *resp_src, 2733 uint16_t num_entries) 2734 { 2735 struct batadv_orig_node *orig_node; 2736 2737 orig_node = batadv_orig_hash_find(bat_priv, resp_src); 2738 if (!orig_node) 2739 goto out; 2740 2741 /* Purge the old table first.. */ 2742 batadv_tt_global_del_orig(bat_priv, orig_node, -1, 2743 "Received full table"); 2744 2745 _batadv_tt_update_changes(bat_priv, orig_node, tt_change, num_entries, 2746 ttvn); 2747 2748 spin_lock_bh(&orig_node->tt_buff_lock); 2749 kfree(orig_node->tt_buff); 2750 orig_node->tt_buff_len = 0; 2751 orig_node->tt_buff = NULL; 2752 spin_unlock_bh(&orig_node->tt_buff_lock); 2753 2754 atomic_set(&orig_node->last_ttvn, ttvn); 2755 2756 out: 2757 if (orig_node) 2758 batadv_orig_node_free_ref(orig_node); 2759 } 2760 2761 static void batadv_tt_update_changes(struct batadv_priv *bat_priv, 2762 struct batadv_orig_node *orig_node, 2763 uint16_t tt_num_changes, uint8_t ttvn, 2764 struct batadv_tvlv_tt_change *tt_change) 2765 { 2766 _batadv_tt_update_changes(bat_priv, orig_node, tt_change, 2767 tt_num_changes, ttvn); 2768 2769 batadv_tt_save_orig_buffer(bat_priv, orig_node, tt_change, 2770 batadv_tt_len(tt_num_changes)); 2771 atomic_set(&orig_node->last_ttvn, ttvn); 2772 } 2773 2774 /** 2775 * batadv_is_my_client - check if a client is served by the local node 2776 * @bat_priv: the bat priv with all the soft interface information 2777 * @addr: the mac adress of the client to check 2778 * @vid: VLAN identifier 2779 * 2780 * Returns true if the client is served by this node, false otherwise. 2781 */ 2782 bool batadv_is_my_client(struct batadv_priv *bat_priv, const uint8_t *addr, 2783 unsigned short vid) 2784 { 2785 struct batadv_tt_local_entry *tt_local_entry; 2786 bool ret = false; 2787 2788 tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid); 2789 if (!tt_local_entry) 2790 goto out; 2791 /* Check if the client has been logically deleted (but is kept for 2792 * consistency purpose) 2793 */ 2794 if ((tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING) || 2795 (tt_local_entry->common.flags & BATADV_TT_CLIENT_ROAM)) 2796 goto out; 2797 ret = true; 2798 out: 2799 if (tt_local_entry) 2800 batadv_tt_local_entry_free_ref(tt_local_entry); 2801 return ret; 2802 } 2803 2804 /** 2805 * batadv_handle_tt_response - process incoming tt reply 2806 * @bat_priv: the bat priv with all the soft interface information 2807 * @tt_data: tt data containing the tt request information 2808 * @resp_src: mac address of tt reply sender 2809 * @num_entries: number of tt change entries appended to the tt data 2810 */ 2811 static void batadv_handle_tt_response(struct batadv_priv *bat_priv, 2812 struct batadv_tvlv_tt_data *tt_data, 2813 uint8_t *resp_src, uint16_t num_entries) 2814 { 2815 struct batadv_tt_req_node *node, *safe; 2816 struct batadv_orig_node *orig_node = NULL; 2817 struct batadv_tvlv_tt_change *tt_change; 2818 uint8_t *tvlv_ptr = (uint8_t *)tt_data; 2819 uint16_t change_offset; 2820 2821 batadv_dbg(BATADV_DBG_TT, bat_priv, 2822 "Received TT_RESPONSE from %pM for ttvn %d t_size: %d [%c]\n", 2823 resp_src, tt_data->ttvn, num_entries, 2824 (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.')); 2825 2826 orig_node = batadv_orig_hash_find(bat_priv, resp_src); 2827 if (!orig_node) 2828 goto out; 2829 2830 spin_lock_bh(&orig_node->tt_lock); 2831 2832 change_offset = sizeof(struct batadv_tvlv_tt_vlan_data); 2833 change_offset *= ntohs(tt_data->num_vlan); 2834 change_offset += sizeof(*tt_data); 2835 tvlv_ptr += change_offset; 2836 2837 tt_change = (struct batadv_tvlv_tt_change *)tvlv_ptr; 2838 if (tt_data->flags & BATADV_TT_FULL_TABLE) { 2839 batadv_tt_fill_gtable(bat_priv, tt_change, tt_data->ttvn, 2840 resp_src, num_entries); 2841 } else { 2842 batadv_tt_update_changes(bat_priv, orig_node, num_entries, 2843 tt_data->ttvn, tt_change); 2844 } 2845 2846 /* Recalculate the CRC for this orig_node and store it */ 2847 batadv_tt_global_update_crc(bat_priv, orig_node); 2848 2849 spin_unlock_bh(&orig_node->tt_lock); 2850 2851 /* Delete the tt_req_node from pending tt_requests list */ 2852 spin_lock_bh(&bat_priv->tt.req_list_lock); 2853 list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) { 2854 if (!batadv_compare_eth(node->addr, resp_src)) 2855 continue; 2856 list_del(&node->list); 2857 kfree(node); 2858 } 2859 2860 spin_unlock_bh(&bat_priv->tt.req_list_lock); 2861 out: 2862 if (orig_node) 2863 batadv_orig_node_free_ref(orig_node); 2864 } 2865 2866 static void batadv_tt_roam_list_free(struct batadv_priv *bat_priv) 2867 { 2868 struct batadv_tt_roam_node *node, *safe; 2869 2870 spin_lock_bh(&bat_priv->tt.roam_list_lock); 2871 2872 list_for_each_entry_safe(node, safe, &bat_priv->tt.roam_list, list) { 2873 list_del(&node->list); 2874 kfree(node); 2875 } 2876 2877 spin_unlock_bh(&bat_priv->tt.roam_list_lock); 2878 } 2879 2880 static void batadv_tt_roam_purge(struct batadv_priv *bat_priv) 2881 { 2882 struct batadv_tt_roam_node *node, *safe; 2883 2884 spin_lock_bh(&bat_priv->tt.roam_list_lock); 2885 list_for_each_entry_safe(node, safe, &bat_priv->tt.roam_list, list) { 2886 if (!batadv_has_timed_out(node->first_time, 2887 BATADV_ROAMING_MAX_TIME)) 2888 continue; 2889 2890 list_del(&node->list); 2891 kfree(node); 2892 } 2893 spin_unlock_bh(&bat_priv->tt.roam_list_lock); 2894 } 2895 2896 /* This function checks whether the client already reached the 2897 * maximum number of possible roaming phases. In this case the ROAMING_ADV 2898 * will not be sent. 2899 * 2900 * returns true if the ROAMING_ADV can be sent, false otherwise 2901 */ 2902 static bool batadv_tt_check_roam_count(struct batadv_priv *bat_priv, 2903 uint8_t *client) 2904 { 2905 struct batadv_tt_roam_node *tt_roam_node; 2906 bool ret = false; 2907 2908 spin_lock_bh(&bat_priv->tt.roam_list_lock); 2909 /* The new tt_req will be issued only if I'm not waiting for a 2910 * reply from the same orig_node yet 2911 */ 2912 list_for_each_entry(tt_roam_node, &bat_priv->tt.roam_list, list) { 2913 if (!batadv_compare_eth(tt_roam_node->addr, client)) 2914 continue; 2915 2916 if (batadv_has_timed_out(tt_roam_node->first_time, 2917 BATADV_ROAMING_MAX_TIME)) 2918 continue; 2919 2920 if (!batadv_atomic_dec_not_zero(&tt_roam_node->counter)) 2921 /* Sorry, you roamed too many times! */ 2922 goto unlock; 2923 ret = true; 2924 break; 2925 } 2926 2927 if (!ret) { 2928 tt_roam_node = kmalloc(sizeof(*tt_roam_node), GFP_ATOMIC); 2929 if (!tt_roam_node) 2930 goto unlock; 2931 2932 tt_roam_node->first_time = jiffies; 2933 atomic_set(&tt_roam_node->counter, 2934 BATADV_ROAMING_MAX_COUNT - 1); 2935 memcpy(tt_roam_node->addr, client, ETH_ALEN); 2936 2937 list_add(&tt_roam_node->list, &bat_priv->tt.roam_list); 2938 ret = true; 2939 } 2940 2941 unlock: 2942 spin_unlock_bh(&bat_priv->tt.roam_list_lock); 2943 return ret; 2944 } 2945 2946 /** 2947 * batadv_send_roam_adv - send a roaming advertisement message 2948 * @bat_priv: the bat priv with all the soft interface information 2949 * @client: mac address of the roaming client 2950 * @vid: VLAN identifier 2951 * @orig_node: message destination 2952 * 2953 * Send a ROAMING_ADV message to the node which was previously serving this 2954 * client. This is done to inform the node that from now on all traffic destined 2955 * for this particular roamed client has to be forwarded to the sender of the 2956 * roaming message. 2957 */ 2958 static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client, 2959 unsigned short vid, 2960 struct batadv_orig_node *orig_node) 2961 { 2962 struct batadv_hard_iface *primary_if; 2963 struct batadv_tvlv_roam_adv tvlv_roam; 2964 2965 primary_if = batadv_primary_if_get_selected(bat_priv); 2966 if (!primary_if) 2967 goto out; 2968 2969 /* before going on we have to check whether the client has 2970 * already roamed to us too many times 2971 */ 2972 if (!batadv_tt_check_roam_count(bat_priv, client)) 2973 goto out; 2974 2975 batadv_dbg(BATADV_DBG_TT, bat_priv, 2976 "Sending ROAMING_ADV to %pM (client %pM, vid: %d)\n", 2977 orig_node->orig, client, BATADV_PRINT_VID(vid)); 2978 2979 batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_TX); 2980 2981 memcpy(tvlv_roam.client, client, sizeof(tvlv_roam.client)); 2982 tvlv_roam.vid = htons(vid); 2983 2984 batadv_tvlv_unicast_send(bat_priv, primary_if->net_dev->dev_addr, 2985 orig_node->orig, BATADV_TVLV_ROAM, 1, 2986 &tvlv_roam, sizeof(tvlv_roam)); 2987 2988 out: 2989 if (primary_if) 2990 batadv_hardif_free_ref(primary_if); 2991 } 2992 2993 static void batadv_tt_purge(struct work_struct *work) 2994 { 2995 struct delayed_work *delayed_work; 2996 struct batadv_priv_tt *priv_tt; 2997 struct batadv_priv *bat_priv; 2998 2999 delayed_work = container_of(work, struct delayed_work, work); 3000 priv_tt = container_of(delayed_work, struct batadv_priv_tt, work); 3001 bat_priv = container_of(priv_tt, struct batadv_priv, tt); 3002 3003 batadv_tt_local_purge(bat_priv, BATADV_TT_LOCAL_TIMEOUT); 3004 batadv_tt_global_purge(bat_priv); 3005 batadv_tt_req_purge(bat_priv); 3006 batadv_tt_roam_purge(bat_priv); 3007 3008 queue_delayed_work(batadv_event_workqueue, &bat_priv->tt.work, 3009 msecs_to_jiffies(BATADV_TT_WORK_PERIOD)); 3010 } 3011 3012 void batadv_tt_free(struct batadv_priv *bat_priv) 3013 { 3014 batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_TT, 1); 3015 batadv_tvlv_handler_unregister(bat_priv, BATADV_TVLV_TT, 1); 3016 3017 cancel_delayed_work_sync(&bat_priv->tt.work); 3018 3019 batadv_tt_local_table_free(bat_priv); 3020 batadv_tt_global_table_free(bat_priv); 3021 batadv_tt_req_list_free(bat_priv); 3022 batadv_tt_changes_list_free(bat_priv); 3023 batadv_tt_roam_list_free(bat_priv); 3024 3025 kfree(bat_priv->tt.last_changeset); 3026 } 3027 3028 /** 3029 * batadv_tt_local_set_flags - set or unset the specified flags on the local 3030 * table and possibly count them in the TT size 3031 * @bat_priv: the bat priv with all the soft interface information 3032 * @flags: the flag to switch 3033 * @enable: whether to set or unset the flag 3034 * @count: whether to increase the TT size by the number of changed entries 3035 */ 3036 static void batadv_tt_local_set_flags(struct batadv_priv *bat_priv, 3037 uint16_t flags, bool enable, bool count) 3038 { 3039 struct batadv_hashtable *hash = bat_priv->tt.local_hash; 3040 struct batadv_tt_common_entry *tt_common_entry; 3041 uint16_t changed_num = 0; 3042 struct hlist_head *head; 3043 uint32_t i; 3044 3045 if (!hash) 3046 return; 3047 3048 for (i = 0; i < hash->size; i++) { 3049 head = &hash->table[i]; 3050 3051 rcu_read_lock(); 3052 hlist_for_each_entry_rcu(tt_common_entry, 3053 head, hash_entry) { 3054 if (enable) { 3055 if ((tt_common_entry->flags & flags) == flags) 3056 continue; 3057 tt_common_entry->flags |= flags; 3058 } else { 3059 if (!(tt_common_entry->flags & flags)) 3060 continue; 3061 tt_common_entry->flags &= ~flags; 3062 } 3063 changed_num++; 3064 3065 if (!count) 3066 continue; 3067 3068 batadv_tt_local_size_inc(bat_priv, 3069 tt_common_entry->vid); 3070 } 3071 rcu_read_unlock(); 3072 } 3073 } 3074 3075 /* Purge out all the tt local entries marked with BATADV_TT_CLIENT_PENDING */ 3076 static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv) 3077 { 3078 struct batadv_hashtable *hash = bat_priv->tt.local_hash; 3079 struct batadv_tt_common_entry *tt_common; 3080 struct batadv_tt_local_entry *tt_local; 3081 struct hlist_node *node_tmp; 3082 struct hlist_head *head; 3083 spinlock_t *list_lock; /* protects write access to the hash lists */ 3084 uint32_t i; 3085 3086 if (!hash) 3087 return; 3088 3089 for (i = 0; i < hash->size; i++) { 3090 head = &hash->table[i]; 3091 list_lock = &hash->list_locks[i]; 3092 3093 spin_lock_bh(list_lock); 3094 hlist_for_each_entry_safe(tt_common, node_tmp, head, 3095 hash_entry) { 3096 if (!(tt_common->flags & BATADV_TT_CLIENT_PENDING)) 3097 continue; 3098 3099 batadv_dbg(BATADV_DBG_TT, bat_priv, 3100 "Deleting local tt entry (%pM, vid: %d): pending\n", 3101 tt_common->addr, 3102 BATADV_PRINT_VID(tt_common->vid)); 3103 3104 batadv_tt_local_size_dec(bat_priv, tt_common->vid); 3105 hlist_del_rcu(&tt_common->hash_entry); 3106 tt_local = container_of(tt_common, 3107 struct batadv_tt_local_entry, 3108 common); 3109 batadv_tt_local_entry_free_ref(tt_local); 3110 } 3111 spin_unlock_bh(list_lock); 3112 } 3113 } 3114 3115 /** 3116 * batadv_tt_local_commit_changes_nolock - commit all pending local tt changes 3117 * which have been queued in the time since the last commit 3118 * @bat_priv: the bat priv with all the soft interface information 3119 * 3120 * Caller must hold tt->commit_lock. 3121 */ 3122 static void batadv_tt_local_commit_changes_nolock(struct batadv_priv *bat_priv) 3123 { 3124 if (atomic_read(&bat_priv->tt.local_changes) < 1) { 3125 if (!batadv_atomic_dec_not_zero(&bat_priv->tt.ogm_append_cnt)) 3126 batadv_tt_tvlv_container_update(bat_priv); 3127 return; 3128 } 3129 3130 batadv_tt_local_set_flags(bat_priv, BATADV_TT_CLIENT_NEW, false, true); 3131 3132 batadv_tt_local_purge_pending_clients(bat_priv); 3133 batadv_tt_local_update_crc(bat_priv); 3134 3135 /* Increment the TTVN only once per OGM interval */ 3136 atomic_inc(&bat_priv->tt.vn); 3137 batadv_dbg(BATADV_DBG_TT, bat_priv, 3138 "Local changes committed, updating to ttvn %u\n", 3139 (uint8_t)atomic_read(&bat_priv->tt.vn)); 3140 3141 /* reset the sending counter */ 3142 atomic_set(&bat_priv->tt.ogm_append_cnt, BATADV_TT_OGM_APPEND_MAX); 3143 batadv_tt_tvlv_container_update(bat_priv); 3144 } 3145 3146 /** 3147 * batadv_tt_local_commit_changes - commit all pending local tt changes which 3148 * have been queued in the time since the last commit 3149 * @bat_priv: the bat priv with all the soft interface information 3150 */ 3151 void batadv_tt_local_commit_changes(struct batadv_priv *bat_priv) 3152 { 3153 spin_lock_bh(&bat_priv->tt.commit_lock); 3154 batadv_tt_local_commit_changes_nolock(bat_priv); 3155 spin_unlock_bh(&bat_priv->tt.commit_lock); 3156 } 3157 3158 bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, uint8_t *src, 3159 uint8_t *dst, unsigned short vid) 3160 { 3161 struct batadv_tt_local_entry *tt_local_entry = NULL; 3162 struct batadv_tt_global_entry *tt_global_entry = NULL; 3163 struct batadv_softif_vlan *vlan; 3164 bool ret = false; 3165 3166 vlan = batadv_softif_vlan_get(bat_priv, vid); 3167 if (!vlan || !atomic_read(&vlan->ap_isolation)) 3168 goto out; 3169 3170 tt_local_entry = batadv_tt_local_hash_find(bat_priv, dst, vid); 3171 if (!tt_local_entry) 3172 goto out; 3173 3174 tt_global_entry = batadv_tt_global_hash_find(bat_priv, src, vid); 3175 if (!tt_global_entry) 3176 goto out; 3177 3178 if (!_batadv_is_ap_isolated(tt_local_entry, tt_global_entry)) 3179 goto out; 3180 3181 ret = true; 3182 3183 out: 3184 if (vlan) 3185 batadv_softif_vlan_free_ref(vlan); 3186 if (tt_global_entry) 3187 batadv_tt_global_entry_free_ref(tt_global_entry); 3188 if (tt_local_entry) 3189 batadv_tt_local_entry_free_ref(tt_local_entry); 3190 return ret; 3191 } 3192 3193 /** 3194 * batadv_tt_update_orig - update global translation table with new tt 3195 * information received via ogms 3196 * @bat_priv: the bat priv with all the soft interface information 3197 * @orig: the orig_node of the ogm 3198 * @tt_vlan: pointer to the first tvlv VLAN entry 3199 * @tt_num_vlan: number of tvlv VLAN entries 3200 * @tt_change: pointer to the first entry in the TT buffer 3201 * @tt_num_changes: number of tt changes inside the tt buffer 3202 * @ttvn: translation table version number of this changeset 3203 * @tt_crc: crc32 checksum of orig node's translation table 3204 */ 3205 static void batadv_tt_update_orig(struct batadv_priv *bat_priv, 3206 struct batadv_orig_node *orig_node, 3207 const void *tt_buff, uint16_t tt_num_vlan, 3208 struct batadv_tvlv_tt_change *tt_change, 3209 uint16_t tt_num_changes, uint8_t ttvn) 3210 { 3211 uint8_t orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn); 3212 struct batadv_tvlv_tt_vlan_data *tt_vlan; 3213 bool full_table = true; 3214 3215 tt_vlan = (struct batadv_tvlv_tt_vlan_data *)tt_buff; 3216 /* orig table not initialised AND first diff is in the OGM OR the ttvn 3217 * increased by one -> we can apply the attached changes 3218 */ 3219 if ((!orig_node->tt_initialised && ttvn == 1) || 3220 ttvn - orig_ttvn == 1) { 3221 /* the OGM could not contain the changes due to their size or 3222 * because they have already been sent BATADV_TT_OGM_APPEND_MAX 3223 * times. 3224 * In this case send a tt request 3225 */ 3226 if (!tt_num_changes) { 3227 full_table = false; 3228 goto request_table; 3229 } 3230 3231 spin_lock_bh(&orig_node->tt_lock); 3232 3233 batadv_tt_update_changes(bat_priv, orig_node, tt_num_changes, 3234 ttvn, tt_change); 3235 3236 /* Even if we received the precomputed crc with the OGM, we 3237 * prefer to recompute it to spot any possible inconsistency 3238 * in the global table 3239 */ 3240 batadv_tt_global_update_crc(bat_priv, orig_node); 3241 3242 spin_unlock_bh(&orig_node->tt_lock); 3243 3244 /* The ttvn alone is not enough to guarantee consistency 3245 * because a single value could represent different states 3246 * (due to the wrap around). Thus a node has to check whether 3247 * the resulting table (after applying the changes) is still 3248 * consistent or not. E.g. a node could disconnect while its 3249 * ttvn is X and reconnect on ttvn = X + TTVN_MAX: in this case 3250 * checking the CRC value is mandatory to detect the 3251 * inconsistency 3252 */ 3253 if (!batadv_tt_global_check_crc(orig_node, tt_vlan, 3254 tt_num_vlan)) 3255 goto request_table; 3256 } else { 3257 /* if we missed more than one change or our tables are not 3258 * in sync anymore -> request fresh tt data 3259 */ 3260 if (!orig_node->tt_initialised || ttvn != orig_ttvn || 3261 !batadv_tt_global_check_crc(orig_node, tt_vlan, 3262 tt_num_vlan)) { 3263 request_table: 3264 batadv_dbg(BATADV_DBG_TT, bat_priv, 3265 "TT inconsistency for %pM. Need to retrieve the correct information (ttvn: %u last_ttvn: %u num_changes: %u)\n", 3266 orig_node->orig, ttvn, orig_ttvn, 3267 tt_num_changes); 3268 batadv_send_tt_request(bat_priv, orig_node, ttvn, 3269 tt_vlan, tt_num_vlan, 3270 full_table); 3271 return; 3272 } 3273 } 3274 } 3275 3276 /** 3277 * batadv_tt_global_client_is_roaming - check if a client is marked as roaming 3278 * @bat_priv: the bat priv with all the soft interface information 3279 * @addr: the mac address of the client to check 3280 * @vid: VLAN identifier 3281 * 3282 * Returns true if we know that the client has moved from its old originator 3283 * to another one. This entry is still kept for consistency purposes and will be 3284 * deleted later by a DEL or because of timeout 3285 */ 3286 bool batadv_tt_global_client_is_roaming(struct batadv_priv *bat_priv, 3287 uint8_t *addr, unsigned short vid) 3288 { 3289 struct batadv_tt_global_entry *tt_global_entry; 3290 bool ret = false; 3291 3292 tt_global_entry = batadv_tt_global_hash_find(bat_priv, addr, vid); 3293 if (!tt_global_entry) 3294 goto out; 3295 3296 ret = tt_global_entry->common.flags & BATADV_TT_CLIENT_ROAM; 3297 batadv_tt_global_entry_free_ref(tt_global_entry); 3298 out: 3299 return ret; 3300 } 3301 3302 /** 3303 * batadv_tt_local_client_is_roaming - tells whether the client is roaming 3304 * @bat_priv: the bat priv with all the soft interface information 3305 * @addr: the mac address of the local client to query 3306 * @vid: VLAN identifier 3307 * 3308 * Returns true if the local client is known to be roaming (it is not served by 3309 * this node anymore) or not. If yes, the client is still present in the table 3310 * to keep the latter consistent with the node TTVN 3311 */ 3312 bool batadv_tt_local_client_is_roaming(struct batadv_priv *bat_priv, 3313 uint8_t *addr, unsigned short vid) 3314 { 3315 struct batadv_tt_local_entry *tt_local_entry; 3316 bool ret = false; 3317 3318 tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid); 3319 if (!tt_local_entry) 3320 goto out; 3321 3322 ret = tt_local_entry->common.flags & BATADV_TT_CLIENT_ROAM; 3323 batadv_tt_local_entry_free_ref(tt_local_entry); 3324 out: 3325 return ret; 3326 } 3327 3328 bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv, 3329 struct batadv_orig_node *orig_node, 3330 const unsigned char *addr, 3331 unsigned short vid) 3332 { 3333 bool ret = false; 3334 3335 if (!batadv_tt_global_add(bat_priv, orig_node, addr, vid, 3336 BATADV_TT_CLIENT_TEMP, 3337 atomic_read(&orig_node->last_ttvn))) 3338 goto out; 3339 3340 batadv_dbg(BATADV_DBG_TT, bat_priv, 3341 "Added temporary global client (addr: %pM, vid: %d, orig: %pM)\n", 3342 addr, BATADV_PRINT_VID(vid), orig_node->orig); 3343 ret = true; 3344 out: 3345 return ret; 3346 } 3347 3348 /** 3349 * batadv_tt_local_resize_to_mtu - resize the local translation table fit the 3350 * maximum packet size that can be transported through the mesh 3351 * @soft_iface: netdev struct of the mesh interface 3352 * 3353 * Remove entries older than 'timeout' and half timeout if more entries need 3354 * to be removed. 3355 */ 3356 void batadv_tt_local_resize_to_mtu(struct net_device *soft_iface) 3357 { 3358 struct batadv_priv *bat_priv = netdev_priv(soft_iface); 3359 int packet_size_max = atomic_read(&bat_priv->packet_size_max); 3360 int table_size, timeout = BATADV_TT_LOCAL_TIMEOUT / 2; 3361 bool reduced = false; 3362 3363 spin_lock_bh(&bat_priv->tt.commit_lock); 3364 3365 while (true) { 3366 table_size = batadv_tt_local_table_transmit_size(bat_priv); 3367 if (packet_size_max >= table_size) 3368 break; 3369 3370 batadv_tt_local_purge(bat_priv, timeout); 3371 batadv_tt_local_purge_pending_clients(bat_priv); 3372 3373 timeout /= 2; 3374 reduced = true; 3375 net_ratelimited_function(batadv_info, soft_iface, 3376 "Forced to purge local tt entries to fit new maximum fragment MTU (%i)\n", 3377 packet_size_max); 3378 } 3379 3380 /* commit these changes immediately, to avoid synchronization problem 3381 * with the TTVN 3382 */ 3383 if (reduced) 3384 batadv_tt_local_commit_changes_nolock(bat_priv); 3385 3386 spin_unlock_bh(&bat_priv->tt.commit_lock); 3387 } 3388 3389 /** 3390 * batadv_tt_tvlv_ogm_handler_v1 - process incoming tt tvlv container 3391 * @bat_priv: the bat priv with all the soft interface information 3392 * @orig: the orig_node of the ogm 3393 * @flags: flags indicating the tvlv state (see batadv_tvlv_handler_flags) 3394 * @tvlv_value: tvlv buffer containing the gateway data 3395 * @tvlv_value_len: tvlv buffer length 3396 */ 3397 static void batadv_tt_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv, 3398 struct batadv_orig_node *orig, 3399 uint8_t flags, void *tvlv_value, 3400 uint16_t tvlv_value_len) 3401 { 3402 struct batadv_tvlv_tt_vlan_data *tt_vlan; 3403 struct batadv_tvlv_tt_change *tt_change; 3404 struct batadv_tvlv_tt_data *tt_data; 3405 uint16_t num_entries, num_vlan; 3406 3407 if (tvlv_value_len < sizeof(*tt_data)) 3408 return; 3409 3410 tt_data = (struct batadv_tvlv_tt_data *)tvlv_value; 3411 tvlv_value_len -= sizeof(*tt_data); 3412 3413 num_vlan = ntohs(tt_data->num_vlan); 3414 3415 if (tvlv_value_len < sizeof(*tt_vlan) * num_vlan) 3416 return; 3417 3418 tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(tt_data + 1); 3419 tt_change = (struct batadv_tvlv_tt_change *)(tt_vlan + num_vlan); 3420 tvlv_value_len -= sizeof(*tt_vlan) * num_vlan; 3421 3422 num_entries = batadv_tt_entries(tvlv_value_len); 3423 3424 batadv_tt_update_orig(bat_priv, orig, tt_vlan, num_vlan, tt_change, 3425 num_entries, tt_data->ttvn); 3426 } 3427 3428 /** 3429 * batadv_tt_tvlv_unicast_handler_v1 - process incoming (unicast) tt tvlv 3430 * container 3431 * @bat_priv: the bat priv with all the soft interface information 3432 * @src: mac address of tt tvlv sender 3433 * @dst: mac address of tt tvlv recipient 3434 * @tvlv_value: tvlv buffer containing the tt data 3435 * @tvlv_value_len: tvlv buffer length 3436 * 3437 * Returns NET_RX_DROP if the tt tvlv is to be re-routed, NET_RX_SUCCESS 3438 * otherwise. 3439 */ 3440 static int batadv_tt_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv, 3441 uint8_t *src, uint8_t *dst, 3442 void *tvlv_value, 3443 uint16_t tvlv_value_len) 3444 { 3445 struct batadv_tvlv_tt_data *tt_data; 3446 uint16_t tt_vlan_len, tt_num_entries; 3447 char tt_flag; 3448 bool ret; 3449 3450 if (tvlv_value_len < sizeof(*tt_data)) 3451 return NET_RX_SUCCESS; 3452 3453 tt_data = (struct batadv_tvlv_tt_data *)tvlv_value; 3454 tvlv_value_len -= sizeof(*tt_data); 3455 3456 tt_vlan_len = sizeof(struct batadv_tvlv_tt_vlan_data); 3457 tt_vlan_len *= ntohs(tt_data->num_vlan); 3458 3459 if (tvlv_value_len < tt_vlan_len) 3460 return NET_RX_SUCCESS; 3461 3462 tvlv_value_len -= tt_vlan_len; 3463 tt_num_entries = batadv_tt_entries(tvlv_value_len); 3464 3465 switch (tt_data->flags & BATADV_TT_DATA_TYPE_MASK) { 3466 case BATADV_TT_REQUEST: 3467 batadv_inc_counter(bat_priv, BATADV_CNT_TT_REQUEST_RX); 3468 3469 /* If this node cannot provide a TT response the tt_request is 3470 * forwarded 3471 */ 3472 ret = batadv_send_tt_response(bat_priv, tt_data, src, dst); 3473 if (!ret) { 3474 if (tt_data->flags & BATADV_TT_FULL_TABLE) 3475 tt_flag = 'F'; 3476 else 3477 tt_flag = '.'; 3478 3479 batadv_dbg(BATADV_DBG_TT, bat_priv, 3480 "Routing TT_REQUEST to %pM [%c]\n", 3481 dst, tt_flag); 3482 /* tvlv API will re-route the packet */ 3483 return NET_RX_DROP; 3484 } 3485 break; 3486 case BATADV_TT_RESPONSE: 3487 batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_RX); 3488 3489 if (batadv_is_my_mac(bat_priv, dst)) { 3490 batadv_handle_tt_response(bat_priv, tt_data, 3491 src, tt_num_entries); 3492 return NET_RX_SUCCESS; 3493 } 3494 3495 if (tt_data->flags & BATADV_TT_FULL_TABLE) 3496 tt_flag = 'F'; 3497 else 3498 tt_flag = '.'; 3499 3500 batadv_dbg(BATADV_DBG_TT, bat_priv, 3501 "Routing TT_RESPONSE to %pM [%c]\n", dst, tt_flag); 3502 3503 /* tvlv API will re-route the packet */ 3504 return NET_RX_DROP; 3505 } 3506 3507 return NET_RX_SUCCESS; 3508 } 3509 3510 /** 3511 * batadv_roam_tvlv_unicast_handler_v1 - process incoming tt roam tvlv container 3512 * @bat_priv: the bat priv with all the soft interface information 3513 * @src: mac address of tt tvlv sender 3514 * @dst: mac address of tt tvlv recipient 3515 * @tvlv_value: tvlv buffer containing the tt data 3516 * @tvlv_value_len: tvlv buffer length 3517 * 3518 * Returns NET_RX_DROP if the tt roam tvlv is to be re-routed, NET_RX_SUCCESS 3519 * otherwise. 3520 */ 3521 static int batadv_roam_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv, 3522 uint8_t *src, uint8_t *dst, 3523 void *tvlv_value, 3524 uint16_t tvlv_value_len) 3525 { 3526 struct batadv_tvlv_roam_adv *roaming_adv; 3527 struct batadv_orig_node *orig_node = NULL; 3528 3529 /* If this node is not the intended recipient of the 3530 * roaming advertisement the packet is forwarded 3531 * (the tvlv API will re-route the packet). 3532 */ 3533 if (!batadv_is_my_mac(bat_priv, dst)) 3534 return NET_RX_DROP; 3535 3536 if (tvlv_value_len < sizeof(*roaming_adv)) 3537 goto out; 3538 3539 orig_node = batadv_orig_hash_find(bat_priv, src); 3540 if (!orig_node) 3541 goto out; 3542 3543 batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_RX); 3544 roaming_adv = (struct batadv_tvlv_roam_adv *)tvlv_value; 3545 3546 batadv_dbg(BATADV_DBG_TT, bat_priv, 3547 "Received ROAMING_ADV from %pM (client %pM)\n", 3548 src, roaming_adv->client); 3549 3550 batadv_tt_global_add(bat_priv, orig_node, roaming_adv->client, 3551 ntohs(roaming_adv->vid), BATADV_TT_CLIENT_ROAM, 3552 atomic_read(&orig_node->last_ttvn) + 1); 3553 3554 out: 3555 if (orig_node) 3556 batadv_orig_node_free_ref(orig_node); 3557 return NET_RX_SUCCESS; 3558 } 3559 3560 /** 3561 * batadv_tt_init - initialise the translation table internals 3562 * @bat_priv: the bat priv with all the soft interface information 3563 * 3564 * Return 0 on success or negative error number in case of failure. 3565 */ 3566 int batadv_tt_init(struct batadv_priv *bat_priv) 3567 { 3568 int ret; 3569 3570 /* synchronized flags must be remote */ 3571 BUILD_BUG_ON(!(BATADV_TT_SYNC_MASK & BATADV_TT_REMOTE_MASK)); 3572 3573 ret = batadv_tt_local_init(bat_priv); 3574 if (ret < 0) 3575 return ret; 3576 3577 ret = batadv_tt_global_init(bat_priv); 3578 if (ret < 0) 3579 return ret; 3580 3581 batadv_tvlv_handler_register(bat_priv, batadv_tt_tvlv_ogm_handler_v1, 3582 batadv_tt_tvlv_unicast_handler_v1, 3583 BATADV_TVLV_TT, 1, BATADV_NO_FLAGS); 3584 3585 batadv_tvlv_handler_register(bat_priv, NULL, 3586 batadv_roam_tvlv_unicast_handler_v1, 3587 BATADV_TVLV_ROAM, 1, BATADV_NO_FLAGS); 3588 3589 INIT_DELAYED_WORK(&bat_priv->tt.work, batadv_tt_purge); 3590 queue_delayed_work(batadv_event_workqueue, &bat_priv->tt.work, 3591 msecs_to_jiffies(BATADV_TT_WORK_PERIOD)); 3592 3593 return 1; 3594 } 3595 3596 /** 3597 * batadv_tt_global_is_isolated - check if a client is marked as isolated 3598 * @bat_priv: the bat priv with all the soft interface information 3599 * @addr: the mac address of the client 3600 * @vid: the identifier of the VLAN where this client is connected 3601 * 3602 * Returns true if the client is marked with the TT_CLIENT_ISOLA flag, false 3603 * otherwise 3604 */ 3605 bool batadv_tt_global_is_isolated(struct batadv_priv *bat_priv, 3606 const uint8_t *addr, unsigned short vid) 3607 { 3608 struct batadv_tt_global_entry *tt; 3609 bool ret; 3610 3611 tt = batadv_tt_global_hash_find(bat_priv, addr, vid); 3612 if (!tt) 3613 return false; 3614 3615 ret = tt->common.flags & BATADV_TT_CLIENT_ISOLA; 3616 3617 batadv_tt_global_entry_free_ref(tt); 3618 3619 return ret; 3620 } 3621