[TIPC]: Improve response to requests for node/link information

Now allocates reply space for "get links" request based on number of actual
links, not number of potential links.  Also, limits reply to "get links" and
"get nodes" requests to 32KB to match capabilities of tipc-config utility
that issued request.

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Per Liden <per.liden@ericsson.com>
This commit is contained in:
Allan Stephens 2006-06-29 12:33:20 -07:00 committed by David S. Miller
parent e49060c7ca
commit ea13847b24
2 changed files with 18 additions and 10 deletions

View file

@ -2,7 +2,7 @@
* net/tipc/node.c: TIPC node management routines * net/tipc/node.c: TIPC node management routines
* *
* Copyright (c) 2000-2006, Ericsson AB * Copyright (c) 2000-2006, Ericsson AB
* Copyright (c) 2005, Wind River Systems * Copyright (c) 2005-2006, Wind River Systems
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -592,6 +592,7 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space)
struct sk_buff *buf; struct sk_buff *buf;
struct node *n_ptr; struct node *n_ptr;
struct tipc_node_info node_info; struct tipc_node_info node_info;
u32 payload_size;
if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR)) if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR))
return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
@ -608,8 +609,11 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space)
/* For now, get space for all other nodes /* For now, get space for all other nodes
(will need to modify this when slave nodes are supported */ (will need to modify this when slave nodes are supported */
buf = tipc_cfg_reply_alloc(TLV_SPACE(sizeof(node_info)) * payload_size = TLV_SPACE(sizeof(node_info)) * (tipc_max_nodes - 1);
(tipc_max_nodes - 1)); if (payload_size > 32768u)
return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
" (too many nodes)");
buf = tipc_cfg_reply_alloc(payload_size);
if (!buf) if (!buf)
return NULL; return NULL;
@ -633,6 +637,7 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space)
struct sk_buff *buf; struct sk_buff *buf;
struct node *n_ptr; struct node *n_ptr;
struct tipc_link_info link_info; struct tipc_link_info link_info;
u32 payload_size;
if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR)) if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR))
return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
@ -645,12 +650,15 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space)
if (!tipc_nodes) if (!tipc_nodes)
return tipc_cfg_reply_none(); return tipc_cfg_reply_none();
/* Get space for all unicast links + multicast link */
/* For now, get space for 2 links to all other nodes + bcast link payload_size = TLV_SPACE(sizeof(link_info)) *
(will need to modify this when slave nodes are supported */ (tipc_net.zones[tipc_zone(tipc_own_addr)]->links + 1);
if (payload_size > 32768u)
buf = tipc_cfg_reply_alloc(TLV_SPACE(sizeof(link_info)) * return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
(2 * (tipc_max_nodes - 1) + 1)); " (too many links)");
buf = tipc_cfg_reply_alloc(payload_size);
if (!buf) if (!buf)
return NULL; return NULL;

View file

@ -2,7 +2,7 @@
* net/tipc/zone.h: Include file for TIPC zone management routines * net/tipc/zone.h: Include file for TIPC zone management routines
* *
* Copyright (c) 2000-2006, Ericsson AB * Copyright (c) 2000-2006, Ericsson AB
* Copyright (c) 2005, Wind River Systems * Copyright (c) 2005-2006, Wind River Systems
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -45,7 +45,7 @@
* struct _zone - TIPC zone structure * struct _zone - TIPC zone structure
* @addr: network address of zone * @addr: network address of zone
* @clusters: array of pointers to all clusters within zone * @clusters: array of pointers to all clusters within zone
* @links: (used for inter-zone communication) * @links: number of (unicast) links to zone
*/ */
struct _zone { struct _zone {