core.c 5.8 KB
Newer Older
P
Per Liden 已提交
1 2 3
/*
 * net/tipc/core.c: TIPC module code
 *
P
Per Liden 已提交
4
 * Copyright (c) 2003-2006, Ericsson AB
5
 * Copyright (c) 2005-2006, Wind River Systems
P
Per Liden 已提交
6 7
 * All rights reserved.
 *
P
Per Liden 已提交
8
 * Redistribution and use in source and binary forms, with or without
P
Per Liden 已提交
9 10
 * modification, are permitted provided that the following conditions are met:
 *
P
Per Liden 已提交
11 12 13 14 15 16 17 18
 * 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.
P
Per Liden 已提交
19
 *
P
Per Liden 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32 33
 * 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
P
Per Liden 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
 * 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"


#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

/* 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);

77
const char tipc_alphabet[] =
78
	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.";
P
Per Liden 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92

/* configurable TIPC parameters */

u32 tipc_own_addr;
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;


93
/**
94
 * tipc_buf_acquire - creates a TIPC message buffer
95 96 97 98 99 100 101 102
 * @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.
 */

103
struct sk_buff *tipc_buf_acquire(u32 size)
104 105 106 107 108 109 110 111 112 113 114 115 116
{
	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;
}

P
Per Liden 已提交
117
/**
118
 * tipc_core_stop_net - shut down TIPC networking sub-systems
P
Per Liden 已提交
119 120
 */

121
static void tipc_core_stop_net(void)
P
Per Liden 已提交
122
{
123 124
	tipc_eth_media_stop();
	tipc_net_stop();
P
Per Liden 已提交
125 126 127 128 129 130
}

/**
 * start_net - start TIPC networking sub-systems
 */

131
int tipc_core_start_net(unsigned long addr)
P
Per Liden 已提交
132 133 134
{
	int res;

135
	if ((res = tipc_net_start(addr)) ||
136 137
	    (res = tipc_eth_media_start())) {
		tipc_core_stop_net();
P
Per Liden 已提交
138 139 140 141 142
	}
	return res;
}

/**
143
 * tipc_core_stop - switch TIPC from SINGLE NODE to NOT RUNNING mode
P
Per Liden 已提交
144 145
 */

146
static void tipc_core_stop(void)
P
Per Liden 已提交
147 148 149 150 151 152
{
	if (tipc_mode != TIPC_NODE_MODE)
		return;

	tipc_mode = TIPC_NOT_RUNNING;

153 154 155 156 157 158 159 160
	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();
161
	tipc_log_resize(0);
P
Per Liden 已提交
162 163 164
}

/**
165
 * tipc_core_start - switch TIPC from NOT RUNNING to SINGLE NODE mode
P
Per Liden 已提交
166 167
 */

168
static int tipc_core_start(void)
P
Per Liden 已提交
169 170 171 172 173 174 175 176 177
{
	int res;

	if (tipc_mode != TIPC_NOT_RUNNING)
		return -ENOPROTOOPT;

	get_random_bytes(&tipc_random, sizeof(tipc_random));
	tipc_mode = TIPC_NODE_MODE;

178
	if ((res = tipc_handler_start()) ||
179
	    (res = tipc_ref_table_init(tipc_max_ports, tipc_random)) ||
180 181
	    (res = tipc_reg_start()) ||
	    (res = tipc_nametbl_init()) ||
182 183
	    (res = tipc_k_signal((Handler)tipc_subscr_start, 0)) ||
	    (res = tipc_k_signal((Handler)tipc_cfg_init, 0)) ||
184 185 186
	    (res = tipc_netlink_start()) ||
	    (res = tipc_socket_init())) {
		tipc_core_stop();
P
Per Liden 已提交
187 188 189 190 191 192 193 194 195
	}
	return res;
}


static int __init tipc_init(void)
{
	int res;

196 197 198
	if (tipc_log_resize(CONFIG_TIPC_LOG) != 0)
		warn("Unable to create log buffer\n");

199
	info("Activated (version " TIPC_MOD_VER
200
	     " compiled " __DATE__ " " __TIME__ ")\n");
P
Per Liden 已提交
201 202 203 204 205

	tipc_own_addr = 0;
	tipc_remote_management = 1;
	tipc_max_publications = 10000;
	tipc_max_subscriptions = 2000;
206 207 208 209
	tipc_max_ports = CONFIG_TIPC_PORTS;
	tipc_max_clusters = CONFIG_TIPC_CLUSTERS;
	tipc_max_nodes = CONFIG_TIPC_NODES;
	tipc_max_slaves = CONFIG_TIPC_SLAVE_NODES;
P
Per Liden 已提交
210 211
	tipc_net_id = 4711;

212
	if ((res = tipc_core_start()))
P
Per Liden 已提交
213
		err("Unable to start in single node mode\n");
214
	else
P
Per Liden 已提交
215
		info("Started in single node mode\n");
216
	return res;
P
Per Liden 已提交
217 218 219 220
}

static void __exit tipc_exit(void)
{
221 222
	tipc_core_stop_net();
	tipc_core_stop();
P
Per Liden 已提交
223 224 225 226 227 228 229 230
	info("Deactivated\n");
}

module_init(tipc_init);
module_exit(tipc_exit);

MODULE_DESCRIPTION("TIPC: Transparent Inter Process Communication");
MODULE_LICENSE("Dual BSD/GPL");
231
MODULE_VERSION(TIPC_MOD_VER);