at v3.12-rc7 938 lines 26 kB view raw
1/* Copyright (C) 2008-2013 B.A.T.M.A.N. contributors: 2 * 3 * Simon Wunderlich 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of version 2 of the GNU General Public 7 * License as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 17 * 02110-1301, USA 18 */ 19 20#include "main.h" 21#include "send.h" 22#include "translation-table.h" 23#include "vis.h" 24#include "soft-interface.h" 25#include "hard-interface.h" 26#include "hash.h" 27#include "originator.h" 28 29#define BATADV_MAX_VIS_PACKET_SIZE 1000 30 31/* hash class keys */ 32static struct lock_class_key batadv_vis_hash_lock_class_key; 33 34/* free the info */ 35static void batadv_free_info(struct kref *ref) 36{ 37 struct batadv_vis_info *info; 38 struct batadv_priv *bat_priv; 39 struct batadv_vis_recvlist_node *entry, *tmp; 40 41 info = container_of(ref, struct batadv_vis_info, refcount); 42 bat_priv = info->bat_priv; 43 44 list_del_init(&info->send_list); 45 spin_lock_bh(&bat_priv->vis.list_lock); 46 list_for_each_entry_safe(entry, tmp, &info->recv_list, list) { 47 list_del(&entry->list); 48 kfree(entry); 49 } 50 51 spin_unlock_bh(&bat_priv->vis.list_lock); 52 kfree_skb(info->skb_packet); 53 kfree(info); 54} 55 56/* Compare two vis packets, used by the hashing algorithm */ 57static int batadv_vis_info_cmp(const struct hlist_node *node, const void *data2) 58{ 59 const struct batadv_vis_info *d1, *d2; 60 const struct batadv_vis_packet *p1, *p2; 61 62 d1 = container_of(node, struct batadv_vis_info, hash_entry); 63 d2 = data2; 64 p1 = (struct batadv_vis_packet *)d1->skb_packet->data; 65 p2 = (struct batadv_vis_packet *)d2->skb_packet->data; 66 return batadv_compare_eth(p1->vis_orig, p2->vis_orig); 67} 68 69/* hash function to choose an entry in a hash table of given size 70 * hash algorithm from http://en.wikipedia.org/wiki/Hash_table 71 */ 72static uint32_t batadv_vis_info_choose(const void *data, uint32_t size) 73{ 74 const struct batadv_vis_info *vis_info = data; 75 const struct batadv_vis_packet *packet; 76 const unsigned char *key; 77 uint32_t hash = 0; 78 size_t i; 79 80 packet = (struct batadv_vis_packet *)vis_info->skb_packet->data; 81 key = packet->vis_orig; 82 for (i = 0; i < ETH_ALEN; i++) { 83 hash += key[i]; 84 hash += (hash << 10); 85 hash ^= (hash >> 6); 86 } 87 88 hash += (hash << 3); 89 hash ^= (hash >> 11); 90 hash += (hash << 15); 91 92 return hash % size; 93} 94 95static struct batadv_vis_info * 96batadv_vis_hash_find(struct batadv_priv *bat_priv, const void *data) 97{ 98 struct batadv_hashtable *hash = bat_priv->vis.hash; 99 struct hlist_head *head; 100 struct batadv_vis_info *vis_info, *vis_info_tmp = NULL; 101 uint32_t index; 102 103 if (!hash) 104 return NULL; 105 106 index = batadv_vis_info_choose(data, hash->size); 107 head = &hash->table[index]; 108 109 rcu_read_lock(); 110 hlist_for_each_entry_rcu(vis_info, head, hash_entry) { 111 if (!batadv_vis_info_cmp(&vis_info->hash_entry, data)) 112 continue; 113 114 vis_info_tmp = vis_info; 115 break; 116 } 117 rcu_read_unlock(); 118 119 return vis_info_tmp; 120} 121 122/* insert interface to the list of interfaces of one originator, if it 123 * does not already exist in the list 124 */ 125static void batadv_vis_data_insert_interface(const uint8_t *interface, 126 struct hlist_head *if_list, 127 bool primary) 128{ 129 struct batadv_vis_if_list_entry *entry; 130 131 hlist_for_each_entry(entry, if_list, list) { 132 if (batadv_compare_eth(entry->addr, interface)) 133 return; 134 } 135 136 /* it's a new address, add it to the list */ 137 entry = kmalloc(sizeof(*entry), GFP_ATOMIC); 138 if (!entry) 139 return; 140 memcpy(entry->addr, interface, ETH_ALEN); 141 entry->primary = primary; 142 hlist_add_head(&entry->list, if_list); 143} 144 145static void batadv_vis_data_read_prim_sec(struct seq_file *seq, 146 const struct hlist_head *if_list) 147{ 148 struct batadv_vis_if_list_entry *entry; 149 150 hlist_for_each_entry(entry, if_list, list) { 151 if (entry->primary) 152 seq_puts(seq, "PRIMARY, "); 153 else 154 seq_printf(seq, "SEC %pM, ", entry->addr); 155 } 156} 157 158/* read an entry */ 159static ssize_t 160batadv_vis_data_read_entry(struct seq_file *seq, 161 const struct batadv_vis_info_entry *entry, 162 const uint8_t *src, bool primary) 163{ 164 if (primary && entry->quality == 0) 165 return seq_printf(seq, "TT %pM, ", entry->dest); 166 else if (batadv_compare_eth(entry->src, src)) 167 return seq_printf(seq, "TQ %pM %d, ", entry->dest, 168 entry->quality); 169 170 return 0; 171} 172 173static void 174batadv_vis_data_insert_interfaces(struct hlist_head *list, 175 struct batadv_vis_packet *packet, 176 struct batadv_vis_info_entry *entries) 177{ 178 int i; 179 180 for (i = 0; i < packet->entries; i++) { 181 if (entries[i].quality == 0) 182 continue; 183 184 if (batadv_compare_eth(entries[i].src, packet->vis_orig)) 185 continue; 186 187 batadv_vis_data_insert_interface(entries[i].src, list, false); 188 } 189} 190 191static void batadv_vis_data_read_entries(struct seq_file *seq, 192 struct hlist_head *list, 193 struct batadv_vis_packet *packet, 194 struct batadv_vis_info_entry *entries) 195{ 196 int i; 197 struct batadv_vis_if_list_entry *entry; 198 199 hlist_for_each_entry(entry, list, list) { 200 seq_printf(seq, "%pM,", entry->addr); 201 202 for (i = 0; i < packet->entries; i++) 203 batadv_vis_data_read_entry(seq, &entries[i], 204 entry->addr, entry->primary); 205 206 /* add primary/secondary records */ 207 if (batadv_compare_eth(entry->addr, packet->vis_orig)) 208 batadv_vis_data_read_prim_sec(seq, list); 209 210 seq_puts(seq, "\n"); 211 } 212} 213 214static void batadv_vis_seq_print_text_bucket(struct seq_file *seq, 215 const struct hlist_head *head) 216{ 217 struct batadv_vis_info *info; 218 struct batadv_vis_packet *packet; 219 uint8_t *entries_pos; 220 struct batadv_vis_info_entry *entries; 221 struct batadv_vis_if_list_entry *entry; 222 struct hlist_node *n; 223 224 HLIST_HEAD(vis_if_list); 225 226 hlist_for_each_entry_rcu(info, head, hash_entry) { 227 packet = (struct batadv_vis_packet *)info->skb_packet->data; 228 entries_pos = (uint8_t *)packet + sizeof(*packet); 229 entries = (struct batadv_vis_info_entry *)entries_pos; 230 231 batadv_vis_data_insert_interface(packet->vis_orig, &vis_if_list, 232 true); 233 batadv_vis_data_insert_interfaces(&vis_if_list, packet, 234 entries); 235 batadv_vis_data_read_entries(seq, &vis_if_list, packet, 236 entries); 237 238 hlist_for_each_entry_safe(entry, n, &vis_if_list, list) { 239 hlist_del(&entry->list); 240 kfree(entry); 241 } 242 } 243} 244 245int batadv_vis_seq_print_text(struct seq_file *seq, void *offset) 246{ 247 struct batadv_hard_iface *primary_if; 248 struct hlist_head *head; 249 struct net_device *net_dev = (struct net_device *)seq->private; 250 struct batadv_priv *bat_priv = netdev_priv(net_dev); 251 struct batadv_hashtable *hash = bat_priv->vis.hash; 252 uint32_t i; 253 int ret = 0; 254 int vis_server = atomic_read(&bat_priv->vis_mode); 255 256 primary_if = batadv_primary_if_get_selected(bat_priv); 257 if (!primary_if) 258 goto out; 259 260 if (vis_server == BATADV_VIS_TYPE_CLIENT_UPDATE) 261 goto out; 262 263 spin_lock_bh(&bat_priv->vis.hash_lock); 264 for (i = 0; i < hash->size; i++) { 265 head = &hash->table[i]; 266 batadv_vis_seq_print_text_bucket(seq, head); 267 } 268 spin_unlock_bh(&bat_priv->vis.hash_lock); 269 270out: 271 if (primary_if) 272 batadv_hardif_free_ref(primary_if); 273 return ret; 274} 275 276/* add the info packet to the send list, if it was not 277 * already linked in. 278 */ 279static void batadv_send_list_add(struct batadv_priv *bat_priv, 280 struct batadv_vis_info *info) 281{ 282 if (list_empty(&info->send_list)) { 283 kref_get(&info->refcount); 284 list_add_tail(&info->send_list, &bat_priv->vis.send_list); 285 } 286} 287 288/* delete the info packet from the send list, if it was 289 * linked in. 290 */ 291static void batadv_send_list_del(struct batadv_vis_info *info) 292{ 293 if (!list_empty(&info->send_list)) { 294 list_del_init(&info->send_list); 295 kref_put(&info->refcount, batadv_free_info); 296 } 297} 298 299/* tries to add one entry to the receive list. */ 300static void batadv_recv_list_add(struct batadv_priv *bat_priv, 301 struct list_head *recv_list, const char *mac) 302{ 303 struct batadv_vis_recvlist_node *entry; 304 305 entry = kmalloc(sizeof(*entry), GFP_ATOMIC); 306 if (!entry) 307 return; 308 309 memcpy(entry->mac, mac, ETH_ALEN); 310 spin_lock_bh(&bat_priv->vis.list_lock); 311 list_add_tail(&entry->list, recv_list); 312 spin_unlock_bh(&bat_priv->vis.list_lock); 313} 314 315/* returns 1 if this mac is in the recv_list */ 316static int batadv_recv_list_is_in(struct batadv_priv *bat_priv, 317 const struct list_head *recv_list, 318 const char *mac) 319{ 320 const struct batadv_vis_recvlist_node *entry; 321 322 spin_lock_bh(&bat_priv->vis.list_lock); 323 list_for_each_entry(entry, recv_list, list) { 324 if (batadv_compare_eth(entry->mac, mac)) { 325 spin_unlock_bh(&bat_priv->vis.list_lock); 326 return 1; 327 } 328 } 329 spin_unlock_bh(&bat_priv->vis.list_lock); 330 return 0; 331} 332 333/* try to add the packet to the vis_hash. return NULL if invalid (e.g. too old, 334 * broken.. ). vis hash must be locked outside. is_new is set when the packet 335 * is newer than old entries in the hash. 336 */ 337static struct batadv_vis_info * 338batadv_add_packet(struct batadv_priv *bat_priv, 339 struct batadv_vis_packet *vis_packet, int vis_info_len, 340 int *is_new, int make_broadcast) 341{ 342 struct batadv_vis_info *info, *old_info; 343 struct batadv_vis_packet *search_packet, *old_packet; 344 struct batadv_vis_info search_elem; 345 struct batadv_vis_packet *packet; 346 struct sk_buff *tmp_skb; 347 int hash_added; 348 size_t len; 349 size_t max_entries; 350 351 *is_new = 0; 352 /* sanity check */ 353 if (!bat_priv->vis.hash) 354 return NULL; 355 356 /* see if the packet is already in vis_hash */ 357 search_elem.skb_packet = dev_alloc_skb(sizeof(*search_packet)); 358 if (!search_elem.skb_packet) 359 return NULL; 360 len = sizeof(*search_packet); 361 tmp_skb = search_elem.skb_packet; 362 search_packet = (struct batadv_vis_packet *)skb_put(tmp_skb, len); 363 364 memcpy(search_packet->vis_orig, vis_packet->vis_orig, ETH_ALEN); 365 old_info = batadv_vis_hash_find(bat_priv, &search_elem); 366 kfree_skb(search_elem.skb_packet); 367 368 if (old_info) { 369 tmp_skb = old_info->skb_packet; 370 old_packet = (struct batadv_vis_packet *)tmp_skb->data; 371 if (!batadv_seq_after(ntohl(vis_packet->seqno), 372 ntohl(old_packet->seqno))) { 373 if (old_packet->seqno == vis_packet->seqno) { 374 batadv_recv_list_add(bat_priv, 375 &old_info->recv_list, 376 vis_packet->sender_orig); 377 return old_info; 378 } else { 379 /* newer packet is already in hash. */ 380 return NULL; 381 } 382 } 383 /* remove old entry */ 384 batadv_hash_remove(bat_priv->vis.hash, batadv_vis_info_cmp, 385 batadv_vis_info_choose, old_info); 386 batadv_send_list_del(old_info); 387 kref_put(&old_info->refcount, batadv_free_info); 388 } 389 390 info = kmalloc(sizeof(*info), GFP_ATOMIC); 391 if (!info) 392 return NULL; 393 394 len = sizeof(*packet) + vis_info_len; 395 info->skb_packet = netdev_alloc_skb_ip_align(NULL, len + ETH_HLEN); 396 if (!info->skb_packet) { 397 kfree(info); 398 return NULL; 399 } 400 info->skb_packet->priority = TC_PRIO_CONTROL; 401 skb_reserve(info->skb_packet, ETH_HLEN); 402 packet = (struct batadv_vis_packet *)skb_put(info->skb_packet, len); 403 404 kref_init(&info->refcount); 405 INIT_LIST_HEAD(&info->send_list); 406 INIT_LIST_HEAD(&info->recv_list); 407 info->first_seen = jiffies; 408 info->bat_priv = bat_priv; 409 memcpy(packet, vis_packet, len); 410 411 /* initialize and add new packet. */ 412 *is_new = 1; 413 414 /* Make it a broadcast packet, if required */ 415 if (make_broadcast) 416 memcpy(packet->target_orig, batadv_broadcast_addr, ETH_ALEN); 417 418 /* repair if entries is longer than packet. */ 419 max_entries = vis_info_len / sizeof(struct batadv_vis_info_entry); 420 if (packet->entries > max_entries) 421 packet->entries = max_entries; 422 423 batadv_recv_list_add(bat_priv, &info->recv_list, packet->sender_orig); 424 425 /* try to add it */ 426 hash_added = batadv_hash_add(bat_priv->vis.hash, batadv_vis_info_cmp, 427 batadv_vis_info_choose, info, 428 &info->hash_entry); 429 if (hash_added != 0) { 430 /* did not work (for some reason) */ 431 kref_put(&info->refcount, batadv_free_info); 432 info = NULL; 433 } 434 435 return info; 436} 437 438/* handle the server sync packet, forward if needed. */ 439void batadv_receive_server_sync_packet(struct batadv_priv *bat_priv, 440 struct batadv_vis_packet *vis_packet, 441 int vis_info_len) 442{ 443 struct batadv_vis_info *info; 444 int is_new, make_broadcast; 445 int vis_server = atomic_read(&bat_priv->vis_mode); 446 447 make_broadcast = (vis_server == BATADV_VIS_TYPE_SERVER_SYNC); 448 449 spin_lock_bh(&bat_priv->vis.hash_lock); 450 info = batadv_add_packet(bat_priv, vis_packet, vis_info_len, 451 &is_new, make_broadcast); 452 if (!info) 453 goto end; 454 455 /* only if we are server ourselves and packet is newer than the one in 456 * hash. 457 */ 458 if (vis_server == BATADV_VIS_TYPE_SERVER_SYNC && is_new) 459 batadv_send_list_add(bat_priv, info); 460end: 461 spin_unlock_bh(&bat_priv->vis.hash_lock); 462} 463 464/* handle an incoming client update packet and schedule forward if needed. */ 465void batadv_receive_client_update_packet(struct batadv_priv *bat_priv, 466 struct batadv_vis_packet *vis_packet, 467 int vis_info_len) 468{ 469 struct batadv_vis_info *info; 470 struct batadv_vis_packet *packet; 471 int is_new; 472 int vis_server = atomic_read(&bat_priv->vis_mode); 473 int are_target = 0; 474 475 /* clients shall not broadcast. */ 476 if (is_broadcast_ether_addr(vis_packet->target_orig)) 477 return; 478 479 /* Are we the target for this VIS packet? */ 480 if (vis_server == BATADV_VIS_TYPE_SERVER_SYNC && 481 batadv_is_my_mac(bat_priv, vis_packet->target_orig)) 482 are_target = 1; 483 484 spin_lock_bh(&bat_priv->vis.hash_lock); 485 info = batadv_add_packet(bat_priv, vis_packet, vis_info_len, 486 &is_new, are_target); 487 488 if (!info) 489 goto end; 490 /* note that outdated packets will be dropped at this point. */ 491 492 packet = (struct batadv_vis_packet *)info->skb_packet->data; 493 494 /* send only if we're the target server or ... */ 495 if (are_target && is_new) { 496 packet->vis_type = BATADV_VIS_TYPE_SERVER_SYNC; /* upgrade! */ 497 batadv_send_list_add(bat_priv, info); 498 499 /* ... we're not the recipient (and thus need to forward). */ 500 } else if (!batadv_is_my_mac(bat_priv, packet->target_orig)) { 501 batadv_send_list_add(bat_priv, info); 502 } 503 504end: 505 spin_unlock_bh(&bat_priv->vis.hash_lock); 506} 507 508/* Walk the originators and find the VIS server with the best tq. Set the packet 509 * address to its address and return the best_tq. 510 * 511 * Must be called with the originator hash locked 512 */ 513static int batadv_find_best_vis_server(struct batadv_priv *bat_priv, 514 struct batadv_vis_info *info) 515{ 516 struct batadv_hashtable *hash = bat_priv->orig_hash; 517 struct batadv_neigh_node *router; 518 struct hlist_head *head; 519 struct batadv_orig_node *orig_node; 520 struct batadv_vis_packet *packet; 521 int best_tq = -1; 522 uint32_t i; 523 524 packet = (struct batadv_vis_packet *)info->skb_packet->data; 525 526 for (i = 0; i < hash->size; i++) { 527 head = &hash->table[i]; 528 529 rcu_read_lock(); 530 hlist_for_each_entry_rcu(orig_node, head, hash_entry) { 531 router = batadv_orig_node_get_router(orig_node); 532 if (!router) 533 continue; 534 535 if ((orig_node->flags & BATADV_VIS_SERVER) && 536 (router->tq_avg > best_tq)) { 537 best_tq = router->tq_avg; 538 memcpy(packet->target_orig, orig_node->orig, 539 ETH_ALEN); 540 } 541 batadv_neigh_node_free_ref(router); 542 } 543 rcu_read_unlock(); 544 } 545 546 return best_tq; 547} 548 549/* Return true if the vis packet is full. */ 550static bool batadv_vis_packet_full(const struct batadv_vis_info *info) 551{ 552 const struct batadv_vis_packet *packet; 553 size_t num; 554 555 packet = (struct batadv_vis_packet *)info->skb_packet->data; 556 num = BATADV_MAX_VIS_PACKET_SIZE / sizeof(struct batadv_vis_info_entry); 557 558 if (num < packet->entries + 1) 559 return true; 560 return false; 561} 562 563/* generates a packet of own vis data, 564 * returns 0 on success, -1 if no packet could be generated 565 */ 566static int batadv_generate_vis_packet(struct batadv_priv *bat_priv) 567{ 568 struct batadv_hashtable *hash = bat_priv->orig_hash; 569 struct hlist_head *head; 570 struct batadv_orig_node *orig_node; 571 struct batadv_neigh_node *router; 572 struct batadv_vis_info *info = bat_priv->vis.my_info; 573 struct batadv_vis_packet *packet; 574 struct batadv_vis_info_entry *entry; 575 struct batadv_tt_common_entry *tt_common_entry; 576 uint8_t *packet_pos; 577 int best_tq = -1; 578 uint32_t i; 579 580 info->first_seen = jiffies; 581 packet = (struct batadv_vis_packet *)info->skb_packet->data; 582 packet->vis_type = atomic_read(&bat_priv->vis_mode); 583 584 memcpy(packet->target_orig, batadv_broadcast_addr, ETH_ALEN); 585 packet->header.ttl = BATADV_TTL; 586 packet->seqno = htonl(ntohl(packet->seqno) + 1); 587 packet->entries = 0; 588 packet->reserved = 0; 589 skb_trim(info->skb_packet, sizeof(*packet)); 590 591 if (packet->vis_type == BATADV_VIS_TYPE_CLIENT_UPDATE) { 592 best_tq = batadv_find_best_vis_server(bat_priv, info); 593 594 if (best_tq < 0) 595 return best_tq; 596 } 597 598 for (i = 0; i < hash->size; i++) { 599 head = &hash->table[i]; 600 601 rcu_read_lock(); 602 hlist_for_each_entry_rcu(orig_node, head, hash_entry) { 603 router = batadv_orig_node_get_router(orig_node); 604 if (!router) 605 continue; 606 607 if (!batadv_compare_eth(router->addr, orig_node->orig)) 608 goto next; 609 610 if (router->if_incoming->if_status != BATADV_IF_ACTIVE) 611 goto next; 612 613 if (router->tq_avg < 1) 614 goto next; 615 616 /* fill one entry into buffer. */ 617 packet_pos = skb_put(info->skb_packet, sizeof(*entry)); 618 entry = (struct batadv_vis_info_entry *)packet_pos; 619 memcpy(entry->src, 620 router->if_incoming->net_dev->dev_addr, 621 ETH_ALEN); 622 memcpy(entry->dest, orig_node->orig, ETH_ALEN); 623 entry->quality = router->tq_avg; 624 packet->entries++; 625 626next: 627 batadv_neigh_node_free_ref(router); 628 629 if (batadv_vis_packet_full(info)) 630 goto unlock; 631 } 632 rcu_read_unlock(); 633 } 634 635 hash = bat_priv->tt.local_hash; 636 637 for (i = 0; i < hash->size; i++) { 638 head = &hash->table[i]; 639 640 rcu_read_lock(); 641 hlist_for_each_entry_rcu(tt_common_entry, head, 642 hash_entry) { 643 packet_pos = skb_put(info->skb_packet, sizeof(*entry)); 644 entry = (struct batadv_vis_info_entry *)packet_pos; 645 memset(entry->src, 0, ETH_ALEN); 646 memcpy(entry->dest, tt_common_entry->addr, ETH_ALEN); 647 entry->quality = 0; /* 0 means TT */ 648 packet->entries++; 649 650 if (batadv_vis_packet_full(info)) 651 goto unlock; 652 } 653 rcu_read_unlock(); 654 } 655 656 return 0; 657 658unlock: 659 rcu_read_unlock(); 660 return 0; 661} 662 663/* free old vis packets. Must be called with this vis_hash_lock 664 * held 665 */ 666static void batadv_purge_vis_packets(struct batadv_priv *bat_priv) 667{ 668 uint32_t i; 669 struct batadv_hashtable *hash = bat_priv->vis.hash; 670 struct hlist_node *node_tmp; 671 struct hlist_head *head; 672 struct batadv_vis_info *info; 673 674 for (i = 0; i < hash->size; i++) { 675 head = &hash->table[i]; 676 677 hlist_for_each_entry_safe(info, node_tmp, 678 head, hash_entry) { 679 /* never purge own data. */ 680 if (info == bat_priv->vis.my_info) 681 continue; 682 683 if (batadv_has_timed_out(info->first_seen, 684 BATADV_VIS_TIMEOUT)) { 685 hlist_del(&info->hash_entry); 686 batadv_send_list_del(info); 687 kref_put(&info->refcount, batadv_free_info); 688 } 689 } 690 } 691} 692 693static void batadv_broadcast_vis_packet(struct batadv_priv *bat_priv, 694 struct batadv_vis_info *info) 695{ 696 struct batadv_hashtable *hash = bat_priv->orig_hash; 697 struct hlist_head *head; 698 struct batadv_orig_node *orig_node; 699 struct batadv_vis_packet *packet; 700 struct sk_buff *skb; 701 uint32_t i, res; 702 703 704 packet = (struct batadv_vis_packet *)info->skb_packet->data; 705 706 /* send to all routers in range. */ 707 for (i = 0; i < hash->size; i++) { 708 head = &hash->table[i]; 709 710 rcu_read_lock(); 711 hlist_for_each_entry_rcu(orig_node, head, hash_entry) { 712 /* if it's a vis server and reachable, send it. */ 713 if (!(orig_node->flags & BATADV_VIS_SERVER)) 714 continue; 715 716 /* don't send it if we already received the packet from 717 * this node. 718 */ 719 if (batadv_recv_list_is_in(bat_priv, &info->recv_list, 720 orig_node->orig)) 721 continue; 722 723 memcpy(packet->target_orig, orig_node->orig, ETH_ALEN); 724 skb = skb_clone(info->skb_packet, GFP_ATOMIC); 725 if (!skb) 726 continue; 727 728 res = batadv_send_skb_to_orig(skb, orig_node, NULL); 729 if (res == NET_XMIT_DROP) 730 kfree_skb(skb); 731 } 732 rcu_read_unlock(); 733 } 734} 735 736static void batadv_unicast_vis_packet(struct batadv_priv *bat_priv, 737 struct batadv_vis_info *info) 738{ 739 struct batadv_orig_node *orig_node; 740 struct sk_buff *skb; 741 struct batadv_vis_packet *packet; 742 743 packet = (struct batadv_vis_packet *)info->skb_packet->data; 744 745 orig_node = batadv_orig_hash_find(bat_priv, packet->target_orig); 746 if (!orig_node) 747 goto out; 748 749 skb = skb_clone(info->skb_packet, GFP_ATOMIC); 750 if (!skb) 751 goto out; 752 753 if (batadv_send_skb_to_orig(skb, orig_node, NULL) == NET_XMIT_DROP) 754 kfree_skb(skb); 755 756out: 757 if (orig_node) 758 batadv_orig_node_free_ref(orig_node); 759} 760 761/* only send one vis packet. called from batadv_send_vis_packets() */ 762static void batadv_send_vis_packet(struct batadv_priv *bat_priv, 763 struct batadv_vis_info *info) 764{ 765 struct batadv_hard_iface *primary_if; 766 struct batadv_vis_packet *packet; 767 768 primary_if = batadv_primary_if_get_selected(bat_priv); 769 if (!primary_if) 770 goto out; 771 772 packet = (struct batadv_vis_packet *)info->skb_packet->data; 773 if (packet->header.ttl < 2) { 774 pr_debug("Error - can't send vis packet: ttl exceeded\n"); 775 goto out; 776 } 777 778 memcpy(packet->sender_orig, primary_if->net_dev->dev_addr, ETH_ALEN); 779 packet->header.ttl--; 780 781 if (is_broadcast_ether_addr(packet->target_orig)) 782 batadv_broadcast_vis_packet(bat_priv, info); 783 else 784 batadv_unicast_vis_packet(bat_priv, info); 785 packet->header.ttl++; /* restore TTL */ 786 787out: 788 if (primary_if) 789 batadv_hardif_free_ref(primary_if); 790} 791 792/* called from timer; send (and maybe generate) vis packet. */ 793static void batadv_send_vis_packets(struct work_struct *work) 794{ 795 struct delayed_work *delayed_work; 796 struct batadv_priv *bat_priv; 797 struct batadv_priv_vis *priv_vis; 798 struct batadv_vis_info *info; 799 800 delayed_work = container_of(work, struct delayed_work, work); 801 priv_vis = container_of(delayed_work, struct batadv_priv_vis, work); 802 bat_priv = container_of(priv_vis, struct batadv_priv, vis); 803 spin_lock_bh(&bat_priv->vis.hash_lock); 804 batadv_purge_vis_packets(bat_priv); 805 806 if (batadv_generate_vis_packet(bat_priv) == 0) { 807 /* schedule if generation was successful */ 808 batadv_send_list_add(bat_priv, bat_priv->vis.my_info); 809 } 810 811 while (!list_empty(&bat_priv->vis.send_list)) { 812 info = list_first_entry(&bat_priv->vis.send_list, 813 typeof(*info), send_list); 814 815 kref_get(&info->refcount); 816 spin_unlock_bh(&bat_priv->vis.hash_lock); 817 818 batadv_send_vis_packet(bat_priv, info); 819 820 spin_lock_bh(&bat_priv->vis.hash_lock); 821 batadv_send_list_del(info); 822 kref_put(&info->refcount, batadv_free_info); 823 } 824 spin_unlock_bh(&bat_priv->vis.hash_lock); 825 826 queue_delayed_work(batadv_event_workqueue, &bat_priv->vis.work, 827 msecs_to_jiffies(BATADV_VIS_INTERVAL)); 828} 829 830/* init the vis server. this may only be called when if_list is already 831 * initialized (e.g. bat0 is initialized, interfaces have been added) 832 */ 833int batadv_vis_init(struct batadv_priv *bat_priv) 834{ 835 struct batadv_vis_packet *packet; 836 int hash_added; 837 unsigned int len; 838 unsigned long first_seen; 839 struct sk_buff *tmp_skb; 840 841 if (bat_priv->vis.hash) 842 return 0; 843 844 spin_lock_bh(&bat_priv->vis.hash_lock); 845 846 bat_priv->vis.hash = batadv_hash_new(256); 847 if (!bat_priv->vis.hash) { 848 pr_err("Can't initialize vis_hash\n"); 849 goto err; 850 } 851 852 batadv_hash_set_lock_class(bat_priv->vis.hash, 853 &batadv_vis_hash_lock_class_key); 854 855 bat_priv->vis.my_info = kmalloc(BATADV_MAX_VIS_PACKET_SIZE, GFP_ATOMIC); 856 if (!bat_priv->vis.my_info) 857 goto err; 858 859 len = sizeof(*packet) + BATADV_MAX_VIS_PACKET_SIZE + ETH_HLEN; 860 bat_priv->vis.my_info->skb_packet = netdev_alloc_skb_ip_align(NULL, 861 len); 862 if (!bat_priv->vis.my_info->skb_packet) 863 goto free_info; 864 865 bat_priv->vis.my_info->skb_packet->priority = TC_PRIO_CONTROL; 866 skb_reserve(bat_priv->vis.my_info->skb_packet, ETH_HLEN); 867 tmp_skb = bat_priv->vis.my_info->skb_packet; 868 packet = (struct batadv_vis_packet *)skb_put(tmp_skb, sizeof(*packet)); 869 870 /* prefill the vis info */ 871 first_seen = jiffies - msecs_to_jiffies(BATADV_VIS_INTERVAL); 872 bat_priv->vis.my_info->first_seen = first_seen; 873 INIT_LIST_HEAD(&bat_priv->vis.my_info->recv_list); 874 INIT_LIST_HEAD(&bat_priv->vis.my_info->send_list); 875 kref_init(&bat_priv->vis.my_info->refcount); 876 bat_priv->vis.my_info->bat_priv = bat_priv; 877 packet->header.version = BATADV_COMPAT_VERSION; 878 packet->header.packet_type = BATADV_VIS; 879 packet->header.ttl = BATADV_TTL; 880 packet->seqno = 0; 881 packet->reserved = 0; 882 packet->entries = 0; 883 884 INIT_LIST_HEAD(&bat_priv->vis.send_list); 885 886 hash_added = batadv_hash_add(bat_priv->vis.hash, batadv_vis_info_cmp, 887 batadv_vis_info_choose, 888 bat_priv->vis.my_info, 889 &bat_priv->vis.my_info->hash_entry); 890 if (hash_added != 0) { 891 pr_err("Can't add own vis packet into hash\n"); 892 /* not in hash, need to remove it manually. */ 893 kref_put(&bat_priv->vis.my_info->refcount, batadv_free_info); 894 goto err; 895 } 896 897 spin_unlock_bh(&bat_priv->vis.hash_lock); 898 899 INIT_DELAYED_WORK(&bat_priv->vis.work, batadv_send_vis_packets); 900 queue_delayed_work(batadv_event_workqueue, &bat_priv->vis.work, 901 msecs_to_jiffies(BATADV_VIS_INTERVAL)); 902 903 return 0; 904 905free_info: 906 kfree(bat_priv->vis.my_info); 907 bat_priv->vis.my_info = NULL; 908err: 909 spin_unlock_bh(&bat_priv->vis.hash_lock); 910 batadv_vis_quit(bat_priv); 911 return -ENOMEM; 912} 913 914/* Decrease the reference count on a hash item info */ 915static void batadv_free_info_ref(struct hlist_node *node, void *arg) 916{ 917 struct batadv_vis_info *info; 918 919 info = container_of(node, struct batadv_vis_info, hash_entry); 920 batadv_send_list_del(info); 921 kref_put(&info->refcount, batadv_free_info); 922} 923 924/* shutdown vis-server */ 925void batadv_vis_quit(struct batadv_priv *bat_priv) 926{ 927 if (!bat_priv->vis.hash) 928 return; 929 930 cancel_delayed_work_sync(&bat_priv->vis.work); 931 932 spin_lock_bh(&bat_priv->vis.hash_lock); 933 /* properly remove, kill timers ... */ 934 batadv_hash_delete(bat_priv->vis.hash, batadv_free_info_ref, NULL); 935 bat_priv->vis.hash = NULL; 936 bat_priv->vis.my_info = NULL; 937 spin_unlock_bh(&bat_priv->vis.hash_lock); 938}