tipc: fix neighbor detection problem after hw address change
authorErik Hugne <erik.hugne@ericsson.com>
Fri, 28 Mar 2014 09:32:08 +0000 (10:32 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 28 Mar 2014 18:46:29 +0000 (14:46 -0400)
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: Erik Hugne <erik.hugne@ericsson.com>
Reported-by: Dong Liu <dliu.cn@gmail.com>
Reviewed-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/bearer.c
net/tipc/bearer.h

index ed45f9717af1fc1a359eac245b33f98887e9707e..3cd65d46b1733f6add569461546f82ab3a680ff2 100644 (file)
@@ -332,6 +332,7 @@ restart:
        b_ptr->identity = bearer_id;
        b_ptr->tolerance = m_ptr->tolerance;
        b_ptr->window = m_ptr->window;
+       b_ptr->domain = disc_domain;
        b_ptr->net_plane = bearer_id + 'A';
        b_ptr->priority = priority;
 
@@ -360,7 +361,9 @@ static int tipc_reset_bearer(struct tipc_bearer *b_ptr)
 {
        read_lock_bh(&tipc_net_lock);
        pr_info("Resetting bearer <%s>\n", b_ptr->name);
+       tipc_disc_delete(b_ptr->link_req);
        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);
        return 0;
 }
@@ -580,7 +583,11 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt,
                        break;
        case NETDEV_DOWN:
        case NETDEV_CHANGEMTU:
+               tipc_reset_bearer(b_ptr);
+               break;
        case NETDEV_CHANGEADDR:
+               tipc_l2_media_addr_set(b_ptr, &b_ptr->addr,
+                                      (char *)dev->dev_addr);
                tipc_reset_bearer(b_ptr);
                break;
        case NETDEV_UNREGISTER:
index 3f6d7d0f059ba1f1f4ff2891b939b88c2352adf4..ba48145e871dd8dcd357a193b61e9234e5ad7f0d 100644 (file)
@@ -116,6 +116,7 @@ struct tipc_media {
  * @priority: default link priority for bearer
  * @window: default window size 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
  * @link_req: ptr to (optional) structure making periodic link setup requests
  * @net_plane: network plane ('A' through 'H') currently associated with bearer
@@ -135,6 +136,7 @@ struct tipc_bearer {
        u32 priority;
        u32 window;
        u32 tolerance;
+       u32 domain;
        u32 identity;
        struct tipc_link_req *link_req;
        char net_plane;