Commit a21a584d authored by Erik Hugne's avatar Erik Hugne Committed by David S. Miller

tipc: fix neighbor detection problem after hw address change

If the hardware address of a underlying netdevice is changed, it is
not enough to simply reset the bearer/links over this device. We
also need to reflect this change in the TIPC bearer and node
discovery structures aswell.

This patch adds the necessary reinitialization of the node disovery
mechanism following a hardware address change so that the correct
originating media address is advertised in the discovery messages.
Signed-off-by: default avatarErik Hugne <erik.hugne@ericsson.com>
Reported-by: default avatarDong Liu <dliu.cn@gmail.com>
Reviewed-by: default avatarYing Xue <ying.xue@windriver.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c8c3d7e2
...@@ -332,6 +332,7 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority) ...@@ -332,6 +332,7 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority)
b_ptr->identity = bearer_id; b_ptr->identity = bearer_id;
b_ptr->tolerance = m_ptr->tolerance; b_ptr->tolerance = m_ptr->tolerance;
b_ptr->window = m_ptr->window; b_ptr->window = m_ptr->window;
b_ptr->domain = disc_domain;
b_ptr->net_plane = bearer_id + 'A'; b_ptr->net_plane = bearer_id + 'A';
b_ptr->priority = priority; b_ptr->priority = priority;
...@@ -360,7 +361,9 @@ static int tipc_reset_bearer(struct tipc_bearer *b_ptr) ...@@ -360,7 +361,9 @@ static int tipc_reset_bearer(struct tipc_bearer *b_ptr)
{ {
read_lock_bh(&tipc_net_lock); read_lock_bh(&tipc_net_lock);
pr_info("Resetting bearer <%s>\n", b_ptr->name); pr_info("Resetting bearer <%s>\n", b_ptr->name);
tipc_disc_delete(b_ptr->link_req);
tipc_link_reset_list(b_ptr->identity); tipc_link_reset_list(b_ptr->identity);
tipc_disc_create(b_ptr, &b_ptr->bcast_addr, b_ptr->domain);
read_unlock_bh(&tipc_net_lock); read_unlock_bh(&tipc_net_lock);
return 0; return 0;
} }
...@@ -580,7 +583,11 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt, ...@@ -580,7 +583,11 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt,
break; break;
case NETDEV_DOWN: case NETDEV_DOWN:
case NETDEV_CHANGEMTU: case NETDEV_CHANGEMTU:
tipc_reset_bearer(b_ptr);
break;
case NETDEV_CHANGEADDR: case NETDEV_CHANGEADDR:
tipc_l2_media_addr_set(b_ptr, &b_ptr->addr,
(char *)dev->dev_addr);
tipc_reset_bearer(b_ptr); tipc_reset_bearer(b_ptr);
break; break;
case NETDEV_UNREGISTER: case NETDEV_UNREGISTER:
......
...@@ -116,6 +116,7 @@ struct tipc_media { ...@@ -116,6 +116,7 @@ struct tipc_media {
* @priority: default link priority for bearer * @priority: default link priority for bearer
* @window: default window size for bearer * @window: default window size for bearer
* @tolerance: default link tolerance for bearer * @tolerance: default link tolerance for bearer
* @domain: network domain to which links can be established
* @identity: array index of this bearer within TIPC bearer array * @identity: array index of this bearer within TIPC bearer array
* @link_req: ptr to (optional) structure making periodic link setup requests * @link_req: ptr to (optional) structure making periodic link setup requests
* @net_plane: network plane ('A' through 'H') currently associated with bearer * @net_plane: network plane ('A' through 'H') currently associated with bearer
...@@ -135,6 +136,7 @@ struct tipc_bearer { ...@@ -135,6 +136,7 @@ struct tipc_bearer {
u32 priority; u32 priority;
u32 window; u32 window;
u32 tolerance; u32 tolerance;
u32 domain;
u32 identity; u32 identity;
struct tipc_link_req *link_req; struct tipc_link_req *link_req;
char net_plane; char net_plane;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment