1 /* Copyright (C) 2007-2012 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 #define BATADV_HEADER_LEN \ 28 (ETH_HLEN + max(sizeof(struct batadv_unicast_packet), \ 29 sizeof(struct batadv_bcast_packet))) 30 31 #ifdef CONFIG_BATMAN_ADV_DAT 32 33 /* batadv_dat_addr_t is the type used for all DHT addresses. If it is changed, 34 * BATADV_DAT_ADDR_MAX is changed as well. 35 * 36 * *Please be careful: batadv_dat_addr_t must be UNSIGNED* 37 */ 38 #define batadv_dat_addr_t uint16_t 39 40 #endif /* CONFIG_BATMAN_ADV_DAT */ 41 42 /** 43 * struct batadv_hard_iface_bat_iv - per hard interface B.A.T.M.A.N. IV data 44 * @ogm_buff: buffer holding the OGM packet 45 * @ogm_buff_len: length of the OGM packet buffer 46 * @ogm_seqno: OGM sequence number - used to identify each OGM 47 */ 48 struct batadv_hard_iface_bat_iv { 49 unsigned char *ogm_buff; 50 int ogm_buff_len; 51 atomic_t ogm_seqno; 52 }; 53 54 struct batadv_hard_iface { 55 struct list_head list; 56 int16_t if_num; 57 char if_status; 58 struct net_device *net_dev; 59 atomic_t frag_seqno; 60 struct kobject *hardif_obj; 61 atomic_t refcount; 62 struct packet_type batman_adv_ptype; 63 struct net_device *soft_iface; 64 struct rcu_head rcu; 65 struct batadv_hard_iface_bat_iv bat_iv; 66 }; 67 68 /** 69 * struct batadv_orig_node - structure for orig_list maintaining nodes of mesh 70 * @primary_addr: hosts primary interface address 71 * @last_seen: when last packet from this node was received 72 * @bcast_seqno_reset: time when the broadcast seqno window was reset 73 * @batman_seqno_reset: time when the batman seqno window was reset 74 * @gw_flags: flags related to gateway class 75 * @flags: for now only VIS_SERVER flag 76 * @last_real_seqno: last and best known sequence number 77 * @last_ttl: ttl of last received packet 78 * @last_bcast_seqno: last broadcast sequence number received by this host 79 * 80 * @candidates: how many candidates are available 81 * @selected: next bonding candidate 82 */ 83 struct batadv_orig_node { 84 uint8_t orig[ETH_ALEN]; 85 uint8_t primary_addr[ETH_ALEN]; 86 struct batadv_neigh_node __rcu *router; /* rcu protected pointer */ 87 #ifdef CONFIG_BATMAN_ADV_DAT 88 batadv_dat_addr_t dat_addr; 89 #endif 90 unsigned long *bcast_own; 91 uint8_t *bcast_own_sum; 92 unsigned long last_seen; 93 unsigned long bcast_seqno_reset; 94 unsigned long batman_seqno_reset; 95 uint8_t gw_flags; 96 uint8_t flags; 97 atomic_t last_ttvn; /* last seen translation table version number */ 98 uint16_t tt_crc; 99 unsigned char *tt_buff; 100 int16_t tt_buff_len; 101 spinlock_t tt_buff_lock; /* protects tt_buff */ 102 atomic_t tt_size; 103 bool tt_initialised; 104 uint32_t last_real_seqno; 105 uint8_t last_ttl; 106 DECLARE_BITMAP(bcast_bits, BATADV_TQ_LOCAL_WINDOW_SIZE); 107 uint32_t last_bcast_seqno; 108 struct hlist_head neigh_list; 109 struct list_head frag_list; 110 spinlock_t neigh_list_lock; /* protects neigh_list and router */ 111 atomic_t refcount; 112 struct rcu_head rcu; 113 struct hlist_node hash_entry; 114 struct batadv_priv *bat_priv; 115 unsigned long last_frag_packet; 116 /* ogm_cnt_lock protects: bcast_own, bcast_own_sum, 117 * neigh_node->real_bits, neigh_node->real_packet_count 118 */ 119 spinlock_t ogm_cnt_lock; 120 /* bcast_seqno_lock protects bcast_bits, last_bcast_seqno */ 121 spinlock_t bcast_seqno_lock; 122 spinlock_t tt_list_lock; /* protects tt_list */ 123 atomic_t bond_candidates; 124 struct list_head bond_list; 125 }; 126 127 struct batadv_gw_node { 128 struct hlist_node list; 129 struct batadv_orig_node *orig_node; 130 unsigned long deleted; 131 atomic_t refcount; 132 struct rcu_head rcu; 133 }; 134 135 /* batadv_neigh_node 136 * @last_seen: when last packet via this neighbor was received 137 */ 138 struct batadv_neigh_node { 139 struct hlist_node list; 140 uint8_t addr[ETH_ALEN]; 141 uint8_t real_packet_count; 142 uint8_t tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE]; 143 uint8_t tq_index; 144 uint8_t tq_avg; 145 uint8_t last_ttl; 146 struct list_head bonding_list; 147 unsigned long last_seen; 148 DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE); 149 atomic_t refcount; 150 struct rcu_head rcu; 151 struct batadv_orig_node *orig_node; 152 struct batadv_hard_iface *if_incoming; 153 spinlock_t lq_update_lock; /* protects: tq_recv, tq_index */ 154 }; 155 156 #ifdef CONFIG_BATMAN_ADV_BLA 157 struct batadv_bcast_duplist_entry { 158 uint8_t orig[ETH_ALEN]; 159 __be32 crc; 160 unsigned long entrytime; 161 }; 162 #endif 163 164 enum batadv_counters { 165 BATADV_CNT_TX, 166 BATADV_CNT_TX_BYTES, 167 BATADV_CNT_TX_DROPPED, 168 BATADV_CNT_RX, 169 BATADV_CNT_RX_BYTES, 170 BATADV_CNT_FORWARD, 171 BATADV_CNT_FORWARD_BYTES, 172 BATADV_CNT_MGMT_TX, 173 BATADV_CNT_MGMT_TX_BYTES, 174 BATADV_CNT_MGMT_RX, 175 BATADV_CNT_MGMT_RX_BYTES, 176 BATADV_CNT_TT_REQUEST_TX, 177 BATADV_CNT_TT_REQUEST_RX, 178 BATADV_CNT_TT_RESPONSE_TX, 179 BATADV_CNT_TT_RESPONSE_RX, 180 BATADV_CNT_TT_ROAM_ADV_TX, 181 BATADV_CNT_TT_ROAM_ADV_RX, 182 #ifdef CONFIG_BATMAN_ADV_DAT 183 BATADV_CNT_DAT_GET_TX, 184 BATADV_CNT_DAT_GET_RX, 185 BATADV_CNT_DAT_PUT_TX, 186 BATADV_CNT_DAT_PUT_RX, 187 BATADV_CNT_DAT_CACHED_REPLY_TX, 188 #endif 189 BATADV_CNT_NUM, 190 }; 191 192 /** 193 * struct batadv_priv_tt - per mesh interface translation table data 194 * @vn: translation table version number 195 * @local_changes: changes registered in an originator interval 196 * @poss_change: Detect an ongoing roaming phase. If true, then this node 197 * received a roaming_adv and has to inspect every packet directed to it to 198 * check whether it still is the true destination or not. This flag will be 199 * reset to false as soon as the this node's ttvn is increased 200 * @changes_list: tracks tt local changes within an originator interval 201 * @req_list: list of pending tt_requests 202 * @local_crc: Checksum of the local table, recomputed before sending a new OGM 203 */ 204 struct batadv_priv_tt { 205 atomic_t vn; 206 atomic_t ogm_append_cnt; 207 atomic_t local_changes; 208 struct list_head changes_list; 209 struct batadv_hashtable *local_hash; 210 struct batadv_hashtable *global_hash; 211 struct list_head req_list; 212 struct list_head roam_list; 213 spinlock_t changes_list_lock; /* protects changes */ 214 spinlock_t req_list_lock; /* protects req_list */ 215 spinlock_t roam_list_lock; /* protects roam_list */ 216 atomic_t local_entry_num; 217 uint16_t local_crc; 218 unsigned char *last_changeset; 219 int16_t last_changeset_len; 220 spinlock_t last_changeset_lock; /* protects last_changeset */ 221 struct delayed_work work; 222 }; 223 224 #ifdef CONFIG_BATMAN_ADV_BLA 225 struct batadv_priv_bla { 226 atomic_t num_requests; /* number of bla requests in flight */ 227 struct batadv_hashtable *claim_hash; 228 struct batadv_hashtable *backbone_hash; 229 struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE]; 230 int bcast_duplist_curr; 231 /* protects bcast_duplist and bcast_duplist_curr */ 232 spinlock_t bcast_duplist_lock; 233 struct batadv_bla_claim_dst claim_dest; 234 struct delayed_work work; 235 }; 236 #endif 237 238 struct batadv_priv_gw { 239 struct hlist_head list; 240 spinlock_t list_lock; /* protects gw_list and curr_gw */ 241 struct batadv_gw_node __rcu *curr_gw; /* rcu protected pointer */ 242 atomic_t reselect; 243 }; 244 245 struct batadv_priv_vis { 246 struct list_head send_list; 247 struct batadv_hashtable *hash; 248 spinlock_t hash_lock; /* protects hash */ 249 spinlock_t list_lock; /* protects info::recv_list */ 250 struct delayed_work work; 251 struct batadv_vis_info *my_info; 252 }; 253 254 /** 255 * struct batadv_priv_dat - per mesh interface DAT private data 256 * @addr: node DAT address 257 * @hash: hashtable representing the local ARP cache 258 * @work: work queue callback item for cache purging 259 */ 260 #ifdef CONFIG_BATMAN_ADV_DAT 261 struct batadv_priv_dat { 262 batadv_dat_addr_t addr; 263 struct batadv_hashtable *hash; 264 struct delayed_work work; 265 }; 266 #endif 267 268 struct batadv_priv { 269 atomic_t mesh_state; 270 struct net_device_stats stats; 271 uint64_t __percpu *bat_counters; /* Per cpu counters */ 272 atomic_t aggregated_ogms; /* boolean */ 273 atomic_t bonding; /* boolean */ 274 atomic_t fragmentation; /* boolean */ 275 atomic_t ap_isolation; /* boolean */ 276 atomic_t bridge_loop_avoidance; /* boolean */ 277 #ifdef CONFIG_BATMAN_ADV_DAT 278 atomic_t distributed_arp_table; /* boolean */ 279 #endif 280 atomic_t vis_mode; /* VIS_TYPE_* */ 281 atomic_t gw_mode; /* GW_MODE_* */ 282 atomic_t gw_sel_class; /* uint */ 283 atomic_t gw_bandwidth; /* gw bandwidth */ 284 atomic_t orig_interval; /* uint */ 285 atomic_t hop_penalty; /* uint */ 286 atomic_t log_level; /* uint */ 287 atomic_t bcast_seqno; 288 atomic_t bcast_queue_left; 289 atomic_t batman_queue_left; 290 char num_ifaces; 291 struct batadv_debug_log *debug_log; 292 struct kobject *mesh_obj; 293 struct dentry *debug_dir; 294 struct hlist_head forw_bat_list; 295 struct hlist_head forw_bcast_list; 296 struct batadv_hashtable *orig_hash; 297 spinlock_t forw_bat_list_lock; /* protects forw_bat_list */ 298 spinlock_t forw_bcast_list_lock; /* protects forw_bcast_list */ 299 struct delayed_work orig_work; 300 struct batadv_hard_iface __rcu *primary_if; /* rcu protected pointer */ 301 struct batadv_algo_ops *bat_algo_ops; 302 #ifdef CONFIG_BATMAN_ADV_BLA 303 struct batadv_priv_bla bla; 304 #endif 305 struct batadv_priv_gw gw; 306 struct batadv_priv_tt tt; 307 struct batadv_priv_vis vis; 308 #ifdef CONFIG_BATMAN_ADV_DAT 309 struct batadv_priv_dat dat; 310 #endif 311 }; 312 313 struct batadv_socket_client { 314 struct list_head queue_list; 315 unsigned int queue_len; 316 unsigned char index; 317 spinlock_t lock; /* protects queue_list, queue_len, index */ 318 wait_queue_head_t queue_wait; 319 struct batadv_priv *bat_priv; 320 }; 321 322 struct batadv_socket_packet { 323 struct list_head list; 324 size_t icmp_len; 325 struct batadv_icmp_packet_rr icmp_packet; 326 }; 327 328 struct batadv_tt_common_entry { 329 uint8_t addr[ETH_ALEN]; 330 struct hlist_node hash_entry; 331 uint16_t flags; 332 unsigned long added_at; 333 atomic_t refcount; 334 struct rcu_head rcu; 335 }; 336 337 struct batadv_tt_local_entry { 338 struct batadv_tt_common_entry common; 339 unsigned long last_seen; 340 }; 341 342 struct batadv_tt_global_entry { 343 struct batadv_tt_common_entry common; 344 struct hlist_head orig_list; 345 spinlock_t list_lock; /* protects the list */ 346 unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */ 347 }; 348 349 struct batadv_tt_orig_list_entry { 350 struct batadv_orig_node *orig_node; 351 uint8_t ttvn; 352 atomic_t refcount; 353 struct rcu_head rcu; 354 struct hlist_node list; 355 }; 356 357 #ifdef CONFIG_BATMAN_ADV_BLA 358 struct batadv_backbone_gw { 359 uint8_t orig[ETH_ALEN]; 360 short vid; /* used VLAN ID */ 361 struct hlist_node hash_entry; 362 struct batadv_priv *bat_priv; 363 unsigned long lasttime; /* last time we heard of this backbone gw */ 364 atomic_t wait_periods; 365 atomic_t request_sent; 366 atomic_t refcount; 367 struct rcu_head rcu; 368 uint16_t crc; /* crc checksum over all claims */ 369 }; 370 371 struct batadv_claim { 372 uint8_t addr[ETH_ALEN]; 373 short vid; 374 struct batadv_backbone_gw *backbone_gw; 375 unsigned long lasttime; /* last time we heard of claim (locals only) */ 376 struct rcu_head rcu; 377 atomic_t refcount; 378 struct hlist_node hash_entry; 379 }; 380 #endif 381 382 struct batadv_tt_change_node { 383 struct list_head list; 384 struct batadv_tt_change change; 385 }; 386 387 struct batadv_tt_req_node { 388 uint8_t addr[ETH_ALEN]; 389 unsigned long issued_at; 390 struct list_head list; 391 }; 392 393 struct batadv_tt_roam_node { 394 uint8_t addr[ETH_ALEN]; 395 atomic_t counter; 396 unsigned long first_time; 397 struct list_head list; 398 }; 399 400 /* forw_packet - structure for forw_list maintaining packets to be 401 * send/forwarded 402 */ 403 struct batadv_forw_packet { 404 struct hlist_node list; 405 unsigned long send_time; 406 uint8_t own; 407 struct sk_buff *skb; 408 uint16_t packet_len; 409 uint32_t direct_link_flags; 410 uint8_t num_packets; 411 struct delayed_work delayed_work; 412 struct batadv_hard_iface *if_incoming; 413 }; 414 415 /* While scanning for vis-entries of a particular vis-originator 416 * this list collects its interfaces to create a subgraph/cluster 417 * out of them later 418 */ 419 struct batadv_if_list_entry { 420 uint8_t addr[ETH_ALEN]; 421 bool primary; 422 struct hlist_node list; 423 }; 424 425 struct batadv_debug_log { 426 char log_buff[BATADV_LOG_BUF_LEN]; 427 unsigned long log_start; 428 unsigned long log_end; 429 spinlock_t lock; /* protects log_buff, log_start and log_end */ 430 wait_queue_head_t queue_wait; 431 }; 432 433 struct batadv_frag_packet_list_entry { 434 struct list_head list; 435 uint16_t seqno; 436 struct sk_buff *skb; 437 }; 438 439 struct batadv_vis_info { 440 unsigned long first_seen; 441 /* list of server-neighbors we received a vis-packet 442 * from. we should not reply to them. 443 */ 444 struct list_head recv_list; 445 struct list_head send_list; 446 struct kref refcount; 447 struct hlist_node hash_entry; 448 struct batadv_priv *bat_priv; 449 /* this packet might be part of the vis send queue. */ 450 struct sk_buff *skb_packet; 451 /* vis_info may follow here */ 452 } __packed; 453 454 struct batadv_vis_info_entry { 455 uint8_t src[ETH_ALEN]; 456 uint8_t dest[ETH_ALEN]; 457 uint8_t quality; /* quality = 0 client */ 458 } __packed; 459 460 struct batadv_recvlist_node { 461 struct list_head list; 462 uint8_t mac[ETH_ALEN]; 463 }; 464 465 struct batadv_algo_ops { 466 struct hlist_node list; 467 char *name; 468 /* init routing info when hard-interface is enabled */ 469 int (*bat_iface_enable)(struct batadv_hard_iface *hard_iface); 470 /* de-init routing info when hard-interface is disabled */ 471 void (*bat_iface_disable)(struct batadv_hard_iface *hard_iface); 472 /* (re-)init mac addresses of the protocol information 473 * belonging to this hard-interface 474 */ 475 void (*bat_iface_update_mac)(struct batadv_hard_iface *hard_iface); 476 /* called when primary interface is selected / changed */ 477 void (*bat_primary_iface_set)(struct batadv_hard_iface *hard_iface); 478 /* prepare a new outgoing OGM for the send queue */ 479 void (*bat_ogm_schedule)(struct batadv_hard_iface *hard_iface); 480 /* send scheduled OGM */ 481 void (*bat_ogm_emit)(struct batadv_forw_packet *forw_packet); 482 }; 483 484 /** 485 * struct batadv_dat_entry - it is a single entry of batman-adv ARP backend. It 486 * is used to stored ARP entries needed for the global DAT cache 487 * @ip: the IPv4 corresponding to this DAT/ARP entry 488 * @mac_addr: the MAC address associated to the stored IPv4 489 * @last_update: time in jiffies when this entry was refreshed last time 490 * @hash_entry: hlist node for batadv_priv_dat::hash 491 * @refcount: number of contexts the object is used 492 * @rcu: struct used for freeing in an RCU-safe manner 493 */ 494 struct batadv_dat_entry { 495 __be32 ip; 496 uint8_t mac_addr[ETH_ALEN]; 497 unsigned long last_update; 498 struct hlist_node hash_entry; 499 atomic_t refcount; 500 struct rcu_head rcu; 501 }; 502 503 /** 504 * struct batadv_dat_candidate - candidate destination for DAT operations 505 * @type: the type of the selected candidate. It can one of the following: 506 * - BATADV_DAT_CANDIDATE_NOT_FOUND 507 * - BATADV_DAT_CANDIDATE_ORIG 508 * @orig_node: if type is BATADV_DAT_CANDIDATE_ORIG this field points to the 509 * corresponding originator node structure 510 */ 511 struct batadv_dat_candidate { 512 int type; 513 struct batadv_orig_node *orig_node; 514 }; 515 516 #endif /* _NET_BATMAN_ADV_TYPES_H_ */ 517