xref: /openbmc/linux/net/tipc/msg.h (revision 5e4eca5d)
1b97bf3fdSPer Liden /*
2b97bf3fdSPer Liden  * net/tipc/msg.h: Include file for TIPC message header routines
3b97bf3fdSPer Liden  *
475da2163SJon Maloy  * Copyright (c) 2000-2007, 2014-2017 Ericsson AB
5741de3e9SAllan Stephens  * Copyright (c) 2005-2008, 2010-2011, Wind River Systems
6b97bf3fdSPer Liden  * All rights reserved.
7b97bf3fdSPer Liden  *
8b97bf3fdSPer Liden  * Redistribution and use in source and binary forms, with or without
9b97bf3fdSPer Liden  * modification, are permitted provided that the following conditions are met:
10b97bf3fdSPer Liden  *
119ea1fd3cSPer Liden  * 1. Redistributions of source code must retain the above copyright
129ea1fd3cSPer Liden  *    notice, this list of conditions and the following disclaimer.
139ea1fd3cSPer Liden  * 2. Redistributions in binary form must reproduce the above copyright
149ea1fd3cSPer Liden  *    notice, this list of conditions and the following disclaimer in the
159ea1fd3cSPer Liden  *    documentation and/or other materials provided with the distribution.
169ea1fd3cSPer Liden  * 3. Neither the names of the copyright holders nor the names of its
179ea1fd3cSPer Liden  *    contributors may be used to endorse or promote products derived from
189ea1fd3cSPer Liden  *    this software without specific prior written permission.
199ea1fd3cSPer Liden  *
209ea1fd3cSPer Liden  * Alternatively, this software may be distributed under the terms of the
219ea1fd3cSPer Liden  * GNU General Public License ("GPL") version 2 as published by the Free
229ea1fd3cSPer Liden  * Software Foundation.
23b97bf3fdSPer Liden  *
24b97bf3fdSPer Liden  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25b97bf3fdSPer Liden  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26b97bf3fdSPer Liden  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27b97bf3fdSPer Liden  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28b97bf3fdSPer Liden  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29b97bf3fdSPer Liden  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30b97bf3fdSPer Liden  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31b97bf3fdSPer Liden  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32b97bf3fdSPer Liden  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33b97bf3fdSPer Liden  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34b97bf3fdSPer Liden  * POSSIBILITY OF SUCH DAMAGE.
35b97bf3fdSPer Liden  */
36b97bf3fdSPer Liden 
37b97bf3fdSPer Liden #ifndef _TIPC_MSG_H
38b97bf3fdSPer Liden #define _TIPC_MSG_H
39b97bf3fdSPer Liden 
401da46568SYing Xue #include <linux/tipc.h>
41d999297cSJon Paul Maloy #include "core.h"
42b97bf3fdSPer Liden 
43cc4c4353SAllan Stephens /*
44cc4c4353SAllan Stephens  * Constants and routines used to read and write TIPC payload message headers
45cc4c4353SAllan Stephens  *
46cc4c4353SAllan Stephens  * Note: Some items are also used with TIPC internal message headers
47cc4c4353SAllan Stephens  */
48b97bf3fdSPer Liden #define TIPC_VERSION              2
49c637c103SJon Paul Maloy struct plist;
5006d82c91SAllan Stephens 
51d265fef6SAllan Stephens /*
52cc4c4353SAllan Stephens  * Payload message users are defined in TIPC's public API:
53cc4c4353SAllan Stephens  * - TIPC_LOW_IMPORTANCE
54cc4c4353SAllan Stephens  * - TIPC_MEDIUM_IMPORTANCE
55cc4c4353SAllan Stephens  * - TIPC_HIGH_IMPORTANCE
56cc4c4353SAllan Stephens  * - TIPC_CRITICAL_IMPORTANCE
57cc4c4353SAllan Stephens  */
58e3eea1ebSJon Paul Maloy #define TIPC_SYSTEM_IMPORTANCE	4
59e3eea1ebSJon Paul Maloy 
60cc4c4353SAllan Stephens 
61cc4c4353SAllan Stephens /*
62cc4c4353SAllan Stephens  * Payload message types
63d265fef6SAllan Stephens  */
64d265fef6SAllan Stephens #define TIPC_CONN_MSG           0
65d265fef6SAllan Stephens #define TIPC_MCAST_MSG          1
66d265fef6SAllan Stephens #define TIPC_NAMED_MSG          2
67d265fef6SAllan Stephens #define TIPC_DIRECT_MSG         3
68ae236fb2SJon Maloy #define TIPC_GRP_MEMBER_EVT     4
69ae236fb2SJon Maloy #define TIPC_GRP_BCAST_MSG      5
705b8dddb6SJon Maloy #define TIPC_GRP_MCAST_MSG      6
715b8dddb6SJon Maloy #define TIPC_GRP_UCAST_MSG      7
72d265fef6SAllan Stephens 
73cc4c4353SAllan Stephens /*
74e3eea1ebSJon Paul Maloy  * Internal message users
75e3eea1ebSJon Paul Maloy  */
76e3eea1ebSJon Paul Maloy #define  BCAST_PROTOCOL       5
77e3eea1ebSJon Paul Maloy #define  MSG_BUNDLER          6
78e3eea1ebSJon Paul Maloy #define  LINK_PROTOCOL        7
79e3eea1ebSJon Paul Maloy #define  CONN_MANAGER         8
8075da2163SJon Maloy #define  GROUP_PROTOCOL       9
81dff29b1aSJon Paul Maloy #define  TUNNEL_PROTOCOL      10
82e3eea1ebSJon Paul Maloy #define  NAME_DISTRIBUTOR     11
83e3eea1ebSJon Paul Maloy #define  MSG_FRAGMENTER       12
84e3eea1ebSJon Paul Maloy #define  LINK_CONFIG          13
851ef6f7c9STuong Lien #define  MSG_CRYPTO           14
86e3eea1ebSJon Paul Maloy #define  SOCK_WAKEUP          14       /* pseudo user */
8714c04493SJon Maloy #define  TOP_SRV              15       /* pseudo user */
88e3eea1ebSJon Paul Maloy 
89e3eea1ebSJon Paul Maloy /*
90cc4c4353SAllan Stephens  * Message header sizes
91cc4c4353SAllan Stephens  */
92741d9eb7SAllan Stephens #define SHORT_H_SIZE              24	/* In-cluster basic payload message */
93741d9eb7SAllan Stephens #define BASIC_H_SIZE              32	/* Basic payload message */
94741d9eb7SAllan Stephens #define NAMED_H_SIZE              40	/* Named payload message */
95741d9eb7SAllan Stephens #define MCAST_H_SIZE              44	/* Multicast payload message */
9675da2163SJon Maloy #define GROUP_H_SIZE              44	/* Group payload message */
9706d82c91SAllan Stephens #define INT_H_SIZE                40	/* Internal messages */
9806d82c91SAllan Stephens #define MIN_H_SIZE                24	/* Smallest legal TIPC header size */
9906d82c91SAllan Stephens #define MAX_H_SIZE                60	/* Largest possible TIPC header size */
10006d82c91SAllan Stephens 
101b97bf3fdSPer Liden #define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE)
10291e2eb56SErik Hugne #define TIPC_MEDIA_INFO_OFFSET	5
1033d749a6aSAllan Stephens 
104*0c6de0c9SMenglong Dong extern const int one_page_mtu;
105*0c6de0c9SMenglong Dong 
106859fc7c0SYing Xue struct tipc_skb_cb {
107fc1b6d6dSTuong Lien 	union {
108fc1b6d6dSTuong Lien 		struct {
109859fc7c0SYing Xue 			struct sk_buff *tail;
11031c4f4ccSLUU Duc Canh 			unsigned long nxt_retr;
11171204231STuong Lien 			unsigned long retr_stamp;
11271204231STuong Lien 			u32 bytes_read;
11371204231STuong Lien 			u32 orig_member;
114859fc7c0SYing Xue 			u16 chain_imp;
115c1ab3f1dSJon Paul Maloy 			u16 ackers;
11671204231STuong Lien 			u16 retr_cnt;
117fc1b6d6dSTuong Lien 		} __packed;
118fc1b6d6dSTuong Lien #ifdef CONFIG_TIPC_CRYPTO
119fc1b6d6dSTuong Lien 		struct {
120fc1b6d6dSTuong Lien 			struct tipc_crypto *rx;
121fc1b6d6dSTuong Lien 			struct tipc_aead *last;
122fc1b6d6dSTuong Lien 			u8 recurs;
123fc1b6d6dSTuong Lien 		} tx_clone_ctx __packed;
124fc1b6d6dSTuong Lien #endif
125fc1b6d6dSTuong Lien 	} __packed;
126fc1b6d6dSTuong Lien 	union {
127fc1b6d6dSTuong Lien 		struct {
128fc1b6d6dSTuong Lien 			u8 validated:1;
129fc1b6d6dSTuong Lien #ifdef CONFIG_TIPC_CRYPTO
130fc1b6d6dSTuong Lien 			u8 encrypted:1;
131fc1b6d6dSTuong Lien 			u8 decrypted:1;
132daef1ee3STuong Lien #define SKB_PROBING	1
133daef1ee3STuong Lien #define SKB_GRACING	2
134daef1ee3STuong Lien 			u8 xmit_type:2;
135fc1b6d6dSTuong Lien 			u8 tx_clone_deferred:1;
136fc1b6d6dSTuong Lien #endif
137859fc7c0SYing Xue 		};
138fc1b6d6dSTuong Lien 		u8 flags;
139fc1b6d6dSTuong Lien 	};
140fc1b6d6dSTuong Lien 	u8 reserved;
141fc1b6d6dSTuong Lien #ifdef CONFIG_TIPC_CRYPTO
142fc1b6d6dSTuong Lien 	void *crypto_ctx;
143fc1b6d6dSTuong Lien #endif
144fc1b6d6dSTuong Lien } __packed;
145859fc7c0SYing Xue 
146859fc7c0SYing Xue #define TIPC_SKB_CB(__skb) ((struct tipc_skb_cb *)&((__skb)->cb[0]))
147859fc7c0SYing Xue 
148d265fef6SAllan Stephens struct tipc_msg {
149d265fef6SAllan Stephens 	__be32 hdr[15];
150d265fef6SAllan Stephens };
151b97bf3fdSPer Liden 
1529195948fSTuong Lien /* struct tipc_gap_ack - TIPC Gap ACK block
1539195948fSTuong Lien  * @ack: seqno of the last consecutive packet in link deferdq
1549195948fSTuong Lien  * @gap: number of gap packets since the last ack
1559195948fSTuong Lien  *
1569195948fSTuong Lien  * E.g:
1579195948fSTuong Lien  *       link deferdq: 1 2 3 4      10 11      13 14 15       20
1589195948fSTuong Lien  * --> Gap ACK blocks:      <4, 5>,   <11, 1>,      <15, 4>, <20, 0>
1599195948fSTuong Lien  */
1609195948fSTuong Lien struct tipc_gap_ack {
1619195948fSTuong Lien 	__be16 ack;
1629195948fSTuong Lien 	__be16 gap;
1639195948fSTuong Lien };
1649195948fSTuong Lien 
1659195948fSTuong Lien /* struct tipc_gap_ack_blks
1669195948fSTuong Lien  * @len: actual length of the record
167d7626b5aSTuong Lien  * @ugack_cnt: number of Gap ACK blocks for unicast (following the broadcast
168d7626b5aSTuong Lien  *             ones)
169d7626b5aSTuong Lien  * @start_index: starting index for "valid" broadcast Gap ACK blocks
170d7626b5aSTuong Lien  * @bgack_cnt: number of Gap ACK blocks for broadcast in the record
1719195948fSTuong Lien  * @gacks: array of Gap ACK blocks
172d7626b5aSTuong Lien  *
173d7626b5aSTuong Lien  *  31                       16 15                        0
174d7626b5aSTuong Lien  * +-------------+-------------+-------------+-------------+
175d7626b5aSTuong Lien  * |  bgack_cnt  |  ugack_cnt  |            len            |
176d7626b5aSTuong Lien  * +-------------+-------------+-------------+-------------+  -
177d7626b5aSTuong Lien  * |            gap            |            ack            |   |
178d7626b5aSTuong Lien  * +-------------+-------------+-------------+-------------+    > bc gacks
179d7626b5aSTuong Lien  * :                           :                           :   |
180d7626b5aSTuong Lien  * +-------------+-------------+-------------+-------------+  -
181d7626b5aSTuong Lien  * |            gap            |            ack            |   |
182d7626b5aSTuong Lien  * +-------------+-------------+-------------+-------------+    > uc gacks
183d7626b5aSTuong Lien  * :                           :                           :   |
184d7626b5aSTuong Lien  * +-------------+-------------+-------------+-------------+  -
1859195948fSTuong Lien  */
1869195948fSTuong Lien struct tipc_gap_ack_blks {
1879195948fSTuong Lien 	__be16 len;
188d7626b5aSTuong Lien 	union {
189d7626b5aSTuong Lien 		u8 ugack_cnt;
190d7626b5aSTuong Lien 		u8 start_index;
191d7626b5aSTuong Lien 	};
192d7626b5aSTuong Lien 	u8 bgack_cnt;
1939195948fSTuong Lien 	struct tipc_gap_ack gacks[];
1949195948fSTuong Lien };
1959195948fSTuong Lien 
196d7626b5aSTuong Lien #define MAX_GAP_ACK_BLKS	128
197e034c6d2SGustavo A. R. Silva #define MAX_GAP_ACK_BLKS_SZ	(sizeof(struct tipc_gap_ack_blks) + \
198e034c6d2SGustavo A. R. Silva 				 sizeof(struct tipc_gap_ack) * MAX_GAP_ACK_BLKS)
1999195948fSTuong Lien 
buf_msg(struct sk_buff * skb)200859fc7c0SYing Xue static inline struct tipc_msg *buf_msg(struct sk_buff *skb)
201859fc7c0SYing Xue {
202859fc7c0SYing Xue 	return (struct tipc_msg *)skb->data;
203859fc7c0SYing Xue }
204859fc7c0SYing Xue 
msg_word(struct tipc_msg * m,u32 pos)205d265fef6SAllan Stephens static inline u32 msg_word(struct tipc_msg *m, u32 pos)
206d265fef6SAllan Stephens {
207d265fef6SAllan Stephens 	return ntohl(m->hdr[pos]);
208d265fef6SAllan Stephens }
209b97bf3fdSPer Liden 
msg_set_word(struct tipc_msg * m,u32 w,u32 val)210b97bf3fdSPer Liden static inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val)
211b97bf3fdSPer Liden {
212b97bf3fdSPer Liden 	m->hdr[w] = htonl(val);
213b97bf3fdSPer Liden }
214b97bf3fdSPer Liden 
msg_bits(struct tipc_msg * m,u32 w,u32 pos,u32 mask)215d265fef6SAllan Stephens static inline u32 msg_bits(struct tipc_msg *m, u32 w, u32 pos, u32 mask)
216d265fef6SAllan Stephens {
217d265fef6SAllan Stephens 	return (msg_word(m, w) >> pos) & mask;
218d265fef6SAllan Stephens }
219d265fef6SAllan Stephens 
msg_set_bits(struct tipc_msg * m,u32 w,u32 pos,u32 mask,u32 val)220b97bf3fdSPer Liden static inline void msg_set_bits(struct tipc_msg *m, u32 w,
221b97bf3fdSPer Liden 				u32 pos, u32 mask, u32 val)
222b97bf3fdSPer Liden {
2231f9eda7eSAllan Stephens 	val = (val & mask) << pos;
224becf3da2SAl Viro 	mask = mask << pos;
225becf3da2SAl Viro 	m->hdr[w] &= ~htonl(mask);
226becf3da2SAl Viro 	m->hdr[w] |= htonl(val);
227b97bf3fdSPer Liden }
228b97bf3fdSPer Liden 
229b97bf3fdSPer Liden /*
230b97bf3fdSPer Liden  * Word 0
231b97bf3fdSPer Liden  */
msg_version(struct tipc_msg * m)232b97bf3fdSPer Liden static inline u32 msg_version(struct tipc_msg *m)
233b97bf3fdSPer Liden {
234b97bf3fdSPer Liden 	return msg_bits(m, 0, 29, 7);
235b97bf3fdSPer Liden }
236b97bf3fdSPer Liden 
msg_set_version(struct tipc_msg * m)237b97bf3fdSPer Liden static inline void msg_set_version(struct tipc_msg *m)
238b97bf3fdSPer Liden {
23937695420SAllan Stephens 	msg_set_bits(m, 0, 29, 7, TIPC_VERSION);
240b97bf3fdSPer Liden }
241b97bf3fdSPer Liden 
msg_user(struct tipc_msg * m)242b97bf3fdSPer Liden static inline u32 msg_user(struct tipc_msg *m)
243b97bf3fdSPer Liden {
244b97bf3fdSPer Liden 	return msg_bits(m, 0, 25, 0xf);
245b97bf3fdSPer Liden }
246b97bf3fdSPer Liden 
msg_isdata(struct tipc_msg * m)247b97bf3fdSPer Liden static inline u32 msg_isdata(struct tipc_msg *m)
248b97bf3fdSPer Liden {
249a02cec21SEric Dumazet 	return msg_user(m) <= TIPC_CRITICAL_IMPORTANCE;
250b97bf3fdSPer Liden }
251b97bf3fdSPer Liden 
msg_set_user(struct tipc_msg * m,u32 n)252b97bf3fdSPer Liden static inline void msg_set_user(struct tipc_msg *m, u32 n)
253b97bf3fdSPer Liden {
254b97bf3fdSPer Liden 	msg_set_bits(m, 0, 25, 0xf, n);
255b97bf3fdSPer Liden }
256b97bf3fdSPer Liden 
msg_hdr_sz(struct tipc_msg * m)257d265fef6SAllan Stephens static inline u32 msg_hdr_sz(struct tipc_msg *m)
258d265fef6SAllan Stephens {
259d265fef6SAllan Stephens 	return msg_bits(m, 0, 21, 0xf) << 2;
260d265fef6SAllan Stephens }
261d265fef6SAllan Stephens 
msg_set_hdr_sz(struct tipc_msg * m,u32 n)262b97bf3fdSPer Liden static inline void msg_set_hdr_sz(struct tipc_msg *m, u32 n)
263b97bf3fdSPer Liden {
264b97bf3fdSPer Liden 	msg_set_bits(m, 0, 21, 0xf, n>>2);
265b97bf3fdSPer Liden }
266b97bf3fdSPer Liden 
msg_size(struct tipc_msg * m)267d265fef6SAllan Stephens static inline u32 msg_size(struct tipc_msg *m)
268d265fef6SAllan Stephens {
269d265fef6SAllan Stephens 	return msg_bits(m, 0, 0, 0x1ffff);
270d265fef6SAllan Stephens }
271d265fef6SAllan Stephens 
msg_blocks(struct tipc_msg * m)2725b8dddb6SJon Maloy static inline u32 msg_blocks(struct tipc_msg *m)
2735b8dddb6SJon Maloy {
2745b8dddb6SJon Maloy 	return (msg_size(m) / 1024) + 1;
2755b8dddb6SJon Maloy }
2765b8dddb6SJon Maloy 
msg_data_sz(struct tipc_msg * m)277d265fef6SAllan Stephens static inline u32 msg_data_sz(struct tipc_msg *m)
278d265fef6SAllan Stephens {
279d265fef6SAllan Stephens 	return msg_size(m) - msg_hdr_sz(m);
280d265fef6SAllan Stephens }
281d265fef6SAllan Stephens 
msg_non_seq(struct tipc_msg * m)282b97bf3fdSPer Liden static inline int msg_non_seq(struct tipc_msg *m)
283b97bf3fdSPer Liden {
284b97bf3fdSPer Liden 	return msg_bits(m, 0, 20, 1);
285b97bf3fdSPer Liden }
286b97bf3fdSPer Liden 
msg_set_non_seq(struct tipc_msg * m,u32 n)28740aecb1bSAllan Stephens static inline void msg_set_non_seq(struct tipc_msg *m, u32 n)
288b97bf3fdSPer Liden {
28940aecb1bSAllan Stephens 	msg_set_bits(m, 0, 20, 1, n);
290b97bf3fdSPer Liden }
291b97bf3fdSPer Liden 
msg_is_syn(struct tipc_msg * m)29225b9221bSJon Maloy static inline int msg_is_syn(struct tipc_msg *m)
29325b9221bSJon Maloy {
29425b9221bSJon Maloy 	return msg_bits(m, 0, 17, 1);
29525b9221bSJon Maloy }
29625b9221bSJon Maloy 
msg_set_syn(struct tipc_msg * m,u32 d)29725b9221bSJon Maloy static inline void msg_set_syn(struct tipc_msg *m, u32 d)
29825b9221bSJon Maloy {
29925b9221bSJon Maloy 	msg_set_bits(m, 0, 17, 1, d);
30025b9221bSJon Maloy }
30125b9221bSJon Maloy 
msg_dest_droppable(struct tipc_msg * m)302b97bf3fdSPer Liden static inline int msg_dest_droppable(struct tipc_msg *m)
303b97bf3fdSPer Liden {
304b97bf3fdSPer Liden 	return msg_bits(m, 0, 19, 1);
305b97bf3fdSPer Liden }
306b97bf3fdSPer Liden 
msg_set_dest_droppable(struct tipc_msg * m,u32 d)307b97bf3fdSPer Liden static inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d)
308b97bf3fdSPer Liden {
309b97bf3fdSPer Liden 	msg_set_bits(m, 0, 19, 1, d);
310b97bf3fdSPer Liden }
311b97bf3fdSPer Liden 
msg_is_keepalive(struct tipc_msg * m)3128d6e79d3SJon Maloy static inline int msg_is_keepalive(struct tipc_msg *m)
3138d6e79d3SJon Maloy {
3148d6e79d3SJon Maloy 	return msg_bits(m, 0, 19, 1);
3158d6e79d3SJon Maloy }
3168d6e79d3SJon Maloy 
msg_set_is_keepalive(struct tipc_msg * m,u32 d)3178d6e79d3SJon Maloy static inline void msg_set_is_keepalive(struct tipc_msg *m, u32 d)
3188d6e79d3SJon Maloy {
3198d6e79d3SJon Maloy 	msg_set_bits(m, 0, 19, 1, d);
3208d6e79d3SJon Maloy }
3218d6e79d3SJon Maloy 
msg_src_droppable(struct tipc_msg * m)322b97bf3fdSPer Liden static inline int msg_src_droppable(struct tipc_msg *m)
323b97bf3fdSPer Liden {
324b97bf3fdSPer Liden 	return msg_bits(m, 0, 18, 1);
325b97bf3fdSPer Liden }
326b97bf3fdSPer Liden 
msg_set_src_droppable(struct tipc_msg * m,u32 d)327b97bf3fdSPer Liden static inline void msg_set_src_droppable(struct tipc_msg *m, u32 d)
328b97bf3fdSPer Liden {
329b97bf3fdSPer Liden 	msg_set_bits(m, 0, 18, 1, d);
330b97bf3fdSPer Liden }
331b97bf3fdSPer Liden 
msg_ack_required(struct tipc_msg * m)332c0bceb97SJon Maloy static inline int msg_ack_required(struct tipc_msg *m)
333c0bceb97SJon Maloy {
334c0bceb97SJon Maloy 	return msg_bits(m, 0, 18, 1);
335c0bceb97SJon Maloy }
336c0bceb97SJon Maloy 
msg_set_ack_required(struct tipc_msg * m)3370a3e060fSTuong Lien static inline void msg_set_ack_required(struct tipc_msg *m)
338c0bceb97SJon Maloy {
3390a3e060fSTuong Lien 	msg_set_bits(m, 0, 18, 1, 1);
3400a3e060fSTuong Lien }
3410a3e060fSTuong Lien 
msg_nagle_ack(struct tipc_msg * m)3420a3e060fSTuong Lien static inline int msg_nagle_ack(struct tipc_msg *m)
3430a3e060fSTuong Lien {
3440a3e060fSTuong Lien 	return msg_bits(m, 0, 18, 1);
3450a3e060fSTuong Lien }
3460a3e060fSTuong Lien 
msg_set_nagle_ack(struct tipc_msg * m)3470a3e060fSTuong Lien static inline void msg_set_nagle_ack(struct tipc_msg *m)
3480a3e060fSTuong Lien {
3490a3e060fSTuong Lien 	msg_set_bits(m, 0, 18, 1, 1);
350c0bceb97SJon Maloy }
351c0bceb97SJon Maloy 
msg_is_rcast(struct tipc_msg * m)352c55c8edaSHoang Le static inline bool msg_is_rcast(struct tipc_msg *m)
353c55c8edaSHoang Le {
354c55c8edaSHoang Le 	return msg_bits(m, 0, 18, 0x1);
355c55c8edaSHoang Le }
356c55c8edaSHoang Le 
msg_set_is_rcast(struct tipc_msg * m,bool d)357c55c8edaSHoang Le static inline void msg_set_is_rcast(struct tipc_msg *m, bool d)
358c55c8edaSHoang Le {
359c55c8edaSHoang Le 	msg_set_bits(m, 0, 18, 0x1, d);
360c55c8edaSHoang Le }
361c55c8edaSHoang Le 
msg_set_size(struct tipc_msg * m,u32 sz)362b97bf3fdSPer Liden static inline void msg_set_size(struct tipc_msg *m, u32 sz)
363b97bf3fdSPer Liden {
364b97bf3fdSPer Liden 	m->hdr[0] = htonl((msg_word(m, 0) & ~0x1ffff) | sz);
365b97bf3fdSPer Liden }
366b97bf3fdSPer Liden 
msg_data(struct tipc_msg * m)3673127a020SJon Paul Maloy static inline unchar *msg_data(struct tipc_msg *m)
3683127a020SJon Paul Maloy {
3693127a020SJon Paul Maloy 	return ((unchar *)m) + msg_hdr_sz(m);
3703127a020SJon Paul Maloy }
3713127a020SJon Paul Maloy 
msg_inner_hdr(struct tipc_msg * m)372a7dc51adSJon Maloy static inline struct tipc_msg *msg_inner_hdr(struct tipc_msg *m)
3733127a020SJon Paul Maloy {
3743127a020SJon Paul Maloy 	return (struct tipc_msg *)msg_data(m);
3753127a020SJon Paul Maloy }
376b97bf3fdSPer Liden 
377b97bf3fdSPer Liden /*
378b97bf3fdSPer Liden  * Word 1
379b97bf3fdSPer Liden  */
msg_type(struct tipc_msg * m)380d265fef6SAllan Stephens static inline u32 msg_type(struct tipc_msg *m)
381d265fef6SAllan Stephens {
382d265fef6SAllan Stephens 	return msg_bits(m, 1, 29, 0x7);
383d265fef6SAllan Stephens }
384d265fef6SAllan Stephens 
msg_set_type(struct tipc_msg * m,u32 n)385b97bf3fdSPer Liden static inline void msg_set_type(struct tipc_msg *m, u32 n)
386b97bf3fdSPer Liden {
387b97bf3fdSPer Liden 	msg_set_bits(m, 1, 29, 0x7, n);
388b97bf3fdSPer Liden }
389b97bf3fdSPer Liden 
msg_in_group(struct tipc_msg * m)39075da2163SJon Maloy static inline int msg_in_group(struct tipc_msg *m)
39175da2163SJon Maloy {
392ae236fb2SJon Maloy 	int mtyp = msg_type(m);
393ae236fb2SJon Maloy 
39427bd9ec0SJon Maloy 	return mtyp >= TIPC_GRP_MEMBER_EVT && mtyp <= TIPC_GRP_UCAST_MSG;
395ae236fb2SJon Maloy }
396ae236fb2SJon Maloy 
msg_is_grp_evt(struct tipc_msg * m)397ae236fb2SJon Maloy static inline bool msg_is_grp_evt(struct tipc_msg *m)
398ae236fb2SJon Maloy {
399ae236fb2SJon Maloy 	return msg_type(m) == TIPC_GRP_MEMBER_EVT;
40075da2163SJon Maloy }
40175da2163SJon Maloy 
msg_named(struct tipc_msg * m)402d265fef6SAllan Stephens static inline u32 msg_named(struct tipc_msg *m)
403d265fef6SAllan Stephens {
404d265fef6SAllan Stephens 	return msg_type(m) == TIPC_NAMED_MSG;
405d265fef6SAllan Stephens }
406d265fef6SAllan Stephens 
msg_mcast(struct tipc_msg * m)407d265fef6SAllan Stephens static inline u32 msg_mcast(struct tipc_msg *m)
408d265fef6SAllan Stephens {
40975da2163SJon Maloy 	int mtyp = msg_type(m);
41075da2163SJon Maloy 
4115b8dddb6SJon Maloy 	return ((mtyp == TIPC_MCAST_MSG) || (mtyp == TIPC_GRP_BCAST_MSG) ||
4125b8dddb6SJon Maloy 		(mtyp == TIPC_GRP_MCAST_MSG));
413d265fef6SAllan Stephens }
414d265fef6SAllan Stephens 
msg_connected(struct tipc_msg * m)415d265fef6SAllan Stephens static inline u32 msg_connected(struct tipc_msg *m)
416d265fef6SAllan Stephens {
417d265fef6SAllan Stephens 	return msg_type(m) == TIPC_CONN_MSG;
418d265fef6SAllan Stephens }
419d265fef6SAllan Stephens 
msg_direct(struct tipc_msg * m)4208b1e5b0aSHoang Le static inline u32 msg_direct(struct tipc_msg *m)
4218b1e5b0aSHoang Le {
4228b1e5b0aSHoang Le 	return msg_type(m) == TIPC_DIRECT_MSG;
4238b1e5b0aSHoang Le }
4248b1e5b0aSHoang Le 
msg_errcode(struct tipc_msg * m)425d265fef6SAllan Stephens static inline u32 msg_errcode(struct tipc_msg *m)
426d265fef6SAllan Stephens {
427d265fef6SAllan Stephens 	return msg_bits(m, 1, 25, 0xf);
428d265fef6SAllan Stephens }
429d265fef6SAllan Stephens 
msg_set_errcode(struct tipc_msg * m,u32 err)430b97bf3fdSPer Liden static inline void msg_set_errcode(struct tipc_msg *m, u32 err)
431b97bf3fdSPer Liden {
432b97bf3fdSPer Liden 	msg_set_bits(m, 1, 25, 0xf, err);
433b97bf3fdSPer Liden }
434b97bf3fdSPer Liden 
msg_set_bulk(struct tipc_msg * m)435cad2929dSHoang Huu Le static inline void msg_set_bulk(struct tipc_msg *m)
436cad2929dSHoang Huu Le {
437cad2929dSHoang Huu Le 	msg_set_bits(m, 1, 28, 0x1, 1);
438cad2929dSHoang Huu Le }
439cad2929dSHoang Huu Le 
msg_is_bulk(struct tipc_msg * m)440cad2929dSHoang Huu Le static inline u32 msg_is_bulk(struct tipc_msg *m)
441cad2929dSHoang Huu Le {
442cad2929dSHoang Huu Le 	return msg_bits(m, 1, 28, 0x1);
443cad2929dSHoang Huu Le }
444cad2929dSHoang Huu Le 
msg_set_last_bulk(struct tipc_msg * m)445cad2929dSHoang Huu Le static inline void msg_set_last_bulk(struct tipc_msg *m)
446cad2929dSHoang Huu Le {
447cad2929dSHoang Huu Le 	msg_set_bits(m, 1, 27, 0x1, 1);
448cad2929dSHoang Huu Le }
449cad2929dSHoang Huu Le 
msg_is_last_bulk(struct tipc_msg * m)450cad2929dSHoang Huu Le static inline u32 msg_is_last_bulk(struct tipc_msg *m)
451cad2929dSHoang Huu Le {
452cad2929dSHoang Huu Le 	return msg_bits(m, 1, 27, 0x1);
453cad2929dSHoang Huu Le }
454cad2929dSHoang Huu Le 
msg_set_non_legacy(struct tipc_msg * m)455cad2929dSHoang Huu Le static inline void msg_set_non_legacy(struct tipc_msg *m)
456cad2929dSHoang Huu Le {
457cad2929dSHoang Huu Le 	msg_set_bits(m, 1, 26, 0x1, 1);
458cad2929dSHoang Huu Le }
459cad2929dSHoang Huu Le 
msg_is_legacy(struct tipc_msg * m)460cad2929dSHoang Huu Le static inline u32 msg_is_legacy(struct tipc_msg *m)
461cad2929dSHoang Huu Le {
462cad2929dSHoang Huu Le 	return !msg_bits(m, 1, 26, 0x1);
463cad2929dSHoang Huu Le }
464cad2929dSHoang Huu Le 
msg_reroute_cnt(struct tipc_msg * m)465b97bf3fdSPer Liden static inline u32 msg_reroute_cnt(struct tipc_msg *m)
466b97bf3fdSPer Liden {
467b97bf3fdSPer Liden 	return msg_bits(m, 1, 21, 0xf);
468b97bf3fdSPer Liden }
469b97bf3fdSPer Liden 
msg_incr_reroute_cnt(struct tipc_msg * m)470b97bf3fdSPer Liden static inline void msg_incr_reroute_cnt(struct tipc_msg *m)
471b97bf3fdSPer Liden {
472b97bf3fdSPer Liden 	msg_set_bits(m, 1, 21, 0xf, msg_reroute_cnt(m) + 1);
473b97bf3fdSPer Liden }
474b97bf3fdSPer Liden 
msg_lookup_scope(struct tipc_msg * m)475b97bf3fdSPer Liden static inline u32 msg_lookup_scope(struct tipc_msg *m)
476b97bf3fdSPer Liden {
477b97bf3fdSPer Liden 	return msg_bits(m, 1, 19, 0x3);
478b97bf3fdSPer Liden }
479b97bf3fdSPer Liden 
msg_set_lookup_scope(struct tipc_msg * m,u32 n)480b97bf3fdSPer Liden static inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n)
481b97bf3fdSPer Liden {
482b97bf3fdSPer Liden 	msg_set_bits(m, 1, 19, 0x3, n);
483b97bf3fdSPer Liden }
484b97bf3fdSPer Liden 
msg_bcast_ack(struct tipc_msg * m)485e4bf4f76SJon Paul Maloy static inline u16 msg_bcast_ack(struct tipc_msg *m)
486b97bf3fdSPer Liden {
487b97bf3fdSPer Liden 	return msg_bits(m, 1, 0, 0xffff);
488b97bf3fdSPer Liden }
489b97bf3fdSPer Liden 
msg_set_bcast_ack(struct tipc_msg * m,u16 n)490e4bf4f76SJon Paul Maloy static inline void msg_set_bcast_ack(struct tipc_msg *m, u16 n)
491b97bf3fdSPer Liden {
492b97bf3fdSPer Liden 	msg_set_bits(m, 1, 0, 0xffff, n);
493b97bf3fdSPer Liden }
494b97bf3fdSPer Liden 
49591986ee1STuong Lien /* Note: reusing bits in word 1 for ACTIVATE_MSG only, to re-synch
49691986ee1STuong Lien  * link peer session number
49791986ee1STuong Lien  */
msg_dest_session_valid(struct tipc_msg * m)49891986ee1STuong Lien static inline bool msg_dest_session_valid(struct tipc_msg *m)
49991986ee1STuong Lien {
50091986ee1STuong Lien 	return msg_bits(m, 1, 16, 0x1);
50191986ee1STuong Lien }
50291986ee1STuong Lien 
msg_set_dest_session_valid(struct tipc_msg * m,bool valid)50391986ee1STuong Lien static inline void msg_set_dest_session_valid(struct tipc_msg *m, bool valid)
50491986ee1STuong Lien {
50591986ee1STuong Lien 	msg_set_bits(m, 1, 16, 0x1, valid);
50691986ee1STuong Lien }
50791986ee1STuong Lien 
msg_dest_session(struct tipc_msg * m)50891986ee1STuong Lien static inline u16 msg_dest_session(struct tipc_msg *m)
50991986ee1STuong Lien {
51091986ee1STuong Lien 	return msg_bits(m, 1, 0, 0xffff);
51191986ee1STuong Lien }
51291986ee1STuong Lien 
msg_set_dest_session(struct tipc_msg * m,u16 n)51391986ee1STuong Lien static inline void msg_set_dest_session(struct tipc_msg *m, u16 n)
51491986ee1STuong Lien {
51591986ee1STuong Lien 	msg_set_bits(m, 1, 0, 0xffff, n);
51691986ee1STuong Lien }
517b97bf3fdSPer Liden 
518b97bf3fdSPer Liden /*
519b97bf3fdSPer Liden  * Word 2
520b97bf3fdSPer Liden  */
msg_ack(struct tipc_msg * m)521e4bf4f76SJon Paul Maloy static inline u16 msg_ack(struct tipc_msg *m)
522b97bf3fdSPer Liden {
523b97bf3fdSPer Liden 	return msg_bits(m, 2, 16, 0xffff);
524b97bf3fdSPer Liden }
525b97bf3fdSPer Liden 
msg_set_ack(struct tipc_msg * m,u16 n)526e4bf4f76SJon Paul Maloy static inline void msg_set_ack(struct tipc_msg *m, u16 n)
527b97bf3fdSPer Liden {
528b97bf3fdSPer Liden 	msg_set_bits(m, 2, 16, 0xffff, n);
529b97bf3fdSPer Liden }
530b97bf3fdSPer Liden 
msg_seqno(struct tipc_msg * m)531e4bf4f76SJon Paul Maloy static inline u16 msg_seqno(struct tipc_msg *m)
532b97bf3fdSPer Liden {
533b97bf3fdSPer Liden 	return msg_bits(m, 2, 0, 0xffff);
534b97bf3fdSPer Liden }
535b97bf3fdSPer Liden 
msg_set_seqno(struct tipc_msg * m,u16 n)536e4bf4f76SJon Paul Maloy static inline void msg_set_seqno(struct tipc_msg *m, u16 n)
537b97bf3fdSPer Liden {
538b97bf3fdSPer Liden 	msg_set_bits(m, 2, 0, 0xffff, n);
539b97bf3fdSPer Liden }
540b97bf3fdSPer Liden 
54140aecb1bSAllan Stephens /*
542b97bf3fdSPer Liden  * Words 3-10
543b97bf3fdSPer Liden  */
msg_importance(struct tipc_msg * m)544e3eea1ebSJon Paul Maloy static inline u32 msg_importance(struct tipc_msg *m)
545e3eea1ebSJon Paul Maloy {
546f21e897eSJon Paul Maloy 	int usr = msg_user(m);
547f21e897eSJon Paul Maloy 
548f21e897eSJon Paul Maloy 	if (likely((usr <= TIPC_CRITICAL_IMPORTANCE) && !msg_errcode(m)))
549f21e897eSJon Paul Maloy 		return usr;
550f21e897eSJon Paul Maloy 	if ((usr == MSG_FRAGMENTER) || (usr == MSG_BUNDLER))
551dde4b5aeSJon Paul Maloy 		return msg_bits(m, 9, 0, 0x7);
552e3eea1ebSJon Paul Maloy 	return TIPC_SYSTEM_IMPORTANCE;
553e3eea1ebSJon Paul Maloy }
554e3eea1ebSJon Paul Maloy 
msg_set_importance(struct tipc_msg * m,u32 i)555e3eea1ebSJon Paul Maloy static inline void msg_set_importance(struct tipc_msg *m, u32 i)
556e3eea1ebSJon Paul Maloy {
557f21e897eSJon Paul Maloy 	int usr = msg_user(m);
558f21e897eSJon Paul Maloy 
559f21e897eSJon Paul Maloy 	if (likely((usr == MSG_FRAGMENTER) || (usr == MSG_BUNDLER)))
560dde4b5aeSJon Paul Maloy 		msg_set_bits(m, 9, 0, 0x7, i);
561f21e897eSJon Paul Maloy 	else if (i < TIPC_SYSTEM_IMPORTANCE)
562e3eea1ebSJon Paul Maloy 		msg_set_user(m, i);
563e3eea1ebSJon Paul Maloy 	else
564e3eea1ebSJon Paul Maloy 		pr_warn("Trying to set illegal importance in message\n");
565e3eea1ebSJon Paul Maloy }
566e3eea1ebSJon Paul Maloy 
msg_prevnode(struct tipc_msg * m)567d265fef6SAllan Stephens static inline u32 msg_prevnode(struct tipc_msg *m)
568d265fef6SAllan Stephens {
569d265fef6SAllan Stephens 	return msg_word(m, 3);
570d265fef6SAllan Stephens }
571d265fef6SAllan Stephens 
msg_set_prevnode(struct tipc_msg * m,u32 a)572b97bf3fdSPer Liden static inline void msg_set_prevnode(struct tipc_msg *m, u32 a)
573b97bf3fdSPer Liden {
574b97bf3fdSPer Liden 	msg_set_word(m, 3, a);
575b97bf3fdSPer Liden }
576b97bf3fdSPer Liden 
msg_origport(struct tipc_msg * m)577d265fef6SAllan Stephens static inline u32 msg_origport(struct tipc_msg *m)
578d265fef6SAllan Stephens {
5793127a020SJon Paul Maloy 	if (msg_user(m) == MSG_FRAGMENTER)
580a7dc51adSJon Maloy 		m = msg_inner_hdr(m);
581d265fef6SAllan Stephens 	return msg_word(m, 4);
582d265fef6SAllan Stephens }
583d265fef6SAllan Stephens 
msg_set_origport(struct tipc_msg * m,u32 p)584b97bf3fdSPer Liden static inline void msg_set_origport(struct tipc_msg *m, u32 p)
585b97bf3fdSPer Liden {
586b97bf3fdSPer Liden 	msg_set_word(m, 4, p);
587b97bf3fdSPer Liden }
588b97bf3fdSPer Liden 
msg_named_seqno(struct tipc_msg * m)589cad2929dSHoang Huu Le static inline u16 msg_named_seqno(struct tipc_msg *m)
590cad2929dSHoang Huu Le {
591cad2929dSHoang Huu Le 	return msg_bits(m, 4, 0, 0xffff);
592cad2929dSHoang Huu Le }
593cad2929dSHoang Huu Le 
msg_set_named_seqno(struct tipc_msg * m,u16 n)594cad2929dSHoang Huu Le static inline void msg_set_named_seqno(struct tipc_msg *m, u16 n)
595cad2929dSHoang Huu Le {
596cad2929dSHoang Huu Le 	msg_set_bits(m, 4, 0, 0xffff, n);
597cad2929dSHoang Huu Le }
598cad2929dSHoang Huu Le 
msg_destport(struct tipc_msg * m)599d265fef6SAllan Stephens static inline u32 msg_destport(struct tipc_msg *m)
600d265fef6SAllan Stephens {
601d265fef6SAllan Stephens 	return msg_word(m, 5);
602d265fef6SAllan Stephens }
603d265fef6SAllan Stephens 
msg_set_destport(struct tipc_msg * m,u32 p)604b97bf3fdSPer Liden static inline void msg_set_destport(struct tipc_msg *m, u32 p)
605b97bf3fdSPer Liden {
606b97bf3fdSPer Liden 	msg_set_word(m, 5, p);
607b97bf3fdSPer Liden }
608b97bf3fdSPer Liden 
msg_mc_netid(struct tipc_msg * m)609d265fef6SAllan Stephens static inline u32 msg_mc_netid(struct tipc_msg *m)
610d265fef6SAllan Stephens {
611d265fef6SAllan Stephens 	return msg_word(m, 5);
612d265fef6SAllan Stephens }
613d265fef6SAllan Stephens 
msg_set_mc_netid(struct tipc_msg * m,u32 p)614b97bf3fdSPer Liden static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)
615b97bf3fdSPer Liden {
616b97bf3fdSPer Liden 	msg_set_word(m, 5, p);
617b97bf3fdSPer Liden }
618b97bf3fdSPer Liden 
msg_short(struct tipc_msg * m)619d265fef6SAllan Stephens static inline int msg_short(struct tipc_msg *m)
620d265fef6SAllan Stephens {
621741d9eb7SAllan Stephens 	return msg_hdr_sz(m) == SHORT_H_SIZE;
622d265fef6SAllan Stephens }
623d265fef6SAllan Stephens 
msg_orignode(struct tipc_msg * m)624d265fef6SAllan Stephens static inline u32 msg_orignode(struct tipc_msg *m)
625d265fef6SAllan Stephens {
626d265fef6SAllan Stephens 	if (likely(msg_short(m)))
627d265fef6SAllan Stephens 		return msg_prevnode(m);
628d265fef6SAllan Stephens 	return msg_word(m, 6);
629d265fef6SAllan Stephens }
630d265fef6SAllan Stephens 
msg_set_orignode(struct tipc_msg * m,u32 a)631b97bf3fdSPer Liden static inline void msg_set_orignode(struct tipc_msg *m, u32 a)
632b97bf3fdSPer Liden {
633b97bf3fdSPer Liden 	msg_set_word(m, 6, a);
634b97bf3fdSPer Liden }
635b97bf3fdSPer Liden 
msg_destnode(struct tipc_msg * m)636d265fef6SAllan Stephens static inline u32 msg_destnode(struct tipc_msg *m)
637d265fef6SAllan Stephens {
638d265fef6SAllan Stephens 	return msg_word(m, 7);
639d265fef6SAllan Stephens }
640d265fef6SAllan Stephens 
msg_set_destnode(struct tipc_msg * m,u32 a)641b97bf3fdSPer Liden static inline void msg_set_destnode(struct tipc_msg *m, u32 a)
642b97bf3fdSPer Liden {
643b97bf3fdSPer Liden 	msg_set_word(m, 7, a);
644b97bf3fdSPer Liden }
645b97bf3fdSPer Liden 
msg_nametype(struct tipc_msg * m)646d265fef6SAllan Stephens static inline u32 msg_nametype(struct tipc_msg *m)
647d265fef6SAllan Stephens {
648d265fef6SAllan Stephens 	return msg_word(m, 8);
649d265fef6SAllan Stephens }
650d265fef6SAllan Stephens 
msg_set_nametype(struct tipc_msg * m,u32 n)651b97bf3fdSPer Liden static inline void msg_set_nametype(struct tipc_msg *m, u32 n)
652b97bf3fdSPer Liden {
653b97bf3fdSPer Liden 	msg_set_word(m, 8, n);
654b97bf3fdSPer Liden }
655b97bf3fdSPer Liden 
msg_nameinst(struct tipc_msg * m)656d265fef6SAllan Stephens static inline u32 msg_nameinst(struct tipc_msg *m)
657d265fef6SAllan Stephens {
658d265fef6SAllan Stephens 	return msg_word(m, 9);
659d265fef6SAllan Stephens }
660d265fef6SAllan Stephens 
msg_namelower(struct tipc_msg * m)661d265fef6SAllan Stephens static inline u32 msg_namelower(struct tipc_msg *m)
662d265fef6SAllan Stephens {
663d265fef6SAllan Stephens 	return msg_nameinst(m);
664d265fef6SAllan Stephens }
665d265fef6SAllan Stephens 
msg_set_namelower(struct tipc_msg * m,u32 n)666b97bf3fdSPer Liden static inline void msg_set_namelower(struct tipc_msg *m, u32 n)
667b97bf3fdSPer Liden {
668b97bf3fdSPer Liden 	msg_set_word(m, 9, n);
669b97bf3fdSPer Liden }
670b97bf3fdSPer Liden 
msg_set_nameinst(struct tipc_msg * m,u32 n)671b97bf3fdSPer Liden static inline void msg_set_nameinst(struct tipc_msg *m, u32 n)
672b97bf3fdSPer Liden {
673b97bf3fdSPer Liden 	msg_set_namelower(m, n);
674b97bf3fdSPer Liden }
675b97bf3fdSPer Liden 
msg_nameupper(struct tipc_msg * m)676d265fef6SAllan Stephens static inline u32 msg_nameupper(struct tipc_msg *m)
677d265fef6SAllan Stephens {
678d265fef6SAllan Stephens 	return msg_word(m, 10);
679d265fef6SAllan Stephens }
680d265fef6SAllan Stephens 
msg_set_nameupper(struct tipc_msg * m,u32 n)681b97bf3fdSPer Liden static inline void msg_set_nameupper(struct tipc_msg *m, u32 n)
682b97bf3fdSPer Liden {
683b97bf3fdSPer Liden 	msg_set_word(m, 10, n);
684b97bf3fdSPer Liden }
685b97bf3fdSPer Liden 
686b97bf3fdSPer Liden /*
687cc4c4353SAllan Stephens  * Constants and routines used to read and write TIPC internal message headers
688b97bf3fdSPer Liden  */
689b97bf3fdSPer Liden 
690b97bf3fdSPer Liden /*
691cc4c4353SAllan Stephens  *  Connection management protocol message types
692b97bf3fdSPer Liden  */
693b97bf3fdSPer Liden #define CONN_PROBE        0
694b97bf3fdSPer Liden #define CONN_PROBE_REPLY  1
695b97bf3fdSPer Liden #define CONN_ACK          2
696b97bf3fdSPer Liden 
697b97bf3fdSPer Liden /*
698cc4c4353SAllan Stephens  * Name distributor message types
699b97bf3fdSPer Liden  */
700b97bf3fdSPer Liden #define PUBLICATION       0
701b97bf3fdSPer Liden #define WITHDRAWAL        1
702b97bf3fdSPer Liden 
70392138d1fSAllan Stephens /*
70492138d1fSAllan Stephens  * Segmentation message types
70592138d1fSAllan Stephens  */
70692138d1fSAllan Stephens #define FIRST_FRAGMENT		0
70792138d1fSAllan Stephens #define FRAGMENT		1
70892138d1fSAllan Stephens #define LAST_FRAGMENT		2
70992138d1fSAllan Stephens 
71092138d1fSAllan Stephens /*
71192138d1fSAllan Stephens  * Link management protocol message types
71292138d1fSAllan Stephens  */
71392138d1fSAllan Stephens #define STATE_MSG		0
71492138d1fSAllan Stephens #define RESET_MSG		1
71592138d1fSAllan Stephens #define ACTIVATE_MSG		2
71692138d1fSAllan Stephens 
71792138d1fSAllan Stephens /*
71892138d1fSAllan Stephens  * Changeover tunnel message types
71992138d1fSAllan Stephens  */
720dff29b1aSJon Paul Maloy #define SYNCH_MSG		0
721dff29b1aSJon Paul Maloy #define FAILOVER_MSG		1
72292138d1fSAllan Stephens 
72392138d1fSAllan Stephens /*
72492138d1fSAllan Stephens  * Config protocol message types
72592138d1fSAllan Stephens  */
72692138d1fSAllan Stephens #define DSC_REQ_MSG		0
72792138d1fSAllan Stephens #define DSC_RESP_MSG		1
72825b0b9c4SJon Maloy #define DSC_TRIAL_MSG		2
72925b0b9c4SJon Maloy #define DSC_TRIAL_FAIL_MSG	3
73092138d1fSAllan Stephens 
731b97bf3fdSPer Liden /*
73275da2163SJon Maloy  * Group protocol message types
73375da2163SJon Maloy  */
73475da2163SJon Maloy #define GRP_JOIN_MSG         0
73575da2163SJon Maloy #define GRP_LEAVE_MSG        1
736b7d42635SJon Maloy #define GRP_ADV_MSG          2
7372f487712SJon Maloy #define GRP_ACK_MSG          3
73804d7b574SJon Maloy #define GRP_RECLAIM_MSG      4
73904d7b574SJon Maloy #define GRP_REMIT_MSG        5
74075da2163SJon Maloy 
7411ef6f7c9STuong Lien /* Crypto message types */
7421ef6f7c9STuong Lien #define KEY_DISTR_MSG		0
7431ef6f7c9STuong Lien 
74475da2163SJon Maloy /*
745b97bf3fdSPer Liden  * Word 1
746b97bf3fdSPer Liden  */
msg_seq_gap(struct tipc_msg * m)747b97bf3fdSPer Liden static inline u32 msg_seq_gap(struct tipc_msg *m)
748b97bf3fdSPer Liden {
749bd784533SAllan Stephens 	return msg_bits(m, 1, 16, 0x1fff);
750b97bf3fdSPer Liden }
751b97bf3fdSPer Liden 
msg_set_seq_gap(struct tipc_msg * m,u32 n)752b97bf3fdSPer Liden static inline void msg_set_seq_gap(struct tipc_msg *m, u32 n)
753b97bf3fdSPer Liden {
754bd784533SAllan Stephens 	msg_set_bits(m, 1, 16, 0x1fff, n);
755b97bf3fdSPer Liden }
756b97bf3fdSPer Liden 
msg_node_sig(struct tipc_msg * m)757fc0eea69SAllan Stephens static inline u32 msg_node_sig(struct tipc_msg *m)
758fc0eea69SAllan Stephens {
759fc0eea69SAllan Stephens 	return msg_bits(m, 1, 0, 0xffff);
760fc0eea69SAllan Stephens }
761fc0eea69SAllan Stephens 
msg_set_node_sig(struct tipc_msg * m,u32 n)762fc0eea69SAllan Stephens static inline void msg_set_node_sig(struct tipc_msg *m, u32 n)
763fc0eea69SAllan Stephens {
764fc0eea69SAllan Stephens 	msg_set_bits(m, 1, 0, 0xffff, n);
765fc0eea69SAllan Stephens }
766fc0eea69SAllan Stephens 
msg_node_capabilities(struct tipc_msg * m)7677764d6e8SJon Paul Maloy static inline u32 msg_node_capabilities(struct tipc_msg *m)
7687764d6e8SJon Paul Maloy {
7697764d6e8SJon Paul Maloy 	return msg_bits(m, 1, 15, 0x1fff);
7707764d6e8SJon Paul Maloy }
7717764d6e8SJon Paul Maloy 
msg_set_node_capabilities(struct tipc_msg * m,u32 n)7727764d6e8SJon Paul Maloy static inline void msg_set_node_capabilities(struct tipc_msg *m, u32 n)
7737764d6e8SJon Paul Maloy {
7747764d6e8SJon Paul Maloy 	msg_set_bits(m, 1, 15, 0x1fff, n);
7757764d6e8SJon Paul Maloy }
7767764d6e8SJon Paul Maloy 
777b97bf3fdSPer Liden /*
778b97bf3fdSPer Liden  * Word 2
779b97bf3fdSPer Liden  */
msg_dest_domain(struct tipc_msg * m)780b97bf3fdSPer Liden static inline u32 msg_dest_domain(struct tipc_msg *m)
781b97bf3fdSPer Liden {
782b97bf3fdSPer Liden 	return msg_word(m, 2);
783b97bf3fdSPer Liden }
784b97bf3fdSPer Liden 
msg_set_dest_domain(struct tipc_msg * m,u32 n)785b97bf3fdSPer Liden static inline void msg_set_dest_domain(struct tipc_msg *m, u32 n)
786b97bf3fdSPer Liden {
787b97bf3fdSPer Liden 	msg_set_word(m, 2, n);
788b97bf3fdSPer Liden }
789b97bf3fdSPer Liden 
msg_set_bcgap_after(struct tipc_msg * m,u32 n)790b97bf3fdSPer Liden static inline void msg_set_bcgap_after(struct tipc_msg *m, u32 n)
791b97bf3fdSPer Liden {
792b97bf3fdSPer Liden 	msg_set_bits(m, 2, 16, 0xffff, n);
793b97bf3fdSPer Liden }
794b97bf3fdSPer Liden 
msg_bcgap_to(struct tipc_msg * m)795b97bf3fdSPer Liden static inline u32 msg_bcgap_to(struct tipc_msg *m)
796b97bf3fdSPer Liden {
797b97bf3fdSPer Liden 	return msg_bits(m, 2, 0, 0xffff);
798b97bf3fdSPer Liden }
799b97bf3fdSPer Liden 
msg_set_bcgap_to(struct tipc_msg * m,u32 n)800b97bf3fdSPer Liden static inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n)
801b97bf3fdSPer Liden {
802b97bf3fdSPer Liden 	msg_set_bits(m, 2, 0, 0xffff, n);
803b97bf3fdSPer Liden }
804b97bf3fdSPer Liden 
805b97bf3fdSPer Liden /*
806b97bf3fdSPer Liden  * Word 4
807b97bf3fdSPer Liden  */
msg_last_bcast(struct tipc_msg * m)808b97bf3fdSPer Liden static inline u32 msg_last_bcast(struct tipc_msg *m)
809b97bf3fdSPer Liden {
810b97bf3fdSPer Liden 	return msg_bits(m, 4, 16, 0xffff);
811b97bf3fdSPer Liden }
812b97bf3fdSPer Liden 
msg_bc_snd_nxt(struct tipc_msg * m)81352666986SJon Paul Maloy static inline u32 msg_bc_snd_nxt(struct tipc_msg *m)
81452666986SJon Paul Maloy {
81552666986SJon Paul Maloy 	return msg_last_bcast(m) + 1;
81652666986SJon Paul Maloy }
81752666986SJon Paul Maloy 
msg_set_last_bcast(struct tipc_msg * m,u32 n)818b97bf3fdSPer Liden static inline void msg_set_last_bcast(struct tipc_msg *m, u32 n)
819b97bf3fdSPer Liden {
820b97bf3fdSPer Liden 	msg_set_bits(m, 4, 16, 0xffff, n);
821b97bf3fdSPer Liden }
822b97bf3fdSPer Liden 
msg_nof_fragms(struct tipc_msg * m)8232320bcdaSTuong Lien static inline u32 msg_nof_fragms(struct tipc_msg *m)
8242320bcdaSTuong Lien {
8252320bcdaSTuong Lien 	return msg_bits(m, 4, 0, 0xffff);
8262320bcdaSTuong Lien }
8272320bcdaSTuong Lien 
msg_set_nof_fragms(struct tipc_msg * m,u32 n)8282320bcdaSTuong Lien static inline void msg_set_nof_fragms(struct tipc_msg *m, u32 n)
8292320bcdaSTuong Lien {
8302320bcdaSTuong Lien 	msg_set_bits(m, 4, 0, 0xffff, n);
8312320bcdaSTuong Lien }
8322320bcdaSTuong Lien 
msg_fragm_no(struct tipc_msg * m)8332320bcdaSTuong Lien static inline u32 msg_fragm_no(struct tipc_msg *m)
8342320bcdaSTuong Lien {
8352320bcdaSTuong Lien 	return msg_bits(m, 4, 16, 0xffff);
8362320bcdaSTuong Lien }
8372320bcdaSTuong Lien 
msg_set_fragm_no(struct tipc_msg * m,u32 n)838b97bf3fdSPer Liden static inline void msg_set_fragm_no(struct tipc_msg *m, u32 n)
839b97bf3fdSPer Liden {
840b97bf3fdSPer Liden 	msg_set_bits(m, 4, 16, 0xffff, n);
841b97bf3fdSPer Liden }
842b97bf3fdSPer Liden 
msg_next_sent(struct tipc_msg * m)8436e498158SJon Paul Maloy static inline u16 msg_next_sent(struct tipc_msg *m)
844b97bf3fdSPer Liden {
845b97bf3fdSPer Liden 	return msg_bits(m, 4, 0, 0xffff);
846b97bf3fdSPer Liden }
847b97bf3fdSPer Liden 
msg_set_next_sent(struct tipc_msg * m,u16 n)8486e498158SJon Paul Maloy static inline void msg_set_next_sent(struct tipc_msg *m, u16 n)
849b97bf3fdSPer Liden {
850b97bf3fdSPer Liden 	msg_set_bits(m, 4, 0, 0xffff, n);
851b97bf3fdSPer Liden }
852b97bf3fdSPer Liden 
msg_bc_netid(struct tipc_msg * m)853b97bf3fdSPer Liden static inline u32 msg_bc_netid(struct tipc_msg *m)
854b97bf3fdSPer Liden {
855b97bf3fdSPer Liden 	return msg_word(m, 4);
856b97bf3fdSPer Liden }
857b97bf3fdSPer Liden 
msg_set_bc_netid(struct tipc_msg * m,u32 id)858b97bf3fdSPer Liden static inline void msg_set_bc_netid(struct tipc_msg *m, u32 id)
859b97bf3fdSPer Liden {
860b97bf3fdSPer Liden 	msg_set_word(m, 4, id);
861b97bf3fdSPer Liden }
862b97bf3fdSPer Liden 
msg_link_selector(struct tipc_msg * m)863b97bf3fdSPer Liden static inline u32 msg_link_selector(struct tipc_msg *m)
864b97bf3fdSPer Liden {
865a853e4c6SJon Paul Maloy 	if (msg_user(m) == MSG_FRAGMENTER)
866a853e4c6SJon Paul Maloy 		m = (void *)msg_data(m);
867b97bf3fdSPer Liden 	return msg_bits(m, 4, 0, 1);
868b97bf3fdSPer Liden }
869b97bf3fdSPer Liden 
870b97bf3fdSPer Liden /*
871b97bf3fdSPer Liden  * Word 5
872b97bf3fdSPer Liden  */
msg_session(struct tipc_msg * m)873d999297cSJon Paul Maloy static inline u16 msg_session(struct tipc_msg *m)
874b97bf3fdSPer Liden {
875b97bf3fdSPer Liden 	return msg_bits(m, 5, 16, 0xffff);
876b97bf3fdSPer Liden }
877b97bf3fdSPer Liden 
msg_set_session(struct tipc_msg * m,u16 n)878d999297cSJon Paul Maloy static inline void msg_set_session(struct tipc_msg *m, u16 n)
879b97bf3fdSPer Liden {
880b97bf3fdSPer Liden 	msg_set_bits(m, 5, 16, 0xffff, n);
881b97bf3fdSPer Liden }
882b97bf3fdSPer Liden 
msg_probe(struct tipc_msg * m)883b97bf3fdSPer Liden static inline u32 msg_probe(struct tipc_msg *m)
884b97bf3fdSPer Liden {
885b97bf3fdSPer Liden 	return msg_bits(m, 5, 0, 1);
886b97bf3fdSPer Liden }
887b97bf3fdSPer Liden 
msg_set_probe(struct tipc_msg * m,u32 val)888b97bf3fdSPer Liden static inline void msg_set_probe(struct tipc_msg *m, u32 val)
889b97bf3fdSPer Liden {
8907eb878edSAllan Stephens 	msg_set_bits(m, 5, 0, 1, val);
891b97bf3fdSPer Liden }
892b97bf3fdSPer Liden 
msg_net_plane(struct tipc_msg * m)893b97bf3fdSPer Liden static inline char msg_net_plane(struct tipc_msg *m)
894b97bf3fdSPer Liden {
895b97bf3fdSPer Liden 	return msg_bits(m, 5, 1, 7) + 'A';
896b97bf3fdSPer Liden }
897b97bf3fdSPer Liden 
msg_set_net_plane(struct tipc_msg * m,char n)898b97bf3fdSPer Liden static inline void msg_set_net_plane(struct tipc_msg *m, char n)
899b97bf3fdSPer Liden {
900b97bf3fdSPer Liden 	msg_set_bits(m, 5, 1, 7, (n - 'A'));
901b97bf3fdSPer Liden }
902b97bf3fdSPer Liden 
msg_linkprio(struct tipc_msg * m)903b97bf3fdSPer Liden static inline u32 msg_linkprio(struct tipc_msg *m)
904b97bf3fdSPer Liden {
905b97bf3fdSPer Liden 	return msg_bits(m, 5, 4, 0x1f);
906b97bf3fdSPer Liden }
907b97bf3fdSPer Liden 
msg_set_linkprio(struct tipc_msg * m,u32 n)908b97bf3fdSPer Liden static inline void msg_set_linkprio(struct tipc_msg *m, u32 n)
909b97bf3fdSPer Liden {
910b97bf3fdSPer Liden 	msg_set_bits(m, 5, 4, 0x1f, n);
911b97bf3fdSPer Liden }
912b97bf3fdSPer Liden 
msg_bearer_id(struct tipc_msg * m)913b97bf3fdSPer Liden static inline u32 msg_bearer_id(struct tipc_msg *m)
914b97bf3fdSPer Liden {
915b97bf3fdSPer Liden 	return msg_bits(m, 5, 9, 0x7);
916b97bf3fdSPer Liden }
917b97bf3fdSPer Liden 
msg_set_bearer_id(struct tipc_msg * m,u32 n)918b97bf3fdSPer Liden static inline void msg_set_bearer_id(struct tipc_msg *m, u32 n)
919b97bf3fdSPer Liden {
920b97bf3fdSPer Liden 	msg_set_bits(m, 5, 9, 0x7, n);
921b97bf3fdSPer Liden }
922b97bf3fdSPer Liden 
msg_redundant_link(struct tipc_msg * m)923b97bf3fdSPer Liden static inline u32 msg_redundant_link(struct tipc_msg *m)
924b97bf3fdSPer Liden {
925b97bf3fdSPer Liden 	return msg_bits(m, 5, 12, 0x1);
926b97bf3fdSPer Liden }
927b97bf3fdSPer Liden 
msg_set_redundant_link(struct tipc_msg * m,u32 r)92877f167fcSAllan Stephens static inline void msg_set_redundant_link(struct tipc_msg *m, u32 r)
929b97bf3fdSPer Liden {
93077f167fcSAllan Stephens 	msg_set_bits(m, 5, 12, 0x1, r);
931b97bf3fdSPer Liden }
932b97bf3fdSPer Liden 
msg_peer_stopping(struct tipc_msg * m)933634696b1SJon Paul Maloy static inline u32 msg_peer_stopping(struct tipc_msg *m)
934634696b1SJon Paul Maloy {
935634696b1SJon Paul Maloy 	return msg_bits(m, 5, 13, 0x1);
936634696b1SJon Paul Maloy }
937634696b1SJon Paul Maloy 
msg_set_peer_stopping(struct tipc_msg * m,u32 s)938634696b1SJon Paul Maloy static inline void msg_set_peer_stopping(struct tipc_msg *m, u32 s)
939634696b1SJon Paul Maloy {
940634696b1SJon Paul Maloy 	msg_set_bits(m, 5, 13, 0x1, s);
941634696b1SJon Paul Maloy }
942634696b1SJon Paul Maloy 
msg_bc_ack_invalid(struct tipc_msg * m)94306bd2b1eSJon Paul Maloy static inline bool msg_bc_ack_invalid(struct tipc_msg *m)
94406bd2b1eSJon Paul Maloy {
94506bd2b1eSJon Paul Maloy 	switch (msg_user(m)) {
94606bd2b1eSJon Paul Maloy 	case BCAST_PROTOCOL:
94706bd2b1eSJon Paul Maloy 	case NAME_DISTRIBUTOR:
94806bd2b1eSJon Paul Maloy 	case LINK_PROTOCOL:
94906bd2b1eSJon Paul Maloy 		return msg_bits(m, 5, 14, 0x1);
95006bd2b1eSJon Paul Maloy 	default:
95106bd2b1eSJon Paul Maloy 		return false;
95206bd2b1eSJon Paul Maloy 	}
95306bd2b1eSJon Paul Maloy }
95406bd2b1eSJon Paul Maloy 
msg_set_bc_ack_invalid(struct tipc_msg * m,bool invalid)95506bd2b1eSJon Paul Maloy static inline void msg_set_bc_ack_invalid(struct tipc_msg *m, bool invalid)
95606bd2b1eSJon Paul Maloy {
95706bd2b1eSJon Paul Maloy 	msg_set_bits(m, 5, 14, 0x1, invalid);
95806bd2b1eSJon Paul Maloy }
95906bd2b1eSJon Paul Maloy 
msg_media_addr(struct tipc_msg * m)9603d749a6aSAllan Stephens static inline char *msg_media_addr(struct tipc_msg *m)
9613d749a6aSAllan Stephens {
96291e2eb56SErik Hugne 	return (char *)&m->hdr[TIPC_MEDIA_INFO_OFFSET];
9633d749a6aSAllan Stephens }
964b97bf3fdSPer Liden 
msg_bc_gap(struct tipc_msg * m)96502d11ca2SJon Paul Maloy static inline u32 msg_bc_gap(struct tipc_msg *m)
96602d11ca2SJon Paul Maloy {
96702d11ca2SJon Paul Maloy 	return msg_bits(m, 8, 0, 0x3ff);
96802d11ca2SJon Paul Maloy }
96902d11ca2SJon Paul Maloy 
msg_set_bc_gap(struct tipc_msg * m,u32 n)97002d11ca2SJon Paul Maloy static inline void msg_set_bc_gap(struct tipc_msg *m, u32 n)
97102d11ca2SJon Paul Maloy {
97202d11ca2SJon Paul Maloy 	msg_set_bits(m, 8, 0, 0x3ff, n);
97302d11ca2SJon Paul Maloy }
97402d11ca2SJon Paul Maloy 
975b97bf3fdSPer Liden /*
976b97bf3fdSPer Liden  * Word 9
977b97bf3fdSPer Liden  */
msg_msgcnt(struct tipc_msg * m)9786e498158SJon Paul Maloy static inline u16 msg_msgcnt(struct tipc_msg *m)
979b97bf3fdSPer Liden {
980b97bf3fdSPer Liden 	return msg_bits(m, 9, 16, 0xffff);
981b97bf3fdSPer Liden }
982b97bf3fdSPer Liden 
msg_set_msgcnt(struct tipc_msg * m,u16 n)9836e498158SJon Paul Maloy static inline void msg_set_msgcnt(struct tipc_msg *m, u16 n)
984b97bf3fdSPer Liden {
985b97bf3fdSPer Liden 	msg_set_bits(m, 9, 16, 0xffff, n);
986b97bf3fdSPer Liden }
987b97bf3fdSPer Liden 
msg_syncpt(struct tipc_msg * m)9884929a932STuong Lien static inline u16 msg_syncpt(struct tipc_msg *m)
9894929a932STuong Lien {
9904929a932STuong Lien 	return msg_bits(m, 9, 16, 0xffff);
9914929a932STuong Lien }
9924929a932STuong Lien 
msg_set_syncpt(struct tipc_msg * m,u16 n)9934929a932STuong Lien static inline void msg_set_syncpt(struct tipc_msg *m, u16 n)
9944929a932STuong Lien {
9954929a932STuong Lien 	msg_set_bits(m, 9, 16, 0xffff, n);
9964929a932STuong Lien }
9974929a932STuong Lien 
msg_conn_ack(struct tipc_msg * m)99810724cc7SJon Paul Maloy static inline u32 msg_conn_ack(struct tipc_msg *m)
999b97bf3fdSPer Liden {
1000b97bf3fdSPer Liden 	return msg_bits(m, 9, 16, 0xffff);
1001b97bf3fdSPer Liden }
1002b97bf3fdSPer Liden 
msg_set_conn_ack(struct tipc_msg * m,u32 n)100310724cc7SJon Paul Maloy static inline void msg_set_conn_ack(struct tipc_msg *m, u32 n)
1004b97bf3fdSPer Liden {
1005b97bf3fdSPer Liden 	msg_set_bits(m, 9, 16, 0xffff, n);
1006b97bf3fdSPer Liden }
1007b97bf3fdSPer Liden 
msg_adv_win(struct tipc_msg * m)1008b7d42635SJon Maloy static inline u16 msg_adv_win(struct tipc_msg *m)
100910724cc7SJon Paul Maloy {
101010724cc7SJon Paul Maloy 	return msg_bits(m, 9, 0, 0xffff);
101110724cc7SJon Paul Maloy }
101210724cc7SJon Paul Maloy 
msg_set_adv_win(struct tipc_msg * m,u16 n)1013b7d42635SJon Maloy static inline void msg_set_adv_win(struct tipc_msg *m, u16 n)
101410724cc7SJon Paul Maloy {
101510724cc7SJon Paul Maloy 	msg_set_bits(m, 9, 0, 0xffff, n);
101610724cc7SJon Paul Maloy }
101710724cc7SJon Paul Maloy 
msg_max_pkt(struct tipc_msg * m)1018b97bf3fdSPer Liden static inline u32 msg_max_pkt(struct tipc_msg *m)
1019b97bf3fdSPer Liden {
1020a02cec21SEric Dumazet 	return msg_bits(m, 9, 16, 0xffff) * 4;
1021b97bf3fdSPer Liden }
1022b97bf3fdSPer Liden 
msg_set_max_pkt(struct tipc_msg * m,u32 n)1023b97bf3fdSPer Liden static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n)
1024b97bf3fdSPer Liden {
1025b97bf3fdSPer Liden 	msg_set_bits(m, 9, 16, 0xffff, (n / 4));
1026b97bf3fdSPer Liden }
1027b97bf3fdSPer Liden 
msg_link_tolerance(struct tipc_msg * m)1028b97bf3fdSPer Liden static inline u32 msg_link_tolerance(struct tipc_msg *m)
1029b97bf3fdSPer Liden {
1030b97bf3fdSPer Liden 	return msg_bits(m, 9, 0, 0xffff);
1031b97bf3fdSPer Liden }
1032b97bf3fdSPer Liden 
msg_set_link_tolerance(struct tipc_msg * m,u32 n)1033b97bf3fdSPer Liden static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n)
1034b97bf3fdSPer Liden {
1035b97bf3fdSPer Liden 	msg_set_bits(m, 9, 0, 0xffff, n);
1036b97bf3fdSPer Liden }
1037b97bf3fdSPer Liden 
msg_grp_bc_syncpt(struct tipc_msg * m)103875da2163SJon Maloy static inline u16 msg_grp_bc_syncpt(struct tipc_msg *m)
103975da2163SJon Maloy {
104075da2163SJon Maloy 	return msg_bits(m, 9, 16, 0xffff);
104175da2163SJon Maloy }
104275da2163SJon Maloy 
msg_set_grp_bc_syncpt(struct tipc_msg * m,u16 n)104375da2163SJon Maloy static inline void msg_set_grp_bc_syncpt(struct tipc_msg *m, u16 n)
104475da2163SJon Maloy {
104575da2163SJon Maloy 	msg_set_bits(m, 9, 16, 0xffff, n);
104675da2163SJon Maloy }
104775da2163SJon Maloy 
msg_grp_bc_acked(struct tipc_msg * m)10482f487712SJon Maloy static inline u16 msg_grp_bc_acked(struct tipc_msg *m)
10492f487712SJon Maloy {
10502f487712SJon Maloy 	return msg_bits(m, 9, 16, 0xffff);
10512f487712SJon Maloy }
10522f487712SJon Maloy 
msg_set_grp_bc_acked(struct tipc_msg * m,u16 n)10532f487712SJon Maloy static inline void msg_set_grp_bc_acked(struct tipc_msg *m, u16 n)
10542f487712SJon Maloy {
10552f487712SJon Maloy 	msg_set_bits(m, 9, 16, 0xffff, n);
10562f487712SJon Maloy }
10572f487712SJon Maloy 
msg_grp_remitted(struct tipc_msg * m)105804d7b574SJon Maloy static inline u16 msg_grp_remitted(struct tipc_msg *m)
105904d7b574SJon Maloy {
106004d7b574SJon Maloy 	return msg_bits(m, 9, 16, 0xffff);
106104d7b574SJon Maloy }
106204d7b574SJon Maloy 
msg_set_grp_remitted(struct tipc_msg * m,u16 n)106304d7b574SJon Maloy static inline void msg_set_grp_remitted(struct tipc_msg *m, u16 n)
106404d7b574SJon Maloy {
106504d7b574SJon Maloy 	msg_set_bits(m, 9, 16, 0xffff, n);
106604d7b574SJon Maloy }
106704d7b574SJon Maloy 
106875da2163SJon Maloy /* Word 10
106975da2163SJon Maloy  */
msg_grp_evt(struct tipc_msg * m)1070ae236fb2SJon Maloy static inline u16 msg_grp_evt(struct tipc_msg *m)
1071ae236fb2SJon Maloy {
1072ae236fb2SJon Maloy 	return msg_bits(m, 10, 0, 0x3);
1073ae236fb2SJon Maloy }
1074ae236fb2SJon Maloy 
msg_set_grp_evt(struct tipc_msg * m,int n)1075ae236fb2SJon Maloy static inline void msg_set_grp_evt(struct tipc_msg *m, int n)
1076ae236fb2SJon Maloy {
1077ae236fb2SJon Maloy 	msg_set_bits(m, 10, 0, 0x3, n);
1078ae236fb2SJon Maloy }
1079ae236fb2SJon Maloy 
msg_grp_bc_ack_req(struct tipc_msg * m)10802f487712SJon Maloy static inline u16 msg_grp_bc_ack_req(struct tipc_msg *m)
10812f487712SJon Maloy {
10822f487712SJon Maloy 	return msg_bits(m, 10, 0, 0x1);
10832f487712SJon Maloy }
10842f487712SJon Maloy 
msg_set_grp_bc_ack_req(struct tipc_msg * m,bool n)10852f487712SJon Maloy static inline void msg_set_grp_bc_ack_req(struct tipc_msg *m, bool n)
10862f487712SJon Maloy {
10872f487712SJon Maloy 	msg_set_bits(m, 10, 0, 0x1, n);
10882f487712SJon Maloy }
10892f487712SJon Maloy 
msg_grp_bc_seqno(struct tipc_msg * m)109075da2163SJon Maloy static inline u16 msg_grp_bc_seqno(struct tipc_msg *m)
109175da2163SJon Maloy {
109275da2163SJon Maloy 	return msg_bits(m, 10, 16, 0xffff);
109375da2163SJon Maloy }
109475da2163SJon Maloy 
msg_set_grp_bc_seqno(struct tipc_msg * m,u32 n)109575da2163SJon Maloy static inline void msg_set_grp_bc_seqno(struct tipc_msg *m, u32 n)
109675da2163SJon Maloy {
109775da2163SJon Maloy 	msg_set_bits(m, 10, 16, 0xffff, n);
109875da2163SJon Maloy }
109975da2163SJon Maloy 
msg_peer_link_is_up(struct tipc_msg * m)11006e498158SJon Paul Maloy static inline bool msg_peer_link_is_up(struct tipc_msg *m)
1101d999297cSJon Paul Maloy {
1102d999297cSJon Paul Maloy 	if (likely(msg_user(m) != LINK_PROTOCOL))
1103d999297cSJon Paul Maloy 		return true;
11046e498158SJon Paul Maloy 	if (msg_type(m) == STATE_MSG)
1105d999297cSJon Paul Maloy 		return true;
11066e498158SJon Paul Maloy 	return false;
1107d999297cSJon Paul Maloy }
1108d999297cSJon Paul Maloy 
msg_peer_node_is_up(struct tipc_msg * m)11096e498158SJon Paul Maloy static inline bool msg_peer_node_is_up(struct tipc_msg *m)
11101a20cc25SJon Paul Maloy {
11116e498158SJon Paul Maloy 	if (msg_peer_link_is_up(m))
11126e498158SJon Paul Maloy 		return true;
11131a20cc25SJon Paul Maloy 	return msg_redundant_link(m);
11141a20cc25SJon Paul Maloy }
11151a20cc25SJon Paul Maloy 
msg_is_reset(struct tipc_msg * hdr)11165b7066c3SJon Paul Maloy static inline bool msg_is_reset(struct tipc_msg *hdr)
11175b7066c3SJon Paul Maloy {
11185b7066c3SJon Paul Maloy 	return (msg_user(hdr) == LINK_PROTOCOL) && (msg_type(hdr) == RESET_MSG);
11195b7066c3SJon Paul Maloy }
11205b7066c3SJon Paul Maloy 
1121f73b1281SHoang Le /* Word 13
1122f73b1281SHoang Le  */
msg_set_peer_net_hash(struct tipc_msg * m,u32 n)1123f73b1281SHoang Le static inline void msg_set_peer_net_hash(struct tipc_msg *m, u32 n)
1124f73b1281SHoang Le {
1125f73b1281SHoang Le 	msg_set_word(m, 13, n);
1126f73b1281SHoang Le }
1127f73b1281SHoang Le 
msg_peer_net_hash(struct tipc_msg * m)1128f73b1281SHoang Le static inline u32 msg_peer_net_hash(struct tipc_msg *m)
1129f73b1281SHoang Le {
1130f73b1281SHoang Le 	return msg_word(m, 13);
1131f73b1281SHoang Le }
1132f73b1281SHoang Le 
1133f73b1281SHoang Le /* Word 14
1134f73b1281SHoang Le  */
msg_sugg_node_addr(struct tipc_msg * m)113525b0b9c4SJon Maloy static inline u32 msg_sugg_node_addr(struct tipc_msg *m)
113625b0b9c4SJon Maloy {
113725b0b9c4SJon Maloy 	return msg_word(m, 14);
113825b0b9c4SJon Maloy }
113925b0b9c4SJon Maloy 
msg_set_sugg_node_addr(struct tipc_msg * m,u32 n)114025b0b9c4SJon Maloy static inline void msg_set_sugg_node_addr(struct tipc_msg *m, u32 n)
114125b0b9c4SJon Maloy {
114225b0b9c4SJon Maloy 	msg_set_word(m, 14, n);
114325b0b9c4SJon Maloy }
114425b0b9c4SJon Maloy 
msg_set_node_id(struct tipc_msg * hdr,u8 * id)114525b0b9c4SJon Maloy static inline void msg_set_node_id(struct tipc_msg *hdr, u8 *id)
114625b0b9c4SJon Maloy {
114725b0b9c4SJon Maloy 	memcpy(msg_data(hdr), id, 16);
114825b0b9c4SJon Maloy }
114925b0b9c4SJon Maloy 
msg_node_id(struct tipc_msg * hdr)115025b0b9c4SJon Maloy static inline u8 *msg_node_id(struct tipc_msg *hdr)
115125b0b9c4SJon Maloy {
115225b0b9c4SJon Maloy 	return (u8 *)msg_data(hdr);
115325b0b9c4SJon Maloy }
115425b0b9c4SJon Maloy 
115557d5f64dSParthasarathy Bhuvaragan struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp);
1156d618d09aSJon Maloy bool tipc_msg_validate(struct sk_buff **_skb);
1157bcd3ffd4SJon Paul Maloy bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err);
115864ac5f59SJon Maloy void tipc_skb_reject(struct net *net, int err, struct sk_buff *skb,
115964ac5f59SJon Maloy 		     struct sk_buff_head *xmitq);
1160c5898636SJon Paul Maloy void tipc_msg_init(u32 own_addr, struct tipc_msg *m, u32 user, u32 type,
116134747539SYing Xue 		   u32 hsize, u32 destnode);
1162e3a77561SJon Paul Maloy struct sk_buff *tipc_msg_create(uint user, uint type, uint hdr_sz,
1163e3a77561SJon Paul Maloy 				uint data_sz, u32 dnode, u32 onode,
1164e3a77561SJon Paul Maloy 				u32 dport, u32 oport, int errcode);
116537e22164SJon Paul Maloy int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf);
116606e7c70cSTuong Lien bool tipc_msg_try_bundle(struct sk_buff *tskb, struct sk_buff **skb, u32 mss,
116706e7c70cSTuong Lien 			 u32 dnode, bool *new_bundle);
1168c637c103SJon Paul Maloy bool tipc_msg_extract(struct sk_buff *skb, struct sk_buff **iskb, int *pos);
11692320bcdaSTuong Lien int tipc_msg_fragment(struct sk_buff *skb, const struct tipc_msg *hdr,
11702320bcdaSTuong Lien 		      int pktmax, struct sk_buff_head *frags);
1171c5898636SJon Paul Maloy int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m,
117234747539SYing Xue 		   int offset, int dsz, int mtu, struct sk_buff_head *list);
1173c0bceb97SJon Maloy int tipc_msg_append(struct tipc_msg *hdr, struct msghdr *m, int dlen,
1174c0bceb97SJon Maloy 		    int mss, struct sk_buff_head *txq);
1175cda3696dSJon Paul Maloy bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err);
11764c94cc2dSJon Maloy bool tipc_msg_assemble(struct sk_buff_head *list);
11772f566124SJon Paul Maloy bool tipc_msg_reassemble(struct sk_buff_head *list, struct sk_buff_head *rcvq);
1178a853e4c6SJon Paul Maloy bool tipc_msg_pskb_copy(u32 dst, struct sk_buff_head *msg,
1179a853e4c6SJon Paul Maloy 			struct sk_buff_head *cpy);
118003b6fefdSTuong Lien bool __tipc_skb_queue_sorted(struct sk_buff_head *list, u16 seqno,
11818306f99aSJon Paul Maloy 			     struct sk_buff *skb);
118267879274STung Nguyen bool tipc_msg_skb_clone(struct sk_buff_head *msg, struct sk_buff_head *cpy);
1183078bec82SJon Paul Maloy 
buf_seqno(struct sk_buff * skb)1184e4bf4f76SJon Paul Maloy static inline u16 buf_seqno(struct sk_buff *skb)
1185e4bf4f76SJon Paul Maloy {
1186e4bf4f76SJon Paul Maloy 	return msg_seqno(buf_msg(skb));
1187e4bf4f76SJon Paul Maloy }
1188e4bf4f76SJon Paul Maloy 
buf_roundup_len(struct sk_buff * skb)1189d618d09aSJon Maloy static inline int buf_roundup_len(struct sk_buff *skb)
1190d618d09aSJon Maloy {
1191d618d09aSJon Maloy 	return (skb->len / 1024 + 1) * 1024;
1192d618d09aSJon Maloy }
1193d618d09aSJon Maloy 
1194cb1b7280SJon Paul Maloy /* tipc_skb_peek(): peek and reserve first buffer in list
1195cb1b7280SJon Paul Maloy  * @list: list to be peeked in
1196cb1b7280SJon Paul Maloy  * Returns pointer to first buffer in list, if any
1197cb1b7280SJon Paul Maloy  */
tipc_skb_peek(struct sk_buff_head * list,spinlock_t * lock)1198cb1b7280SJon Paul Maloy static inline struct sk_buff *tipc_skb_peek(struct sk_buff_head *list,
1199cb1b7280SJon Paul Maloy 					    spinlock_t *lock)
1200cb1b7280SJon Paul Maloy {
1201cb1b7280SJon Paul Maloy 	struct sk_buff *skb;
1202cb1b7280SJon Paul Maloy 
1203cb1b7280SJon Paul Maloy 	spin_lock_bh(lock);
1204cb1b7280SJon Paul Maloy 	skb = skb_peek(list);
1205cb1b7280SJon Paul Maloy 	if (skb)
1206cb1b7280SJon Paul Maloy 		skb_get(skb);
1207cb1b7280SJon Paul Maloy 	spin_unlock_bh(lock);
1208cb1b7280SJon Paul Maloy 	return skb;
1209cb1b7280SJon Paul Maloy }
1210cb1b7280SJon Paul Maloy 
1211c637c103SJon Paul Maloy /* tipc_skb_peek_port(): find a destination port, ignoring all destinations
1212c637c103SJon Paul Maloy  *                       up to and including 'filter'.
1213c637c103SJon Paul Maloy  * Note: ignoring previously tried destinations minimizes the risk of
1214c637c103SJon Paul Maloy  *       contention on the socket lock
1215c637c103SJon Paul Maloy  * @list: list to be peeked in
1216c637c103SJon Paul Maloy  * @filter: last destination to be ignored from search
1217c637c103SJon Paul Maloy  * Returns a destination port number, of applicable.
1218c637c103SJon Paul Maloy  */
tipc_skb_peek_port(struct sk_buff_head * list,u32 filter)1219c637c103SJon Paul Maloy static inline u32 tipc_skb_peek_port(struct sk_buff_head *list, u32 filter)
1220c637c103SJon Paul Maloy {
1221c637c103SJon Paul Maloy 	struct sk_buff *skb;
1222c637c103SJon Paul Maloy 	u32 dport = 0;
1223c637c103SJon Paul Maloy 	bool ignore = true;
1224c637c103SJon Paul Maloy 
1225c637c103SJon Paul Maloy 	spin_lock_bh(&list->lock);
1226c637c103SJon Paul Maloy 	skb_queue_walk(list, skb) {
1227c637c103SJon Paul Maloy 		dport = msg_destport(buf_msg(skb));
1228c637c103SJon Paul Maloy 		if (!filter || skb_queue_is_last(list, skb))
1229c637c103SJon Paul Maloy 			break;
1230c637c103SJon Paul Maloy 		if (dport == filter)
1231c637c103SJon Paul Maloy 			ignore = false;
1232c637c103SJon Paul Maloy 		else if (!ignore)
1233c637c103SJon Paul Maloy 			break;
1234c637c103SJon Paul Maloy 	}
1235c637c103SJon Paul Maloy 	spin_unlock_bh(&list->lock);
1236c637c103SJon Paul Maloy 	return dport;
1237c637c103SJon Paul Maloy }
1238c637c103SJon Paul Maloy 
1239c637c103SJon Paul Maloy /* tipc_skb_dequeue(): unlink first buffer with dest 'dport' from list
1240c637c103SJon Paul Maloy  * @list: list to be unlinked from
1241c637c103SJon Paul Maloy  * @dport: selection criteria for buffer to unlink
1242c637c103SJon Paul Maloy  */
tipc_skb_dequeue(struct sk_buff_head * list,u32 dport)1243c637c103SJon Paul Maloy static inline struct sk_buff *tipc_skb_dequeue(struct sk_buff_head *list,
1244c637c103SJon Paul Maloy 					       u32 dport)
1245c637c103SJon Paul Maloy {
1246c637c103SJon Paul Maloy 	struct sk_buff *_skb, *tmp, *skb = NULL;
1247c637c103SJon Paul Maloy 
1248c637c103SJon Paul Maloy 	spin_lock_bh(&list->lock);
1249c637c103SJon Paul Maloy 	skb_queue_walk_safe(list, _skb, tmp) {
1250c637c103SJon Paul Maloy 		if (msg_destport(buf_msg(_skb)) == dport) {
1251c637c103SJon Paul Maloy 			__skb_unlink(_skb, list);
1252c637c103SJon Paul Maloy 			skb = _skb;
1253c637c103SJon Paul Maloy 			break;
1254c637c103SJon Paul Maloy 		}
1255c637c103SJon Paul Maloy 	}
1256c637c103SJon Paul Maloy 	spin_unlock_bh(&list->lock);
1257c637c103SJon Paul Maloy 	return skb;
1258c637c103SJon Paul Maloy }
1259c637c103SJon Paul Maloy 
1260598411d7SJon Paul Maloy /* tipc_skb_queue_splice_tail - append an skb list to lock protected list
1261598411d7SJon Paul Maloy  * @list: the new list to append. Not lock protected
1262598411d7SJon Paul Maloy  * @head: target list. Lock protected.
1263598411d7SJon Paul Maloy  */
tipc_skb_queue_splice_tail(struct sk_buff_head * list,struct sk_buff_head * head)1264598411d7SJon Paul Maloy static inline void tipc_skb_queue_splice_tail(struct sk_buff_head *list,
1265598411d7SJon Paul Maloy 					      struct sk_buff_head *head)
1266598411d7SJon Paul Maloy {
1267598411d7SJon Paul Maloy 	spin_lock_bh(&head->lock);
1268598411d7SJon Paul Maloy 	skb_queue_splice_tail(list, head);
1269598411d7SJon Paul Maloy 	spin_unlock_bh(&head->lock);
1270598411d7SJon Paul Maloy }
1271598411d7SJon Paul Maloy 
1272598411d7SJon Paul Maloy /* tipc_skb_queue_splice_tail_init - merge two lock protected skb lists
1273598411d7SJon Paul Maloy  * @list: the new list to add. Lock protected. Will be reinitialized
1274598411d7SJon Paul Maloy  * @head: target list. Lock protected.
1275598411d7SJon Paul Maloy  */
tipc_skb_queue_splice_tail_init(struct sk_buff_head * list,struct sk_buff_head * head)1276598411d7SJon Paul Maloy static inline void tipc_skb_queue_splice_tail_init(struct sk_buff_head *list,
1277598411d7SJon Paul Maloy 						   struct sk_buff_head *head)
1278598411d7SJon Paul Maloy {
1279598411d7SJon Paul Maloy 	struct sk_buff_head tmp;
1280598411d7SJon Paul Maloy 
1281598411d7SJon Paul Maloy 	__skb_queue_head_init(&tmp);
1282598411d7SJon Paul Maloy 
1283598411d7SJon Paul Maloy 	spin_lock_bh(&list->lock);
1284598411d7SJon Paul Maloy 	skb_queue_splice_tail_init(list, &tmp);
1285598411d7SJon Paul Maloy 	spin_unlock_bh(&list->lock);
1286598411d7SJon Paul Maloy 	tipc_skb_queue_splice_tail(&tmp, head);
1287598411d7SJon Paul Maloy }
1288598411d7SJon Paul Maloy 
1289382f598fSTuong Lien /* __tipc_skb_dequeue() - dequeue the head skb according to expected seqno
1290382f598fSTuong Lien  * @list: list to be dequeued from
1291382f598fSTuong Lien  * @seqno: seqno of the expected msg
1292382f598fSTuong Lien  *
1293382f598fSTuong Lien  * returns skb dequeued from the list if its seqno is less than or equal to
1294382f598fSTuong Lien  * the expected one, otherwise the skb is still hold
1295382f598fSTuong Lien  *
1296382f598fSTuong Lien  * Note: must be used with appropriate locks held only
1297382f598fSTuong Lien  */
__tipc_skb_dequeue(struct sk_buff_head * list,u16 seqno)1298382f598fSTuong Lien static inline struct sk_buff *__tipc_skb_dequeue(struct sk_buff_head *list,
1299382f598fSTuong Lien 						 u16 seqno)
1300382f598fSTuong Lien {
1301382f598fSTuong Lien 	struct sk_buff *skb = skb_peek(list);
1302382f598fSTuong Lien 
1303382f598fSTuong Lien 	if (skb && less_eq(buf_seqno(skb), seqno)) {
1304382f598fSTuong Lien 		__skb_unlink(skb, list);
1305382f598fSTuong Lien 		return skb;
1306382f598fSTuong Lien 	}
1307382f598fSTuong Lien 	return NULL;
1308382f598fSTuong Lien }
1309382f598fSTuong Lien 
1310b97bf3fdSPer Liden #endif
1311