xref: /OK3568_Linux_fs/kernel/net/tipc/msg.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * net/tipc/msg.h: Include file for TIPC message header routines
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (c) 2000-2007, 2014-2017 Ericsson AB
5*4882a593Smuzhiyun  * Copyright (c) 2005-2008, 2010-2011, Wind River Systems
6*4882a593Smuzhiyun  * All rights reserved.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Redistribution and use in source and binary forms, with or without
9*4882a593Smuzhiyun  * modification, are permitted provided that the following conditions are met:
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * 1. Redistributions of source code must retain the above copyright
12*4882a593Smuzhiyun  *    notice, this list of conditions and the following disclaimer.
13*4882a593Smuzhiyun  * 2. Redistributions in binary form must reproduce the above copyright
14*4882a593Smuzhiyun  *    notice, this list of conditions and the following disclaimer in the
15*4882a593Smuzhiyun  *    documentation and/or other materials provided with the distribution.
16*4882a593Smuzhiyun  * 3. Neither the names of the copyright holders nor the names of its
17*4882a593Smuzhiyun  *    contributors may be used to endorse or promote products derived from
18*4882a593Smuzhiyun  *    this software without specific prior written permission.
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  * Alternatively, this software may be distributed under the terms of the
21*4882a593Smuzhiyun  * GNU General Public License ("GPL") version 2 as published by the Free
22*4882a593Smuzhiyun  * Software Foundation.
23*4882a593Smuzhiyun  *
24*4882a593Smuzhiyun  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25*4882a593Smuzhiyun  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26*4882a593Smuzhiyun  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27*4882a593Smuzhiyun  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28*4882a593Smuzhiyun  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29*4882a593Smuzhiyun  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30*4882a593Smuzhiyun  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31*4882a593Smuzhiyun  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32*4882a593Smuzhiyun  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33*4882a593Smuzhiyun  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34*4882a593Smuzhiyun  * POSSIBILITY OF SUCH DAMAGE.
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #ifndef _TIPC_MSG_H
38*4882a593Smuzhiyun #define _TIPC_MSG_H
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #include <linux/tipc.h>
41*4882a593Smuzhiyun #include "core.h"
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /*
44*4882a593Smuzhiyun  * Constants and routines used to read and write TIPC payload message headers
45*4882a593Smuzhiyun  *
46*4882a593Smuzhiyun  * Note: Some items are also used with TIPC internal message headers
47*4882a593Smuzhiyun  */
48*4882a593Smuzhiyun #define TIPC_VERSION              2
49*4882a593Smuzhiyun struct plist;
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /*
52*4882a593Smuzhiyun  * Payload message users are defined in TIPC's public API:
53*4882a593Smuzhiyun  * - TIPC_LOW_IMPORTANCE
54*4882a593Smuzhiyun  * - TIPC_MEDIUM_IMPORTANCE
55*4882a593Smuzhiyun  * - TIPC_HIGH_IMPORTANCE
56*4882a593Smuzhiyun  * - TIPC_CRITICAL_IMPORTANCE
57*4882a593Smuzhiyun  */
58*4882a593Smuzhiyun #define TIPC_SYSTEM_IMPORTANCE	4
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /*
62*4882a593Smuzhiyun  * Payload message types
63*4882a593Smuzhiyun  */
64*4882a593Smuzhiyun #define TIPC_CONN_MSG           0
65*4882a593Smuzhiyun #define TIPC_MCAST_MSG          1
66*4882a593Smuzhiyun #define TIPC_NAMED_MSG          2
67*4882a593Smuzhiyun #define TIPC_DIRECT_MSG         3
68*4882a593Smuzhiyun #define TIPC_GRP_MEMBER_EVT     4
69*4882a593Smuzhiyun #define TIPC_GRP_BCAST_MSG      5
70*4882a593Smuzhiyun #define TIPC_GRP_MCAST_MSG      6
71*4882a593Smuzhiyun #define TIPC_GRP_UCAST_MSG      7
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun /*
74*4882a593Smuzhiyun  * Internal message users
75*4882a593Smuzhiyun  */
76*4882a593Smuzhiyun #define  BCAST_PROTOCOL       5
77*4882a593Smuzhiyun #define  MSG_BUNDLER          6
78*4882a593Smuzhiyun #define  LINK_PROTOCOL        7
79*4882a593Smuzhiyun #define  CONN_MANAGER         8
80*4882a593Smuzhiyun #define  GROUP_PROTOCOL       9
81*4882a593Smuzhiyun #define  TUNNEL_PROTOCOL      10
82*4882a593Smuzhiyun #define  NAME_DISTRIBUTOR     11
83*4882a593Smuzhiyun #define  MSG_FRAGMENTER       12
84*4882a593Smuzhiyun #define  LINK_CONFIG          13
85*4882a593Smuzhiyun #define  MSG_CRYPTO           14
86*4882a593Smuzhiyun #define  SOCK_WAKEUP          14       /* pseudo user */
87*4882a593Smuzhiyun #define  TOP_SRV              15       /* pseudo user */
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /*
90*4882a593Smuzhiyun  * Message header sizes
91*4882a593Smuzhiyun  */
92*4882a593Smuzhiyun #define SHORT_H_SIZE              24	/* In-cluster basic payload message */
93*4882a593Smuzhiyun #define BASIC_H_SIZE              32	/* Basic payload message */
94*4882a593Smuzhiyun #define NAMED_H_SIZE              40	/* Named payload message */
95*4882a593Smuzhiyun #define MCAST_H_SIZE              44	/* Multicast payload message */
96*4882a593Smuzhiyun #define GROUP_H_SIZE              44	/* Group payload message */
97*4882a593Smuzhiyun #define INT_H_SIZE                40	/* Internal messages */
98*4882a593Smuzhiyun #define MIN_H_SIZE                24	/* Smallest legal TIPC header size */
99*4882a593Smuzhiyun #define MAX_H_SIZE                60	/* Largest possible TIPC header size */
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE)
102*4882a593Smuzhiyun #define TIPC_MEDIA_INFO_OFFSET	5
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun extern const int one_page_mtu;
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun struct tipc_skb_cb {
107*4882a593Smuzhiyun 	union {
108*4882a593Smuzhiyun 		struct {
109*4882a593Smuzhiyun 			struct sk_buff *tail;
110*4882a593Smuzhiyun 			unsigned long nxt_retr;
111*4882a593Smuzhiyun 			unsigned long retr_stamp;
112*4882a593Smuzhiyun 			u32 bytes_read;
113*4882a593Smuzhiyun 			u32 orig_member;
114*4882a593Smuzhiyun 			u16 chain_imp;
115*4882a593Smuzhiyun 			u16 ackers;
116*4882a593Smuzhiyun 			u16 retr_cnt;
117*4882a593Smuzhiyun 		} __packed;
118*4882a593Smuzhiyun #ifdef CONFIG_TIPC_CRYPTO
119*4882a593Smuzhiyun 		struct {
120*4882a593Smuzhiyun 			struct tipc_crypto *rx;
121*4882a593Smuzhiyun 			struct tipc_aead *last;
122*4882a593Smuzhiyun 			u8 recurs;
123*4882a593Smuzhiyun 		} tx_clone_ctx __packed;
124*4882a593Smuzhiyun #endif
125*4882a593Smuzhiyun 	} __packed;
126*4882a593Smuzhiyun 	union {
127*4882a593Smuzhiyun 		struct {
128*4882a593Smuzhiyun 			u8 validated:1;
129*4882a593Smuzhiyun #ifdef CONFIG_TIPC_CRYPTO
130*4882a593Smuzhiyun 			u8 encrypted:1;
131*4882a593Smuzhiyun 			u8 decrypted:1;
132*4882a593Smuzhiyun #define SKB_PROBING	1
133*4882a593Smuzhiyun #define SKB_GRACING	2
134*4882a593Smuzhiyun 			u8 xmit_type:2;
135*4882a593Smuzhiyun 			u8 tx_clone_deferred:1;
136*4882a593Smuzhiyun #endif
137*4882a593Smuzhiyun 		};
138*4882a593Smuzhiyun 		u8 flags;
139*4882a593Smuzhiyun 	};
140*4882a593Smuzhiyun 	u8 reserved;
141*4882a593Smuzhiyun #ifdef CONFIG_TIPC_CRYPTO
142*4882a593Smuzhiyun 	void *crypto_ctx;
143*4882a593Smuzhiyun #endif
144*4882a593Smuzhiyun } __packed;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun #define TIPC_SKB_CB(__skb) ((struct tipc_skb_cb *)&((__skb)->cb[0]))
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun struct tipc_msg {
149*4882a593Smuzhiyun 	__be32 hdr[15];
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /* struct tipc_gap_ack - TIPC Gap ACK block
153*4882a593Smuzhiyun  * @ack: seqno of the last consecutive packet in link deferdq
154*4882a593Smuzhiyun  * @gap: number of gap packets since the last ack
155*4882a593Smuzhiyun  *
156*4882a593Smuzhiyun  * E.g:
157*4882a593Smuzhiyun  *       link deferdq: 1 2 3 4      10 11      13 14 15       20
158*4882a593Smuzhiyun  * --> Gap ACK blocks:      <4, 5>,   <11, 1>,      <15, 4>, <20, 0>
159*4882a593Smuzhiyun  */
160*4882a593Smuzhiyun struct tipc_gap_ack {
161*4882a593Smuzhiyun 	__be16 ack;
162*4882a593Smuzhiyun 	__be16 gap;
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun /* struct tipc_gap_ack_blks
166*4882a593Smuzhiyun  * @len: actual length of the record
167*4882a593Smuzhiyun  * @ugack_cnt: number of Gap ACK blocks for unicast (following the broadcast
168*4882a593Smuzhiyun  *             ones)
169*4882a593Smuzhiyun  * @start_index: starting index for "valid" broadcast Gap ACK blocks
170*4882a593Smuzhiyun  * @bgack_cnt: number of Gap ACK blocks for broadcast in the record
171*4882a593Smuzhiyun  * @gacks: array of Gap ACK blocks
172*4882a593Smuzhiyun  *
173*4882a593Smuzhiyun  *  31                       16 15                        0
174*4882a593Smuzhiyun  * +-------------+-------------+-------------+-------------+
175*4882a593Smuzhiyun  * |  bgack_cnt  |  ugack_cnt  |            len            |
176*4882a593Smuzhiyun  * +-------------+-------------+-------------+-------------+  -
177*4882a593Smuzhiyun  * |            gap            |            ack            |   |
178*4882a593Smuzhiyun  * +-------------+-------------+-------------+-------------+    > bc gacks
179*4882a593Smuzhiyun  * :                           :                           :   |
180*4882a593Smuzhiyun  * +-------------+-------------+-------------+-------------+  -
181*4882a593Smuzhiyun  * |            gap            |            ack            |   |
182*4882a593Smuzhiyun  * +-------------+-------------+-------------+-------------+    > uc gacks
183*4882a593Smuzhiyun  * :                           :                           :   |
184*4882a593Smuzhiyun  * +-------------+-------------+-------------+-------------+  -
185*4882a593Smuzhiyun  */
186*4882a593Smuzhiyun struct tipc_gap_ack_blks {
187*4882a593Smuzhiyun 	__be16 len;
188*4882a593Smuzhiyun 	union {
189*4882a593Smuzhiyun 		u8 ugack_cnt;
190*4882a593Smuzhiyun 		u8 start_index;
191*4882a593Smuzhiyun 	};
192*4882a593Smuzhiyun 	u8 bgack_cnt;
193*4882a593Smuzhiyun 	struct tipc_gap_ack gacks[];
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun #define MAX_GAP_ACK_BLKS	128
197*4882a593Smuzhiyun #define MAX_GAP_ACK_BLKS_SZ	(sizeof(struct tipc_gap_ack_blks) + \
198*4882a593Smuzhiyun 				 sizeof(struct tipc_gap_ack) * MAX_GAP_ACK_BLKS)
199*4882a593Smuzhiyun 
buf_msg(struct sk_buff * skb)200*4882a593Smuzhiyun static inline struct tipc_msg *buf_msg(struct sk_buff *skb)
201*4882a593Smuzhiyun {
202*4882a593Smuzhiyun 	return (struct tipc_msg *)skb->data;
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun 
msg_word(struct tipc_msg * m,u32 pos)205*4882a593Smuzhiyun static inline u32 msg_word(struct tipc_msg *m, u32 pos)
206*4882a593Smuzhiyun {
207*4882a593Smuzhiyun 	return ntohl(m->hdr[pos]);
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun 
msg_set_word(struct tipc_msg * m,u32 w,u32 val)210*4882a593Smuzhiyun static inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val)
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun 	m->hdr[w] = htonl(val);
213*4882a593Smuzhiyun }
214*4882a593Smuzhiyun 
msg_bits(struct tipc_msg * m,u32 w,u32 pos,u32 mask)215*4882a593Smuzhiyun static inline u32 msg_bits(struct tipc_msg *m, u32 w, u32 pos, u32 mask)
216*4882a593Smuzhiyun {
217*4882a593Smuzhiyun 	return (msg_word(m, w) >> pos) & mask;
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun 
msg_set_bits(struct tipc_msg * m,u32 w,u32 pos,u32 mask,u32 val)220*4882a593Smuzhiyun static inline void msg_set_bits(struct tipc_msg *m, u32 w,
221*4882a593Smuzhiyun 				u32 pos, u32 mask, u32 val)
222*4882a593Smuzhiyun {
223*4882a593Smuzhiyun 	val = (val & mask) << pos;
224*4882a593Smuzhiyun 	mask = mask << pos;
225*4882a593Smuzhiyun 	m->hdr[w] &= ~htonl(mask);
226*4882a593Smuzhiyun 	m->hdr[w] |= htonl(val);
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun 
msg_swap_words(struct tipc_msg * msg,u32 a,u32 b)229*4882a593Smuzhiyun static inline void msg_swap_words(struct tipc_msg *msg, u32 a, u32 b)
230*4882a593Smuzhiyun {
231*4882a593Smuzhiyun 	u32 temp = msg->hdr[a];
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	msg->hdr[a] = msg->hdr[b];
234*4882a593Smuzhiyun 	msg->hdr[b] = temp;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun /*
238*4882a593Smuzhiyun  * Word 0
239*4882a593Smuzhiyun  */
msg_version(struct tipc_msg * m)240*4882a593Smuzhiyun static inline u32 msg_version(struct tipc_msg *m)
241*4882a593Smuzhiyun {
242*4882a593Smuzhiyun 	return msg_bits(m, 0, 29, 7);
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun 
msg_set_version(struct tipc_msg * m)245*4882a593Smuzhiyun static inline void msg_set_version(struct tipc_msg *m)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun 	msg_set_bits(m, 0, 29, 7, TIPC_VERSION);
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun 
msg_user(struct tipc_msg * m)250*4882a593Smuzhiyun static inline u32 msg_user(struct tipc_msg *m)
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun 	return msg_bits(m, 0, 25, 0xf);
253*4882a593Smuzhiyun }
254*4882a593Smuzhiyun 
msg_isdata(struct tipc_msg * m)255*4882a593Smuzhiyun static inline u32 msg_isdata(struct tipc_msg *m)
256*4882a593Smuzhiyun {
257*4882a593Smuzhiyun 	return msg_user(m) <= TIPC_CRITICAL_IMPORTANCE;
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun 
msg_set_user(struct tipc_msg * m,u32 n)260*4882a593Smuzhiyun static inline void msg_set_user(struct tipc_msg *m, u32 n)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun 	msg_set_bits(m, 0, 25, 0xf, n);
263*4882a593Smuzhiyun }
264*4882a593Smuzhiyun 
msg_hdr_sz(struct tipc_msg * m)265*4882a593Smuzhiyun static inline u32 msg_hdr_sz(struct tipc_msg *m)
266*4882a593Smuzhiyun {
267*4882a593Smuzhiyun 	return msg_bits(m, 0, 21, 0xf) << 2;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun 
msg_set_hdr_sz(struct tipc_msg * m,u32 n)270*4882a593Smuzhiyun static inline void msg_set_hdr_sz(struct tipc_msg *m, u32 n)
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun 	msg_set_bits(m, 0, 21, 0xf, n>>2);
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun 
msg_size(struct tipc_msg * m)275*4882a593Smuzhiyun static inline u32 msg_size(struct tipc_msg *m)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun 	return msg_bits(m, 0, 0, 0x1ffff);
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun 
msg_blocks(struct tipc_msg * m)280*4882a593Smuzhiyun static inline u32 msg_blocks(struct tipc_msg *m)
281*4882a593Smuzhiyun {
282*4882a593Smuzhiyun 	return (msg_size(m) / 1024) + 1;
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun 
msg_data_sz(struct tipc_msg * m)285*4882a593Smuzhiyun static inline u32 msg_data_sz(struct tipc_msg *m)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun 	return msg_size(m) - msg_hdr_sz(m);
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun 
msg_non_seq(struct tipc_msg * m)290*4882a593Smuzhiyun static inline int msg_non_seq(struct tipc_msg *m)
291*4882a593Smuzhiyun {
292*4882a593Smuzhiyun 	return msg_bits(m, 0, 20, 1);
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun 
msg_set_non_seq(struct tipc_msg * m,u32 n)295*4882a593Smuzhiyun static inline void msg_set_non_seq(struct tipc_msg *m, u32 n)
296*4882a593Smuzhiyun {
297*4882a593Smuzhiyun 	msg_set_bits(m, 0, 20, 1, n);
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun 
msg_is_syn(struct tipc_msg * m)300*4882a593Smuzhiyun static inline int msg_is_syn(struct tipc_msg *m)
301*4882a593Smuzhiyun {
302*4882a593Smuzhiyun 	return msg_bits(m, 0, 17, 1);
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun 
msg_set_syn(struct tipc_msg * m,u32 d)305*4882a593Smuzhiyun static inline void msg_set_syn(struct tipc_msg *m, u32 d)
306*4882a593Smuzhiyun {
307*4882a593Smuzhiyun 	msg_set_bits(m, 0, 17, 1, d);
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun 
msg_dest_droppable(struct tipc_msg * m)310*4882a593Smuzhiyun static inline int msg_dest_droppable(struct tipc_msg *m)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun 	return msg_bits(m, 0, 19, 1);
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun 
msg_set_dest_droppable(struct tipc_msg * m,u32 d)315*4882a593Smuzhiyun static inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d)
316*4882a593Smuzhiyun {
317*4882a593Smuzhiyun 	msg_set_bits(m, 0, 19, 1, d);
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun 
msg_is_keepalive(struct tipc_msg * m)320*4882a593Smuzhiyun static inline int msg_is_keepalive(struct tipc_msg *m)
321*4882a593Smuzhiyun {
322*4882a593Smuzhiyun 	return msg_bits(m, 0, 19, 1);
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun 
msg_set_is_keepalive(struct tipc_msg * m,u32 d)325*4882a593Smuzhiyun static inline void msg_set_is_keepalive(struct tipc_msg *m, u32 d)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun 	msg_set_bits(m, 0, 19, 1, d);
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun 
msg_src_droppable(struct tipc_msg * m)330*4882a593Smuzhiyun static inline int msg_src_droppable(struct tipc_msg *m)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun 	return msg_bits(m, 0, 18, 1);
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun 
msg_set_src_droppable(struct tipc_msg * m,u32 d)335*4882a593Smuzhiyun static inline void msg_set_src_droppable(struct tipc_msg *m, u32 d)
336*4882a593Smuzhiyun {
337*4882a593Smuzhiyun 	msg_set_bits(m, 0, 18, 1, d);
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun 
msg_ack_required(struct tipc_msg * m)340*4882a593Smuzhiyun static inline int msg_ack_required(struct tipc_msg *m)
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun 	return msg_bits(m, 0, 18, 1);
343*4882a593Smuzhiyun }
344*4882a593Smuzhiyun 
msg_set_ack_required(struct tipc_msg * m)345*4882a593Smuzhiyun static inline void msg_set_ack_required(struct tipc_msg *m)
346*4882a593Smuzhiyun {
347*4882a593Smuzhiyun 	msg_set_bits(m, 0, 18, 1, 1);
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun 
msg_nagle_ack(struct tipc_msg * m)350*4882a593Smuzhiyun static inline int msg_nagle_ack(struct tipc_msg *m)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun 	return msg_bits(m, 0, 18, 1);
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun 
msg_set_nagle_ack(struct tipc_msg * m)355*4882a593Smuzhiyun static inline void msg_set_nagle_ack(struct tipc_msg *m)
356*4882a593Smuzhiyun {
357*4882a593Smuzhiyun 	msg_set_bits(m, 0, 18, 1, 1);
358*4882a593Smuzhiyun }
359*4882a593Smuzhiyun 
msg_is_rcast(struct tipc_msg * m)360*4882a593Smuzhiyun static inline bool msg_is_rcast(struct tipc_msg *m)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun 	return msg_bits(m, 0, 18, 0x1);
363*4882a593Smuzhiyun }
364*4882a593Smuzhiyun 
msg_set_is_rcast(struct tipc_msg * m,bool d)365*4882a593Smuzhiyun static inline void msg_set_is_rcast(struct tipc_msg *m, bool d)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun 	msg_set_bits(m, 0, 18, 0x1, d);
368*4882a593Smuzhiyun }
369*4882a593Smuzhiyun 
msg_set_size(struct tipc_msg * m,u32 sz)370*4882a593Smuzhiyun static inline void msg_set_size(struct tipc_msg *m, u32 sz)
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun 	m->hdr[0] = htonl((msg_word(m, 0) & ~0x1ffff) | sz);
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun 
msg_data(struct tipc_msg * m)375*4882a593Smuzhiyun static inline unchar *msg_data(struct tipc_msg *m)
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun 	return ((unchar *)m) + msg_hdr_sz(m);
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun 
msg_inner_hdr(struct tipc_msg * m)380*4882a593Smuzhiyun static inline struct tipc_msg *msg_inner_hdr(struct tipc_msg *m)
381*4882a593Smuzhiyun {
382*4882a593Smuzhiyun 	return (struct tipc_msg *)msg_data(m);
383*4882a593Smuzhiyun }
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun /*
386*4882a593Smuzhiyun  * Word 1
387*4882a593Smuzhiyun  */
msg_type(struct tipc_msg * m)388*4882a593Smuzhiyun static inline u32 msg_type(struct tipc_msg *m)
389*4882a593Smuzhiyun {
390*4882a593Smuzhiyun 	return msg_bits(m, 1, 29, 0x7);
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun 
msg_set_type(struct tipc_msg * m,u32 n)393*4882a593Smuzhiyun static inline void msg_set_type(struct tipc_msg *m, u32 n)
394*4882a593Smuzhiyun {
395*4882a593Smuzhiyun 	msg_set_bits(m, 1, 29, 0x7, n);
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun 
msg_in_group(struct tipc_msg * m)398*4882a593Smuzhiyun static inline int msg_in_group(struct tipc_msg *m)
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun 	int mtyp = msg_type(m);
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun 	return mtyp >= TIPC_GRP_MEMBER_EVT && mtyp <= TIPC_GRP_UCAST_MSG;
403*4882a593Smuzhiyun }
404*4882a593Smuzhiyun 
msg_is_grp_evt(struct tipc_msg * m)405*4882a593Smuzhiyun static inline bool msg_is_grp_evt(struct tipc_msg *m)
406*4882a593Smuzhiyun {
407*4882a593Smuzhiyun 	return msg_type(m) == TIPC_GRP_MEMBER_EVT;
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun 
msg_named(struct tipc_msg * m)410*4882a593Smuzhiyun static inline u32 msg_named(struct tipc_msg *m)
411*4882a593Smuzhiyun {
412*4882a593Smuzhiyun 	return msg_type(m) == TIPC_NAMED_MSG;
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun 
msg_mcast(struct tipc_msg * m)415*4882a593Smuzhiyun static inline u32 msg_mcast(struct tipc_msg *m)
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun 	int mtyp = msg_type(m);
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	return ((mtyp == TIPC_MCAST_MSG) || (mtyp == TIPC_GRP_BCAST_MSG) ||
420*4882a593Smuzhiyun 		(mtyp == TIPC_GRP_MCAST_MSG));
421*4882a593Smuzhiyun }
422*4882a593Smuzhiyun 
msg_connected(struct tipc_msg * m)423*4882a593Smuzhiyun static inline u32 msg_connected(struct tipc_msg *m)
424*4882a593Smuzhiyun {
425*4882a593Smuzhiyun 	return msg_type(m) == TIPC_CONN_MSG;
426*4882a593Smuzhiyun }
427*4882a593Smuzhiyun 
msg_direct(struct tipc_msg * m)428*4882a593Smuzhiyun static inline u32 msg_direct(struct tipc_msg *m)
429*4882a593Smuzhiyun {
430*4882a593Smuzhiyun 	return msg_type(m) == TIPC_DIRECT_MSG;
431*4882a593Smuzhiyun }
432*4882a593Smuzhiyun 
msg_errcode(struct tipc_msg * m)433*4882a593Smuzhiyun static inline u32 msg_errcode(struct tipc_msg *m)
434*4882a593Smuzhiyun {
435*4882a593Smuzhiyun 	return msg_bits(m, 1, 25, 0xf);
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun 
msg_set_errcode(struct tipc_msg * m,u32 err)438*4882a593Smuzhiyun static inline void msg_set_errcode(struct tipc_msg *m, u32 err)
439*4882a593Smuzhiyun {
440*4882a593Smuzhiyun 	msg_set_bits(m, 1, 25, 0xf, err);
441*4882a593Smuzhiyun }
442*4882a593Smuzhiyun 
msg_set_bulk(struct tipc_msg * m)443*4882a593Smuzhiyun static inline void msg_set_bulk(struct tipc_msg *m)
444*4882a593Smuzhiyun {
445*4882a593Smuzhiyun 	msg_set_bits(m, 1, 28, 0x1, 1);
446*4882a593Smuzhiyun }
447*4882a593Smuzhiyun 
msg_is_bulk(struct tipc_msg * m)448*4882a593Smuzhiyun static inline u32 msg_is_bulk(struct tipc_msg *m)
449*4882a593Smuzhiyun {
450*4882a593Smuzhiyun 	return msg_bits(m, 1, 28, 0x1);
451*4882a593Smuzhiyun }
452*4882a593Smuzhiyun 
msg_set_last_bulk(struct tipc_msg * m)453*4882a593Smuzhiyun static inline void msg_set_last_bulk(struct tipc_msg *m)
454*4882a593Smuzhiyun {
455*4882a593Smuzhiyun 	msg_set_bits(m, 1, 27, 0x1, 1);
456*4882a593Smuzhiyun }
457*4882a593Smuzhiyun 
msg_is_last_bulk(struct tipc_msg * m)458*4882a593Smuzhiyun static inline u32 msg_is_last_bulk(struct tipc_msg *m)
459*4882a593Smuzhiyun {
460*4882a593Smuzhiyun 	return msg_bits(m, 1, 27, 0x1);
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun 
msg_set_non_legacy(struct tipc_msg * m)463*4882a593Smuzhiyun static inline void msg_set_non_legacy(struct tipc_msg *m)
464*4882a593Smuzhiyun {
465*4882a593Smuzhiyun 	msg_set_bits(m, 1, 26, 0x1, 1);
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun 
msg_is_legacy(struct tipc_msg * m)468*4882a593Smuzhiyun static inline u32 msg_is_legacy(struct tipc_msg *m)
469*4882a593Smuzhiyun {
470*4882a593Smuzhiyun 	return !msg_bits(m, 1, 26, 0x1);
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun 
msg_reroute_cnt(struct tipc_msg * m)473*4882a593Smuzhiyun static inline u32 msg_reroute_cnt(struct tipc_msg *m)
474*4882a593Smuzhiyun {
475*4882a593Smuzhiyun 	return msg_bits(m, 1, 21, 0xf);
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun 
msg_incr_reroute_cnt(struct tipc_msg * m)478*4882a593Smuzhiyun static inline void msg_incr_reroute_cnt(struct tipc_msg *m)
479*4882a593Smuzhiyun {
480*4882a593Smuzhiyun 	msg_set_bits(m, 1, 21, 0xf, msg_reroute_cnt(m) + 1);
481*4882a593Smuzhiyun }
482*4882a593Smuzhiyun 
msg_reset_reroute_cnt(struct tipc_msg * m)483*4882a593Smuzhiyun static inline void msg_reset_reroute_cnt(struct tipc_msg *m)
484*4882a593Smuzhiyun {
485*4882a593Smuzhiyun 	msg_set_bits(m, 1, 21, 0xf, 0);
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun 
msg_lookup_scope(struct tipc_msg * m)488*4882a593Smuzhiyun static inline u32 msg_lookup_scope(struct tipc_msg *m)
489*4882a593Smuzhiyun {
490*4882a593Smuzhiyun 	return msg_bits(m, 1, 19, 0x3);
491*4882a593Smuzhiyun }
492*4882a593Smuzhiyun 
msg_set_lookup_scope(struct tipc_msg * m,u32 n)493*4882a593Smuzhiyun static inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n)
494*4882a593Smuzhiyun {
495*4882a593Smuzhiyun 	msg_set_bits(m, 1, 19, 0x3, n);
496*4882a593Smuzhiyun }
497*4882a593Smuzhiyun 
msg_bcast_ack(struct tipc_msg * m)498*4882a593Smuzhiyun static inline u16 msg_bcast_ack(struct tipc_msg *m)
499*4882a593Smuzhiyun {
500*4882a593Smuzhiyun 	return msg_bits(m, 1, 0, 0xffff);
501*4882a593Smuzhiyun }
502*4882a593Smuzhiyun 
msg_set_bcast_ack(struct tipc_msg * m,u16 n)503*4882a593Smuzhiyun static inline void msg_set_bcast_ack(struct tipc_msg *m, u16 n)
504*4882a593Smuzhiyun {
505*4882a593Smuzhiyun 	msg_set_bits(m, 1, 0, 0xffff, n);
506*4882a593Smuzhiyun }
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun /* Note: reusing bits in word 1 for ACTIVATE_MSG only, to re-synch
509*4882a593Smuzhiyun  * link peer session number
510*4882a593Smuzhiyun  */
msg_dest_session_valid(struct tipc_msg * m)511*4882a593Smuzhiyun static inline bool msg_dest_session_valid(struct tipc_msg *m)
512*4882a593Smuzhiyun {
513*4882a593Smuzhiyun 	return msg_bits(m, 1, 16, 0x1);
514*4882a593Smuzhiyun }
515*4882a593Smuzhiyun 
msg_set_dest_session_valid(struct tipc_msg * m,bool valid)516*4882a593Smuzhiyun static inline void msg_set_dest_session_valid(struct tipc_msg *m, bool valid)
517*4882a593Smuzhiyun {
518*4882a593Smuzhiyun 	msg_set_bits(m, 1, 16, 0x1, valid);
519*4882a593Smuzhiyun }
520*4882a593Smuzhiyun 
msg_dest_session(struct tipc_msg * m)521*4882a593Smuzhiyun static inline u16 msg_dest_session(struct tipc_msg *m)
522*4882a593Smuzhiyun {
523*4882a593Smuzhiyun 	return msg_bits(m, 1, 0, 0xffff);
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun 
msg_set_dest_session(struct tipc_msg * m,u16 n)526*4882a593Smuzhiyun static inline void msg_set_dest_session(struct tipc_msg *m, u16 n)
527*4882a593Smuzhiyun {
528*4882a593Smuzhiyun 	msg_set_bits(m, 1, 0, 0xffff, n);
529*4882a593Smuzhiyun }
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun /*
532*4882a593Smuzhiyun  * Word 2
533*4882a593Smuzhiyun  */
msg_ack(struct tipc_msg * m)534*4882a593Smuzhiyun static inline u16 msg_ack(struct tipc_msg *m)
535*4882a593Smuzhiyun {
536*4882a593Smuzhiyun 	return msg_bits(m, 2, 16, 0xffff);
537*4882a593Smuzhiyun }
538*4882a593Smuzhiyun 
msg_set_ack(struct tipc_msg * m,u16 n)539*4882a593Smuzhiyun static inline void msg_set_ack(struct tipc_msg *m, u16 n)
540*4882a593Smuzhiyun {
541*4882a593Smuzhiyun 	msg_set_bits(m, 2, 16, 0xffff, n);
542*4882a593Smuzhiyun }
543*4882a593Smuzhiyun 
msg_seqno(struct tipc_msg * m)544*4882a593Smuzhiyun static inline u16 msg_seqno(struct tipc_msg *m)
545*4882a593Smuzhiyun {
546*4882a593Smuzhiyun 	return msg_bits(m, 2, 0, 0xffff);
547*4882a593Smuzhiyun }
548*4882a593Smuzhiyun 
msg_set_seqno(struct tipc_msg * m,u16 n)549*4882a593Smuzhiyun static inline void msg_set_seqno(struct tipc_msg *m, u16 n)
550*4882a593Smuzhiyun {
551*4882a593Smuzhiyun 	msg_set_bits(m, 2, 0, 0xffff, n);
552*4882a593Smuzhiyun }
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun /*
555*4882a593Smuzhiyun  * Words 3-10
556*4882a593Smuzhiyun  */
msg_importance(struct tipc_msg * m)557*4882a593Smuzhiyun static inline u32 msg_importance(struct tipc_msg *m)
558*4882a593Smuzhiyun {
559*4882a593Smuzhiyun 	int usr = msg_user(m);
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	if (likely((usr <= TIPC_CRITICAL_IMPORTANCE) && !msg_errcode(m)))
562*4882a593Smuzhiyun 		return usr;
563*4882a593Smuzhiyun 	if ((usr == MSG_FRAGMENTER) || (usr == MSG_BUNDLER))
564*4882a593Smuzhiyun 		return msg_bits(m, 9, 0, 0x7);
565*4882a593Smuzhiyun 	return TIPC_SYSTEM_IMPORTANCE;
566*4882a593Smuzhiyun }
567*4882a593Smuzhiyun 
msg_set_importance(struct tipc_msg * m,u32 i)568*4882a593Smuzhiyun static inline void msg_set_importance(struct tipc_msg *m, u32 i)
569*4882a593Smuzhiyun {
570*4882a593Smuzhiyun 	int usr = msg_user(m);
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun 	if (likely((usr == MSG_FRAGMENTER) || (usr == MSG_BUNDLER)))
573*4882a593Smuzhiyun 		msg_set_bits(m, 9, 0, 0x7, i);
574*4882a593Smuzhiyun 	else if (i < TIPC_SYSTEM_IMPORTANCE)
575*4882a593Smuzhiyun 		msg_set_user(m, i);
576*4882a593Smuzhiyun 	else
577*4882a593Smuzhiyun 		pr_warn("Trying to set illegal importance in message\n");
578*4882a593Smuzhiyun }
579*4882a593Smuzhiyun 
msg_prevnode(struct tipc_msg * m)580*4882a593Smuzhiyun static inline u32 msg_prevnode(struct tipc_msg *m)
581*4882a593Smuzhiyun {
582*4882a593Smuzhiyun 	return msg_word(m, 3);
583*4882a593Smuzhiyun }
584*4882a593Smuzhiyun 
msg_set_prevnode(struct tipc_msg * m,u32 a)585*4882a593Smuzhiyun static inline void msg_set_prevnode(struct tipc_msg *m, u32 a)
586*4882a593Smuzhiyun {
587*4882a593Smuzhiyun 	msg_set_word(m, 3, a);
588*4882a593Smuzhiyun }
589*4882a593Smuzhiyun 
msg_origport(struct tipc_msg * m)590*4882a593Smuzhiyun static inline u32 msg_origport(struct tipc_msg *m)
591*4882a593Smuzhiyun {
592*4882a593Smuzhiyun 	if (msg_user(m) == MSG_FRAGMENTER)
593*4882a593Smuzhiyun 		m = msg_inner_hdr(m);
594*4882a593Smuzhiyun 	return msg_word(m, 4);
595*4882a593Smuzhiyun }
596*4882a593Smuzhiyun 
msg_set_origport(struct tipc_msg * m,u32 p)597*4882a593Smuzhiyun static inline void msg_set_origport(struct tipc_msg *m, u32 p)
598*4882a593Smuzhiyun {
599*4882a593Smuzhiyun 	msg_set_word(m, 4, p);
600*4882a593Smuzhiyun }
601*4882a593Smuzhiyun 
msg_named_seqno(struct tipc_msg * m)602*4882a593Smuzhiyun static inline u16 msg_named_seqno(struct tipc_msg *m)
603*4882a593Smuzhiyun {
604*4882a593Smuzhiyun 	return msg_bits(m, 4, 0, 0xffff);
605*4882a593Smuzhiyun }
606*4882a593Smuzhiyun 
msg_set_named_seqno(struct tipc_msg * m,u16 n)607*4882a593Smuzhiyun static inline void msg_set_named_seqno(struct tipc_msg *m, u16 n)
608*4882a593Smuzhiyun {
609*4882a593Smuzhiyun 	msg_set_bits(m, 4, 0, 0xffff, n);
610*4882a593Smuzhiyun }
611*4882a593Smuzhiyun 
msg_destport(struct tipc_msg * m)612*4882a593Smuzhiyun static inline u32 msg_destport(struct tipc_msg *m)
613*4882a593Smuzhiyun {
614*4882a593Smuzhiyun 	return msg_word(m, 5);
615*4882a593Smuzhiyun }
616*4882a593Smuzhiyun 
msg_set_destport(struct tipc_msg * m,u32 p)617*4882a593Smuzhiyun static inline void msg_set_destport(struct tipc_msg *m, u32 p)
618*4882a593Smuzhiyun {
619*4882a593Smuzhiyun 	msg_set_word(m, 5, p);
620*4882a593Smuzhiyun }
621*4882a593Smuzhiyun 
msg_mc_netid(struct tipc_msg * m)622*4882a593Smuzhiyun static inline u32 msg_mc_netid(struct tipc_msg *m)
623*4882a593Smuzhiyun {
624*4882a593Smuzhiyun 	return msg_word(m, 5);
625*4882a593Smuzhiyun }
626*4882a593Smuzhiyun 
msg_set_mc_netid(struct tipc_msg * m,u32 p)627*4882a593Smuzhiyun static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)
628*4882a593Smuzhiyun {
629*4882a593Smuzhiyun 	msg_set_word(m, 5, p);
630*4882a593Smuzhiyun }
631*4882a593Smuzhiyun 
msg_short(struct tipc_msg * m)632*4882a593Smuzhiyun static inline int msg_short(struct tipc_msg *m)
633*4882a593Smuzhiyun {
634*4882a593Smuzhiyun 	return msg_hdr_sz(m) == SHORT_H_SIZE;
635*4882a593Smuzhiyun }
636*4882a593Smuzhiyun 
msg_orignode(struct tipc_msg * m)637*4882a593Smuzhiyun static inline u32 msg_orignode(struct tipc_msg *m)
638*4882a593Smuzhiyun {
639*4882a593Smuzhiyun 	if (likely(msg_short(m)))
640*4882a593Smuzhiyun 		return msg_prevnode(m);
641*4882a593Smuzhiyun 	return msg_word(m, 6);
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun 
msg_set_orignode(struct tipc_msg * m,u32 a)644*4882a593Smuzhiyun static inline void msg_set_orignode(struct tipc_msg *m, u32 a)
645*4882a593Smuzhiyun {
646*4882a593Smuzhiyun 	msg_set_word(m, 6, a);
647*4882a593Smuzhiyun }
648*4882a593Smuzhiyun 
msg_destnode(struct tipc_msg * m)649*4882a593Smuzhiyun static inline u32 msg_destnode(struct tipc_msg *m)
650*4882a593Smuzhiyun {
651*4882a593Smuzhiyun 	return msg_word(m, 7);
652*4882a593Smuzhiyun }
653*4882a593Smuzhiyun 
msg_set_destnode(struct tipc_msg * m,u32 a)654*4882a593Smuzhiyun static inline void msg_set_destnode(struct tipc_msg *m, u32 a)
655*4882a593Smuzhiyun {
656*4882a593Smuzhiyun 	msg_set_word(m, 7, a);
657*4882a593Smuzhiyun }
658*4882a593Smuzhiyun 
msg_nametype(struct tipc_msg * m)659*4882a593Smuzhiyun static inline u32 msg_nametype(struct tipc_msg *m)
660*4882a593Smuzhiyun {
661*4882a593Smuzhiyun 	return msg_word(m, 8);
662*4882a593Smuzhiyun }
663*4882a593Smuzhiyun 
msg_set_nametype(struct tipc_msg * m,u32 n)664*4882a593Smuzhiyun static inline void msg_set_nametype(struct tipc_msg *m, u32 n)
665*4882a593Smuzhiyun {
666*4882a593Smuzhiyun 	msg_set_word(m, 8, n);
667*4882a593Smuzhiyun }
668*4882a593Smuzhiyun 
msg_nameinst(struct tipc_msg * m)669*4882a593Smuzhiyun static inline u32 msg_nameinst(struct tipc_msg *m)
670*4882a593Smuzhiyun {
671*4882a593Smuzhiyun 	return msg_word(m, 9);
672*4882a593Smuzhiyun }
673*4882a593Smuzhiyun 
msg_namelower(struct tipc_msg * m)674*4882a593Smuzhiyun static inline u32 msg_namelower(struct tipc_msg *m)
675*4882a593Smuzhiyun {
676*4882a593Smuzhiyun 	return msg_nameinst(m);
677*4882a593Smuzhiyun }
678*4882a593Smuzhiyun 
msg_set_namelower(struct tipc_msg * m,u32 n)679*4882a593Smuzhiyun static inline void msg_set_namelower(struct tipc_msg *m, u32 n)
680*4882a593Smuzhiyun {
681*4882a593Smuzhiyun 	msg_set_word(m, 9, n);
682*4882a593Smuzhiyun }
683*4882a593Smuzhiyun 
msg_set_nameinst(struct tipc_msg * m,u32 n)684*4882a593Smuzhiyun static inline void msg_set_nameinst(struct tipc_msg *m, u32 n)
685*4882a593Smuzhiyun {
686*4882a593Smuzhiyun 	msg_set_namelower(m, n);
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun 
msg_nameupper(struct tipc_msg * m)689*4882a593Smuzhiyun static inline u32 msg_nameupper(struct tipc_msg *m)
690*4882a593Smuzhiyun {
691*4882a593Smuzhiyun 	return msg_word(m, 10);
692*4882a593Smuzhiyun }
693*4882a593Smuzhiyun 
msg_set_nameupper(struct tipc_msg * m,u32 n)694*4882a593Smuzhiyun static inline void msg_set_nameupper(struct tipc_msg *m, u32 n)
695*4882a593Smuzhiyun {
696*4882a593Smuzhiyun 	msg_set_word(m, 10, n);
697*4882a593Smuzhiyun }
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun /*
700*4882a593Smuzhiyun  * Constants and routines used to read and write TIPC internal message headers
701*4882a593Smuzhiyun  */
702*4882a593Smuzhiyun 
703*4882a593Smuzhiyun /*
704*4882a593Smuzhiyun  *  Connection management protocol message types
705*4882a593Smuzhiyun  */
706*4882a593Smuzhiyun #define CONN_PROBE        0
707*4882a593Smuzhiyun #define CONN_PROBE_REPLY  1
708*4882a593Smuzhiyun #define CONN_ACK          2
709*4882a593Smuzhiyun 
710*4882a593Smuzhiyun /*
711*4882a593Smuzhiyun  * Name distributor message types
712*4882a593Smuzhiyun  */
713*4882a593Smuzhiyun #define PUBLICATION       0
714*4882a593Smuzhiyun #define WITHDRAWAL        1
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun /*
717*4882a593Smuzhiyun  * Segmentation message types
718*4882a593Smuzhiyun  */
719*4882a593Smuzhiyun #define FIRST_FRAGMENT		0
720*4882a593Smuzhiyun #define FRAGMENT		1
721*4882a593Smuzhiyun #define LAST_FRAGMENT		2
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun /*
724*4882a593Smuzhiyun  * Link management protocol message types
725*4882a593Smuzhiyun  */
726*4882a593Smuzhiyun #define STATE_MSG		0
727*4882a593Smuzhiyun #define RESET_MSG		1
728*4882a593Smuzhiyun #define ACTIVATE_MSG		2
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun /*
731*4882a593Smuzhiyun  * Changeover tunnel message types
732*4882a593Smuzhiyun  */
733*4882a593Smuzhiyun #define SYNCH_MSG		0
734*4882a593Smuzhiyun #define FAILOVER_MSG		1
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun /*
737*4882a593Smuzhiyun  * Config protocol message types
738*4882a593Smuzhiyun  */
739*4882a593Smuzhiyun #define DSC_REQ_MSG		0
740*4882a593Smuzhiyun #define DSC_RESP_MSG		1
741*4882a593Smuzhiyun #define DSC_TRIAL_MSG		2
742*4882a593Smuzhiyun #define DSC_TRIAL_FAIL_MSG	3
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun /*
745*4882a593Smuzhiyun  * Group protocol message types
746*4882a593Smuzhiyun  */
747*4882a593Smuzhiyun #define GRP_JOIN_MSG         0
748*4882a593Smuzhiyun #define GRP_LEAVE_MSG        1
749*4882a593Smuzhiyun #define GRP_ADV_MSG          2
750*4882a593Smuzhiyun #define GRP_ACK_MSG          3
751*4882a593Smuzhiyun #define GRP_RECLAIM_MSG      4
752*4882a593Smuzhiyun #define GRP_REMIT_MSG        5
753*4882a593Smuzhiyun 
754*4882a593Smuzhiyun /* Crypto message types */
755*4882a593Smuzhiyun #define KEY_DISTR_MSG		0
756*4882a593Smuzhiyun 
757*4882a593Smuzhiyun /*
758*4882a593Smuzhiyun  * Word 1
759*4882a593Smuzhiyun  */
msg_seq_gap(struct tipc_msg * m)760*4882a593Smuzhiyun static inline u32 msg_seq_gap(struct tipc_msg *m)
761*4882a593Smuzhiyun {
762*4882a593Smuzhiyun 	return msg_bits(m, 1, 16, 0x1fff);
763*4882a593Smuzhiyun }
764*4882a593Smuzhiyun 
msg_set_seq_gap(struct tipc_msg * m,u32 n)765*4882a593Smuzhiyun static inline void msg_set_seq_gap(struct tipc_msg *m, u32 n)
766*4882a593Smuzhiyun {
767*4882a593Smuzhiyun 	msg_set_bits(m, 1, 16, 0x1fff, n);
768*4882a593Smuzhiyun }
769*4882a593Smuzhiyun 
msg_node_sig(struct tipc_msg * m)770*4882a593Smuzhiyun static inline u32 msg_node_sig(struct tipc_msg *m)
771*4882a593Smuzhiyun {
772*4882a593Smuzhiyun 	return msg_bits(m, 1, 0, 0xffff);
773*4882a593Smuzhiyun }
774*4882a593Smuzhiyun 
msg_set_node_sig(struct tipc_msg * m,u32 n)775*4882a593Smuzhiyun static inline void msg_set_node_sig(struct tipc_msg *m, u32 n)
776*4882a593Smuzhiyun {
777*4882a593Smuzhiyun 	msg_set_bits(m, 1, 0, 0xffff, n);
778*4882a593Smuzhiyun }
779*4882a593Smuzhiyun 
msg_node_capabilities(struct tipc_msg * m)780*4882a593Smuzhiyun static inline u32 msg_node_capabilities(struct tipc_msg *m)
781*4882a593Smuzhiyun {
782*4882a593Smuzhiyun 	return msg_bits(m, 1, 15, 0x1fff);
783*4882a593Smuzhiyun }
784*4882a593Smuzhiyun 
msg_set_node_capabilities(struct tipc_msg * m,u32 n)785*4882a593Smuzhiyun static inline void msg_set_node_capabilities(struct tipc_msg *m, u32 n)
786*4882a593Smuzhiyun {
787*4882a593Smuzhiyun 	msg_set_bits(m, 1, 15, 0x1fff, n);
788*4882a593Smuzhiyun }
789*4882a593Smuzhiyun 
790*4882a593Smuzhiyun /*
791*4882a593Smuzhiyun  * Word 2
792*4882a593Smuzhiyun  */
msg_dest_domain(struct tipc_msg * m)793*4882a593Smuzhiyun static inline u32 msg_dest_domain(struct tipc_msg *m)
794*4882a593Smuzhiyun {
795*4882a593Smuzhiyun 	return msg_word(m, 2);
796*4882a593Smuzhiyun }
797*4882a593Smuzhiyun 
msg_set_dest_domain(struct tipc_msg * m,u32 n)798*4882a593Smuzhiyun static inline void msg_set_dest_domain(struct tipc_msg *m, u32 n)
799*4882a593Smuzhiyun {
800*4882a593Smuzhiyun 	msg_set_word(m, 2, n);
801*4882a593Smuzhiyun }
802*4882a593Smuzhiyun 
msg_bcgap_after(struct tipc_msg * m)803*4882a593Smuzhiyun static inline u32 msg_bcgap_after(struct tipc_msg *m)
804*4882a593Smuzhiyun {
805*4882a593Smuzhiyun 	return msg_bits(m, 2, 16, 0xffff);
806*4882a593Smuzhiyun }
807*4882a593Smuzhiyun 
msg_set_bcgap_after(struct tipc_msg * m,u32 n)808*4882a593Smuzhiyun static inline void msg_set_bcgap_after(struct tipc_msg *m, u32 n)
809*4882a593Smuzhiyun {
810*4882a593Smuzhiyun 	msg_set_bits(m, 2, 16, 0xffff, n);
811*4882a593Smuzhiyun }
812*4882a593Smuzhiyun 
msg_bcgap_to(struct tipc_msg * m)813*4882a593Smuzhiyun static inline u32 msg_bcgap_to(struct tipc_msg *m)
814*4882a593Smuzhiyun {
815*4882a593Smuzhiyun 	return msg_bits(m, 2, 0, 0xffff);
816*4882a593Smuzhiyun }
817*4882a593Smuzhiyun 
msg_set_bcgap_to(struct tipc_msg * m,u32 n)818*4882a593Smuzhiyun static inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n)
819*4882a593Smuzhiyun {
820*4882a593Smuzhiyun 	msg_set_bits(m, 2, 0, 0xffff, n);
821*4882a593Smuzhiyun }
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun /*
824*4882a593Smuzhiyun  * Word 4
825*4882a593Smuzhiyun  */
msg_last_bcast(struct tipc_msg * m)826*4882a593Smuzhiyun static inline u32 msg_last_bcast(struct tipc_msg *m)
827*4882a593Smuzhiyun {
828*4882a593Smuzhiyun 	return msg_bits(m, 4, 16, 0xffff);
829*4882a593Smuzhiyun }
830*4882a593Smuzhiyun 
msg_bc_snd_nxt(struct tipc_msg * m)831*4882a593Smuzhiyun static inline u32 msg_bc_snd_nxt(struct tipc_msg *m)
832*4882a593Smuzhiyun {
833*4882a593Smuzhiyun 	return msg_last_bcast(m) + 1;
834*4882a593Smuzhiyun }
835*4882a593Smuzhiyun 
msg_set_last_bcast(struct tipc_msg * m,u32 n)836*4882a593Smuzhiyun static inline void msg_set_last_bcast(struct tipc_msg *m, u32 n)
837*4882a593Smuzhiyun {
838*4882a593Smuzhiyun 	msg_set_bits(m, 4, 16, 0xffff, n);
839*4882a593Smuzhiyun }
840*4882a593Smuzhiyun 
msg_nof_fragms(struct tipc_msg * m)841*4882a593Smuzhiyun static inline u32 msg_nof_fragms(struct tipc_msg *m)
842*4882a593Smuzhiyun {
843*4882a593Smuzhiyun 	return msg_bits(m, 4, 0, 0xffff);
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun 
msg_set_nof_fragms(struct tipc_msg * m,u32 n)846*4882a593Smuzhiyun static inline void msg_set_nof_fragms(struct tipc_msg *m, u32 n)
847*4882a593Smuzhiyun {
848*4882a593Smuzhiyun 	msg_set_bits(m, 4, 0, 0xffff, n);
849*4882a593Smuzhiyun }
850*4882a593Smuzhiyun 
msg_fragm_no(struct tipc_msg * m)851*4882a593Smuzhiyun static inline u32 msg_fragm_no(struct tipc_msg *m)
852*4882a593Smuzhiyun {
853*4882a593Smuzhiyun 	return msg_bits(m, 4, 16, 0xffff);
854*4882a593Smuzhiyun }
855*4882a593Smuzhiyun 
msg_set_fragm_no(struct tipc_msg * m,u32 n)856*4882a593Smuzhiyun static inline void msg_set_fragm_no(struct tipc_msg *m, u32 n)
857*4882a593Smuzhiyun {
858*4882a593Smuzhiyun 	msg_set_bits(m, 4, 16, 0xffff, n);
859*4882a593Smuzhiyun }
860*4882a593Smuzhiyun 
msg_next_sent(struct tipc_msg * m)861*4882a593Smuzhiyun static inline u16 msg_next_sent(struct tipc_msg *m)
862*4882a593Smuzhiyun {
863*4882a593Smuzhiyun 	return msg_bits(m, 4, 0, 0xffff);
864*4882a593Smuzhiyun }
865*4882a593Smuzhiyun 
msg_set_next_sent(struct tipc_msg * m,u16 n)866*4882a593Smuzhiyun static inline void msg_set_next_sent(struct tipc_msg *m, u16 n)
867*4882a593Smuzhiyun {
868*4882a593Smuzhiyun 	msg_set_bits(m, 4, 0, 0xffff, n);
869*4882a593Smuzhiyun }
870*4882a593Smuzhiyun 
msg_set_long_msgno(struct tipc_msg * m,u32 n)871*4882a593Smuzhiyun static inline void msg_set_long_msgno(struct tipc_msg *m, u32 n)
872*4882a593Smuzhiyun {
873*4882a593Smuzhiyun 	msg_set_bits(m, 4, 0, 0xffff, n);
874*4882a593Smuzhiyun }
875*4882a593Smuzhiyun 
msg_bc_netid(struct tipc_msg * m)876*4882a593Smuzhiyun static inline u32 msg_bc_netid(struct tipc_msg *m)
877*4882a593Smuzhiyun {
878*4882a593Smuzhiyun 	return msg_word(m, 4);
879*4882a593Smuzhiyun }
880*4882a593Smuzhiyun 
msg_set_bc_netid(struct tipc_msg * m,u32 id)881*4882a593Smuzhiyun static inline void msg_set_bc_netid(struct tipc_msg *m, u32 id)
882*4882a593Smuzhiyun {
883*4882a593Smuzhiyun 	msg_set_word(m, 4, id);
884*4882a593Smuzhiyun }
885*4882a593Smuzhiyun 
msg_link_selector(struct tipc_msg * m)886*4882a593Smuzhiyun static inline u32 msg_link_selector(struct tipc_msg *m)
887*4882a593Smuzhiyun {
888*4882a593Smuzhiyun 	if (msg_user(m) == MSG_FRAGMENTER)
889*4882a593Smuzhiyun 		m = (void *)msg_data(m);
890*4882a593Smuzhiyun 	return msg_bits(m, 4, 0, 1);
891*4882a593Smuzhiyun }
892*4882a593Smuzhiyun 
893*4882a593Smuzhiyun /*
894*4882a593Smuzhiyun  * Word 5
895*4882a593Smuzhiyun  */
msg_session(struct tipc_msg * m)896*4882a593Smuzhiyun static inline u16 msg_session(struct tipc_msg *m)
897*4882a593Smuzhiyun {
898*4882a593Smuzhiyun 	return msg_bits(m, 5, 16, 0xffff);
899*4882a593Smuzhiyun }
900*4882a593Smuzhiyun 
msg_set_session(struct tipc_msg * m,u16 n)901*4882a593Smuzhiyun static inline void msg_set_session(struct tipc_msg *m, u16 n)
902*4882a593Smuzhiyun {
903*4882a593Smuzhiyun 	msg_set_bits(m, 5, 16, 0xffff, n);
904*4882a593Smuzhiyun }
905*4882a593Smuzhiyun 
msg_probe(struct tipc_msg * m)906*4882a593Smuzhiyun static inline u32 msg_probe(struct tipc_msg *m)
907*4882a593Smuzhiyun {
908*4882a593Smuzhiyun 	return msg_bits(m, 5, 0, 1);
909*4882a593Smuzhiyun }
910*4882a593Smuzhiyun 
msg_set_probe(struct tipc_msg * m,u32 val)911*4882a593Smuzhiyun static inline void msg_set_probe(struct tipc_msg *m, u32 val)
912*4882a593Smuzhiyun {
913*4882a593Smuzhiyun 	msg_set_bits(m, 5, 0, 1, val);
914*4882a593Smuzhiyun }
915*4882a593Smuzhiyun 
msg_net_plane(struct tipc_msg * m)916*4882a593Smuzhiyun static inline char msg_net_plane(struct tipc_msg *m)
917*4882a593Smuzhiyun {
918*4882a593Smuzhiyun 	return msg_bits(m, 5, 1, 7) + 'A';
919*4882a593Smuzhiyun }
920*4882a593Smuzhiyun 
msg_set_net_plane(struct tipc_msg * m,char n)921*4882a593Smuzhiyun static inline void msg_set_net_plane(struct tipc_msg *m, char n)
922*4882a593Smuzhiyun {
923*4882a593Smuzhiyun 	msg_set_bits(m, 5, 1, 7, (n - 'A'));
924*4882a593Smuzhiyun }
925*4882a593Smuzhiyun 
msg_linkprio(struct tipc_msg * m)926*4882a593Smuzhiyun static inline u32 msg_linkprio(struct tipc_msg *m)
927*4882a593Smuzhiyun {
928*4882a593Smuzhiyun 	return msg_bits(m, 5, 4, 0x1f);
929*4882a593Smuzhiyun }
930*4882a593Smuzhiyun 
msg_set_linkprio(struct tipc_msg * m,u32 n)931*4882a593Smuzhiyun static inline void msg_set_linkprio(struct tipc_msg *m, u32 n)
932*4882a593Smuzhiyun {
933*4882a593Smuzhiyun 	msg_set_bits(m, 5, 4, 0x1f, n);
934*4882a593Smuzhiyun }
935*4882a593Smuzhiyun 
msg_bearer_id(struct tipc_msg * m)936*4882a593Smuzhiyun static inline u32 msg_bearer_id(struct tipc_msg *m)
937*4882a593Smuzhiyun {
938*4882a593Smuzhiyun 	return msg_bits(m, 5, 9, 0x7);
939*4882a593Smuzhiyun }
940*4882a593Smuzhiyun 
msg_set_bearer_id(struct tipc_msg * m,u32 n)941*4882a593Smuzhiyun static inline void msg_set_bearer_id(struct tipc_msg *m, u32 n)
942*4882a593Smuzhiyun {
943*4882a593Smuzhiyun 	msg_set_bits(m, 5, 9, 0x7, n);
944*4882a593Smuzhiyun }
945*4882a593Smuzhiyun 
msg_redundant_link(struct tipc_msg * m)946*4882a593Smuzhiyun static inline u32 msg_redundant_link(struct tipc_msg *m)
947*4882a593Smuzhiyun {
948*4882a593Smuzhiyun 	return msg_bits(m, 5, 12, 0x1);
949*4882a593Smuzhiyun }
950*4882a593Smuzhiyun 
msg_set_redundant_link(struct tipc_msg * m,u32 r)951*4882a593Smuzhiyun static inline void msg_set_redundant_link(struct tipc_msg *m, u32 r)
952*4882a593Smuzhiyun {
953*4882a593Smuzhiyun 	msg_set_bits(m, 5, 12, 0x1, r);
954*4882a593Smuzhiyun }
955*4882a593Smuzhiyun 
msg_peer_stopping(struct tipc_msg * m)956*4882a593Smuzhiyun static inline u32 msg_peer_stopping(struct tipc_msg *m)
957*4882a593Smuzhiyun {
958*4882a593Smuzhiyun 	return msg_bits(m, 5, 13, 0x1);
959*4882a593Smuzhiyun }
960*4882a593Smuzhiyun 
msg_set_peer_stopping(struct tipc_msg * m,u32 s)961*4882a593Smuzhiyun static inline void msg_set_peer_stopping(struct tipc_msg *m, u32 s)
962*4882a593Smuzhiyun {
963*4882a593Smuzhiyun 	msg_set_bits(m, 5, 13, 0x1, s);
964*4882a593Smuzhiyun }
965*4882a593Smuzhiyun 
msg_bc_ack_invalid(struct tipc_msg * m)966*4882a593Smuzhiyun static inline bool msg_bc_ack_invalid(struct tipc_msg *m)
967*4882a593Smuzhiyun {
968*4882a593Smuzhiyun 	switch (msg_user(m)) {
969*4882a593Smuzhiyun 	case BCAST_PROTOCOL:
970*4882a593Smuzhiyun 	case NAME_DISTRIBUTOR:
971*4882a593Smuzhiyun 	case LINK_PROTOCOL:
972*4882a593Smuzhiyun 		return msg_bits(m, 5, 14, 0x1);
973*4882a593Smuzhiyun 	default:
974*4882a593Smuzhiyun 		return false;
975*4882a593Smuzhiyun 	}
976*4882a593Smuzhiyun }
977*4882a593Smuzhiyun 
msg_set_bc_ack_invalid(struct tipc_msg * m,bool invalid)978*4882a593Smuzhiyun static inline void msg_set_bc_ack_invalid(struct tipc_msg *m, bool invalid)
979*4882a593Smuzhiyun {
980*4882a593Smuzhiyun 	msg_set_bits(m, 5, 14, 0x1, invalid);
981*4882a593Smuzhiyun }
982*4882a593Smuzhiyun 
msg_media_addr(struct tipc_msg * m)983*4882a593Smuzhiyun static inline char *msg_media_addr(struct tipc_msg *m)
984*4882a593Smuzhiyun {
985*4882a593Smuzhiyun 	return (char *)&m->hdr[TIPC_MEDIA_INFO_OFFSET];
986*4882a593Smuzhiyun }
987*4882a593Smuzhiyun 
msg_bc_gap(struct tipc_msg * m)988*4882a593Smuzhiyun static inline u32 msg_bc_gap(struct tipc_msg *m)
989*4882a593Smuzhiyun {
990*4882a593Smuzhiyun 	return msg_bits(m, 8, 0, 0x3ff);
991*4882a593Smuzhiyun }
992*4882a593Smuzhiyun 
msg_set_bc_gap(struct tipc_msg * m,u32 n)993*4882a593Smuzhiyun static inline void msg_set_bc_gap(struct tipc_msg *m, u32 n)
994*4882a593Smuzhiyun {
995*4882a593Smuzhiyun 	msg_set_bits(m, 8, 0, 0x3ff, n);
996*4882a593Smuzhiyun }
997*4882a593Smuzhiyun 
998*4882a593Smuzhiyun /*
999*4882a593Smuzhiyun  * Word 9
1000*4882a593Smuzhiyun  */
msg_msgcnt(struct tipc_msg * m)1001*4882a593Smuzhiyun static inline u16 msg_msgcnt(struct tipc_msg *m)
1002*4882a593Smuzhiyun {
1003*4882a593Smuzhiyun 	return msg_bits(m, 9, 16, 0xffff);
1004*4882a593Smuzhiyun }
1005*4882a593Smuzhiyun 
msg_set_msgcnt(struct tipc_msg * m,u16 n)1006*4882a593Smuzhiyun static inline void msg_set_msgcnt(struct tipc_msg *m, u16 n)
1007*4882a593Smuzhiyun {
1008*4882a593Smuzhiyun 	msg_set_bits(m, 9, 16, 0xffff, n);
1009*4882a593Smuzhiyun }
1010*4882a593Smuzhiyun 
msg_syncpt(struct tipc_msg * m)1011*4882a593Smuzhiyun static inline u16 msg_syncpt(struct tipc_msg *m)
1012*4882a593Smuzhiyun {
1013*4882a593Smuzhiyun 	return msg_bits(m, 9, 16, 0xffff);
1014*4882a593Smuzhiyun }
1015*4882a593Smuzhiyun 
msg_set_syncpt(struct tipc_msg * m,u16 n)1016*4882a593Smuzhiyun static inline void msg_set_syncpt(struct tipc_msg *m, u16 n)
1017*4882a593Smuzhiyun {
1018*4882a593Smuzhiyun 	msg_set_bits(m, 9, 16, 0xffff, n);
1019*4882a593Smuzhiyun }
1020*4882a593Smuzhiyun 
msg_conn_ack(struct tipc_msg * m)1021*4882a593Smuzhiyun static inline u32 msg_conn_ack(struct tipc_msg *m)
1022*4882a593Smuzhiyun {
1023*4882a593Smuzhiyun 	return msg_bits(m, 9, 16, 0xffff);
1024*4882a593Smuzhiyun }
1025*4882a593Smuzhiyun 
msg_set_conn_ack(struct tipc_msg * m,u32 n)1026*4882a593Smuzhiyun static inline void msg_set_conn_ack(struct tipc_msg *m, u32 n)
1027*4882a593Smuzhiyun {
1028*4882a593Smuzhiyun 	msg_set_bits(m, 9, 16, 0xffff, n);
1029*4882a593Smuzhiyun }
1030*4882a593Smuzhiyun 
msg_adv_win(struct tipc_msg * m)1031*4882a593Smuzhiyun static inline u16 msg_adv_win(struct tipc_msg *m)
1032*4882a593Smuzhiyun {
1033*4882a593Smuzhiyun 	return msg_bits(m, 9, 0, 0xffff);
1034*4882a593Smuzhiyun }
1035*4882a593Smuzhiyun 
msg_set_adv_win(struct tipc_msg * m,u16 n)1036*4882a593Smuzhiyun static inline void msg_set_adv_win(struct tipc_msg *m, u16 n)
1037*4882a593Smuzhiyun {
1038*4882a593Smuzhiyun 	msg_set_bits(m, 9, 0, 0xffff, n);
1039*4882a593Smuzhiyun }
1040*4882a593Smuzhiyun 
msg_max_pkt(struct tipc_msg * m)1041*4882a593Smuzhiyun static inline u32 msg_max_pkt(struct tipc_msg *m)
1042*4882a593Smuzhiyun {
1043*4882a593Smuzhiyun 	return msg_bits(m, 9, 16, 0xffff) * 4;
1044*4882a593Smuzhiyun }
1045*4882a593Smuzhiyun 
msg_set_max_pkt(struct tipc_msg * m,u32 n)1046*4882a593Smuzhiyun static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n)
1047*4882a593Smuzhiyun {
1048*4882a593Smuzhiyun 	msg_set_bits(m, 9, 16, 0xffff, (n / 4));
1049*4882a593Smuzhiyun }
1050*4882a593Smuzhiyun 
msg_link_tolerance(struct tipc_msg * m)1051*4882a593Smuzhiyun static inline u32 msg_link_tolerance(struct tipc_msg *m)
1052*4882a593Smuzhiyun {
1053*4882a593Smuzhiyun 	return msg_bits(m, 9, 0, 0xffff);
1054*4882a593Smuzhiyun }
1055*4882a593Smuzhiyun 
msg_set_link_tolerance(struct tipc_msg * m,u32 n)1056*4882a593Smuzhiyun static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n)
1057*4882a593Smuzhiyun {
1058*4882a593Smuzhiyun 	msg_set_bits(m, 9, 0, 0xffff, n);
1059*4882a593Smuzhiyun }
1060*4882a593Smuzhiyun 
msg_grp_bc_syncpt(struct tipc_msg * m)1061*4882a593Smuzhiyun static inline u16 msg_grp_bc_syncpt(struct tipc_msg *m)
1062*4882a593Smuzhiyun {
1063*4882a593Smuzhiyun 	return msg_bits(m, 9, 16, 0xffff);
1064*4882a593Smuzhiyun }
1065*4882a593Smuzhiyun 
msg_set_grp_bc_syncpt(struct tipc_msg * m,u16 n)1066*4882a593Smuzhiyun static inline void msg_set_grp_bc_syncpt(struct tipc_msg *m, u16 n)
1067*4882a593Smuzhiyun {
1068*4882a593Smuzhiyun 	msg_set_bits(m, 9, 16, 0xffff, n);
1069*4882a593Smuzhiyun }
1070*4882a593Smuzhiyun 
msg_grp_bc_acked(struct tipc_msg * m)1071*4882a593Smuzhiyun static inline u16 msg_grp_bc_acked(struct tipc_msg *m)
1072*4882a593Smuzhiyun {
1073*4882a593Smuzhiyun 	return msg_bits(m, 9, 16, 0xffff);
1074*4882a593Smuzhiyun }
1075*4882a593Smuzhiyun 
msg_set_grp_bc_acked(struct tipc_msg * m,u16 n)1076*4882a593Smuzhiyun static inline void msg_set_grp_bc_acked(struct tipc_msg *m, u16 n)
1077*4882a593Smuzhiyun {
1078*4882a593Smuzhiyun 	msg_set_bits(m, 9, 16, 0xffff, n);
1079*4882a593Smuzhiyun }
1080*4882a593Smuzhiyun 
msg_grp_remitted(struct tipc_msg * m)1081*4882a593Smuzhiyun static inline u16 msg_grp_remitted(struct tipc_msg *m)
1082*4882a593Smuzhiyun {
1083*4882a593Smuzhiyun 	return msg_bits(m, 9, 16, 0xffff);
1084*4882a593Smuzhiyun }
1085*4882a593Smuzhiyun 
msg_set_grp_remitted(struct tipc_msg * m,u16 n)1086*4882a593Smuzhiyun static inline void msg_set_grp_remitted(struct tipc_msg *m, u16 n)
1087*4882a593Smuzhiyun {
1088*4882a593Smuzhiyun 	msg_set_bits(m, 9, 16, 0xffff, n);
1089*4882a593Smuzhiyun }
1090*4882a593Smuzhiyun 
1091*4882a593Smuzhiyun /* Word 10
1092*4882a593Smuzhiyun  */
msg_grp_evt(struct tipc_msg * m)1093*4882a593Smuzhiyun static inline u16 msg_grp_evt(struct tipc_msg *m)
1094*4882a593Smuzhiyun {
1095*4882a593Smuzhiyun 	return msg_bits(m, 10, 0, 0x3);
1096*4882a593Smuzhiyun }
1097*4882a593Smuzhiyun 
msg_set_grp_evt(struct tipc_msg * m,int n)1098*4882a593Smuzhiyun static inline void msg_set_grp_evt(struct tipc_msg *m, int n)
1099*4882a593Smuzhiyun {
1100*4882a593Smuzhiyun 	msg_set_bits(m, 10, 0, 0x3, n);
1101*4882a593Smuzhiyun }
1102*4882a593Smuzhiyun 
msg_grp_bc_ack_req(struct tipc_msg * m)1103*4882a593Smuzhiyun static inline u16 msg_grp_bc_ack_req(struct tipc_msg *m)
1104*4882a593Smuzhiyun {
1105*4882a593Smuzhiyun 	return msg_bits(m, 10, 0, 0x1);
1106*4882a593Smuzhiyun }
1107*4882a593Smuzhiyun 
msg_set_grp_bc_ack_req(struct tipc_msg * m,bool n)1108*4882a593Smuzhiyun static inline void msg_set_grp_bc_ack_req(struct tipc_msg *m, bool n)
1109*4882a593Smuzhiyun {
1110*4882a593Smuzhiyun 	msg_set_bits(m, 10, 0, 0x1, n);
1111*4882a593Smuzhiyun }
1112*4882a593Smuzhiyun 
msg_grp_bc_seqno(struct tipc_msg * m)1113*4882a593Smuzhiyun static inline u16 msg_grp_bc_seqno(struct tipc_msg *m)
1114*4882a593Smuzhiyun {
1115*4882a593Smuzhiyun 	return msg_bits(m, 10, 16, 0xffff);
1116*4882a593Smuzhiyun }
1117*4882a593Smuzhiyun 
msg_set_grp_bc_seqno(struct tipc_msg * m,u32 n)1118*4882a593Smuzhiyun static inline void msg_set_grp_bc_seqno(struct tipc_msg *m, u32 n)
1119*4882a593Smuzhiyun {
1120*4882a593Smuzhiyun 	msg_set_bits(m, 10, 16, 0xffff, n);
1121*4882a593Smuzhiyun }
1122*4882a593Smuzhiyun 
msg_peer_link_is_up(struct tipc_msg * m)1123*4882a593Smuzhiyun static inline bool msg_peer_link_is_up(struct tipc_msg *m)
1124*4882a593Smuzhiyun {
1125*4882a593Smuzhiyun 	if (likely(msg_user(m) != LINK_PROTOCOL))
1126*4882a593Smuzhiyun 		return true;
1127*4882a593Smuzhiyun 	if (msg_type(m) == STATE_MSG)
1128*4882a593Smuzhiyun 		return true;
1129*4882a593Smuzhiyun 	return false;
1130*4882a593Smuzhiyun }
1131*4882a593Smuzhiyun 
msg_peer_node_is_up(struct tipc_msg * m)1132*4882a593Smuzhiyun static inline bool msg_peer_node_is_up(struct tipc_msg *m)
1133*4882a593Smuzhiyun {
1134*4882a593Smuzhiyun 	if (msg_peer_link_is_up(m))
1135*4882a593Smuzhiyun 		return true;
1136*4882a593Smuzhiyun 	return msg_redundant_link(m);
1137*4882a593Smuzhiyun }
1138*4882a593Smuzhiyun 
msg_is_reset(struct tipc_msg * hdr)1139*4882a593Smuzhiyun static inline bool msg_is_reset(struct tipc_msg *hdr)
1140*4882a593Smuzhiyun {
1141*4882a593Smuzhiyun 	return (msg_user(hdr) == LINK_PROTOCOL) && (msg_type(hdr) == RESET_MSG);
1142*4882a593Smuzhiyun }
1143*4882a593Smuzhiyun 
1144*4882a593Smuzhiyun /* Word 13
1145*4882a593Smuzhiyun  */
msg_set_peer_net_hash(struct tipc_msg * m,u32 n)1146*4882a593Smuzhiyun static inline void msg_set_peer_net_hash(struct tipc_msg *m, u32 n)
1147*4882a593Smuzhiyun {
1148*4882a593Smuzhiyun 	msg_set_word(m, 13, n);
1149*4882a593Smuzhiyun }
1150*4882a593Smuzhiyun 
msg_peer_net_hash(struct tipc_msg * m)1151*4882a593Smuzhiyun static inline u32 msg_peer_net_hash(struct tipc_msg *m)
1152*4882a593Smuzhiyun {
1153*4882a593Smuzhiyun 	return msg_word(m, 13);
1154*4882a593Smuzhiyun }
1155*4882a593Smuzhiyun 
1156*4882a593Smuzhiyun /* Word 14
1157*4882a593Smuzhiyun  */
msg_sugg_node_addr(struct tipc_msg * m)1158*4882a593Smuzhiyun static inline u32 msg_sugg_node_addr(struct tipc_msg *m)
1159*4882a593Smuzhiyun {
1160*4882a593Smuzhiyun 	return msg_word(m, 14);
1161*4882a593Smuzhiyun }
1162*4882a593Smuzhiyun 
msg_set_sugg_node_addr(struct tipc_msg * m,u32 n)1163*4882a593Smuzhiyun static inline void msg_set_sugg_node_addr(struct tipc_msg *m, u32 n)
1164*4882a593Smuzhiyun {
1165*4882a593Smuzhiyun 	msg_set_word(m, 14, n);
1166*4882a593Smuzhiyun }
1167*4882a593Smuzhiyun 
msg_set_node_id(struct tipc_msg * hdr,u8 * id)1168*4882a593Smuzhiyun static inline void msg_set_node_id(struct tipc_msg *hdr, u8 *id)
1169*4882a593Smuzhiyun {
1170*4882a593Smuzhiyun 	memcpy(msg_data(hdr), id, 16);
1171*4882a593Smuzhiyun }
1172*4882a593Smuzhiyun 
msg_node_id(struct tipc_msg * hdr)1173*4882a593Smuzhiyun static inline u8 *msg_node_id(struct tipc_msg *hdr)
1174*4882a593Smuzhiyun {
1175*4882a593Smuzhiyun 	return (u8 *)msg_data(hdr);
1176*4882a593Smuzhiyun }
1177*4882a593Smuzhiyun 
1178*4882a593Smuzhiyun struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp);
1179*4882a593Smuzhiyun bool tipc_msg_validate(struct sk_buff **_skb);
1180*4882a593Smuzhiyun bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err);
1181*4882a593Smuzhiyun void tipc_skb_reject(struct net *net, int err, struct sk_buff *skb,
1182*4882a593Smuzhiyun 		     struct sk_buff_head *xmitq);
1183*4882a593Smuzhiyun void tipc_msg_init(u32 own_addr, struct tipc_msg *m, u32 user, u32 type,
1184*4882a593Smuzhiyun 		   u32 hsize, u32 destnode);
1185*4882a593Smuzhiyun struct sk_buff *tipc_msg_create(uint user, uint type, uint hdr_sz,
1186*4882a593Smuzhiyun 				uint data_sz, u32 dnode, u32 onode,
1187*4882a593Smuzhiyun 				u32 dport, u32 oport, int errcode);
1188*4882a593Smuzhiyun int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf);
1189*4882a593Smuzhiyun bool tipc_msg_try_bundle(struct sk_buff *tskb, struct sk_buff **skb, u32 mss,
1190*4882a593Smuzhiyun 			 u32 dnode, bool *new_bundle);
1191*4882a593Smuzhiyun bool tipc_msg_extract(struct sk_buff *skb, struct sk_buff **iskb, int *pos);
1192*4882a593Smuzhiyun int tipc_msg_fragment(struct sk_buff *skb, const struct tipc_msg *hdr,
1193*4882a593Smuzhiyun 		      int pktmax, struct sk_buff_head *frags);
1194*4882a593Smuzhiyun int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m,
1195*4882a593Smuzhiyun 		   int offset, int dsz, int mtu, struct sk_buff_head *list);
1196*4882a593Smuzhiyun int tipc_msg_append(struct tipc_msg *hdr, struct msghdr *m, int dlen,
1197*4882a593Smuzhiyun 		    int mss, struct sk_buff_head *txq);
1198*4882a593Smuzhiyun bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err);
1199*4882a593Smuzhiyun bool tipc_msg_assemble(struct sk_buff_head *list);
1200*4882a593Smuzhiyun bool tipc_msg_reassemble(struct sk_buff_head *list, struct sk_buff_head *rcvq);
1201*4882a593Smuzhiyun bool tipc_msg_pskb_copy(u32 dst, struct sk_buff_head *msg,
1202*4882a593Smuzhiyun 			struct sk_buff_head *cpy);
1203*4882a593Smuzhiyun bool __tipc_skb_queue_sorted(struct sk_buff_head *list, u16 seqno,
1204*4882a593Smuzhiyun 			     struct sk_buff *skb);
1205*4882a593Smuzhiyun bool tipc_msg_skb_clone(struct sk_buff_head *msg, struct sk_buff_head *cpy);
1206*4882a593Smuzhiyun 
buf_seqno(struct sk_buff * skb)1207*4882a593Smuzhiyun static inline u16 buf_seqno(struct sk_buff *skb)
1208*4882a593Smuzhiyun {
1209*4882a593Smuzhiyun 	return msg_seqno(buf_msg(skb));
1210*4882a593Smuzhiyun }
1211*4882a593Smuzhiyun 
buf_roundup_len(struct sk_buff * skb)1212*4882a593Smuzhiyun static inline int buf_roundup_len(struct sk_buff *skb)
1213*4882a593Smuzhiyun {
1214*4882a593Smuzhiyun 	return (skb->len / 1024 + 1) * 1024;
1215*4882a593Smuzhiyun }
1216*4882a593Smuzhiyun 
1217*4882a593Smuzhiyun /* tipc_skb_peek(): peek and reserve first buffer in list
1218*4882a593Smuzhiyun  * @list: list to be peeked in
1219*4882a593Smuzhiyun  * Returns pointer to first buffer in list, if any
1220*4882a593Smuzhiyun  */
tipc_skb_peek(struct sk_buff_head * list,spinlock_t * lock)1221*4882a593Smuzhiyun static inline struct sk_buff *tipc_skb_peek(struct sk_buff_head *list,
1222*4882a593Smuzhiyun 					    spinlock_t *lock)
1223*4882a593Smuzhiyun {
1224*4882a593Smuzhiyun 	struct sk_buff *skb;
1225*4882a593Smuzhiyun 
1226*4882a593Smuzhiyun 	spin_lock_bh(lock);
1227*4882a593Smuzhiyun 	skb = skb_peek(list);
1228*4882a593Smuzhiyun 	if (skb)
1229*4882a593Smuzhiyun 		skb_get(skb);
1230*4882a593Smuzhiyun 	spin_unlock_bh(lock);
1231*4882a593Smuzhiyun 	return skb;
1232*4882a593Smuzhiyun }
1233*4882a593Smuzhiyun 
1234*4882a593Smuzhiyun /* tipc_skb_peek_port(): find a destination port, ignoring all destinations
1235*4882a593Smuzhiyun  *                       up to and including 'filter'.
1236*4882a593Smuzhiyun  * Note: ignoring previously tried destinations minimizes the risk of
1237*4882a593Smuzhiyun  *       contention on the socket lock
1238*4882a593Smuzhiyun  * @list: list to be peeked in
1239*4882a593Smuzhiyun  * @filter: last destination to be ignored from search
1240*4882a593Smuzhiyun  * Returns a destination port number, of applicable.
1241*4882a593Smuzhiyun  */
tipc_skb_peek_port(struct sk_buff_head * list,u32 filter)1242*4882a593Smuzhiyun static inline u32 tipc_skb_peek_port(struct sk_buff_head *list, u32 filter)
1243*4882a593Smuzhiyun {
1244*4882a593Smuzhiyun 	struct sk_buff *skb;
1245*4882a593Smuzhiyun 	u32 dport = 0;
1246*4882a593Smuzhiyun 	bool ignore = true;
1247*4882a593Smuzhiyun 
1248*4882a593Smuzhiyun 	spin_lock_bh(&list->lock);
1249*4882a593Smuzhiyun 	skb_queue_walk(list, skb) {
1250*4882a593Smuzhiyun 		dport = msg_destport(buf_msg(skb));
1251*4882a593Smuzhiyun 		if (!filter || skb_queue_is_last(list, skb))
1252*4882a593Smuzhiyun 			break;
1253*4882a593Smuzhiyun 		if (dport == filter)
1254*4882a593Smuzhiyun 			ignore = false;
1255*4882a593Smuzhiyun 		else if (!ignore)
1256*4882a593Smuzhiyun 			break;
1257*4882a593Smuzhiyun 	}
1258*4882a593Smuzhiyun 	spin_unlock_bh(&list->lock);
1259*4882a593Smuzhiyun 	return dport;
1260*4882a593Smuzhiyun }
1261*4882a593Smuzhiyun 
1262*4882a593Smuzhiyun /* tipc_skb_dequeue(): unlink first buffer with dest 'dport' from list
1263*4882a593Smuzhiyun  * @list: list to be unlinked from
1264*4882a593Smuzhiyun  * @dport: selection criteria for buffer to unlink
1265*4882a593Smuzhiyun  */
tipc_skb_dequeue(struct sk_buff_head * list,u32 dport)1266*4882a593Smuzhiyun static inline struct sk_buff *tipc_skb_dequeue(struct sk_buff_head *list,
1267*4882a593Smuzhiyun 					       u32 dport)
1268*4882a593Smuzhiyun {
1269*4882a593Smuzhiyun 	struct sk_buff *_skb, *tmp, *skb = NULL;
1270*4882a593Smuzhiyun 
1271*4882a593Smuzhiyun 	spin_lock_bh(&list->lock);
1272*4882a593Smuzhiyun 	skb_queue_walk_safe(list, _skb, tmp) {
1273*4882a593Smuzhiyun 		if (msg_destport(buf_msg(_skb)) == dport) {
1274*4882a593Smuzhiyun 			__skb_unlink(_skb, list);
1275*4882a593Smuzhiyun 			skb = _skb;
1276*4882a593Smuzhiyun 			break;
1277*4882a593Smuzhiyun 		}
1278*4882a593Smuzhiyun 	}
1279*4882a593Smuzhiyun 	spin_unlock_bh(&list->lock);
1280*4882a593Smuzhiyun 	return skb;
1281*4882a593Smuzhiyun }
1282*4882a593Smuzhiyun 
1283*4882a593Smuzhiyun /* tipc_skb_queue_splice_tail - append an skb list to lock protected list
1284*4882a593Smuzhiyun  * @list: the new list to append. Not lock protected
1285*4882a593Smuzhiyun  * @head: target list. Lock protected.
1286*4882a593Smuzhiyun  */
tipc_skb_queue_splice_tail(struct sk_buff_head * list,struct sk_buff_head * head)1287*4882a593Smuzhiyun static inline void tipc_skb_queue_splice_tail(struct sk_buff_head *list,
1288*4882a593Smuzhiyun 					      struct sk_buff_head *head)
1289*4882a593Smuzhiyun {
1290*4882a593Smuzhiyun 	spin_lock_bh(&head->lock);
1291*4882a593Smuzhiyun 	skb_queue_splice_tail(list, head);
1292*4882a593Smuzhiyun 	spin_unlock_bh(&head->lock);
1293*4882a593Smuzhiyun }
1294*4882a593Smuzhiyun 
1295*4882a593Smuzhiyun /* tipc_skb_queue_splice_tail_init - merge two lock protected skb lists
1296*4882a593Smuzhiyun  * @list: the new list to add. Lock protected. Will be reinitialized
1297*4882a593Smuzhiyun  * @head: target list. Lock protected.
1298*4882a593Smuzhiyun  */
tipc_skb_queue_splice_tail_init(struct sk_buff_head * list,struct sk_buff_head * head)1299*4882a593Smuzhiyun static inline void tipc_skb_queue_splice_tail_init(struct sk_buff_head *list,
1300*4882a593Smuzhiyun 						   struct sk_buff_head *head)
1301*4882a593Smuzhiyun {
1302*4882a593Smuzhiyun 	struct sk_buff_head tmp;
1303*4882a593Smuzhiyun 
1304*4882a593Smuzhiyun 	__skb_queue_head_init(&tmp);
1305*4882a593Smuzhiyun 
1306*4882a593Smuzhiyun 	spin_lock_bh(&list->lock);
1307*4882a593Smuzhiyun 	skb_queue_splice_tail_init(list, &tmp);
1308*4882a593Smuzhiyun 	spin_unlock_bh(&list->lock);
1309*4882a593Smuzhiyun 	tipc_skb_queue_splice_tail(&tmp, head);
1310*4882a593Smuzhiyun }
1311*4882a593Smuzhiyun 
1312*4882a593Smuzhiyun /* __tipc_skb_dequeue() - dequeue the head skb according to expected seqno
1313*4882a593Smuzhiyun  * @list: list to be dequeued from
1314*4882a593Smuzhiyun  * @seqno: seqno of the expected msg
1315*4882a593Smuzhiyun  *
1316*4882a593Smuzhiyun  * returns skb dequeued from the list if its seqno is less than or equal to
1317*4882a593Smuzhiyun  * the expected one, otherwise the skb is still hold
1318*4882a593Smuzhiyun  *
1319*4882a593Smuzhiyun  * Note: must be used with appropriate locks held only
1320*4882a593Smuzhiyun  */
__tipc_skb_dequeue(struct sk_buff_head * list,u16 seqno)1321*4882a593Smuzhiyun static inline struct sk_buff *__tipc_skb_dequeue(struct sk_buff_head *list,
1322*4882a593Smuzhiyun 						 u16 seqno)
1323*4882a593Smuzhiyun {
1324*4882a593Smuzhiyun 	struct sk_buff *skb = skb_peek(list);
1325*4882a593Smuzhiyun 
1326*4882a593Smuzhiyun 	if (skb && less_eq(buf_seqno(skb), seqno)) {
1327*4882a593Smuzhiyun 		__skb_unlink(skb, list);
1328*4882a593Smuzhiyun 		return skb;
1329*4882a593Smuzhiyun 	}
1330*4882a593Smuzhiyun 	return NULL;
1331*4882a593Smuzhiyun }
1332*4882a593Smuzhiyun 
1333*4882a593Smuzhiyun #endif
1334