diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/Kconfig | 75 | ||||
| -rw-r--r-- | net/tipc/bearer.c | 37 | ||||
| -rw-r--r-- | net/tipc/bearer.h | 2 | ||||
| -rw-r--r-- | net/tipc/core.c | 10 | ||||
| -rw-r--r-- | net/tipc/core.h | 1 | ||||
| -rw-r--r-- | net/tipc/eth_media.c | 1 | ||||
| -rw-r--r-- | net/tipc/link.c | 9 | ||||
| -rw-r--r-- | net/tipc/net.c | 25 | ||||
| -rw-r--r-- | net/tipc/ref.c | 26 | ||||
| -rw-r--r-- | net/tipc/socket.c | 8 | ||||
| -rw-r--r-- | net/tipc/subscr.c | 57 | ||||
| -rw-r--r-- | net/tipc/subscr.h | 2 | 
12 files changed, 100 insertions, 153 deletions
| diff --git a/net/tipc/Kconfig b/net/tipc/Kconfig index 3b30d1130b6..b74f78d0c03 100644 --- a/net/tipc/Kconfig +++ b/net/tipc/Kconfig @@ -10,7 +10,7 @@ menuconfig TIPC  	  specially designed for intra cluster communication. This protocol  	  originates from Ericsson where it has been used in carrier grade  	  cluster applications for many years. -	 +  	  For more information about TIPC, see http://tipc.sourceforge.net.  	  This protocol support is also available as a module ( = code which @@ -23,91 +23,76 @@ menuconfig TIPC  if TIPC  config TIPC_ADVANCED -	bool "TIPC: Advanced configuration" +	bool "Advanced TIPC configuration"  	default n  	help -	  Saying Y here will open some advanced configuration -          for TIPC. Most users do not need to bother, so if -          unsure, just say N. +	  Saying Y here will open some advanced configuration for TIPC. +	  Most users do not need to bother; if unsure, just say N.  config TIPC_ZONES -	int "Maximum number of zones in network" +	int "Maximum number of zones in a network"  	depends on TIPC_ADVANCED +	range 1 255  	default "3"  	help -	 Max number of zones inside TIPC network. Max supported value  -         is 255 zones, minimum is 1 +	  Specifies how many zones can be supported in a TIPC network. +	  Can range from 1 to 255 zones; default is 3. -	 Default is 3 zones in a network; setting this to higher -	 allows more zones but might use more memory. +	  Setting this to a smaller value saves some memory; +	  setting it to a higher value allows for more zones.  config TIPC_CLUSTERS  	int "Maximum number of clusters in a zone"  	depends on TIPC_ADVANCED +	range 1 1  	default "1"  	help -          ***Only 1 (one cluster in a zone) is supported by current code. -          Any value set here will be overridden.*** - -          (Max number of clusters inside TIPC zone. Max supported  -          value is 4095 clusters, minimum is 1. +	  Specifies how many clusters can be supported in a TIPC zone. -	  Default is 1; setting this to smaller value might save  -          some memory, setting it to higher -	  allows more clusters and might consume more memory.) +	  *** Currently TIPC only supports a single cluster per zone. ***  config TIPC_NODES -	int "Maximum number of nodes in cluster" +	int "Maximum number of nodes in a cluster"  	depends on TIPC_ADVANCED +	range 8 2047  	default "255"  	help -	  Maximum number of nodes inside a TIPC cluster. Maximum  -          supported value is 2047 nodes, minimum is 8.  - -	  Setting this to a smaller value saves some memory,  -	  setting it to higher allows more nodes. - -config TIPC_SLAVE_NODES -	int "Maximum number of slave nodes in cluster" -	depends on TIPC_ADVANCED -	default "0" -	help -          ***This capability is not supported by current code.*** -	   -	  Maximum number of slave nodes inside a TIPC cluster. Maximum  -          supported value is 2047 nodes, minimum is 0.  +	  Specifies how many nodes can be supported in a TIPC cluster. +	  Can range from 8 to 2047 nodes; default is 255. -	  Setting this to a smaller value saves some memory,  -	  setting it to higher allows more nodes. +	  Setting this to a smaller value saves some memory; +	  setting it to higher allows for more nodes.  config TIPC_PORTS  	int "Maximum number of ports in a node"  	depends on TIPC_ADVANCED +	range 127 65535  	default "8191"  	help -	  Maximum number of ports within a node. Maximum  -          supported value is 64535 nodes, minimum is 127.  +	  Specifies how many ports can be supported by a node. +	  Can range from 127 to 65535 ports; default is 8191.  	  Setting this to a smaller value saves some memory,  -	  setting it to higher allows more ports. +	  setting it to higher allows for more ports.  config TIPC_LOG  	int "Size of log buffer"  	depends on TIPC_ADVANCED -	default 0 +	range 0 32768 +	default "0"  	help - 	  Size (in bytes) of TIPC's internal log buffer, which records the -	  occurrence of significant events.  Maximum supported value -	  is 32768 bytes, minimum is 0. +	  Size (in bytes) of TIPC's internal log buffer, which records the +	  occurrence of significant events.  Can range from 0 to 32768 bytes; +	  default is 0.  	  There is no need to enable the log buffer unless the node will be  	  managed remotely via TIPC.  config TIPC_DEBUG -	bool "Enable debugging support" +	bool "Enable debug messages"  	default n  	help - 	  This will enable debugging of TIPC. +	  This enables debugging of TIPC.  	  Only say Y here if you are having trouble with TIPC.  It will  	  enable the display of detailed information about what is going on. diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index 327011fcc40..78091375ca1 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c @@ -45,10 +45,10 @@  #define MAX_ADDR_STR 32 -static struct media *media_list = NULL; +static struct media media_list[MAX_MEDIA];  static u32 media_count = 0; -struct bearer *tipc_bearers = NULL; +struct bearer tipc_bearers[MAX_BEARERS];  /**   * media_name_valid - validate media name @@ -108,9 +108,11 @@ int  tipc_register_media(u32 media_type,  	int res = -EINVAL;  	write_lock_bh(&tipc_net_lock); -	if (!media_list) -		goto exit; +	if (tipc_mode != TIPC_NET_MODE) { +		warn("Media <%s> rejected, not in networked mode yet\n", name); +		goto exit; +	}  	if (!media_name_valid(name)) {  		warn("Media <%s> rejected, illegal name\n", name);  		goto exit; @@ -660,33 +662,10 @@ int tipc_disable_bearer(const char *name) -int tipc_bearer_init(void) -{ -	int res; - -	write_lock_bh(&tipc_net_lock); -	tipc_bearers = kcalloc(MAX_BEARERS, sizeof(struct bearer), GFP_ATOMIC); -	media_list = kcalloc(MAX_MEDIA, sizeof(struct media), GFP_ATOMIC); -	if (tipc_bearers && media_list) { -		res = 0; -	} else { -		kfree(tipc_bearers); -		kfree(media_list); -		tipc_bearers = NULL; -		media_list = NULL; -		res = -ENOMEM; -	} -	write_unlock_bh(&tipc_net_lock); -	return res; -} -  void tipc_bearer_stop(void)  {  	u32 i; -	if (!tipc_bearers) -		return; -  	for (i = 0; i < MAX_BEARERS; i++) {  		if (tipc_bearers[i].active)  			tipc_bearers[i].publ.blocked = 1; @@ -695,10 +674,6 @@ void tipc_bearer_stop(void)  		if (tipc_bearers[i].active)  			bearer_disable(tipc_bearers[i].publ.name);  	} -	kfree(tipc_bearers); -	kfree(media_list); -	tipc_bearers = NULL; -	media_list = NULL;  	media_count = 0;  } diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h index ca573489271..000228e93f9 100644 --- a/net/tipc/bearer.h +++ b/net/tipc/bearer.h @@ -114,7 +114,7 @@ struct bearer_name {  struct link; -extern struct bearer *tipc_bearers; +extern struct bearer tipc_bearers[];  void tipc_media_addr_printf(struct print_buf *pb, struct tipc_media_addr *a);  struct sk_buff *tipc_media_get_names(void); diff --git a/net/tipc/core.c b/net/tipc/core.c index 3256bd7d398..52c571fedbe 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c @@ -189,11 +189,11 @@ 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_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())) diff --git a/net/tipc/core.h b/net/tipc/core.h index a881f92a853..c58a1d16563 100644 --- a/net/tipc/core.h +++ b/net/tipc/core.h @@ -56,6 +56,7 @@  #include <linux/netdevice.h>  #include <linux/in.h>  #include <linux/list.h> +#include <linux/slab.h>  #include <linux/vmalloc.h>  /* diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c index 524ba5696d4..6230d16020c 100644 --- a/net/tipc/eth_media.c +++ b/net/tipc/eth_media.c @@ -38,6 +38,7 @@  #include <net/tipc/tipc_bearer.h>  #include <net/tipc/tipc_msg.h>  #include <linux/netdevice.h> +#include <linux/slab.h>  #include <net/net_namespace.h>  #define MAX_ETH_BEARERS		2 diff --git a/net/tipc/link.c b/net/tipc/link.c index 6f50f6423f6..1a7e4665af8 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c @@ -1882,6 +1882,15 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr)  			     (msg_destnode(msg) != tipc_own_addr)))  			goto cont; +		/* Discard non-routeable messages destined for another node */ + +		if (unlikely(!msg_isdata(msg) && +			     (msg_destnode(msg) != tipc_own_addr))) { +			if ((msg_user(msg) != CONN_MANAGER) && +			    (msg_user(msg) != MSG_FRAGMENTER)) +				goto cont; +		} +  		/* Locate unicast link endpoint that should handle message */  		n_ptr = tipc_node_find(msg_prevnode(msg)); diff --git a/net/tipc/net.c b/net/tipc/net.c index 7906608bf51..f25b1cdb64e 100644 --- a/net/tipc/net.c +++ b/net/tipc/net.c @@ -116,7 +116,8 @@  */  DEFINE_RWLOCK(tipc_net_lock); -struct network tipc_net = { NULL }; +struct _zone *tipc_zones[256] = { NULL, }; +struct network tipc_net = { tipc_zones };  struct tipc_node *tipc_net_select_remote_node(u32 addr, u32 ref)  { @@ -158,28 +159,12 @@ void tipc_net_send_external_routes(u32 dest)  	}  } -static int net_init(void) -{ -	memset(&tipc_net, 0, sizeof(tipc_net)); -	tipc_net.zones = kcalloc(tipc_max_zones + 1, sizeof(struct _zone *), GFP_ATOMIC); -	if (!tipc_net.zones) { -		return -ENOMEM; -	} -	return 0; -} -  static void net_stop(void)  {  	u32 z_num; -	if (!tipc_net.zones) -		return; - -	for (z_num = 1; z_num <= tipc_max_zones; z_num++) { +	for (z_num = 1; z_num <= tipc_max_zones; z_num++)  		tipc_zone_delete(tipc_net.zones[z_num]); -	} -	kfree(tipc_net.zones); -	tipc_net.zones = NULL;  }  static void net_route_named_msg(struct sk_buff *buf) @@ -282,9 +267,7 @@ int tipc_net_start(u32 addr)  	tipc_named_reinit();  	tipc_port_reinit(); -	if ((res = tipc_bearer_init()) || -	    (res = net_init()) || -	    (res = tipc_cltr_init()) || +	if ((res = tipc_cltr_init()) ||  	    (res = tipc_bclink_init())) {  		return res;  	} diff --git a/net/tipc/ref.c b/net/tipc/ref.c index 414fc34b8be..8dea66500cf 100644 --- a/net/tipc/ref.c +++ b/net/tipc/ref.c @@ -153,11 +153,11 @@ void tipc_ref_table_stop(void)  u32 tipc_ref_acquire(void *object, spinlock_t **lock)  { -	struct reference *entry;  	u32 index;  	u32 index_mask;  	u32 next_plus_upper;  	u32 ref; +	struct reference *entry = NULL;  	if (!object) {  		err("Attempt to acquire reference to non-existent object\n"); @@ -175,30 +175,36 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock)  		index = tipc_ref_table.first_free;  		entry = &(tipc_ref_table.entries[index]);  		index_mask = tipc_ref_table.index_mask; -		/* take lock in case a previous user of entry still holds it */ -		spin_lock_bh(&entry->lock);  		next_plus_upper = entry->ref;  		tipc_ref_table.first_free = next_plus_upper & index_mask;  		ref = (next_plus_upper & ~index_mask) + index; -		entry->ref = ref; -		entry->object = object; -		*lock = &entry->lock;  	}  	else if (tipc_ref_table.init_point < tipc_ref_table.capacity) {  		index = tipc_ref_table.init_point++;  		entry = &(tipc_ref_table.entries[index]);  		spin_lock_init(&entry->lock); -		spin_lock_bh(&entry->lock);  		ref = tipc_ref_table.start_mask + index; -		entry->ref = ref; -		entry->object = object; -		*lock = &entry->lock;  	}  	else {  		ref = 0;  	}  	write_unlock_bh(&ref_table_lock); +	/* +	 * Grab the lock so no one else can modify this entry +	 * While we assign its ref value & object pointer +	 */ +	if (entry) { +		spin_lock_bh(&entry->lock); +		entry->ref = ref; +		entry->object = object; +		*lock = &entry->lock; +		/* +		 * keep it locked, the caller is responsible +		 * for unlocking this when they're done with it +		 */ +	} +  	return ref;  } diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 1ea64f09cc4..cfb20b80b3a 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -40,9 +40,9 @@  #include <linux/socket.h>  #include <linux/errno.h>  #include <linux/mm.h> -#include <linux/slab.h>  #include <linux/poll.h>  #include <linux/fcntl.h> +#include <linux/gfp.h>  #include <asm/string.h>  #include <asm/atomic.h>  #include <net/sock.h> @@ -1322,8 +1322,10 @@ static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf)  	if (!sock_owned_by_user(sk)) {  		res = filter_rcv(sk, buf);  	} else { -		sk_add_backlog(sk, buf); -		res = TIPC_OK; +		if (sk_add_backlog(sk, buf)) +			res = TIPC_ERR_OVERLOAD; +		else +			res = TIPC_OK;  	}  	bh_unlock_sock(sk); diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c index ac91f0dfa14..ff123e56114 100644 --- a/net/tipc/subscr.c +++ b/net/tipc/subscr.c @@ -76,19 +76,6 @@ struct top_srv {  static struct top_srv topsrv = { 0 };  /** - * htohl - convert value to endianness used by destination - * @in: value to convert - * @swap: non-zero if endianness must be reversed - * - * Returns converted value - */ - -static u32 htohl(u32 in, int swap) -{ -	return swap ? swab32(in) : in; -} - -/**   * subscr_send_event - send a message containing a tipc_event to the subscriber   *   * Note: Must not hold subscriber's server port lock, since tipc_send() will @@ -107,11 +94,11 @@ static void subscr_send_event(struct subscription *sub,  	msg_sect.iov_base = (void *)&sub->evt;  	msg_sect.iov_len = sizeof(struct tipc_event); -	sub->evt.event = htohl(event, sub->swap); -	sub->evt.found_lower = htohl(found_lower, sub->swap); -	sub->evt.found_upper = htohl(found_upper, sub->swap); -	sub->evt.port.ref = htohl(port_ref, sub->swap); -	sub->evt.port.node = htohl(node, sub->swap); +	sub->evt.event = htonl(event); +	sub->evt.found_lower = htonl(found_lower); +	sub->evt.found_upper = htonl(found_upper); +	sub->evt.port.ref = htonl(port_ref); +	sub->evt.port.node = htonl(node);  	tipc_send(sub->server_ref, 1, &msg_sect);  } @@ -287,16 +274,23 @@ static void subscr_cancel(struct tipc_subscr *s,  {  	struct subscription *sub;  	struct subscription *sub_temp; +	__u32 type, lower, upper;  	int found = 0;  	/* Find first matching subscription, exit if not found */ +	type = ntohl(s->seq.type); +	lower = ntohl(s->seq.lower); +	upper = ntohl(s->seq.upper); +  	list_for_each_entry_safe(sub, sub_temp, &subscriber->subscription_list,  				 subscription_list) { -		if (!memcmp(s, &sub->evt.s, sizeof(struct tipc_subscr))) { -			found = 1; -			break; -		} +			if ((type == sub->seq.type) && +			    (lower == sub->seq.lower) && +			    (upper == sub->seq.upper)) { +				found = 1; +				break; +			}  	}  	if (!found)  		return; @@ -325,16 +319,10 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s,  					     struct subscriber *subscriber)  {  	struct subscription *sub; -	int swap; - -	/* Determine subscriber's endianness */ - -	swap = !(s->filter & (TIPC_SUB_PORTS | TIPC_SUB_SERVICE));  	/* Detect & process a subscription cancellation request */ -	if (s->filter & htohl(TIPC_SUB_CANCEL, swap)) { -		s->filter &= ~htohl(TIPC_SUB_CANCEL, swap); +	if (ntohl(s->filter) & TIPC_SUB_CANCEL) {  		subscr_cancel(s, subscriber);  		return NULL;  	} @@ -359,11 +347,11 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s,  	/* Initialize subscription object */ -	sub->seq.type = htohl(s->seq.type, swap); -	sub->seq.lower = htohl(s->seq.lower, swap); -	sub->seq.upper = htohl(s->seq.upper, swap); -	sub->timeout = htohl(s->timeout, swap); -	sub->filter = htohl(s->filter, swap); +	sub->seq.type = ntohl(s->seq.type); +	sub->seq.lower = ntohl(s->seq.lower); +	sub->seq.upper = ntohl(s->seq.upper); +	sub->timeout = ntohl(s->timeout); +	sub->filter = ntohl(s->filter);  	if ((!(sub->filter & TIPC_SUB_PORTS) ==  	     !(sub->filter & TIPC_SUB_SERVICE)) ||  	    (sub->seq.lower > sub->seq.upper)) { @@ -376,7 +364,6 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s,  	INIT_LIST_HEAD(&sub->nameseq_list);  	list_add(&sub->subscription_list, &subscriber->subscription_list);  	sub->server_ref = subscriber->port_ref; -	sub->swap = swap;  	memcpy(&sub->evt.s, s, sizeof(struct tipc_subscr));  	atomic_inc(&topsrv.subscription_count);  	if (sub->timeout != TIPC_WAIT_FOREVER) { diff --git a/net/tipc/subscr.h b/net/tipc/subscr.h index 45d89bf4d20..c20f496d95b 100644 --- a/net/tipc/subscr.h +++ b/net/tipc/subscr.h @@ -53,7 +53,6 @@ typedef void (*tipc_subscr_event) (struct subscription *sub,   * @nameseq_list: adjacent subscriptions in name sequence's subscription list   * @subscription_list: adjacent subscriptions in subscriber's subscription list   * @server_ref: object reference of server port associated with subscription - * @swap: indicates if subscriber uses opposite endianness in its messages   * @evt: template for events generated by subscription   */ @@ -66,7 +65,6 @@ struct subscription {  	struct list_head nameseq_list;  	struct list_head subscription_list;  	u32 server_ref; -	int swap;  	struct tipc_event evt;  }; | 
