|
|
@@ -931,15 +931,20 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
|
|
struct batadv_tvlv_tt_vlan_data *tt_vlan;
|
|
|
struct batadv_softif_vlan *vlan;
|
|
|
u16 num_vlan = 0;
|
|
|
- u16 num_entries = 0;
|
|
|
+ u16 vlan_entries = 0;
|
|
|
+ u16 total_entries = 0;
|
|
|
u16 tvlv_len;
|
|
|
u8 *tt_change_ptr;
|
|
|
int change_offset;
|
|
|
|
|
|
spin_lock_bh(&bat_priv->softif_vlan_list_lock);
|
|
|
hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
|
|
|
+ vlan_entries = atomic_read(&vlan->tt.num_entries);
|
|
|
+ if (vlan_entries < 1)
|
|
|
+ continue;
|
|
|
+
|
|
|
num_vlan++;
|
|
|
- num_entries += atomic_read(&vlan->tt.num_entries);
|
|
|
+ total_entries += vlan_entries;
|
|
|
}
|
|
|
|
|
|
change_offset = sizeof(**tt_data);
|
|
|
@@ -947,7 +952,7 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
|
|
|
|
|
/* if tt_len is negative, allocate the space needed by the full table */
|
|
|
if (*tt_len < 0)
|
|
|
- *tt_len = batadv_tt_len(num_entries);
|
|
|
+ *tt_len = batadv_tt_len(total_entries);
|
|
|
|
|
|
tvlv_len = *tt_len;
|
|
|
tvlv_len += change_offset;
|
|
|
@@ -964,6 +969,10 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
|
|
|
|
|
tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(*tt_data + 1);
|
|
|
hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
|
|
|
+ vlan_entries = atomic_read(&vlan->tt.num_entries);
|
|
|
+ if (vlan_entries < 1)
|
|
|
+ continue;
|
|
|
+
|
|
|
tt_vlan->vid = htons(vlan->vid);
|
|
|
tt_vlan->crc = htonl(vlan->tt.crc);
|
|
|
|