提交 03194379 编写于 作者: A Allan Stephens 提交者: David S. Miller

tipc: Fix initialization sequence problems when entering network mode

This patch ensures that TIPC's topology service and configuration
service are shut down before switching into "network mode".  This
ensures that TIPC does not mistakenly try to send unnecessary
"publication withdraw" messages to other nodes before it is fully
initialized for sending off-node messages.  Note that the node's
current network address is now updated only after the two services
are shut down; this ensures that any existing connections to the
topology server are terminated correctly using the old address.
Signed-off-by: NAllan Stephens <allan.stephens@windriver.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 6d4a6672
...@@ -293,7 +293,6 @@ static struct sk_buff *cfg_set_own_addr(void) ...@@ -293,7 +293,6 @@ static struct sk_buff *cfg_set_own_addr(void)
if (tipc_mode == TIPC_NET_MODE) if (tipc_mode == TIPC_NET_MODE)
return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
" (cannot change node address once assigned)"); " (cannot change node address once assigned)");
tipc_own_addr = addr;
/* /*
* Must release all spinlocks before calling start_net() because * Must release all spinlocks before calling start_net() because
...@@ -306,7 +305,7 @@ static struct sk_buff *cfg_set_own_addr(void) ...@@ -306,7 +305,7 @@ static struct sk_buff *cfg_set_own_addr(void)
*/ */
spin_unlock_bh(&config_lock); spin_unlock_bh(&config_lock);
tipc_core_start_net(); tipc_core_start_net(addr);
spin_lock_bh(&config_lock); spin_lock_bh(&config_lock);
return tipc_cfg_reply_none(); return tipc_cfg_reply_none();
} }
......
...@@ -117,11 +117,11 @@ void tipc_core_stop_net(void) ...@@ -117,11 +117,11 @@ void tipc_core_stop_net(void)
* start_net - start TIPC networking sub-systems * start_net - start TIPC networking sub-systems
*/ */
int tipc_core_start_net(void) int tipc_core_start_net(unsigned long addr)
{ {
int res; int res;
if ((res = tipc_net_start()) || if ((res = tipc_net_start(addr)) ||
(res = tipc_eth_media_start())) { (res = tipc_eth_media_start())) {
tipc_core_stop_net(); tipc_core_stop_net();
} }
......
...@@ -202,7 +202,7 @@ extern atomic_t tipc_user_count; ...@@ -202,7 +202,7 @@ extern atomic_t tipc_user_count;
extern int tipc_core_start(void); extern int tipc_core_start(void);
extern void tipc_core_stop(void); extern void tipc_core_stop(void);
extern int tipc_core_start_net(void); extern int tipc_core_start_net(unsigned long addr);
extern void tipc_core_stop_net(void); extern void tipc_core_stop_net(void);
extern int tipc_handler_start(void); extern int tipc_handler_start(void);
extern void tipc_handler_stop(void); extern void tipc_handler_stop(void);
......
...@@ -266,7 +266,7 @@ void tipc_net_route_msg(struct sk_buff *buf) ...@@ -266,7 +266,7 @@ void tipc_net_route_msg(struct sk_buff *buf)
tipc_link_send(buf, dnode, msg_link_selector(msg)); tipc_link_send(buf, dnode, msg_link_selector(msg));
} }
int tipc_net_start(void) int tipc_net_start(u32 addr)
{ {
char addr_string[16]; char addr_string[16];
int res; int res;
...@@ -274,6 +274,10 @@ int tipc_net_start(void) ...@@ -274,6 +274,10 @@ int tipc_net_start(void)
if (tipc_mode != TIPC_NODE_MODE) if (tipc_mode != TIPC_NODE_MODE)
return -ENOPROTOOPT; return -ENOPROTOOPT;
tipc_subscr_stop();
tipc_cfg_stop();
tipc_own_addr = addr;
tipc_mode = TIPC_NET_MODE; tipc_mode = TIPC_NET_MODE;
tipc_named_reinit(); tipc_named_reinit();
tipc_port_reinit(); tipc_port_reinit();
...@@ -284,10 +288,10 @@ int tipc_net_start(void) ...@@ -284,10 +288,10 @@ int tipc_net_start(void)
(res = tipc_bclink_init())) { (res = tipc_bclink_init())) {
return res; return res;
} }
tipc_subscr_stop();
tipc_cfg_stop();
tipc_k_signal((Handler)tipc_subscr_start, 0); tipc_k_signal((Handler)tipc_subscr_start, 0);
tipc_k_signal((Handler)tipc_cfg_init, 0); tipc_k_signal((Handler)tipc_cfg_init, 0);
info("Started in network mode\n"); info("Started in network mode\n");
info("Own node address %s, network identity %u\n", info("Own node address %s, network identity %u\n",
addr_string_fill(addr_string, tipc_own_addr), tipc_net_id); addr_string_fill(addr_string, tipc_own_addr), tipc_net_id);
......
...@@ -58,7 +58,7 @@ void tipc_net_route_msg(struct sk_buff *buf); ...@@ -58,7 +58,7 @@ void tipc_net_route_msg(struct sk_buff *buf);
struct node *tipc_net_select_remote_node(u32 addr, u32 ref); struct node *tipc_net_select_remote_node(u32 addr, u32 ref);
u32 tipc_net_select_router(u32 addr, u32 ref); u32 tipc_net_select_router(u32 addr, u32 ref);
int tipc_net_start(void); int tipc_net_start(u32 addr);
void tipc_net_stop(void); void tipc_net_stop(void);
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册