diff options
author | Per Liden <per.liden@nospam.ericsson.com> | 2006-01-02 13:04:38 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-01-12 17:06:31 -0500 |
commit | b97bf3fd8f6a16966d4f18983b2c40993ff937d4 (patch) | |
tree | 59959f8a0f3087455efdcb430846686f303c5991 /net/tipc/core.c | |
parent | 58cba4650a7a414eabd2b40cc9d8e45fcdf192d9 (diff) |
[TIPC] Initial merge
TIPC (Transparent Inter Process Communication) is a protocol designed for
intra cluster communication. For more information see
http://tipc.sourceforge.net
Signed-off-by: Per Liden <per.liden@nospam.ericsson.com>
Diffstat (limited to 'net/tipc/core.c')
-rw-r--r-- | net/tipc/core.c | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/net/tipc/core.c b/net/tipc/core.c new file mode 100644 index 000000000000..17c723f49185 --- /dev/null +++ b/net/tipc/core.c | |||
@@ -0,0 +1,282 @@ | |||
1 | /* | ||
2 | * net/tipc/core.c: TIPC module code | ||
3 | * | ||
4 | * Copyright (c) 2003-2005, Ericsson Research Canada | ||
5 | * Copyright (c) 2005, Wind River Systems | ||
6 | * Copyright (c) 2005-2006, Ericsson AB | ||
7 | * All rights reserved. | ||
8 | * | ||
9 | * Redistribution and use in source and binary forms, with or without | ||
10 | * modification, are permitted provided that the following conditions are met: | ||
11 | * | ||
12 | * Redistributions of source code must retain the above copyright notice, this | ||
13 | * list of conditions and the following disclaimer. | ||
14 | * Redistributions in binary form must reproduce the above copyright notice, | ||
15 | * this list of conditions and the following disclaimer in the documentation | ||
16 | * and/or other materials provided with the distribution. | ||
17 | * Neither the names of the copyright holders nor the names of its | ||
18 | * contributors may be used to endorse or promote products derived from this | ||
19 | * software without specific prior written permission. | ||
20 | * | ||
21 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
22 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||
25 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
26 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
27 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||
28 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||
29 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
30 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
31 | * POSSIBILITY OF SUCH DAMAGE. | ||
32 | */ | ||
33 | |||
34 | #include <linux/init.h> | ||
35 | #include <linux/module.h> | ||
36 | #include <linux/kernel.h> | ||
37 | #include <linux/version.h> | ||
38 | #include <linux/random.h> | ||
39 | |||
40 | #include "core.h" | ||
41 | #include "dbg.h" | ||
42 | #include "ref.h" | ||
43 | #include "net.h" | ||
44 | #include "user_reg.h" | ||
45 | #include "name_table.h" | ||
46 | #include "subscr.h" | ||
47 | #include "config.h" | ||
48 | |||
49 | int eth_media_start(void); | ||
50 | void eth_media_stop(void); | ||
51 | int handler_start(void); | ||
52 | void handler_stop(void); | ||
53 | int socket_init(void); | ||
54 | void socket_stop(void); | ||
55 | int netlink_start(void); | ||
56 | void netlink_stop(void); | ||
57 | |||
58 | #define MOD_NAME "tipc_start: " | ||
59 | |||
60 | #ifndef CONFIG_TIPC_ZONES | ||
61 | #define CONFIG_TIPC_ZONES 3 | ||
62 | #endif | ||
63 | |||
64 | #ifndef CONFIG_TIPC_CLUSTERS | ||
65 | #define CONFIG_TIPC_CLUSTERS 1 | ||
66 | #endif | ||
67 | |||
68 | #ifndef CONFIG_TIPC_NODES | ||
69 | #define CONFIG_TIPC_NODES 255 | ||
70 | #endif | ||
71 | |||
72 | #ifndef CONFIG_TIPC_SLAVE_NODES | ||
73 | #define CONFIG_TIPC_SLAVE_NODES 0 | ||
74 | #endif | ||
75 | |||
76 | #ifndef CONFIG_TIPC_PORTS | ||
77 | #define CONFIG_TIPC_PORTS 8191 | ||
78 | #endif | ||
79 | |||
80 | #ifndef CONFIG_TIPC_LOG | ||
81 | #define CONFIG_TIPC_LOG 0 | ||
82 | #endif | ||
83 | |||
84 | /* global variables used by multiple sub-systems within TIPC */ | ||
85 | |||
86 | int tipc_mode = TIPC_NOT_RUNNING; | ||
87 | int tipc_random; | ||
88 | atomic_t tipc_user_count = ATOMIC_INIT(0); | ||
89 | |||
90 | const char tipc_alphabet[] = | ||
91 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"; | ||
92 | |||
93 | /* configurable TIPC parameters */ | ||
94 | |||
95 | u32 tipc_own_addr; | ||
96 | int tipc_max_zones; | ||
97 | int tipc_max_clusters; | ||
98 | int tipc_max_nodes; | ||
99 | int tipc_max_slaves; | ||
100 | int tipc_max_ports; | ||
101 | int tipc_max_subscriptions; | ||
102 | int tipc_max_publications; | ||
103 | int tipc_net_id; | ||
104 | int tipc_remote_management; | ||
105 | |||
106 | |||
107 | int tipc_get_mode(void) | ||
108 | { | ||
109 | return tipc_mode; | ||
110 | } | ||
111 | |||
112 | /** | ||
113 | * stop_net - shut down TIPC networking sub-systems | ||
114 | */ | ||
115 | |||
116 | void stop_net(void) | ||
117 | { | ||
118 | eth_media_stop(); | ||
119 | tipc_stop_net(); | ||
120 | } | ||
121 | |||
122 | /** | ||
123 | * start_net - start TIPC networking sub-systems | ||
124 | */ | ||
125 | |||
126 | int start_net(void) | ||
127 | { | ||
128 | int res; | ||
129 | |||
130 | if ((res = tipc_start_net()) || | ||
131 | (res = eth_media_start())) { | ||
132 | stop_net(); | ||
133 | } | ||
134 | return res; | ||
135 | } | ||
136 | |||
137 | /** | ||
138 | * stop_core - switch TIPC from SINGLE NODE to NOT RUNNING mode | ||
139 | */ | ||
140 | |||
141 | void stop_core(void) | ||
142 | { | ||
143 | if (tipc_mode != TIPC_NODE_MODE) | ||
144 | return; | ||
145 | |||
146 | tipc_mode = TIPC_NOT_RUNNING; | ||
147 | |||
148 | netlink_stop(); | ||
149 | handler_stop(); | ||
150 | cfg_stop(); | ||
151 | subscr_stop(); | ||
152 | reg_stop(); | ||
153 | nametbl_stop(); | ||
154 | ref_table_stop(); | ||
155 | socket_stop(); | ||
156 | } | ||
157 | |||
158 | /** | ||
159 | * start_core - switch TIPC from NOT RUNNING to SINGLE NODE mode | ||
160 | */ | ||
161 | |||
162 | int start_core(void) | ||
163 | { | ||
164 | int res; | ||
165 | |||
166 | if (tipc_mode != TIPC_NOT_RUNNING) | ||
167 | return -ENOPROTOOPT; | ||
168 | |||
169 | get_random_bytes(&tipc_random, sizeof(tipc_random)); | ||
170 | tipc_mode = TIPC_NODE_MODE; | ||
171 | |||
172 | if ((res = handler_start()) || | ||
173 | (res = ref_table_init(tipc_max_ports + tipc_max_subscriptions, | ||
174 | tipc_random)) || | ||
175 | (res = reg_start()) || | ||
176 | (res = nametbl_init()) || | ||
177 | (res = k_signal((Handler)subscr_start, 0)) || | ||
178 | (res = k_signal((Handler)cfg_init, 0)) || | ||
179 | (res = netlink_start()) || | ||
180 | (res = socket_init())) { | ||
181 | stop_core(); | ||
182 | } | ||
183 | return res; | ||
184 | } | ||
185 | |||
186 | |||
187 | static int __init tipc_init(void) | ||
188 | { | ||
189 | int res; | ||
190 | |||
191 | log_reinit(CONFIG_TIPC_LOG); | ||
192 | info("Activated (compiled " __DATE__ " " __TIME__ ")\n"); | ||
193 | |||
194 | tipc_own_addr = 0; | ||
195 | tipc_remote_management = 1; | ||
196 | tipc_max_publications = 10000; | ||
197 | tipc_max_subscriptions = 2000; | ||
198 | tipc_max_ports = delimit(CONFIG_TIPC_PORTS, 127, 65536); | ||
199 | tipc_max_zones = delimit(CONFIG_TIPC_ZONES, 1, 511); | ||
200 | tipc_max_clusters = delimit(CONFIG_TIPC_CLUSTERS, 1, 1); | ||
201 | tipc_max_nodes = delimit(CONFIG_TIPC_NODES, 8, 2047); | ||
202 | tipc_max_slaves = delimit(CONFIG_TIPC_SLAVE_NODES, 0, 2047); | ||
203 | tipc_net_id = 4711; | ||
204 | |||
205 | if ((res = start_core())) | ||
206 | err("Unable to start in single node mode\n"); | ||
207 | else | ||
208 | info("Started in single node mode\n"); | ||
209 | return res; | ||
210 | } | ||
211 | |||
212 | static void __exit tipc_exit(void) | ||
213 | { | ||
214 | stop_net(); | ||
215 | stop_core(); | ||
216 | info("Deactivated\n"); | ||
217 | log_stop(); | ||
218 | } | ||
219 | |||
220 | module_init(tipc_init); | ||
221 | module_exit(tipc_exit); | ||
222 | |||
223 | MODULE_DESCRIPTION("TIPC: Transparent Inter Process Communication"); | ||
224 | MODULE_LICENSE("Dual BSD/GPL"); | ||
225 | |||
226 | /* Native TIPC API for kernel-space applications (see tipc.h) */ | ||
227 | |||
228 | EXPORT_SYMBOL(tipc_attach); | ||
229 | EXPORT_SYMBOL(tipc_detach); | ||
230 | EXPORT_SYMBOL(tipc_get_addr); | ||
231 | EXPORT_SYMBOL(tipc_get_mode); | ||
232 | EXPORT_SYMBOL(tipc_createport); | ||
233 | EXPORT_SYMBOL(tipc_deleteport); | ||
234 | EXPORT_SYMBOL(tipc_ownidentity); | ||
235 | EXPORT_SYMBOL(tipc_portimportance); | ||
236 | EXPORT_SYMBOL(tipc_set_portimportance); | ||
237 | EXPORT_SYMBOL(tipc_portunreliable); | ||
238 | EXPORT_SYMBOL(tipc_set_portunreliable); | ||
239 | EXPORT_SYMBOL(tipc_portunreturnable); | ||
240 | EXPORT_SYMBOL(tipc_set_portunreturnable); | ||
241 | EXPORT_SYMBOL(tipc_publish); | ||
242 | EXPORT_SYMBOL(tipc_withdraw); | ||
243 | EXPORT_SYMBOL(tipc_connect2port); | ||
244 | EXPORT_SYMBOL(tipc_disconnect); | ||
245 | EXPORT_SYMBOL(tipc_shutdown); | ||
246 | EXPORT_SYMBOL(tipc_isconnected); | ||
247 | EXPORT_SYMBOL(tipc_peer); | ||
248 | EXPORT_SYMBOL(tipc_ref_valid); | ||
249 | EXPORT_SYMBOL(tipc_send); | ||
250 | EXPORT_SYMBOL(tipc_send_buf); | ||
251 | EXPORT_SYMBOL(tipc_send2name); | ||
252 | EXPORT_SYMBOL(tipc_forward2name); | ||
253 | EXPORT_SYMBOL(tipc_send_buf2name); | ||
254 | EXPORT_SYMBOL(tipc_forward_buf2name); | ||
255 | EXPORT_SYMBOL(tipc_send2port); | ||
256 | EXPORT_SYMBOL(tipc_forward2port); | ||
257 | EXPORT_SYMBOL(tipc_send_buf2port); | ||
258 | EXPORT_SYMBOL(tipc_forward_buf2port); | ||
259 | EXPORT_SYMBOL(tipc_multicast); | ||
260 | /* EXPORT_SYMBOL(tipc_multicast_buf); not available yet */ | ||
261 | EXPORT_SYMBOL(tipc_ispublished); | ||
262 | EXPORT_SYMBOL(tipc_available_nodes); | ||
263 | |||
264 | /* TIPC API for external bearers (see tipc_bearer.h) */ | ||
265 | |||
266 | EXPORT_SYMBOL(tipc_block_bearer); | ||
267 | EXPORT_SYMBOL(tipc_continue); | ||
268 | EXPORT_SYMBOL(tipc_disable_bearer); | ||
269 | EXPORT_SYMBOL(tipc_enable_bearer); | ||
270 | EXPORT_SYMBOL(tipc_recv_msg); | ||
271 | EXPORT_SYMBOL(tipc_register_media); | ||
272 | |||
273 | /* TIPC API for external APIs (see tipc_port.h) */ | ||
274 | |||
275 | EXPORT_SYMBOL(tipc_createport_raw); | ||
276 | EXPORT_SYMBOL(tipc_set_msg_option); | ||
277 | EXPORT_SYMBOL(tipc_reject_msg); | ||
278 | EXPORT_SYMBOL(tipc_send_buf_fast); | ||
279 | EXPORT_SYMBOL(tipc_acknowledge); | ||
280 | EXPORT_SYMBOL(tipc_get_port); | ||
281 | EXPORT_SYMBOL(tipc_get_handle); | ||
282 | |||