1 /* Copyright (C) 2011-2015 B.A.T.M.A.N. contributors: 2 * 3 * 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 "distributed-arp-table.h" 19 #include "main.h" 20 21 #include <linux/atomic.h> 22 #include <linux/byteorder/generic.h> 23 #include <linux/errno.h> 24 #include <linux/etherdevice.h> 25 #include <linux/fs.h> 26 #include <linux/if_arp.h> 27 #include <linux/if_ether.h> 28 #include <linux/if_vlan.h> 29 #include <linux/in.h> 30 #include <linux/jiffies.h> 31 #include <linux/kernel.h> 32 #include <linux/list.h> 33 #include <linux/rculist.h> 34 #include <linux/rcupdate.h> 35 #include <linux/seq_file.h> 36 #include <linux/skbuff.h> 37 #include <linux/slab.h> 38 #include <linux/spinlock.h> 39 #include <linux/stddef.h> 40 #include <linux/string.h> 41 #include <linux/workqueue.h> 42 #include <net/arp.h> 43 44 #include "hard-interface.h" 45 #include "hash.h" 46 #include "originator.h" 47 #include "send.h" 48 #include "translation-table.h" 49 50 static void batadv_dat_purge(struct work_struct *work); 51 52 /** 53 * batadv_dat_start_timer - initialise the DAT periodic worker 54 * @bat_priv: the bat priv with all the soft interface information 55 */ 56 static void batadv_dat_start_timer(struct batadv_priv *bat_priv) 57 { 58 INIT_DELAYED_WORK(&bat_priv->dat.work, batadv_dat_purge); 59 queue_delayed_work(batadv_event_workqueue, &bat_priv->dat.work, 60 msecs_to_jiffies(10000)); 61 } 62 63 /** 64 * batadv_dat_entry_free_ref - decrement the dat_entry refcounter and possibly 65 * free it 66 * @dat_entry: the entry to free 67 */ 68 static void batadv_dat_entry_free_ref(struct batadv_dat_entry *dat_entry) 69 { 70 if (atomic_dec_and_test(&dat_entry->refcount)) 71 kfree_rcu(dat_entry, rcu); 72 } 73 74 /** 75 * batadv_dat_to_purge - check whether a dat_entry has to be purged or not 76 * @dat_entry: the entry to check 77 * 78 * Returns true if the entry has to be purged now, false otherwise. 79 */ 80 static bool batadv_dat_to_purge(struct batadv_dat_entry *dat_entry) 81 { 82 return batadv_has_timed_out(dat_entry->last_update, 83 BATADV_DAT_ENTRY_TIMEOUT); 84 } 85 86 /** 87 * __batadv_dat_purge - delete entries from the DAT local storage 88 * @bat_priv: the bat priv with all the soft interface information 89 * @to_purge: function in charge to decide whether an entry has to be purged or 90 * not. This function takes the dat_entry as argument and has to 91 * returns a boolean value: true is the entry has to be deleted, 92 * false otherwise 93 * 94 * Loops over each entry in the DAT local storage and deletes it if and only if 95 * the to_purge function passed as argument returns true. 96 */ 97 static void __batadv_dat_purge(struct batadv_priv *bat_priv, 98 bool (*to_purge)(struct batadv_dat_entry *)) 99 { 100 spinlock_t *list_lock; /* protects write access to the hash lists */ 101 struct batadv_dat_entry *dat_entry; 102 struct hlist_node *node_tmp; 103 struct hlist_head *head; 104 uint32_t i; 105 106 if (!bat_priv->dat.hash) 107 return; 108 109 for (i = 0; i < bat_priv->dat.hash->size; i++) { 110 head = &bat_priv->dat.hash->table[i]; 111 list_lock = &bat_priv->dat.hash->list_locks[i]; 112 113 spin_lock_bh(list_lock); 114 hlist_for_each_entry_safe(dat_entry, node_tmp, head, 115 hash_entry) { 116 /* if a helper function has been passed as parameter, 117 * ask it if the entry has to be purged or not 118 */ 119 if (to_purge && !to_purge(dat_entry)) 120 continue; 121 122 hlist_del_rcu(&dat_entry->hash_entry); 123 batadv_dat_entry_free_ref(dat_entry); 124 } 125 spin_unlock_bh(list_lock); 126 } 127 } 128 129 /** 130 * batadv_dat_purge - periodic task that deletes old entries from the local DAT 131 * hash table 132 * @work: kernel work struct 133 */ 134 static void batadv_dat_purge(struct work_struct *work) 135 { 136 struct delayed_work *delayed_work; 137 struct batadv_priv_dat *priv_dat; 138 struct batadv_priv *bat_priv; 139 140 delayed_work = container_of(work, struct delayed_work, work); 141 priv_dat = container_of(delayed_work, struct batadv_priv_dat, work); 142 bat_priv = container_of(priv_dat, struct batadv_priv, dat); 143 144 __batadv_dat_purge(bat_priv, batadv_dat_to_purge); 145 batadv_dat_start_timer(bat_priv); 146 } 147 148 /** 149 * batadv_compare_dat - comparing function used in the local DAT hash table 150 * @node: node in the local table 151 * @data2: second object to compare the node to 152 * 153 * Returns 1 if the two entries are the same, 0 otherwise. 154 */ 155 static int batadv_compare_dat(const struct hlist_node *node, const void *data2) 156 { 157 const void *data1 = container_of(node, struct batadv_dat_entry, 158 hash_entry); 159 160 return memcmp(data1, data2, sizeof(__be32)) == 0 ? 1 : 0; 161 } 162 163 /** 164 * batadv_arp_hw_src - extract the hw_src field from an ARP packet 165 * @skb: ARP packet 166 * @hdr_size: size of the possible header before the ARP packet 167 * 168 * Returns the value of the hw_src field in the ARP packet. 169 */ 170 static uint8_t *batadv_arp_hw_src(struct sk_buff *skb, int hdr_size) 171 { 172 uint8_t *addr; 173 174 addr = (uint8_t *)(skb->data + hdr_size); 175 addr += ETH_HLEN + sizeof(struct arphdr); 176 177 return addr; 178 } 179 180 /** 181 * batadv_arp_ip_src - extract the ip_src field from an ARP packet 182 * @skb: ARP packet 183 * @hdr_size: size of the possible header before the ARP packet 184 * 185 * Returns the value of the ip_src field in the ARP packet. 186 */ 187 static __be32 batadv_arp_ip_src(struct sk_buff *skb, int hdr_size) 188 { 189 return *(__be32 *)(batadv_arp_hw_src(skb, hdr_size) + ETH_ALEN); 190 } 191 192 /** 193 * batadv_arp_hw_dst - extract the hw_dst field from an ARP packet 194 * @skb: ARP packet 195 * @hdr_size: size of the possible header before the ARP packet 196 * 197 * Returns the value of the hw_dst field in the ARP packet. 198 */ 199 static uint8_t *batadv_arp_hw_dst(struct sk_buff *skb, int hdr_size) 200 { 201 return batadv_arp_hw_src(skb, hdr_size) + ETH_ALEN + 4; 202 } 203 204 /** 205 * batadv_arp_ip_dst - extract the ip_dst field from an ARP packet 206 * @skb: ARP packet 207 * @hdr_size: size of the possible header before the ARP packet 208 * 209 * Returns the value of the ip_dst field in the ARP packet. 210 */ 211 static __be32 batadv_arp_ip_dst(struct sk_buff *skb, int hdr_size) 212 { 213 return *(__be32 *)(batadv_arp_hw_src(skb, hdr_size) + ETH_ALEN * 2 + 4); 214 } 215 216 /** 217 * batadv_hash_dat - compute the hash value for an IP address 218 * @data: data to hash 219 * @size: size of the hash table 220 * 221 * Returns the selected index in the hash table for the given data. 222 */ 223 static uint32_t batadv_hash_dat(const void *data, uint32_t size) 224 { 225 uint32_t hash = 0; 226 const struct batadv_dat_entry *dat = data; 227 const unsigned char *key; 228 uint32_t i; 229 230 key = (const unsigned char *)&dat->ip; 231 for (i = 0; i < sizeof(dat->ip); i++) { 232 hash += key[i]; 233 hash += (hash << 10); 234 hash ^= (hash >> 6); 235 } 236 237 key = (const unsigned char *)&dat->vid; 238 for (i = 0; i < sizeof(dat->vid); i++) { 239 hash += key[i]; 240 hash += (hash << 10); 241 hash ^= (hash >> 6); 242 } 243 244 hash += (hash << 3); 245 hash ^= (hash >> 11); 246 hash += (hash << 15); 247 248 return hash % size; 249 } 250 251 /** 252 * batadv_dat_entry_hash_find - look for a given dat_entry in the local hash 253 * table 254 * @bat_priv: the bat priv with all the soft interface information 255 * @ip: search key 256 * @vid: VLAN identifier 257 * 258 * Returns the dat_entry if found, NULL otherwise. 259 */ 260 static struct batadv_dat_entry * 261 batadv_dat_entry_hash_find(struct batadv_priv *bat_priv, __be32 ip, 262 unsigned short vid) 263 { 264 struct hlist_head *head; 265 struct batadv_dat_entry to_find, *dat_entry, *dat_entry_tmp = NULL; 266 struct batadv_hashtable *hash = bat_priv->dat.hash; 267 uint32_t index; 268 269 if (!hash) 270 return NULL; 271 272 to_find.ip = ip; 273 to_find.vid = vid; 274 275 index = batadv_hash_dat(&to_find, hash->size); 276 head = &hash->table[index]; 277 278 rcu_read_lock(); 279 hlist_for_each_entry_rcu(dat_entry, head, hash_entry) { 280 if (dat_entry->ip != ip) 281 continue; 282 283 if (!atomic_inc_not_zero(&dat_entry->refcount)) 284 continue; 285 286 dat_entry_tmp = dat_entry; 287 break; 288 } 289 rcu_read_unlock(); 290 291 return dat_entry_tmp; 292 } 293 294 /** 295 * batadv_dat_entry_add - add a new dat entry or update it if already exists 296 * @bat_priv: the bat priv with all the soft interface information 297 * @ip: ipv4 to add/edit 298 * @mac_addr: mac address to assign to the given ipv4 299 * @vid: VLAN identifier 300 */ 301 static void batadv_dat_entry_add(struct batadv_priv *bat_priv, __be32 ip, 302 uint8_t *mac_addr, unsigned short vid) 303 { 304 struct batadv_dat_entry *dat_entry; 305 int hash_added; 306 307 dat_entry = batadv_dat_entry_hash_find(bat_priv, ip, vid); 308 /* if this entry is already known, just update it */ 309 if (dat_entry) { 310 if (!batadv_compare_eth(dat_entry->mac_addr, mac_addr)) 311 ether_addr_copy(dat_entry->mac_addr, mac_addr); 312 dat_entry->last_update = jiffies; 313 batadv_dbg(BATADV_DBG_DAT, bat_priv, 314 "Entry updated: %pI4 %pM (vid: %d)\n", 315 &dat_entry->ip, dat_entry->mac_addr, 316 BATADV_PRINT_VID(vid)); 317 goto out; 318 } 319 320 dat_entry = kmalloc(sizeof(*dat_entry), GFP_ATOMIC); 321 if (!dat_entry) 322 goto out; 323 324 dat_entry->ip = ip; 325 dat_entry->vid = vid; 326 ether_addr_copy(dat_entry->mac_addr, mac_addr); 327 dat_entry->last_update = jiffies; 328 atomic_set(&dat_entry->refcount, 2); 329 330 hash_added = batadv_hash_add(bat_priv->dat.hash, batadv_compare_dat, 331 batadv_hash_dat, dat_entry, 332 &dat_entry->hash_entry); 333 334 if (unlikely(hash_added != 0)) { 335 /* remove the reference for the hash */ 336 batadv_dat_entry_free_ref(dat_entry); 337 goto out; 338 } 339 340 batadv_dbg(BATADV_DBG_DAT, bat_priv, "New entry added: %pI4 %pM (vid: %d)\n", 341 &dat_entry->ip, dat_entry->mac_addr, BATADV_PRINT_VID(vid)); 342 343 out: 344 if (dat_entry) 345 batadv_dat_entry_free_ref(dat_entry); 346 } 347 348 #ifdef CONFIG_BATMAN_ADV_DEBUG 349 350 /** 351 * batadv_dbg_arp - print a debug message containing all the ARP packet details 352 * @bat_priv: the bat priv with all the soft interface information 353 * @skb: ARP packet 354 * @type: ARP type 355 * @hdr_size: size of the possible header before the ARP packet 356 * @msg: message to print together with the debugging information 357 */ 358 static void batadv_dbg_arp(struct batadv_priv *bat_priv, struct sk_buff *skb, 359 uint16_t type, int hdr_size, char *msg) 360 { 361 struct batadv_unicast_4addr_packet *unicast_4addr_packet; 362 struct batadv_bcast_packet *bcast_pkt; 363 uint8_t *orig_addr; 364 __be32 ip_src, ip_dst; 365 366 if (msg) 367 batadv_dbg(BATADV_DBG_DAT, bat_priv, "%s\n", msg); 368 369 ip_src = batadv_arp_ip_src(skb, hdr_size); 370 ip_dst = batadv_arp_ip_dst(skb, hdr_size); 371 batadv_dbg(BATADV_DBG_DAT, bat_priv, 372 "ARP MSG = [src: %pM-%pI4 dst: %pM-%pI4]\n", 373 batadv_arp_hw_src(skb, hdr_size), &ip_src, 374 batadv_arp_hw_dst(skb, hdr_size), &ip_dst); 375 376 if (hdr_size == 0) 377 return; 378 379 unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data; 380 381 switch (unicast_4addr_packet->u.packet_type) { 382 case BATADV_UNICAST: 383 batadv_dbg(BATADV_DBG_DAT, bat_priv, 384 "* encapsulated within a UNICAST packet\n"); 385 break; 386 case BATADV_UNICAST_4ADDR: 387 batadv_dbg(BATADV_DBG_DAT, bat_priv, 388 "* encapsulated within a UNICAST_4ADDR packet (src: %pM)\n", 389 unicast_4addr_packet->src); 390 switch (unicast_4addr_packet->subtype) { 391 case BATADV_P_DAT_DHT_PUT: 392 batadv_dbg(BATADV_DBG_DAT, bat_priv, "* type: DAT_DHT_PUT\n"); 393 break; 394 case BATADV_P_DAT_DHT_GET: 395 batadv_dbg(BATADV_DBG_DAT, bat_priv, "* type: DAT_DHT_GET\n"); 396 break; 397 case BATADV_P_DAT_CACHE_REPLY: 398 batadv_dbg(BATADV_DBG_DAT, bat_priv, 399 "* type: DAT_CACHE_REPLY\n"); 400 break; 401 case BATADV_P_DATA: 402 batadv_dbg(BATADV_DBG_DAT, bat_priv, "* type: DATA\n"); 403 break; 404 default: 405 batadv_dbg(BATADV_DBG_DAT, bat_priv, "* type: Unknown (%u)!\n", 406 unicast_4addr_packet->u.packet_type); 407 } 408 break; 409 case BATADV_BCAST: 410 bcast_pkt = (struct batadv_bcast_packet *)unicast_4addr_packet; 411 orig_addr = bcast_pkt->orig; 412 batadv_dbg(BATADV_DBG_DAT, bat_priv, 413 "* encapsulated within a BCAST packet (src: %pM)\n", 414 orig_addr); 415 break; 416 default: 417 batadv_dbg(BATADV_DBG_DAT, bat_priv, 418 "* encapsulated within an unknown packet type (0x%x)\n", 419 unicast_4addr_packet->u.packet_type); 420 } 421 } 422 423 #else 424 425 static void batadv_dbg_arp(struct batadv_priv *bat_priv, struct sk_buff *skb, 426 uint16_t type, int hdr_size, char *msg) 427 { 428 } 429 430 #endif /* CONFIG_BATMAN_ADV_DEBUG */ 431 432 /** 433 * batadv_is_orig_node_eligible - check whether a node can be a DHT candidate 434 * @res: the array with the already selected candidates 435 * @select: number of already selected candidates 436 * @tmp_max: address of the currently evaluated node 437 * @max: current round max address 438 * @last_max: address of the last selected candidate 439 * @candidate: orig_node under evaluation 440 * @max_orig_node: last selected candidate 441 * 442 * Returns true if the node has been elected as next candidate or false 443 * otherwise. 444 */ 445 static bool batadv_is_orig_node_eligible(struct batadv_dat_candidate *res, 446 int select, batadv_dat_addr_t tmp_max, 447 batadv_dat_addr_t max, 448 batadv_dat_addr_t last_max, 449 struct batadv_orig_node *candidate, 450 struct batadv_orig_node *max_orig_node) 451 { 452 bool ret = false; 453 int j; 454 455 /* check if orig node candidate is running DAT */ 456 if (!(candidate->capabilities & BATADV_ORIG_CAPA_HAS_DAT)) 457 goto out; 458 459 /* Check if this node has already been selected... */ 460 for (j = 0; j < select; j++) 461 if (res[j].orig_node == candidate) 462 break; 463 /* ..and possibly skip it */ 464 if (j < select) 465 goto out; 466 /* sanity check: has it already been selected? This should not happen */ 467 if (tmp_max > last_max) 468 goto out; 469 /* check if during this iteration an originator with a closer dht 470 * address has already been found 471 */ 472 if (tmp_max < max) 473 goto out; 474 /* this is an hash collision with the temporary selected node. Choose 475 * the one with the lowest address 476 */ 477 if ((tmp_max == max) && max_orig_node && 478 (batadv_compare_eth(candidate->orig, max_orig_node->orig) > 0)) 479 goto out; 480 481 ret = true; 482 out: 483 return ret; 484 } 485 486 /** 487 * batadv_choose_next_candidate - select the next DHT candidate 488 * @bat_priv: the bat priv with all the soft interface information 489 * @cands: candidates array 490 * @select: number of candidates already present in the array 491 * @ip_key: key to look up in the DHT 492 * @last_max: pointer where the address of the selected candidate will be saved 493 */ 494 static void batadv_choose_next_candidate(struct batadv_priv *bat_priv, 495 struct batadv_dat_candidate *cands, 496 int select, batadv_dat_addr_t ip_key, 497 batadv_dat_addr_t *last_max) 498 { 499 batadv_dat_addr_t max = 0, tmp_max = 0; 500 struct batadv_orig_node *orig_node, *max_orig_node = NULL; 501 struct batadv_hashtable *hash = bat_priv->orig_hash; 502 struct hlist_head *head; 503 int i; 504 505 /* if no node is eligible as candidate, leave the candidate type as 506 * NOT_FOUND 507 */ 508 cands[select].type = BATADV_DAT_CANDIDATE_NOT_FOUND; 509 510 /* iterate over the originator list and find the node with the closest 511 * dat_address which has not been selected yet 512 */ 513 for (i = 0; i < hash->size; i++) { 514 head = &hash->table[i]; 515 516 rcu_read_lock(); 517 hlist_for_each_entry_rcu(orig_node, head, hash_entry) { 518 /* the dht space is a ring using unsigned addresses */ 519 tmp_max = BATADV_DAT_ADDR_MAX - orig_node->dat_addr + 520 ip_key; 521 522 if (!batadv_is_orig_node_eligible(cands, select, 523 tmp_max, max, 524 *last_max, orig_node, 525 max_orig_node)) 526 continue; 527 528 if (!atomic_inc_not_zero(&orig_node->refcount)) 529 continue; 530 531 max = tmp_max; 532 if (max_orig_node) 533 batadv_orig_node_free_ref(max_orig_node); 534 max_orig_node = orig_node; 535 } 536 rcu_read_unlock(); 537 } 538 if (max_orig_node) { 539 cands[select].type = BATADV_DAT_CANDIDATE_ORIG; 540 cands[select].orig_node = max_orig_node; 541 batadv_dbg(BATADV_DBG_DAT, bat_priv, 542 "dat_select_candidates() %d: selected %pM addr=%u dist=%u\n", 543 select, max_orig_node->orig, max_orig_node->dat_addr, 544 max); 545 } 546 *last_max = max; 547 } 548 549 /** 550 * batadv_dat_select_candidates - select the nodes which the DHT message has to 551 * be sent to 552 * @bat_priv: the bat priv with all the soft interface information 553 * @ip_dst: ipv4 to look up in the DHT 554 * 555 * An originator O is selected if and only if its DHT_ID value is one of three 556 * closest values (from the LEFT, with wrap around if needed) then the hash 557 * value of the key. ip_dst is the key. 558 * 559 * Returns the candidate array of size BATADV_DAT_CANDIDATE_NUM. 560 */ 561 static struct batadv_dat_candidate * 562 batadv_dat_select_candidates(struct batadv_priv *bat_priv, __be32 ip_dst) 563 { 564 int select; 565 batadv_dat_addr_t last_max = BATADV_DAT_ADDR_MAX, ip_key; 566 struct batadv_dat_candidate *res; 567 568 if (!bat_priv->orig_hash) 569 return NULL; 570 571 res = kmalloc_array(BATADV_DAT_CANDIDATES_NUM, sizeof(*res), 572 GFP_ATOMIC); 573 if (!res) 574 return NULL; 575 576 ip_key = (batadv_dat_addr_t)batadv_hash_dat(&ip_dst, 577 BATADV_DAT_ADDR_MAX); 578 579 batadv_dbg(BATADV_DBG_DAT, bat_priv, 580 "dat_select_candidates(): IP=%pI4 hash(IP)=%u\n", &ip_dst, 581 ip_key); 582 583 for (select = 0; select < BATADV_DAT_CANDIDATES_NUM; select++) 584 batadv_choose_next_candidate(bat_priv, res, select, ip_key, 585 &last_max); 586 587 return res; 588 } 589 590 /** 591 * batadv_dat_send_data - send a payload to the selected candidates 592 * @bat_priv: the bat priv with all the soft interface information 593 * @skb: payload to send 594 * @ip: the DHT key 595 * @packet_subtype: unicast4addr packet subtype to use 596 * 597 * This function copies the skb with pskb_copy() and is sent as unicast packet 598 * to each of the selected candidates. 599 * 600 * Returns true if the packet is sent to at least one candidate, false 601 * otherwise. 602 */ 603 static bool batadv_dat_send_data(struct batadv_priv *bat_priv, 604 struct sk_buff *skb, __be32 ip, 605 int packet_subtype) 606 { 607 int i; 608 bool ret = false; 609 int send_status; 610 struct batadv_neigh_node *neigh_node = NULL; 611 struct sk_buff *tmp_skb; 612 struct batadv_dat_candidate *cand; 613 614 cand = batadv_dat_select_candidates(bat_priv, ip); 615 if (!cand) 616 goto out; 617 618 batadv_dbg(BATADV_DBG_DAT, bat_priv, "DHT_SEND for %pI4\n", &ip); 619 620 for (i = 0; i < BATADV_DAT_CANDIDATES_NUM; i++) { 621 if (cand[i].type == BATADV_DAT_CANDIDATE_NOT_FOUND) 622 continue; 623 624 neigh_node = batadv_orig_router_get(cand[i].orig_node, 625 BATADV_IF_DEFAULT); 626 if (!neigh_node) 627 goto free_orig; 628 629 tmp_skb = pskb_copy_for_clone(skb, GFP_ATOMIC); 630 if (!batadv_send_skb_prepare_unicast_4addr(bat_priv, tmp_skb, 631 cand[i].orig_node, 632 packet_subtype)) { 633 kfree_skb(tmp_skb); 634 goto free_neigh; 635 } 636 637 send_status = batadv_send_skb_packet(tmp_skb, 638 neigh_node->if_incoming, 639 neigh_node->addr); 640 if (send_status == NET_XMIT_SUCCESS) { 641 /* count the sent packet */ 642 switch (packet_subtype) { 643 case BATADV_P_DAT_DHT_GET: 644 batadv_inc_counter(bat_priv, 645 BATADV_CNT_DAT_GET_TX); 646 break; 647 case BATADV_P_DAT_DHT_PUT: 648 batadv_inc_counter(bat_priv, 649 BATADV_CNT_DAT_PUT_TX); 650 break; 651 } 652 653 /* packet sent to a candidate: return true */ 654 ret = true; 655 } 656 free_neigh: 657 batadv_neigh_node_free_ref(neigh_node); 658 free_orig: 659 batadv_orig_node_free_ref(cand[i].orig_node); 660 } 661 662 out: 663 kfree(cand); 664 return ret; 665 } 666 667 /** 668 * batadv_dat_tvlv_container_update - update the dat tvlv container after dat 669 * setting change 670 * @bat_priv: the bat priv with all the soft interface information 671 */ 672 static void batadv_dat_tvlv_container_update(struct batadv_priv *bat_priv) 673 { 674 char dat_mode; 675 676 dat_mode = atomic_read(&bat_priv->distributed_arp_table); 677 678 switch (dat_mode) { 679 case 0: 680 batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_DAT, 1); 681 break; 682 case 1: 683 batadv_tvlv_container_register(bat_priv, BATADV_TVLV_DAT, 1, 684 NULL, 0); 685 break; 686 } 687 } 688 689 /** 690 * batadv_dat_status_update - update the dat tvlv container after dat 691 * setting change 692 * @net_dev: the soft interface net device 693 */ 694 void batadv_dat_status_update(struct net_device *net_dev) 695 { 696 struct batadv_priv *bat_priv = netdev_priv(net_dev); 697 698 batadv_dat_tvlv_container_update(bat_priv); 699 } 700 701 /** 702 * batadv_gw_tvlv_ogm_handler_v1 - process incoming dat tvlv container 703 * @bat_priv: the bat priv with all the soft interface information 704 * @orig: the orig_node of the ogm 705 * @flags: flags indicating the tvlv state (see batadv_tvlv_handler_flags) 706 * @tvlv_value: tvlv buffer containing the gateway data 707 * @tvlv_value_len: tvlv buffer length 708 */ 709 static void batadv_dat_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv, 710 struct batadv_orig_node *orig, 711 uint8_t flags, 712 void *tvlv_value, 713 uint16_t tvlv_value_len) 714 { 715 if (flags & BATADV_TVLV_HANDLER_OGM_CIFNOTFND) 716 orig->capabilities &= ~BATADV_ORIG_CAPA_HAS_DAT; 717 else 718 orig->capabilities |= BATADV_ORIG_CAPA_HAS_DAT; 719 } 720 721 /** 722 * batadv_dat_hash_free - free the local DAT hash table 723 * @bat_priv: the bat priv with all the soft interface information 724 */ 725 static void batadv_dat_hash_free(struct batadv_priv *bat_priv) 726 { 727 if (!bat_priv->dat.hash) 728 return; 729 730 __batadv_dat_purge(bat_priv, NULL); 731 732 batadv_hash_destroy(bat_priv->dat.hash); 733 734 bat_priv->dat.hash = NULL; 735 } 736 737 /** 738 * batadv_dat_init - initialise the DAT internals 739 * @bat_priv: the bat priv with all the soft interface information 740 */ 741 int batadv_dat_init(struct batadv_priv *bat_priv) 742 { 743 if (bat_priv->dat.hash) 744 return 0; 745 746 bat_priv->dat.hash = batadv_hash_new(1024); 747 748 if (!bat_priv->dat.hash) 749 return -ENOMEM; 750 751 batadv_dat_start_timer(bat_priv); 752 753 batadv_tvlv_handler_register(bat_priv, batadv_dat_tvlv_ogm_handler_v1, 754 NULL, BATADV_TVLV_DAT, 1, 755 BATADV_TVLV_HANDLER_OGM_CIFNOTFND); 756 batadv_dat_tvlv_container_update(bat_priv); 757 return 0; 758 } 759 760 /** 761 * batadv_dat_free - free the DAT internals 762 * @bat_priv: the bat priv with all the soft interface information 763 */ 764 void batadv_dat_free(struct batadv_priv *bat_priv) 765 { 766 batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_DAT, 1); 767 batadv_tvlv_handler_unregister(bat_priv, BATADV_TVLV_DAT, 1); 768 769 cancel_delayed_work_sync(&bat_priv->dat.work); 770 771 batadv_dat_hash_free(bat_priv); 772 } 773 774 /** 775 * batadv_dat_cache_seq_print_text - print the local DAT hash table 776 * @seq: seq file to print on 777 * @offset: not used 778 */ 779 int batadv_dat_cache_seq_print_text(struct seq_file *seq, void *offset) 780 { 781 struct net_device *net_dev = (struct net_device *)seq->private; 782 struct batadv_priv *bat_priv = netdev_priv(net_dev); 783 struct batadv_hashtable *hash = bat_priv->dat.hash; 784 struct batadv_dat_entry *dat_entry; 785 struct batadv_hard_iface *primary_if; 786 struct hlist_head *head; 787 unsigned long last_seen_jiffies; 788 int last_seen_msecs, last_seen_secs, last_seen_mins; 789 uint32_t i; 790 791 primary_if = batadv_seq_print_text_primary_if_get(seq); 792 if (!primary_if) 793 goto out; 794 795 seq_printf(seq, "Distributed ARP Table (%s):\n", net_dev->name); 796 seq_printf(seq, " %-7s %-9s %4s %11s\n", "IPv4", 797 "MAC", "VID", "last-seen"); 798 799 for (i = 0; i < hash->size; i++) { 800 head = &hash->table[i]; 801 802 rcu_read_lock(); 803 hlist_for_each_entry_rcu(dat_entry, head, hash_entry) { 804 last_seen_jiffies = jiffies - dat_entry->last_update; 805 last_seen_msecs = jiffies_to_msecs(last_seen_jiffies); 806 last_seen_mins = last_seen_msecs / 60000; 807 last_seen_msecs = last_seen_msecs % 60000; 808 last_seen_secs = last_seen_msecs / 1000; 809 810 seq_printf(seq, " * %15pI4 %14pM %4i %6i:%02i\n", 811 &dat_entry->ip, dat_entry->mac_addr, 812 BATADV_PRINT_VID(dat_entry->vid), 813 last_seen_mins, last_seen_secs); 814 } 815 rcu_read_unlock(); 816 } 817 818 out: 819 if (primary_if) 820 batadv_hardif_free_ref(primary_if); 821 return 0; 822 } 823 824 /** 825 * batadv_arp_get_type - parse an ARP packet and gets the type 826 * @bat_priv: the bat priv with all the soft interface information 827 * @skb: packet to analyse 828 * @hdr_size: size of the possible header before the ARP packet in the skb 829 * 830 * Returns the ARP type if the skb contains a valid ARP packet, 0 otherwise. 831 */ 832 static uint16_t batadv_arp_get_type(struct batadv_priv *bat_priv, 833 struct sk_buff *skb, int hdr_size) 834 { 835 struct arphdr *arphdr; 836 struct ethhdr *ethhdr; 837 __be32 ip_src, ip_dst; 838 uint8_t *hw_src, *hw_dst; 839 uint16_t type = 0; 840 841 /* pull the ethernet header */ 842 if (unlikely(!pskb_may_pull(skb, hdr_size + ETH_HLEN))) 843 goto out; 844 845 ethhdr = (struct ethhdr *)(skb->data + hdr_size); 846 847 if (ethhdr->h_proto != htons(ETH_P_ARP)) 848 goto out; 849 850 /* pull the ARP payload */ 851 if (unlikely(!pskb_may_pull(skb, hdr_size + ETH_HLEN + 852 arp_hdr_len(skb->dev)))) 853 goto out; 854 855 arphdr = (struct arphdr *)(skb->data + hdr_size + ETH_HLEN); 856 857 /* check whether the ARP packet carries a valid IP information */ 858 if (arphdr->ar_hrd != htons(ARPHRD_ETHER)) 859 goto out; 860 861 if (arphdr->ar_pro != htons(ETH_P_IP)) 862 goto out; 863 864 if (arphdr->ar_hln != ETH_ALEN) 865 goto out; 866 867 if (arphdr->ar_pln != 4) 868 goto out; 869 870 /* Check for bad reply/request. If the ARP message is not sane, DAT 871 * will simply ignore it 872 */ 873 ip_src = batadv_arp_ip_src(skb, hdr_size); 874 ip_dst = batadv_arp_ip_dst(skb, hdr_size); 875 if (ipv4_is_loopback(ip_src) || ipv4_is_multicast(ip_src) || 876 ipv4_is_loopback(ip_dst) || ipv4_is_multicast(ip_dst) || 877 ipv4_is_zeronet(ip_src) || ipv4_is_lbcast(ip_src) || 878 ipv4_is_zeronet(ip_dst) || ipv4_is_lbcast(ip_dst)) 879 goto out; 880 881 hw_src = batadv_arp_hw_src(skb, hdr_size); 882 if (is_zero_ether_addr(hw_src) || is_multicast_ether_addr(hw_src)) 883 goto out; 884 885 /* don't care about the destination MAC address in ARP requests */ 886 if (arphdr->ar_op != htons(ARPOP_REQUEST)) { 887 hw_dst = batadv_arp_hw_dst(skb, hdr_size); 888 if (is_zero_ether_addr(hw_dst) || 889 is_multicast_ether_addr(hw_dst)) 890 goto out; 891 } 892 893 type = ntohs(arphdr->ar_op); 894 out: 895 return type; 896 } 897 898 /** 899 * batadv_dat_get_vid - extract the VLAN identifier from skb if any 900 * @skb: the buffer containing the packet to extract the VID from 901 * @hdr_size: the size of the batman-adv header encapsulating the packet 902 * 903 * If the packet embedded in the skb is vlan tagged this function returns the 904 * VID with the BATADV_VLAN_HAS_TAG flag. Otherwise BATADV_NO_FLAGS is returned. 905 */ 906 static unsigned short batadv_dat_get_vid(struct sk_buff *skb, int *hdr_size) 907 { 908 unsigned short vid; 909 910 vid = batadv_get_vid(skb, *hdr_size); 911 912 /* ARP parsing functions jump forward of hdr_size + ETH_HLEN. 913 * If the header contained in the packet is a VLAN one (which is longer) 914 * hdr_size is updated so that the functions will still skip the 915 * correct amount of bytes. 916 */ 917 if (vid & BATADV_VLAN_HAS_TAG) 918 *hdr_size += VLAN_HLEN; 919 920 return vid; 921 } 922 923 /** 924 * batadv_dat_snoop_outgoing_arp_request - snoop the ARP request and try to 925 * answer using DAT 926 * @bat_priv: the bat priv with all the soft interface information 927 * @skb: packet to check 928 * 929 * Returns true if the message has been sent to the dht candidates, false 930 * otherwise. In case of a positive return value the message has to be enqueued 931 * to permit the fallback. 932 */ 933 bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv, 934 struct sk_buff *skb) 935 { 936 uint16_t type = 0; 937 __be32 ip_dst, ip_src; 938 uint8_t *hw_src; 939 bool ret = false; 940 struct batadv_dat_entry *dat_entry = NULL; 941 struct sk_buff *skb_new; 942 int hdr_size = 0; 943 unsigned short vid; 944 945 if (!atomic_read(&bat_priv->distributed_arp_table)) 946 goto out; 947 948 vid = batadv_dat_get_vid(skb, &hdr_size); 949 950 type = batadv_arp_get_type(bat_priv, skb, hdr_size); 951 /* If the node gets an ARP_REQUEST it has to send a DHT_GET unicast 952 * message to the selected DHT candidates 953 */ 954 if (type != ARPOP_REQUEST) 955 goto out; 956 957 batadv_dbg_arp(bat_priv, skb, type, hdr_size, 958 "Parsing outgoing ARP REQUEST"); 959 960 ip_src = batadv_arp_ip_src(skb, hdr_size); 961 hw_src = batadv_arp_hw_src(skb, hdr_size); 962 ip_dst = batadv_arp_ip_dst(skb, hdr_size); 963 964 batadv_dat_entry_add(bat_priv, ip_src, hw_src, vid); 965 966 dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_dst, vid); 967 if (dat_entry) { 968 /* If the ARP request is destined for a local client the local 969 * client will answer itself. DAT would only generate a 970 * duplicate packet. 971 * 972 * Moreover, if the soft-interface is enslaved into a bridge, an 973 * additional DAT answer may trigger kernel warnings about 974 * a packet coming from the wrong port. 975 */ 976 if (batadv_is_my_client(bat_priv, dat_entry->mac_addr, vid)) { 977 ret = true; 978 goto out; 979 } 980 981 skb_new = arp_create(ARPOP_REPLY, ETH_P_ARP, ip_src, 982 bat_priv->soft_iface, ip_dst, hw_src, 983 dat_entry->mac_addr, hw_src); 984 if (!skb_new) 985 goto out; 986 987 if (vid & BATADV_VLAN_HAS_TAG) 988 skb_new = vlan_insert_tag(skb_new, htons(ETH_P_8021Q), 989 vid & VLAN_VID_MASK); 990 991 skb_reset_mac_header(skb_new); 992 skb_new->protocol = eth_type_trans(skb_new, 993 bat_priv->soft_iface); 994 bat_priv->stats.rx_packets++; 995 bat_priv->stats.rx_bytes += skb->len + ETH_HLEN + hdr_size; 996 bat_priv->soft_iface->last_rx = jiffies; 997 998 netif_rx(skb_new); 999 batadv_dbg(BATADV_DBG_DAT, bat_priv, "ARP request replied locally\n"); 1000 ret = true; 1001 } else { 1002 /* Send the request to the DHT */ 1003 ret = batadv_dat_send_data(bat_priv, skb, ip_dst, 1004 BATADV_P_DAT_DHT_GET); 1005 } 1006 out: 1007 if (dat_entry) 1008 batadv_dat_entry_free_ref(dat_entry); 1009 return ret; 1010 } 1011 1012 /** 1013 * batadv_dat_snoop_incoming_arp_request - snoop the ARP request and try to 1014 * answer using the local DAT storage 1015 * @bat_priv: the bat priv with all the soft interface information 1016 * @skb: packet to check 1017 * @hdr_size: size of the encapsulation header 1018 * 1019 * Returns true if the request has been answered, false otherwise. 1020 */ 1021 bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv, 1022 struct sk_buff *skb, int hdr_size) 1023 { 1024 uint16_t type; 1025 __be32 ip_src, ip_dst; 1026 uint8_t *hw_src; 1027 struct sk_buff *skb_new; 1028 struct batadv_dat_entry *dat_entry = NULL; 1029 bool ret = false; 1030 unsigned short vid; 1031 int err; 1032 1033 if (!atomic_read(&bat_priv->distributed_arp_table)) 1034 goto out; 1035 1036 vid = batadv_dat_get_vid(skb, &hdr_size); 1037 1038 type = batadv_arp_get_type(bat_priv, skb, hdr_size); 1039 if (type != ARPOP_REQUEST) 1040 goto out; 1041 1042 hw_src = batadv_arp_hw_src(skb, hdr_size); 1043 ip_src = batadv_arp_ip_src(skb, hdr_size); 1044 ip_dst = batadv_arp_ip_dst(skb, hdr_size); 1045 1046 batadv_dbg_arp(bat_priv, skb, type, hdr_size, 1047 "Parsing incoming ARP REQUEST"); 1048 1049 batadv_dat_entry_add(bat_priv, ip_src, hw_src, vid); 1050 1051 dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_dst, vid); 1052 if (!dat_entry) 1053 goto out; 1054 1055 skb_new = arp_create(ARPOP_REPLY, ETH_P_ARP, ip_src, 1056 bat_priv->soft_iface, ip_dst, hw_src, 1057 dat_entry->mac_addr, hw_src); 1058 1059 if (!skb_new) 1060 goto out; 1061 1062 /* the rest of the TX path assumes that the mac_header offset pointing 1063 * to the inner Ethernet header has been set, therefore reset it now. 1064 */ 1065 skb_reset_mac_header(skb_new); 1066 1067 if (vid & BATADV_VLAN_HAS_TAG) 1068 skb_new = vlan_insert_tag(skb_new, htons(ETH_P_8021Q), 1069 vid & VLAN_VID_MASK); 1070 1071 /* To preserve backwards compatibility, the node has choose the outgoing 1072 * format based on the incoming request packet type. The assumption is 1073 * that a node not using the 4addr packet format doesn't support it. 1074 */ 1075 if (hdr_size == sizeof(struct batadv_unicast_4addr_packet)) 1076 err = batadv_send_skb_via_tt_4addr(bat_priv, skb_new, 1077 BATADV_P_DAT_CACHE_REPLY, 1078 NULL, vid); 1079 else 1080 err = batadv_send_skb_via_tt(bat_priv, skb_new, NULL, vid); 1081 1082 if (err != NET_XMIT_DROP) { 1083 batadv_inc_counter(bat_priv, BATADV_CNT_DAT_CACHED_REPLY_TX); 1084 ret = true; 1085 } 1086 out: 1087 if (dat_entry) 1088 batadv_dat_entry_free_ref(dat_entry); 1089 if (ret) 1090 kfree_skb(skb); 1091 return ret; 1092 } 1093 1094 /** 1095 * batadv_dat_snoop_outgoing_arp_reply - snoop the ARP reply and fill the DHT 1096 * @bat_priv: the bat priv with all the soft interface information 1097 * @skb: packet to check 1098 */ 1099 void batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv, 1100 struct sk_buff *skb) 1101 { 1102 uint16_t type; 1103 __be32 ip_src, ip_dst; 1104 uint8_t *hw_src, *hw_dst; 1105 int hdr_size = 0; 1106 unsigned short vid; 1107 1108 if (!atomic_read(&bat_priv->distributed_arp_table)) 1109 return; 1110 1111 vid = batadv_dat_get_vid(skb, &hdr_size); 1112 1113 type = batadv_arp_get_type(bat_priv, skb, hdr_size); 1114 if (type != ARPOP_REPLY) 1115 return; 1116 1117 batadv_dbg_arp(bat_priv, skb, type, hdr_size, 1118 "Parsing outgoing ARP REPLY"); 1119 1120 hw_src = batadv_arp_hw_src(skb, hdr_size); 1121 ip_src = batadv_arp_ip_src(skb, hdr_size); 1122 hw_dst = batadv_arp_hw_dst(skb, hdr_size); 1123 ip_dst = batadv_arp_ip_dst(skb, hdr_size); 1124 1125 batadv_dat_entry_add(bat_priv, ip_src, hw_src, vid); 1126 batadv_dat_entry_add(bat_priv, ip_dst, hw_dst, vid); 1127 1128 /* Send the ARP reply to the candidates for both the IP addresses that 1129 * the node obtained from the ARP reply 1130 */ 1131 batadv_dat_send_data(bat_priv, skb, ip_src, BATADV_P_DAT_DHT_PUT); 1132 batadv_dat_send_data(bat_priv, skb, ip_dst, BATADV_P_DAT_DHT_PUT); 1133 } 1134 1135 /** 1136 * batadv_dat_snoop_incoming_arp_reply - snoop the ARP reply and fill the local 1137 * DAT storage only 1138 * @bat_priv: the bat priv with all the soft interface information 1139 * @skb: packet to check 1140 * @hdr_size: size of the encapsulation header 1141 */ 1142 bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv, 1143 struct sk_buff *skb, int hdr_size) 1144 { 1145 uint16_t type; 1146 __be32 ip_src, ip_dst; 1147 uint8_t *hw_src, *hw_dst; 1148 bool ret = false; 1149 unsigned short vid; 1150 1151 if (!atomic_read(&bat_priv->distributed_arp_table)) 1152 goto out; 1153 1154 vid = batadv_dat_get_vid(skb, &hdr_size); 1155 1156 type = batadv_arp_get_type(bat_priv, skb, hdr_size); 1157 if (type != ARPOP_REPLY) 1158 goto out; 1159 1160 batadv_dbg_arp(bat_priv, skb, type, hdr_size, 1161 "Parsing incoming ARP REPLY"); 1162 1163 hw_src = batadv_arp_hw_src(skb, hdr_size); 1164 ip_src = batadv_arp_ip_src(skb, hdr_size); 1165 hw_dst = batadv_arp_hw_dst(skb, hdr_size); 1166 ip_dst = batadv_arp_ip_dst(skb, hdr_size); 1167 1168 /* Update our internal cache with both the IP addresses the node got 1169 * within the ARP reply 1170 */ 1171 batadv_dat_entry_add(bat_priv, ip_src, hw_src, vid); 1172 batadv_dat_entry_add(bat_priv, ip_dst, hw_dst, vid); 1173 1174 /* if this REPLY is directed to a client of mine, let's deliver the 1175 * packet to the interface 1176 */ 1177 ret = !batadv_is_my_client(bat_priv, hw_dst, vid); 1178 out: 1179 if (ret) 1180 kfree_skb(skb); 1181 /* if ret == false -> packet has to be delivered to the interface */ 1182 return ret; 1183 } 1184 1185 /** 1186 * batadv_dat_drop_broadcast_packet - check if an ARP request has to be dropped 1187 * (because the node has already obtained the reply via DAT) or not 1188 * @bat_priv: the bat priv with all the soft interface information 1189 * @forw_packet: the broadcast packet 1190 * 1191 * Returns true if the node can drop the packet, false otherwise. 1192 */ 1193 bool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv, 1194 struct batadv_forw_packet *forw_packet) 1195 { 1196 uint16_t type; 1197 __be32 ip_dst; 1198 struct batadv_dat_entry *dat_entry = NULL; 1199 bool ret = false; 1200 int hdr_size = sizeof(struct batadv_bcast_packet); 1201 unsigned short vid; 1202 1203 if (!atomic_read(&bat_priv->distributed_arp_table)) 1204 goto out; 1205 1206 /* If this packet is an ARP_REQUEST and the node already has the 1207 * information that it is going to ask, then the packet can be dropped 1208 */ 1209 if (forw_packet->num_packets) 1210 goto out; 1211 1212 vid = batadv_dat_get_vid(forw_packet->skb, &hdr_size); 1213 1214 type = batadv_arp_get_type(bat_priv, forw_packet->skb, hdr_size); 1215 if (type != ARPOP_REQUEST) 1216 goto out; 1217 1218 ip_dst = batadv_arp_ip_dst(forw_packet->skb, hdr_size); 1219 dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_dst, vid); 1220 /* check if the node already got this entry */ 1221 if (!dat_entry) { 1222 batadv_dbg(BATADV_DBG_DAT, bat_priv, 1223 "ARP Request for %pI4: fallback\n", &ip_dst); 1224 goto out; 1225 } 1226 1227 batadv_dbg(BATADV_DBG_DAT, bat_priv, 1228 "ARP Request for %pI4: fallback prevented\n", &ip_dst); 1229 ret = true; 1230 1231 out: 1232 if (dat_entry) 1233 batadv_dat_entry_free_ref(dat_entry); 1234 return ret; 1235 } 1236