Blame view

net/tipc/msg.h 18.1 KB
b97bf3fd8   Per Liden   [TIPC] Initial merge
1
2
  /*
   * net/tipc/msg.h: Include file for TIPC message header routines
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
3
   *
1f9eda7e2   Allan Stephens   [TIPC]: Enhanceme...
4
   * Copyright (c) 2000-2007, Ericsson AB
bd7845337   Allan Stephens   tipc: Expand link...
5
   * Copyright (c) 2005-2008, Wind River Systems
b97bf3fd8   Per Liden   [TIPC] Initial merge
6
7
   * All rights reserved.
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
8
   * Redistribution and use in source and binary forms, with or without
b97bf3fd8   Per Liden   [TIPC] Initial merge
9
10
   * modification, are permitted provided that the following conditions are met:
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
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.
b97bf3fd8   Per Liden   [TIPC] Initial merge
19
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
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
b97bf3fd8   Per Liden   [TIPC] Initial merge
34
35
36
37
38
   * POSSIBILITY OF SUCH DAMAGE.
   */
  
  #ifndef _TIPC_MSG_H
  #define _TIPC_MSG_H
5f7c3ff6a   Jon Maloy   [TIPC] Minor chan...
39
  #include "core.h"
b97bf3fd8   Per Liden   [TIPC] Initial merge
40
41
  
  #define TIPC_VERSION              2
06d82c919   Allan Stephens   [TIPC]: Minor cle...
42
43
  
  #define SHORT_H_SIZE              24	/* Connected, in-cluster messages */
b97bf3fd8   Per Liden   [TIPC] Initial merge
44
  #define DIR_MSG_H_SIZE            32	/* Directly addressed messages */
06d82c919   Allan Stephens   [TIPC]: Minor cle...
45
  #define LONG_H_SIZE               40	/* Named messages */
b97bf3fd8   Per Liden   [TIPC] Initial merge
46
  #define MCAST_H_SIZE              44	/* Multicast messages */
06d82c919   Allan Stephens   [TIPC]: Minor cle...
47
48
49
  #define INT_H_SIZE                40	/* Internal messages */
  #define MIN_H_SIZE                24	/* Smallest legal TIPC header size */
  #define MAX_H_SIZE                60	/* Largest possible TIPC header size */
b97bf3fd8   Per Liden   [TIPC] Initial merge
50
  #define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE)
b97bf3fd8   Per Liden   [TIPC] Initial merge
51
52
53
54
  
  
  /*
  		TIPC user data message header format, version 2
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
55

b97bf3fd8   Per Liden   [TIPC] Initial merge
56
57
  	- Fundamental definitions available to privileged TIPC users
  	  are located in tipc_msg.h.
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
58
  	- Remaining definitions available to TIPC internal users appear below.
b97bf3fd8   Per Liden   [TIPC] Initial merge
59
60
61
62
63
64
65
66
67
68
69
  */
  
  
  static inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val)
  {
  	m->hdr[w] = htonl(val);
  }
  
  static inline void msg_set_bits(struct tipc_msg *m, u32 w,
  				u32 pos, u32 mask, u32 val)
  {
1f9eda7e2   Allan Stephens   [TIPC]: Enhanceme...
70
  	val = (val & mask) << pos;
becf3da20   Al Viro   tipc: endianness ...
71
72
73
  	mask = mask << pos;
  	m->hdr[w] &= ~htonl(mask);
  	m->hdr[w] |= htonl(val);
b97bf3fd8   Per Liden   [TIPC] Initial merge
74
  }
