162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * net/tipc/msg.h: Include file for TIPC message header routines 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 2000-2007, 2014-2017 Ericsson AB 562306a36Sopenharmony_ci * Copyright (c) 2005-2008, 2010-2011, Wind River Systems 662306a36Sopenharmony_ci * All rights reserved. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 962306a36Sopenharmony_ci * modification, are permitted provided that the following conditions are met: 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 1262306a36Sopenharmony_ci * notice, this list of conditions and the following disclaimer. 1362306a36Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 1462306a36Sopenharmony_ci * notice, this list of conditions and the following disclaimer in the 1562306a36Sopenharmony_ci * documentation and/or other materials provided with the distribution. 1662306a36Sopenharmony_ci * 3. Neither the names of the copyright holders nor the names of its 1762306a36Sopenharmony_ci * contributors may be used to endorse or promote products derived from 1862306a36Sopenharmony_ci * this software without specific prior written permission. 1962306a36Sopenharmony_ci * 2062306a36Sopenharmony_ci * Alternatively, this software may be distributed under the terms of the 2162306a36Sopenharmony_ci * GNU General Public License ("GPL") version 2 as published by the Free 2262306a36Sopenharmony_ci * Software Foundation. 2362306a36Sopenharmony_ci * 2462306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2562306a36Sopenharmony_ci * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2662306a36Sopenharmony_ci * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2762306a36Sopenharmony_ci * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 2862306a36Sopenharmony_ci * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2962306a36Sopenharmony_ci * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 3062306a36Sopenharmony_ci * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 3162306a36Sopenharmony_ci * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 3262306a36Sopenharmony_ci * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3362306a36Sopenharmony_ci * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3462306a36Sopenharmony_ci * POSSIBILITY OF SUCH DAMAGE. 3562306a36Sopenharmony_ci */ 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#ifndef _TIPC_MSG_H 3862306a36Sopenharmony_ci#define _TIPC_MSG_H 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#include <linux/tipc.h> 4162306a36Sopenharmony_ci#include "core.h" 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* 4462306a36Sopenharmony_ci * Constants and routines used to read and write TIPC payload message headers 4562306a36Sopenharmony_ci * 4662306a36Sopenharmony_ci * Note: Some items are also used with TIPC internal message headers 4762306a36Sopenharmony_ci */ 4862306a36Sopenharmony_ci#define TIPC_VERSION 2 4962306a36Sopenharmony_cistruct plist; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/* 5262306a36Sopenharmony_ci * Payload message users are defined in TIPC's public API: 5362306a36Sopenharmony_ci * - TIPC_LOW_IMPORTANCE 5462306a36Sopenharmony_ci * - TIPC_MEDIUM_IMPORTANCE 5562306a36Sopenharmony_ci * - TIPC_HIGH_IMPORTANCE 5662306a36Sopenharmony_ci * - TIPC_CRITICAL_IMPORTANCE 5762306a36Sopenharmony_ci */ 5862306a36Sopenharmony_ci#define TIPC_SYSTEM_IMPORTANCE 4 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* 6262306a36Sopenharmony_ci * Payload message types 6362306a36Sopenharmony_ci */ 6462306a36Sopenharmony_ci#define TIPC_CONN_MSG 0 6562306a36Sopenharmony_ci#define TIPC_MCAST_MSG 1 6662306a36Sopenharmony_ci#define TIPC_NAMED_MSG 2 6762306a36Sopenharmony_ci#define TIPC_DIRECT_MSG 3 6862306a36Sopenharmony_ci#define TIPC_GRP_MEMBER_EVT 4 6962306a36Sopenharmony_ci#define TIPC_GRP_BCAST_MSG 5 7062306a36Sopenharmony_ci#define TIPC_GRP_MCAST_MSG 6 7162306a36Sopenharmony_ci#define TIPC_GRP_UCAST_MSG 7 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/* 7462306a36Sopenharmony_ci * Internal message users 7562306a36Sopenharmony_ci */ 7662306a36Sopenharmony_ci#define BCAST_PROTOCOL 5 7762306a36Sopenharmony_ci#define MSG_BUNDLER 6 7862306a36Sopenharmony_ci#define LINK_PROTOCOL 7 7962306a36Sopenharmony_ci#define CONN_MANAGER 8 8062306a36Sopenharmony_ci#define GROUP_PROTOCOL 9 8162306a36Sopenharmony_ci#define TUNNEL_PROTOCOL 10 8262306a36Sopenharmony_ci#define NAME_DISTRIBUTOR 11 8362306a36Sopenharmony_ci#define MSG_FRAGMENTER 12 8462306a36Sopenharmony_ci#define LINK_CONFIG 13 8562306a36Sopenharmony_ci#define MSG_CRYPTO 14 8662306a36Sopenharmony_ci#define SOCK_WAKEUP 14 /* pseudo user */ 8762306a36Sopenharmony_ci#define TOP_SRV 15 /* pseudo user */ 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/* 9062306a36Sopenharmony_ci * Message header sizes 9162306a36Sopenharmony_ci */ 9262306a36Sopenharmony_ci#define SHORT_H_SIZE 24 /* In-cluster basic payload message */ 9362306a36Sopenharmony_ci#define BASIC_H_SIZE 32 /* Basic payload message */ 9462306a36Sopenharmony_ci#define NAMED_H_SIZE 40 /* Named payload message */ 9562306a36Sopenharmony_ci#define MCAST_H_SIZE 44 /* Multicast payload message */ 9662306a36Sopenharmony_ci#define GROUP_H_SIZE 44 /* Group payload message */ 9762306a36Sopenharmony_ci#define INT_H_SIZE 40 /* Internal messages */ 9862306a36Sopenharmony_ci#define MIN_H_SIZE 24 /* Smallest legal TIPC header size */ 9962306a36Sopenharmony_ci#define MAX_H_SIZE 60 /* Largest possible TIPC header size */ 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci#define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE) 10262306a36Sopenharmony_ci#define TIPC_MEDIA_INFO_OFFSET 5 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ciextern const int one_page_mtu; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cistruct tipc_skb_cb { 10762306a36Sopenharmony_ci union { 10862306a36Sopenharmony_ci struct { 10962306a36Sopenharmony_ci struct sk_buff *tail; 11062306a36Sopenharmony_ci unsigned long nxt_retr; 11162306a36Sopenharmony_ci unsigned long retr_stamp; 11262306a36Sopenharmony_ci u32 bytes_read; 11362306a36Sopenharmony_ci u32 orig_member; 11462306a36Sopenharmony_ci u16 chain_imp; 11562306a36Sopenharmony_ci u16 ackers; 11662306a36Sopenharmony_ci u16 retr_cnt; 11762306a36Sopenharmony_ci } __packed; 11862306a36Sopenharmony_ci#ifdef CONFIG_TIPC_CRYPTO 11962306a36Sopenharmony_ci struct { 12062306a36Sopenharmony_ci struct tipc_crypto *rx; 12162306a36Sopenharmony_ci struct tipc_aead *last; 12262306a36Sopenharmony_ci u8 recurs; 12362306a36Sopenharmony_ci } tx_clone_ctx __packed; 12462306a36Sopenharmony_ci#endif 12562306a36Sopenharmony_ci } __packed; 12662306a36Sopenharmony_ci union { 12762306a36Sopenharmony_ci struct { 12862306a36Sopenharmony_ci u8 validated:1; 12962306a36Sopenharmony_ci#ifdef CONFIG_TIPC_CRYPTO 13062306a36Sopenharmony_ci u8 encrypted:1; 13162306a36Sopenharmony_ci u8 decrypted:1; 13262306a36Sopenharmony_ci#define SKB_PROBING 1 13362306a36Sopenharmony_ci#define SKB_GRACING 2 13462306a36Sopenharmony_ci u8 xmit_type:2; 13562306a36Sopenharmony_ci u8 tx_clone_deferred:1; 13662306a36Sopenharmony_ci#endif 13762306a36Sopenharmony_ci }; 13862306a36Sopenharmony_ci u8 flags; 13962306a36Sopenharmony_ci }; 14062306a36Sopenharmony_ci u8 reserved; 14162306a36Sopenharmony_ci#ifdef CONFIG_TIPC_CRYPTO 14262306a36Sopenharmony_ci void *crypto_ctx; 14362306a36Sopenharmony_ci#endif 14462306a36Sopenharmony_ci} __packed; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#define TIPC_SKB_CB(__skb) ((struct tipc_skb_cb *)&((__skb)->cb[0])) 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistruct tipc_msg { 14962306a36Sopenharmony_ci __be32 hdr[15]; 15062306a36Sopenharmony_ci}; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci/* struct tipc_gap_ack - TIPC Gap ACK block 15362306a36Sopenharmony_ci * @ack: seqno of the last consecutive packet in link deferdq 15462306a36Sopenharmony_ci * @gap: number of gap packets since the last ack 15562306a36Sopenharmony_ci * 15662306a36Sopenharmony_ci * E.g: 15762306a36Sopenharmony_ci * link deferdq: 1 2 3 4 10 11 13 14 15 20 15862306a36Sopenharmony_ci * --> Gap ACK blocks: <4, 5>, <11, 1>, <15, 4>, <20, 0> 15962306a36Sopenharmony_ci */ 16062306a36Sopenharmony_cistruct tipc_gap_ack { 16162306a36Sopenharmony_ci __be16 ack; 16262306a36Sopenharmony_ci __be16 gap; 16362306a36Sopenharmony_ci}; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci/* struct tipc_gap_ack_blks 16662306a36Sopenharmony_ci * @len: actual length of the record 16762306a36Sopenharmony_ci * @ugack_cnt: number of Gap ACK blocks for unicast (following the broadcast 16862306a36Sopenharmony_ci * ones) 16962306a36Sopenharmony_ci * @start_index: starting index for "valid" broadcast Gap ACK blocks 17062306a36Sopenharmony_ci * @bgack_cnt: number of Gap ACK blocks for broadcast in the record 17162306a36Sopenharmony_ci * @gacks: array of Gap ACK blocks 17262306a36Sopenharmony_ci * 17362306a36Sopenharmony_ci * 31 16 15 0 17462306a36Sopenharmony_ci * +-------------+-------------+-------------+-------------+ 17562306a36Sopenharmony_ci * | bgack_cnt | ugack_cnt | len | 17662306a36Sopenharmony_ci * +-------------+-------------+-------------+-------------+ - 17762306a36Sopenharmony_ci * | gap | ack | | 17862306a36Sopenharmony_ci * +-------------+-------------+-------------+-------------+ > bc gacks 17962306a36Sopenharmony_ci * : : : | 18062306a36Sopenharmony_ci * +-------------+-------------+-------------+-------------+ - 18162306a36Sopenharmony_ci * | gap | ack | | 18262306a36Sopenharmony_ci * +-------------+-------------+-------------+-------------+ > uc gacks 18362306a36Sopenharmony_ci * : : : | 18462306a36Sopenharmony_ci * +-------------+-------------+-------------+-------------+ - 18562306a36Sopenharmony_ci */ 18662306a36Sopenharmony_cistruct tipc_gap_ack_blks { 18762306a36Sopenharmony_ci __be16 len; 18862306a36Sopenharmony_ci union { 18962306a36Sopenharmony_ci u8 ugack_cnt; 19062306a36Sopenharmony_ci u8 start_index; 19162306a36Sopenharmony_ci }; 19262306a36Sopenharmony_ci u8 bgack_cnt; 19362306a36Sopenharmony_ci struct tipc_gap_ack gacks[]; 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci#define MAX_GAP_ACK_BLKS 128 19762306a36Sopenharmony_ci#define MAX_GAP_ACK_BLKS_SZ (sizeof(struct tipc_gap_ack_blks) + \ 19862306a36Sopenharmony_ci sizeof(struct tipc_gap_ack) * MAX_GAP_ACK_BLKS) 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistatic inline struct tipc_msg *buf_msg(struct sk_buff *skb) 20162306a36Sopenharmony_ci{ 20262306a36Sopenharmony_ci return (struct tipc_msg *)skb->data; 20362306a36Sopenharmony_ci} 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_cistatic inline u32 msg_word(struct tipc_msg *m, u32 pos) 20662306a36Sopenharmony_ci{ 20762306a36Sopenharmony_ci return ntohl(m->hdr[pos]); 20862306a36Sopenharmony_ci} 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistatic inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val) 21162306a36Sopenharmony_ci{ 21262306a36Sopenharmony_ci m->hdr[w] = htonl(val); 21362306a36Sopenharmony_ci} 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_cistatic inline u32 msg_bits(struct tipc_msg *m, u32 w, u32 pos, u32 mask) 21662306a36Sopenharmony_ci{ 21762306a36Sopenharmony_ci return (msg_word(m, w) >> pos) & mask; 21862306a36Sopenharmony_ci} 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistatic inline void msg_set_bits(struct tipc_msg *m, u32 w, 22162306a36Sopenharmony_ci u32 pos, u32 mask, u32 val) 22262306a36Sopenharmony_ci{ 22362306a36Sopenharmony_ci val = (val & mask) << pos; 22462306a36Sopenharmony_ci mask = mask << pos; 22562306a36Sopenharmony_ci m->hdr[w] &= ~htonl(mask); 22662306a36Sopenharmony_ci m->hdr[w] |= htonl(val); 22762306a36Sopenharmony_ci} 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci/* 23062306a36Sopenharmony_ci * Word 0 23162306a36Sopenharmony_ci */ 23262306a36Sopenharmony_cistatic inline u32 msg_version(struct tipc_msg *m) 23362306a36Sopenharmony_ci{ 23462306a36Sopenharmony_ci return msg_bits(m, 0, 29, 7); 23562306a36Sopenharmony_ci} 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_cistatic inline void msg_set_version(struct tipc_msg *m) 23862306a36Sopenharmony_ci{ 23962306a36Sopenharmony_ci msg_set_bits(m, 0, 29, 7, TIPC_VERSION); 24062306a36Sopenharmony_ci} 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cistatic inline u32 msg_user(struct tipc_msg *m) 24362306a36Sopenharmony_ci{ 24462306a36Sopenharmony_ci return msg_bits(m, 0, 25, 0xf); 24562306a36Sopenharmony_ci} 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_cistatic inline u32 msg_isdata(struct tipc_msg *m) 24862306a36Sopenharmony_ci{ 24962306a36Sopenharmony_ci return msg_user(m) <= TIPC_CRITICAL_IMPORTANCE; 25062306a36Sopenharmony_ci} 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_cistatic inline void msg_set_user(struct tipc_msg *m, u32 n) 25362306a36Sopenharmony_ci{ 25462306a36Sopenharmony_ci msg_set_bits(m, 0, 25, 0xf, n); 25562306a36Sopenharmony_ci} 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_cistatic inline u32 msg_hdr_sz(struct tipc_msg *m) 25862306a36Sopenharmony_ci{ 25962306a36Sopenharmony_ci return msg_bits(m, 0, 21, 0xf) << 2; 26062306a36Sopenharmony_ci} 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_cistatic inline void msg_set_hdr_sz(struct tipc_msg *m, u32 n) 26362306a36Sopenharmony_ci{ 26462306a36Sopenharmony_ci msg_set_bits(m, 0, 21, 0xf, n>>2); 26562306a36Sopenharmony_ci} 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistatic inline u32 msg_size(struct tipc_msg *m) 26862306a36Sopenharmony_ci{ 26962306a36Sopenharmony_ci return msg_bits(m, 0, 0, 0x1ffff); 27062306a36Sopenharmony_ci} 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_cistatic inline u32 msg_blocks(struct tipc_msg *m) 27362306a36Sopenharmony_ci{ 27462306a36Sopenharmony_ci return (msg_size(m) / 1024) + 1; 27562306a36Sopenharmony_ci} 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_cistatic inline u32 msg_data_sz(struct tipc_msg *m) 27862306a36Sopenharmony_ci{ 27962306a36Sopenharmony_ci return msg_size(m) - msg_hdr_sz(m); 28062306a36Sopenharmony_ci} 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_cistatic inline int msg_non_seq(struct tipc_msg *m) 28362306a36Sopenharmony_ci{ 28462306a36Sopenharmony_ci return msg_bits(m, 0, 20, 1); 28562306a36Sopenharmony_ci} 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_cistatic inline void msg_set_non_seq(struct tipc_msg *m, u32 n) 28862306a36Sopenharmony_ci{ 28962306a36Sopenharmony_ci msg_set_bits(m, 0, 20, 1, n); 29062306a36Sopenharmony_ci} 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cistatic inline int msg_is_syn(struct tipc_msg *m) 29362306a36Sopenharmony_ci{ 29462306a36Sopenharmony_ci return msg_bits(m, 0, 17, 1); 29562306a36Sopenharmony_ci} 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cistatic inline void msg_set_syn(struct tipc_msg *m, u32 d) 29862306a36Sopenharmony_ci{ 29962306a36Sopenharmony_ci msg_set_bits(m, 0, 17, 1, d); 30062306a36Sopenharmony_ci} 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cistatic inline int msg_dest_droppable(struct tipc_msg *m) 30362306a36Sopenharmony_ci{ 30462306a36Sopenharmony_ci return msg_bits(m, 0, 19, 1); 30562306a36Sopenharmony_ci} 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_cistatic inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d) 30862306a36Sopenharmony_ci{ 30962306a36Sopenharmony_ci msg_set_bits(m, 0, 19, 1, d); 31062306a36Sopenharmony_ci} 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cistatic inline int msg_is_keepalive(struct tipc_msg *m) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci return msg_bits(m, 0, 19, 1); 31562306a36Sopenharmony_ci} 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_cistatic inline void msg_set_is_keepalive(struct tipc_msg *m, u32 d) 31862306a36Sopenharmony_ci{ 31962306a36Sopenharmony_ci msg_set_bits(m, 0, 19, 1, d); 32062306a36Sopenharmony_ci} 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_cistatic inline int msg_src_droppable(struct tipc_msg *m) 32362306a36Sopenharmony_ci{ 32462306a36Sopenharmony_ci return msg_bits(m, 0, 18, 1); 32562306a36Sopenharmony_ci} 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_cistatic inline void msg_set_src_droppable(struct tipc_msg *m, u32 d) 32862306a36Sopenharmony_ci{ 32962306a36Sopenharmony_ci msg_set_bits(m, 0, 18, 1, d); 33062306a36Sopenharmony_ci} 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistatic inline int msg_ack_required(struct tipc_msg *m) 33362306a36Sopenharmony_ci{ 33462306a36Sopenharmony_ci return msg_bits(m, 0, 18, 1); 33562306a36Sopenharmony_ci} 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic inline void msg_set_ack_required(struct tipc_msg *m) 33862306a36Sopenharmony_ci{ 33962306a36Sopenharmony_ci msg_set_bits(m, 0, 18, 1, 1); 34062306a36Sopenharmony_ci} 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_cistatic inline int msg_nagle_ack(struct tipc_msg *m) 34362306a36Sopenharmony_ci{ 34462306a36Sopenharmony_ci return msg_bits(m, 0, 18, 1); 34562306a36Sopenharmony_ci} 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_cistatic inline void msg_set_nagle_ack(struct tipc_msg *m) 34862306a36Sopenharmony_ci{ 34962306a36Sopenharmony_ci msg_set_bits(m, 0, 18, 1, 1); 35062306a36Sopenharmony_ci} 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_cistatic inline bool msg_is_rcast(struct tipc_msg *m) 35362306a36Sopenharmony_ci{ 35462306a36Sopenharmony_ci return msg_bits(m, 0, 18, 0x1); 35562306a36Sopenharmony_ci} 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_cistatic inline void msg_set_is_rcast(struct tipc_msg *m, bool d) 35862306a36Sopenharmony_ci{ 35962306a36Sopenharmony_ci msg_set_bits(m, 0, 18, 0x1, d); 36062306a36Sopenharmony_ci} 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistatic inline void msg_set_size(struct tipc_msg *m, u32 sz) 36362306a36Sopenharmony_ci{ 36462306a36Sopenharmony_ci m->hdr[0] = htonl((msg_word(m, 0) & ~0x1ffff) | sz); 36562306a36Sopenharmony_ci} 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_cistatic inline unchar *msg_data(struct tipc_msg *m) 36862306a36Sopenharmony_ci{ 36962306a36Sopenharmony_ci return ((unchar *)m) + msg_hdr_sz(m); 37062306a36Sopenharmony_ci} 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_cistatic inline struct tipc_msg *msg_inner_hdr(struct tipc_msg *m) 37362306a36Sopenharmony_ci{ 37462306a36Sopenharmony_ci return (struct tipc_msg *)msg_data(m); 37562306a36Sopenharmony_ci} 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci/* 37862306a36Sopenharmony_ci * Word 1 37962306a36Sopenharmony_ci */ 38062306a36Sopenharmony_cistatic inline u32 msg_type(struct tipc_msg *m) 38162306a36Sopenharmony_ci{ 38262306a36Sopenharmony_ci return msg_bits(m, 1, 29, 0x7); 38362306a36Sopenharmony_ci} 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_cistatic inline void msg_set_type(struct tipc_msg *m, u32 n) 38662306a36Sopenharmony_ci{ 38762306a36Sopenharmony_ci msg_set_bits(m, 1, 29, 0x7, n); 38862306a36Sopenharmony_ci} 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_cistatic inline int msg_in_group(struct tipc_msg *m) 39162306a36Sopenharmony_ci{ 39262306a36Sopenharmony_ci int mtyp = msg_type(m); 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci return mtyp >= TIPC_GRP_MEMBER_EVT && mtyp <= TIPC_GRP_UCAST_MSG; 39562306a36Sopenharmony_ci} 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cistatic inline bool msg_is_grp_evt(struct tipc_msg *m) 39862306a36Sopenharmony_ci{ 39962306a36Sopenharmony_ci return msg_type(m) == TIPC_GRP_MEMBER_EVT; 40062306a36Sopenharmony_ci} 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_cistatic inline u32 msg_named(struct tipc_msg *m) 40362306a36Sopenharmony_ci{ 40462306a36Sopenharmony_ci return msg_type(m) == TIPC_NAMED_MSG; 40562306a36Sopenharmony_ci} 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_cistatic inline u32 msg_mcast(struct tipc_msg *m) 40862306a36Sopenharmony_ci{ 40962306a36Sopenharmony_ci int mtyp = msg_type(m); 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci return ((mtyp == TIPC_MCAST_MSG) || (mtyp == TIPC_GRP_BCAST_MSG) || 41262306a36Sopenharmony_ci (mtyp == TIPC_GRP_MCAST_MSG)); 41362306a36Sopenharmony_ci} 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_cistatic inline u32 msg_connected(struct tipc_msg *m) 41662306a36Sopenharmony_ci{ 41762306a36Sopenharmony_ci return msg_type(m) == TIPC_CONN_MSG; 41862306a36Sopenharmony_ci} 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_cistatic inline u32 msg_direct(struct tipc_msg *m) 42162306a36Sopenharmony_ci{ 42262306a36Sopenharmony_ci return msg_type(m) == TIPC_DIRECT_MSG; 42362306a36Sopenharmony_ci} 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_cistatic inline u32 msg_errcode(struct tipc_msg *m) 42662306a36Sopenharmony_ci{ 42762306a36Sopenharmony_ci return msg_bits(m, 1, 25, 0xf); 42862306a36Sopenharmony_ci} 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_cistatic inline void msg_set_errcode(struct tipc_msg *m, u32 err) 43162306a36Sopenharmony_ci{ 43262306a36Sopenharmony_ci msg_set_bits(m, 1, 25, 0xf, err); 43362306a36Sopenharmony_ci} 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_cistatic inline void msg_set_bulk(struct tipc_msg *m) 43662306a36Sopenharmony_ci{ 43762306a36Sopenharmony_ci msg_set_bits(m, 1, 28, 0x1, 1); 43862306a36Sopenharmony_ci} 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_cistatic inline u32 msg_is_bulk(struct tipc_msg *m) 44162306a36Sopenharmony_ci{ 44262306a36Sopenharmony_ci return msg_bits(m, 1, 28, 0x1); 44362306a36Sopenharmony_ci} 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_cistatic inline void msg_set_last_bulk(struct tipc_msg *m) 44662306a36Sopenharmony_ci{ 44762306a36Sopenharmony_ci msg_set_bits(m, 1, 27, 0x1, 1); 44862306a36Sopenharmony_ci} 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_cistatic inline u32 msg_is_last_bulk(struct tipc_msg *m) 45162306a36Sopenharmony_ci{ 45262306a36Sopenharmony_ci return msg_bits(m, 1, 27, 0x1); 45362306a36Sopenharmony_ci} 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_cistatic inline void msg_set_non_legacy(struct tipc_msg *m) 45662306a36Sopenharmony_ci{ 45762306a36Sopenharmony_ci msg_set_bits(m, 1, 26, 0x1, 1); 45862306a36Sopenharmony_ci} 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cistatic inline u32 msg_is_legacy(struct tipc_msg *m) 46162306a36Sopenharmony_ci{ 46262306a36Sopenharmony_ci return !msg_bits(m, 1, 26, 0x1); 46362306a36Sopenharmony_ci} 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_cistatic inline u32 msg_reroute_cnt(struct tipc_msg *m) 46662306a36Sopenharmony_ci{ 46762306a36Sopenharmony_ci return msg_bits(m, 1, 21, 0xf); 46862306a36Sopenharmony_ci} 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_cistatic inline void msg_incr_reroute_cnt(struct tipc_msg *m) 47162306a36Sopenharmony_ci{ 47262306a36Sopenharmony_ci msg_set_bits(m, 1, 21, 0xf, msg_reroute_cnt(m) + 1); 47362306a36Sopenharmony_ci} 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_cistatic inline u32 msg_lookup_scope(struct tipc_msg *m) 47662306a36Sopenharmony_ci{ 47762306a36Sopenharmony_ci return msg_bits(m, 1, 19, 0x3); 47862306a36Sopenharmony_ci} 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_cistatic inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n) 48162306a36Sopenharmony_ci{ 48262306a36Sopenharmony_ci msg_set_bits(m, 1, 19, 0x3, n); 48362306a36Sopenharmony_ci} 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_cistatic inline u16 msg_bcast_ack(struct tipc_msg *m) 48662306a36Sopenharmony_ci{ 48762306a36Sopenharmony_ci return msg_bits(m, 1, 0, 0xffff); 48862306a36Sopenharmony_ci} 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_cistatic inline void msg_set_bcast_ack(struct tipc_msg *m, u16 n) 49162306a36Sopenharmony_ci{ 49262306a36Sopenharmony_ci msg_set_bits(m, 1, 0, 0xffff, n); 49362306a36Sopenharmony_ci} 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci/* Note: reusing bits in word 1 for ACTIVATE_MSG only, to re-synch 49662306a36Sopenharmony_ci * link peer session number 49762306a36Sopenharmony_ci */ 49862306a36Sopenharmony_cistatic inline bool msg_dest_session_valid(struct tipc_msg *m) 49962306a36Sopenharmony_ci{ 50062306a36Sopenharmony_ci return msg_bits(m, 1, 16, 0x1); 50162306a36Sopenharmony_ci} 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_cistatic inline void msg_set_dest_session_valid(struct tipc_msg *m, bool valid) 50462306a36Sopenharmony_ci{ 50562306a36Sopenharmony_ci msg_set_bits(m, 1, 16, 0x1, valid); 50662306a36Sopenharmony_ci} 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_cistatic inline u16 msg_dest_session(struct tipc_msg *m) 50962306a36Sopenharmony_ci{ 51062306a36Sopenharmony_ci return msg_bits(m, 1, 0, 0xffff); 51162306a36Sopenharmony_ci} 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_cistatic inline void msg_set_dest_session(struct tipc_msg *m, u16 n) 51462306a36Sopenharmony_ci{ 51562306a36Sopenharmony_ci msg_set_bits(m, 1, 0, 0xffff, n); 51662306a36Sopenharmony_ci} 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci/* 51962306a36Sopenharmony_ci * Word 2 52062306a36Sopenharmony_ci */ 52162306a36Sopenharmony_cistatic inline u16 msg_ack(struct tipc_msg *m) 52262306a36Sopenharmony_ci{ 52362306a36Sopenharmony_ci return msg_bits(m, 2, 16, 0xffff); 52462306a36Sopenharmony_ci} 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_cistatic inline void msg_set_ack(struct tipc_msg *m, u16 n) 52762306a36Sopenharmony_ci{ 52862306a36Sopenharmony_ci msg_set_bits(m, 2, 16, 0xffff, n); 52962306a36Sopenharmony_ci} 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_cistatic inline u16 msg_seqno(struct tipc_msg *m) 53262306a36Sopenharmony_ci{ 53362306a36Sopenharmony_ci return msg_bits(m, 2, 0, 0xffff); 53462306a36Sopenharmony_ci} 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_cistatic inline void msg_set_seqno(struct tipc_msg *m, u16 n) 53762306a36Sopenharmony_ci{ 53862306a36Sopenharmony_ci msg_set_bits(m, 2, 0, 0xffff, n); 53962306a36Sopenharmony_ci} 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci/* 54262306a36Sopenharmony_ci * Words 3-10 54362306a36Sopenharmony_ci */ 54462306a36Sopenharmony_cistatic inline u32 msg_importance(struct tipc_msg *m) 54562306a36Sopenharmony_ci{ 54662306a36Sopenharmony_ci int usr = msg_user(m); 54762306a36Sopenharmony_ci 54862306a36Sopenharmony_ci if (likely((usr <= TIPC_CRITICAL_IMPORTANCE) && !msg_errcode(m))) 54962306a36Sopenharmony_ci return usr; 55062306a36Sopenharmony_ci if ((usr == MSG_FRAGMENTER) || (usr == MSG_BUNDLER)) 55162306a36Sopenharmony_ci return msg_bits(m, 9, 0, 0x7); 55262306a36Sopenharmony_ci return TIPC_SYSTEM_IMPORTANCE; 55362306a36Sopenharmony_ci} 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_cistatic inline void msg_set_importance(struct tipc_msg *m, u32 i) 55662306a36Sopenharmony_ci{ 55762306a36Sopenharmony_ci int usr = msg_user(m); 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_ci if (likely((usr == MSG_FRAGMENTER) || (usr == MSG_BUNDLER))) 56062306a36Sopenharmony_ci msg_set_bits(m, 9, 0, 0x7, i); 56162306a36Sopenharmony_ci else if (i < TIPC_SYSTEM_IMPORTANCE) 56262306a36Sopenharmony_ci msg_set_user(m, i); 56362306a36Sopenharmony_ci else 56462306a36Sopenharmony_ci pr_warn("Trying to set illegal importance in message\n"); 56562306a36Sopenharmony_ci} 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_cistatic inline u32 msg_prevnode(struct tipc_msg *m) 56862306a36Sopenharmony_ci{ 56962306a36Sopenharmony_ci return msg_word(m, 3); 57062306a36Sopenharmony_ci} 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_cistatic inline void msg_set_prevnode(struct tipc_msg *m, u32 a) 57362306a36Sopenharmony_ci{ 57462306a36Sopenharmony_ci msg_set_word(m, 3, a); 57562306a36Sopenharmony_ci} 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_cistatic inline u32 msg_origport(struct tipc_msg *m) 57862306a36Sopenharmony_ci{ 57962306a36Sopenharmony_ci if (msg_user(m) == MSG_FRAGMENTER) 58062306a36Sopenharmony_ci m = msg_inner_hdr(m); 58162306a36Sopenharmony_ci return msg_word(m, 4); 58262306a36Sopenharmony_ci} 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_cistatic inline void msg_set_origport(struct tipc_msg *m, u32 p) 58562306a36Sopenharmony_ci{ 58662306a36Sopenharmony_ci msg_set_word(m, 4, p); 58762306a36Sopenharmony_ci} 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_cistatic inline u16 msg_named_seqno(struct tipc_msg *m) 59062306a36Sopenharmony_ci{ 59162306a36Sopenharmony_ci return msg_bits(m, 4, 0, 0xffff); 59262306a36Sopenharmony_ci} 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_cistatic inline void msg_set_named_seqno(struct tipc_msg *m, u16 n) 59562306a36Sopenharmony_ci{ 59662306a36Sopenharmony_ci msg_set_bits(m, 4, 0, 0xffff, n); 59762306a36Sopenharmony_ci} 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_cistatic inline u32 msg_destport(struct tipc_msg *m) 60062306a36Sopenharmony_ci{ 60162306a36Sopenharmony_ci return msg_word(m, 5); 60262306a36Sopenharmony_ci} 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_cistatic inline void msg_set_destport(struct tipc_msg *m, u32 p) 60562306a36Sopenharmony_ci{ 60662306a36Sopenharmony_ci msg_set_word(m, 5, p); 60762306a36Sopenharmony_ci} 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_cistatic inline u32 msg_mc_netid(struct tipc_msg *m) 61062306a36Sopenharmony_ci{ 61162306a36Sopenharmony_ci return msg_word(m, 5); 61262306a36Sopenharmony_ci} 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_cistatic inline void msg_set_mc_netid(struct tipc_msg *m, u32 p) 61562306a36Sopenharmony_ci{ 61662306a36Sopenharmony_ci msg_set_word(m, 5, p); 61762306a36Sopenharmony_ci} 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_cistatic inline int msg_short(struct tipc_msg *m) 62062306a36Sopenharmony_ci{ 62162306a36Sopenharmony_ci return msg_hdr_sz(m) == SHORT_H_SIZE; 62262306a36Sopenharmony_ci} 62362306a36Sopenharmony_ci 62462306a36Sopenharmony_cistatic inline u32 msg_orignode(struct tipc_msg *m) 62562306a36Sopenharmony_ci{ 62662306a36Sopenharmony_ci if (likely(msg_short(m))) 62762306a36Sopenharmony_ci return msg_prevnode(m); 62862306a36Sopenharmony_ci return msg_word(m, 6); 62962306a36Sopenharmony_ci} 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_cistatic inline void msg_set_orignode(struct tipc_msg *m, u32 a) 63262306a36Sopenharmony_ci{ 63362306a36Sopenharmony_ci msg_set_word(m, 6, a); 63462306a36Sopenharmony_ci} 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_cistatic inline u32 msg_destnode(struct tipc_msg *m) 63762306a36Sopenharmony_ci{ 63862306a36Sopenharmony_ci return msg_word(m, 7); 63962306a36Sopenharmony_ci} 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_cistatic inline void msg_set_destnode(struct tipc_msg *m, u32 a) 64262306a36Sopenharmony_ci{ 64362306a36Sopenharmony_ci msg_set_word(m, 7, a); 64462306a36Sopenharmony_ci} 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_cistatic inline u32 msg_nametype(struct tipc_msg *m) 64762306a36Sopenharmony_ci{ 64862306a36Sopenharmony_ci return msg_word(m, 8); 64962306a36Sopenharmony_ci} 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_cistatic inline void msg_set_nametype(struct tipc_msg *m, u32 n) 65262306a36Sopenharmony_ci{ 65362306a36Sopenharmony_ci msg_set_word(m, 8, n); 65462306a36Sopenharmony_ci} 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_cistatic inline u32 msg_nameinst(struct tipc_msg *m) 65762306a36Sopenharmony_ci{ 65862306a36Sopenharmony_ci return msg_word(m, 9); 65962306a36Sopenharmony_ci} 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_cistatic inline u32 msg_namelower(struct tipc_msg *m) 66262306a36Sopenharmony_ci{ 66362306a36Sopenharmony_ci return msg_nameinst(m); 66462306a36Sopenharmony_ci} 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_cistatic inline void msg_set_namelower(struct tipc_msg *m, u32 n) 66762306a36Sopenharmony_ci{ 66862306a36Sopenharmony_ci msg_set_word(m, 9, n); 66962306a36Sopenharmony_ci} 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_cistatic inline void msg_set_nameinst(struct tipc_msg *m, u32 n) 67262306a36Sopenharmony_ci{ 67362306a36Sopenharmony_ci msg_set_namelower(m, n); 67462306a36Sopenharmony_ci} 67562306a36Sopenharmony_ci 67662306a36Sopenharmony_cistatic inline u32 msg_nameupper(struct tipc_msg *m) 67762306a36Sopenharmony_ci{ 67862306a36Sopenharmony_ci return msg_word(m, 10); 67962306a36Sopenharmony_ci} 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_cistatic inline void msg_set_nameupper(struct tipc_msg *m, u32 n) 68262306a36Sopenharmony_ci{ 68362306a36Sopenharmony_ci msg_set_word(m, 10, n); 68462306a36Sopenharmony_ci} 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_ci/* 68762306a36Sopenharmony_ci * Constants and routines used to read and write TIPC internal message headers 68862306a36Sopenharmony_ci */ 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci/* 69162306a36Sopenharmony_ci * Connection management protocol message types 69262306a36Sopenharmony_ci */ 69362306a36Sopenharmony_ci#define CONN_PROBE 0 69462306a36Sopenharmony_ci#define CONN_PROBE_REPLY 1 69562306a36Sopenharmony_ci#define CONN_ACK 2 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci/* 69862306a36Sopenharmony_ci * Name distributor message types 69962306a36Sopenharmony_ci */ 70062306a36Sopenharmony_ci#define PUBLICATION 0 70162306a36Sopenharmony_ci#define WITHDRAWAL 1 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_ci/* 70462306a36Sopenharmony_ci * Segmentation message types 70562306a36Sopenharmony_ci */ 70662306a36Sopenharmony_ci#define FIRST_FRAGMENT 0 70762306a36Sopenharmony_ci#define FRAGMENT 1 70862306a36Sopenharmony_ci#define LAST_FRAGMENT 2 70962306a36Sopenharmony_ci 71062306a36Sopenharmony_ci/* 71162306a36Sopenharmony_ci * Link management protocol message types 71262306a36Sopenharmony_ci */ 71362306a36Sopenharmony_ci#define STATE_MSG 0 71462306a36Sopenharmony_ci#define RESET_MSG 1 71562306a36Sopenharmony_ci#define ACTIVATE_MSG 2 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_ci/* 71862306a36Sopenharmony_ci * Changeover tunnel message types 71962306a36Sopenharmony_ci */ 72062306a36Sopenharmony_ci#define SYNCH_MSG 0 72162306a36Sopenharmony_ci#define FAILOVER_MSG 1 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_ci/* 72462306a36Sopenharmony_ci * Config protocol message types 72562306a36Sopenharmony_ci */ 72662306a36Sopenharmony_ci#define DSC_REQ_MSG 0 72762306a36Sopenharmony_ci#define DSC_RESP_MSG 1 72862306a36Sopenharmony_ci#define DSC_TRIAL_MSG 2 72962306a36Sopenharmony_ci#define DSC_TRIAL_FAIL_MSG 3 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci/* 73262306a36Sopenharmony_ci * Group protocol message types 73362306a36Sopenharmony_ci */ 73462306a36Sopenharmony_ci#define GRP_JOIN_MSG 0 73562306a36Sopenharmony_ci#define GRP_LEAVE_MSG 1 73662306a36Sopenharmony_ci#define GRP_ADV_MSG 2 73762306a36Sopenharmony_ci#define GRP_ACK_MSG 3 73862306a36Sopenharmony_ci#define GRP_RECLAIM_MSG 4 73962306a36Sopenharmony_ci#define GRP_REMIT_MSG 5 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_ci/* Crypto message types */ 74262306a36Sopenharmony_ci#define KEY_DISTR_MSG 0 74362306a36Sopenharmony_ci 74462306a36Sopenharmony_ci/* 74562306a36Sopenharmony_ci * Word 1 74662306a36Sopenharmony_ci */ 74762306a36Sopenharmony_cistatic inline u32 msg_seq_gap(struct tipc_msg *m) 74862306a36Sopenharmony_ci{ 74962306a36Sopenharmony_ci return msg_bits(m, 1, 16, 0x1fff); 75062306a36Sopenharmony_ci} 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_cistatic inline void msg_set_seq_gap(struct tipc_msg *m, u32 n) 75362306a36Sopenharmony_ci{ 75462306a36Sopenharmony_ci msg_set_bits(m, 1, 16, 0x1fff, n); 75562306a36Sopenharmony_ci} 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_cistatic inline u32 msg_node_sig(struct tipc_msg *m) 75862306a36Sopenharmony_ci{ 75962306a36Sopenharmony_ci return msg_bits(m, 1, 0, 0xffff); 76062306a36Sopenharmony_ci} 76162306a36Sopenharmony_ci 76262306a36Sopenharmony_cistatic inline void msg_set_node_sig(struct tipc_msg *m, u32 n) 76362306a36Sopenharmony_ci{ 76462306a36Sopenharmony_ci msg_set_bits(m, 1, 0, 0xffff, n); 76562306a36Sopenharmony_ci} 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_cistatic inline u32 msg_node_capabilities(struct tipc_msg *m) 76862306a36Sopenharmony_ci{ 76962306a36Sopenharmony_ci return msg_bits(m, 1, 15, 0x1fff); 77062306a36Sopenharmony_ci} 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_cistatic inline void msg_set_node_capabilities(struct tipc_msg *m, u32 n) 77362306a36Sopenharmony_ci{ 77462306a36Sopenharmony_ci msg_set_bits(m, 1, 15, 0x1fff, n); 77562306a36Sopenharmony_ci} 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_ci/* 77862306a36Sopenharmony_ci * Word 2 77962306a36Sopenharmony_ci */ 78062306a36Sopenharmony_cistatic inline u32 msg_dest_domain(struct tipc_msg *m) 78162306a36Sopenharmony_ci{ 78262306a36Sopenharmony_ci return msg_word(m, 2); 78362306a36Sopenharmony_ci} 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_cistatic inline void msg_set_dest_domain(struct tipc_msg *m, u32 n) 78662306a36Sopenharmony_ci{ 78762306a36Sopenharmony_ci msg_set_word(m, 2, n); 78862306a36Sopenharmony_ci} 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_cistatic inline void msg_set_bcgap_after(struct tipc_msg *m, u32 n) 79162306a36Sopenharmony_ci{ 79262306a36Sopenharmony_ci msg_set_bits(m, 2, 16, 0xffff, n); 79362306a36Sopenharmony_ci} 79462306a36Sopenharmony_ci 79562306a36Sopenharmony_cistatic inline u32 msg_bcgap_to(struct tipc_msg *m) 79662306a36Sopenharmony_ci{ 79762306a36Sopenharmony_ci return msg_bits(m, 2, 0, 0xffff); 79862306a36Sopenharmony_ci} 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_cistatic inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n) 80162306a36Sopenharmony_ci{ 80262306a36Sopenharmony_ci msg_set_bits(m, 2, 0, 0xffff, n); 80362306a36Sopenharmony_ci} 80462306a36Sopenharmony_ci 80562306a36Sopenharmony_ci/* 80662306a36Sopenharmony_ci * Word 4 80762306a36Sopenharmony_ci */ 80862306a36Sopenharmony_cistatic inline u32 msg_last_bcast(struct tipc_msg *m) 80962306a36Sopenharmony_ci{ 81062306a36Sopenharmony_ci return msg_bits(m, 4, 16, 0xffff); 81162306a36Sopenharmony_ci} 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_cistatic inline u32 msg_bc_snd_nxt(struct tipc_msg *m) 81462306a36Sopenharmony_ci{ 81562306a36Sopenharmony_ci return msg_last_bcast(m) + 1; 81662306a36Sopenharmony_ci} 81762306a36Sopenharmony_ci 81862306a36Sopenharmony_cistatic inline void msg_set_last_bcast(struct tipc_msg *m, u32 n) 81962306a36Sopenharmony_ci{ 82062306a36Sopenharmony_ci msg_set_bits(m, 4, 16, 0xffff, n); 82162306a36Sopenharmony_ci} 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_cistatic inline u32 msg_nof_fragms(struct tipc_msg *m) 82462306a36Sopenharmony_ci{ 82562306a36Sopenharmony_ci return msg_bits(m, 4, 0, 0xffff); 82662306a36Sopenharmony_ci} 82762306a36Sopenharmony_ci 82862306a36Sopenharmony_cistatic inline void msg_set_nof_fragms(struct tipc_msg *m, u32 n) 82962306a36Sopenharmony_ci{ 83062306a36Sopenharmony_ci msg_set_bits(m, 4, 0, 0xffff, n); 83162306a36Sopenharmony_ci} 83262306a36Sopenharmony_ci 83362306a36Sopenharmony_cistatic inline u32 msg_fragm_no(struct tipc_msg *m) 83462306a36Sopenharmony_ci{ 83562306a36Sopenharmony_ci return msg_bits(m, 4, 16, 0xffff); 83662306a36Sopenharmony_ci} 83762306a36Sopenharmony_ci 83862306a36Sopenharmony_cistatic inline void msg_set_fragm_no(struct tipc_msg *m, u32 n) 83962306a36Sopenharmony_ci{ 84062306a36Sopenharmony_ci msg_set_bits(m, 4, 16, 0xffff, n); 84162306a36Sopenharmony_ci} 84262306a36Sopenharmony_ci 84362306a36Sopenharmony_cistatic inline u16 msg_next_sent(struct tipc_msg *m) 84462306a36Sopenharmony_ci{ 84562306a36Sopenharmony_ci return msg_bits(m, 4, 0, 0xffff); 84662306a36Sopenharmony_ci} 84762306a36Sopenharmony_ci 84862306a36Sopenharmony_cistatic inline void msg_set_next_sent(struct tipc_msg *m, u16 n) 84962306a36Sopenharmony_ci{ 85062306a36Sopenharmony_ci msg_set_bits(m, 4, 0, 0xffff, n); 85162306a36Sopenharmony_ci} 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_cistatic inline u32 msg_bc_netid(struct tipc_msg *m) 85462306a36Sopenharmony_ci{ 85562306a36Sopenharmony_ci return msg_word(m, 4); 85662306a36Sopenharmony_ci} 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_cistatic inline void msg_set_bc_netid(struct tipc_msg *m, u32 id) 85962306a36Sopenharmony_ci{ 86062306a36Sopenharmony_ci msg_set_word(m, 4, id); 86162306a36Sopenharmony_ci} 86262306a36Sopenharmony_ci 86362306a36Sopenharmony_cistatic inline u32 msg_link_selector(struct tipc_msg *m) 86462306a36Sopenharmony_ci{ 86562306a36Sopenharmony_ci if (msg_user(m) == MSG_FRAGMENTER) 86662306a36Sopenharmony_ci m = (void *)msg_data(m); 86762306a36Sopenharmony_ci return msg_bits(m, 4, 0, 1); 86862306a36Sopenharmony_ci} 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_ci/* 87162306a36Sopenharmony_ci * Word 5 87262306a36Sopenharmony_ci */ 87362306a36Sopenharmony_cistatic inline u16 msg_session(struct tipc_msg *m) 87462306a36Sopenharmony_ci{ 87562306a36Sopenharmony_ci return msg_bits(m, 5, 16, 0xffff); 87662306a36Sopenharmony_ci} 87762306a36Sopenharmony_ci 87862306a36Sopenharmony_cistatic inline void msg_set_session(struct tipc_msg *m, u16 n) 87962306a36Sopenharmony_ci{ 88062306a36Sopenharmony_ci msg_set_bits(m, 5, 16, 0xffff, n); 88162306a36Sopenharmony_ci} 88262306a36Sopenharmony_ci 88362306a36Sopenharmony_cistatic inline u32 msg_probe(struct tipc_msg *m) 88462306a36Sopenharmony_ci{ 88562306a36Sopenharmony_ci return msg_bits(m, 5, 0, 1); 88662306a36Sopenharmony_ci} 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_cistatic inline void msg_set_probe(struct tipc_msg *m, u32 val) 88962306a36Sopenharmony_ci{ 89062306a36Sopenharmony_ci msg_set_bits(m, 5, 0, 1, val); 89162306a36Sopenharmony_ci} 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_cistatic inline char msg_net_plane(struct tipc_msg *m) 89462306a36Sopenharmony_ci{ 89562306a36Sopenharmony_ci return msg_bits(m, 5, 1, 7) + 'A'; 89662306a36Sopenharmony_ci} 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_cistatic inline void msg_set_net_plane(struct tipc_msg *m, char n) 89962306a36Sopenharmony_ci{ 90062306a36Sopenharmony_ci msg_set_bits(m, 5, 1, 7, (n - 'A')); 90162306a36Sopenharmony_ci} 90262306a36Sopenharmony_ci 90362306a36Sopenharmony_cistatic inline u32 msg_linkprio(struct tipc_msg *m) 90462306a36Sopenharmony_ci{ 90562306a36Sopenharmony_ci return msg_bits(m, 5, 4, 0x1f); 90662306a36Sopenharmony_ci} 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_cistatic inline void msg_set_linkprio(struct tipc_msg *m, u32 n) 90962306a36Sopenharmony_ci{ 91062306a36Sopenharmony_ci msg_set_bits(m, 5, 4, 0x1f, n); 91162306a36Sopenharmony_ci} 91262306a36Sopenharmony_ci 91362306a36Sopenharmony_cistatic inline u32 msg_bearer_id(struct tipc_msg *m) 91462306a36Sopenharmony_ci{ 91562306a36Sopenharmony_ci return msg_bits(m, 5, 9, 0x7); 91662306a36Sopenharmony_ci} 91762306a36Sopenharmony_ci 91862306a36Sopenharmony_cistatic inline void msg_set_bearer_id(struct tipc_msg *m, u32 n) 91962306a36Sopenharmony_ci{ 92062306a36Sopenharmony_ci msg_set_bits(m, 5, 9, 0x7, n); 92162306a36Sopenharmony_ci} 92262306a36Sopenharmony_ci 92362306a36Sopenharmony_cistatic inline u32 msg_redundant_link(struct tipc_msg *m) 92462306a36Sopenharmony_ci{ 92562306a36Sopenharmony_ci return msg_bits(m, 5, 12, 0x1); 92662306a36Sopenharmony_ci} 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_cistatic inline void msg_set_redundant_link(struct tipc_msg *m, u32 r) 92962306a36Sopenharmony_ci{ 93062306a36Sopenharmony_ci msg_set_bits(m, 5, 12, 0x1, r); 93162306a36Sopenharmony_ci} 93262306a36Sopenharmony_ci 93362306a36Sopenharmony_cistatic inline u32 msg_peer_stopping(struct tipc_msg *m) 93462306a36Sopenharmony_ci{ 93562306a36Sopenharmony_ci return msg_bits(m, 5, 13, 0x1); 93662306a36Sopenharmony_ci} 93762306a36Sopenharmony_ci 93862306a36Sopenharmony_cistatic inline void msg_set_peer_stopping(struct tipc_msg *m, u32 s) 93962306a36Sopenharmony_ci{ 94062306a36Sopenharmony_ci msg_set_bits(m, 5, 13, 0x1, s); 94162306a36Sopenharmony_ci} 94262306a36Sopenharmony_ci 94362306a36Sopenharmony_cistatic inline bool msg_bc_ack_invalid(struct tipc_msg *m) 94462306a36Sopenharmony_ci{ 94562306a36Sopenharmony_ci switch (msg_user(m)) { 94662306a36Sopenharmony_ci case BCAST_PROTOCOL: 94762306a36Sopenharmony_ci case NAME_DISTRIBUTOR: 94862306a36Sopenharmony_ci case LINK_PROTOCOL: 94962306a36Sopenharmony_ci return msg_bits(m, 5, 14, 0x1); 95062306a36Sopenharmony_ci default: 95162306a36Sopenharmony_ci return false; 95262306a36Sopenharmony_ci } 95362306a36Sopenharmony_ci} 95462306a36Sopenharmony_ci 95562306a36Sopenharmony_cistatic inline void msg_set_bc_ack_invalid(struct tipc_msg *m, bool invalid) 95662306a36Sopenharmony_ci{ 95762306a36Sopenharmony_ci msg_set_bits(m, 5, 14, 0x1, invalid); 95862306a36Sopenharmony_ci} 95962306a36Sopenharmony_ci 96062306a36Sopenharmony_cistatic inline char *msg_media_addr(struct tipc_msg *m) 96162306a36Sopenharmony_ci{ 96262306a36Sopenharmony_ci return (char *)&m->hdr[TIPC_MEDIA_INFO_OFFSET]; 96362306a36Sopenharmony_ci} 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_cistatic inline u32 msg_bc_gap(struct tipc_msg *m) 96662306a36Sopenharmony_ci{ 96762306a36Sopenharmony_ci return msg_bits(m, 8, 0, 0x3ff); 96862306a36Sopenharmony_ci} 96962306a36Sopenharmony_ci 97062306a36Sopenharmony_cistatic inline void msg_set_bc_gap(struct tipc_msg *m, u32 n) 97162306a36Sopenharmony_ci{ 97262306a36Sopenharmony_ci msg_set_bits(m, 8, 0, 0x3ff, n); 97362306a36Sopenharmony_ci} 97462306a36Sopenharmony_ci 97562306a36Sopenharmony_ci/* 97662306a36Sopenharmony_ci * Word 9 97762306a36Sopenharmony_ci */ 97862306a36Sopenharmony_cistatic inline u16 msg_msgcnt(struct tipc_msg *m) 97962306a36Sopenharmony_ci{ 98062306a36Sopenharmony_ci return msg_bits(m, 9, 16, 0xffff); 98162306a36Sopenharmony_ci} 98262306a36Sopenharmony_ci 98362306a36Sopenharmony_cistatic inline void msg_set_msgcnt(struct tipc_msg *m, u16 n) 98462306a36Sopenharmony_ci{ 98562306a36Sopenharmony_ci msg_set_bits(m, 9, 16, 0xffff, n); 98662306a36Sopenharmony_ci} 98762306a36Sopenharmony_ci 98862306a36Sopenharmony_cistatic inline u16 msg_syncpt(struct tipc_msg *m) 98962306a36Sopenharmony_ci{ 99062306a36Sopenharmony_ci return msg_bits(m, 9, 16, 0xffff); 99162306a36Sopenharmony_ci} 99262306a36Sopenharmony_ci 99362306a36Sopenharmony_cistatic inline void msg_set_syncpt(struct tipc_msg *m, u16 n) 99462306a36Sopenharmony_ci{ 99562306a36Sopenharmony_ci msg_set_bits(m, 9, 16, 0xffff, n); 99662306a36Sopenharmony_ci} 99762306a36Sopenharmony_ci 99862306a36Sopenharmony_cistatic inline u32 msg_conn_ack(struct tipc_msg *m) 99962306a36Sopenharmony_ci{ 100062306a36Sopenharmony_ci return msg_bits(m, 9, 16, 0xffff); 100162306a36Sopenharmony_ci} 100262306a36Sopenharmony_ci 100362306a36Sopenharmony_cistatic inline void msg_set_conn_ack(struct tipc_msg *m, u32 n) 100462306a36Sopenharmony_ci{ 100562306a36Sopenharmony_ci msg_set_bits(m, 9, 16, 0xffff, n); 100662306a36Sopenharmony_ci} 100762306a36Sopenharmony_ci 100862306a36Sopenharmony_cistatic inline u16 msg_adv_win(struct tipc_msg *m) 100962306a36Sopenharmony_ci{ 101062306a36Sopenharmony_ci return msg_bits(m, 9, 0, 0xffff); 101162306a36Sopenharmony_ci} 101262306a36Sopenharmony_ci 101362306a36Sopenharmony_cistatic inline void msg_set_adv_win(struct tipc_msg *m, u16 n) 101462306a36Sopenharmony_ci{ 101562306a36Sopenharmony_ci msg_set_bits(m, 9, 0, 0xffff, n); 101662306a36Sopenharmony_ci} 101762306a36Sopenharmony_ci 101862306a36Sopenharmony_cistatic inline u32 msg_max_pkt(struct tipc_msg *m) 101962306a36Sopenharmony_ci{ 102062306a36Sopenharmony_ci return msg_bits(m, 9, 16, 0xffff) * 4; 102162306a36Sopenharmony_ci} 102262306a36Sopenharmony_ci 102362306a36Sopenharmony_cistatic inline void msg_set_max_pkt(struct tipc_msg *m, u32 n) 102462306a36Sopenharmony_ci{ 102562306a36Sopenharmony_ci msg_set_bits(m, 9, 16, 0xffff, (n / 4)); 102662306a36Sopenharmony_ci} 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_cistatic inline u32 msg_link_tolerance(struct tipc_msg *m) 102962306a36Sopenharmony_ci{ 103062306a36Sopenharmony_ci return msg_bits(m, 9, 0, 0xffff); 103162306a36Sopenharmony_ci} 103262306a36Sopenharmony_ci 103362306a36Sopenharmony_cistatic inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n) 103462306a36Sopenharmony_ci{ 103562306a36Sopenharmony_ci msg_set_bits(m, 9, 0, 0xffff, n); 103662306a36Sopenharmony_ci} 103762306a36Sopenharmony_ci 103862306a36Sopenharmony_cistatic inline u16 msg_grp_bc_syncpt(struct tipc_msg *m) 103962306a36Sopenharmony_ci{ 104062306a36Sopenharmony_ci return msg_bits(m, 9, 16, 0xffff); 104162306a36Sopenharmony_ci} 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_cistatic inline void msg_set_grp_bc_syncpt(struct tipc_msg *m, u16 n) 104462306a36Sopenharmony_ci{ 104562306a36Sopenharmony_ci msg_set_bits(m, 9, 16, 0xffff, n); 104662306a36Sopenharmony_ci} 104762306a36Sopenharmony_ci 104862306a36Sopenharmony_cistatic inline u16 msg_grp_bc_acked(struct tipc_msg *m) 104962306a36Sopenharmony_ci{ 105062306a36Sopenharmony_ci return msg_bits(m, 9, 16, 0xffff); 105162306a36Sopenharmony_ci} 105262306a36Sopenharmony_ci 105362306a36Sopenharmony_cistatic inline void msg_set_grp_bc_acked(struct tipc_msg *m, u16 n) 105462306a36Sopenharmony_ci{ 105562306a36Sopenharmony_ci msg_set_bits(m, 9, 16, 0xffff, n); 105662306a36Sopenharmony_ci} 105762306a36Sopenharmony_ci 105862306a36Sopenharmony_cistatic inline u16 msg_grp_remitted(struct tipc_msg *m) 105962306a36Sopenharmony_ci{ 106062306a36Sopenharmony_ci return msg_bits(m, 9, 16, 0xffff); 106162306a36Sopenharmony_ci} 106262306a36Sopenharmony_ci 106362306a36Sopenharmony_cistatic inline void msg_set_grp_remitted(struct tipc_msg *m, u16 n) 106462306a36Sopenharmony_ci{ 106562306a36Sopenharmony_ci msg_set_bits(m, 9, 16, 0xffff, n); 106662306a36Sopenharmony_ci} 106762306a36Sopenharmony_ci 106862306a36Sopenharmony_ci/* Word 10 106962306a36Sopenharmony_ci */ 107062306a36Sopenharmony_cistatic inline u16 msg_grp_evt(struct tipc_msg *m) 107162306a36Sopenharmony_ci{ 107262306a36Sopenharmony_ci return msg_bits(m, 10, 0, 0x3); 107362306a36Sopenharmony_ci} 107462306a36Sopenharmony_ci 107562306a36Sopenharmony_cistatic inline void msg_set_grp_evt(struct tipc_msg *m, int n) 107662306a36Sopenharmony_ci{ 107762306a36Sopenharmony_ci msg_set_bits(m, 10, 0, 0x3, n); 107862306a36Sopenharmony_ci} 107962306a36Sopenharmony_ci 108062306a36Sopenharmony_cistatic inline u16 msg_grp_bc_ack_req(struct tipc_msg *m) 108162306a36Sopenharmony_ci{ 108262306a36Sopenharmony_ci return msg_bits(m, 10, 0, 0x1); 108362306a36Sopenharmony_ci} 108462306a36Sopenharmony_ci 108562306a36Sopenharmony_cistatic inline void msg_set_grp_bc_ack_req(struct tipc_msg *m, bool n) 108662306a36Sopenharmony_ci{ 108762306a36Sopenharmony_ci msg_set_bits(m, 10, 0, 0x1, n); 108862306a36Sopenharmony_ci} 108962306a36Sopenharmony_ci 109062306a36Sopenharmony_cistatic inline u16 msg_grp_bc_seqno(struct tipc_msg *m) 109162306a36Sopenharmony_ci{ 109262306a36Sopenharmony_ci return msg_bits(m, 10, 16, 0xffff); 109362306a36Sopenharmony_ci} 109462306a36Sopenharmony_ci 109562306a36Sopenharmony_cistatic inline void msg_set_grp_bc_seqno(struct tipc_msg *m, u32 n) 109662306a36Sopenharmony_ci{ 109762306a36Sopenharmony_ci msg_set_bits(m, 10, 16, 0xffff, n); 109862306a36Sopenharmony_ci} 109962306a36Sopenharmony_ci 110062306a36Sopenharmony_cistatic inline bool msg_peer_link_is_up(struct tipc_msg *m) 110162306a36Sopenharmony_ci{ 110262306a36Sopenharmony_ci if (likely(msg_user(m) != LINK_PROTOCOL)) 110362306a36Sopenharmony_ci return true; 110462306a36Sopenharmony_ci if (msg_type(m) == STATE_MSG) 110562306a36Sopenharmony_ci return true; 110662306a36Sopenharmony_ci return false; 110762306a36Sopenharmony_ci} 110862306a36Sopenharmony_ci 110962306a36Sopenharmony_cistatic inline bool msg_peer_node_is_up(struct tipc_msg *m) 111062306a36Sopenharmony_ci{ 111162306a36Sopenharmony_ci if (msg_peer_link_is_up(m)) 111262306a36Sopenharmony_ci return true; 111362306a36Sopenharmony_ci return msg_redundant_link(m); 111462306a36Sopenharmony_ci} 111562306a36Sopenharmony_ci 111662306a36Sopenharmony_cistatic inline bool msg_is_reset(struct tipc_msg *hdr) 111762306a36Sopenharmony_ci{ 111862306a36Sopenharmony_ci return (msg_user(hdr) == LINK_PROTOCOL) && (msg_type(hdr) == RESET_MSG); 111962306a36Sopenharmony_ci} 112062306a36Sopenharmony_ci 112162306a36Sopenharmony_ci/* Word 13 112262306a36Sopenharmony_ci */ 112362306a36Sopenharmony_cistatic inline void msg_set_peer_net_hash(struct tipc_msg *m, u32 n) 112462306a36Sopenharmony_ci{ 112562306a36Sopenharmony_ci msg_set_word(m, 13, n); 112662306a36Sopenharmony_ci} 112762306a36Sopenharmony_ci 112862306a36Sopenharmony_cistatic inline u32 msg_peer_net_hash(struct tipc_msg *m) 112962306a36Sopenharmony_ci{ 113062306a36Sopenharmony_ci return msg_word(m, 13); 113162306a36Sopenharmony_ci} 113262306a36Sopenharmony_ci 113362306a36Sopenharmony_ci/* Word 14 113462306a36Sopenharmony_ci */ 113562306a36Sopenharmony_cistatic inline u32 msg_sugg_node_addr(struct tipc_msg *m) 113662306a36Sopenharmony_ci{ 113762306a36Sopenharmony_ci return msg_word(m, 14); 113862306a36Sopenharmony_ci} 113962306a36Sopenharmony_ci 114062306a36Sopenharmony_cistatic inline void msg_set_sugg_node_addr(struct tipc_msg *m, u32 n) 114162306a36Sopenharmony_ci{ 114262306a36Sopenharmony_ci msg_set_word(m, 14, n); 114362306a36Sopenharmony_ci} 114462306a36Sopenharmony_ci 114562306a36Sopenharmony_cistatic inline void msg_set_node_id(struct tipc_msg *hdr, u8 *id) 114662306a36Sopenharmony_ci{ 114762306a36Sopenharmony_ci memcpy(msg_data(hdr), id, 16); 114862306a36Sopenharmony_ci} 114962306a36Sopenharmony_ci 115062306a36Sopenharmony_cistatic inline u8 *msg_node_id(struct tipc_msg *hdr) 115162306a36Sopenharmony_ci{ 115262306a36Sopenharmony_ci return (u8 *)msg_data(hdr); 115362306a36Sopenharmony_ci} 115462306a36Sopenharmony_ci 115562306a36Sopenharmony_cistruct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp); 115662306a36Sopenharmony_cibool tipc_msg_validate(struct sk_buff **_skb); 115762306a36Sopenharmony_cibool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err); 115862306a36Sopenharmony_civoid tipc_skb_reject(struct net *net, int err, struct sk_buff *skb, 115962306a36Sopenharmony_ci struct sk_buff_head *xmitq); 116062306a36Sopenharmony_civoid tipc_msg_init(u32 own_addr, struct tipc_msg *m, u32 user, u32 type, 116162306a36Sopenharmony_ci u32 hsize, u32 destnode); 116262306a36Sopenharmony_cistruct sk_buff *tipc_msg_create(uint user, uint type, uint hdr_sz, 116362306a36Sopenharmony_ci uint data_sz, u32 dnode, u32 onode, 116462306a36Sopenharmony_ci u32 dport, u32 oport, int errcode); 116562306a36Sopenharmony_ciint tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf); 116662306a36Sopenharmony_cibool tipc_msg_try_bundle(struct sk_buff *tskb, struct sk_buff **skb, u32 mss, 116762306a36Sopenharmony_ci u32 dnode, bool *new_bundle); 116862306a36Sopenharmony_cibool tipc_msg_extract(struct sk_buff *skb, struct sk_buff **iskb, int *pos); 116962306a36Sopenharmony_ciint tipc_msg_fragment(struct sk_buff *skb, const struct tipc_msg *hdr, 117062306a36Sopenharmony_ci int pktmax, struct sk_buff_head *frags); 117162306a36Sopenharmony_ciint tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m, 117262306a36Sopenharmony_ci int offset, int dsz, int mtu, struct sk_buff_head *list); 117362306a36Sopenharmony_ciint tipc_msg_append(struct tipc_msg *hdr, struct msghdr *m, int dlen, 117462306a36Sopenharmony_ci int mss, struct sk_buff_head *txq); 117562306a36Sopenharmony_cibool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err); 117662306a36Sopenharmony_cibool tipc_msg_assemble(struct sk_buff_head *list); 117762306a36Sopenharmony_cibool tipc_msg_reassemble(struct sk_buff_head *list, struct sk_buff_head *rcvq); 117862306a36Sopenharmony_cibool tipc_msg_pskb_copy(u32 dst, struct sk_buff_head *msg, 117962306a36Sopenharmony_ci struct sk_buff_head *cpy); 118062306a36Sopenharmony_cibool __tipc_skb_queue_sorted(struct sk_buff_head *list, u16 seqno, 118162306a36Sopenharmony_ci struct sk_buff *skb); 118262306a36Sopenharmony_cibool tipc_msg_skb_clone(struct sk_buff_head *msg, struct sk_buff_head *cpy); 118362306a36Sopenharmony_ci 118462306a36Sopenharmony_cistatic inline u16 buf_seqno(struct sk_buff *skb) 118562306a36Sopenharmony_ci{ 118662306a36Sopenharmony_ci return msg_seqno(buf_msg(skb)); 118762306a36Sopenharmony_ci} 118862306a36Sopenharmony_ci 118962306a36Sopenharmony_cistatic inline int buf_roundup_len(struct sk_buff *skb) 119062306a36Sopenharmony_ci{ 119162306a36Sopenharmony_ci return (skb->len / 1024 + 1) * 1024; 119262306a36Sopenharmony_ci} 119362306a36Sopenharmony_ci 119462306a36Sopenharmony_ci/* tipc_skb_peek(): peek and reserve first buffer in list 119562306a36Sopenharmony_ci * @list: list to be peeked in 119662306a36Sopenharmony_ci * Returns pointer to first buffer in list, if any 119762306a36Sopenharmony_ci */ 119862306a36Sopenharmony_cistatic inline struct sk_buff *tipc_skb_peek(struct sk_buff_head *list, 119962306a36Sopenharmony_ci spinlock_t *lock) 120062306a36Sopenharmony_ci{ 120162306a36Sopenharmony_ci struct sk_buff *skb; 120262306a36Sopenharmony_ci 120362306a36Sopenharmony_ci spin_lock_bh(lock); 120462306a36Sopenharmony_ci skb = skb_peek(list); 120562306a36Sopenharmony_ci if (skb) 120662306a36Sopenharmony_ci skb_get(skb); 120762306a36Sopenharmony_ci spin_unlock_bh(lock); 120862306a36Sopenharmony_ci return skb; 120962306a36Sopenharmony_ci} 121062306a36Sopenharmony_ci 121162306a36Sopenharmony_ci/* tipc_skb_peek_port(): find a destination port, ignoring all destinations 121262306a36Sopenharmony_ci * up to and including 'filter'. 121362306a36Sopenharmony_ci * Note: ignoring previously tried destinations minimizes the risk of 121462306a36Sopenharmony_ci * contention on the socket lock 121562306a36Sopenharmony_ci * @list: list to be peeked in 121662306a36Sopenharmony_ci * @filter: last destination to be ignored from search 121762306a36Sopenharmony_ci * Returns a destination port number, of applicable. 121862306a36Sopenharmony_ci */ 121962306a36Sopenharmony_cistatic inline u32 tipc_skb_peek_port(struct sk_buff_head *list, u32 filter) 122062306a36Sopenharmony_ci{ 122162306a36Sopenharmony_ci struct sk_buff *skb; 122262306a36Sopenharmony_ci u32 dport = 0; 122362306a36Sopenharmony_ci bool ignore = true; 122462306a36Sopenharmony_ci 122562306a36Sopenharmony_ci spin_lock_bh(&list->lock); 122662306a36Sopenharmony_ci skb_queue_walk(list, skb) { 122762306a36Sopenharmony_ci dport = msg_destport(buf_msg(skb)); 122862306a36Sopenharmony_ci if (!filter || skb_queue_is_last(list, skb)) 122962306a36Sopenharmony_ci break; 123062306a36Sopenharmony_ci if (dport == filter) 123162306a36Sopenharmony_ci ignore = false; 123262306a36Sopenharmony_ci else if (!ignore) 123362306a36Sopenharmony_ci break; 123462306a36Sopenharmony_ci } 123562306a36Sopenharmony_ci spin_unlock_bh(&list->lock); 123662306a36Sopenharmony_ci return dport; 123762306a36Sopenharmony_ci} 123862306a36Sopenharmony_ci 123962306a36Sopenharmony_ci/* tipc_skb_dequeue(): unlink first buffer with dest 'dport' from list 124062306a36Sopenharmony_ci * @list: list to be unlinked from 124162306a36Sopenharmony_ci * @dport: selection criteria for buffer to unlink 124262306a36Sopenharmony_ci */ 124362306a36Sopenharmony_cistatic inline struct sk_buff *tipc_skb_dequeue(struct sk_buff_head *list, 124462306a36Sopenharmony_ci u32 dport) 124562306a36Sopenharmony_ci{ 124662306a36Sopenharmony_ci struct sk_buff *_skb, *tmp, *skb = NULL; 124762306a36Sopenharmony_ci 124862306a36Sopenharmony_ci spin_lock_bh(&list->lock); 124962306a36Sopenharmony_ci skb_queue_walk_safe(list, _skb, tmp) { 125062306a36Sopenharmony_ci if (msg_destport(buf_msg(_skb)) == dport) { 125162306a36Sopenharmony_ci __skb_unlink(_skb, list); 125262306a36Sopenharmony_ci skb = _skb; 125362306a36Sopenharmony_ci break; 125462306a36Sopenharmony_ci } 125562306a36Sopenharmony_ci } 125662306a36Sopenharmony_ci spin_unlock_bh(&list->lock); 125762306a36Sopenharmony_ci return skb; 125862306a36Sopenharmony_ci} 125962306a36Sopenharmony_ci 126062306a36Sopenharmony_ci/* tipc_skb_queue_splice_tail - append an skb list to lock protected list 126162306a36Sopenharmony_ci * @list: the new list to append. Not lock protected 126262306a36Sopenharmony_ci * @head: target list. Lock protected. 126362306a36Sopenharmony_ci */ 126462306a36Sopenharmony_cistatic inline void tipc_skb_queue_splice_tail(struct sk_buff_head *list, 126562306a36Sopenharmony_ci struct sk_buff_head *head) 126662306a36Sopenharmony_ci{ 126762306a36Sopenharmony_ci spin_lock_bh(&head->lock); 126862306a36Sopenharmony_ci skb_queue_splice_tail(list, head); 126962306a36Sopenharmony_ci spin_unlock_bh(&head->lock); 127062306a36Sopenharmony_ci} 127162306a36Sopenharmony_ci 127262306a36Sopenharmony_ci/* tipc_skb_queue_splice_tail_init - merge two lock protected skb lists 127362306a36Sopenharmony_ci * @list: the new list to add. Lock protected. Will be reinitialized 127462306a36Sopenharmony_ci * @head: target list. Lock protected. 127562306a36Sopenharmony_ci */ 127662306a36Sopenharmony_cistatic inline void tipc_skb_queue_splice_tail_init(struct sk_buff_head *list, 127762306a36Sopenharmony_ci struct sk_buff_head *head) 127862306a36Sopenharmony_ci{ 127962306a36Sopenharmony_ci struct sk_buff_head tmp; 128062306a36Sopenharmony_ci 128162306a36Sopenharmony_ci __skb_queue_head_init(&tmp); 128262306a36Sopenharmony_ci 128362306a36Sopenharmony_ci spin_lock_bh(&list->lock); 128462306a36Sopenharmony_ci skb_queue_splice_tail_init(list, &tmp); 128562306a36Sopenharmony_ci spin_unlock_bh(&list->lock); 128662306a36Sopenharmony_ci tipc_skb_queue_splice_tail(&tmp, head); 128762306a36Sopenharmony_ci} 128862306a36Sopenharmony_ci 128962306a36Sopenharmony_ci/* __tipc_skb_dequeue() - dequeue the head skb according to expected seqno 129062306a36Sopenharmony_ci * @list: list to be dequeued from 129162306a36Sopenharmony_ci * @seqno: seqno of the expected msg 129262306a36Sopenharmony_ci * 129362306a36Sopenharmony_ci * returns skb dequeued from the list if its seqno is less than or equal to 129462306a36Sopenharmony_ci * the expected one, otherwise the skb is still hold 129562306a36Sopenharmony_ci * 129662306a36Sopenharmony_ci * Note: must be used with appropriate locks held only 129762306a36Sopenharmony_ci */ 129862306a36Sopenharmony_cistatic inline struct sk_buff *__tipc_skb_dequeue(struct sk_buff_head *list, 129962306a36Sopenharmony_ci u16 seqno) 130062306a36Sopenharmony_ci{ 130162306a36Sopenharmony_ci struct sk_buff *skb = skb_peek(list); 130262306a36Sopenharmony_ci 130362306a36Sopenharmony_ci if (skb && less_eq(buf_seqno(skb), seqno)) { 130462306a36Sopenharmony_ci __skb_unlink(skb, list); 130562306a36Sopenharmony_ci return skb; 130662306a36Sopenharmony_ci } 130762306a36Sopenharmony_ci return NULL; 130862306a36Sopenharmony_ci} 130962306a36Sopenharmony_ci 131062306a36Sopenharmony_ci#endif 1311