1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright (C) 2007-2018 B.A.T.M.A.N. contributors: 3 * 4 * Marek Lindner, Simon Wunderlich 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of version 2 of the GNU General Public 8 * License as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #ifndef _NET_BATMAN_ADV_TYPES_H_ 20 #define _NET_BATMAN_ADV_TYPES_H_ 21 22 #ifndef _NET_BATMAN_ADV_MAIN_H_ 23 #error only "main.h" can be included directly 24 #endif 25 26 #include <linux/average.h> 27 #include <linux/bitops.h> 28 #include <linux/compiler.h> 29 #include <linux/if_ether.h> 30 #include <linux/kref.h> 31 #include <linux/netdevice.h> 32 #include <linux/netlink.h> 33 #include <linux/sched.h> /* for linux/wait.h */ 34 #include <linux/spinlock.h> 35 #include <linux/types.h> 36 #include <linux/wait.h> 37 #include <linux/workqueue.h> 38 #include <uapi/linux/batadv_packet.h> 39 #include <uapi/linux/batman_adv.h> 40 41 struct seq_file; 42 43 #ifdef CONFIG_BATMAN_ADV_DAT 44 45 /** 46 * typedef batadv_dat_addr_t - type used for all DHT addresses 47 * 48 * If it is changed, BATADV_DAT_ADDR_MAX is changed as well. 49 * 50 * *Please be careful: batadv_dat_addr_t must be UNSIGNED* 51 */ 52 typedef u16 batadv_dat_addr_t; 53 54 #endif /* CONFIG_BATMAN_ADV_DAT */ 55 56 /** 57 * enum batadv_dhcp_recipient - dhcp destination 58 */ 59 enum batadv_dhcp_recipient { 60 /** @BATADV_DHCP_NO: packet is not a dhcp message */ 61 BATADV_DHCP_NO = 0, 62 63 /** @BATADV_DHCP_TO_SERVER: dhcp message is directed to a server */ 64 BATADV_DHCP_TO_SERVER, 65 66 /** @BATADV_DHCP_TO_CLIENT: dhcp message is directed to a client */ 67 BATADV_DHCP_TO_CLIENT, 68 }; 69 70 /** 71 * BATADV_TT_REMOTE_MASK - bitmask selecting the flags that are sent over the 72 * wire only 73 */ 74 #define BATADV_TT_REMOTE_MASK 0x00FF 75 76 /** 77 * BATADV_TT_SYNC_MASK - bitmask of the flags that need to be kept in sync 78 * among the nodes. These flags are used to compute the global/local CRC 79 */ 80 #define BATADV_TT_SYNC_MASK 0x00F0 81 82 /** 83 * struct batadv_hard_iface_bat_iv - per hard-interface B.A.T.M.A.N. IV data 84 */ 85 struct batadv_hard_iface_bat_iv { 86 /** @ogm_buff: buffer holding the OGM packet */ 87 unsigned char *ogm_buff; 88 89 /** @ogm_buff_len: length of the OGM packet buffer */ 90 int ogm_buff_len; 91 92 /** @ogm_seqno: OGM sequence number - used to identify each OGM */ 93 atomic_t ogm_seqno; 94 }; 95 96 /** 97 * enum batadv_v_hard_iface_flags - interface flags useful to B.A.T.M.A.N. V 98 */ 99 enum batadv_v_hard_iface_flags { 100 /** 101 * @BATADV_FULL_DUPLEX: tells if the connection over this link is 102 * full-duplex 103 */ 104 BATADV_FULL_DUPLEX = BIT(0), 105 106 /** 107 * @BATADV_WARNING_DEFAULT: tells whether we have warned the user that 108 * no throughput data is available for this interface and that default 109 * values are assumed. 110 */ 111 BATADV_WARNING_DEFAULT = BIT(1), 112 }; 113 114 /** 115 * struct batadv_hard_iface_bat_v - per hard-interface B.A.T.M.A.N. V data 116 */ 117 struct batadv_hard_iface_bat_v { 118 /** @elp_interval: time interval between two ELP transmissions */ 119 atomic_t elp_interval; 120 121 /** @elp_seqno: current ELP sequence number */ 122 atomic_t elp_seqno; 123 124 /** @elp_skb: base skb containing the ELP message to send */ 125 struct sk_buff *elp_skb; 126 127 /** @elp_wq: workqueue used to schedule ELP transmissions */ 128 struct delayed_work elp_wq; 129 130 /** 131 * @throughput_override: throughput override to disable link 132 * auto-detection 133 */ 134 atomic_t throughput_override; 135 136 /** @flags: interface specific flags */ 137 u8 flags; 138 }; 139 140 /** 141 * enum batadv_hard_iface_wifi_flags - Flags describing the wifi configuration 142 * of a batadv_hard_iface 143 */ 144 enum batadv_hard_iface_wifi_flags { 145 /** @BATADV_HARDIF_WIFI_WEXT_DIRECT: it is a wext wifi device */ 146 BATADV_HARDIF_WIFI_WEXT_DIRECT = BIT(0), 147 148 /** @BATADV_HARDIF_WIFI_CFG80211_DIRECT: it is a cfg80211 wifi device */ 149 BATADV_HARDIF_WIFI_CFG80211_DIRECT = BIT(1), 150 151 /** 152 * @BATADV_HARDIF_WIFI_WEXT_INDIRECT: link device is a wext wifi device 153 */ 154 BATADV_HARDIF_WIFI_WEXT_INDIRECT = BIT(2), 155 156 /** 157 * @BATADV_HARDIF_WIFI_CFG80211_INDIRECT: link device is a cfg80211 wifi 158 * device 159 */ 160 BATADV_HARDIF_WIFI_CFG80211_INDIRECT = BIT(3), 161 }; 162 163 /** 164 * struct batadv_hard_iface - network device known to batman-adv 165 */ 166 struct batadv_hard_iface { 167 /** @list: list node for batadv_hardif_list */ 168 struct list_head list; 169 170 /** @if_status: status of the interface for batman-adv */ 171 char if_status; 172 173 /** 174 * @num_bcasts: number of payload re-broadcasts on this interface (ARQ) 175 */ 176 u8 num_bcasts; 177 178 /** 179 * @wifi_flags: flags whether this is (directly or indirectly) a wifi 180 * interface 181 */ 182 u32 wifi_flags; 183 184 /** @net_dev: pointer to the net_device */ 185 struct net_device *net_dev; 186 187 /** @hardif_obj: kobject of the per interface sysfs "mesh" directory */ 188 struct kobject *hardif_obj; 189 190 /** @refcount: number of contexts the object is used */ 191 struct kref refcount; 192 193 /** 194 * @batman_adv_ptype: packet type describing packets that should be 195 * processed by batman-adv for this interface 196 */ 197 struct packet_type batman_adv_ptype; 198 199 /** 200 * @soft_iface: the batman-adv interface which uses this network 201 * interface 202 */ 203 struct net_device *soft_iface; 204 205 /** @rcu: struct used for freeing in an RCU-safe manner */ 206 struct rcu_head rcu; 207 208 /** @bat_iv: per hard-interface B.A.T.M.A.N. IV data */ 209 struct batadv_hard_iface_bat_iv bat_iv; 210 211 #ifdef CONFIG_BATMAN_ADV_BATMAN_V 212 /** @bat_v: per hard-interface B.A.T.M.A.N. V data */ 213 struct batadv_hard_iface_bat_v bat_v; 214 #endif 215 216 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 217 /** 218 * @debug_dir: dentry for nc subdir in batman-adv directory in debugfs 219 */ 220 struct dentry *debug_dir; 221 #endif 222 223 /** 224 * @neigh_list: list of unique single hop neighbors via this interface 225 */ 226 struct hlist_head neigh_list; 227 228 /** @neigh_list_lock: lock protecting neigh_list */ 229 spinlock_t neigh_list_lock; 230 }; 231 232 /** 233 * struct batadv_orig_ifinfo - B.A.T.M.A.N. IV private orig_ifinfo members 234 */ 235 struct batadv_orig_ifinfo_bat_iv { 236 /** 237 * @bcast_own: bitfield which counts the number of our OGMs this 238 * orig_node rebroadcasted "back" to us (relative to last_real_seqno) 239 */ 240 DECLARE_BITMAP(bcast_own, BATADV_TQ_LOCAL_WINDOW_SIZE); 241 242 /** @bcast_own_sum: sum of bcast_own */ 243 u8 bcast_own_sum; 244 }; 245 246 /** 247 * struct batadv_orig_ifinfo - originator info per outgoing interface 248 */ 249 struct batadv_orig_ifinfo { 250 /** @list: list node for &batadv_orig_node.ifinfo_list */ 251 struct hlist_node list; 252 253 /** @if_outgoing: pointer to outgoing hard-interface */ 254 struct batadv_hard_iface *if_outgoing; 255 256 /** @router: router that should be used to reach this originator */ 257 struct batadv_neigh_node __rcu *router; 258 259 /** @last_real_seqno: last and best known sequence number */ 260 u32 last_real_seqno; 261 262 /** @last_ttl: ttl of last received packet */ 263 u8 last_ttl; 264 265 /** @last_seqno_forwarded: seqno of the OGM which was forwarded last */ 266 u32 last_seqno_forwarded; 267 268 /** @batman_seqno_reset: time when the batman seqno window was reset */ 269 unsigned long batman_seqno_reset; 270 271 /** @bat_iv: B.A.T.M.A.N. IV private structure */ 272 struct batadv_orig_ifinfo_bat_iv bat_iv; 273 274 /** @refcount: number of contexts the object is used */ 275 struct kref refcount; 276 277 /** @rcu: struct used for freeing in an RCU-safe manner */ 278 struct rcu_head rcu; 279 }; 280 281 /** 282 * struct batadv_frag_table_entry - head in the fragment buffer table 283 */ 284 struct batadv_frag_table_entry { 285 /** @fragment_list: head of list with fragments */ 286 struct hlist_head fragment_list; 287 288 /** @lock: lock to protect the list of fragments */ 289 spinlock_t lock; 290 291 /** @timestamp: time (jiffie) of last received fragment */ 292 unsigned long timestamp; 293 294 /** @seqno: sequence number of the fragments in the list */ 295 u16 seqno; 296 297 /** @size: accumulated size of packets in list */ 298 u16 size; 299 300 /** @total_size: expected size of the assembled packet */ 301 u16 total_size; 302 }; 303 304 /** 305 * struct batadv_frag_list_entry - entry in a list of fragments 306 */ 307 struct batadv_frag_list_entry { 308 /** @list: list node information */ 309 struct hlist_node list; 310 311 /** @skb: fragment */ 312 struct sk_buff *skb; 313 314 /** @no: fragment number in the set */ 315 u8 no; 316 }; 317 318 /** 319 * struct batadv_vlan_tt - VLAN specific TT attributes 320 */ 321 struct batadv_vlan_tt { 322 /** @crc: CRC32 checksum of the entries belonging to this vlan */ 323 u32 crc; 324 325 /** @num_entries: number of TT entries for this VLAN */ 326 atomic_t num_entries; 327 }; 328 329 /** 330 * struct batadv_orig_node_vlan - VLAN specific data per orig_node 331 */ 332 struct batadv_orig_node_vlan { 333 /** @vid: the VLAN identifier */ 334 unsigned short vid; 335 336 /** @tt: VLAN specific TT attributes */ 337 struct batadv_vlan_tt tt; 338 339 /** @list: list node for &batadv_orig_node.vlan_list */ 340 struct hlist_node list; 341 342 /** 343 * @refcount: number of context where this object is currently in use 344 */ 345 struct kref refcount; 346 347 /** @rcu: struct used for freeing in a RCU-safe manner */ 348 struct rcu_head rcu; 349 }; 350 351 /** 352 * struct batadv_orig_bat_iv - B.A.T.M.A.N. IV private orig_node members 353 */ 354 struct batadv_orig_bat_iv { 355 /** 356 * @ogm_cnt_lock: lock protecting &batadv_orig_ifinfo_bat_iv.bcast_own, 357 * &batadv_orig_ifinfo_bat_iv.bcast_own_sum, 358 * &batadv_neigh_ifinfo_bat_iv.bat_iv.real_bits and 359 * &batadv_neigh_ifinfo_bat_iv.real_packet_count 360 */ 361 spinlock_t ogm_cnt_lock; 362 }; 363 364 /** 365 * struct batadv_orig_node - structure for orig_list maintaining nodes of mesh 366 */ 367 struct batadv_orig_node { 368 /** @orig: originator ethernet address */ 369 u8 orig[ETH_ALEN]; 370 371 /** @ifinfo_list: list for routers per outgoing interface */ 372 struct hlist_head ifinfo_list; 373 374 /** 375 * @last_bonding_candidate: pointer to last ifinfo of last used router 376 */ 377 struct batadv_orig_ifinfo *last_bonding_candidate; 378 379 #ifdef CONFIG_BATMAN_ADV_DAT 380 /** @dat_addr: address of the orig node in the distributed hash */ 381 batadv_dat_addr_t dat_addr; 382 #endif 383 384 /** @last_seen: time when last packet from this node was received */ 385 unsigned long last_seen; 386 387 /** 388 * @bcast_seqno_reset: time when the broadcast seqno window was reset 389 */ 390 unsigned long bcast_seqno_reset; 391 392 #ifdef CONFIG_BATMAN_ADV_MCAST 393 /** 394 * @mcast_handler_lock: synchronizes mcast-capability and -flag changes 395 */ 396 spinlock_t mcast_handler_lock; 397 398 /** @mcast_flags: multicast flags announced by the orig node */ 399 u8 mcast_flags; 400 401 /** 402 * @mcast_want_all_unsnoopables_node: a list node for the 403 * mcast.want_all_unsnoopables list 404 */ 405 struct hlist_node mcast_want_all_unsnoopables_node; 406 407 /** 408 * @mcast_want_all_ipv4_node: a list node for the mcast.want_all_ipv4 409 * list 410 */ 411 struct hlist_node mcast_want_all_ipv4_node; 412 /** 413 * @mcast_want_all_ipv6_node: a list node for the mcast.want_all_ipv6 414 * list 415 */ 416 struct hlist_node mcast_want_all_ipv6_node; 417 #endif 418 419 /** @capabilities: announced capabilities of this originator */ 420 unsigned long capabilities; 421 422 /** 423 * @capa_initialized: bitfield to remember whether a capability was 424 * initialized 425 */ 426 unsigned long capa_initialized; 427 428 /** @last_ttvn: last seen translation table version number */ 429 atomic_t last_ttvn; 430 431 /** @tt_buff: last tt changeset this node received from the orig node */ 432 unsigned char *tt_buff; 433 434 /** 435 * @tt_buff_len: length of the last tt changeset this node received 436 * from the orig node 437 */ 438 s16 tt_buff_len; 439 440 /** @tt_buff_lock: lock that protects tt_buff and tt_buff_len */ 441 spinlock_t tt_buff_lock; 442 443 /** 444 * @tt_lock: prevents from updating the table while reading it. Table 445 * update is made up by two operations (data structure update and 446 * metdata -CRC/TTVN-recalculation) and they have to be executed 447 * atomically in order to avoid another thread to read the 448 * table/metadata between those. 449 */ 450 spinlock_t tt_lock; 451 452 /** 453 * @bcast_bits: bitfield containing the info which payload broadcast 454 * originated from this orig node this host already has seen (relative 455 * to last_bcast_seqno) 456 */ 457 DECLARE_BITMAP(bcast_bits, BATADV_TQ_LOCAL_WINDOW_SIZE); 458 459 /** 460 * @last_bcast_seqno: last broadcast sequence number received by this 461 * host 462 */ 463 u32 last_bcast_seqno; 464 465 /** 466 * @neigh_list: list of potential next hop neighbor towards this orig 467 * node 468 */ 469 struct hlist_head neigh_list; 470 471 /** 472 * @neigh_list_lock: lock protecting neigh_list, ifinfo_list, 473 * last_bonding_candidate and router 474 */ 475 spinlock_t neigh_list_lock; 476 477 /** @hash_entry: hlist node for &batadv_priv.orig_hash */ 478 struct hlist_node hash_entry; 479 480 /** @bat_priv: pointer to soft_iface this orig node belongs to */ 481 struct batadv_priv *bat_priv; 482 483 /** @bcast_seqno_lock: lock protecting bcast_bits & last_bcast_seqno */ 484 spinlock_t bcast_seqno_lock; 485 486 /** @refcount: number of contexts the object is used */ 487 struct kref refcount; 488 489 /** @rcu: struct used for freeing in an RCU-safe manner */ 490 struct rcu_head rcu; 491 492 #ifdef CONFIG_BATMAN_ADV_NC 493 /** @in_coding_list: list of nodes this orig can hear */ 494 struct list_head in_coding_list; 495 496 /** @out_coding_list: list of nodes that can hear this orig */ 497 struct list_head out_coding_list; 498 499 /** @in_coding_list_lock: protects in_coding_list */ 500 spinlock_t in_coding_list_lock; 501 502 /** @out_coding_list_lock: protects out_coding_list */ 503 spinlock_t out_coding_list_lock; 504 #endif 505 506 /** @fragments: array with heads for fragment chains */ 507 struct batadv_frag_table_entry fragments[BATADV_FRAG_BUFFER_COUNT]; 508 509 /** 510 * @vlan_list: a list of orig_node_vlan structs, one per VLAN served by 511 * the originator represented by this object 512 */ 513 struct hlist_head vlan_list; 514 515 /** @vlan_list_lock: lock protecting vlan_list */ 516 spinlock_t vlan_list_lock; 517 518 /** @bat_iv: B.A.T.M.A.N. IV private structure */ 519 struct batadv_orig_bat_iv bat_iv; 520 }; 521 522 /** 523 * enum batadv_orig_capabilities - orig node capabilities 524 */ 525 enum batadv_orig_capabilities { 526 /** 527 * @BATADV_ORIG_CAPA_HAS_DAT: orig node has distributed arp table 528 * enabled 529 */ 530 BATADV_ORIG_CAPA_HAS_DAT, 531 532 /** @BATADV_ORIG_CAPA_HAS_NC: orig node has network coding enabled */ 533 BATADV_ORIG_CAPA_HAS_NC, 534 535 /** @BATADV_ORIG_CAPA_HAS_TT: orig node has tt capability */ 536 BATADV_ORIG_CAPA_HAS_TT, 537 538 /** 539 * @BATADV_ORIG_CAPA_HAS_MCAST: orig node has some multicast capability 540 * (= orig node announces a tvlv of type BATADV_TVLV_MCAST) 541 */ 542 BATADV_ORIG_CAPA_HAS_MCAST, 543 }; 544 545 /** 546 * struct batadv_gw_node - structure for orig nodes announcing gw capabilities 547 */ 548 struct batadv_gw_node { 549 /** @list: list node for &batadv_priv_gw.list */ 550 struct hlist_node list; 551 552 /** @orig_node: pointer to corresponding orig node */ 553 struct batadv_orig_node *orig_node; 554 555 /** @bandwidth_down: advertised uplink download bandwidth */ 556 u32 bandwidth_down; 557 558 /** @bandwidth_up: advertised uplink upload bandwidth */ 559 u32 bandwidth_up; 560 561 /** @refcount: number of contexts the object is used */ 562 struct kref refcount; 563 564 /** @rcu: struct used for freeing in an RCU-safe manner */ 565 struct rcu_head rcu; 566 }; 567 568 DECLARE_EWMA(throughput, 10, 8) 569 570 /** 571 * struct batadv_hardif_neigh_node_bat_v - B.A.T.M.A.N. V private neighbor 572 * information 573 */ 574 struct batadv_hardif_neigh_node_bat_v { 575 /** @throughput: ewma link throughput towards this neighbor */ 576 struct ewma_throughput throughput; 577 578 /** @elp_interval: time interval between two ELP transmissions */ 579 u32 elp_interval; 580 581 /** @elp_latest_seqno: latest and best known ELP sequence number */ 582 u32 elp_latest_seqno; 583 584 /** 585 * @last_unicast_tx: when the last unicast packet has been sent to this 586 * neighbor 587 */ 588 unsigned long last_unicast_tx; 589 590 /** @metric_work: work queue callback item for metric update */ 591 struct work_struct metric_work; 592 }; 593 594 /** 595 * struct batadv_hardif_neigh_node - unique neighbor per hard-interface 596 */ 597 struct batadv_hardif_neigh_node { 598 /** @list: list node for &batadv_hard_iface.neigh_list */ 599 struct hlist_node list; 600 601 /** @addr: the MAC address of the neighboring interface */ 602 u8 addr[ETH_ALEN]; 603 604 /** 605 * @orig: the address of the originator this neighbor node belongs to 606 */ 607 u8 orig[ETH_ALEN]; 608 609 /** @if_incoming: pointer to incoming hard-interface */ 610 struct batadv_hard_iface *if_incoming; 611 612 /** @last_seen: when last packet via this neighbor was received */ 613 unsigned long last_seen; 614 615 #ifdef CONFIG_BATMAN_ADV_BATMAN_V 616 /** @bat_v: B.A.T.M.A.N. V private data */ 617 struct batadv_hardif_neigh_node_bat_v bat_v; 618 #endif 619 620 /** @refcount: number of contexts the object is used */ 621 struct kref refcount; 622 623 /** @rcu: struct used for freeing in a RCU-safe manner */ 624 struct rcu_head rcu; 625 }; 626 627 /** 628 * struct batadv_neigh_node - structure for single hops neighbors 629 */ 630 struct batadv_neigh_node { 631 /** @list: list node for &batadv_orig_node.neigh_list */ 632 struct hlist_node list; 633 634 /** @orig_node: pointer to corresponding orig_node */ 635 struct batadv_orig_node *orig_node; 636 637 /** @addr: the MAC address of the neighboring interface */ 638 u8 addr[ETH_ALEN]; 639 640 /** @ifinfo_list: list for routing metrics per outgoing interface */ 641 struct hlist_head ifinfo_list; 642 643 /** @ifinfo_lock: lock protecting ifinfo_list and its members */ 644 spinlock_t ifinfo_lock; 645 646 /** @if_incoming: pointer to incoming hard-interface */ 647 struct batadv_hard_iface *if_incoming; 648 649 /** @last_seen: when last packet via this neighbor was received */ 650 unsigned long last_seen; 651 652 /** @hardif_neigh: hardif_neigh of this neighbor */ 653 struct batadv_hardif_neigh_node *hardif_neigh; 654 655 /** @refcount: number of contexts the object is used */ 656 struct kref refcount; 657 658 /** @rcu: struct used for freeing in an RCU-safe manner */ 659 struct rcu_head rcu; 660 }; 661 662 /** 663 * struct batadv_neigh_ifinfo_bat_iv - neighbor information per outgoing 664 * interface for B.A.T.M.A.N. IV 665 */ 666 struct batadv_neigh_ifinfo_bat_iv { 667 /** @tq_recv: ring buffer of received TQ values from this neigh node */ 668 u8 tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE]; 669 670 /** @tq_index: ring buffer index */ 671 u8 tq_index; 672 673 /** 674 * @tq_avg: averaged tq of all tq values in the ring buffer (tq_recv) 675 */ 676 u8 tq_avg; 677 678 /** 679 * @real_bits: bitfield containing the number of OGMs received from this 680 * neigh node (relative to orig_node->last_real_seqno) 681 */ 682 DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE); 683 684 /** @real_packet_count: counted result of real_bits */ 685 u8 real_packet_count; 686 }; 687 688 /** 689 * struct batadv_neigh_ifinfo_bat_v - neighbor information per outgoing 690 * interface for B.A.T.M.A.N. V 691 */ 692 struct batadv_neigh_ifinfo_bat_v { 693 /** 694 * @throughput: last throughput metric received from originator via this 695 * neigh 696 */ 697 u32 throughput; 698 699 /** @last_seqno: last sequence number known for this neighbor */ 700 u32 last_seqno; 701 }; 702 703 /** 704 * struct batadv_neigh_ifinfo - neighbor information per outgoing interface 705 */ 706 struct batadv_neigh_ifinfo { 707 /** @list: list node for &batadv_neigh_node.ifinfo_list */ 708 struct hlist_node list; 709 710 /** @if_outgoing: pointer to outgoing hard-interface */ 711 struct batadv_hard_iface *if_outgoing; 712 713 /** @bat_iv: B.A.T.M.A.N. IV private structure */ 714 struct batadv_neigh_ifinfo_bat_iv bat_iv; 715 716 #ifdef CONFIG_BATMAN_ADV_BATMAN_V 717 /** @bat_v: B.A.T.M.A.N. V private data */ 718 struct batadv_neigh_ifinfo_bat_v bat_v; 719 #endif 720 721 /** @last_ttl: last received ttl from this neigh node */ 722 u8 last_ttl; 723 724 /** @refcount: number of contexts the object is used */ 725 struct kref refcount; 726 727 /** @rcu: struct used for freeing in a RCU-safe manner */ 728 struct rcu_head rcu; 729 }; 730 731 #ifdef CONFIG_BATMAN_ADV_BLA 732 733 /** 734 * struct batadv_bcast_duplist_entry - structure for LAN broadcast suppression 735 */ 736 struct batadv_bcast_duplist_entry { 737 /** @orig: mac address of orig node orginating the broadcast */ 738 u8 orig[ETH_ALEN]; 739 740 /** @crc: crc32 checksum of broadcast payload */ 741 __be32 crc; 742 743 /** @entrytime: time when the broadcast packet was received */ 744 unsigned long entrytime; 745 }; 746 #endif 747 748 /** 749 * enum batadv_counters - indices for traffic counters 750 */ 751 enum batadv_counters { 752 /** @BATADV_CNT_TX: transmitted payload traffic packet counter */ 753 BATADV_CNT_TX, 754 755 /** @BATADV_CNT_TX_BYTES: transmitted payload traffic bytes counter */ 756 BATADV_CNT_TX_BYTES, 757 758 /** 759 * @BATADV_CNT_TX_DROPPED: dropped transmission payload traffic packet 760 * counter 761 */ 762 BATADV_CNT_TX_DROPPED, 763 764 /** @BATADV_CNT_RX: received payload traffic packet counter */ 765 BATADV_CNT_RX, 766 767 /** @BATADV_CNT_RX_BYTES: received payload traffic bytes counter */ 768 BATADV_CNT_RX_BYTES, 769 770 /** @BATADV_CNT_FORWARD: forwarded payload traffic packet counter */ 771 BATADV_CNT_FORWARD, 772 773 /** 774 * @BATADV_CNT_FORWARD_BYTES: forwarded payload traffic bytes counter 775 */ 776 BATADV_CNT_FORWARD_BYTES, 777 778 /** 779 * @BATADV_CNT_MGMT_TX: transmitted routing protocol traffic packet 780 * counter 781 */ 782 BATADV_CNT_MGMT_TX, 783 784 /** 785 * @BATADV_CNT_MGMT_TX_BYTES: transmitted routing protocol traffic bytes 786 * counter 787 */ 788 BATADV_CNT_MGMT_TX_BYTES, 789 790 /** 791 * @BATADV_CNT_MGMT_RX: received routing protocol traffic packet counter 792 */ 793 BATADV_CNT_MGMT_RX, 794 795 /** 796 * @BATADV_CNT_MGMT_RX_BYTES: received routing protocol traffic bytes 797 * counter 798 */ 799 BATADV_CNT_MGMT_RX_BYTES, 800 801 /** @BATADV_CNT_FRAG_TX: transmitted fragment traffic packet counter */ 802 BATADV_CNT_FRAG_TX, 803 804 /** 805 * @BATADV_CNT_FRAG_TX_BYTES: transmitted fragment traffic bytes counter 806 */ 807 BATADV_CNT_FRAG_TX_BYTES, 808 809 /** @BATADV_CNT_FRAG_RX: received fragment traffic packet counter */ 810 BATADV_CNT_FRAG_RX, 811 812 /** 813 * @BATADV_CNT_FRAG_RX_BYTES: received fragment traffic bytes counter 814 */ 815 BATADV_CNT_FRAG_RX_BYTES, 816 817 /** @BATADV_CNT_FRAG_FWD: forwarded fragment traffic packet counter */ 818 BATADV_CNT_FRAG_FWD, 819 820 /** 821 * @BATADV_CNT_FRAG_FWD_BYTES: forwarded fragment traffic bytes counter 822 */ 823 BATADV_CNT_FRAG_FWD_BYTES, 824 825 /** 826 * @BATADV_CNT_TT_REQUEST_TX: transmitted tt req traffic packet counter 827 */ 828 BATADV_CNT_TT_REQUEST_TX, 829 830 /** @BATADV_CNT_TT_REQUEST_RX: received tt req traffic packet counter */ 831 BATADV_CNT_TT_REQUEST_RX, 832 833 /** 834 * @BATADV_CNT_TT_RESPONSE_TX: transmitted tt resp traffic packet 835 * counter 836 */ 837 BATADV_CNT_TT_RESPONSE_TX, 838 839 /** 840 * @BATADV_CNT_TT_RESPONSE_RX: received tt resp traffic packet counter 841 */ 842 BATADV_CNT_TT_RESPONSE_RX, 843 844 /** 845 * @BATADV_CNT_TT_ROAM_ADV_TX: transmitted tt roam traffic packet 846 * counter 847 */ 848 BATADV_CNT_TT_ROAM_ADV_TX, 849 850 /** 851 * @BATADV_CNT_TT_ROAM_ADV_RX: received tt roam traffic packet counter 852 */ 853 BATADV_CNT_TT_ROAM_ADV_RX, 854 855 #ifdef CONFIG_BATMAN_ADV_DAT 856 /** 857 * @BATADV_CNT_DAT_GET_TX: transmitted dht GET traffic packet counter 858 */ 859 BATADV_CNT_DAT_GET_TX, 860 861 /** @BATADV_CNT_DAT_GET_RX: received dht GET traffic packet counter */ 862 BATADV_CNT_DAT_GET_RX, 863 864 /** 865 * @BATADV_CNT_DAT_PUT_TX: transmitted dht PUT traffic packet counter 866 */ 867 BATADV_CNT_DAT_PUT_TX, 868 869 /** @BATADV_CNT_DAT_PUT_RX: received dht PUT traffic packet counter */ 870 BATADV_CNT_DAT_PUT_RX, 871 872 /** 873 * @BATADV_CNT_DAT_CACHED_REPLY_TX: transmitted dat cache reply traffic 874 * packet counter 875 */ 876 BATADV_CNT_DAT_CACHED_REPLY_TX, 877 #endif 878 879 #ifdef CONFIG_BATMAN_ADV_NC 880 /** 881 * @BATADV_CNT_NC_CODE: transmitted nc-combined traffic packet counter 882 */ 883 BATADV_CNT_NC_CODE, 884 885 /** 886 * @BATADV_CNT_NC_CODE_BYTES: transmitted nc-combined traffic bytes 887 * counter 888 */ 889 BATADV_CNT_NC_CODE_BYTES, 890 891 /** 892 * @BATADV_CNT_NC_RECODE: transmitted nc-recombined traffic packet 893 * counter 894 */ 895 BATADV_CNT_NC_RECODE, 896 897 /** 898 * @BATADV_CNT_NC_RECODE_BYTES: transmitted nc-recombined traffic bytes 899 * counter 900 */ 901 BATADV_CNT_NC_RECODE_BYTES, 902 903 /** 904 * @BATADV_CNT_NC_BUFFER: counter for packets buffered for later nc 905 * decoding 906 */ 907 BATADV_CNT_NC_BUFFER, 908 909 /** 910 * @BATADV_CNT_NC_DECODE: received and nc-decoded traffic packet counter 911 */ 912 BATADV_CNT_NC_DECODE, 913 914 /** 915 * @BATADV_CNT_NC_DECODE_BYTES: received and nc-decoded traffic bytes 916 * counter 917 */ 918 BATADV_CNT_NC_DECODE_BYTES, 919 920 /** 921 * @BATADV_CNT_NC_DECODE_FAILED: received and decode-failed traffic 922 * packet counter 923 */ 924 BATADV_CNT_NC_DECODE_FAILED, 925 926 /** 927 * @BATADV_CNT_NC_SNIFFED: counter for nc-decoded packets received in 928 * promisc mode. 929 */ 930 BATADV_CNT_NC_SNIFFED, 931 #endif 932 933 /** @BATADV_CNT_NUM: number of traffic counters */ 934 BATADV_CNT_NUM, 935 }; 936 937 /** 938 * struct batadv_priv_tt - per mesh interface translation table data 939 */ 940 struct batadv_priv_tt { 941 /** @vn: translation table version number */ 942 atomic_t vn; 943 944 /** 945 * @ogm_append_cnt: counter of number of OGMs containing the local tt 946 * diff 947 */ 948 atomic_t ogm_append_cnt; 949 950 /** @local_changes: changes registered in an originator interval */ 951 atomic_t local_changes; 952 953 /** 954 * @changes_list: tracks tt local changes within an originator interval 955 */ 956 struct list_head changes_list; 957 958 /** @local_hash: local translation table hash table */ 959 struct batadv_hashtable *local_hash; 960 961 /** @global_hash: global translation table hash table */ 962 struct batadv_hashtable *global_hash; 963 964 /** @req_list: list of pending & unanswered tt_requests */ 965 struct hlist_head req_list; 966 967 /** 968 * @roam_list: list of the last roaming events of each client limiting 969 * the number of roaming events to avoid route flapping 970 */ 971 struct list_head roam_list; 972 973 /** @changes_list_lock: lock protecting changes_list */ 974 spinlock_t changes_list_lock; 975 976 /** @req_list_lock: lock protecting req_list */ 977 spinlock_t req_list_lock; 978 979 /** @roam_list_lock: lock protecting roam_list */ 980 spinlock_t roam_list_lock; 981 982 /** @last_changeset: last tt changeset this host has generated */ 983 unsigned char *last_changeset; 984 985 /** 986 * @last_changeset_len: length of last tt changeset this host has 987 * generated 988 */ 989 s16 last_changeset_len; 990 991 /** 992 * @last_changeset_lock: lock protecting last_changeset & 993 * last_changeset_len 994 */ 995 spinlock_t last_changeset_lock; 996 997 /** 998 * @commit_lock: prevents from executing a local TT commit while reading 999 * the local table. The local TT commit is made up by two operations 1000 * (data structure update and metdata -CRC/TTVN- recalculation) and 1001 * they have to be executed atomically in order to avoid another thread 1002 * to read the table/metadata between those. 1003 */ 1004 spinlock_t commit_lock; 1005 1006 /** @work: work queue callback item for translation table purging */ 1007 struct delayed_work work; 1008 }; 1009 1010 #ifdef CONFIG_BATMAN_ADV_BLA 1011 1012 /** 1013 * struct batadv_priv_bla - per mesh interface bridge loope avoidance data 1014 */ 1015 struct batadv_priv_bla { 1016 /** @num_requests: number of bla requests in flight */ 1017 atomic_t num_requests; 1018 1019 /** 1020 * @claim_hash: hash table containing mesh nodes this host has claimed 1021 */ 1022 struct batadv_hashtable *claim_hash; 1023 1024 /** 1025 * @backbone_hash: hash table containing all detected backbone gateways 1026 */ 1027 struct batadv_hashtable *backbone_hash; 1028 1029 /** @loopdetect_addr: MAC address used for own loopdetection frames */ 1030 u8 loopdetect_addr[ETH_ALEN]; 1031 1032 /** 1033 * @loopdetect_lasttime: time when the loopdetection frames were sent 1034 */ 1035 unsigned long loopdetect_lasttime; 1036 1037 /** 1038 * @loopdetect_next: how many periods to wait for the next loopdetect 1039 * process 1040 */ 1041 atomic_t loopdetect_next; 1042 1043 /** 1044 * @bcast_duplist: recently received broadcast packets array (for 1045 * broadcast duplicate suppression) 1046 */ 1047 struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE]; 1048 1049 /** 1050 * @bcast_duplist_curr: index of last broadcast packet added to 1051 * bcast_duplist 1052 */ 1053 int bcast_duplist_curr; 1054 1055 /** 1056 * @bcast_duplist_lock: lock protecting bcast_duplist & 1057 * bcast_duplist_curr 1058 */ 1059 spinlock_t bcast_duplist_lock; 1060 1061 /** @claim_dest: local claim data (e.g. claim group) */ 1062 struct batadv_bla_claim_dst claim_dest; 1063 1064 /** @work: work queue callback item for cleanups & bla announcements */ 1065 struct delayed_work work; 1066 }; 1067 #endif 1068 1069 #ifdef CONFIG_BATMAN_ADV_DEBUG 1070 1071 /** 1072 * struct batadv_priv_debug_log - debug logging data 1073 */ 1074 struct batadv_priv_debug_log { 1075 /** @log_buff: buffer holding the logs (ring bufer) */ 1076 char log_buff[BATADV_LOG_BUF_LEN]; 1077 1078 /** @log_start: index of next character to read */ 1079 unsigned long log_start; 1080 1081 /** @log_end: index of next character to write */ 1082 unsigned long log_end; 1083 1084 /** @lock: lock protecting log_buff, log_start & log_end */ 1085 spinlock_t lock; 1086 1087 /** @queue_wait: log reader's wait queue */ 1088 wait_queue_head_t queue_wait; 1089 }; 1090 #endif 1091 1092 /** 1093 * struct batadv_priv_gw - per mesh interface gateway data 1094 */ 1095 struct batadv_priv_gw { 1096 /** @gateway_list: list of available gateway nodes */ 1097 struct hlist_head gateway_list; 1098 1099 /** @list_lock: lock protecting gateway_list & curr_gw */ 1100 spinlock_t list_lock; 1101 1102 /** @curr_gw: pointer to currently selected gateway node */ 1103 struct batadv_gw_node __rcu *curr_gw; 1104 1105 /** 1106 * @mode: gateway operation: off, client or server (see batadv_gw_modes) 1107 */ 1108 atomic_t mode; 1109 1110 /** @sel_class: gateway selection class (applies if gw_mode client) */ 1111 atomic_t sel_class; 1112 1113 /** 1114 * @bandwidth_down: advertised uplink download bandwidth (if gw_mode 1115 * server) 1116 */ 1117 atomic_t bandwidth_down; 1118 1119 /** 1120 * @bandwidth_up: advertised uplink upload bandwidth (if gw_mode server) 1121 */ 1122 atomic_t bandwidth_up; 1123 1124 /** @reselect: bool indicating a gateway re-selection is in progress */ 1125 atomic_t reselect; 1126 }; 1127 1128 /** 1129 * struct batadv_priv_tvlv - per mesh interface tvlv data 1130 */ 1131 struct batadv_priv_tvlv { 1132 /** 1133 * @container_list: list of registered tvlv containers to be sent with 1134 * each OGM 1135 */ 1136 struct hlist_head container_list; 1137 1138 /** @handler_list: list of the various tvlv content handlers */ 1139 struct hlist_head handler_list; 1140 1141 /** @container_list_lock: protects tvlv container list access */ 1142 spinlock_t container_list_lock; 1143 1144 /** @handler_list_lock: protects handler list access */ 1145 spinlock_t handler_list_lock; 1146 }; 1147 1148 #ifdef CONFIG_BATMAN_ADV_DAT 1149 1150 /** 1151 * struct batadv_priv_dat - per mesh interface DAT private data 1152 */ 1153 struct batadv_priv_dat { 1154 /** @addr: node DAT address */ 1155 batadv_dat_addr_t addr; 1156 1157 /** @hash: hashtable representing the local ARP cache */ 1158 struct batadv_hashtable *hash; 1159 1160 /** @work: work queue callback item for cache purging */ 1161 struct delayed_work work; 1162 }; 1163 #endif 1164 1165 #ifdef CONFIG_BATMAN_ADV_MCAST 1166 /** 1167 * struct batadv_mcast_querier_state - IGMP/MLD querier state when bridged 1168 */ 1169 struct batadv_mcast_querier_state { 1170 /** @exists: whether a querier exists in the mesh */ 1171 unsigned char exists:1; 1172 1173 /** 1174 * @shadowing: if a querier exists, whether it is potentially shadowing 1175 * multicast listeners (i.e. querier is behind our own bridge segment) 1176 */ 1177 unsigned char shadowing:1; 1178 }; 1179 1180 /** 1181 * struct batadv_priv_mcast - per mesh interface mcast data 1182 */ 1183 struct batadv_priv_mcast { 1184 /** 1185 * @mla_list: list of multicast addresses we are currently announcing 1186 * via TT 1187 */ 1188 struct hlist_head mla_list; /* see __batadv_mcast_mla_update() */ 1189 1190 /** 1191 * @want_all_unsnoopables_list: a list of orig_nodes wanting all 1192 * unsnoopable multicast traffic 1193 */ 1194 struct hlist_head want_all_unsnoopables_list; 1195 1196 /** 1197 * @want_all_ipv4_list: a list of orig_nodes wanting all IPv4 multicast 1198 * traffic 1199 */ 1200 struct hlist_head want_all_ipv4_list; 1201 1202 /** 1203 * @want_all_ipv6_list: a list of orig_nodes wanting all IPv6 multicast 1204 * traffic 1205 */ 1206 struct hlist_head want_all_ipv6_list; 1207 1208 /** @querier_ipv4: the current state of an IGMP querier in the mesh */ 1209 struct batadv_mcast_querier_state querier_ipv4; 1210 1211 /** @querier_ipv6: the current state of an MLD querier in the mesh */ 1212 struct batadv_mcast_querier_state querier_ipv6; 1213 1214 /** @flags: the flags we have last sent in our mcast tvlv */ 1215 u8 flags; 1216 1217 /** @enabled: whether the multicast tvlv is currently enabled */ 1218 unsigned char enabled:1; 1219 1220 /** @bridged: whether the soft interface has a bridge on top */ 1221 unsigned char bridged:1; 1222 1223 /** 1224 * @num_want_all_unsnoopables: number of nodes wanting unsnoopable IP 1225 * traffic 1226 */ 1227 atomic_t num_want_all_unsnoopables; 1228 1229 /** @num_want_all_ipv4: counter for items in want_all_ipv4_list */ 1230 atomic_t num_want_all_ipv4; 1231 1232 /** @num_want_all_ipv6: counter for items in want_all_ipv6_list */ 1233 atomic_t num_want_all_ipv6; 1234 1235 /** 1236 * @want_lists_lock: lock for protecting modifications to mcasts 1237 * want_all_{unsnoopables,ipv4,ipv6}_list (traversals are rcu-locked) 1238 */ 1239 spinlock_t want_lists_lock; 1240 1241 /** @work: work queue callback item for multicast TT and TVLV updates */ 1242 struct delayed_work work; 1243 }; 1244 #endif 1245 1246 /** 1247 * struct batadv_priv_nc - per mesh interface network coding private data 1248 */ 1249 struct batadv_priv_nc { 1250 /** @work: work queue callback item for cleanup */ 1251 struct delayed_work work; 1252 1253 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 1254 /** 1255 * @debug_dir: dentry for nc subdir in batman-adv directory in debugfs 1256 */ 1257 struct dentry *debug_dir; 1258 #endif 1259 1260 /** 1261 * @min_tq: only consider neighbors for encoding if neigh_tq > min_tq 1262 */ 1263 u8 min_tq; 1264 1265 /** 1266 * @max_fwd_delay: maximum packet forward delay to allow coding of 1267 * packets 1268 */ 1269 u32 max_fwd_delay; 1270 1271 /** 1272 * @max_buffer_time: buffer time for sniffed packets used to decoding 1273 */ 1274 u32 max_buffer_time; 1275 1276 /** 1277 * @timestamp_fwd_flush: timestamp of last forward packet queue flush 1278 */ 1279 unsigned long timestamp_fwd_flush; 1280 1281 /** 1282 * @timestamp_sniffed_purge: timestamp of last sniffed packet queue 1283 * purge 1284 */ 1285 unsigned long timestamp_sniffed_purge; 1286 1287 /** 1288 * @coding_hash: Hash table used to buffer skbs while waiting for 1289 * another incoming skb to code it with. Skbs are added to the buffer 1290 * just before being forwarded in routing.c 1291 */ 1292 struct batadv_hashtable *coding_hash; 1293 1294 /** 1295 * @decoding_hash: Hash table used to buffer skbs that might be needed 1296 * to decode a received coded skb. The buffer is used for 1) skbs 1297 * arriving on the soft-interface; 2) skbs overheard on the 1298 * hard-interface; and 3) skbs forwarded by batman-adv. 1299 */ 1300 struct batadv_hashtable *decoding_hash; 1301 }; 1302 1303 /** 1304 * struct batadv_tp_unacked - unacked packet meta-information 1305 * 1306 * This struct is supposed to represent a buffer unacked packet. However, since 1307 * the purpose of the TP meter is to count the traffic only, there is no need to 1308 * store the entire sk_buff, the starting offset and the length are enough 1309 */ 1310 struct batadv_tp_unacked { 1311 /** @seqno: seqno of the unacked packet */ 1312 u32 seqno; 1313 1314 /** @len: length of the packet */ 1315 u16 len; 1316 1317 /** @list: list node for &batadv_tp_vars.unacked_list */ 1318 struct list_head list; 1319 }; 1320 1321 /** 1322 * enum batadv_tp_meter_role - Modus in tp meter session 1323 */ 1324 enum batadv_tp_meter_role { 1325 /** @BATADV_TP_RECEIVER: Initialized as receiver */ 1326 BATADV_TP_RECEIVER, 1327 1328 /** @BATADV_TP_SENDER: Initialized as sender */ 1329 BATADV_TP_SENDER 1330 }; 1331 1332 /** 1333 * struct batadv_tp_vars - tp meter private variables per session 1334 */ 1335 struct batadv_tp_vars { 1336 /** @list: list node for &bat_priv.tp_list */ 1337 struct hlist_node list; 1338 1339 /** @timer: timer for ack (receiver) and retry (sender) */ 1340 struct timer_list timer; 1341 1342 /** @bat_priv: pointer to the mesh object */ 1343 struct batadv_priv *bat_priv; 1344 1345 /** @start_time: start time in jiffies */ 1346 unsigned long start_time; 1347 1348 /** @other_end: mac address of remote */ 1349 u8 other_end[ETH_ALEN]; 1350 1351 /** @role: receiver/sender modi */ 1352 enum batadv_tp_meter_role role; 1353 1354 /** @sending: sending binary semaphore: 1 if sending, 0 is not */ 1355 atomic_t sending; 1356 1357 /** @reason: reason for a stopped session */ 1358 enum batadv_tp_meter_reason reason; 1359 1360 /** @finish_work: work item for the finishing procedure */ 1361 struct delayed_work finish_work; 1362 1363 /** @test_length: test length in milliseconds */ 1364 u32 test_length; 1365 1366 /** @session: TP session identifier */ 1367 u8 session[2]; 1368 1369 /** @icmp_uid: local ICMP "socket" index */ 1370 u8 icmp_uid; 1371 1372 /* sender variables */ 1373 1374 /** @dec_cwnd: decimal part of the cwnd used during linear growth */ 1375 u16 dec_cwnd; 1376 1377 /** @cwnd: current size of the congestion window */ 1378 u32 cwnd; 1379 1380 /** @cwnd_lock: lock do protect @cwnd & @dec_cwnd */ 1381 spinlock_t cwnd_lock; 1382 1383 /** 1384 * @ss_threshold: Slow Start threshold. Once cwnd exceeds this value the 1385 * connection switches to the Congestion Avoidance state 1386 */ 1387 u32 ss_threshold; 1388 1389 /** @last_acked: last acked byte */ 1390 atomic_t last_acked; 1391 1392 /** @last_sent: last sent byte, not yet acked */ 1393 u32 last_sent; 1394 1395 /** @tot_sent: amount of data sent/ACKed so far */ 1396 atomic64_t tot_sent; 1397 1398 /** @dup_acks: duplicate ACKs counter */ 1399 atomic_t dup_acks; 1400 1401 /** @fast_recovery: true if in Fast Recovery mode */ 1402 unsigned char fast_recovery:1; 1403 1404 /** @recover: last sent seqno when entering Fast Recovery */ 1405 u32 recover; 1406 1407 /** @rto: sender timeout */ 1408 u32 rto; 1409 1410 /** @srtt: smoothed RTT scaled by 2^3 */ 1411 u32 srtt; 1412 1413 /** @rttvar: RTT variation scaled by 2^2 */ 1414 u32 rttvar; 1415 1416 /** 1417 * @more_bytes: waiting queue anchor when waiting for more ack/retry 1418 * timeout 1419 */ 1420 wait_queue_head_t more_bytes; 1421 1422 /** @prerandom_offset: offset inside the prerandom buffer */ 1423 u32 prerandom_offset; 1424 1425 /** @prerandom_lock: spinlock protecting access to prerandom_offset */ 1426 spinlock_t prerandom_lock; 1427 1428 /* receiver variables */ 1429 1430 /** @last_recv: last in-order received packet */ 1431 u32 last_recv; 1432 1433 /** @unacked_list: list of unacked packets (meta-info only) */ 1434 struct list_head unacked_list; 1435 1436 /** @unacked_lock: protect unacked_list */ 1437 spinlock_t unacked_lock; 1438 1439 /** @last_recv_time: time time (jiffies) a msg was received */ 1440 unsigned long last_recv_time; 1441 1442 /** @refcount: number of context where the object is used */ 1443 struct kref refcount; 1444 1445 /** @rcu: struct used for freeing in an RCU-safe manner */ 1446 struct rcu_head rcu; 1447 }; 1448 1449 /** 1450 * struct batadv_softif_vlan - per VLAN attributes set 1451 */ 1452 struct batadv_softif_vlan { 1453 /** @bat_priv: pointer to the mesh object */ 1454 struct batadv_priv *bat_priv; 1455 1456 /** @vid: VLAN identifier */ 1457 unsigned short vid; 1458 1459 /** @kobj: kobject for sysfs vlan subdirectory */ 1460 struct kobject *kobj; 1461 1462 /** @ap_isolation: AP isolation state */ 1463 atomic_t ap_isolation; /* boolean */ 1464 1465 /** @tt: TT private attributes (VLAN specific) */ 1466 struct batadv_vlan_tt tt; 1467 1468 /** @list: list node for &bat_priv.softif_vlan_list */ 1469 struct hlist_node list; 1470 1471 /** 1472 * @refcount: number of context where this object is currently in use 1473 */ 1474 struct kref refcount; 1475 1476 /** @rcu: struct used for freeing in a RCU-safe manner */ 1477 struct rcu_head rcu; 1478 }; 1479 1480 /** 1481 * struct batadv_priv_bat_v - B.A.T.M.A.N. V per soft-interface private data 1482 */ 1483 struct batadv_priv_bat_v { 1484 /** @ogm_buff: buffer holding the OGM packet */ 1485 unsigned char *ogm_buff; 1486 1487 /** @ogm_buff_len: length of the OGM packet buffer */ 1488 int ogm_buff_len; 1489 1490 /** @ogm_seqno: OGM sequence number - used to identify each OGM */ 1491 atomic_t ogm_seqno; 1492 1493 /** @ogm_wq: workqueue used to schedule OGM transmissions */ 1494 struct delayed_work ogm_wq; 1495 }; 1496 1497 /** 1498 * struct batadv_priv - per mesh interface data 1499 */ 1500 struct batadv_priv { 1501 /** 1502 * @mesh_state: current status of the mesh 1503 * (inactive/active/deactivating) 1504 */ 1505 atomic_t mesh_state; 1506 1507 /** @soft_iface: net device which holds this struct as private data */ 1508 struct net_device *soft_iface; 1509 1510 /** 1511 * @bat_counters: mesh internal traffic statistic counters (see 1512 * batadv_counters) 1513 */ 1514 u64 __percpu *bat_counters; /* Per cpu counters */ 1515 1516 /** 1517 * @aggregated_ogms: bool indicating whether OGM aggregation is enabled 1518 */ 1519 atomic_t aggregated_ogms; 1520 1521 /** @bonding: bool indicating whether traffic bonding is enabled */ 1522 atomic_t bonding; 1523 1524 /** 1525 * @fragmentation: bool indicating whether traffic fragmentation is 1526 * enabled 1527 */ 1528 atomic_t fragmentation; 1529 1530 /** 1531 * @packet_size_max: max packet size that can be transmitted via 1532 * multiple fragmented skbs or a single frame if fragmentation is 1533 * disabled 1534 */ 1535 atomic_t packet_size_max; 1536 1537 /** 1538 * @frag_seqno: incremental counter to identify chains of egress 1539 * fragments 1540 */ 1541 atomic_t frag_seqno; 1542 1543 #ifdef CONFIG_BATMAN_ADV_BLA 1544 /** 1545 * @bridge_loop_avoidance: bool indicating whether bridge loop 1546 * avoidance is enabled 1547 */ 1548 atomic_t bridge_loop_avoidance; 1549 #endif 1550 1551 #ifdef CONFIG_BATMAN_ADV_DAT 1552 /** 1553 * @distributed_arp_table: bool indicating whether distributed ARP table 1554 * is enabled 1555 */ 1556 atomic_t distributed_arp_table; 1557 #endif 1558 1559 #ifdef CONFIG_BATMAN_ADV_MCAST 1560 /** 1561 * @multicast_mode: Enable or disable multicast optimizations on this 1562 * node's sender/originating side 1563 */ 1564 atomic_t multicast_mode; 1565 #endif 1566 1567 /** @orig_interval: OGM broadcast interval in milliseconds */ 1568 atomic_t orig_interval; 1569 1570 /** 1571 * @hop_penalty: penalty which will be applied to an OGM's tq-field on 1572 * every hop 1573 */ 1574 atomic_t hop_penalty; 1575 1576 #ifdef CONFIG_BATMAN_ADV_DEBUG 1577 /** @log_level: configured log level (see batadv_dbg_level) */ 1578 atomic_t log_level; 1579 #endif 1580 1581 /** 1582 * @isolation_mark: the skb->mark value used to match packets for AP 1583 * isolation 1584 */ 1585 u32 isolation_mark; 1586 1587 /** 1588 * @isolation_mark_mask: bitmask identifying the bits in skb->mark to be 1589 * used for the isolation mark 1590 */ 1591 u32 isolation_mark_mask; 1592 1593 /** @bcast_seqno: last sent broadcast packet sequence number */ 1594 atomic_t bcast_seqno; 1595 1596 /** 1597 * @bcast_queue_left: number of remaining buffered broadcast packet 1598 * slots 1599 */ 1600 atomic_t bcast_queue_left; 1601 1602 /** @batman_queue_left: number of remaining OGM packet slots */ 1603 atomic_t batman_queue_left; 1604 1605 /** @mesh_obj: kobject for sysfs mesh subdirectory */ 1606 struct kobject *mesh_obj; 1607 1608 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 1609 /** @debug_dir: dentry for debugfs batman-adv subdirectory */ 1610 struct dentry *debug_dir; 1611 #endif 1612 1613 /** @forw_bat_list: list of aggregated OGMs that will be forwarded */ 1614 struct hlist_head forw_bat_list; 1615 1616 /** 1617 * @forw_bcast_list: list of broadcast packets that will be 1618 * rebroadcasted 1619 */ 1620 struct hlist_head forw_bcast_list; 1621 1622 /** @tp_list: list of tp sessions */ 1623 struct hlist_head tp_list; 1624 1625 /** @tp_num: number of currently active tp sessions */ 1626 struct batadv_hashtable *orig_hash; 1627 1628 /** @orig_hash: hash table containing mesh participants (orig nodes) */ 1629 spinlock_t forw_bat_list_lock; 1630 1631 /** @forw_bat_list_lock: lock protecting forw_bat_list */ 1632 spinlock_t forw_bcast_list_lock; 1633 1634 /** @forw_bcast_list_lock: lock protecting forw_bcast_list */ 1635 spinlock_t tp_list_lock; 1636 1637 /** @tp_list_lock: spinlock protecting @tp_list */ 1638 atomic_t tp_num; 1639 1640 /** @orig_work: work queue callback item for orig node purging */ 1641 struct delayed_work orig_work; 1642 1643 /** 1644 * @primary_if: one of the hard-interfaces assigned to this mesh 1645 * interface becomes the primary interface 1646 */ 1647 struct batadv_hard_iface __rcu *primary_if; /* rcu protected pointer */ 1648 1649 /** @algo_ops: routing algorithm used by this mesh interface */ 1650 struct batadv_algo_ops *algo_ops; 1651 1652 /** 1653 * @softif_vlan_list: a list of softif_vlan structs, one per VLAN 1654 * created on top of the mesh interface represented by this object 1655 */ 1656 struct hlist_head softif_vlan_list; 1657 1658 /** @softif_vlan_list_lock: lock protecting softif_vlan_list */ 1659 spinlock_t softif_vlan_list_lock; 1660 1661 #ifdef CONFIG_BATMAN_ADV_BLA 1662 /** @bla: bridge loope avoidance data */ 1663 struct batadv_priv_bla bla; 1664 #endif 1665 1666 #ifdef CONFIG_BATMAN_ADV_DEBUG 1667 /** @debug_log: holding debug logging relevant data */ 1668 struct batadv_priv_debug_log *debug_log; 1669 #endif 1670 1671 /** @gw: gateway data */ 1672 struct batadv_priv_gw gw; 1673 1674 /** @tt: translation table data */ 1675 struct batadv_priv_tt tt; 1676 1677 /** @tvlv: type-version-length-value data */ 1678 struct batadv_priv_tvlv tvlv; 1679 1680 #ifdef CONFIG_BATMAN_ADV_DAT 1681 /** @dat: distributed arp table data */ 1682 struct batadv_priv_dat dat; 1683 #endif 1684 1685 #ifdef CONFIG_BATMAN_ADV_MCAST 1686 /** @mcast: multicast data */ 1687 struct batadv_priv_mcast mcast; 1688 #endif 1689 1690 #ifdef CONFIG_BATMAN_ADV_NC 1691 /** 1692 * @network_coding: bool indicating whether network coding is enabled 1693 */ 1694 atomic_t network_coding; 1695 1696 /** @nc: network coding data */ 1697 struct batadv_priv_nc nc; 1698 #endif /* CONFIG_BATMAN_ADV_NC */ 1699 1700 #ifdef CONFIG_BATMAN_ADV_BATMAN_V 1701 /** @bat_v: B.A.T.M.A.N. V per soft-interface private data */ 1702 struct batadv_priv_bat_v bat_v; 1703 #endif 1704 }; 1705 1706 /** 1707 * struct batadv_socket_client - layer2 icmp socket client data 1708 */ 1709 struct batadv_socket_client { 1710 /** 1711 * @queue_list: packet queue for packets destined for this socket client 1712 */ 1713 struct list_head queue_list; 1714 1715 /** @queue_len: number of packets in the packet queue (queue_list) */ 1716 unsigned int queue_len; 1717 1718 /** @index: socket client's index in the batadv_socket_client_hash */ 1719 unsigned char index; 1720 1721 /** @lock: lock protecting queue_list, queue_len & index */ 1722 spinlock_t lock; 1723 1724 /** @queue_wait: socket client's wait queue */ 1725 wait_queue_head_t queue_wait; 1726 1727 /** @bat_priv: pointer to soft_iface this client belongs to */ 1728 struct batadv_priv *bat_priv; 1729 }; 1730 1731 /** 1732 * struct batadv_socket_packet - layer2 icmp packet for socket client 1733 */ 1734 struct batadv_socket_packet { 1735 /** @list: list node for &batadv_socket_client.queue_list */ 1736 struct list_head list; 1737 1738 /** @icmp_len: size of the layer2 icmp packet */ 1739 size_t icmp_len; 1740 1741 /** @icmp_packet: layer2 icmp packet */ 1742 u8 icmp_packet[BATADV_ICMP_MAX_PACKET_SIZE]; 1743 }; 1744 1745 #ifdef CONFIG_BATMAN_ADV_BLA 1746 1747 /** 1748 * struct batadv_bla_backbone_gw - batman-adv gateway bridged into the LAN 1749 */ 1750 struct batadv_bla_backbone_gw { 1751 /** 1752 * @orig: originator address of backbone node (mac address of primary 1753 * iface) 1754 */ 1755 u8 orig[ETH_ALEN]; 1756 1757 /** @vid: vlan id this gateway was detected on */ 1758 unsigned short vid; 1759 1760 /** @hash_entry: hlist node for &batadv_priv_bla.backbone_hash */ 1761 struct hlist_node hash_entry; 1762 1763 /** @bat_priv: pointer to soft_iface this backbone gateway belongs to */ 1764 struct batadv_priv *bat_priv; 1765 1766 /** @lasttime: last time we heard of this backbone gw */ 1767 unsigned long lasttime; 1768 1769 /** 1770 * @wait_periods: grace time for bridge forward delays and bla group 1771 * forming at bootup phase - no bcast traffic is formwared until it has 1772 * elapsed 1773 */ 1774 atomic_t wait_periods; 1775 1776 /** 1777 * @request_sent: if this bool is set to true we are out of sync with 1778 * this backbone gateway - no bcast traffic is formwared until the 1779 * situation was resolved 1780 */ 1781 atomic_t request_sent; 1782 1783 /** @crc: crc16 checksum over all claims */ 1784 u16 crc; 1785 1786 /** @crc_lock: lock protecting crc */ 1787 spinlock_t crc_lock; 1788 1789 /** @report_work: work struct for reporting detected loops */ 1790 struct work_struct report_work; 1791 1792 /** @refcount: number of contexts the object is used */ 1793 struct kref refcount; 1794 1795 /** @rcu: struct used for freeing in an RCU-safe manner */ 1796 struct rcu_head rcu; 1797 }; 1798 1799 /** 1800 * struct batadv_bla_claim - claimed non-mesh client structure 1801 */ 1802 struct batadv_bla_claim { 1803 /** @addr: mac address of claimed non-mesh client */ 1804 u8 addr[ETH_ALEN]; 1805 1806 /** @vid: vlan id this client was detected on */ 1807 unsigned short vid; 1808 1809 /** @backbone_gw: pointer to backbone gw claiming this client */ 1810 struct batadv_bla_backbone_gw *backbone_gw; 1811 1812 /** @backbone_lock: lock protecting backbone_gw pointer */ 1813 spinlock_t backbone_lock; 1814 1815 /** @lasttime: last time we heard of claim (locals only) */ 1816 unsigned long lasttime; 1817 1818 /** @hash_entry: hlist node for &batadv_priv_bla.claim_hash */ 1819 struct hlist_node hash_entry; 1820 1821 /** @refcount: number of contexts the object is used */ 1822 struct rcu_head rcu; 1823 1824 /** @rcu: struct used for freeing in an RCU-safe manner */ 1825 struct kref refcount; 1826 }; 1827 #endif 1828 1829 /** 1830 * struct batadv_tt_common_entry - tt local & tt global common data 1831 */ 1832 struct batadv_tt_common_entry { 1833 /** @addr: mac address of non-mesh client */ 1834 u8 addr[ETH_ALEN]; 1835 1836 /** @vid: VLAN identifier */ 1837 unsigned short vid; 1838 1839 /** 1840 * @hash_entry: hlist node for &batadv_priv_tt.local_hash or for 1841 * &batadv_priv_tt.global_hash 1842 */ 1843 struct hlist_node hash_entry; 1844 1845 /** @flags: various state handling flags (see batadv_tt_client_flags) */ 1846 u16 flags; 1847 1848 /** @added_at: timestamp used for purging stale tt common entries */ 1849 unsigned long added_at; 1850 1851 /** @refcount: number of contexts the object is used */ 1852 struct kref refcount; 1853 1854 /** @rcu: struct used for freeing in an RCU-safe manner */ 1855 struct rcu_head rcu; 1856 }; 1857 1858 /** 1859 * struct batadv_tt_local_entry - translation table local entry data 1860 */ 1861 struct batadv_tt_local_entry { 1862 /** @common: general translation table data */ 1863 struct batadv_tt_common_entry common; 1864 1865 /** @last_seen: timestamp used for purging stale tt local entries */ 1866 unsigned long last_seen; 1867 1868 /** @vlan: soft-interface vlan of the entry */ 1869 struct batadv_softif_vlan *vlan; 1870 }; 1871 1872 /** 1873 * struct batadv_tt_global_entry - translation table global entry data 1874 */ 1875 struct batadv_tt_global_entry { 1876 /** @common: general translation table data */ 1877 struct batadv_tt_common_entry common; 1878 1879 /** @orig_list: list of orig nodes announcing this non-mesh client */ 1880 struct hlist_head orig_list; 1881 1882 /** @orig_list_count: number of items in the orig_list */ 1883 atomic_t orig_list_count; 1884 1885 /** @list_lock: lock protecting orig_list */ 1886 spinlock_t list_lock; 1887 1888 /** @roam_at: time at which TT_GLOBAL_ROAM was set */ 1889 unsigned long roam_at; 1890 }; 1891 1892 /** 1893 * struct batadv_tt_orig_list_entry - orig node announcing a non-mesh client 1894 */ 1895 struct batadv_tt_orig_list_entry { 1896 /** @orig_node: pointer to orig node announcing this non-mesh client */ 1897 struct batadv_orig_node *orig_node; 1898 1899 /** 1900 * @ttvn: translation table version number which added the non-mesh 1901 * client 1902 */ 1903 u8 ttvn; 1904 1905 /** @flags: per orig entry TT sync flags */ 1906 u8 flags; 1907 1908 /** @list: list node for &batadv_tt_global_entry.orig_list */ 1909 struct hlist_node list; 1910 1911 /** @refcount: number of contexts the object is used */ 1912 struct kref refcount; 1913 1914 /** @rcu: struct used for freeing in an RCU-safe manner */ 1915 struct rcu_head rcu; 1916 }; 1917 1918 /** 1919 * struct batadv_tt_change_node - structure for tt changes occurred 1920 */ 1921 struct batadv_tt_change_node { 1922 /** @list: list node for &batadv_priv_tt.changes_list */ 1923 struct list_head list; 1924 1925 /** @change: holds the actual translation table diff data */ 1926 struct batadv_tvlv_tt_change change; 1927 }; 1928 1929 /** 1930 * struct batadv_tt_req_node - data to keep track of the tt requests in flight 1931 */ 1932 struct batadv_tt_req_node { 1933 /** 1934 * @addr: mac address address of the originator this request was sent to 1935 */ 1936 u8 addr[ETH_ALEN]; 1937 1938 /** @issued_at: timestamp used for purging stale tt requests */ 1939 unsigned long issued_at; 1940 1941 /** @refcount: number of contexts the object is used by */ 1942 struct kref refcount; 1943 1944 /** @list: list node for &batadv_priv_tt.req_list */ 1945 struct hlist_node list; 1946 }; 1947 1948 /** 1949 * struct batadv_tt_roam_node - roaming client data 1950 */ 1951 struct batadv_tt_roam_node { 1952 /** @addr: mac address of the client in the roaming phase */ 1953 u8 addr[ETH_ALEN]; 1954 1955 /** 1956 * @counter: number of allowed roaming events per client within a single 1957 * OGM interval (changes are committed with each OGM) 1958 */ 1959 atomic_t counter; 1960 1961 /** 1962 * @first_time: timestamp used for purging stale roaming node entries 1963 */ 1964 unsigned long first_time; 1965 1966 /** @list: list node for &batadv_priv_tt.roam_list */ 1967 struct list_head list; 1968 }; 1969 1970 /** 1971 * struct batadv_nc_node - network coding node 1972 */ 1973 struct batadv_nc_node { 1974 /** @list: next and prev pointer for the list handling */ 1975 struct list_head list; 1976 1977 /** @addr: the node's mac address */ 1978 u8 addr[ETH_ALEN]; 1979 1980 /** @refcount: number of contexts the object is used by */ 1981 struct kref refcount; 1982 1983 /** @rcu: struct used for freeing in an RCU-safe manner */ 1984 struct rcu_head rcu; 1985 1986 /** @orig_node: pointer to corresponding orig node struct */ 1987 struct batadv_orig_node *orig_node; 1988 1989 /** @last_seen: timestamp of last ogm received from this node */ 1990 unsigned long last_seen; 1991 }; 1992 1993 /** 1994 * struct batadv_nc_path - network coding path 1995 */ 1996 struct batadv_nc_path { 1997 /** @hash_entry: next and prev pointer for the list handling */ 1998 struct hlist_node hash_entry; 1999 2000 /** @rcu: struct used for freeing in an RCU-safe manner */ 2001 struct rcu_head rcu; 2002 2003 /** @refcount: number of contexts the object is used by */ 2004 struct kref refcount; 2005 2006 /** @packet_list: list of buffered packets for this path */ 2007 struct list_head packet_list; 2008 2009 /** @packet_list_lock: access lock for packet list */ 2010 spinlock_t packet_list_lock; 2011 2012 /** @next_hop: next hop (destination) of path */ 2013 u8 next_hop[ETH_ALEN]; 2014 2015 /** @prev_hop: previous hop (source) of path */ 2016 u8 prev_hop[ETH_ALEN]; 2017 2018 /** @last_valid: timestamp for last validation of path */ 2019 unsigned long last_valid; 2020 }; 2021 2022 /** 2023 * struct batadv_nc_packet - network coding packet used when coding and 2024 * decoding packets 2025 */ 2026 struct batadv_nc_packet { 2027 /** @list: next and prev pointer for the list handling */ 2028 struct list_head list; 2029 2030 /** @packet_id: crc32 checksum of skb data */ 2031 __be32 packet_id; 2032 2033 /** 2034 * @timestamp: field containing the info when the packet was added to 2035 * path 2036 */ 2037 unsigned long timestamp; 2038 2039 /** @neigh_node: pointer to original next hop neighbor of skb */ 2040 struct batadv_neigh_node *neigh_node; 2041 2042 /** @skb: skb which can be encoded or used for decoding */ 2043 struct sk_buff *skb; 2044 2045 /** @nc_path: pointer to path this nc packet is attached to */ 2046 struct batadv_nc_path *nc_path; 2047 }; 2048 2049 /** 2050 * struct batadv_skb_cb - control buffer structure used to store private data 2051 * relevant to batman-adv in the skb->cb buffer in skbs. 2052 */ 2053 struct batadv_skb_cb { 2054 /** 2055 * @decoded: Marks a skb as decoded, which is checked when searching for 2056 * coding opportunities in network-coding.c 2057 */ 2058 unsigned char decoded:1; 2059 2060 /** @num_bcasts: Counter for broadcast packet retransmissions */ 2061 unsigned char num_bcasts; 2062 }; 2063 2064 /** 2065 * struct batadv_forw_packet - structure for bcast packets to be sent/forwarded 2066 */ 2067 struct batadv_forw_packet { 2068 /** 2069 * @list: list node for &batadv_priv.forw.bcast_list and 2070 * &batadv_priv.forw.bat_list 2071 */ 2072 struct hlist_node list; 2073 2074 /** @cleanup_list: list node for purging functions */ 2075 struct hlist_node cleanup_list; 2076 2077 /** @send_time: execution time for delayed_work (packet sending) */ 2078 unsigned long send_time; 2079 2080 /** 2081 * @own: bool for locally generated packets (local OGMs are re-scheduled 2082 * after sending) 2083 */ 2084 u8 own; 2085 2086 /** @skb: bcast packet's skb buffer */ 2087 struct sk_buff *skb; 2088 2089 /** @packet_len: size of aggregated OGM packet inside the skb buffer */ 2090 u16 packet_len; 2091 2092 /** @direct_link_flags: direct link flags for aggregated OGM packets */ 2093 u32 direct_link_flags; 2094 2095 /** @num_packets: counter for aggregated OGMv1 packets */ 2096 u8 num_packets; 2097 2098 /** @delayed_work: work queue callback item for packet sending */ 2099 struct delayed_work delayed_work; 2100 2101 /** 2102 * @if_incoming: pointer to incoming hard-iface or primary iface if 2103 * locally generated packet 2104 */ 2105 struct batadv_hard_iface *if_incoming; 2106 2107 /** 2108 * @if_outgoing: packet where the packet should be sent to, or NULL if 2109 * unspecified 2110 */ 2111 struct batadv_hard_iface *if_outgoing; 2112 2113 /** @queue_left: The queue (counter) this packet was applied to */ 2114 atomic_t *queue_left; 2115 }; 2116 2117 /** 2118 * struct batadv_algo_iface_ops - mesh algorithm callbacks (interface specific) 2119 */ 2120 struct batadv_algo_iface_ops { 2121 /** 2122 * @activate: start routing mechanisms when hard-interface is brought up 2123 * (optional) 2124 */ 2125 void (*activate)(struct batadv_hard_iface *hard_iface); 2126 2127 /** @enable: init routing info when hard-interface is enabled */ 2128 int (*enable)(struct batadv_hard_iface *hard_iface); 2129 2130 /** @disable: de-init routing info when hard-interface is disabled */ 2131 void (*disable)(struct batadv_hard_iface *hard_iface); 2132 2133 /** 2134 * @update_mac: (re-)init mac addresses of the protocol information 2135 * belonging to this hard-interface 2136 */ 2137 void (*update_mac)(struct batadv_hard_iface *hard_iface); 2138 2139 /** @primary_set: called when primary interface is selected / changed */ 2140 void (*primary_set)(struct batadv_hard_iface *hard_iface); 2141 }; 2142 2143 /** 2144 * struct batadv_algo_neigh_ops - mesh algorithm callbacks (neighbour specific) 2145 */ 2146 struct batadv_algo_neigh_ops { 2147 /** @hardif_init: called on creation of single hop entry (optional) */ 2148 void (*hardif_init)(struct batadv_hardif_neigh_node *neigh); 2149 2150 /** 2151 * @cmp: compare the metrics of two neighbors for their respective 2152 * outgoing interfaces 2153 */ 2154 int (*cmp)(struct batadv_neigh_node *neigh1, 2155 struct batadv_hard_iface *if_outgoing1, 2156 struct batadv_neigh_node *neigh2, 2157 struct batadv_hard_iface *if_outgoing2); 2158 2159 /** 2160 * @is_similar_or_better: check if neigh1 is equally similar or better 2161 * than neigh2 for their respective outgoing interface from the metric 2162 * prospective 2163 */ 2164 bool (*is_similar_or_better)(struct batadv_neigh_node *neigh1, 2165 struct batadv_hard_iface *if_outgoing1, 2166 struct batadv_neigh_node *neigh2, 2167 struct batadv_hard_iface *if_outgoing2); 2168 2169 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 2170 /** @print: print the single hop neighbor list (optional) */ 2171 void (*print)(struct batadv_priv *priv, struct seq_file *seq); 2172 #endif 2173 2174 /** @dump: dump neighbors to a netlink socket (optional) */ 2175 void (*dump)(struct sk_buff *msg, struct netlink_callback *cb, 2176 struct batadv_priv *priv, 2177 struct batadv_hard_iface *hard_iface); 2178 }; 2179 2180 /** 2181 * struct batadv_algo_orig_ops - mesh algorithm callbacks (originator specific) 2182 */ 2183 struct batadv_algo_orig_ops { 2184 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 2185 /** @print: print the originator table (optional) */ 2186 void (*print)(struct batadv_priv *priv, struct seq_file *seq, 2187 struct batadv_hard_iface *hard_iface); 2188 #endif 2189 2190 /** @dump: dump originators to a netlink socket (optional) */ 2191 void (*dump)(struct sk_buff *msg, struct netlink_callback *cb, 2192 struct batadv_priv *priv, 2193 struct batadv_hard_iface *hard_iface); 2194 }; 2195 2196 /** 2197 * struct batadv_algo_gw_ops - mesh algorithm callbacks (GW specific) 2198 */ 2199 struct batadv_algo_gw_ops { 2200 /** @init_sel_class: initialize GW selection class (optional) */ 2201 void (*init_sel_class)(struct batadv_priv *bat_priv); 2202 2203 /** 2204 * @store_sel_class: parse and stores a new GW selection class 2205 * (optional) 2206 */ 2207 ssize_t (*store_sel_class)(struct batadv_priv *bat_priv, char *buff, 2208 size_t count); 2209 2210 /** @show_sel_class: prints the current GW selection class (optional) */ 2211 ssize_t (*show_sel_class)(struct batadv_priv *bat_priv, char *buff); 2212 2213 /** 2214 * @get_best_gw_node: select the best GW from the list of available 2215 * nodes (optional) 2216 */ 2217 struct batadv_gw_node *(*get_best_gw_node) 2218 (struct batadv_priv *bat_priv); 2219 2220 /** 2221 * @is_eligible: check if a newly discovered GW is a potential candidate 2222 * for the election as best GW (optional) 2223 */ 2224 bool (*is_eligible)(struct batadv_priv *bat_priv, 2225 struct batadv_orig_node *curr_gw_orig, 2226 struct batadv_orig_node *orig_node); 2227 2228 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 2229 /** @print: print the gateway table (optional) */ 2230 void (*print)(struct batadv_priv *bat_priv, struct seq_file *seq); 2231 #endif 2232 2233 /** @dump: dump gateways to a netlink socket (optional) */ 2234 void (*dump)(struct sk_buff *msg, struct netlink_callback *cb, 2235 struct batadv_priv *priv); 2236 }; 2237 2238 /** 2239 * struct batadv_algo_ops - mesh algorithm callbacks 2240 */ 2241 struct batadv_algo_ops { 2242 /** @list: list node for the batadv_algo_list */ 2243 struct hlist_node list; 2244 2245 /** @name: name of the algorithm */ 2246 char *name; 2247 2248 /** @iface: callbacks related to interface handling */ 2249 struct batadv_algo_iface_ops iface; 2250 2251 /** @neigh: callbacks related to neighbors handling */ 2252 struct batadv_algo_neigh_ops neigh; 2253 2254 /** @orig: callbacks related to originators handling */ 2255 struct batadv_algo_orig_ops orig; 2256 2257 /** @gw: callbacks related to GW mode */ 2258 struct batadv_algo_gw_ops gw; 2259 }; 2260 2261 /** 2262 * struct batadv_dat_entry - it is a single entry of batman-adv ARP backend. It 2263 * is used to stored ARP entries needed for the global DAT cache 2264 */ 2265 struct batadv_dat_entry { 2266 /** @ip: the IPv4 corresponding to this DAT/ARP entry */ 2267 __be32 ip; 2268 2269 /** @mac_addr: the MAC address associated to the stored IPv4 */ 2270 u8 mac_addr[ETH_ALEN]; 2271 2272 /** @vid: the vlan ID associated to this entry */ 2273 unsigned short vid; 2274 2275 /** 2276 * @last_update: time in jiffies when this entry was refreshed last time 2277 */ 2278 unsigned long last_update; 2279 2280 /** @hash_entry: hlist node for &batadv_priv_dat.hash */ 2281 struct hlist_node hash_entry; 2282 2283 /** @refcount: number of contexts the object is used */ 2284 struct kref refcount; 2285 2286 /** @rcu: struct used for freeing in an RCU-safe manner */ 2287 struct rcu_head rcu; 2288 }; 2289 2290 /** 2291 * struct batadv_hw_addr - a list entry for a MAC address 2292 */ 2293 struct batadv_hw_addr { 2294 /** @list: list node for the linking of entries */ 2295 struct hlist_node list; 2296 2297 /** @addr: the MAC address of this list entry */ 2298 unsigned char addr[ETH_ALEN]; 2299 }; 2300 2301 /** 2302 * struct batadv_dat_candidate - candidate destination for DAT operations 2303 */ 2304 struct batadv_dat_candidate { 2305 /** 2306 * @type: the type of the selected candidate. It can one of the 2307 * following: 2308 * - BATADV_DAT_CANDIDATE_NOT_FOUND 2309 * - BATADV_DAT_CANDIDATE_ORIG 2310 */ 2311 int type; 2312 2313 /** 2314 * @orig_node: if type is BATADV_DAT_CANDIDATE_ORIG this field points to 2315 * the corresponding originator node structure 2316 */ 2317 struct batadv_orig_node *orig_node; 2318 }; 2319 2320 /** 2321 * struct batadv_tvlv_container - container for tvlv appended to OGMs 2322 */ 2323 struct batadv_tvlv_container { 2324 /** @list: hlist node for &batadv_priv_tvlv.container_list */ 2325 struct hlist_node list; 2326 2327 /** @tvlv_hdr: tvlv header information needed to construct the tvlv */ 2328 struct batadv_tvlv_hdr tvlv_hdr; 2329 2330 /** @refcount: number of contexts the object is used */ 2331 struct kref refcount; 2332 }; 2333 2334 /** 2335 * struct batadv_tvlv_handler - handler for specific tvlv type and version 2336 */ 2337 struct batadv_tvlv_handler { 2338 /** @list: hlist node for &batadv_priv_tvlv.handler_list */ 2339 struct hlist_node list; 2340 2341 /** 2342 * @ogm_handler: handler callback which is given the tvlv payload to 2343 * process on incoming OGM packets 2344 */ 2345 void (*ogm_handler)(struct batadv_priv *bat_priv, 2346 struct batadv_orig_node *orig, 2347 u8 flags, void *tvlv_value, u16 tvlv_value_len); 2348 2349 /** 2350 * @unicast_handler: handler callback which is given the tvlv payload to 2351 * process on incoming unicast tvlv packets 2352 */ 2353 int (*unicast_handler)(struct batadv_priv *bat_priv, 2354 u8 *src, u8 *dst, 2355 void *tvlv_value, u16 tvlv_value_len); 2356 2357 /** @type: tvlv type this handler feels responsible for */ 2358 u8 type; 2359 2360 /** @version: tvlv version this handler feels responsible for */ 2361 u8 version; 2362 2363 /** @flags: tvlv handler flags */ 2364 u8 flags; 2365 2366 /** @refcount: number of contexts the object is used */ 2367 struct kref refcount; 2368 2369 /** @rcu: struct used for freeing in an RCU-safe manner */ 2370 struct rcu_head rcu; 2371 }; 2372 2373 /** 2374 * enum batadv_tvlv_handler_flags - tvlv handler flags definitions 2375 */ 2376 enum batadv_tvlv_handler_flags { 2377 /** 2378 * @BATADV_TVLV_HANDLER_OGM_CIFNOTFND: tvlv ogm processing function 2379 * will call this handler even if its type was not found (with no data) 2380 */ 2381 BATADV_TVLV_HANDLER_OGM_CIFNOTFND = BIT(1), 2382 2383 /** 2384 * @BATADV_TVLV_HANDLER_OGM_CALLED: interval tvlv handling flag - the 2385 * API marks a handler as being called, so it won't be called if the 2386 * BATADV_TVLV_HANDLER_OGM_CIFNOTFND flag was set 2387 */ 2388 BATADV_TVLV_HANDLER_OGM_CALLED = BIT(2), 2389 }; 2390 2391 /** 2392 * struct batadv_store_mesh_work - Work queue item to detach add/del interface 2393 * from sysfs locks 2394 */ 2395 struct batadv_store_mesh_work { 2396 /** 2397 * @net_dev: netdevice to add/remove to/from batman-adv soft-interface 2398 */ 2399 struct net_device *net_dev; 2400 2401 /** @soft_iface_name: name of soft-interface to modify */ 2402 char soft_iface_name[IFNAMSIZ]; 2403 2404 /** @work: work queue item */ 2405 struct work_struct work; 2406 }; 2407 2408 #endif /* _NET_BATMAN_ADV_TYPES_H_ */ 2409