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 struct batadv_bla_claim_dst claim_dest; 209 struct delayed_work work; 210 }; 211 #endif 212 213 struct batadv_priv_gw { 214 struct hlist_head list; 215 spinlock_t list_lock; /* protects gw_list and curr_gw */ 216 struct batadv_gw_node __rcu *curr_gw; /* rcu protected pointer */ 217 atomic_t reselect; 218 }; 219 220 struct batadv_priv_vis { 221 struct list_head send_list; 222 struct batadv_hashtable *hash; 223 spinlock_t hash_lock; /* protects hash */ 224 spinlock_t list_lock; /* protects info::recv_list */ 225 struct delayed_work work; 226 struct batadv_vis_info *my_info; 227 }; 228 229 struct batadv_priv { 230 atomic_t mesh_state; 231 struct net_device_stats stats; 232 uint64_t __percpu *bat_counters; /* Per cpu counters */ 233 atomic_t aggregated_ogms; /* boolean */ 234 atomic_t bonding; /* boolean */ 235 atomic_t fragmentation; /* boolean */ 236 atomic_t ap_isolation; /* boolean */ 237 atomic_t bridge_loop_avoidance; /* boolean */ 238 atomic_t vis_mode; /* VIS_TYPE_* */ 239 atomic_t gw_mode; /* GW_MODE_* */ 240 atomic_t gw_sel_class; /* uint */ 241 atomic_t gw_bandwidth; /* gw bandwidth */ 242 atomic_t orig_interval; /* uint */ 243 atomic_t hop_penalty; /* uint */ 244 atomic_t log_level; /* uint */ 245 atomic_t bcast_seqno; 246 atomic_t bcast_queue_left; 247 atomic_t batman_queue_left; 248 char num_ifaces; 249 struct batadv_debug_log *debug_log; 250 struct kobject *mesh_obj; 251 struct dentry *debug_dir; 252 struct hlist_head forw_bat_list; 253 struct hlist_head forw_bcast_list; 254 struct batadv_hashtable *orig_hash; 255 spinlock_t forw_bat_list_lock; /* protects forw_bat_list */ 256 spinlock_t forw_bcast_list_lock; /* protects */ 257 struct delayed_work orig_work; 258 struct batadv_hard_iface __rcu *primary_if; /* rcu protected pointer */ 259 struct batadv_algo_ops *bat_algo_ops; 260 #ifdef CONFIG_BATMAN_ADV_BLA 261 struct batadv_priv_bla bla; 262 #endif 263 struct batadv_priv_gw gw; 264 struct batadv_priv_tt tt; 265 struct batadv_priv_vis vis; 266 }; 267 268 struct batadv_socket_client { 269 struct list_head queue_list; 270 unsigned int queue_len; 271 unsigned char index; 272 spinlock_t lock; /* protects queue_list, queue_len, index */ 273 wait_queue_head_t queue_wait; 274 struct batadv_priv *bat_priv; 275 }; 276 277 struct batadv_socket_packet { 278 struct list_head list; 279 size_t icmp_len; 280 struct batadv_icmp_packet_rr icmp_packet; 281 }; 282 283 struct batadv_tt_common_entry { 284 uint8_t addr[ETH_ALEN]; 285 struct hlist_node hash_entry; 286 uint16_t flags; 287 unsigned long added_at; 288 atomic_t refcount; 289 struct rcu_head rcu; 290 }; 291 292 struct batadv_tt_local_entry { 293 struct batadv_tt_common_entry common; 294 unsigned long last_seen; 295 }; 296 297 struct batadv_tt_global_entry { 298 struct batadv_tt_common_entry common; 299 struct hlist_head orig_list; 300 spinlock_t list_lock; /* protects the list */ 301 unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */ 302 }; 303 304 struct batadv_tt_orig_list_entry { 305 struct batadv_orig_node *orig_node; 306 uint8_t ttvn; 307 atomic_t refcount; 308 struct rcu_head rcu; 309 struct hlist_node list; 310 }; 311 312 #ifdef CONFIG_BATMAN_ADV_BLA 313 struct batadv_backbone_gw { 314 uint8_t orig[ETH_ALEN]; 315 short vid; /* used VLAN ID */ 316 struct hlist_node hash_entry; 317 struct batadv_priv *bat_priv; 318 unsigned long lasttime; /* last time we heard of this backbone gw */ 319 atomic_t request_sent; 320 atomic_t refcount; 321 struct rcu_head rcu; 322 uint16_t crc; /* crc checksum over all claims */ 323 }; 324 325 struct batadv_claim { 326 uint8_t addr[ETH_ALEN]; 327 short vid; 328 struct batadv_backbone_gw *backbone_gw; 329 unsigned long lasttime; /* last time we heard of claim (locals only) */ 330 struct rcu_head rcu; 331 atomic_t refcount; 332 struct hlist_node hash_entry; 333 }; 334 #endif 335 336 struct batadv_tt_change_node { 337 struct list_head list; 338 struct batadv_tt_change change; 339 }; 340 341 struct batadv_tt_req_node { 342 uint8_t addr[ETH_ALEN]; 343 unsigned long issued_at; 344 struct list_head list; 345 }; 346 347 struct batadv_tt_roam_node { 348 uint8_t addr[ETH_ALEN]; 349 atomic_t counter; 350 unsigned long first_time; 351 struct list_head list; 352 }; 353 354 /* forw_packet - structure for forw_list maintaining packets to be 355 * send/forwarded 356 */ 357 struct batadv_forw_packet { 358 struct hlist_node list; 359 unsigned long send_time; 360 uint8_t own; 361 struct sk_buff *skb; 362 uint16_t packet_len; 363 uint32_t direct_link_flags; 364 uint8_t num_packets; 365 struct delayed_work delayed_work; 366 struct batadv_hard_iface *if_incoming; 367 }; 368 369 /* While scanning for vis-entries of a particular vis-originator 370 * this list collects its interfaces to create a subgraph/cluster 371 * out of them later 372 */ 373 struct batadv_if_list_entry { 374 uint8_t addr[ETH_ALEN]; 375 bool primary; 376 struct hlist_node list; 377 }; 378 379 struct batadv_debug_log { 380 char log_buff[BATADV_LOG_BUF_LEN]; 381 unsigned long log_start; 382 unsigned long log_end; 383 spinlock_t lock; /* protects log_buff, log_start and log_end */ 384 wait_queue_head_t queue_wait; 385 }; 386 387 struct batadv_frag_packet_list_entry { 388 struct list_head list; 389 uint16_t seqno; 390 struct sk_buff *skb; 391 }; 392 393 struct batadv_vis_info { 394 unsigned long first_seen; 395 /* list of server-neighbors we received a vis-packet 396 * from. we should not reply to them. 397 */ 398 struct list_head recv_list; 399 struct list_head send_list; 400 struct kref refcount; 401 struct hlist_node hash_entry; 402 struct batadv_priv *bat_priv; 403 /* this packet might be part of the vis send queue. */ 404 struct sk_buff *skb_packet; 405 /* vis_info may follow here */ 406 } __packed; 407 408 struct batadv_vis_info_entry { 409 uint8_t src[ETH_ALEN]; 410 uint8_t dest[ETH_ALEN]; 411 uint8_t quality; /* quality = 0 client */ 412 } __packed; 413 414 struct batadv_recvlist_node { 415 struct list_head list; 416 uint8_t mac[ETH_ALEN]; 417 }; 418 419 struct batadv_algo_ops { 420 struct hlist_node list; 421 char *name; 422 /* init routing info when hard-interface is enabled */ 423 int (*bat_iface_enable)(struct batadv_hard_iface *hard_iface); 424 /* de-init routing info when hard-interface is disabled */ 425 void (*bat_iface_disable)(struct batadv_hard_iface *hard_iface); 426 /* (re-)init mac addresses of the protocol information 427 * belonging to this hard-interface 428 */ 429 void (*bat_iface_update_mac)(struct batadv_hard_iface *hard_iface); 430 /* called when primary interface is selected / changed */ 431 void (*bat_primary_iface_set)(struct batadv_hard_iface *hard_iface); 432 /* prepare a new outgoing OGM for the send queue */ 433 void (*bat_ogm_schedule)(struct batadv_hard_iface *hard_iface); 434 /* send scheduled OGM */ 435 void (*bat_ogm_emit)(struct batadv_forw_packet *forw_packet); 436 }; 437 438 #endif /* _NET_BATMAN_ADV_TYPES_H_ */ 439