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