diff options
Diffstat (limited to 'net/tipc/core.c')
| -rw-r--r-- | net/tipc/core.c | 193 | 
1 files changed, 69 insertions, 124 deletions
diff --git a/net/tipc/core.c b/net/tipc/core.c index f5d62c174de..676d18015dd 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c @@ -1,8 +1,8 @@  /*   * net/tipc/core.c: TIPC module code   * - * Copyright (c) 2003-2006, Ericsson AB - * Copyright (c) 2005-2006, Wind River Systems + * Copyright (c) 2003-2006, 2013, Ericsson AB + * Copyright (c) 2005-2006, 2010-2013, Wind River Systems   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -34,66 +34,23 @@   * POSSIBILITY OF SUCH DAMAGE.   */ -#include <linux/init.h> -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/random.h> -  #include "core.h"  #include "ref.h" -#include "net.h" -#include "user_reg.h"  #include "name_table.h"  #include "subscr.h"  #include "config.h" +#include "port.h" - -#ifndef CONFIG_TIPC_ZONES -#define CONFIG_TIPC_ZONES 3 -#endif - -#ifndef CONFIG_TIPC_CLUSTERS -#define CONFIG_TIPC_CLUSTERS 1 -#endif - -#ifndef CONFIG_TIPC_NODES -#define CONFIG_TIPC_NODES 255 -#endif - -#ifndef CONFIG_TIPC_SLAVE_NODES -#define CONFIG_TIPC_SLAVE_NODES 0 -#endif - -#ifndef CONFIG_TIPC_PORTS -#define CONFIG_TIPC_PORTS 8191 -#endif - -#ifndef CONFIG_TIPC_LOG -#define CONFIG_TIPC_LOG 0 -#endif +#include <linux/module.h>  /* global variables used by multiple sub-systems within TIPC */ - -int tipc_mode = TIPC_NOT_RUNNING; -int tipc_random; -atomic_t tipc_user_count = ATOMIC_INIT(0); - -const char tipc_alphabet[] = -	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_."; +int tipc_random __read_mostly;  /* configurable TIPC parameters */ - -u32 tipc_own_addr; -int tipc_max_zones; -int tipc_max_clusters; -int tipc_max_nodes; -int tipc_max_slaves; -int tipc_max_ports; -int tipc_max_subscriptions; -int tipc_max_publications; -int tipc_net_id; -int tipc_remote_management; - +u32 tipc_own_addr __read_mostly; +int tipc_max_ports __read_mostly; +int tipc_net_id __read_mostly; +int sysctl_tipc_rmem[3] __read_mostly;	/* min/default/max */  /**   * tipc_buf_acquire - creates a TIPC message buffer @@ -104,7 +61,6 @@ int tipc_remote_management;   * NOTE: Headroom is reserved to allow prepending of a data link header.   *       There may also be unrequested tailroom present at the buffer's end.   */ -  struct sk_buff *tipc_buf_acquire(u32 size)  {  	struct sk_buff *skb; @@ -120,113 +76,102 @@ struct sk_buff *tipc_buf_acquire(u32 size)  }  /** - * tipc_core_stop_net - shut down TIPC networking sub-systems - */ - -static void tipc_core_stop_net(void) -{ -	tipc_eth_media_stop(); -	tipc_net_stop(); -} - -/** - * start_net - start TIPC networking sub-systems - */ - -int tipc_core_start_net(unsigned long addr) -{ -	int res; - -	if ((res = tipc_net_start(addr)) || -	    (res = tipc_eth_media_start())) { -		tipc_core_stop_net(); -	} -	return res; -} - -/**   * tipc_core_stop - switch TIPC from SINGLE NODE to NOT RUNNING mode   */ -  static void tipc_core_stop(void)  { -	if (tipc_mode != TIPC_NODE_MODE) -		return; - -	tipc_mode = TIPC_NOT_RUNNING; - +	tipc_net_stop(); +	tipc_bearer_cleanup();  	tipc_netlink_stop(); -	tipc_handler_stop(); -	tipc_cfg_stop();  	tipc_subscr_stop(); -	tipc_reg_stop();  	tipc_nametbl_stop();  	tipc_ref_table_stop();  	tipc_socket_stop(); -	tipc_log_resize(0); +	tipc_unregister_sysctl();  }  /**   * tipc_core_start - switch TIPC from NOT RUNNING to SINGLE NODE mode   */ -  static int tipc_core_start(void)  { -	int res; - -	if (tipc_mode != TIPC_NOT_RUNNING) -		return -ENOPROTOOPT; +	int err;  	get_random_bytes(&tipc_random, sizeof(tipc_random)); -	tipc_mode = TIPC_NODE_MODE; - -	if ((res = tipc_handler_start()) || -	    (res = tipc_ref_table_init(tipc_max_ports, tipc_random)) || -	    (res = tipc_reg_start()) || -	    (res = tipc_nametbl_init()) || -	    (res = tipc_k_signal((Handler)tipc_subscr_start, 0)) || -	    (res = tipc_k_signal((Handler)tipc_cfg_init, 0)) || -	    (res = tipc_netlink_start()) || -	    (res = tipc_socket_init())) { -		tipc_core_stop(); -	} -	return res; -} +	err = tipc_ref_table_init(tipc_max_ports, tipc_random); +	if (err) +		goto out_reftbl; + +	err = tipc_nametbl_init(); +	if (err) +		goto out_nametbl; + +	err = tipc_netlink_start(); +	if (err) +		goto out_netlink; + +	err = tipc_socket_init(); +	if (err) +		goto out_socket; + +	err = tipc_register_sysctl(); +	if (err) +		goto out_sysctl; + +	err = tipc_subscr_start(); +	if (err) +		goto out_subscr; + +	err = tipc_bearer_setup(); +	if (err) +		goto out_bearer; + +	return 0; +out_bearer: +	tipc_subscr_stop(); +out_subscr: +	tipc_unregister_sysctl(); +out_sysctl: +	tipc_socket_stop(); +out_socket: +	tipc_netlink_stop(); +out_netlink: +	tipc_nametbl_stop(); +out_nametbl: +	tipc_ref_table_stop(); +out_reftbl: +	return err; +}  static int __init tipc_init(void)  {  	int res; -	if (tipc_log_resize(CONFIG_TIPC_LOG) != 0) -		warn("Unable to create log buffer\n"); - -	info("Activated (version " TIPC_MOD_VER -	     " compiled " __DATE__ " " __TIME__ ")\n"); +	pr_info("Activated (version " TIPC_MOD_VER ")\n");  	tipc_own_addr = 0; -	tipc_remote_management = 1; -	tipc_max_publications = 10000; -	tipc_max_subscriptions = 2000;  	tipc_max_ports = CONFIG_TIPC_PORTS; -	tipc_max_zones = CONFIG_TIPC_ZONES; -	tipc_max_clusters = CONFIG_TIPC_CLUSTERS; -	tipc_max_nodes = CONFIG_TIPC_NODES; -	tipc_max_slaves = CONFIG_TIPC_SLAVE_NODES;  	tipc_net_id = 4711; -	if ((res = tipc_core_start())) -		err("Unable to start in single node mode\n"); +	sysctl_tipc_rmem[0] = TIPC_CONN_OVERLOAD_LIMIT >> 4 << +			      TIPC_LOW_IMPORTANCE; +	sysctl_tipc_rmem[1] = TIPC_CONN_OVERLOAD_LIMIT >> 4 << +			      TIPC_CRITICAL_IMPORTANCE; +	sysctl_tipc_rmem[2] = TIPC_CONN_OVERLOAD_LIMIT; + +	res = tipc_core_start(); +	if (res) +		pr_err("Unable to start in single node mode\n");  	else -		info("Started in single node mode\n"); +		pr_info("Started in single node mode\n");  	return res;  }  static void __exit tipc_exit(void)  { -	tipc_core_stop_net();  	tipc_core_stop(); -	info("Deactivated\n"); +	pr_info("Deactivated\n");  }  module_init(tipc_init);  | 
