batman-adv: change the MAC of each VLAN upon ndo_set_mac_address
PATCH v3 1/1 batman-adv: change the MAC of each VLAN upon ndo_set_mac_address
From: Antonio Quartulli <[email protected]>
The MAC address of the soft-interface is used to initialise the "non-purge" TT entry of each existing VLAN. Therefore when the user invokes ndo_set_mac_address() all the "non-purge" TT entries have to be updated, not only the one belonging to the non-tagged network.
---
Changes from v2:
- don't increment/decrement vlan->refcounter because we never use the vlan object outside of the rcu_read_lock/unlock area
changes from v1:
- declare vlan variable
soft-interface.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
soft-interface.c +9 -3
@@ -105,6 +105,7 @@ static struct net_device_stats *batadv_interface_stats(struct net_device *dev)static int batadv_interface_set_mac_addr (struct net_device *dev,void *p) {struct batadv_priv *bat_priv =netdev_priv (dev); +struct batadv_softif_vlan *vlan;struct sockaddr *addr = p;uint8_t old_addr[ETH_ALEN ];
@@ -115,12 +116,17 @@ static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)memcpy (dev->dev_addr, addr->sa_data,ETH_ALEN );/* only modify transtable if it has been initialized before */ -if (atomic_read (&bat_priv->mesh_state) ==BATADV_MESH_ACTIVE ) { -batadv_tt_local_remove (bat_priv, old_addr,BATADV_NO_FLAGS , +if (atomic_read (&bat_priv->mesh_state) !=BATADV_MESH_ACTIVE ) +return 0 ; + +rcu_read_lock (); +hlist_for_each_entry_rcu (vlan, &bat_priv->softif_vlan_list, list) { +batadv_tt_local_remove (bat_priv, old_addr, vlan->vid,"mac address changed" , false); -batadv_tt_local_add (dev, addr->sa_data,BATADV_NO_FLAGS , +batadv_tt_local_add (dev, addr->sa_data, vlan->vid,BATADV_NULL_IFINDEX ,BATADV_NO_MARK ); } +rcu_read_unlock ();return 0 ; }
Signature · 1 line
1.8.3.2
Marek Lindner
AppliedQuoted 15 lines · On Monday 31 March 2014 13:48:10 Antonio Quartulli wrote:
From: Antonio Quartulli <[email protected]>
The MAC address of the soft-interface is used to initialise the "non-purge" TT entry of each existing VLAN. Therefore when the user invokes
ndo_set_mac_address()all the "non-purge" TT entries have to be updated, not only the one belonging to the non-tagged network.Signed-off-by Antonio Quartulli <[email protected]>---
Changes from v2:
- don't increment/decrementvlan->refcounterbecause we never use the vlan object outside of the rcu_read_lock/unlock area
Quoted 6 lines
changes from v1:
- declare vlan variablesoft-interface.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
Applied in revision 31f3914.
Thanks,
Marek