Commit 8f92df6a authored by Allan Stephens's avatar Allan Stephens Committed by David S. Miller

tipc: Remove prototype code for supporting multiple clusters

Eliminates routines, data structures, and files that were intended
to allow TIPC to support a network containing multiple clusters.
Currently, TIPC supports only networks consisting of a single cluster
within a single zone, so this code is unnecessary.
Signed-off-by: default avatarAllan Stephens <Allan.Stephens@windriver.com>
Signed-off-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 51a8e4de
...@@ -95,7 +95,7 @@ ...@@ -95,7 +95,7 @@
#define TIPC_CMD_GET_MAX_PUBL 0x4005 /* tx none, rx unsigned */ #define TIPC_CMD_GET_MAX_PUBL 0x4005 /* tx none, rx unsigned */
#define TIPC_CMD_GET_MAX_SUBSCR 0x4006 /* tx none, rx unsigned */ #define TIPC_CMD_GET_MAX_SUBSCR 0x4006 /* tx none, rx unsigned */
#define TIPC_CMD_GET_MAX_ZONES 0x4007 /* obsoleted */ #define TIPC_CMD_GET_MAX_ZONES 0x4007 /* obsoleted */
#define TIPC_CMD_GET_MAX_CLUSTERS 0x4008 /* tx none, rx unsigned */ #define TIPC_CMD_GET_MAX_CLUSTERS 0x4008 /* obsoleted */
#define TIPC_CMD_GET_MAX_NODES 0x4009 /* tx none, rx unsigned */ #define TIPC_CMD_GET_MAX_NODES 0x4009 /* tx none, rx unsigned */
#define TIPC_CMD_GET_MAX_SLAVES 0x400A /* obsoleted */ #define TIPC_CMD_GET_MAX_SLAVES 0x400A /* obsoleted */
#define TIPC_CMD_GET_NETID 0x400B /* tx none, rx unsigned */ #define TIPC_CMD_GET_NETID 0x400B /* tx none, rx unsigned */
...@@ -131,7 +131,7 @@ ...@@ -131,7 +131,7 @@
#define TIPC_CMD_SET_MAX_PUBL 0x8005 /* tx unsigned, rx none */ #define TIPC_CMD_SET_MAX_PUBL 0x8005 /* tx unsigned, rx none */
#define TIPC_CMD_SET_MAX_SUBSCR 0x8006 /* tx unsigned, rx none */ #define TIPC_CMD_SET_MAX_SUBSCR 0x8006 /* tx unsigned, rx none */
#define TIPC_CMD_SET_MAX_ZONES 0x8007 /* obsoleted */ #define TIPC_CMD_SET_MAX_ZONES 0x8007 /* obsoleted */
#define TIPC_CMD_SET_MAX_CLUSTERS 0x8008 /* tx unsigned, rx none */ #define TIPC_CMD_SET_MAX_CLUSTERS 0x8008 /* obsoleted */
#define TIPC_CMD_SET_MAX_NODES 0x8009 /* tx unsigned, rx none */ #define TIPC_CMD_SET_MAX_NODES 0x8009 /* tx unsigned, rx none */
#define TIPC_CMD_SET_MAX_SLAVES 0x800A /* obsoleted */ #define TIPC_CMD_SET_MAX_SLAVES 0x800A /* obsoleted */
#define TIPC_CMD_SET_NETID 0x800B /* tx unsigned, rx none */ #define TIPC_CMD_SET_NETID 0x800B /* tx unsigned, rx none */
......
...@@ -29,16 +29,6 @@ config TIPC_ADVANCED ...@@ -29,16 +29,6 @@ config TIPC_ADVANCED
Saying Y here will open some advanced configuration for TIPC. Saying Y here will open some advanced configuration for TIPC.
Most users do not need to bother; if unsure, just say N. Most users do not need to bother; if unsure, just say N.
config TIPC_CLUSTERS
int "Maximum number of clusters in a zone"
depends on TIPC_ADVANCED
range 1 1
default "1"
help
Specifies how many clusters can be supported in a TIPC zone.
*** Currently TIPC only supports a single cluster per zone. ***
config TIPC_NODES config TIPC_NODES
int "Maximum number of nodes in a cluster" int "Maximum number of nodes in a cluster"
depends on TIPC_ADVANCED depends on TIPC_ADVANCED
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
obj-$(CONFIG_TIPC) := tipc.o obj-$(CONFIG_TIPC) := tipc.o
tipc-y += addr.o bcast.o bearer.o config.o cluster.o \ tipc-y += addr.o bcast.o bearer.o config.o \
core.o handler.o link.o discover.o msg.o \ core.o handler.o link.o discover.o msg.o \
name_distr.o subscr.o name_table.o net.o \ name_distr.o subscr.o name_table.o net.o \
netlink.o node.o node_subscr.o port.o ref.o \ netlink.o node.o node_subscr.o port.o ref.o \
......
...@@ -35,7 +35,8 @@ ...@@ -35,7 +35,8 @@
*/ */
#include "core.h" #include "core.h"
#include "cluster.h" #include "node.h"
#include "addr.h"
/** /**
* tipc_addr_domain_valid - validates a network domain address * tipc_addr_domain_valid - validates a network domain address
...@@ -55,8 +56,6 @@ int tipc_addr_domain_valid(u32 addr) ...@@ -55,8 +56,6 @@ int tipc_addr_domain_valid(u32 addr)
if (n > max_nodes) if (n > max_nodes)
return 0; return 0;
if (c > tipc_max_clusters)
return 0;
if (n && (!z || !c)) if (n && (!z || !c))
return 0; return 0;
......
...@@ -111,6 +111,9 @@ static struct bclink *bclink = NULL; ...@@ -111,6 +111,9 @@ static struct bclink *bclink = NULL;
static struct link *bcl = NULL; static struct link *bcl = NULL;
static DEFINE_SPINLOCK(bc_lock); static DEFINE_SPINLOCK(bc_lock);
/* broadcast-capable node map */
struct tipc_node_map tipc_bcast_nmap;
const char tipc_bclink_name[] = "broadcast-link"; const char tipc_bclink_name[] = "broadcast-link";
static void tipc_nmap_diff(struct tipc_node_map *nm_a, static void tipc_nmap_diff(struct tipc_node_map *nm_a,
...@@ -566,8 +569,8 @@ static int tipc_bcbearer_send(struct sk_buff *buf, ...@@ -566,8 +569,8 @@ static int tipc_bcbearer_send(struct sk_buff *buf,
if (likely(!msg_non_seq(buf_msg(buf)))) { if (likely(!msg_non_seq(buf_msg(buf)))) {
struct tipc_msg *msg; struct tipc_msg *msg;
assert(tipc_cltr_bcast_nodes.count != 0); assert(tipc_bcast_nmap.count != 0);
bcbuf_set_acks(buf, tipc_cltr_bcast_nodes.count); bcbuf_set_acks(buf, tipc_bcast_nmap.count);
msg = buf_msg(buf); msg = buf_msg(buf);
msg_set_non_seq(msg, 1); msg_set_non_seq(msg, 1);
msg_set_mc_netid(msg, tipc_net_id); msg_set_mc_netid(msg, tipc_net_id);
...@@ -576,7 +579,7 @@ static int tipc_bcbearer_send(struct sk_buff *buf, ...@@ -576,7 +579,7 @@ static int tipc_bcbearer_send(struct sk_buff *buf,
/* Send buffer over bearers until all targets reached */ /* Send buffer over bearers until all targets reached */
bcbearer->remains = tipc_cltr_bcast_nodes; bcbearer->remains = tipc_bcast_nmap;
for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) { for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) {
struct bearer *p = bcbearer->bpairs[bp_index].primary; struct bearer *p = bcbearer->bpairs[bp_index].primary;
......
...@@ -51,6 +51,7 @@ struct tipc_node_map { ...@@ -51,6 +51,7 @@ struct tipc_node_map {
u32 map[MAX_NODES / WSIZE]; u32 map[MAX_NODES / WSIZE];
}; };
extern struct tipc_node_map tipc_bcast_nmap;
#define PLSIZE 32 #define PLSIZE 32
......
/*
* net/tipc/cluster.c: TIPC cluster management routines
*
* Copyright (c) 2000-2006, Ericsson AB
* Copyright (c) 2005, Wind River Systems
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the names of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "core.h"
#include "cluster.h"
#include "link.h"
struct tipc_node **tipc_local_nodes = NULL;
struct tipc_node_map tipc_cltr_bcast_nodes = {0,{0,}};
struct cluster *tipc_cltr_create(u32 addr)
{
struct cluster *c_ptr;
int max_nodes;
c_ptr = kzalloc(sizeof(*c_ptr), GFP_ATOMIC);
if (c_ptr == NULL) {
warn("Cluster creation failure, no memory\n");
return NULL;
}
c_ptr->addr = tipc_addr(tipc_zone(addr), tipc_cluster(addr), 0);
max_nodes = tipc_max_nodes + 1;
c_ptr->nodes = kcalloc(max_nodes + 1, sizeof(void*), GFP_ATOMIC);
if (c_ptr->nodes == NULL) {
warn("Cluster creation failure, no memory for node area\n");
kfree(c_ptr);
return NULL;
}
tipc_local_nodes = c_ptr->nodes;
c_ptr->highest_node = 0;
tipc_net.clusters[1] = c_ptr;
return c_ptr;
}
void tipc_cltr_delete(struct cluster *c_ptr)
{
u32 n_num;
if (!c_ptr)
return;
for (n_num = 1; n_num <= c_ptr->highest_node; n_num++) {
tipc_node_delete(c_ptr->nodes[n_num]);
}
kfree(c_ptr->nodes);
kfree(c_ptr);
}
void tipc_cltr_attach_node(struct cluster *c_ptr, struct tipc_node *n_ptr)
{
u32 n_num = tipc_node(n_ptr->addr);
u32 max_n_num = tipc_max_nodes;
assert(n_num > 0);
assert(n_num <= max_n_num);
assert(c_ptr->nodes[n_num] == NULL);
c_ptr->nodes[n_num] = n_ptr;
if (n_num > c_ptr->highest_node)
c_ptr->highest_node = n_num;
}
/**
* tipc_cltr_broadcast - broadcast message to all nodes within cluster
*/
void tipc_cltr_broadcast(struct sk_buff *buf)
{
struct sk_buff *buf_copy;
struct cluster *c_ptr;
struct tipc_node *n_ptr;
u32 n_num;
if (tipc_mode == TIPC_NET_MODE) {
c_ptr = tipc_cltr_find(tipc_own_addr);
/* Send to nodes */
for (n_num = 1; n_num <= c_ptr->highest_node; n_num++) {
n_ptr = c_ptr->nodes[n_num];
if (n_ptr && tipc_node_has_active_links(n_ptr)) {
buf_copy = skb_copy(buf, GFP_ATOMIC);
if (buf_copy == NULL)
goto exit;
msg_set_destnode(buf_msg(buf_copy),
n_ptr->addr);
tipc_link_send(buf_copy, n_ptr->addr,
n_ptr->addr);
}
}
}
exit:
buf_discard(buf);
}
int tipc_cltr_init(void)
{
return tipc_cltr_create(tipc_own_addr) ? 0 : -ENOMEM;
}
/*
* net/tipc/cluster.h: Include file for TIPC cluster management routines
*
* Copyright (c) 2000-2006, Ericsson AB
* Copyright (c) 2005, Wind River Systems
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the names of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _TIPC_CLUSTER_H
#define _TIPC_CLUSTER_H
#include "addr.h"
#include "net.h"
/**
* struct cluster - TIPC cluster structure
* @addr: network address of cluster
* @nodes: array of pointers to all nodes within cluster
* @highest_node: id of highest numbered node within cluster
*/
struct cluster {
u32 addr;
struct tipc_node **nodes;
u32 highest_node;
};
extern struct tipc_node **tipc_local_nodes;
extern struct tipc_node_map tipc_cltr_bcast_nodes;
struct cluster *tipc_cltr_create(u32 addr);
void tipc_cltr_delete(struct cluster *c_ptr);
void tipc_cltr_attach_node(struct cluster *c_ptr, struct tipc_node *n_ptr);
void tipc_cltr_broadcast(struct sk_buff *buf);
int tipc_cltr_init(void);
static inline struct cluster *tipc_cltr_find(u32 addr)
{
if (!in_own_cluster(addr))
return NULL;
return tipc_net.clusters[1];
}
#endif
...@@ -269,19 +269,6 @@ static struct sk_buff *cfg_set_max_ports(void) ...@@ -269,19 +269,6 @@ static struct sk_buff *cfg_set_max_ports(void)
return tipc_cfg_reply_none(); return tipc_cfg_reply_none();
} }
static struct sk_buff *cfg_set_max_clusters(void)
{
u32 value;
if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_UNSIGNED))
return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));
if (value != delimit(value, 1, 1))
return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE
" (max clusters fixed at 1)");
return tipc_cfg_reply_none();
}
static struct sk_buff *cfg_set_max_nodes(void) static struct sk_buff *cfg_set_max_nodes(void)
{ {
u32 value; u32 value;
...@@ -420,9 +407,6 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area ...@@ -420,9 +407,6 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area
case TIPC_CMD_SET_MAX_SUBSCR: case TIPC_CMD_SET_MAX_SUBSCR:
rep_tlv_buf = cfg_set_max_subscriptions(); rep_tlv_buf = cfg_set_max_subscriptions();
break; break;
case TIPC_CMD_SET_MAX_CLUSTERS:
rep_tlv_buf = cfg_set_max_clusters();
break;
case TIPC_CMD_SET_MAX_NODES: case TIPC_CMD_SET_MAX_NODES:
rep_tlv_buf = cfg_set_max_nodes(); rep_tlv_buf = cfg_set_max_nodes();
break; break;
...@@ -441,9 +425,6 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area ...@@ -441,9 +425,6 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area
case TIPC_CMD_GET_MAX_SUBSCR: case TIPC_CMD_GET_MAX_SUBSCR:
rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_subscriptions); rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_subscriptions);
break; break;
case TIPC_CMD_GET_MAX_CLUSTERS:
rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_clusters);
break;
case TIPC_CMD_GET_MAX_NODES: case TIPC_CMD_GET_MAX_NODES:
rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_nodes); rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_nodes);
break; break;
...@@ -458,6 +439,8 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area ...@@ -458,6 +439,8 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area
case TIPC_CMD_GET_MAX_ZONES: case TIPC_CMD_GET_MAX_ZONES:
case TIPC_CMD_SET_MAX_SLAVES: case TIPC_CMD_SET_MAX_SLAVES:
case TIPC_CMD_GET_MAX_SLAVES: case TIPC_CMD_GET_MAX_SLAVES:
case TIPC_CMD_SET_MAX_CLUSTERS:
case TIPC_CMD_GET_MAX_CLUSTERS:
rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
" (obsolete command)"); " (obsolete command)");
break; break;
......
...@@ -48,10 +48,6 @@ ...@@ -48,10 +48,6 @@
#include "config.h" #include "config.h"
#ifndef CONFIG_TIPC_CLUSTERS
#define CONFIG_TIPC_CLUSTERS 1
#endif
#ifndef CONFIG_TIPC_NODES #ifndef CONFIG_TIPC_NODES
#define CONFIG_TIPC_NODES 255 #define CONFIG_TIPC_NODES 255
#endif #endif
...@@ -76,7 +72,6 @@ const char tipc_alphabet[] = ...@@ -76,7 +72,6 @@ const char tipc_alphabet[] =
/* configurable TIPC parameters */ /* configurable TIPC parameters */
u32 tipc_own_addr; u32 tipc_own_addr;
int tipc_max_clusters;
int tipc_max_nodes; int tipc_max_nodes;
int tipc_max_ports; int tipc_max_ports;
int tipc_max_subscriptions; int tipc_max_subscriptions;
...@@ -199,7 +194,6 @@ static int __init tipc_init(void) ...@@ -199,7 +194,6 @@ static int __init tipc_init(void)
tipc_max_publications = 10000; tipc_max_publications = 10000;
tipc_max_subscriptions = 2000; tipc_max_subscriptions = 2000;
tipc_max_ports = CONFIG_TIPC_PORTS; tipc_max_ports = CONFIG_TIPC_PORTS;
tipc_max_clusters = CONFIG_TIPC_CLUSTERS;
tipc_max_nodes = CONFIG_TIPC_NODES; tipc_max_nodes = CONFIG_TIPC_NODES;
tipc_net_id = 4711; tipc_net_id = 4711;
......
...@@ -184,7 +184,6 @@ void tipc_dump_dbg(struct print_buf *, const char *fmt, ...); ...@@ -184,7 +184,6 @@ void tipc_dump_dbg(struct print_buf *, const char *fmt, ...);
*/ */
extern u32 tipc_own_addr; extern u32 tipc_own_addr;
extern int tipc_max_clusters;
extern int tipc_max_nodes; extern int tipc_max_nodes;
extern int tipc_max_ports; extern int tipc_max_ports;
extern int tipc_max_subscriptions; extern int tipc_max_subscriptions;
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
*/ */
#include "core.h" #include "core.h"
#include "cluster.h" #include "addr.h"
#include "link.h" #include "link.h"
#include "name_distr.h" #include "name_distr.h"
...@@ -107,6 +107,26 @@ static struct sk_buff *named_prepare_buf(u32 type, u32 size, u32 dest) ...@@ -107,6 +107,26 @@ static struct sk_buff *named_prepare_buf(u32 type, u32 size, u32 dest)
return buf; return buf;
} }
static void named_cluster_distribute(struct sk_buff *buf)
{
struct sk_buff *buf_copy;
struct tipc_node *n_ptr;
u32 n_num;
for (n_num = 1; n_num <= tipc_net.highest_node; n_num++) {
n_ptr = tipc_net.nodes[n_num];
if (n_ptr && tipc_node_has_active_links(n_ptr)) {
buf_copy = skb_copy(buf, GFP_ATOMIC);
if (!buf_copy)
break;
msg_set_destnode(buf_msg(buf_copy), n_ptr->addr);
tipc_link_send(buf_copy, n_ptr->addr, n_ptr->addr);
}
}
buf_discard(buf);
}
/** /**
* tipc_named_publish - tell other nodes about a new publication by this node * tipc_named_publish - tell other nodes about a new publication by this node
*/ */
...@@ -127,8 +147,8 @@ void tipc_named_publish(struct publication *publ) ...@@ -127,8 +147,8 @@ void tipc_named_publish(struct publication *publ)
item = (struct distr_item *)msg_data(buf_msg(buf)); item = (struct distr_item *)msg_data(buf_msg(buf));
publ_to_item(item, publ); publ_to_item(item, publ);
dbg("tipc_named_withdraw: broadcasting publish msg\n"); dbg("tipc_named_publish: broadcasting publish msg\n");
tipc_cltr_broadcast(buf); named_cluster_distribute(buf);
} }
/** /**
...@@ -152,7 +172,7 @@ void tipc_named_withdraw(struct publication *publ) ...@@ -152,7 +172,7 @@ void tipc_named_withdraw(struct publication *publ)
item = (struct distr_item *)msg_data(buf_msg(buf)); item = (struct distr_item *)msg_data(buf_msg(buf));
publ_to_item(item, publ); publ_to_item(item, publ);
dbg("tipc_named_withdraw: broadcasting withdraw msg\n"); dbg("tipc_named_withdraw: broadcasting withdraw msg\n");
tipc_cltr_broadcast(buf); named_cluster_distribute(buf);
} }
/** /**
......
...@@ -112,12 +112,23 @@ ...@@ -112,12 +112,23 @@
DEFINE_RWLOCK(tipc_net_lock); DEFINE_RWLOCK(tipc_net_lock);
struct network tipc_net; struct network tipc_net;
static int net_start(void)
{
tipc_net.nodes = kcalloc(tipc_max_nodes + 1,
sizeof(*tipc_net.nodes), GFP_ATOMIC);
tipc_net.highest_node = 0;
return tipc_net.nodes ? 0 : -ENOMEM;
}
static void net_stop(void) static void net_stop(void)
{ {
u32 c_num; u32 n_num;
for (c_num = 1; c_num <= tipc_max_clusters; c_num++) for (n_num = 1; n_num <= tipc_net.highest_node; n_num++)
tipc_cltr_delete(tipc_net.clusters[c_num]); tipc_node_delete(tipc_net.nodes[n_num]);
kfree(tipc_net.nodes);
tipc_net.nodes = NULL;
} }
static void net_route_named_msg(struct sk_buff *buf) static void net_route_named_msg(struct sk_buff *buf)
...@@ -218,10 +229,12 @@ int tipc_net_start(u32 addr) ...@@ -218,10 +229,12 @@ int tipc_net_start(u32 addr)
tipc_named_reinit(); tipc_named_reinit();
tipc_port_reinit(); tipc_port_reinit();
if ((res = tipc_cltr_init()) || res = net_start();
(res = tipc_bclink_init())) { if (res)
return res;
res = tipc_bclink_init();
if (res)
return res; return res;
}
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);
......
...@@ -37,16 +37,18 @@ ...@@ -37,16 +37,18 @@
#ifndef _TIPC_NET_H #ifndef _TIPC_NET_H
#define _TIPC_NET_H #define _TIPC_NET_H
struct cluster; struct tipc_node;
/** /**
* struct network - TIPC network structure * struct network - TIPC network structure
* @clusters: array of pointers to all clusters within zone * @nodes: array of pointers to all nodes within cluster
* @highest_node: id of highest numbered node within cluster
* @links: number of (unicast) links to cluster * @links: number of (unicast) links to cluster
*/ */
struct network { struct network {
struct cluster *clusters[2]; /* currently limited to just 1 cluster */ struct tipc_node **nodes;
u32 highest_node;
u32 links; u32 links;
}; };
......
...@@ -62,9 +62,9 @@ u32 tipc_own_tag = 0; ...@@ -62,9 +62,9 @@ u32 tipc_own_tag = 0;
struct tipc_node *tipc_node_create(u32 addr) struct tipc_node *tipc_node_create(u32 addr)
{ {
struct cluster *c_ptr;
struct tipc_node *n_ptr; struct tipc_node *n_ptr;
struct tipc_node **curr_node; struct tipc_node **curr_node;
u32 n_num;
spin_lock_bh(&node_create_lock); spin_lock_bh(&node_create_lock);
...@@ -84,21 +84,14 @@ struct tipc_node *tipc_node_create(u32 addr) ...@@ -84,21 +84,14 @@ struct tipc_node *tipc_node_create(u32 addr)
return NULL; return NULL;
} }
c_ptr = tipc_cltr_find(addr);
if (!c_ptr) {
c_ptr = tipc_cltr_create(addr);
}
if (!c_ptr) {
spin_unlock_bh(&node_create_lock);
kfree(n_ptr);
return NULL;
}
n_ptr->addr = addr; n_ptr->addr = addr;
spin_lock_init(&n_ptr->lock); spin_lock_init(&n_ptr->lock);
INIT_LIST_HEAD(&n_ptr->nsub); INIT_LIST_HEAD(&n_ptr->nsub);
n_ptr->owner = c_ptr;
tipc_cltr_attach_node(c_ptr, n_ptr); n_num = tipc_node(addr);
tipc_net.nodes[n_num] = n_ptr;
if (n_num > tipc_net.highest_node)
tipc_net.highest_node = n_num;
/* Insert node into ordered list */ /* Insert node into ordered list */
for (curr_node = &tipc_nodes; *curr_node; for (curr_node = &tipc_nodes; *curr_node;
...@@ -115,11 +108,19 @@ struct tipc_node *tipc_node_create(u32 addr) ...@@ -115,11 +108,19 @@ struct tipc_node *tipc_node_create(u32 addr)
void tipc_node_delete(struct tipc_node *n_ptr) void tipc_node_delete(struct tipc_node *n_ptr)
{ {
u32 n_num;
if (!n_ptr) if (!n_ptr)
return; return;
dbg("node %x deleted\n", n_ptr->addr); dbg("node %x deleted\n", n_ptr->addr);
n_num = tipc_node(n_ptr->addr);
tipc_net.nodes[n_num] = NULL;
kfree(n_ptr); kfree(n_ptr);
while (!tipc_net.nodes[tipc_net.highest_node])
if (--tipc_net.highest_node == 0)
break;
} }
...@@ -324,7 +325,7 @@ static void node_established_contact(struct tipc_node *n_ptr) ...@@ -324,7 +325,7 @@ static void node_established_contact(struct tipc_node *n_ptr)
n_ptr->bclink.acked = tipc_bclink_get_last_sent(); n_ptr->bclink.acked = tipc_bclink_get_last_sent();
if (n_ptr->bclink.supported) { if (n_ptr->bclink.supported) {
tipc_nmap_add(&tipc_cltr_bcast_nodes, n_ptr->addr); tipc_nmap_add(&tipc_bcast_nmap, n_ptr->addr);
if (n_ptr->addr < tipc_own_addr) if (n_ptr->addr < tipc_own_addr)
tipc_own_tag++; tipc_own_tag++;
} }
...@@ -361,13 +362,11 @@ static void node_lost_contact(struct tipc_node *n_ptr) ...@@ -361,13 +362,11 @@ static void node_lost_contact(struct tipc_node *n_ptr)
buf_discard(n_ptr->bclink.defragm); buf_discard(n_ptr->bclink.defragm);
n_ptr->bclink.defragm = NULL; n_ptr->bclink.defragm = NULL;
} }
if (in_own_cluster(n_ptr->addr) && n_ptr->bclink.supported) {
tipc_bclink_acknowledge(n_ptr, mod(n_ptr->bclink.acked + 10000));
}
/* Update routing tables */
if (n_ptr->bclink.supported) { if (n_ptr->bclink.supported) {
tipc_nmap_remove(&tipc_cltr_bcast_nodes, n_ptr->addr); tipc_bclink_acknowledge(n_ptr,
mod(n_ptr->bclink.acked + 10000));
tipc_nmap_remove(&tipc_bcast_nmap, n_ptr->addr);
if (n_ptr->addr < tipc_own_addr) if (n_ptr->addr < tipc_own_addr)
tipc_own_tag--; tipc_own_tag--;
} }
......
...@@ -38,14 +38,14 @@ ...@@ -38,14 +38,14 @@
#define _TIPC_NODE_H #define _TIPC_NODE_H
#include "node_subscr.h" #include "node_subscr.h"
#include "cluster.h" #include "addr.h"
#include "net.h"
#include "bearer.h" #include "bearer.h"
/** /**
* struct tipc_node - TIPC node structure * struct tipc_node - TIPC node structure
* @addr: network address of node * @addr: network address of node
* @lock: spinlock governing access to structure * @lock: spinlock governing access to structure
* @owner: pointer to cluster that node belongs to
* @next: pointer to next node in sorted list of cluster's nodes * @next: pointer to next node in sorted list of cluster's nodes
* @nsub: list of "node down" subscriptions monitoring node * @nsub: list of "node down" subscriptions monitoring node
* @active_links: pointers to active links to node * @active_links: pointers to active links to node
...@@ -69,7 +69,6 @@ ...@@ -69,7 +69,6 @@
struct tipc_node { struct tipc_node {
u32 addr; u32 addr;
spinlock_t lock; spinlock_t lock;
struct cluster *owner;
struct tipc_node *next; struct tipc_node *next;
struct list_head nsub; struct list_head nsub;
struct link *active_links[2]; struct link *active_links[2];
...@@ -108,7 +107,7 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space) ...@@ -108,7 +107,7 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space)
static inline struct tipc_node *tipc_node_find(u32 addr) static inline struct tipc_node *tipc_node_find(u32 addr)
{ {
if (likely(in_own_cluster(addr))) if (likely(in_own_cluster(addr)))
return tipc_local_nodes[tipc_node(addr)]; return tipc_net.nodes[tipc_node(addr)];
return NULL; return NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment