diff options
| -rw-r--r-- | net/batman-adv/translation-table.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index 23f9c212ab1e..3986551397ca 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c | |||
| @@ -931,15 +931,20 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv, | |||
| 931 | struct batadv_tvlv_tt_vlan_data *tt_vlan; | 931 | struct batadv_tvlv_tt_vlan_data *tt_vlan; |
| 932 | struct batadv_softif_vlan *vlan; | 932 | struct batadv_softif_vlan *vlan; |
| 933 | u16 num_vlan = 0; | 933 | u16 num_vlan = 0; |
| 934 | u16 num_entries = 0; | 934 | u16 vlan_entries = 0; |
| 935 | u16 total_entries = 0; | ||
| 935 | u16 tvlv_len; | 936 | u16 tvlv_len; |
| 936 | u8 *tt_change_ptr; | 937 | u8 *tt_change_ptr; |
| 937 | int change_offset; | 938 | int change_offset; |
| 938 | 939 | ||
| 939 | spin_lock_bh(&bat_priv->softif_vlan_list_lock); | 940 | spin_lock_bh(&bat_priv->softif_vlan_list_lock); |
| 940 | hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) { | 941 | hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) { |
| 942 | vlan_entries = atomic_read(&vlan->tt.num_entries); | ||
| 943 | if (vlan_entries < 1) | ||
| 944 | continue; | ||
| 945 | |||
| 941 | num_vlan++; | 946 | num_vlan++; |
| 942 | num_entries += atomic_read(&vlan->tt.num_entries); | 947 | total_entries += vlan_entries; |
| 943 | } | 948 | } |
| 944 | 949 | ||
| 945 | change_offset = sizeof(**tt_data); | 950 | change_offset = sizeof(**tt_data); |
| @@ -947,7 +952,7 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv, | |||
| 947 | 952 | ||
| 948 | /* if tt_len is negative, allocate the space needed by the full table */ | 953 | /* if tt_len is negative, allocate the space needed by the full table */ |
| 949 | if (*tt_len < 0) | 954 | if (*tt_len < 0) |
| 950 | *tt_len = batadv_tt_len(num_entries); | 955 | *tt_len = batadv_tt_len(total_entries); |
| 951 | 956 | ||
| 952 | tvlv_len = *tt_len; | 957 | tvlv_len = *tt_len; |
| 953 | tvlv_len += change_offset; | 958 | tvlv_len += change_offset; |
| @@ -964,6 +969,10 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv, | |||
| 964 | 969 | ||
| 965 | tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(*tt_data + 1); | 970 | tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(*tt_data + 1); |
| 966 | hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) { | 971 | hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) { |
| 972 | vlan_entries = atomic_read(&vlan->tt.num_entries); | ||
| 973 | if (vlan_entries < 1) | ||
| 974 | continue; | ||
| 975 | |||
| 967 | tt_vlan->vid = htons(vlan->vid); | 976 | tt_vlan->vid = htons(vlan->vid); |
| 968 | tt_vlan->crc = htonl(vlan->tt.crc); | 977 | tt_vlan->crc = htonl(vlan->tt.crc); |
| 969 | 978 | ||
