diff options
Diffstat (limited to 'net/tipc/core.c')
| -rw-r--r-- | net/tipc/core.c | 159 | 
1 files changed, 51 insertions, 108 deletions
| diff --git a/net/tipc/core.c b/net/tipc/core.c index 3256bd7d398..e071579e085 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c @@ -34,39 +34,17 @@   * POSSIBILITY OF SUCH DAMAGE.   */ -#include <linux/init.h> -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/random.h> -  #include "core.h" -#include "dbg.h"  #include "ref.h" -#include "net.h" -#include "user_reg.h"  #include "name_table.h"  #include "subscr.h"  #include "config.h" -#define TIPC_MOD_VER "1.6.4" - -#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 @@ -87,10 +65,7 @@ const char tipc_alphabet[] =  /* 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; @@ -98,16 +73,35 @@ int tipc_net_id;  int tipc_remote_management; -int tipc_get_mode(void) +/** + * tipc_buf_acquire - creates a TIPC message buffer + * @size: message size (including TIPC header) + * + * Returns a new buffer with data pointers set to the specified size. + * + * 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)  { -	return tipc_mode; +	struct sk_buff *skb; +	unsigned int buf_size = (BUF_HEADROOM + size + 3) & ~3u; + +	skb = alloc_skb_fclone(buf_size, GFP_ATOMIC); +	if (skb) { +		skb_reserve(skb, BUF_HEADROOM); +		skb_put(skb, size); +		skb->next = NULL; +	} +	return skb;  }  /**   * tipc_core_stop_net - shut down TIPC networking sub-systems   */ -void tipc_core_stop_net(void) +static void tipc_core_stop_net(void)  {  	tipc_eth_media_stop();  	tipc_net_stop(); @@ -121,10 +115,11 @@ int tipc_core_start_net(unsigned long addr)  {  	int res; -	if ((res = tipc_net_start(addr)) || -	    (res = tipc_eth_media_start())) { +	res = tipc_net_start(addr); +	if (!res) +		res = tipc_eth_media_start(); +	if (res)  		tipc_core_stop_net(); -	}  	return res;  } @@ -132,7 +127,7 @@ int tipc_core_start_net(unsigned long addr)   * tipc_core_stop - switch TIPC from SINGLE NODE to NOT RUNNING mode   */ -void tipc_core_stop(void) +static void tipc_core_stop(void)  {  	if (tipc_mode != TIPC_NODE_MODE)  		return; @@ -143,17 +138,17 @@ void tipc_core_stop(void)  	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_core_start - switch TIPC from NOT RUNNING to SINGLE NODE mode   */ -int tipc_core_start(void) +static int tipc_core_start(void)  {  	int res; @@ -163,16 +158,22 @@ int tipc_core_start(void)  	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())) { +	res = tipc_handler_start(); +	if (!res) +		res = tipc_ref_table_init(tipc_max_ports, tipc_random); +	if (!res) +		res = tipc_nametbl_init(); +	if (!res) +		res = tipc_k_signal((Handler)tipc_subscr_start, 0); +	if (!res) +		res = tipc_k_signal((Handler)tipc_cfg_init, 0); +	if (!res) +		res = tipc_netlink_start(); +	if (!res) +		res = tipc_socket_init(); +	if (res)  		tipc_core_stop(); -	} +  	return res;  } @@ -181,7 +182,9 @@ static int __init tipc_init(void)  {  	int res; -	tipc_log_resize(CONFIG_TIPC_LOG); +	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"); @@ -189,14 +192,12 @@ static int __init tipc_init(void)  	tipc_remote_management = 1;  	tipc_max_publications = 10000;  	tipc_max_subscriptions = 2000; -	tipc_max_ports = delimit(CONFIG_TIPC_PORTS, 127, 65536); -	tipc_max_zones = delimit(CONFIG_TIPC_ZONES, 1, 255); -	tipc_max_clusters = delimit(CONFIG_TIPC_CLUSTERS, 1, 1); -	tipc_max_nodes = delimit(CONFIG_TIPC_NODES, 8, 2047); -	tipc_max_slaves = delimit(CONFIG_TIPC_SLAVE_NODES, 0, 2047); +	tipc_max_ports = CONFIG_TIPC_PORTS; +	tipc_max_nodes = CONFIG_TIPC_NODES;  	tipc_net_id = 4711; -	if ((res = tipc_core_start())) +	res = tipc_core_start(); +	if (res)  		err("Unable to start in single node mode\n");  	else  		info("Started in single node mode\n"); @@ -208,7 +209,6 @@ static void __exit tipc_exit(void)  	tipc_core_stop_net();  	tipc_core_stop();  	info("Deactivated\n"); -	tipc_log_resize(0);  }  module_init(tipc_init); @@ -217,60 +217,3 @@ module_exit(tipc_exit);  MODULE_DESCRIPTION("TIPC: Transparent Inter Process Communication");  MODULE_LICENSE("Dual BSD/GPL");  MODULE_VERSION(TIPC_MOD_VER); - -/* Native TIPC API for kernel-space applications (see tipc.h) */ - -EXPORT_SYMBOL(tipc_attach); -EXPORT_SYMBOL(tipc_detach); -EXPORT_SYMBOL(tipc_get_addr); -EXPORT_SYMBOL(tipc_get_mode); -EXPORT_SYMBOL(tipc_createport); -EXPORT_SYMBOL(tipc_deleteport); -EXPORT_SYMBOL(tipc_ownidentity); -EXPORT_SYMBOL(tipc_portimportance); -EXPORT_SYMBOL(tipc_set_portimportance); -EXPORT_SYMBOL(tipc_portunreliable); -EXPORT_SYMBOL(tipc_set_portunreliable); -EXPORT_SYMBOL(tipc_portunreturnable); -EXPORT_SYMBOL(tipc_set_portunreturnable); -EXPORT_SYMBOL(tipc_publish); -EXPORT_SYMBOL(tipc_withdraw); -EXPORT_SYMBOL(tipc_connect2port); -EXPORT_SYMBOL(tipc_disconnect); -EXPORT_SYMBOL(tipc_shutdown); -EXPORT_SYMBOL(tipc_isconnected); -EXPORT_SYMBOL(tipc_peer); -EXPORT_SYMBOL(tipc_ref_valid); -EXPORT_SYMBOL(tipc_send); -EXPORT_SYMBOL(tipc_send_buf); -EXPORT_SYMBOL(tipc_send2name); -EXPORT_SYMBOL(tipc_forward2name); -EXPORT_SYMBOL(tipc_send_buf2name); -EXPORT_SYMBOL(tipc_forward_buf2name); -EXPORT_SYMBOL(tipc_send2port); -EXPORT_SYMBOL(tipc_forward2port); -EXPORT_SYMBOL(tipc_send_buf2port); -EXPORT_SYMBOL(tipc_forward_buf2port); -EXPORT_SYMBOL(tipc_multicast); -/* EXPORT_SYMBOL(tipc_multicast_buf); not available yet */ -EXPORT_SYMBOL(tipc_ispublished); -EXPORT_SYMBOL(tipc_available_nodes); - -/* TIPC API for external bearers (see tipc_bearer.h) */ - -EXPORT_SYMBOL(tipc_block_bearer); -EXPORT_SYMBOL(tipc_continue); -EXPORT_SYMBOL(tipc_disable_bearer); -EXPORT_SYMBOL(tipc_enable_bearer); -EXPORT_SYMBOL(tipc_recv_msg); -EXPORT_SYMBOL(tipc_register_media); - -/* TIPC API for external APIs (see tipc_port.h) */ - -EXPORT_SYMBOL(tipc_createport_raw); -EXPORT_SYMBOL(tipc_reject_msg); -EXPORT_SYMBOL(tipc_send_buf_fast); -EXPORT_SYMBOL(tipc_acknowledge); -EXPORT_SYMBOL(tipc_get_port); -EXPORT_SYMBOL(tipc_get_handle); - | 
