/* @bat_priv: the bat priv with all the soft interface information
  * @orig: originator mac address
+ * @vid: VLAN identifier
  *
- * check if the originator is a gateway for any VLAN ID.
+ * Check if the originator is a gateway for the VLAN identified by vid.
  *
- * returns 1 if it is found, 0 otherwise
+ * Returns true if orig is a backbone for this vid, false otherwise.
  */
-int batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig)
+bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig,
+                                   unsigned short vid)
 {
        struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
        struct hlist_head *head;
        int i;
 
        if (!atomic_read(&bat_priv->bridge_loop_avoidance))
-               return 0;
+               return false;
 
        if (!hash)
-               return 0;
+               return false;
 
        for (i = 0; i < hash->size; i++) {
                head = &hash->table[i];
 
                rcu_read_lock();
                hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
-                       if (batadv_compare_eth(backbone_gw->orig, orig)) {
+                       if (batadv_compare_eth(backbone_gw->orig, orig) &&
+                           backbone_gw->vid == vid) {
                                rcu_read_unlock();
-                               return 1;
+                               return true;
                        }
                }
                rcu_read_unlock();
        }
 
-       return 0;
+       return false;
 }
 
 
 
 int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset);
 int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq,
                                             void *offset);
-int batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig);
+bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig,
+                                   unsigned short vid);
 int batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,
                                   struct sk_buff *skb);
 void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,
        return 0;
 }
 
-static inline int batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv,
-                                                uint8_t *orig)
+static inline bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv,
+                                                 uint8_t *orig,
+                                                 unsigned short vid)
 {
-       return 0;
+       return false;
 }
 
 static inline int
 
        struct batadv_tt_common_entry *common;
        uint16_t local_flags;
 
+       /* ignore global entries from backbone nodes */
+       if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig, vid))
+               return true;
+
        tt_global_entry = batadv_tt_global_hash_find(bat_priv, tt_addr, vid);
        tt_local_entry = batadv_tt_local_hash_find(bat_priv, tt_addr, vid);
 
                 * the CRC as we ignore all the global entries over it
                 */
                if (batadv_bla_is_backbone_gw_orig(orig_node->bat_priv,
-                                                  orig_node->orig))
+                                                  orig_node->orig,
+                                                  ntohs(tt_vlan_tmp->vid)))
                        continue;
 
                vlan = batadv_orig_node_vlan_get(orig_node,
                /* if orig_node is a backbone node for this VLAN, don't compute
                 * the CRC as we ignore all the global entries over it
                 */
-               if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig))
+               if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig,
+                                                  vlan->vid))
                        continue;
 
                crc = batadv_tt_global_crc(bat_priv, orig_node, vlan->vid);
                                    struct batadv_tvlv_tt_data *tt_data,
                                    uint8_t *req_src, uint8_t *req_dst)
 {
-       if (batadv_is_my_mac(bat_priv, req_dst)) {
-               /* don't answer backbone gws! */
-               if (batadv_bla_is_backbone_gw_orig(bat_priv, req_src))
-                       return true;
-
+       if (batadv_is_my_mac(bat_priv, req_dst))
                return batadv_send_my_tt_response(bat_priv, tt_data, req_src);
-       } else {
+       else
                return batadv_send_other_tt_response(bat_priv, tt_data,
                                                     req_src, req_dst);
-       }
 }
 
 static void _batadv_tt_update_changes(struct batadv_priv *bat_priv,
                   resp_src, tt_data->ttvn, num_entries,
                   (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
 
-       /* we should have never asked a backbone gw */
-       if (batadv_bla_is_backbone_gw_orig(bat_priv, resp_src))
-               goto out;
-
        orig_node = batadv_orig_hash_find(bat_priv, resp_src);
        if (!orig_node)
                goto out;
        struct batadv_tvlv_tt_vlan_data *tt_vlan;
        bool full_table = true;
 
-       /* don't care about a backbone gateways updates. */
-       if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig))
-               return;
-
        tt_vlan = (struct batadv_tvlv_tt_vlan_data *)tt_buff;
        /* orig table not initialised AND first diff is in the OGM OR the ttvn
         * increased by one -> we can apply the attached changes
 {
        bool ret = false;
 
-       /* if the originator is a backbone node (meaning it belongs to the same
-        * LAN of this node) the temporary client must not be added because to
-        * reach such destination the node must use the LAN instead of the mesh
-        */
-       if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig))
-               goto out;
-
        if (!batadv_tt_global_add(bat_priv, orig_node, addr, vid,
                                  BATADV_TT_CLIENT_TEMP,
                                  atomic_read(&orig_node->last_ttvn)))
        if (!batadv_is_my_mac(bat_priv, dst))
                return NET_RX_DROP;
 
-       /* check if it is a backbone gateway. we don't accept
-        * roaming advertisement from it, as it has the same
-        * entries as we have.
-        */
-       if (batadv_bla_is_backbone_gw_orig(bat_priv, src))
-               goto out;
-
        if (tvlv_value_len < sizeof(*roaming_adv))
                goto out;