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