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