diff options
Diffstat (limited to 'net/batman-adv/types.h')
| -rw-r--r-- | net/batman-adv/types.h | 74 | 
1 files changed, 64 insertions, 10 deletions
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h index fab70e8b16e..25bd1db3537 100644 --- a/net/batman-adv/types.h +++ b/net/batman-adv/types.h @@ -75,8 +75,18 @@ struct orig_node {  	unsigned long batman_seqno_reset;  	uint8_t gw_flags;  	uint8_t flags; +	atomic_t last_ttvn; /* last seen translation table version number */ +	uint16_t tt_crc;  	unsigned char *tt_buff;  	int16_t tt_buff_len; +	spinlock_t tt_buff_lock; /* protects tt_buff */ +	atomic_t tt_size; +	/* The tt_poss_change flag is used to detect an ongoing roaming phase. +	 * If true, then I sent a Roaming_adv to this orig_node and I have to +	 * inspect every packet directed to it to check whether it is still +	 * the true destination or not. This flag will be reset to false as +	 * soon as I receive a new TTVN from this orig_node */ +	bool tt_poss_change;  	uint32_t last_real_seqno;  	uint8_t last_ttl;  	unsigned long bcast_bits[NUM_WORDS]; @@ -94,6 +104,7 @@ struct orig_node {  	spinlock_t ogm_cnt_lock;  	/* bcast_seqno_lock protects bcast_bits, last_bcast_seqno */  	spinlock_t bcast_seqno_lock; +	spinlock_t tt_list_lock; /* protects tt_list */  	atomic_t bond_candidates;  	struct list_head bond_list;  }; @@ -145,6 +156,15 @@ struct bat_priv {  	atomic_t bcast_seqno;  	atomic_t bcast_queue_left;  	atomic_t batman_queue_left; +	atomic_t ttvn; /* tranlation table version number */ +	atomic_t tt_ogm_append_cnt; +	atomic_t tt_local_changes; /* changes registered in a OGM interval */ +	/* The tt_poss_change flag is used to detect an ongoing roaming phase. +	 * If true, then I received a Roaming_adv and I have to inspect every +	 * packet directed to me to check whether I am still the true +	 * destination or not. This flag will be reset to false as soon as I +	 * increase my TTVN */ +	bool tt_poss_change;  	char num_ifaces;  	struct debug_log *debug_log;  	struct kobject *mesh_obj; @@ -153,26 +173,35 @@ struct bat_priv {  	struct hlist_head forw_bcast_list;  	struct hlist_head gw_list;  	struct hlist_head softif_neigh_vids; +	struct list_head tt_changes_list; /* tracks changes in a OGM int */  	struct list_head vis_send_list;  	struct hashtable_t *orig_hash;  	struct hashtable_t *tt_local_hash;  	struct hashtable_t *tt_global_hash; +	struct list_head tt_req_list; /* list of pending tt_requests */ +	struct list_head tt_roam_list;  	struct hashtable_t *vis_hash;  	spinlock_t forw_bat_list_lock; /* protects forw_bat_list */  	spinlock_t forw_bcast_list_lock; /* protects  */ -	spinlock_t tt_lhash_lock; /* protects tt_local_hash */ -	spinlock_t tt_ghash_lock; /* protects tt_global_hash */ +	spinlock_t tt_changes_list_lock; /* protects tt_changes */ +	spinlock_t tt_req_list_lock; /* protects tt_req_list */ +	spinlock_t tt_roam_list_lock; /* protects tt_roam_list */  	spinlock_t gw_list_lock; /* protects gw_list and curr_gw */  	spinlock_t vis_hash_lock; /* protects vis_hash */  	spinlock_t vis_list_lock; /* protects vis_info::recv_list */  	spinlock_t softif_neigh_lock; /* protects soft-interface neigh list */  	spinlock_t softif_neigh_vid_lock; /* protects soft-interface vid list */ -	int16_t num_local_tt; -	atomic_t tt_local_changed; +	atomic_t num_local_tt; +	/* Checksum of the local table, recomputed before sending a new OGM */ +	atomic_t tt_crc; +	unsigned char *tt_buff; +	int16_t tt_buff_len; +	spinlock_t tt_buff_lock; /* protects tt_buff */  	struct delayed_work tt_work;  	struct delayed_work orig_work;  	struct delayed_work vis_work;  	struct gw_node __rcu *curr_gw;  /* rcu protected pointer */ +	atomic_t gw_reselect;  	struct hard_iface __rcu *primary_if;  /* rcu protected pointer */  	struct vis_info *my_vis_info;  }; @@ -195,14 +224,39 @@ struct socket_packet {  struct tt_local_entry {  	uint8_t addr[ETH_ALEN];  	unsigned long last_seen; -	char never_purge; +	uint16_t flags; +	atomic_t refcount; +	struct rcu_head rcu;  	struct hlist_node hash_entry;  };  struct tt_global_entry {  	uint8_t addr[ETH_ALEN];  	struct orig_node *orig_node; -	struct hlist_node hash_entry; +	uint8_t ttvn; +	uint16_t flags; /* only TT_GLOBAL_ROAM is used */ +	unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */ +	atomic_t refcount; +	struct rcu_head rcu; +	struct hlist_node hash_entry; /* entry in the global table */ +}; + +struct tt_change_node { +	struct list_head list; +	struct tt_change change; +}; + +struct tt_req_node { +	uint8_t addr[ETH_ALEN]; +	unsigned long issued_at; +	struct list_head list; +}; + +struct tt_roam_node { +	uint8_t addr[ETH_ALEN]; +	atomic_t counter; +	unsigned long first_time; +	struct list_head list;  };  /** @@ -246,10 +300,10 @@ struct frag_packet_list_entry {  };  struct vis_info { -	unsigned long       first_seen; -	struct list_head    recv_list; -			    /* list of server-neighbors we received a vis-packet -			     * from.  we should not reply to them. */ +	unsigned long first_seen; +	/* list of server-neighbors we received a vis-packet +	 * from.  we should not reply to them. */ +	struct list_head recv_list;  	struct list_head send_list;  	struct kref refcount;  	struct hlist_node hash_entry;  |