types.h revision a70a9aa990bdf24039cb4167993bcc5a0f9cbb18
1/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: 2 * 3 * Marek Lindner, Simon Wunderlich 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of version 2 of the GNU General Public 7 * License as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 17 * 02110-1301, USA 18 */ 19 20#ifndef _NET_BATMAN_ADV_TYPES_H_ 21#define _NET_BATMAN_ADV_TYPES_H_ 22 23#include "packet.h" 24#include "bitarray.h" 25#include <linux/kernel.h> 26 27#ifdef CONFIG_BATMAN_ADV_DAT 28 29/* batadv_dat_addr_t is the type used for all DHT addresses. If it is changed, 30 * BATADV_DAT_ADDR_MAX is changed as well. 31 * 32 * *Please be careful: batadv_dat_addr_t must be UNSIGNED* 33 */ 34#define batadv_dat_addr_t uint16_t 35 36#endif /* CONFIG_BATMAN_ADV_DAT */ 37 38/** 39 * struct batadv_hard_iface_bat_iv - per hard interface B.A.T.M.A.N. IV data 40 * @ogm_buff: buffer holding the OGM packet 41 * @ogm_buff_len: length of the OGM packet buffer 42 * @ogm_seqno: OGM sequence number - used to identify each OGM 43 */ 44struct batadv_hard_iface_bat_iv { 45 unsigned char *ogm_buff; 46 int ogm_buff_len; 47 atomic_t ogm_seqno; 48}; 49 50/** 51 * struct batadv_hard_iface - network device known to batman-adv 52 * @list: list node for batadv_hardif_list 53 * @if_num: identificator of the interface 54 * @if_status: status of the interface for batman-adv 55 * @net_dev: pointer to the net_device 56 * @num_bcasts: number of payload re-broadcasts on this interface (ARQ) 57 * @hardif_obj: kobject of the per interface sysfs "mesh" directory 58 * @refcount: number of contexts the object is used 59 * @batman_adv_ptype: packet type describing packets that should be processed by 60 * batman-adv for this interface 61 * @soft_iface: the batman-adv interface which uses this network interface 62 * @rcu: struct used for freeing in an RCU-safe manner 63 * @bat_iv: BATMAN IV specific per hard interface data 64 * @cleanup_work: work queue callback item for hard interface deinit 65 */ 66struct batadv_hard_iface { 67 struct list_head list; 68 int16_t if_num; 69 char if_status; 70 struct net_device *net_dev; 71 uint8_t num_bcasts; 72 struct kobject *hardif_obj; 73 atomic_t refcount; 74 struct packet_type batman_adv_ptype; 75 struct net_device *soft_iface; 76 struct rcu_head rcu; 77 struct batadv_hard_iface_bat_iv bat_iv; 78 struct work_struct cleanup_work; 79}; 80 81/** 82 * struct batadv_frag_table_entry - head in the fragment buffer table 83 * @head: head of list with fragments 84 * @lock: lock to protect the list of fragments 85 * @timestamp: time (jiffie) of last received fragment 86 * @seqno: sequence number of the fragments in the list 87 * @size: accumulated size of packets in list 88 */ 89struct batadv_frag_table_entry { 90 struct hlist_head head; 91 spinlock_t lock; /* protects head */ 92 unsigned long timestamp; 93 uint16_t seqno; 94 uint16_t size; 95}; 96 97/** 98 * struct batadv_frag_list_entry - entry in a list of fragments 99 * @list: list node information 100 * @skb: fragment 101 * @no: fragment number in the set 102 */ 103struct batadv_frag_list_entry { 104 struct hlist_node list; 105 struct sk_buff *skb; 106 uint8_t no; 107}; 108 109/** 110 * struct batadv_orig_node - structure for orig_list maintaining nodes of mesh 111 * @orig: originator ethernet address 112 * @primary_addr: hosts primary interface address 113 * @router: router that should be used to reach this originator 114 * @batadv_dat_addr_t: address of the orig node in the distributed hash 115 * @bcast_own: bitfield containing the number of our OGMs this orig_node 116 * rebroadcasted "back" to us (relative to last_real_seqno) 117 * @bcast_own_sum: counted result of bcast_own 118 * @last_seen: time when last packet from this node was received 119 * @bcast_seqno_reset: time when the broadcast seqno window was reset 120 * @batman_seqno_reset: time when the batman seqno window was reset 121 * @capabilities: announced capabilities of this originator 122 * @last_ttvn: last seen translation table version number 123 * @tt_crc: CRC of the translation table 124 * @tt_buff: last tt changeset this node received from the orig node 125 * @tt_buff_len: length of the last tt changeset this node received from the 126 * orig node 127 * @tt_buff_lock: lock that protects tt_buff and tt_buff_len 128 * @tt_size: number of global TT entries announced by the orig node 129 * @tt_initialised: bool keeping track of whether or not this node have received 130 * any translation table information from the orig node yet 131 * @tt_lock: prevents from updating the table while reading it. Table update is 132 * made up by two operations (data structure update and metdata -CRC/TTVN- 133 * recalculation) and they have to be executed atomically in order to avoid 134 * another thread to read the table/metadata between those. 135 * @last_real_seqno: last and best known sequence number 136 * @last_ttl: ttl of last received packet 137 * @bcast_bits: bitfield containing the info which payload broadcast originated 138 * from this orig node this host already has seen (relative to 139 * last_bcast_seqno) 140 * @last_bcast_seqno: last broadcast sequence number received by this host 141 * @neigh_list: list of potential next hop neighbor towards this orig node 142 * @neigh_list_lock: lock protecting neigh_list, router and bonding_list 143 * @hash_entry: hlist node for batadv_priv::orig_hash 144 * @bat_priv: pointer to soft_iface this orig node belongs to 145 * @ogm_cnt_lock: lock protecting bcast_own, bcast_own_sum, 146 * neigh_node->real_bits & neigh_node->real_packet_count 147 * @bcast_seqno_lock: lock protecting bcast_bits & last_bcast_seqno 148 * @bond_candidates: how many candidates are available 149 * @bond_list: list of bonding candidates 150 * @refcount: number of contexts the object is used 151 * @rcu: struct used for freeing in an RCU-safe manner 152 * @in_coding_list: list of nodes this orig can hear 153 * @out_coding_list: list of nodes that can hear this orig 154 * @in_coding_list_lock: protects in_coding_list 155 * @out_coding_list_lock: protects out_coding_list 156 * @fragments: array with heads for fragment chains 157 */ 158struct batadv_orig_node { 159 uint8_t orig[ETH_ALEN]; 160 uint8_t primary_addr[ETH_ALEN]; 161 struct batadv_neigh_node __rcu *router; /* rcu protected pointer */ 162#ifdef CONFIG_BATMAN_ADV_DAT 163 batadv_dat_addr_t dat_addr; 164#endif 165 unsigned long *bcast_own; 166 uint8_t *bcast_own_sum; 167 unsigned long last_seen; 168 unsigned long bcast_seqno_reset; 169 unsigned long batman_seqno_reset; 170 uint8_t capabilities; 171 atomic_t last_ttvn; 172 uint32_t tt_crc; 173 unsigned char *tt_buff; 174 int16_t tt_buff_len; 175 spinlock_t tt_buff_lock; /* protects tt_buff & tt_buff_len */ 176 atomic_t tt_size; 177 bool tt_initialised; 178 /* prevents from changing the table while reading it */ 179 spinlock_t tt_lock; 180 uint32_t last_real_seqno; 181 uint8_t last_ttl; 182 DECLARE_BITMAP(bcast_bits, BATADV_TQ_LOCAL_WINDOW_SIZE); 183 uint32_t last_bcast_seqno; 184 struct hlist_head neigh_list; 185 /* neigh_list_lock protects: neigh_list, router & bonding_list */ 186 spinlock_t neigh_list_lock; 187 struct hlist_node hash_entry; 188 struct batadv_priv *bat_priv; 189 /* ogm_cnt_lock protects: bcast_own, bcast_own_sum, 190 * neigh_node->real_bits & neigh_node->real_packet_count 191 */ 192 spinlock_t ogm_cnt_lock; 193 /* bcast_seqno_lock protects: bcast_bits & last_bcast_seqno */ 194 spinlock_t bcast_seqno_lock; 195 atomic_t bond_candidates; 196 struct list_head bond_list; 197 atomic_t refcount; 198 struct rcu_head rcu; 199#ifdef CONFIG_BATMAN_ADV_NC 200 struct list_head in_coding_list; 201 struct list_head out_coding_list; 202 spinlock_t in_coding_list_lock; /* Protects in_coding_list */ 203 spinlock_t out_coding_list_lock; /* Protects out_coding_list */ 204#endif 205 struct batadv_frag_table_entry fragments[BATADV_FRAG_BUFFER_COUNT]; 206}; 207 208/** 209 * enum batadv_orig_capabilities - orig node capabilities 210 * @BATADV_ORIG_CAPA_HAS_DAT: orig node has distributed arp table enabled 211 * @BATADV_ORIG_CAPA_HAS_NC: orig node has network coding enabled 212 */ 213enum batadv_orig_capabilities { 214 BATADV_ORIG_CAPA_HAS_DAT = BIT(0), 215 BATADV_ORIG_CAPA_HAS_NC = BIT(1), 216}; 217 218/** 219 * struct batadv_gw_node - structure for orig nodes announcing gw capabilities 220 * @list: list node for batadv_priv_gw::list 221 * @orig_node: pointer to corresponding orig node 222 * @bandwidth_down: advertised uplink download bandwidth 223 * @bandwidth_up: advertised uplink upload bandwidth 224 * @deleted: this struct is scheduled for deletion 225 * @refcount: number of contexts the object is used 226 * @rcu: struct used for freeing in an RCU-safe manner 227 */ 228struct batadv_gw_node { 229 struct hlist_node list; 230 struct batadv_orig_node *orig_node; 231 uint32_t bandwidth_down; 232 uint32_t bandwidth_up; 233 unsigned long deleted; 234 atomic_t refcount; 235 struct rcu_head rcu; 236}; 237 238/** 239 * struct batadv_neigh_node - structure for single hop neighbors 240 * @list: list node for batadv_orig_node::neigh_list 241 * @addr: mac address of neigh node 242 * @tq_recv: ring buffer of received TQ values from this neigh node 243 * @tq_index: ring buffer index 244 * @tq_avg: averaged tq of all tq values in the ring buffer (tq_recv) 245 * @last_ttl: last received ttl from this neigh node 246 * @bonding_list: list node for batadv_orig_node::bond_list 247 * @last_seen: when last packet via this neighbor was received 248 * @real_bits: bitfield containing the number of OGMs received from this neigh 249 * node (relative to orig_node->last_real_seqno) 250 * @real_packet_count: counted result of real_bits 251 * @orig_node: pointer to corresponding orig_node 252 * @if_incoming: pointer to incoming hard interface 253 * @lq_update_lock: lock protecting tq_recv & tq_index 254 * @refcount: number of contexts the object is used 255 * @rcu: struct used for freeing in an RCU-safe manner 256 */ 257struct batadv_neigh_node { 258 struct hlist_node list; 259 uint8_t addr[ETH_ALEN]; 260 uint8_t tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE]; 261 uint8_t tq_index; 262 uint8_t tq_avg; 263 uint8_t last_ttl; 264 struct list_head bonding_list; 265 unsigned long last_seen; 266 DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE); 267 uint8_t real_packet_count; 268 struct batadv_orig_node *orig_node; 269 struct batadv_hard_iface *if_incoming; 270 spinlock_t lq_update_lock; /* protects tq_recv & tq_index */ 271 atomic_t refcount; 272 struct rcu_head rcu; 273}; 274 275/** 276 * struct batadv_bcast_duplist_entry - structure for LAN broadcast suppression 277 * @orig[ETH_ALEN]: mac address of orig node orginating the broadcast 278 * @crc: crc32 checksum of broadcast payload 279 * @entrytime: time when the broadcast packet was received 280 */ 281#ifdef CONFIG_BATMAN_ADV_BLA 282struct batadv_bcast_duplist_entry { 283 uint8_t orig[ETH_ALEN]; 284 __be32 crc; 285 unsigned long entrytime; 286}; 287#endif 288 289/** 290 * enum batadv_counters - indices for traffic counters 291 * @BATADV_CNT_TX: transmitted payload traffic packet counter 292 * @BATADV_CNT_TX_BYTES: transmitted payload traffic bytes counter 293 * @BATADV_CNT_TX_DROPPED: dropped transmission payload traffic packet counter 294 * @BATADV_CNT_RX: received payload traffic packet counter 295 * @BATADV_CNT_RX_BYTES: received payload traffic bytes counter 296 * @BATADV_CNT_FORWARD: forwarded payload traffic packet counter 297 * @BATADV_CNT_FORWARD_BYTES: forwarded payload traffic bytes counter 298 * @BATADV_CNT_MGMT_TX: transmitted routing protocol traffic packet counter 299 * @BATADV_CNT_MGMT_TX_BYTES: transmitted routing protocol traffic bytes counter 300 * @BATADV_CNT_MGMT_RX: received routing protocol traffic packet counter 301 * @BATADV_CNT_MGMT_RX_BYTES: received routing protocol traffic bytes counter 302 * @BATADV_CNT_FRAG_TX: transmitted fragment traffic packet counter 303 * @BATADV_CNT_FRAG_TX_BYTES: transmitted fragment traffic bytes counter 304 * @BATADV_CNT_FRAG_RX: received fragment traffic packet counter 305 * @BATADV_CNT_FRAG_RX_BYTES: received fragment traffic bytes counter 306 * @BATADV_CNT_FRAG_FWD: forwarded fragment traffic packet counter 307 * @BATADV_CNT_FRAG_FWD_BYTES: forwarded fragment traffic bytes counter 308 * @BATADV_CNT_TT_REQUEST_TX: transmitted tt req traffic packet counter 309 * @BATADV_CNT_TT_REQUEST_RX: received tt req traffic packet counter 310 * @BATADV_CNT_TT_RESPONSE_TX: transmitted tt resp traffic packet counter 311 * @BATADV_CNT_TT_RESPONSE_RX: received tt resp traffic packet counter 312 * @BATADV_CNT_TT_ROAM_ADV_TX: transmitted tt roam traffic packet counter 313 * @BATADV_CNT_TT_ROAM_ADV_RX: received tt roam traffic packet counter 314 * @BATADV_CNT_DAT_GET_TX: transmitted dht GET traffic packet counter 315 * @BATADV_CNT_DAT_GET_RX: received dht GET traffic packet counter 316 * @BATADV_CNT_DAT_PUT_TX: transmitted dht PUT traffic packet counter 317 * @BATADV_CNT_DAT_PUT_RX: received dht PUT traffic packet counter 318 * @BATADV_CNT_DAT_CACHED_REPLY_TX: transmitted dat cache reply traffic packet 319 * counter 320 * @BATADV_CNT_NC_CODE: transmitted nc-combined traffic packet counter 321 * @BATADV_CNT_NC_CODE_BYTES: transmitted nc-combined traffic bytes counter 322 * @BATADV_CNT_NC_RECODE: transmitted nc-recombined traffic packet counter 323 * @BATADV_CNT_NC_RECODE_BYTES: transmitted nc-recombined traffic bytes counter 324 * @BATADV_CNT_NC_BUFFER: counter for packets buffered for later nc decoding 325 * @BATADV_CNT_NC_DECODE: received and nc-decoded traffic packet counter 326 * @BATADV_CNT_NC_DECODE_BYTES: received and nc-decoded traffic bytes counter 327 * @BATADV_CNT_NC_DECODE_FAILED: received and decode-failed traffic packet 328 * counter 329 * @BATADV_CNT_NC_SNIFFED: counter for nc-decoded packets received in promisc 330 * mode. 331 * @BATADV_CNT_NUM: number of traffic counters 332 */ 333enum batadv_counters { 334 BATADV_CNT_TX, 335 BATADV_CNT_TX_BYTES, 336 BATADV_CNT_TX_DROPPED, 337 BATADV_CNT_RX, 338 BATADV_CNT_RX_BYTES, 339 BATADV_CNT_FORWARD, 340 BATADV_CNT_FORWARD_BYTES, 341 BATADV_CNT_MGMT_TX, 342 BATADV_CNT_MGMT_TX_BYTES, 343 BATADV_CNT_MGMT_RX, 344 BATADV_CNT_MGMT_RX_BYTES, 345 BATADV_CNT_FRAG_TX, 346 BATADV_CNT_FRAG_TX_BYTES, 347 BATADV_CNT_FRAG_RX, 348 BATADV_CNT_FRAG_RX_BYTES, 349 BATADV_CNT_FRAG_FWD, 350 BATADV_CNT_FRAG_FWD_BYTES, 351 BATADV_CNT_TT_REQUEST_TX, 352 BATADV_CNT_TT_REQUEST_RX, 353 BATADV_CNT_TT_RESPONSE_TX, 354 BATADV_CNT_TT_RESPONSE_RX, 355 BATADV_CNT_TT_ROAM_ADV_TX, 356 BATADV_CNT_TT_ROAM_ADV_RX, 357#ifdef CONFIG_BATMAN_ADV_DAT 358 BATADV_CNT_DAT_GET_TX, 359 BATADV_CNT_DAT_GET_RX, 360 BATADV_CNT_DAT_PUT_TX, 361 BATADV_CNT_DAT_PUT_RX, 362 BATADV_CNT_DAT_CACHED_REPLY_TX, 363#endif 364#ifdef CONFIG_BATMAN_ADV_NC 365 BATADV_CNT_NC_CODE, 366 BATADV_CNT_NC_CODE_BYTES, 367 BATADV_CNT_NC_RECODE, 368 BATADV_CNT_NC_RECODE_BYTES, 369 BATADV_CNT_NC_BUFFER, 370 BATADV_CNT_NC_DECODE, 371 BATADV_CNT_NC_DECODE_BYTES, 372 BATADV_CNT_NC_DECODE_FAILED, 373 BATADV_CNT_NC_SNIFFED, 374#endif 375 BATADV_CNT_NUM, 376}; 377 378/** 379 * struct batadv_priv_tt - per mesh interface translation table data 380 * @vn: translation table version number 381 * @ogm_append_cnt: counter of number of OGMs containing the local tt diff 382 * @local_changes: changes registered in an originator interval 383 * @changes_list: tracks tt local changes within an originator interval 384 * @local_hash: local translation table hash table 385 * @global_hash: global translation table hash table 386 * @req_list: list of pending & unanswered tt_requests 387 * @roam_list: list of the last roaming events of each client limiting the 388 * number of roaming events to avoid route flapping 389 * @changes_list_lock: lock protecting changes_list 390 * @req_list_lock: lock protecting req_list 391 * @roam_list_lock: lock protecting roam_list 392 * @local_entry_num: number of entries in the local hash table 393 * @local_crc: Checksum of the local table, recomputed before sending a new OGM 394 * @last_changeset: last tt changeset this host has generated 395 * @last_changeset_len: length of last tt changeset this host has generated 396 * @last_changeset_lock: lock protecting last_changeset & last_changeset_len 397 * @commit_lock: prevents from executing a local TT commit while reading the 398 * local table. The local TT commit is made up by two operations (data 399 * structure update and metdata -CRC/TTVN- recalculation) and they have to be 400 * executed atomically in order to avoid another thread to read the 401 * table/metadata between those. 402 * @work: work queue callback item for translation table purging 403 */ 404struct batadv_priv_tt { 405 atomic_t vn; 406 atomic_t ogm_append_cnt; 407 atomic_t local_changes; 408 struct list_head changes_list; 409 struct batadv_hashtable *local_hash; 410 struct batadv_hashtable *global_hash; 411 struct list_head req_list; 412 struct list_head roam_list; 413 spinlock_t changes_list_lock; /* protects changes */ 414 spinlock_t req_list_lock; /* protects req_list */ 415 spinlock_t roam_list_lock; /* protects roam_list */ 416 atomic_t local_entry_num; 417 uint32_t local_crc; 418 unsigned char *last_changeset; 419 int16_t last_changeset_len; 420 /* protects last_changeset & last_changeset_len */ 421 spinlock_t last_changeset_lock; 422 /* prevents from executing a commit while reading the table */ 423 spinlock_t commit_lock; 424 struct delayed_work work; 425}; 426 427/** 428 * struct batadv_priv_bla - per mesh interface bridge loope avoidance data 429 * @num_requests; number of bla requests in flight 430 * @claim_hash: hash table containing mesh nodes this host has claimed 431 * @backbone_hash: hash table containing all detected backbone gateways 432 * @bcast_duplist: recently received broadcast packets array (for broadcast 433 * duplicate suppression) 434 * @bcast_duplist_curr: index of last broadcast packet added to bcast_duplist 435 * @bcast_duplist_lock: lock protecting bcast_duplist & bcast_duplist_curr 436 * @claim_dest: local claim data (e.g. claim group) 437 * @work: work queue callback item for cleanups & bla announcements 438 */ 439#ifdef CONFIG_BATMAN_ADV_BLA 440struct batadv_priv_bla { 441 atomic_t num_requests; 442 struct batadv_hashtable *claim_hash; 443 struct batadv_hashtable *backbone_hash; 444 struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE]; 445 int bcast_duplist_curr; 446 /* protects bcast_duplist & bcast_duplist_curr */ 447 spinlock_t bcast_duplist_lock; 448 struct batadv_bla_claim_dst claim_dest; 449 struct delayed_work work; 450}; 451#endif 452 453/** 454 * struct batadv_debug_log - debug logging data 455 * @log_buff: buffer holding the logs (ring bufer) 456 * @log_start: index of next character to read 457 * @log_end: index of next character to write 458 * @lock: lock protecting log_buff, log_start & log_end 459 * @queue_wait: log reader's wait queue 460 */ 461#ifdef CONFIG_BATMAN_ADV_DEBUG 462struct batadv_priv_debug_log { 463 char log_buff[BATADV_LOG_BUF_LEN]; 464 unsigned long log_start; 465 unsigned long log_end; 466 spinlock_t lock; /* protects log_buff, log_start and log_end */ 467 wait_queue_head_t queue_wait; 468}; 469#endif 470 471/** 472 * struct batadv_priv_gw - per mesh interface gateway data 473 * @list: list of available gateway nodes 474 * @list_lock: lock protecting gw_list & curr_gw 475 * @curr_gw: pointer to currently selected gateway node 476 * @bandwidth_down: advertised uplink download bandwidth (if gw_mode server) 477 * @bandwidth_up: advertised uplink upload bandwidth (if gw_mode server) 478 * @reselect: bool indicating a gateway re-selection is in progress 479 */ 480struct batadv_priv_gw { 481 struct hlist_head list; 482 spinlock_t list_lock; /* protects gw_list & curr_gw */ 483 struct batadv_gw_node __rcu *curr_gw; /* rcu protected pointer */ 484 atomic_t bandwidth_down; 485 atomic_t bandwidth_up; 486 atomic_t reselect; 487}; 488 489/** 490 * struct batadv_priv_tvlv - per mesh interface tvlv data 491 * @container_list: list of registered tvlv containers to be sent with each OGM 492 * @handler_list: list of the various tvlv content handlers 493 * @container_list_lock: protects tvlv container list access 494 * @handler_list_lock: protects handler list access 495 */ 496struct batadv_priv_tvlv { 497 struct hlist_head container_list; 498 struct hlist_head handler_list; 499 spinlock_t container_list_lock; /* protects container_list */ 500 spinlock_t handler_list_lock; /* protects handler_list */ 501}; 502 503/** 504 * struct batadv_priv_dat - per mesh interface DAT private data 505 * @addr: node DAT address 506 * @hash: hashtable representing the local ARP cache 507 * @work: work queue callback item for cache purging 508 */ 509#ifdef CONFIG_BATMAN_ADV_DAT 510struct batadv_priv_dat { 511 batadv_dat_addr_t addr; 512 struct batadv_hashtable *hash; 513 struct delayed_work work; 514}; 515#endif 516 517/** 518 * struct batadv_priv_nc - per mesh interface network coding private data 519 * @work: work queue callback item for cleanup 520 * @debug_dir: dentry for nc subdir in batman-adv directory in debugfs 521 * @min_tq: only consider neighbors for encoding if neigh_tq > min_tq 522 * @max_fwd_delay: maximum packet forward delay to allow coding of packets 523 * @max_buffer_time: buffer time for sniffed packets used to decoding 524 * @timestamp_fwd_flush: timestamp of last forward packet queue flush 525 * @timestamp_sniffed_purge: timestamp of last sniffed packet queue purge 526 * @coding_hash: Hash table used to buffer skbs while waiting for another 527 * incoming skb to code it with. Skbs are added to the buffer just before being 528 * forwarded in routing.c 529 * @decoding_hash: Hash table used to buffer skbs that might be needed to decode 530 * a received coded skb. The buffer is used for 1) skbs arriving on the 531 * soft-interface; 2) skbs overheard on the hard-interface; and 3) skbs 532 * forwarded by batman-adv. 533 */ 534struct batadv_priv_nc { 535 struct delayed_work work; 536 struct dentry *debug_dir; 537 u8 min_tq; 538 u32 max_fwd_delay; 539 u32 max_buffer_time; 540 unsigned long timestamp_fwd_flush; 541 unsigned long timestamp_sniffed_purge; 542 struct batadv_hashtable *coding_hash; 543 struct batadv_hashtable *decoding_hash; 544}; 545 546/** 547 * struct batadv_softif_vlan - per VLAN attributes set 548 * @vid: VLAN identifier 549 * @kobj: kobject for sysfs vlan subdirectory 550 * @ap_isolation: AP isolation state 551 * @list: list node for bat_priv::softif_vlan_list 552 * @refcount: number of context where this object is currently in use 553 * @rcu: struct used for freeing in a RCU-safe manner 554 */ 555struct batadv_softif_vlan { 556 unsigned short vid; 557 struct kobject *kobj; 558 atomic_t ap_isolation; /* boolean */ 559 struct hlist_node list; 560 atomic_t refcount; 561 struct rcu_head rcu; 562}; 563 564/** 565 * struct batadv_priv - per mesh interface data 566 * @mesh_state: current status of the mesh (inactive/active/deactivating) 567 * @soft_iface: net device which holds this struct as private data 568 * @stats: structure holding the data for the ndo_get_stats() call 569 * @bat_counters: mesh internal traffic statistic counters (see batadv_counters) 570 * @aggregated_ogms: bool indicating whether OGM aggregation is enabled 571 * @bonding: bool indicating whether traffic bonding is enabled 572 * @fragmentation: bool indicating whether traffic fragmentation is enabled 573 * @frag_seqno: incremental counter to identify chains of egress fragments 574 * @bridge_loop_avoidance: bool indicating whether bridge loop avoidance is 575 * enabled 576 * @distributed_arp_table: bool indicating whether distributed ARP table is 577 * enabled 578 * @gw_mode: gateway operation: off, client or server (see batadv_gw_modes) 579 * @gw_sel_class: gateway selection class (applies if gw_mode client) 580 * @orig_interval: OGM broadcast interval in milliseconds 581 * @hop_penalty: penalty which will be applied to an OGM's tq-field on every hop 582 * @log_level: configured log level (see batadv_dbg_level) 583 * @bcast_seqno: last sent broadcast packet sequence number 584 * @bcast_queue_left: number of remaining buffered broadcast packet slots 585 * @batman_queue_left: number of remaining OGM packet slots 586 * @num_ifaces: number of interfaces assigned to this mesh interface 587 * @mesh_obj: kobject for sysfs mesh subdirectory 588 * @debug_dir: dentry for debugfs batman-adv subdirectory 589 * @forw_bat_list: list of aggregated OGMs that will be forwarded 590 * @forw_bcast_list: list of broadcast packets that will be rebroadcasted 591 * @orig_hash: hash table containing mesh participants (orig nodes) 592 * @forw_bat_list_lock: lock protecting forw_bat_list 593 * @forw_bcast_list_lock: lock protecting forw_bcast_list 594 * @orig_work: work queue callback item for orig node purging 595 * @cleanup_work: work queue callback item for soft interface deinit 596 * @primary_if: one of the hard interfaces assigned to this mesh interface 597 * becomes the primary interface 598 * @bat_algo_ops: routing algorithm used by this mesh interface 599 * @softif_vlan_list: a list of softif_vlan structs, one per VLAN created on top 600 * of the mesh interface represented by this object 601 * @softif_vlan_list_lock: lock protecting softif_vlan_list 602 * @bla: bridge loope avoidance data 603 * @debug_log: holding debug logging relevant data 604 * @gw: gateway data 605 * @tt: translation table data 606 * @tvlv: type-version-length-value data 607 * @dat: distributed arp table data 608 * @network_coding: bool indicating whether network coding is enabled 609 * @batadv_priv_nc: network coding data 610 */ 611struct batadv_priv { 612 atomic_t mesh_state; 613 struct net_device *soft_iface; 614 struct net_device_stats stats; 615 uint64_t __percpu *bat_counters; /* Per cpu counters */ 616 atomic_t aggregated_ogms; 617 atomic_t bonding; 618 atomic_t fragmentation; 619 atomic_t frag_seqno; 620#ifdef CONFIG_BATMAN_ADV_BLA 621 atomic_t bridge_loop_avoidance; 622#endif 623#ifdef CONFIG_BATMAN_ADV_DAT 624 atomic_t distributed_arp_table; 625#endif 626 atomic_t gw_mode; 627 atomic_t gw_sel_class; 628 atomic_t orig_interval; 629 atomic_t hop_penalty; 630#ifdef CONFIG_BATMAN_ADV_DEBUG 631 atomic_t log_level; 632#endif 633 atomic_t bcast_seqno; 634 atomic_t bcast_queue_left; 635 atomic_t batman_queue_left; 636 char num_ifaces; 637 struct kobject *mesh_obj; 638 struct dentry *debug_dir; 639 struct hlist_head forw_bat_list; 640 struct hlist_head forw_bcast_list; 641 struct batadv_hashtable *orig_hash; 642 spinlock_t forw_bat_list_lock; /* protects forw_bat_list */ 643 spinlock_t forw_bcast_list_lock; /* protects forw_bcast_list */ 644 struct delayed_work orig_work; 645 struct work_struct cleanup_work; 646 struct batadv_hard_iface __rcu *primary_if; /* rcu protected pointer */ 647 struct batadv_algo_ops *bat_algo_ops; 648 struct hlist_head softif_vlan_list; 649 spinlock_t softif_vlan_list_lock; /* protects softif_vlan_list */ 650#ifdef CONFIG_BATMAN_ADV_BLA 651 struct batadv_priv_bla bla; 652#endif 653#ifdef CONFIG_BATMAN_ADV_DEBUG 654 struct batadv_priv_debug_log *debug_log; 655#endif 656 struct batadv_priv_gw gw; 657 struct batadv_priv_tt tt; 658 struct batadv_priv_tvlv tvlv; 659#ifdef CONFIG_BATMAN_ADV_DAT 660 struct batadv_priv_dat dat; 661#endif 662#ifdef CONFIG_BATMAN_ADV_NC 663 atomic_t network_coding; 664 struct batadv_priv_nc nc; 665#endif /* CONFIG_BATMAN_ADV_NC */ 666}; 667 668/** 669 * struct batadv_socket_client - layer2 icmp socket client data 670 * @queue_list: packet queue for packets destined for this socket client 671 * @queue_len: number of packets in the packet queue (queue_list) 672 * @index: socket client's index in the batadv_socket_client_hash 673 * @lock: lock protecting queue_list, queue_len & index 674 * @queue_wait: socket client's wait queue 675 * @bat_priv: pointer to soft_iface this client belongs to 676 */ 677struct batadv_socket_client { 678 struct list_head queue_list; 679 unsigned int queue_len; 680 unsigned char index; 681 spinlock_t lock; /* protects queue_list, queue_len & index */ 682 wait_queue_head_t queue_wait; 683 struct batadv_priv *bat_priv; 684}; 685 686/** 687 * struct batadv_socket_packet - layer2 icmp packet for socket client 688 * @list: list node for batadv_socket_client::queue_list 689 * @icmp_len: size of the layer2 icmp packet 690 * @icmp_packet: layer2 icmp packet 691 */ 692struct batadv_socket_packet { 693 struct list_head list; 694 size_t icmp_len; 695 struct batadv_icmp_packet_rr icmp_packet; 696}; 697 698/** 699 * struct batadv_bla_backbone_gw - batman-adv gateway bridged into the LAN 700 * @orig: originator address of backbone node (mac address of primary iface) 701 * @vid: vlan id this gateway was detected on 702 * @hash_entry: hlist node for batadv_priv_bla::backbone_hash 703 * @bat_priv: pointer to soft_iface this backbone gateway belongs to 704 * @lasttime: last time we heard of this backbone gw 705 * @wait_periods: grace time for bridge forward delays and bla group forming at 706 * bootup phase - no bcast traffic is formwared until it has elapsed 707 * @request_sent: if this bool is set to true we are out of sync with this 708 * backbone gateway - no bcast traffic is formwared until the situation was 709 * resolved 710 * @crc: crc16 checksum over all claims 711 * @refcount: number of contexts the object is used 712 * @rcu: struct used for freeing in an RCU-safe manner 713 */ 714#ifdef CONFIG_BATMAN_ADV_BLA 715struct batadv_bla_backbone_gw { 716 uint8_t orig[ETH_ALEN]; 717 unsigned short vid; 718 struct hlist_node hash_entry; 719 struct batadv_priv *bat_priv; 720 unsigned long lasttime; 721 atomic_t wait_periods; 722 atomic_t request_sent; 723 uint16_t crc; 724 atomic_t refcount; 725 struct rcu_head rcu; 726}; 727 728/** 729 * struct batadv_bla_claim - claimed non-mesh client structure 730 * @addr: mac address of claimed non-mesh client 731 * @vid: vlan id this client was detected on 732 * @batadv_bla_backbone_gw: pointer to backbone gw claiming this client 733 * @lasttime: last time we heard of claim (locals only) 734 * @hash_entry: hlist node for batadv_priv_bla::claim_hash 735 * @refcount: number of contexts the object is used 736 * @rcu: struct used for freeing in an RCU-safe manner 737 */ 738struct batadv_bla_claim { 739 uint8_t addr[ETH_ALEN]; 740 unsigned short vid; 741 struct batadv_bla_backbone_gw *backbone_gw; 742 unsigned long lasttime; 743 struct hlist_node hash_entry; 744 struct rcu_head rcu; 745 atomic_t refcount; 746}; 747#endif 748 749/** 750 * struct batadv_tt_common_entry - tt local & tt global common data 751 * @addr: mac address of non-mesh client 752 * @vid: VLAN identifier 753 * @hash_entry: hlist node for batadv_priv_tt::local_hash or for 754 * batadv_priv_tt::global_hash 755 * @flags: various state handling flags (see batadv_tt_client_flags) 756 * @added_at: timestamp used for purging stale tt common entries 757 * @refcount: number of contexts the object is used 758 * @rcu: struct used for freeing in an RCU-safe manner 759 */ 760struct batadv_tt_common_entry { 761 uint8_t addr[ETH_ALEN]; 762 unsigned short vid; 763 struct hlist_node hash_entry; 764 uint16_t flags; 765 unsigned long added_at; 766 atomic_t refcount; 767 struct rcu_head rcu; 768}; 769 770/** 771 * struct batadv_tt_local_entry - translation table local entry data 772 * @common: general translation table data 773 * @last_seen: timestamp used for purging stale tt local entries 774 */ 775struct batadv_tt_local_entry { 776 struct batadv_tt_common_entry common; 777 unsigned long last_seen; 778}; 779 780/** 781 * struct batadv_tt_global_entry - translation table global entry data 782 * @common: general translation table data 783 * @orig_list: list of orig nodes announcing this non-mesh client 784 * @list_lock: lock protecting orig_list 785 * @roam_at: time at which TT_GLOBAL_ROAM was set 786 */ 787struct batadv_tt_global_entry { 788 struct batadv_tt_common_entry common; 789 struct hlist_head orig_list; 790 spinlock_t list_lock; /* protects orig_list */ 791 unsigned long roam_at; 792}; 793 794/** 795 * struct batadv_tt_orig_list_entry - orig node announcing a non-mesh client 796 * @orig_node: pointer to orig node announcing this non-mesh client 797 * @ttvn: translation table version number which added the non-mesh client 798 * @list: list node for batadv_tt_global_entry::orig_list 799 * @refcount: number of contexts the object is used 800 * @rcu: struct used for freeing in an RCU-safe manner 801 */ 802struct batadv_tt_orig_list_entry { 803 struct batadv_orig_node *orig_node; 804 uint8_t ttvn; 805 struct hlist_node list; 806 atomic_t refcount; 807 struct rcu_head rcu; 808}; 809 810/** 811 * struct batadv_tt_change_node - structure for tt changes occured 812 * @list: list node for batadv_priv_tt::changes_list 813 * @change: holds the actual translation table diff data 814 */ 815struct batadv_tt_change_node { 816 struct list_head list; 817 struct batadv_tvlv_tt_change change; 818}; 819 820/** 821 * struct batadv_tt_req_node - data to keep track of the tt requests in flight 822 * @addr: mac address address of the originator this request was sent to 823 * @issued_at: timestamp used for purging stale tt requests 824 * @list: list node for batadv_priv_tt::req_list 825 */ 826struct batadv_tt_req_node { 827 uint8_t addr[ETH_ALEN]; 828 unsigned long issued_at; 829 struct list_head list; 830}; 831 832/** 833 * struct batadv_tt_roam_node - roaming client data 834 * @addr: mac address of the client in the roaming phase 835 * @counter: number of allowed roaming events per client within a single 836 * OGM interval (changes are committed with each OGM) 837 * @first_time: timestamp used for purging stale roaming node entries 838 * @list: list node for batadv_priv_tt::roam_list 839 */ 840struct batadv_tt_roam_node { 841 uint8_t addr[ETH_ALEN]; 842 atomic_t counter; 843 unsigned long first_time; 844 struct list_head list; 845}; 846 847/** 848 * struct batadv_nc_node - network coding node 849 * @list: next and prev pointer for the list handling 850 * @addr: the node's mac address 851 * @refcount: number of contexts the object is used by 852 * @rcu: struct used for freeing in an RCU-safe manner 853 * @orig_node: pointer to corresponding orig node struct 854 * @last_seen: timestamp of last ogm received from this node 855 */ 856struct batadv_nc_node { 857 struct list_head list; 858 uint8_t addr[ETH_ALEN]; 859 atomic_t refcount; 860 struct rcu_head rcu; 861 struct batadv_orig_node *orig_node; 862 unsigned long last_seen; 863}; 864 865/** 866 * struct batadv_nc_path - network coding path 867 * @hash_entry: next and prev pointer for the list handling 868 * @rcu: struct used for freeing in an RCU-safe manner 869 * @refcount: number of contexts the object is used by 870 * @packet_list: list of buffered packets for this path 871 * @packet_list_lock: access lock for packet list 872 * @next_hop: next hop (destination) of path 873 * @prev_hop: previous hop (source) of path 874 * @last_valid: timestamp for last validation of path 875 */ 876struct batadv_nc_path { 877 struct hlist_node hash_entry; 878 struct rcu_head rcu; 879 atomic_t refcount; 880 struct list_head packet_list; 881 spinlock_t packet_list_lock; /* Protects packet_list */ 882 uint8_t next_hop[ETH_ALEN]; 883 uint8_t prev_hop[ETH_ALEN]; 884 unsigned long last_valid; 885}; 886 887/** 888 * struct batadv_nc_packet - network coding packet used when coding and 889 * decoding packets 890 * @list: next and prev pointer for the list handling 891 * @packet_id: crc32 checksum of skb data 892 * @timestamp: field containing the info when the packet was added to path 893 * @neigh_node: pointer to original next hop neighbor of skb 894 * @skb: skb which can be encoded or used for decoding 895 * @nc_path: pointer to path this nc packet is attached to 896 */ 897struct batadv_nc_packet { 898 struct list_head list; 899 __be32 packet_id; 900 unsigned long timestamp; 901 struct batadv_neigh_node *neigh_node; 902 struct sk_buff *skb; 903 struct batadv_nc_path *nc_path; 904}; 905 906/** 907 * batadv_skb_cb - control buffer structure used to store private data relevant 908 * to batman-adv in the skb->cb buffer in skbs. 909 * @decoded: Marks a skb as decoded, which is checked when searching for coding 910 * opportunities in network-coding.c 911 */ 912struct batadv_skb_cb { 913 bool decoded; 914}; 915 916/** 917 * struct batadv_forw_packet - structure for bcast packets to be sent/forwarded 918 * @list: list node for batadv_socket_client::queue_list 919 * @send_time: execution time for delayed_work (packet sending) 920 * @own: bool for locally generated packets (local OGMs are re-scheduled after 921 * sending) 922 * @skb: bcast packet's skb buffer 923 * @packet_len: size of aggregated OGM packet inside the skb buffer 924 * @direct_link_flags: direct link flags for aggregated OGM packets 925 * @num_packets: counter for bcast packet retransmission 926 * @delayed_work: work queue callback item for packet sending 927 * @if_incoming: pointer incoming hard-iface or primary iface if locally 928 * generated packet 929 */ 930struct batadv_forw_packet { 931 struct hlist_node list; 932 unsigned long send_time; 933 uint8_t own; 934 struct sk_buff *skb; 935 uint16_t packet_len; 936 uint32_t direct_link_flags; 937 uint8_t num_packets; 938 struct delayed_work delayed_work; 939 struct batadv_hard_iface *if_incoming; 940}; 941 942/** 943 * struct batadv_algo_ops - mesh algorithm callbacks 944 * @list: list node for the batadv_algo_list 945 * @name: name of the algorithm 946 * @bat_iface_enable: init routing info when hard-interface is enabled 947 * @bat_iface_disable: de-init routing info when hard-interface is disabled 948 * @bat_iface_update_mac: (re-)init mac addresses of the protocol information 949 * belonging to this hard-interface 950 * @bat_primary_iface_set: called when primary interface is selected / changed 951 * @bat_ogm_schedule: prepare a new outgoing OGM for the send queue 952 * @bat_ogm_emit: send scheduled OGM 953 */ 954struct batadv_algo_ops { 955 struct hlist_node list; 956 char *name; 957 int (*bat_iface_enable)(struct batadv_hard_iface *hard_iface); 958 void (*bat_iface_disable)(struct batadv_hard_iface *hard_iface); 959 void (*bat_iface_update_mac)(struct batadv_hard_iface *hard_iface); 960 void (*bat_primary_iface_set)(struct batadv_hard_iface *hard_iface); 961 void (*bat_ogm_schedule)(struct batadv_hard_iface *hard_iface); 962 void (*bat_ogm_emit)(struct batadv_forw_packet *forw_packet); 963}; 964 965/** 966 * struct batadv_dat_entry - it is a single entry of batman-adv ARP backend. It 967 * is used to stored ARP entries needed for the global DAT cache 968 * @ip: the IPv4 corresponding to this DAT/ARP entry 969 * @mac_addr: the MAC address associated to the stored IPv4 970 * @vid: the vlan ID associated to this entry 971 * @last_update: time in jiffies when this entry was refreshed last time 972 * @hash_entry: hlist node for batadv_priv_dat::hash 973 * @refcount: number of contexts the object is used 974 * @rcu: struct used for freeing in an RCU-safe manner 975 */ 976struct batadv_dat_entry { 977 __be32 ip; 978 uint8_t mac_addr[ETH_ALEN]; 979 unsigned short vid; 980 unsigned long last_update; 981 struct hlist_node hash_entry; 982 atomic_t refcount; 983 struct rcu_head rcu; 984}; 985 986/** 987 * struct batadv_dat_candidate - candidate destination for DAT operations 988 * @type: the type of the selected candidate. It can one of the following: 989 * - BATADV_DAT_CANDIDATE_NOT_FOUND 990 * - BATADV_DAT_CANDIDATE_ORIG 991 * @orig_node: if type is BATADV_DAT_CANDIDATE_ORIG this field points to the 992 * corresponding originator node structure 993 */ 994struct batadv_dat_candidate { 995 int type; 996 struct batadv_orig_node *orig_node; 997}; 998 999/** 1000 * struct batadv_tvlv_container - container for tvlv appended to OGMs 1001 * @list: hlist node for batadv_priv_tvlv::container_list 1002 * @tvlv_hdr: tvlv header information needed to construct the tvlv 1003 * @value_len: length of the buffer following this struct which contains 1004 * the actual tvlv payload 1005 * @refcount: number of contexts the object is used 1006 */ 1007struct batadv_tvlv_container { 1008 struct hlist_node list; 1009 struct batadv_tvlv_hdr tvlv_hdr; 1010 atomic_t refcount; 1011}; 1012 1013/** 1014 * struct batadv_tvlv_handler - handler for specific tvlv type and version 1015 * @list: hlist node for batadv_priv_tvlv::handler_list 1016 * @ogm_handler: handler callback which is given the tvlv payload to process on 1017 * incoming OGM packets 1018 * @unicast_handler: handler callback which is given the tvlv payload to process 1019 * on incoming unicast tvlv packets 1020 * @type: tvlv type this handler feels responsible for 1021 * @version: tvlv version this handler feels responsible for 1022 * @flags: tvlv handler flags 1023 * @refcount: number of contexts the object is used 1024 * @rcu: struct used for freeing in an RCU-safe manner 1025 */ 1026struct batadv_tvlv_handler { 1027 struct hlist_node list; 1028 void (*ogm_handler)(struct batadv_priv *bat_priv, 1029 struct batadv_orig_node *orig, 1030 uint8_t flags, 1031 void *tvlv_value, uint16_t tvlv_value_len); 1032 int (*unicast_handler)(struct batadv_priv *bat_priv, 1033 uint8_t *src, uint8_t *dst, 1034 void *tvlv_value, uint16_t tvlv_value_len); 1035 uint8_t type; 1036 uint8_t version; 1037 uint8_t flags; 1038 atomic_t refcount; 1039 struct rcu_head rcu; 1040}; 1041 1042/** 1043 * enum batadv_tvlv_handler_flags - tvlv handler flags definitions 1044 * @BATADV_TVLV_HANDLER_OGM_CIFNOTFND: tvlv ogm processing function will call 1045 * this handler even if its type was not found (with no data) 1046 * @BATADV_TVLV_HANDLER_OGM_CALLED: interval tvlv handling flag - the API marks 1047 * a handler as being called, so it won't be called if the 1048 * BATADV_TVLV_HANDLER_OGM_CIFNOTFND flag was set 1049 */ 1050enum batadv_tvlv_handler_flags { 1051 BATADV_TVLV_HANDLER_OGM_CIFNOTFND = BIT(1), 1052 BATADV_TVLV_HANDLER_OGM_CALLED = BIT(2), 1053}; 1054 1055#endif /* _NET_BATMAN_ADV_TYPES_H_ */ 1056