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