Included fixes are:
- update the client entry status flags when using the "early client detection". This makes the Distributed AP isolation correctly work; - transfer the client entry status flags when recovering the translation table from another node. This makes the Distributed AP isolation correctly work; - prevent the "early client detection mechanism" to add clients belonging to other backbone nodes in the same LAN. This breaks connectivity when using this mechanism together with the Bridge Loop Avoidance - process broadcast packets with the Bridge Loop Avoidance before any other component. BLA can possibly drop the packets based on the source address. This makes the "early client detection mechanism" correctly work when used with BLA. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iEYEABECAAYFAlCl+10ACgkQpGgxIkP9cwdaPwCgilqLnUdnxRC9grjzjxggE51K SqYAnRJHKdH6cqdMT+AEDAhAQI2eFg9b =FJ1q -----END PGP SIGNATURE----- Merge tag 'batman-adv-fix-for-davem' of git://git.open-mesh.org/linux-merge Included fixes are: - update the client entry status flags when using the "early client detection". This makes the Distributed AP isolation correctly work; - transfer the client entry status flags when recovering the translation table from another node. This makes the Distributed AP isolation correctly work; - prevent the "early client detection mechanism" to add clients belonging to other backbone nodes in the same LAN. This breaks connectivity when using this mechanism together with the Bridge Loop Avoidance - process broadcast packets with the Bridge Loop Avoidance before any other component. BLA can possibly drop the packets based on the source address. This makes the "early client detection mechanism" correctly work when used with BLA. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
2a95388353
|
@ -325,6 +325,12 @@ void batadv_interface_rx(struct net_device *soft_iface,
|
|||
|
||||
soft_iface->last_rx = jiffies;
|
||||
|
||||
/* Let the bridge loop avoidance check the packet. If will
|
||||
* not handle it, we can safely push it up.
|
||||
*/
|
||||
if (batadv_bla_rx(bat_priv, skb, vid, is_bcast))
|
||||
goto out;
|
||||
|
||||
if (orig_node)
|
||||
batadv_tt_add_temporary_global_entry(bat_priv, orig_node,
|
||||
ethhdr->h_source);
|
||||
|
@ -332,12 +338,6 @@ void batadv_interface_rx(struct net_device *soft_iface,
|
|||
if (batadv_is_ap_isolated(bat_priv, ethhdr->h_source, ethhdr->h_dest))
|
||||
goto dropped;
|
||||
|
||||
/* Let the bridge loop avoidance check the packet. If will
|
||||
* not handle it, we can safely push it up.
|
||||
*/
|
||||
if (batadv_bla_rx(bat_priv, skb, vid, is_bcast))
|
||||
goto out;
|
||||
|
||||
netif_rx(skb);
|
||||
goto out;
|
||||
|
||||
|
|
|
@ -769,6 +769,12 @@ int batadv_tt_global_add(struct batadv_priv *bat_priv,
|
|||
*/
|
||||
tt_global_entry->common.flags &= ~BATADV_TT_CLIENT_TEMP;
|
||||
|
||||
/* the change can carry possible "attribute" flags like the
|
||||
* TT_CLIENT_WIFI, therefore they have to be copied in the
|
||||
* client entry
|
||||
*/
|
||||
tt_global_entry->common.flags |= flags;
|
||||
|
||||
/* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only
|
||||
* one originator left in the list and we previously received a
|
||||
* delete + roaming change for this originator.
|
||||
|
@ -1496,7 +1502,7 @@ batadv_tt_response_fill_table(uint16_t tt_len, uint8_t ttvn,
|
|||
|
||||
memcpy(tt_change->addr, tt_common_entry->addr,
|
||||
ETH_ALEN);
|
||||
tt_change->flags = BATADV_NO_FLAGS;
|
||||
tt_change->flags = tt_common_entry->flags;
|
||||
|
||||
tt_count++;
|
||||
tt_change++;
|
||||
|
@ -2450,6 +2456,13 @@ bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv,
|
|||
{
|
||||
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,
|
||||
BATADV_TT_CLIENT_TEMP,
|
||||
atomic_read(&orig_node->last_ttvn)))
|
||||
|
|
Загрузка…
Ссылка в новой задаче