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_FORWARD, 149 BATADV_CNT_FORWARD_BYTES, 150 BATADV_CNT_MGMT_TX, 151 BATADV_CNT_MGMT_TX_BYTES, 152 BATADV_CNT_MGMT_RX, 153 BATADV_CNT_MGMT_RX_BYTES, 154 BATADV_CNT_TT_REQUEST_TX, 155 BATADV_CNT_TT_REQUEST_RX, 156 BATADV_CNT_TT_RESPONSE_TX, 157 BATADV_CNT_TT_RESPONSE_RX, 158 BATADV_CNT_TT_ROAM_ADV_TX, 159 BATADV_CNT_TT_ROAM_ADV_RX, 160 BATADV_CNT_NUM, 161 }; 162 163 struct batadv_priv { 164 atomic_t mesh_state; 165 struct net_device_stats stats; 166 uint64_t __percpu *bat_counters; /* Per cpu counters */ 167 atomic_t aggregated_ogms; /* boolean */ 168 atomic_t bonding; /* boolean */ 169 atomic_t fragmentation; /* boolean */ 170 atomic_t ap_isolation; /* boolean */ 171 atomic_t bridge_loop_avoidance; /* boolean */ 172 atomic_t vis_mode; /* VIS_TYPE_* */ 173 atomic_t gw_mode; /* GW_MODE_* */ 174 atomic_t gw_sel_class; /* uint */ 175 atomic_t gw_bandwidth; /* gw bandwidth */ 176 atomic_t orig_interval; /* uint */ 177 atomic_t hop_penalty; /* uint */ 178 atomic_t log_level; /* uint */ 179 atomic_t bcast_seqno; 180 atomic_t bcast_queue_left; 181 atomic_t batman_queue_left; 182 atomic_t ttvn; /* translation table version number */ 183 atomic_t tt_ogm_append_cnt; 184 atomic_t tt_local_changes; /* changes registered in a OGM interval */ 185 atomic_t bla_num_requests; /* number of bla requests in flight */ 186 /* The tt_poss_change flag is used to detect an ongoing roaming phase. 187 * If true, then I received a Roaming_adv and I have to inspect every 188 * packet directed to me to check whether I am still the true 189 * destination or not. This flag will be reset to false as soon as I 190 * increase my TTVN 191 */ 192 bool tt_poss_change; 193 char num_ifaces; 194 struct batadv_debug_log *debug_log; 195 struct kobject *mesh_obj; 196 struct dentry *debug_dir; 197 struct hlist_head forw_bat_list; 198 struct hlist_head forw_bcast_list; 199 struct hlist_head gw_list; 200 struct list_head tt_changes_list; /* tracks changes in a OGM int */ 201 struct list_head vis_send_list; 202 struct batadv_hashtable *orig_hash; 203 struct batadv_hashtable *tt_local_hash; 204 struct batadv_hashtable *tt_global_hash; 205 #ifdef CONFIG_BATMAN_ADV_BLA 206 struct batadv_hashtable *claim_hash; 207 struct batadv_hashtable *backbone_hash; 208 #endif 209 struct list_head tt_req_list; /* list of pending tt_requests */ 210 struct list_head tt_roam_list; 211 struct batadv_hashtable *vis_hash; 212 #ifdef CONFIG_BATMAN_ADV_BLA 213 struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE]; 214 int bcast_duplist_curr; 215 struct batadv_bla_claim_dst claim_dest; 216 #endif 217 spinlock_t forw_bat_list_lock; /* protects forw_bat_list */ 218 spinlock_t forw_bcast_list_lock; /* protects */ 219 spinlock_t tt_changes_list_lock; /* protects tt_changes */ 220 spinlock_t tt_req_list_lock; /* protects tt_req_list */ 221 spinlock_t tt_roam_list_lock; /* protects tt_roam_list */ 222 spinlock_t gw_list_lock; /* protects gw_list and curr_gw */ 223 spinlock_t vis_hash_lock; /* protects vis_hash */ 224 spinlock_t vis_list_lock; /* protects vis_info::recv_list */ 225 atomic_t num_local_tt; 226 /* Checksum of the local table, recomputed before sending a new OGM */ 227 uint16_t tt_crc; 228 unsigned char *tt_buff; 229 int16_t tt_buff_len; 230 spinlock_t tt_buff_lock; /* protects tt_buff */ 231 struct delayed_work tt_work; 232 struct delayed_work orig_work; 233 struct delayed_work vis_work; 234 struct delayed_work bla_work; 235 struct batadv_gw_node __rcu *curr_gw; /* rcu protected pointer */ 236 atomic_t gw_reselect; 237 struct batadv_hard_iface __rcu *primary_if; /* rcu protected pointer */ 238 struct batadv_vis_info *my_vis_info; 239 struct batadv_algo_ops *bat_algo_ops; 240 }; 241 242 struct batadv_socket_client { 243 struct list_head queue_list; 244 unsigned int queue_len; 245 unsigned char index; 246 spinlock_t lock; /* protects queue_list, queue_len, index */ 247 wait_queue_head_t queue_wait; 248 struct batadv_priv *bat_priv; 249 }; 250 251 struct batadv_socket_packet { 252 struct list_head list; 253 size_t icmp_len; 254 struct batadv_icmp_packet_rr icmp_packet; 255 }; 256 257 struct batadv_tt_common_entry { 258 uint8_t addr[ETH_ALEN]; 259 struct hlist_node hash_entry; 260 uint16_t flags; 261 atomic_t refcount; 262 struct rcu_head rcu; 263 }; 264 265 struct batadv_tt_local_entry { 266 struct batadv_tt_common_entry common; 267 unsigned long last_seen; 268 }; 269 270 struct batadv_tt_global_entry { 271 struct batadv_tt_common_entry common; 272 struct hlist_head orig_list; 273 spinlock_t list_lock; /* protects the list */ 274 unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */ 275 }; 276 277 struct batadv_tt_orig_list_entry { 278 struct batadv_orig_node *orig_node; 279 uint8_t ttvn; 280 struct rcu_head rcu; 281 struct hlist_node list; 282 }; 283 284 #ifdef CONFIG_BATMAN_ADV_BLA 285 struct batadv_backbone_gw { 286 uint8_t orig[ETH_ALEN]; 287 short vid; /* used VLAN ID */ 288 struct hlist_node hash_entry; 289 struct batadv_priv *bat_priv; 290 unsigned long lasttime; /* last time we heard of this backbone gw */ 291 atomic_t request_sent; 292 atomic_t refcount; 293 struct rcu_head rcu; 294 uint16_t crc; /* crc checksum over all claims */ 295 }; 296 297 struct batadv_claim { 298 uint8_t addr[ETH_ALEN]; 299 short vid; 300 struct batadv_backbone_gw *backbone_gw; 301 unsigned long lasttime; /* last time we heard of claim (locals only) */ 302 struct rcu_head rcu; 303 atomic_t refcount; 304 struct hlist_node hash_entry; 305 }; 306 #endif 307 308 struct batadv_tt_change_node { 309 struct list_head list; 310 struct batadv_tt_change change; 311 }; 312 313 struct batadv_tt_req_node { 314 uint8_t addr[ETH_ALEN]; 315 unsigned long issued_at; 316 struct list_head list; 317 }; 318 319 struct batadv_tt_roam_node { 320 uint8_t addr[ETH_ALEN]; 321 atomic_t counter; 322 unsigned long first_time; 323 struct list_head list; 324 }; 325 326 /* forw_packet - structure for forw_list maintaining packets to be 327 * send/forwarded 328 */ 329 struct batadv_forw_packet { 330 struct hlist_node list; 331 unsigned long send_time; 332 uint8_t own; 333 struct sk_buff *skb; 334 uint16_t packet_len; 335 uint32_t direct_link_flags; 336 uint8_t num_packets; 337 struct delayed_work delayed_work; 338 struct batadv_hard_iface *if_incoming; 339 }; 340 341 /* While scanning for vis-entries of a particular vis-originator 342 * this list collects its interfaces to create a subgraph/cluster 343 * out of them later 344 */ 345 struct batadv_if_list_entry { 346 uint8_t addr[ETH_ALEN]; 347 bool primary; 348 struct hlist_node list; 349 }; 350 351 struct batadv_debug_log { 352 char log_buff[BATADV_LOG_BUF_LEN]; 353 unsigned long log_start; 354 unsigned long log_end; 355 spinlock_t lock; /* protects log_buff, log_start and log_end */ 356 wait_queue_head_t queue_wait; 357 }; 358 359 struct batadv_frag_packet_list_entry { 360 struct list_head list; 361 uint16_t seqno; 362 struct sk_buff *skb; 363 }; 364 365 struct batadv_vis_info { 366 unsigned long first_seen; 367 /* list of server-neighbors we received a vis-packet 368 * from. we should not reply to them. 369 */ 370 struct list_head recv_list; 371 struct list_head send_list; 372 struct kref refcount; 373 struct hlist_node hash_entry; 374 struct batadv_priv *bat_priv; 375 /* this packet might be part of the vis send queue. */ 376 struct sk_buff *skb_packet; 377 /* vis_info may follow here */ 378 } __packed; 379 380 struct batadv_vis_info_entry { 381 uint8_t src[ETH_ALEN]; 382 uint8_t dest[ETH_ALEN]; 383 uint8_t quality; /* quality = 0 client */ 384 } __packed; 385 386 struct batadv_recvlist_node { 387 struct list_head list; 388 uint8_t mac[ETH_ALEN]; 389 }; 390 391 struct batadv_algo_ops { 392 struct hlist_node list; 393 char *name; 394 /* init routing info when hard-interface is enabled */ 395 int (*bat_iface_enable)(struct batadv_hard_iface *hard_iface); 396 /* de-init routing info when hard-interface is disabled */ 397 void (*bat_iface_disable)(struct batadv_hard_iface *hard_iface); 398 /* (re-)init mac addresses of the protocol information 399 * belonging to this hard-interface 400 */ 401 void (*bat_iface_update_mac)(struct batadv_hard_iface *hard_iface); 402 /* called when primary interface is selected / changed */ 403 void (*bat_primary_iface_set)(struct batadv_hard_iface *hard_iface); 404 /* prepare a new outgoing OGM for the send queue */ 405 void (*bat_ogm_schedule)(struct batadv_hard_iface *hard_iface); 406 /* send scheduled OGM */ 407 void (*bat_ogm_emit)(struct batadv_forw_packet *forw_packet); 408 }; 409 410 #endif /* _NET_BATMAN_ADV_TYPES_H_ */ 411