40aecb1b1   Allan Stephens   tipc: Message rej...
75
76
77
78
79
80
81
  static inline void msg_swap_words(struct tipc_msg *msg, u32 a, u32 b)
  {
  	u32 temp = msg->hdr[a];
  
  	msg->hdr[a] = msg->hdr[b];
  	msg->hdr[b] = temp;
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
82
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
83
84
85
86
87
88
89
   * Word 0
   */
  
  static inline u32 msg_version(struct tipc_msg *m)
  {
  	return msg_bits(m, 0, 29, 7);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
90
  static inline void msg_set_version(struct tipc_msg *m)
b97bf3fd8   Per Liden   [TIPC] Initial merge
91
  {
37695420a   Allan Stephens   [TIPC]: Use corre...
92
  	msg_set_bits(m, 0, 29, 7, TIPC_VERSION);
b97bf3fd8   Per Liden   [TIPC] Initial merge
93
94
95
96
97
98
99
100
101
  }
  
  static inline u32 msg_user(struct tipc_msg *m)
  {
  	return msg_bits(m, 0, 25, 0xf);
  }
  
  static inline u32 msg_isdata(struct tipc_msg *m)
  {
06d82c919   Allan Stephens   [TIPC]: Minor cle...
102
  	return (msg_user(m) <= TIPC_CRITICAL_IMPORTANCE);
b97bf3fd8   Per Liden   [TIPC] Initial merge
103
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
104
  static inline void msg_set_user(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
105
106
107
  {
  	msg_set_bits(m, 0, 25, 0xf, n);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
108
  static inline void msg_set_importance(struct tipc_msg *m, u32 i)
b97bf3fd8   Per Liden   [TIPC] Initial merge
109
110
111
  {
  	msg_set_user(m, i);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
112
  static inline void msg_set_hdr_sz(struct tipc_msg *m,u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
113
114
115
  {
  	msg_set_bits(m, 0, 21, 0xf, n>>2);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
116
  static inline int msg_non_seq(struct tipc_msg *m)
b97bf3fd8   Per Liden   [TIPC] Initial merge
117
118
119
  {
  	return msg_bits(m, 0, 20, 1);
  }
40aecb1b1   Allan Stephens   tipc: Message rej...
120
  static inline void msg_set_non_seq(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
121
  {
40aecb1b1   Allan Stephens   tipc: Message rej...
122
  	msg_set_bits(m, 0, 20, 1, n);
b97bf3fd8   Per Liden   [TIPC] Initial merge
123
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
124
  static inline int msg_dest_droppable(struct tipc_msg *m)
b97bf3fd8   Per Liden   [TIPC] Initial merge
125
126
127
  {
  	return msg_bits(m, 0, 19, 1);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
128
  static inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d)
b97bf3fd8   Per Liden   [TIPC] Initial merge
129
130
131
  {
  	msg_set_bits(m, 0, 19, 1, d);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
132
  static inline int msg_src_droppable(struct tipc_msg *m)
b97bf3fd8   Per Liden   [TIPC] Initial merge
133
134
135
  {
  	return msg_bits(m, 0, 18, 1);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
136
  static inline void msg_set_src_droppable(struct tipc_msg *m, u32 d)
b97bf3fd8   Per Liden   [TIPC] Initial merge
137
138
139
140
141
142
143
144
  {
  	msg_set_bits(m, 0, 18, 1, d);
  }
  
  static inline void msg_set_size(struct tipc_msg *m, u32 sz)
  {
  	m->hdr[0] = htonl((msg_word(m, 0) & ~0x1ffff) | sz);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
145
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
146
147
   * Word 1
   */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
148
  static inline void msg_set_type(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
149
150
151
  {
  	msg_set_bits(m, 1, 29, 0x7, n);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
152
  static inline void msg_set_errcode(struct tipc_msg *m, u32 err)
b97bf3fd8   Per Liden   [TIPC] Initial merge
153
154
155
  {
  	msg_set_bits(m, 1, 25, 0xf, err);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
156
  static inline u32 msg_reroute_cnt(struct tipc_msg *m)
b97bf3fd8   Per Liden   [TIPC] Initial merge
157
158
159
  {
  	return msg_bits(m, 1, 21, 0xf);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
160
  static inline void msg_incr_reroute_cnt(struct tipc_msg *m)
b97bf3fd8   Per Liden   [TIPC] Initial merge
161
162
163
  {
  	msg_set_bits(m, 1, 21, 0xf, msg_reroute_cnt(m) + 1);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
164
  static inline void msg_reset_reroute_cnt(struct tipc_msg *m)
b97bf3fd8   Per Liden   [TIPC] Initial merge
165
166
167
168
169
170
171
172
  {
  	msg_set_bits(m, 1, 21, 0xf, 0);
  }
  
  static inline u32 msg_lookup_scope(struct tipc_msg *m)
  {
  	return msg_bits(m, 1, 19, 0x3);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
173
  static inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
174
175
176
  {
  	msg_set_bits(m, 1, 19, 0x3, n);
  }
b97bf3fd8   Per Liden   [TIPC] Initial merge
177
178
179
180
  static inline u32 msg_bcast_ack(struct tipc_msg *m)
  {
  	return msg_bits(m, 1, 0, 0xffff);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
181
  static inline void msg_set_bcast_ack(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
182
183
184
  {
  	msg_set_bits(m, 1, 0, 0xffff, n);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
185
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
186
187
188
189
190
191
192
   * Word 2
   */
  
  static inline u32 msg_ack(struct tipc_msg *m)
  {
  	return msg_bits(m, 2, 16, 0xffff);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
193
  static inline void msg_set_ack(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
194
195
196
197
198
199
200
201
  {
  	msg_set_bits(m, 2, 16, 0xffff, n);
  }
  
  static inline u32 msg_seqno(struct tipc_msg *m)
  {
  	return msg_bits(m, 2, 0, 0xffff);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
202
  static inline void msg_set_seqno(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
203
204
205
  {
  	msg_set_bits(m, 2, 0, 0xffff, n);
  }
40aecb1b1   Allan Stephens   tipc: Message rej...
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
  /*
   * TIPC may utilize the "link ack #" and "link seq #" fields of a short
   * message header to hold the destination node for the message, since the
   * normal "dest node" field isn't present.  This cache is only referenced
   * when required, so populating the cache of a longer message header is
   * harmless (as long as the header has the two link sequence fields present).
   *
   * Note: Host byte order is OK here, since the info never goes off-card.
   */
  
  static inline u32 msg_destnode_cache(struct tipc_msg *m)
  {
  	return m->hdr[2];
  }
  
  static inline void msg_set_destnode_cache(struct tipc_msg *m, u32 dnode)
  {
  	m->hdr[2] = dnode;
  }
b97bf3fd8   Per Liden   [TIPC] Initial merge
225

c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
226
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
227
228
   * Words 3-10
   */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
229
  static inline void msg_set_prevnode(struct tipc_msg *m, u32 a)
b97bf3fd8   Per Liden   [TIPC] Initial merge
230
231
232
  {
  	msg_set_word(m, 3, a);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
233
  static inline void msg_set_origport(struct tipc_msg *m, u32 p)
b97bf3fd8   Per Liden   [TIPC] Initial merge
234
235
236
  {
  	msg_set_word(m, 4, p);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
237
  static inline void msg_set_destport(struct tipc_msg *m, u32 p)
b97bf3fd8   Per Liden   [TIPC] Initial merge
238
239
240
  {
  	msg_set_word(m, 5, p);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
241
  static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)
b97bf3fd8   Per Liden   [TIPC] Initial merge
242
243
244
  {
  	msg_set_word(m, 5, p);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
245
  static inline void msg_set_orignode(struct tipc_msg *m, u32 a)
b97bf3fd8   Per Liden   [TIPC] Initial merge
246
247
248
  {
  	msg_set_word(m, 6, a);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
249
  static inline void msg_set_destnode(struct tipc_msg *m, u32 a)
b97bf3fd8   Per Liden   [TIPC] Initial merge
250
251
252
  {
  	msg_set_word(m, 7, a);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
253
  static inline int msg_is_dest(struct tipc_msg *m, u32 d)
b97bf3fd8   Per Liden   [TIPC] Initial merge
254
255
256
257
258
259
260
261
262
263
  {
  	return(msg_short(m) || (msg_destnode(m) == d));
  }
  
  static inline u32 msg_routed(struct tipc_msg *m)
  {
  	if (likely(msg_short(m)))
  		return 0;
  	return(msg_destnode(m) ^ msg_orignode(m)) >> 11;
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
264
  static inline void msg_set_nametype(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
  {
  	msg_set_word(m, 8, n);
  }
  
  static inline u32 msg_transp_seqno(struct tipc_msg *m)
  {
  	return msg_word(m, 8);
  }
  
  static inline void msg_set_timestamp(struct tipc_msg *m, u32 n)
  {
  	msg_set_word(m, 8, n);
  }
  
  static inline u32 msg_timestamp(struct tipc_msg *m)
  {
  	return msg_word(m, 8);
  }
  
  static inline void msg_set_transp_seqno(struct tipc_msg *m, u32 n)
  {
  	msg_set_word(m, 8, n);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
288
  static inline void msg_set_namelower(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
289
290
291
  {
  	msg_set_word(m, 9, n);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
292
  static inline void msg_set_nameinst(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
293
294
295
  {
  	msg_set_namelower(m, n);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
296
  static inline void msg_set_nameupper(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
297
298
299
300
301
302
303
304
  {
  	msg_set_word(m, 10, n);
  }
  
  static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m)
  {
  	return (struct tipc_msg *)msg_data(m);
  }
b97bf3fd8   Per Liden   [TIPC] Initial merge
305
306
307
  
  /*
  		TIPC internal message header format, version 2
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
308
         1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0
b97bf3fd8   Per Liden   [TIPC] Initial merge
309
310
311
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     w0:|vers |msg usr|hdr sz |n|resrv|            packet size          |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
bd7845337   Allan Stephens   tipc: Expand link...
312
     w1:|m typ|      sequence gap       |       broadcast ack no        |
b97bf3fd8   Per Liden   [TIPC] Initial merge
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     w2:| link level ack no/bc_gap_from |     seq no / bcast_gap_to     |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     w3:|                       previous node                           |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     w4:|  next sent broadcast/fragm no | next sent pkt/ fragm msg no   |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     w5:|          session no           |rsv=0|r|berid|link prio|netpl|p|
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     w6:|                      originating node                         |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     w7:|                      destination node                         |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     w8:|                   transport sequence number                   |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     w9:|   msg count / bcast tag       |       link tolerance          |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        \                                                               \
        /                     User Specific Data                        /
        \                                                               \
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  
        NB: CONN_MANAGER use data message format. LINK_CONFIG has own format.
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
336
  */
b97bf3fd8   Per Liden   [TIPC] Initial merge
337

c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
338
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
339
340
341
342
343
344
345
346
347
348
349
350
   * Internal users
   */
  
  #define  BCAST_PROTOCOL       5
  #define  MSG_BUNDLER          6
  #define  LINK_PROTOCOL        7
  #define  CONN_MANAGER         8
  #define  ROUTE_DISTRIBUTOR    9
  #define  CHANGEOVER_PROTOCOL  10
  #define  NAME_DISTRIBUTOR     11
  #define  MSG_FRAGMENTER       12
  #define  LINK_CONFIG          13
b97bf3fd8   Per Liden   [TIPC] Initial merge
351
  #define  DSC_H_SIZE           40
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
352
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
353
354
355
356
357
358
   *  Connection management protocol messages
   */
  
  #define CONN_PROBE        0
  #define CONN_PROBE_REPLY  1
  #define CONN_ACK          2
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
359
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
360
361
362
363
364
   * Name distributor messages
   */
  
  #define PUBLICATION       0
  #define WITHDRAWAL        1
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
365
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
366
367
368
369
370
   * Word 1
   */
  
  static inline u32 msg_seq_gap(struct tipc_msg *m)
  {
bd7845337   Allan Stephens   tipc: Expand link...
371
  	return msg_bits(m, 1, 16, 0x1fff);
b97bf3fd8   Per Liden   [TIPC] Initial merge
372
373
374
375
  }
  
  static inline void msg_set_seq_gap(struct tipc_msg *m, u32 n)
  {
bd7845337   Allan Stephens   tipc: Expand link...
376
  	msg_set_bits(m, 1, 16, 0x1fff, n);
b97bf3fd8   Per Liden   [TIPC] Initial merge
377
378
379
380
381
382
  }
  
  static inline u32 msg_req_links(struct tipc_msg *m)
  {
  	return msg_bits(m, 1, 16, 0xfff);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
383
  static inline void msg_set_req_links(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
384
385
386
  {
  	msg_set_bits(m, 1, 16, 0xfff, n);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
387
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
388
389
390
391
392
393
394
   * Word 2
   */
  
  static inline u32 msg_dest_domain(struct tipc_msg *m)
  {
  	return msg_word(m, 2);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
395
  static inline void msg_set_dest_domain(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
  {
  	msg_set_word(m, 2, n);
  }
  
  static inline u32 msg_bcgap_after(struct tipc_msg *m)
  {
  	return msg_bits(m, 2, 16, 0xffff);
  }
  
  static inline void msg_set_bcgap_after(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 2, 16, 0xffff, n);
  }
  
  static inline u32 msg_bcgap_to(struct tipc_msg *m)
  {
  	return msg_bits(m, 2, 0, 0xffff);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
414
  static inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
415
416
417
  {
  	msg_set_bits(m, 2, 0, 0xffff, n);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
418
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
   * Word 4
   */
  
  static inline u32 msg_last_bcast(struct tipc_msg *m)
  {
  	return msg_bits(m, 4, 16, 0xffff);
  }
  
  static inline void msg_set_last_bcast(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 4, 16, 0xffff, n);
  }
  
  
  static inline u32 msg_fragm_no(struct tipc_msg *m)
  {
  	return msg_bits(m, 4, 16, 0xffff);
  }
  
  static inline void msg_set_fragm_no(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 4, 16, 0xffff, n);
  }
  
  
  static inline u32 msg_next_sent(struct tipc_msg *m)
  {
  	return msg_bits(m, 4, 0, 0xffff);
  }
  
  static inline void msg_set_next_sent(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 4, 0, 0xffff, n);
  }
  
  
  static inline u32 msg_long_msgno(struct tipc_msg *m)
  {
  	return msg_bits(m, 4, 0, 0xffff);
  }
  
  static inline void msg_set_long_msgno(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 4, 0, 0xffff, n);
  }
  
  static inline u32 msg_bc_netid(struct tipc_msg *m)
  {
  	return msg_word(m, 4);
  }
  
  static inline void msg_set_bc_netid(struct tipc_msg *m, u32 id)
  {
  	msg_set_word(m, 4, id);
  }
  
  static inline u32 msg_link_selector(struct tipc_msg *m)
  {
  	return msg_bits(m, 4, 0, 1);
  }
  
  static inline void msg_set_link_selector(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 4, 0, 1, (n & 1));
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
484
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
   * Word 5
   */
  
  static inline u32 msg_session(struct tipc_msg *m)
  {
  	return msg_bits(m, 5, 16, 0xffff);
  }
  
  static inline void msg_set_session(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 5, 16, 0xffff, n);
  }
  
  static inline u32 msg_probe(struct tipc_msg *m)
  {
  	return msg_bits(m, 5, 0, 1);
  }
  
  static inline void msg_set_probe(struct tipc_msg *m, u32 val)
  {
  	msg_set_bits(m, 5, 0, 1, (val & 1));
  }
  
  static inline char msg_net_plane(struct tipc_msg *m)
  {
  	return msg_bits(m, 5, 1, 7) + 'A';
  }
  
  static inline void msg_set_net_plane(struct tipc_msg *m, char n)
  {
  	msg_set_bits(m, 5, 1, 7, (n - 'A'));
  }
  
  static inline u32 msg_linkprio(struct tipc_msg *m)
  {
  	return msg_bits(m, 5, 4, 0x1f);
  }
  
  static inline void msg_set_linkprio(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 5, 4, 0x1f, n);
  }
  
  static inline u32 msg_bearer_id(struct tipc_msg *m)
  {
  	return msg_bits(m, 5, 9, 0x7);
  }
  
  static inline void msg_set_bearer_id(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 5, 9, 0x7, n);
  }
  
  static inline u32 msg_redundant_link(struct tipc_msg *m)
  {
  	return msg_bits(m, 5, 12, 0x1);
  }
  
  static inline void msg_set_redundant_link(struct tipc_msg *m)
  {
  	msg_set_bits(m, 5, 12, 0x1, 1);
  }
  
  static inline void msg_clear_redundant_link(struct tipc_msg *m)
  {
  	msg_set_bits(m, 5, 12, 0x1, 0);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
552
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
   * Word 9
   */
  
  static inline u32 msg_msgcnt(struct tipc_msg *m)
  {
  	return msg_bits(m, 9, 16, 0xffff);
  }
  
  static inline void msg_set_msgcnt(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 9, 16, 0xffff, n);
  }
  
  static inline u32 msg_bcast_tag(struct tipc_msg *m)
  {
  	return msg_bits(m, 9, 16, 0xffff);
  }
  
  static inline void msg_set_bcast_tag(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 9, 16, 0xffff, n);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
575
  static inline u32 msg_max_pkt(struct tipc_msg *m)
b97bf3fd8   Per Liden   [TIPC] Initial merge
576
577
578
  {
  	return (msg_bits(m, 9, 16, 0xffff) * 4);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
579
  static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n)
b97bf3fd8   Per Liden   [TIPC] Initial merge
580
581
582
583
584
585
586
587
588
589
590
591
592
  {
  	msg_set_bits(m, 9, 16, 0xffff, (n / 4));
  }
  
  static inline u32 msg_link_tolerance(struct tipc_msg *m)
  {
  	return msg_bits(m, 9, 0, 0xffff);
  }
  
  static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n)
  {
  	msg_set_bits(m, 9, 0, 0xffff, n);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
593
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
594
595
596
597
598
599
600
601
602
603
604
605
606
   * Routing table message data
   */
  
  
  static inline u32 msg_remote_node(struct tipc_msg *m)
  {
  	return msg_word(m, msg_hdr_sz(m)/4);
  }
  
  static inline void msg_set_remote_node(struct tipc_msg *m, u32 a)
  {
  	msg_set_word(m, msg_hdr_sz(m)/4, a);
  }
b97bf3fd8   Per Liden   [TIPC] Initial merge
607
608
609
610
  static inline void msg_set_dataoctet(struct tipc_msg *m, u32 pos)
  {
  	msg_data(m)[pos + 4] = 1;
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
611
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
612
613
614
615
616
617
   * Segmentation message types
   */
  
  #define FIRST_FRAGMENT     0
  #define FRAGMENT           1
  #define LAST_FRAGMENT      2
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
618
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
619
620
621
622
623
624
   * Link management protocol message types
   */
  
  #define STATE_MSG       0
  #define RESET_MSG       1
  #define ACTIVATE_MSG    2
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
625
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
626
627
628
629
   * Changeover tunnel message types
   */
  #define DUPLICATE_MSG    0
  #define ORIGINAL_MSG     1
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
630
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
631
632
633
634
635
636
637
   * Routing table message types
   */
  #define EXT_ROUTING_TABLE    0
  #define LOCAL_ROUTING_TABLE  1
  #define SLAVE_ROUTING_TABLE  2
  #define ROUTE_ADDITION       3
  #define ROUTE_REMOVAL        4
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
638
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
   * Config protocol message types
   */
  
  #define DSC_REQ_MSG          0
  #define DSC_RESP_MSG         1
  
  static inline u32 msg_tot_importance(struct tipc_msg *m)
  {
  	if (likely(msg_isdata(m))) {
  		if (likely(msg_orignode(m) == tipc_own_addr))
  			return msg_importance(m);
  		return msg_importance(m) + 4;
  	}
  	if ((msg_user(m) == MSG_FRAGMENTER)  &&
  	    (msg_type(m) == FIRST_FRAGMENT))
  		return msg_importance(msg_get_wrapped(m));
  	return msg_importance(m);
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
657
  static inline void msg_init(struct tipc_msg *m, u32 user, u32 type,
757152175   Allan Stephens   tipc: Optimize me...
658
  			    u32 hsize, u32 destnode)
b97bf3fd8   Per Liden   [TIPC] Initial merge
659
660
661
662
663
664
665
666
  {
  	memset(m, 0, hsize);
  	msg_set_version(m);
  	msg_set_user(m, user);
  	msg_set_hdr_sz(m, hsize);
  	msg_set_size(m, hsize);
  	msg_set_prevnode(m, tipc_own_addr);
  	msg_set_type(m, type);
b97bf3fd8   Per Liden   [TIPC] Initial merge
667
668
669
670
671
  	if (!msg_short(m)) {
  		msg_set_orignode(m, tipc_own_addr);
  		msg_set_destnode(m, destnode);
  	}
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
672
  /**
b97bf3fd8   Per Liden   [TIPC] Initial merge
673
674
675
676
677
678
679
680
681
682
683
684
   * msg_calc_data_size - determine total data size for message
   */
  
  static inline int msg_calc_data_size(struct iovec const *msg_sect, u32 num_sect)
  {
  	int dsz = 0;
  	int i;
  
  	for (i = 0; i < num_sect; i++)
  		dsz += msg_sect[i].iov_len;
  	return dsz;
  }
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
685
  /**
b97bf3fd8   Per Liden   [TIPC] Initial merge
686
   * msg_build - create message using specified header and data
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
687
   *
b97bf3fd8   Per Liden   [TIPC] Initial merge
688
   * Note: Caller must not hold any locks in case copy_from_user() is interrupted!
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
689
   *
b97bf3fd8   Per Liden   [TIPC] Initial merge
690
691
   * Returns message data size or errno
   */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
692
  static inline int msg_build(struct tipc_msg *hdr,
b97bf3fd8   Per Liden   [TIPC] Initial merge
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
  			    struct iovec const *msg_sect, u32 num_sect,
  			    int max_size, int usrmem, struct sk_buff** buf)
  {
  	int dsz, sz, hsz, pos, res, cnt;
  
  	dsz = msg_calc_data_size(msg_sect, num_sect);
  	if (unlikely(dsz > TIPC_MAX_USER_MSG_SIZE)) {
  		*buf = NULL;
  		return -EINVAL;
  	}
  
  	pos = hsz = msg_hdr_sz(hdr);
  	sz = hsz + dsz;
  	msg_set_size(hdr, sz);
  	if (unlikely(sz > max_size)) {
  		*buf = NULL;
  		return dsz;
  	}
  
  	*buf = buf_acquire(sz);
  	if (!(*buf))
  		return -ENOMEM;
27d7ff46a   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
715
  	skb_copy_to_linear_data(*buf, hdr, hsz);
b97bf3fd8   Per Liden   [TIPC] Initial merge
716
717
  	for (res = 1, cnt = 0; res && (cnt < num_sect); cnt++) {
  		if (likely(usrmem))
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
718
719
  			res = !copy_from_user((*buf)->data + pos,
  					      msg_sect[cnt].iov_base,
b97bf3fd8   Per Liden   [TIPC] Initial merge
720
721
  					      msg_sect[cnt].iov_len);
  		else
27d7ff46a   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
722
723
724
  			skb_copy_to_linear_data_offset(*buf, pos,
  						       msg_sect[cnt].iov_base,
  						       msg_sect[cnt].iov_len);
b97bf3fd8   Per Liden   [TIPC] Initial merge
725
726
727
728
729
730
731
732
733
  		pos += msg_sect[cnt].iov_len;
  	}
  	if (likely(res))
  		return dsz;
  
  	buf_discard(*buf);
  	*buf = NULL;
  	return -EFAULT;
  }
4323add67   Per Liden   [TIPC] Avoid poll...
734
735
736
737
  static inline void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr *a)
  {
  	memcpy(&((int *)m)[5], a, sizeof(*a));
  }
b97bf3fd8   Per Liden   [TIPC] Initial merge
738

4323add67   Per Liden   [TIPC] Avoid poll...
739
740
741
742
  static inline void msg_get_media_addr(struct tipc_msg *m, struct tipc_media_addr *a)
  {
  	memcpy(a, &((int*)m)[5], sizeof(*a));
  }
b97bf3fd8   Per Liden   [TIPC] Initial merge
743
744
  
  #endif