diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index ed45f9717af1fc1a359eac245b33f98887e9707e..3cd65d46b1733f6add569461546f82ab3a680ff2 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c @@ -332,6 +332,7 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority) 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: diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h index 3f6d7d0f059ba1f1f4ff2891b939b88c2352adf4..ba48145e871dd8dcd357a193b61e9234e5ad7f0d 100644 --- a/net/tipc/bearer.h +++ b/net/tipc/bearer.h @@ -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;