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