1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38#ifndef _LINUX_TIPC_CONFIG_H_
39#define _LINUX_TIPC_CONFIG_H_
40
41#include <linux/types.h>
42#include <linux/string.h>
43#include <linux/tipc.h>
44#include <asm/byteorder.h>
45
46#ifndef __KERNEL__
47#include <arpa/inet.h>
48#endif
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#define TIPC_CMD_NOOP 0x0000
76#define TIPC_CMD_GET_NODES 0x0001
77#define TIPC_CMD_GET_MEDIA_NAMES 0x0002
78#define TIPC_CMD_GET_BEARER_NAMES 0x0003
79#define TIPC_CMD_GET_LINKS 0x0004
80#define TIPC_CMD_SHOW_NAME_TABLE 0x0005
81#define TIPC_CMD_SHOW_PORTS 0x0006
82#define TIPC_CMD_SHOW_LINK_STATS 0x000B
83#define TIPC_CMD_SHOW_STATS 0x000F
84
85
86
87
88
89
90
91
92#define TIPC_CMD_GET_REMOTE_MNG 0x4003
93#define TIPC_CMD_GET_MAX_PORTS 0x4004
94#define TIPC_CMD_GET_MAX_PUBL 0x4005
95#define TIPC_CMD_GET_MAX_SUBSCR 0x4006
96#define TIPC_CMD_GET_MAX_ZONES 0x4007
97#define TIPC_CMD_GET_MAX_CLUSTERS 0x4008
98#define TIPC_CMD_GET_MAX_NODES 0x4009
99#define TIPC_CMD_GET_MAX_SLAVES 0x400A
100#define TIPC_CMD_GET_NETID 0x400B
101
102#define TIPC_CMD_ENABLE_BEARER 0x4101
103#define TIPC_CMD_DISABLE_BEARER 0x4102
104#define TIPC_CMD_SET_LINK_TOL 0x4107
105#define TIPC_CMD_SET_LINK_PRI 0x4108
106#define TIPC_CMD_SET_LINK_WINDOW 0x4109
107#define TIPC_CMD_SET_LOG_SIZE 0x410A
108#define TIPC_CMD_DUMP_LOG 0x410B
109#define TIPC_CMD_RESET_LINK_STATS 0x410C
110
111
112
113
114
115
116
117#define TIPC_CMD_SET_NODE_ADDR 0x8001
118#define TIPC_CMD_SET_REMOTE_MNG 0x8003
119#define TIPC_CMD_SET_MAX_PORTS 0x8004
120#define TIPC_CMD_SET_MAX_PUBL 0x8005
121#define TIPC_CMD_SET_MAX_SUBSCR 0x8006
122#define TIPC_CMD_SET_MAX_ZONES 0x8007
123#define TIPC_CMD_SET_MAX_CLUSTERS 0x8008
124#define TIPC_CMD_SET_MAX_NODES 0x8009
125#define TIPC_CMD_SET_MAX_SLAVES 0x800A
126#define TIPC_CMD_SET_NETID 0x800B
127
128
129
130
131
132
133
134#define TIPC_CMD_NOT_NET_ADMIN 0xC001
135
136
137
138
139
140#define TIPC_TLV_NONE 0
141#define TIPC_TLV_VOID 1
142#define TIPC_TLV_UNSIGNED 2
143#define TIPC_TLV_STRING 3
144#define TIPC_TLV_LARGE_STRING 4
145#define TIPC_TLV_ULTRA_STRING 5
146
147#define TIPC_TLV_ERROR_STRING 16
148#define TIPC_TLV_NET_ADDR 17
149#define TIPC_TLV_MEDIA_NAME 18
150#define TIPC_TLV_BEARER_NAME 19
151#define TIPC_TLV_LINK_NAME 20
152#define TIPC_TLV_NODE_INFO 21
153#define TIPC_TLV_LINK_INFO 22
154#define TIPC_TLV_BEARER_CONFIG 23
155#define TIPC_TLV_LINK_CONFIG 24
156#define TIPC_TLV_NAME_TBL_QUERY 25
157#define TIPC_TLV_PORT_REF 26
158
159
160
161
162
163#define TIPC_MIN_LINK_PRI 0
164#define TIPC_DEF_LINK_PRI 10
165#define TIPC_MAX_LINK_PRI 31
166#define TIPC_MEDIA_LINK_PRI (TIPC_MAX_LINK_PRI + 1)
167
168
169
170
171
172#define TIPC_MIN_LINK_TOL 50
173#define TIPC_DEF_LINK_TOL 1500
174#define TIPC_MAX_LINK_TOL 30000
175
176#if (TIPC_MIN_LINK_TOL < 16)
177#error "TIPC_MIN_LINK_TOL is too small (abort limit may be NaN)"
178#endif
179
180
181
182
183
184#define TIPC_MIN_LINK_WIN 16
185#define TIPC_DEF_LINK_WIN 50
186#define TIPC_MAX_LINK_WIN 8191
187
188
189
190
191
192#define TIPC_DEF_LINK_UDP_MTU 14000
193
194struct tipc_node_info {
195 __be32 addr;
196 __be32 up;
197};
198
199struct tipc_link_info {
200 __be32 dest;
201 __be32 up;
202 char str[TIPC_MAX_LINK_NAME];
203};
204
205struct tipc_bearer_config {
206 __be32 priority;
207 __be32 disc_domain;
208 char name[TIPC_MAX_BEARER_NAME];
209};
210
211struct tipc_link_config {
212 __be32 value;
213 char name[TIPC_MAX_LINK_NAME];
214};
215
216#define TIPC_NTQ_ALLTYPES 0x80000000
217
218struct tipc_name_table_query {
219 __be32 depth;
220 __be32 type;
221 __be32 lowbound;
222 __be32 upbound;
223};
224
225
226
227
228
229
230
231
232#define TIPC_CFG_TLV_ERROR "\x80"
233#define TIPC_CFG_NOT_NET_ADMIN "\x81"
234#define TIPC_CFG_NOT_ZONE_MSTR "\x82"
235#define TIPC_CFG_NO_REMOTE "\x83"
236#define TIPC_CFG_NOT_SUPPORTED "\x84"
237#define TIPC_CFG_INVALID_VALUE "\x85"
238
239
240
241
242
243
244
245
246
247
248struct tlv_desc {
249 __be16 tlv_len;
250 __be16 tlv_type;
251};
252
253#define TLV_ALIGNTO 4
254
255#define TLV_ALIGN(datalen) (((datalen)+(TLV_ALIGNTO-1)) & ~(TLV_ALIGNTO-1))
256#define TLV_LENGTH(datalen) (sizeof(struct tlv_desc) + (datalen))
257#define TLV_SPACE(datalen) (TLV_ALIGN(TLV_LENGTH(datalen)))
258#define TLV_DATA(tlv) ((void *)((char *)(tlv) + TLV_LENGTH(0)))
259
260static inline int TLV_OK(const void *tlv, __u16 space)
261{
262
263
264
265
266
267
268
269
270
271 return (space >= TLV_SPACE(0)) &&
272 (ntohs(((struct tlv_desc *)tlv)->tlv_len) <= space);
273}
274
275static inline int TLV_CHECK(const void *tlv, __u16 space, __u16 exp_type)
276{
277 return TLV_OK(tlv, space) &&
278 (ntohs(((struct tlv_desc *)tlv)->tlv_type) == exp_type);
279}
280
281static inline int TLV_GET_LEN(struct tlv_desc *tlv)
282{
283 return ntohs(tlv->tlv_len);
284}
285
286static inline void TLV_SET_LEN(struct tlv_desc *tlv, __u16 len)
287{
288 tlv->tlv_len = htons(len);
289}
290
291static inline int TLV_CHECK_TYPE(struct tlv_desc *tlv, __u16 type)
292{
293 return (ntohs(tlv->tlv_type) == type);
294}
295
296static inline void TLV_SET_TYPE(struct tlv_desc *tlv, __u16 type)
297{
298 tlv->tlv_type = htons(type);
299}
300
301static inline int TLV_SET(void *tlv, __u16 type, void *data, __u16 len)
302{
303 struct tlv_desc *tlv_ptr;
304 int tlv_len;
305
306 tlv_len = TLV_LENGTH(len);
307 tlv_ptr = (struct tlv_desc *)tlv;
308 tlv_ptr->tlv_type = htons(type);
309 tlv_ptr->tlv_len = htons(tlv_len);
310 if (len && data) {
311 memcpy(TLV_DATA(tlv_ptr), data, len);
312 memset(TLV_DATA(tlv_ptr) + len, 0, TLV_SPACE(len) - tlv_len);
313 }
314 return TLV_SPACE(len);
315}
316
317
318
319
320
321
322struct tlv_list_desc {
323 struct tlv_desc *tlv_ptr;
324 __u32 tlv_space;
325};
326
327static inline void TLV_LIST_INIT(struct tlv_list_desc *list,
328 void *data, __u32 space)
329{
330 list->tlv_ptr = (struct tlv_desc *)data;
331 list->tlv_space = space;
332}
333
334static inline int TLV_LIST_EMPTY(struct tlv_list_desc *list)
335{
336 return (list->tlv_space == 0);
337}
338
339static inline int TLV_LIST_CHECK(struct tlv_list_desc *list, __u16 exp_type)
340{
341 return TLV_CHECK(list->tlv_ptr, list->tlv_space, exp_type);
342}
343
344static inline void *TLV_LIST_DATA(struct tlv_list_desc *list)
345{
346 return TLV_DATA(list->tlv_ptr);
347}
348
349static inline void TLV_LIST_STEP(struct tlv_list_desc *list)
350{
351 __u16 tlv_space = TLV_ALIGN(ntohs(list->tlv_ptr->tlv_len));
352
353 list->tlv_ptr = (struct tlv_desc *)((char *)list->tlv_ptr + tlv_space);
354 list->tlv_space -= tlv_space;
355}
356
357
358
359
360
361#define TIPC_GENL_NAME "TIPC"
362#define TIPC_GENL_VERSION 0x1
363#define TIPC_GENL_CMD 0x1
364
365
366
367
368struct tipc_genlmsghdr {
369 __u32 dest;
370 __u16 cmd;
371 __u16 reserved;
372};
373
374#define TIPC_GENL_HDRLEN NLMSG_ALIGN(sizeof(struct tipc_genlmsghdr))
375
376
377
378
379
380
381
382
383
384struct tipc_cfg_msg_hdr {
385 __be32 tcm_len;
386 __be16 tcm_type;
387 __be16 tcm_flags;
388 char tcm_reserved[8];
389};
390
391#define TCM_F_REQUEST 0x1
392#define TCM_F_MORE 0x2
393
394#define TCM_ALIGN(datalen) (((datalen)+3) & ~3)
395#define TCM_LENGTH(datalen) (sizeof(struct tipc_cfg_msg_hdr) + datalen)
396#define TCM_SPACE(datalen) (TCM_ALIGN(TCM_LENGTH(datalen)))
397#define TCM_DATA(tcm_hdr) ((void *)((char *)(tcm_hdr) + TCM_LENGTH(0)))
398
399static inline int TCM_SET(void *msg, __u16 cmd, __u16 flags,
400 void *data, __u16 data_len)
401{
402 struct tipc_cfg_msg_hdr *tcm_hdr;
403 int msg_len;
404
405 msg_len = TCM_LENGTH(data_len);
406 tcm_hdr = (struct tipc_cfg_msg_hdr *)msg;
407 tcm_hdr->tcm_len = htonl(msg_len);
408 tcm_hdr->tcm_type = htons(cmd);
409 tcm_hdr->tcm_flags = htons(flags);
410 if (data_len && data) {
411 memcpy(TCM_DATA(msg), data, data_len);
412 memset(TCM_DATA(msg) + data_len, 0, TCM_SPACE(data_len) - msg_len);
413 }
414 return TCM_SPACE(data_len);
415}
416
417#endif
418