aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv
diff options
context:
space:
mode:
authorAntonio Quartulli <antonio@open-mesh.com>2013-08-07 12:28:56 -0400
committerAntonio Quartulli <antonio@meshcoding.com>2013-10-19 17:25:38 -0400
commitcfd4f75701b6b13b1ec74e6f65ad0d1969c19247 (patch)
tree63098d1077d69fd908a5f2916d72ba5f939e3389 /net/batman-adv
parent95fb130d68656174a417ad19e7bc8e8ecf382dab (diff)
batman-adv: make the backbone gw check VLAN specific
The backbone gw check has to be VLAN specific so that code using it can specify VID where the check has to be done. In the TT code, the check has been moved into the tt_global_add() function so that it can be performed on a per-entry basis instead of ignoring all the TT data received from another backbone node. Only TT global entries belonging to the VLAN where the backbone node is connected to are skipped. All the other spots where the TT code was checking whether a node is a backbone have been removed. Moreover, batadv_bla_is_backbone_gw_orig() now returns bool since it used to return only 1 or 0. Cc: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> Signed-off-by: Antonio Quartulli <antonio@open-mesh.com> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
Diffstat (limited to 'net/batman-adv')
-rw-r--r--net/batman-adv/bridge_loop_avoidance.c19
-rw-r--r--net/batman-adv/bridge_loop_avoidance.h10
-rw-r--r--net/batman-adv/translation-table.c41
3 files changed, 27 insertions, 43 deletions
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
index 3b3867db88a7..28eb5e6d0a02 100644
--- a/net/batman-adv/bridge_loop_avoidance.c
+++ b/net/batman-adv/bridge_loop_avoidance.c
@@ -1315,12 +1315,14 @@ out:
1315 1315
1316/* @bat_priv: the bat priv with all the soft interface information 1316/* @bat_priv: the bat priv with all the soft interface information
1317 * @orig: originator mac address 1317 * @orig: originator mac address
1318 * @vid: VLAN identifier
1318 * 1319 *
1319 * check if the originator is a gateway for any VLAN ID. 1320 * Check if the originator is a gateway for the VLAN identified by vid.
1320 * 1321 *
1321 * returns 1 if it is found, 0 otherwise 1322 * Returns true if orig is a backbone for this vid, false otherwise.
1322 */ 1323 */
1323int batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig) 1324bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig,
1325 unsigned short vid)
1324{ 1326{
1325 struct batadv_hashtable *hash = bat_priv->bla.backbone_hash; 1327 struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
1326 struct hlist_head *head; 1328 struct hlist_head *head;
@@ -1328,25 +1330,26 @@ int batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig)
1328 int i; 1330 int i;
1329 1331
1330 if (!atomic_read(&bat_priv->bridge_loop_avoidance)) 1332 if (!atomic_read(&bat_priv->bridge_loop_avoidance))
1331 return 0; 1333 return false;
1332 1334
1333 if (!hash) 1335 if (!hash)
1334 return 0; 1336 return false;
1335 1337
1336 for (i = 0; i < hash->size; i++) { 1338 for (i = 0; i < hash->size; i++) {
1337 head = &hash->table[i]; 1339 head = &hash->table[i];
1338 1340
1339 rcu_read_lock(); 1341 rcu_read_lock();
1340 hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) { 1342 hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
1341 if (batadv_compare_eth(backbone_gw->orig, orig)) { 1343 if (batadv_compare_eth(backbone_gw->orig, orig) &&
1344 backbone_gw->vid == vid) {
1342 rcu_read_unlock(); 1345 rcu_read_unlock();
1343 return 1; 1346 return true;
1344 } 1347 }
1345 } 1348 }
1346 rcu_read_unlock(); 1349 rcu_read_unlock();
1347 } 1350 }
1348 1351
1349 return 0; 1352 return false;
1350} 1353}
1351 1354
1352 1355
diff --git a/net/batman-adv/bridge_loop_avoidance.h b/net/batman-adv/bridge_loop_avoidance.h
index 4b102e71e5bd..da173e760e77 100644
--- a/net/batman-adv/bridge_loop_avoidance.h
+++ b/net/batman-adv/bridge_loop_avoidance.h
@@ -30,7 +30,8 @@ int batadv_bla_is_backbone_gw(struct sk_buff *skb,
30int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset); 30int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset);
31int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, 31int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq,
32 void *offset); 32 void *offset);
33int batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig); 33bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig,
34 unsigned short vid);
34int batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv, 35int batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,
35 struct sk_buff *skb); 36 struct sk_buff *skb);
36void batadv_bla_update_orig_address(struct batadv_priv *bat_priv, 37void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,
@@ -74,10 +75,11 @@ static inline int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq,
74 return 0; 75 return 0;
75} 76}
76 77
77static inline int batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, 78static inline bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv,
78 uint8_t *orig) 79 uint8_t *orig,
80 unsigned short vid)
79{ 81{
80 return 0; 82 return false;
81} 83}
82 84
83static inline int 85static inline int
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index 4c313ff8b12f..7731eaed737d 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -1153,6 +1153,10 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
1153 struct batadv_tt_common_entry *common; 1153 struct batadv_tt_common_entry *common;
1154 uint16_t local_flags; 1154 uint16_t local_flags;
1155 1155
1156 /* ignore global entries from backbone nodes */
1157 if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig, vid))
1158 return true;
1159
1156 tt_global_entry = batadv_tt_global_hash_find(bat_priv, tt_addr, vid); 1160 tt_global_entry = batadv_tt_global_hash_find(bat_priv, tt_addr, vid);
1157 tt_local_entry = batadv_tt_local_hash_find(bat_priv, tt_addr, vid); 1161 tt_local_entry = batadv_tt_local_hash_find(bat_priv, tt_addr, vid);
1158 1162
@@ -2135,7 +2139,8 @@ static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node,
2135 * the CRC as we ignore all the global entries over it 2139 * the CRC as we ignore all the global entries over it
2136 */ 2140 */
2137 if (batadv_bla_is_backbone_gw_orig(orig_node->bat_priv, 2141 if (batadv_bla_is_backbone_gw_orig(orig_node->bat_priv,
2138 orig_node->orig)) 2142 orig_node->orig,
2143 ntohs(tt_vlan_tmp->vid)))
2139 continue; 2144 continue;
2140 2145
2141 vlan = batadv_orig_node_vlan_get(orig_node, 2146 vlan = batadv_orig_node_vlan_get(orig_node,
@@ -2183,7 +2188,8 @@ static void batadv_tt_global_update_crc(struct batadv_priv *bat_priv,
2183 /* if orig_node is a backbone node for this VLAN, don't compute 2188 /* if orig_node is a backbone node for this VLAN, don't compute
2184 * the CRC as we ignore all the global entries over it 2189 * the CRC as we ignore all the global entries over it
2185 */ 2190 */
2186 if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig)) 2191 if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig,
2192 vlan->vid))
2187 continue; 2193 continue;
2188 2194
2189 crc = batadv_tt_global_crc(bat_priv, orig_node, vlan->vid); 2195 crc = batadv_tt_global_crc(bat_priv, orig_node, vlan->vid);
@@ -2527,16 +2533,11 @@ static bool batadv_send_tt_response(struct batadv_priv *bat_priv,
2527 struct batadv_tvlv_tt_data *tt_data, 2533 struct batadv_tvlv_tt_data *tt_data,
2528 uint8_t *req_src, uint8_t *req_dst) 2534 uint8_t *req_src, uint8_t *req_dst)
2529{ 2535{
2530 if (batadv_is_my_mac(bat_priv, req_dst)) { 2536 if (batadv_is_my_mac(bat_priv, req_dst))
2531 /* don't answer backbone gws! */
2532 if (batadv_bla_is_backbone_gw_orig(bat_priv, req_src))
2533 return true;
2534
2535 return batadv_send_my_tt_response(bat_priv, tt_data, req_src); 2537 return batadv_send_my_tt_response(bat_priv, tt_data, req_src);
2536 } else { 2538 else
2537 return batadv_send_other_tt_response(bat_priv, tt_data, 2539 return batadv_send_other_tt_response(bat_priv, tt_data,
2538 req_src, req_dst); 2540 req_src, req_dst);
2539 }
2540} 2541}
2541 2542
2542static void _batadv_tt_update_changes(struct batadv_priv *bat_priv, 2543static void _batadv_tt_update_changes(struct batadv_priv *bat_priv,
@@ -2668,10 +2669,6 @@ static void batadv_handle_tt_response(struct batadv_priv *bat_priv,
2668 resp_src, tt_data->ttvn, num_entries, 2669 resp_src, tt_data->ttvn, num_entries,
2669 (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.')); 2670 (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
2670 2671
2671 /* we should have never asked a backbone gw */
2672 if (batadv_bla_is_backbone_gw_orig(bat_priv, resp_src))
2673 goto out;
2674
2675 orig_node = batadv_orig_hash_find(bat_priv, resp_src); 2672 orig_node = batadv_orig_hash_find(bat_priv, resp_src);
2676 if (!orig_node) 2673 if (!orig_node)
2677 goto out; 2674 goto out;
@@ -3052,10 +3049,6 @@ static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
3052 struct batadv_tvlv_tt_vlan_data *tt_vlan; 3049 struct batadv_tvlv_tt_vlan_data *tt_vlan;
3053 bool full_table = true; 3050 bool full_table = true;
3054 3051
3055 /* don't care about a backbone gateways updates. */
3056 if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig))
3057 return;
3058
3059 tt_vlan = (struct batadv_tvlv_tt_vlan_data *)tt_buff; 3052 tt_vlan = (struct batadv_tvlv_tt_vlan_data *)tt_buff;
3060 /* orig table not initialised AND first diff is in the OGM OR the ttvn 3053 /* orig table not initialised AND first diff is in the OGM OR the ttvn
3061 * increased by one -> we can apply the attached changes 3054 * increased by one -> we can apply the attached changes
@@ -3177,13 +3170,6 @@ bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv,
3177{ 3170{
3178 bool ret = false; 3171 bool ret = false;
3179 3172
3180 /* if the originator is a backbone node (meaning it belongs to the same
3181 * LAN of this node) the temporary client must not be added because to
3182 * reach such destination the node must use the LAN instead of the mesh
3183 */
3184 if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig))
3185 goto out;
3186
3187 if (!batadv_tt_global_add(bat_priv, orig_node, addr, vid, 3173 if (!batadv_tt_global_add(bat_priv, orig_node, addr, vid,
3188 BATADV_TT_CLIENT_TEMP, 3174 BATADV_TT_CLIENT_TEMP,
3189 atomic_read(&orig_node->last_ttvn))) 3175 atomic_read(&orig_node->last_ttvn)))
@@ -3344,13 +3330,6 @@ static int batadv_roam_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv,
3344 if (!batadv_is_my_mac(bat_priv, dst)) 3330 if (!batadv_is_my_mac(bat_priv, dst))
3345 return NET_RX_DROP; 3331 return NET_RX_DROP;
3346 3332
3347 /* check if it is a backbone gateway. we don't accept
3348 * roaming advertisement from it, as it has the same
3349 * entries as we have.
3350 */
3351 if (batadv_bla_is_backbone_gw_orig(bat_priv, src))
3352 goto out;
3353
3354 if (tvlv_value_len < sizeof(*roaming_adv)) 3333 if (tvlv_value_len < sizeof(*roaming_adv))
3355 goto out; 3334 goto out;
3356 3335