1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright (C) 2007-2019 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, generation */ 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 /** @generation: current (generation) sequence number */ 1106 unsigned int generation; 1107 1108 /** 1109 * @mode: gateway operation: off, client or server (see batadv_gw_modes) 1110 */ 1111 atomic_t mode; 1112 1113 /** @sel_class: gateway selection class (applies if gw_mode client) */ 1114 atomic_t sel_class; 1115 1116 /** 1117 * @bandwidth_down: advertised uplink download bandwidth (if gw_mode 1118 * server) 1119 */ 1120 atomic_t bandwidth_down; 1121 1122 /** 1123 * @bandwidth_up: advertised uplink upload bandwidth (if gw_mode server) 1124 */ 1125 atomic_t bandwidth_up; 1126 1127 /** @reselect: bool indicating a gateway re-selection is in progress */ 1128 atomic_t reselect; 1129 }; 1130 1131 /** 1132 * struct batadv_priv_tvlv - per mesh interface tvlv data 1133 */ 1134 struct batadv_priv_tvlv { 1135 /** 1136 * @container_list: list of registered tvlv containers to be sent with 1137 * each OGM 1138 */ 1139 struct hlist_head container_list; 1140 1141 /** @handler_list: list of the various tvlv content handlers */ 1142 struct hlist_head handler_list; 1143 1144 /** @container_list_lock: protects tvlv container list access */ 1145 spinlock_t container_list_lock; 1146 1147 /** @handler_list_lock: protects handler list access */ 1148 spinlock_t handler_list_lock; 1149 }; 1150 1151 #ifdef CONFIG_BATMAN_ADV_DAT 1152 1153 /** 1154 * struct batadv_priv_dat - per mesh interface DAT private data 1155 */ 1156 struct batadv_priv_dat { 1157 /** @addr: node DAT address */ 1158 batadv_dat_addr_t addr; 1159 1160 /** @hash: hashtable representing the local ARP cache */ 1161 struct batadv_hashtable *hash; 1162 1163 /** @work: work queue callback item for cache purging */ 1164 struct delayed_work work; 1165 }; 1166 #endif 1167 1168 #ifdef CONFIG_BATMAN_ADV_MCAST 1169 /** 1170 * struct batadv_mcast_querier_state - IGMP/MLD querier state when bridged 1171 */ 1172 struct batadv_mcast_querier_state { 1173 /** @exists: whether a querier exists in the mesh */ 1174 unsigned char exists:1; 1175 1176 /** 1177 * @shadowing: if a querier exists, whether it is potentially shadowing 1178 * multicast listeners (i.e. querier is behind our own bridge segment) 1179 */ 1180 unsigned char shadowing:1; 1181 }; 1182 1183 /** 1184 * struct batadv_priv_mcast - per mesh interface mcast data 1185 */ 1186 struct batadv_priv_mcast { 1187 /** 1188 * @mla_list: list of multicast addresses we are currently announcing 1189 * via TT 1190 */ 1191 struct hlist_head mla_list; /* see __batadv_mcast_mla_update() */ 1192 1193 /** 1194 * @want_all_unsnoopables_list: a list of orig_nodes wanting all 1195 * unsnoopable multicast traffic 1196 */ 1197 struct hlist_head want_all_unsnoopables_list; 1198 1199 /** 1200 * @want_all_ipv4_list: a list of orig_nodes wanting all IPv4 multicast 1201 * traffic 1202 */ 1203 struct hlist_head want_all_ipv4_list; 1204 1205 /** 1206 * @want_all_ipv6_list: a list of orig_nodes wanting all IPv6 multicast 1207 * traffic 1208 */ 1209 struct hlist_head want_all_ipv6_list; 1210 1211 /** @querier_ipv4: the current state of an IGMP querier in the mesh */ 1212 struct batadv_mcast_querier_state querier_ipv4; 1213 1214 /** @querier_ipv6: the current state of an MLD querier in the mesh */ 1215 struct batadv_mcast_querier_state querier_ipv6; 1216 1217 /** @flags: the flags we have last sent in our mcast tvlv */ 1218 u8 flags; 1219 1220 /** @enabled: whether the multicast tvlv is currently enabled */ 1221 unsigned char enabled:1; 1222 1223 /** @bridged: whether the soft interface has a bridge on top */ 1224 unsigned char bridged:1; 1225 1226 /** 1227 * @num_want_all_unsnoopables: number of nodes wanting unsnoopable IP 1228 * traffic 1229 */ 1230 atomic_t num_want_all_unsnoopables; 1231 1232 /** @num_want_all_ipv4: counter for items in want_all_ipv4_list */ 1233 atomic_t num_want_all_ipv4; 1234 1235 /** @num_want_all_ipv6: counter for items in want_all_ipv6_list */ 1236 atomic_t num_want_all_ipv6; 1237 1238 /** 1239 * @want_lists_lock: lock for protecting modifications to mcasts 1240 * want_all_{unsnoopables,ipv4,ipv6}_list (traversals are rcu-locked) 1241 */ 1242 spinlock_t want_lists_lock; 1243 1244 /** @work: work queue callback item for multicast TT and TVLV updates */ 1245 struct delayed_work work; 1246 }; 1247 #endif 1248 1249 /** 1250 * struct batadv_priv_nc - per mesh interface network coding private data 1251 */ 1252 struct batadv_priv_nc { 1253 /** @work: work queue callback item for cleanup */ 1254 struct delayed_work work; 1255 1256 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 1257 /** 1258 * @debug_dir: dentry for nc subdir in batman-adv directory in debugfs 1259 */ 1260 struct dentry *debug_dir; 1261 #endif 1262 1263 /** 1264 * @min_tq: only consider neighbors for encoding if neigh_tq > min_tq 1265 */ 1266 u8 min_tq; 1267 1268 /** 1269 * @max_fwd_delay: maximum packet forward delay to allow coding of 1270 * packets 1271 */ 1272 u32 max_fwd_delay; 1273 1274 /** 1275 * @max_buffer_time: buffer time for sniffed packets used to decoding 1276 */ 1277 u32 max_buffer_time; 1278 1279 /** 1280 * @timestamp_fwd_flush: timestamp of last forward packet queue flush 1281 */ 1282 unsigned long timestamp_fwd_flush; 1283 1284 /** 1285 * @timestamp_sniffed_purge: timestamp of last sniffed packet queue 1286 * purge 1287 */ 1288 unsigned long timestamp_sniffed_purge; 1289 1290 /** 1291 * @coding_hash: Hash table used to buffer skbs while waiting for 1292 * another incoming skb to code it with. Skbs are added to the buffer 1293 * just before being forwarded in routing.c 1294 */ 1295 struct batadv_hashtable *coding_hash; 1296 1297 /** 1298 * @decoding_hash: Hash table used to buffer skbs that might be needed 1299 * to decode a received coded skb. The buffer is used for 1) skbs 1300 * arriving on the soft-interface; 2) skbs overheard on the 1301 * hard-interface; and 3) skbs forwarded by batman-adv. 1302 */ 1303 struct batadv_hashtable *decoding_hash; 1304 }; 1305 1306 /** 1307 * struct batadv_tp_unacked - unacked packet meta-information 1308 * 1309 * This struct is supposed to represent a buffer unacked packet. However, since 1310 * the purpose of the TP meter is to count the traffic only, there is no need to 1311 * store the entire sk_buff, the starting offset and the length are enough 1312 */ 1313 struct batadv_tp_unacked { 1314 /** @seqno: seqno of the unacked packet */ 1315 u32 seqno; 1316 1317 /** @len: length of the packet */ 1318 u16 len; 1319 1320 /** @list: list node for &batadv_tp_vars.unacked_list */ 1321 struct list_head list; 1322 }; 1323 1324 /** 1325 * enum batadv_tp_meter_role - Modus in tp meter session 1326 */ 1327 enum batadv_tp_meter_role { 1328 /** @BATADV_TP_RECEIVER: Initialized as receiver */ 1329 BATADV_TP_RECEIVER, 1330 1331 /** @BATADV_TP_SENDER: Initialized as sender */ 1332 BATADV_TP_SENDER 1333 }; 1334 1335 /** 1336 * struct batadv_tp_vars - tp meter private variables per session 1337 */ 1338 struct batadv_tp_vars { 1339 /** @list: list node for &bat_priv.tp_list */ 1340 struct hlist_node list; 1341 1342 /** @timer: timer for ack (receiver) and retry (sender) */ 1343 struct timer_list timer; 1344 1345 /** @bat_priv: pointer to the mesh object */ 1346 struct batadv_priv *bat_priv; 1347 1348 /** @start_time: start time in jiffies */ 1349 unsigned long start_time; 1350 1351 /** @other_end: mac address of remote */ 1352 u8 other_end[ETH_ALEN]; 1353 1354 /** @role: receiver/sender modi */ 1355 enum batadv_tp_meter_role role; 1356 1357 /** @sending: sending binary semaphore: 1 if sending, 0 is not */ 1358 atomic_t sending; 1359 1360 /** @reason: reason for a stopped session */ 1361 enum batadv_tp_meter_reason reason; 1362 1363 /** @finish_work: work item for the finishing procedure */ 1364 struct delayed_work finish_work; 1365 1366 /** @test_length: test length in milliseconds */ 1367 u32 test_length; 1368 1369 /** @session: TP session identifier */ 1370 u8 session[2]; 1371 1372 /** @icmp_uid: local ICMP "socket" index */ 1373 u8 icmp_uid; 1374 1375 /* sender variables */ 1376 1377 /** @dec_cwnd: decimal part of the cwnd used during linear growth */ 1378 u16 dec_cwnd; 1379 1380 /** @cwnd: current size of the congestion window */ 1381 u32 cwnd; 1382 1383 /** @cwnd_lock: lock do protect @cwnd & @dec_cwnd */ 1384 spinlock_t cwnd_lock; 1385 1386 /** 1387 * @ss_threshold: Slow Start threshold. Once cwnd exceeds this value the 1388 * connection switches to the Congestion Avoidance state 1389 */ 1390 u32 ss_threshold; 1391 1392 /** @last_acked: last acked byte */ 1393 atomic_t last_acked; 1394 1395 /** @last_sent: last sent byte, not yet acked */ 1396 u32 last_sent; 1397 1398 /** @tot_sent: amount of data sent/ACKed so far */ 1399 atomic64_t tot_sent; 1400 1401 /** @dup_acks: duplicate ACKs counter */ 1402 atomic_t dup_acks; 1403 1404 /** @fast_recovery: true if in Fast Recovery mode */ 1405 unsigned char fast_recovery:1; 1406 1407 /** @recover: last sent seqno when entering Fast Recovery */ 1408 u32 recover; 1409 1410 /** @rto: sender timeout */ 1411 u32 rto; 1412 1413 /** @srtt: smoothed RTT scaled by 2^3 */ 1414 u32 srtt; 1415 1416 /** @rttvar: RTT variation scaled by 2^2 */ 1417 u32 rttvar; 1418 1419 /** 1420 * @more_bytes: waiting queue anchor when waiting for more ack/retry 1421 * timeout 1422 */ 1423 wait_queue_head_t more_bytes; 1424 1425 /** @prerandom_offset: offset inside the prerandom buffer */ 1426 u32 prerandom_offset; 1427 1428 /** @prerandom_lock: spinlock protecting access to prerandom_offset */ 1429 spinlock_t prerandom_lock; 1430 1431 /* receiver variables */ 1432 1433 /** @last_recv: last in-order received packet */ 1434 u32 last_recv; 1435 1436 /** @unacked_list: list of unacked packets (meta-info only) */ 1437 struct list_head unacked_list; 1438 1439 /** @unacked_lock: protect unacked_list */ 1440 spinlock_t unacked_lock; 1441 1442 /** @last_recv_time: time time (jiffies) a msg was received */ 1443 unsigned long last_recv_time; 1444 1445 /** @refcount: number of context where the object is used */ 1446 struct kref refcount; 1447 1448 /** @rcu: struct used for freeing in an RCU-safe manner */ 1449 struct rcu_head rcu; 1450 }; 1451 1452 /** 1453 * struct batadv_softif_vlan - per VLAN attributes set 1454 */ 1455 struct batadv_softif_vlan { 1456 /** @bat_priv: pointer to the mesh object */ 1457 struct batadv_priv *bat_priv; 1458 1459 /** @vid: VLAN identifier */ 1460 unsigned short vid; 1461 1462 /** @kobj: kobject for sysfs vlan subdirectory */ 1463 struct kobject *kobj; 1464 1465 /** @ap_isolation: AP isolation state */ 1466 atomic_t ap_isolation; /* boolean */ 1467 1468 /** @tt: TT private attributes (VLAN specific) */ 1469 struct batadv_vlan_tt tt; 1470 1471 /** @list: list node for &bat_priv.softif_vlan_list */ 1472 struct hlist_node list; 1473 1474 /** 1475 * @refcount: number of context where this object is currently in use 1476 */ 1477 struct kref refcount; 1478 1479 /** @rcu: struct used for freeing in a RCU-safe manner */ 1480 struct rcu_head rcu; 1481 }; 1482 1483 /** 1484 * struct batadv_priv_bat_v - B.A.T.M.A.N. V per soft-interface private data 1485 */ 1486 struct batadv_priv_bat_v { 1487 /** @ogm_buff: buffer holding the OGM packet */ 1488 unsigned char *ogm_buff; 1489 1490 /** @ogm_buff_len: length of the OGM packet buffer */ 1491 int ogm_buff_len; 1492 1493 /** @ogm_seqno: OGM sequence number - used to identify each OGM */ 1494 atomic_t ogm_seqno; 1495 1496 /** @ogm_wq: workqueue used to schedule OGM transmissions */ 1497 struct delayed_work ogm_wq; 1498 }; 1499 1500 /** 1501 * struct batadv_priv - per mesh interface data 1502 */ 1503 struct batadv_priv { 1504 /** 1505 * @mesh_state: current status of the mesh 1506 * (inactive/active/deactivating) 1507 */ 1508 atomic_t mesh_state; 1509 1510 /** @soft_iface: net device which holds this struct as private data */ 1511 struct net_device *soft_iface; 1512 1513 /** 1514 * @bat_counters: mesh internal traffic statistic counters (see 1515 * batadv_counters) 1516 */ 1517 u64 __percpu *bat_counters; /* Per cpu counters */ 1518 1519 /** 1520 * @aggregated_ogms: bool indicating whether OGM aggregation is enabled 1521 */ 1522 atomic_t aggregated_ogms; 1523 1524 /** @bonding: bool indicating whether traffic bonding is enabled */ 1525 atomic_t bonding; 1526 1527 /** 1528 * @fragmentation: bool indicating whether traffic fragmentation is 1529 * enabled 1530 */ 1531 atomic_t fragmentation; 1532 1533 /** 1534 * @packet_size_max: max packet size that can be transmitted via 1535 * multiple fragmented skbs or a single frame if fragmentation is 1536 * disabled 1537 */ 1538 atomic_t packet_size_max; 1539 1540 /** 1541 * @frag_seqno: incremental counter to identify chains of egress 1542 * fragments 1543 */ 1544 atomic_t frag_seqno; 1545 1546 #ifdef CONFIG_BATMAN_ADV_BLA 1547 /** 1548 * @bridge_loop_avoidance: bool indicating whether bridge loop 1549 * avoidance is enabled 1550 */ 1551 atomic_t bridge_loop_avoidance; 1552 #endif 1553 1554 #ifdef CONFIG_BATMAN_ADV_DAT 1555 /** 1556 * @distributed_arp_table: bool indicating whether distributed ARP table 1557 * is enabled 1558 */ 1559 atomic_t distributed_arp_table; 1560 #endif 1561 1562 #ifdef CONFIG_BATMAN_ADV_MCAST 1563 /** 1564 * @multicast_mode: Enable or disable multicast optimizations on this 1565 * node's sender/originating side 1566 */ 1567 atomic_t multicast_mode; 1568 #endif 1569 1570 /** @orig_interval: OGM broadcast interval in milliseconds */ 1571 atomic_t orig_interval; 1572 1573 /** 1574 * @hop_penalty: penalty which will be applied to an OGM's tq-field on 1575 * every hop 1576 */ 1577 atomic_t hop_penalty; 1578 1579 #ifdef CONFIG_BATMAN_ADV_DEBUG 1580 /** @log_level: configured log level (see batadv_dbg_level) */ 1581 atomic_t log_level; 1582 #endif 1583 1584 /** 1585 * @isolation_mark: the skb->mark value used to match packets for AP 1586 * isolation 1587 */ 1588 u32 isolation_mark; 1589 1590 /** 1591 * @isolation_mark_mask: bitmask identifying the bits in skb->mark to be 1592 * used for the isolation mark 1593 */ 1594 u32 isolation_mark_mask; 1595 1596 /** @bcast_seqno: last sent broadcast packet sequence number */ 1597 atomic_t bcast_seqno; 1598 1599 /** 1600 * @bcast_queue_left: number of remaining buffered broadcast packet 1601 * slots 1602 */ 1603 atomic_t bcast_queue_left; 1604 1605 /** @batman_queue_left: number of remaining OGM packet slots */ 1606 atomic_t batman_queue_left; 1607 1608 /** @mesh_obj: kobject for sysfs mesh subdirectory */ 1609 struct kobject *mesh_obj; 1610 1611 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 1612 /** @debug_dir: dentry for debugfs batman-adv subdirectory */ 1613 struct dentry *debug_dir; 1614 #endif 1615 1616 /** @forw_bat_list: list of aggregated OGMs that will be forwarded */ 1617 struct hlist_head forw_bat_list; 1618 1619 /** 1620 * @forw_bcast_list: list of broadcast packets that will be 1621 * rebroadcasted 1622 */ 1623 struct hlist_head forw_bcast_list; 1624 1625 /** @tp_list: list of tp sessions */ 1626 struct hlist_head tp_list; 1627 1628 /** @tp_num: number of currently active tp sessions */ 1629 struct batadv_hashtable *orig_hash; 1630 1631 /** @orig_hash: hash table containing mesh participants (orig nodes) */ 1632 spinlock_t forw_bat_list_lock; 1633 1634 /** @forw_bat_list_lock: lock protecting forw_bat_list */ 1635 spinlock_t forw_bcast_list_lock; 1636 1637 /** @forw_bcast_list_lock: lock protecting forw_bcast_list */ 1638 spinlock_t tp_list_lock; 1639 1640 /** @tp_list_lock: spinlock protecting @tp_list */ 1641 atomic_t tp_num; 1642 1643 /** @orig_work: work queue callback item for orig node purging */ 1644 struct delayed_work orig_work; 1645 1646 /** 1647 * @primary_if: one of the hard-interfaces assigned to this mesh 1648 * interface becomes the primary interface 1649 */ 1650 struct batadv_hard_iface __rcu *primary_if; /* rcu protected pointer */ 1651 1652 /** @algo_ops: routing algorithm used by this mesh interface */ 1653 struct batadv_algo_ops *algo_ops; 1654 1655 /** 1656 * @softif_vlan_list: a list of softif_vlan structs, one per VLAN 1657 * created on top of the mesh interface represented by this object 1658 */ 1659 struct hlist_head softif_vlan_list; 1660 1661 /** @softif_vlan_list_lock: lock protecting softif_vlan_list */ 1662 spinlock_t softif_vlan_list_lock; 1663 1664 #ifdef CONFIG_BATMAN_ADV_BLA 1665 /** @bla: bridge loope avoidance data */ 1666 struct batadv_priv_bla bla; 1667 #endif 1668 1669 #ifdef CONFIG_BATMAN_ADV_DEBUG 1670 /** @debug_log: holding debug logging relevant data */ 1671 struct batadv_priv_debug_log *debug_log; 1672 #endif 1673 1674 /** @gw: gateway data */ 1675 struct batadv_priv_gw gw; 1676 1677 /** @tt: translation table data */ 1678 struct batadv_priv_tt tt; 1679 1680 /** @tvlv: type-version-length-value data */ 1681 struct batadv_priv_tvlv tvlv; 1682 1683 #ifdef CONFIG_BATMAN_ADV_DAT 1684 /** @dat: distributed arp table data */ 1685 struct batadv_priv_dat dat; 1686 #endif 1687 1688 #ifdef CONFIG_BATMAN_ADV_MCAST 1689 /** @mcast: multicast data */ 1690 struct batadv_priv_mcast mcast; 1691 #endif 1692 1693 #ifdef CONFIG_BATMAN_ADV_NC 1694 /** 1695 * @network_coding: bool indicating whether network coding is enabled 1696 */ 1697 atomic_t network_coding; 1698 1699 /** @nc: network coding data */ 1700 struct batadv_priv_nc nc; 1701 #endif /* CONFIG_BATMAN_ADV_NC */ 1702 1703 #ifdef CONFIG_BATMAN_ADV_BATMAN_V 1704 /** @bat_v: B.A.T.M.A.N. V per soft-interface private data */ 1705 struct batadv_priv_bat_v bat_v; 1706 #endif 1707 }; 1708 1709 /** 1710 * struct batadv_socket_client - layer2 icmp socket client data 1711 */ 1712 struct batadv_socket_client { 1713 /** 1714 * @queue_list: packet queue for packets destined for this socket client 1715 */ 1716 struct list_head queue_list; 1717 1718 /** @queue_len: number of packets in the packet queue (queue_list) */ 1719 unsigned int queue_len; 1720 1721 /** @index: socket client's index in the batadv_socket_client_hash */ 1722 unsigned char index; 1723 1724 /** @lock: lock protecting queue_list, queue_len & index */ 1725 spinlock_t lock; 1726 1727 /** @queue_wait: socket client's wait queue */ 1728 wait_queue_head_t queue_wait; 1729 1730 /** @bat_priv: pointer to soft_iface this client belongs to */ 1731 struct batadv_priv *bat_priv; 1732 }; 1733 1734 /** 1735 * struct batadv_socket_packet - layer2 icmp packet for socket client 1736 */ 1737 struct batadv_socket_packet { 1738 /** @list: list node for &batadv_socket_client.queue_list */ 1739 struct list_head list; 1740 1741 /** @icmp_len: size of the layer2 icmp packet */ 1742 size_t icmp_len; 1743 1744 /** @icmp_packet: layer2 icmp packet */ 1745 u8 icmp_packet[BATADV_ICMP_MAX_PACKET_SIZE]; 1746 }; 1747 1748 #ifdef CONFIG_BATMAN_ADV_BLA 1749 1750 /** 1751 * struct batadv_bla_backbone_gw - batman-adv gateway bridged into the LAN 1752 */ 1753 struct batadv_bla_backbone_gw { 1754 /** 1755 * @orig: originator address of backbone node (mac address of primary 1756 * iface) 1757 */ 1758 u8 orig[ETH_ALEN]; 1759 1760 /** @vid: vlan id this gateway was detected on */ 1761 unsigned short vid; 1762 1763 /** @hash_entry: hlist node for &batadv_priv_bla.backbone_hash */ 1764 struct hlist_node hash_entry; 1765 1766 /** @bat_priv: pointer to soft_iface this backbone gateway belongs to */ 1767 struct batadv_priv *bat_priv; 1768 1769 /** @lasttime: last time we heard of this backbone gw */ 1770 unsigned long lasttime; 1771 1772 /** 1773 * @wait_periods: grace time for bridge forward delays and bla group 1774 * forming at bootup phase - no bcast traffic is formwared until it has 1775 * elapsed 1776 */ 1777 atomic_t wait_periods; 1778 1779 /** 1780 * @request_sent: if this bool is set to true we are out of sync with 1781 * this backbone gateway - no bcast traffic is formwared until the 1782 * situation was resolved 1783 */ 1784 atomic_t request_sent; 1785 1786 /** @crc: crc16 checksum over all claims */ 1787 u16 crc; 1788 1789 /** @crc_lock: lock protecting crc */ 1790 spinlock_t crc_lock; 1791 1792 /** @report_work: work struct for reporting detected loops */ 1793 struct work_struct report_work; 1794 1795 /** @refcount: number of contexts the object is used */ 1796 struct kref refcount; 1797 1798 /** @rcu: struct used for freeing in an RCU-safe manner */ 1799 struct rcu_head rcu; 1800 }; 1801 1802 /** 1803 * struct batadv_bla_claim - claimed non-mesh client structure 1804 */ 1805 struct batadv_bla_claim { 1806 /** @addr: mac address of claimed non-mesh client */ 1807 u8 addr[ETH_ALEN]; 1808 1809 /** @vid: vlan id this client was detected on */ 1810 unsigned short vid; 1811 1812 /** @backbone_gw: pointer to backbone gw claiming this client */ 1813 struct batadv_bla_backbone_gw *backbone_gw; 1814 1815 /** @backbone_lock: lock protecting backbone_gw pointer */ 1816 spinlock_t backbone_lock; 1817 1818 /** @lasttime: last time we heard of claim (locals only) */ 1819 unsigned long lasttime; 1820 1821 /** @hash_entry: hlist node for &batadv_priv_bla.claim_hash */ 1822 struct hlist_node hash_entry; 1823 1824 /** @refcount: number of contexts the object is used */ 1825 struct rcu_head rcu; 1826 1827 /** @rcu: struct used for freeing in an RCU-safe manner */ 1828 struct kref refcount; 1829 }; 1830 #endif 1831 1832 /** 1833 * struct batadv_tt_common_entry - tt local & tt global common data 1834 */ 1835 struct batadv_tt_common_entry { 1836 /** @addr: mac address of non-mesh client */ 1837 u8 addr[ETH_ALEN]; 1838 1839 /** @vid: VLAN identifier */ 1840 unsigned short vid; 1841 1842 /** 1843 * @hash_entry: hlist node for &batadv_priv_tt.local_hash or for 1844 * &batadv_priv_tt.global_hash 1845 */ 1846 struct hlist_node hash_entry; 1847 1848 /** @flags: various state handling flags (see batadv_tt_client_flags) */ 1849 u16 flags; 1850 1851 /** @added_at: timestamp used for purging stale tt common entries */ 1852 unsigned long added_at; 1853 1854 /** @refcount: number of contexts the object is used */ 1855 struct kref refcount; 1856 1857 /** @rcu: struct used for freeing in an RCU-safe manner */ 1858 struct rcu_head rcu; 1859 }; 1860 1861 /** 1862 * struct batadv_tt_local_entry - translation table local entry data 1863 */ 1864 struct batadv_tt_local_entry { 1865 /** @common: general translation table data */ 1866 struct batadv_tt_common_entry common; 1867 1868 /** @last_seen: timestamp used for purging stale tt local entries */ 1869 unsigned long last_seen; 1870 1871 /** @vlan: soft-interface vlan of the entry */ 1872 struct batadv_softif_vlan *vlan; 1873 }; 1874 1875 /** 1876 * struct batadv_tt_global_entry - translation table global entry data 1877 */ 1878 struct batadv_tt_global_entry { 1879 /** @common: general translation table data */ 1880 struct batadv_tt_common_entry common; 1881 1882 /** @orig_list: list of orig nodes announcing this non-mesh client */ 1883 struct hlist_head orig_list; 1884 1885 /** @orig_list_count: number of items in the orig_list */ 1886 atomic_t orig_list_count; 1887 1888 /** @list_lock: lock protecting orig_list */ 1889 spinlock_t list_lock; 1890 1891 /** @roam_at: time at which TT_GLOBAL_ROAM was set */ 1892 unsigned long roam_at; 1893 }; 1894 1895 /** 1896 * struct batadv_tt_orig_list_entry - orig node announcing a non-mesh client 1897 */ 1898 struct batadv_tt_orig_list_entry { 1899 /** @orig_node: pointer to orig node announcing this non-mesh client */ 1900 struct batadv_orig_node *orig_node; 1901 1902 /** 1903 * @ttvn: translation table version number which added the non-mesh 1904 * client 1905 */ 1906 u8 ttvn; 1907 1908 /** @flags: per orig entry TT sync flags */ 1909 u8 flags; 1910 1911 /** @list: list node for &batadv_tt_global_entry.orig_list */ 1912 struct hlist_node list; 1913 1914 /** @refcount: number of contexts the object is used */ 1915 struct kref refcount; 1916 1917 /** @rcu: struct used for freeing in an RCU-safe manner */ 1918 struct rcu_head rcu; 1919 }; 1920 1921 /** 1922 * struct batadv_tt_change_node - structure for tt changes occurred 1923 */ 1924 struct batadv_tt_change_node { 1925 /** @list: list node for &batadv_priv_tt.changes_list */ 1926 struct list_head list; 1927 1928 /** @change: holds the actual translation table diff data */ 1929 struct batadv_tvlv_tt_change change; 1930 }; 1931 1932 /** 1933 * struct batadv_tt_req_node - data to keep track of the tt requests in flight 1934 */ 1935 struct batadv_tt_req_node { 1936 /** 1937 * @addr: mac address address of the originator this request was sent to 1938 */ 1939 u8 addr[ETH_ALEN]; 1940 1941 /** @issued_at: timestamp used for purging stale tt requests */ 1942 unsigned long issued_at; 1943 1944 /** @refcount: number of contexts the object is used by */ 1945 struct kref refcount; 1946 1947 /** @list: list node for &batadv_priv_tt.req_list */ 1948 struct hlist_node list; 1949 }; 1950 1951 /** 1952 * struct batadv_tt_roam_node - roaming client data 1953 */ 1954 struct batadv_tt_roam_node { 1955 /** @addr: mac address of the client in the roaming phase */ 1956 u8 addr[ETH_ALEN]; 1957 1958 /** 1959 * @counter: number of allowed roaming events per client within a single 1960 * OGM interval (changes are committed with each OGM) 1961 */ 1962 atomic_t counter; 1963 1964 /** 1965 * @first_time: timestamp used for purging stale roaming node entries 1966 */ 1967 unsigned long first_time; 1968 1969 /** @list: list node for &batadv_priv_tt.roam_list */ 1970 struct list_head list; 1971 }; 1972 1973 /** 1974 * struct batadv_nc_node - network coding node 1975 */ 1976 struct batadv_nc_node { 1977 /** @list: next and prev pointer for the list handling */ 1978 struct list_head list; 1979 1980 /** @addr: the node's mac address */ 1981 u8 addr[ETH_ALEN]; 1982 1983 /** @refcount: number of contexts the object is used by */ 1984 struct kref refcount; 1985 1986 /** @rcu: struct used for freeing in an RCU-safe manner */ 1987 struct rcu_head rcu; 1988 1989 /** @orig_node: pointer to corresponding orig node struct */ 1990 struct batadv_orig_node *orig_node; 1991 1992 /** @last_seen: timestamp of last ogm received from this node */ 1993 unsigned long last_seen; 1994 }; 1995 1996 /** 1997 * struct batadv_nc_path - network coding path 1998 */ 1999 struct batadv_nc_path { 2000 /** @hash_entry: next and prev pointer for the list handling */ 2001 struct hlist_node hash_entry; 2002 2003 /** @rcu: struct used for freeing in an RCU-safe manner */ 2004 struct rcu_head rcu; 2005 2006 /** @refcount: number of contexts the object is used by */ 2007 struct kref refcount; 2008 2009 /** @packet_list: list of buffered packets for this path */ 2010 struct list_head packet_list; 2011 2012 /** @packet_list_lock: access lock for packet list */ 2013 spinlock_t packet_list_lock; 2014 2015 /** @next_hop: next hop (destination) of path */ 2016 u8 next_hop[ETH_ALEN]; 2017 2018 /** @prev_hop: previous hop (source) of path */ 2019 u8 prev_hop[ETH_ALEN]; 2020 2021 /** @last_valid: timestamp for last validation of path */ 2022 unsigned long last_valid; 2023 }; 2024 2025 /** 2026 * struct batadv_nc_packet - network coding packet used when coding and 2027 * decoding packets 2028 */ 2029 struct batadv_nc_packet { 2030 /** @list: next and prev pointer for the list handling */ 2031 struct list_head list; 2032 2033 /** @packet_id: crc32 checksum of skb data */ 2034 __be32 packet_id; 2035 2036 /** 2037 * @timestamp: field containing the info when the packet was added to 2038 * path 2039 */ 2040 unsigned long timestamp; 2041 2042 /** @neigh_node: pointer to original next hop neighbor of skb */ 2043 struct batadv_neigh_node *neigh_node; 2044 2045 /** @skb: skb which can be encoded or used for decoding */ 2046 struct sk_buff *skb; 2047 2048 /** @nc_path: pointer to path this nc packet is attached to */ 2049 struct batadv_nc_path *nc_path; 2050 }; 2051 2052 /** 2053 * struct batadv_skb_cb - control buffer structure used to store private data 2054 * relevant to batman-adv in the skb->cb buffer in skbs. 2055 */ 2056 struct batadv_skb_cb { 2057 /** 2058 * @decoded: Marks a skb as decoded, which is checked when searching for 2059 * coding opportunities in network-coding.c 2060 */ 2061 unsigned char decoded:1; 2062 2063 /** @num_bcasts: Counter for broadcast packet retransmissions */ 2064 unsigned char num_bcasts; 2065 }; 2066 2067 /** 2068 * struct batadv_forw_packet - structure for bcast packets to be sent/forwarded 2069 */ 2070 struct batadv_forw_packet { 2071 /** 2072 * @list: list node for &batadv_priv.forw.bcast_list and 2073 * &batadv_priv.forw.bat_list 2074 */ 2075 struct hlist_node list; 2076 2077 /** @cleanup_list: list node for purging functions */ 2078 struct hlist_node cleanup_list; 2079 2080 /** @send_time: execution time for delayed_work (packet sending) */ 2081 unsigned long send_time; 2082 2083 /** 2084 * @own: bool for locally generated packets (local OGMs are re-scheduled 2085 * after sending) 2086 */ 2087 u8 own; 2088 2089 /** @skb: bcast packet's skb buffer */ 2090 struct sk_buff *skb; 2091 2092 /** @packet_len: size of aggregated OGM packet inside the skb buffer */ 2093 u16 packet_len; 2094 2095 /** @direct_link_flags: direct link flags for aggregated OGM packets */ 2096 u32 direct_link_flags; 2097 2098 /** @num_packets: counter for aggregated OGMv1 packets */ 2099 u8 num_packets; 2100 2101 /** @delayed_work: work queue callback item for packet sending */ 2102 struct delayed_work delayed_work; 2103 2104 /** 2105 * @if_incoming: pointer to incoming hard-iface or primary iface if 2106 * locally generated packet 2107 */ 2108 struct batadv_hard_iface *if_incoming; 2109 2110 /** 2111 * @if_outgoing: packet where the packet should be sent to, or NULL if 2112 * unspecified 2113 */ 2114 struct batadv_hard_iface *if_outgoing; 2115 2116 /** @queue_left: The queue (counter) this packet was applied to */ 2117 atomic_t *queue_left; 2118 }; 2119 2120 /** 2121 * struct batadv_algo_iface_ops - mesh algorithm callbacks (interface specific) 2122 */ 2123 struct batadv_algo_iface_ops { 2124 /** 2125 * @activate: start routing mechanisms when hard-interface is brought up 2126 * (optional) 2127 */ 2128 void (*activate)(struct batadv_hard_iface *hard_iface); 2129 2130 /** @enable: init routing info when hard-interface is enabled */ 2131 int (*enable)(struct batadv_hard_iface *hard_iface); 2132 2133 /** @disable: de-init routing info when hard-interface is disabled */ 2134 void (*disable)(struct batadv_hard_iface *hard_iface); 2135 2136 /** 2137 * @update_mac: (re-)init mac addresses of the protocol information 2138 * belonging to this hard-interface 2139 */ 2140 void (*update_mac)(struct batadv_hard_iface *hard_iface); 2141 2142 /** @primary_set: called when primary interface is selected / changed */ 2143 void (*primary_set)(struct batadv_hard_iface *hard_iface); 2144 }; 2145 2146 /** 2147 * struct batadv_algo_neigh_ops - mesh algorithm callbacks (neighbour specific) 2148 */ 2149 struct batadv_algo_neigh_ops { 2150 /** @hardif_init: called on creation of single hop entry (optional) */ 2151 void (*hardif_init)(struct batadv_hardif_neigh_node *neigh); 2152 2153 /** 2154 * @cmp: compare the metrics of two neighbors for their respective 2155 * outgoing interfaces 2156 */ 2157 int (*cmp)(struct batadv_neigh_node *neigh1, 2158 struct batadv_hard_iface *if_outgoing1, 2159 struct batadv_neigh_node *neigh2, 2160 struct batadv_hard_iface *if_outgoing2); 2161 2162 /** 2163 * @is_similar_or_better: check if neigh1 is equally similar or better 2164 * than neigh2 for their respective outgoing interface from the metric 2165 * prospective 2166 */ 2167 bool (*is_similar_or_better)(struct batadv_neigh_node *neigh1, 2168 struct batadv_hard_iface *if_outgoing1, 2169 struct batadv_neigh_node *neigh2, 2170 struct batadv_hard_iface *if_outgoing2); 2171 2172 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 2173 /** @print: print the single hop neighbor list (optional) */ 2174 void (*print)(struct batadv_priv *priv, struct seq_file *seq); 2175 #endif 2176 2177 /** @dump: dump neighbors to a netlink socket (optional) */ 2178 void (*dump)(struct sk_buff *msg, struct netlink_callback *cb, 2179 struct batadv_priv *priv, 2180 struct batadv_hard_iface *hard_iface); 2181 }; 2182 2183 /** 2184 * struct batadv_algo_orig_ops - mesh algorithm callbacks (originator specific) 2185 */ 2186 struct batadv_algo_orig_ops { 2187 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 2188 /** @print: print the originator table (optional) */ 2189 void (*print)(struct batadv_priv *priv, struct seq_file *seq, 2190 struct batadv_hard_iface *hard_iface); 2191 #endif 2192 2193 /** @dump: dump originators to a netlink socket (optional) */ 2194 void (*dump)(struct sk_buff *msg, struct netlink_callback *cb, 2195 struct batadv_priv *priv, 2196 struct batadv_hard_iface *hard_iface); 2197 }; 2198 2199 /** 2200 * struct batadv_algo_gw_ops - mesh algorithm callbacks (GW specific) 2201 */ 2202 struct batadv_algo_gw_ops { 2203 /** @init_sel_class: initialize GW selection class (optional) */ 2204 void (*init_sel_class)(struct batadv_priv *bat_priv); 2205 2206 /** 2207 * @store_sel_class: parse and stores a new GW selection class 2208 * (optional) 2209 */ 2210 ssize_t (*store_sel_class)(struct batadv_priv *bat_priv, char *buff, 2211 size_t count); 2212 2213 /** @show_sel_class: prints the current GW selection class (optional) */ 2214 ssize_t (*show_sel_class)(struct batadv_priv *bat_priv, char *buff); 2215 2216 /** 2217 * @get_best_gw_node: select the best GW from the list of available 2218 * nodes (optional) 2219 */ 2220 struct batadv_gw_node *(*get_best_gw_node) 2221 (struct batadv_priv *bat_priv); 2222 2223 /** 2224 * @is_eligible: check if a newly discovered GW is a potential candidate 2225 * for the election as best GW (optional) 2226 */ 2227 bool (*is_eligible)(struct batadv_priv *bat_priv, 2228 struct batadv_orig_node *curr_gw_orig, 2229 struct batadv_orig_node *orig_node); 2230 2231 #ifdef CONFIG_BATMAN_ADV_DEBUGFS 2232 /** @print: print the gateway table (optional) */ 2233 void (*print)(struct batadv_priv *bat_priv, struct seq_file *seq); 2234 #endif 2235 2236 /** @dump: dump gateways to a netlink socket (optional) */ 2237 void (*dump)(struct sk_buff *msg, struct netlink_callback *cb, 2238 struct batadv_priv *priv); 2239 }; 2240 2241 /** 2242 * struct batadv_algo_ops - mesh algorithm callbacks 2243 */ 2244 struct batadv_algo_ops { 2245 /** @list: list node for the batadv_algo_list */ 2246 struct hlist_node list; 2247 2248 /** @name: name of the algorithm */ 2249 char *name; 2250 2251 /** @iface: callbacks related to interface handling */ 2252 struct batadv_algo_iface_ops iface; 2253 2254 /** @neigh: callbacks related to neighbors handling */ 2255 struct batadv_algo_neigh_ops neigh; 2256 2257 /** @orig: callbacks related to originators handling */ 2258 struct batadv_algo_orig_ops orig; 2259 2260 /** @gw: callbacks related to GW mode */ 2261 struct batadv_algo_gw_ops gw; 2262 }; 2263 2264 /** 2265 * struct batadv_dat_entry - it is a single entry of batman-adv ARP backend. It 2266 * is used to stored ARP entries needed for the global DAT cache 2267 */ 2268 struct batadv_dat_entry { 2269 /** @ip: the IPv4 corresponding to this DAT/ARP entry */ 2270 __be32 ip; 2271 2272 /** @mac_addr: the MAC address associated to the stored IPv4 */ 2273 u8 mac_addr[ETH_ALEN]; 2274 2275 /** @vid: the vlan ID associated to this entry */ 2276 unsigned short vid; 2277 2278 /** 2279 * @last_update: time in jiffies when this entry was refreshed last time 2280 */ 2281 unsigned long last_update; 2282 2283 /** @hash_entry: hlist node for &batadv_priv_dat.hash */ 2284 struct hlist_node hash_entry; 2285 2286 /** @refcount: number of contexts the object is used */ 2287 struct kref refcount; 2288 2289 /** @rcu: struct used for freeing in an RCU-safe manner */ 2290 struct rcu_head rcu; 2291 }; 2292 2293 /** 2294 * struct batadv_hw_addr - a list entry for a MAC address 2295 */ 2296 struct batadv_hw_addr { 2297 /** @list: list node for the linking of entries */ 2298 struct hlist_node list; 2299 2300 /** @addr: the MAC address of this list entry */ 2301 unsigned char addr[ETH_ALEN]; 2302 }; 2303 2304 /** 2305 * struct batadv_dat_candidate - candidate destination for DAT operations 2306 */ 2307 struct batadv_dat_candidate { 2308 /** 2309 * @type: the type of the selected candidate. It can one of the 2310 * following: 2311 * - BATADV_DAT_CANDIDATE_NOT_FOUND 2312 * - BATADV_DAT_CANDIDATE_ORIG 2313 */ 2314 int type; 2315 2316 /** 2317 * @orig_node: if type is BATADV_DAT_CANDIDATE_ORIG this field points to 2318 * the corresponding originator node structure 2319 */ 2320 struct batadv_orig_node *orig_node; 2321 }; 2322 2323 /** 2324 * struct batadv_tvlv_container - container for tvlv appended to OGMs 2325 */ 2326 struct batadv_tvlv_container { 2327 /** @list: hlist node for &batadv_priv_tvlv.container_list */ 2328 struct hlist_node list; 2329 2330 /** @tvlv_hdr: tvlv header information needed to construct the tvlv */ 2331 struct batadv_tvlv_hdr tvlv_hdr; 2332 2333 /** @refcount: number of contexts the object is used */ 2334 struct kref refcount; 2335 }; 2336 2337 /** 2338 * struct batadv_tvlv_handler - handler for specific tvlv type and version 2339 */ 2340 struct batadv_tvlv_handler { 2341 /** @list: hlist node for &batadv_priv_tvlv.handler_list */ 2342 struct hlist_node list; 2343 2344 /** 2345 * @ogm_handler: handler callback which is given the tvlv payload to 2346 * process on incoming OGM packets 2347 */ 2348 void (*ogm_handler)(struct batadv_priv *bat_priv, 2349 struct batadv_orig_node *orig, 2350 u8 flags, void *tvlv_value, u16 tvlv_value_len); 2351 2352 /** 2353 * @unicast_handler: handler callback which is given the tvlv payload to 2354 * process on incoming unicast tvlv packets 2355 */ 2356 int (*unicast_handler)(struct batadv_priv *bat_priv, 2357 u8 *src, u8 *dst, 2358 void *tvlv_value, u16 tvlv_value_len); 2359 2360 /** @type: tvlv type this handler feels responsible for */ 2361 u8 type; 2362 2363 /** @version: tvlv version this handler feels responsible for */ 2364 u8 version; 2365 2366 /** @flags: tvlv handler flags */ 2367 u8 flags; 2368 2369 /** @refcount: number of contexts the object is used */ 2370 struct kref refcount; 2371 2372 /** @rcu: struct used for freeing in an RCU-safe manner */ 2373 struct rcu_head rcu; 2374 }; 2375 2376 /** 2377 * enum batadv_tvlv_handler_flags - tvlv handler flags definitions 2378 */ 2379 enum batadv_tvlv_handler_flags { 2380 /** 2381 * @BATADV_TVLV_HANDLER_OGM_CIFNOTFND: tvlv ogm processing function 2382 * will call this handler even if its type was not found (with no data) 2383 */ 2384 BATADV_TVLV_HANDLER_OGM_CIFNOTFND = BIT(1), 2385 2386 /** 2387 * @BATADV_TVLV_HANDLER_OGM_CALLED: interval tvlv handling flag - the 2388 * API marks a handler as being called, so it won't be called if the 2389 * BATADV_TVLV_HANDLER_OGM_CIFNOTFND flag was set 2390 */ 2391 BATADV_TVLV_HANDLER_OGM_CALLED = BIT(2), 2392 }; 2393 2394 /** 2395 * struct batadv_store_mesh_work - Work queue item to detach add/del interface 2396 * from sysfs locks 2397 */ 2398 struct batadv_store_mesh_work { 2399 /** 2400 * @net_dev: netdevice to add/remove to/from batman-adv soft-interface 2401 */ 2402 struct net_device *net_dev; 2403 2404 /** @soft_iface_name: name of soft-interface to modify */ 2405 char soft_iface_name[IFNAMSIZ]; 2406 2407 /** @work: work queue item */ 2408 struct work_struct work; 2409 }; 2410 2411 #endif /* _NET_BATMAN_ADV_TYPES_H_ */ 2412