linux/net/tipc/msg.h

/*
 * net/tipc/msg.h: Include file for TIPC message header routines
 *
 * Copyright (c) 2000-2007, 2014-2017 Ericsson AB
 * Copyright (c) 2005-2008, 2010-2011, Wind River Systems
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the names of the copyright holders nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _TIPC_MSG_H
#define _TIPC_MSG_H

#include <linux/tipc.h>
#include "core.h"

/*
 * Constants and routines used to read and write TIPC payload message headers
 *
 * Note: Some items are also used with TIPC internal message headers
 */
#define TIPC_VERSION
struct plist;

/*
 * Payload message users are defined in TIPC's public API:
 * - TIPC_LOW_IMPORTANCE
 * - TIPC_MEDIUM_IMPORTANCE
 * - TIPC_HIGH_IMPORTANCE
 * - TIPC_CRITICAL_IMPORTANCE
 */
#define TIPC_SYSTEM_IMPORTANCE


/*
 * Payload message types
 */
#define TIPC_CONN_MSG
#define TIPC_MCAST_MSG
#define TIPC_NAMED_MSG
#define TIPC_DIRECT_MSG
#define TIPC_GRP_MEMBER_EVT
#define TIPC_GRP_BCAST_MSG
#define TIPC_GRP_MCAST_MSG
#define TIPC_GRP_UCAST_MSG

/*
 * Internal message users
 */
#define BCAST_PROTOCOL
#define MSG_BUNDLER
#define LINK_PROTOCOL
#define CONN_MANAGER
#define GROUP_PROTOCOL
#define TUNNEL_PROTOCOL
#define NAME_DISTRIBUTOR
#define MSG_FRAGMENTER
#define LINK_CONFIG
#define MSG_CRYPTO
#define SOCK_WAKEUP
#define TOP_SRV

/*
 * Message header sizes
 */
#define SHORT_H_SIZE
#define BASIC_H_SIZE
#define NAMED_H_SIZE
#define MCAST_H_SIZE
#define GROUP_H_SIZE
#define INT_H_SIZE
#define MIN_H_SIZE
#define MAX_H_SIZE

#define MAX_MSG_SIZE
#define TIPC_MEDIA_INFO_OFFSET

extern const int one_page_mtu;

struct tipc_skb_cb {} __packed;

#define TIPC_SKB_CB(__skb)

struct tipc_msg {};

/* struct tipc_gap_ack - TIPC Gap ACK block
 * @ack: seqno of the last consecutive packet in link deferdq
 * @gap: number of gap packets since the last ack
 *
 * E.g:
 *       link deferdq: 1 2 3 4      10 11      13 14 15       20
 * --> Gap ACK blocks:      <4, 5>,   <11, 1>,      <15, 4>, <20, 0>
 */
struct tipc_gap_ack {};

/* struct tipc_gap_ack_blks
 * @len: actual length of the record
 * @ugack_cnt: number of Gap ACK blocks for unicast (following the broadcast
 *             ones)
 * @start_index: starting index for "valid" broadcast Gap ACK blocks
 * @bgack_cnt: number of Gap ACK blocks for broadcast in the record
 * @gacks: array of Gap ACK blocks
 *
 *  31                       16 15                        0
 * +-------------+-------------+-------------+-------------+
 * |  bgack_cnt  |  ugack_cnt  |            len            |
 * +-------------+-------------+-------------+-------------+  -
 * |            gap            |            ack            |   |
 * +-------------+-------------+-------------+-------------+    > bc gacks
 * :                           :                           :   |
 * +-------------+-------------+-------------+-------------+  -
 * |            gap            |            ack            |   |
 * +-------------+-------------+-------------+-------------+    > uc gacks
 * :                           :                           :   |
 * +-------------+-------------+-------------+-------------+  -
 */
struct tipc_gap_ack_blks {};

#define MAX_GAP_ACK_BLKS
#define MAX_GAP_ACK_BLKS_SZ

static inline struct tipc_msg *buf_msg(struct sk_buff *skb)
{}

static inline u32 msg_word(struct tipc_msg *m, u32 pos)
{}

static inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val)
{}

static inline u32 msg_bits(struct tipc_msg *m, u32 w, u32 pos, u32 mask)
{}

static inline void msg_set_bits(struct tipc_msg *m, u32 w,
				u32 pos, u32 mask, u32 val)
{}

/*
 * Word 0
 */
static inline u32 msg_version(struct tipc_msg *m)
{}

static inline void msg_set_version(struct tipc_msg *m)
{}

static inline u32 msg_user(struct tipc_msg *m)
{}

static inline u32 msg_isdata(struct tipc_msg *m)
{}

static inline void msg_set_user(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_hdr_sz(struct tipc_msg *m)
{}

static inline void msg_set_hdr_sz(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_size(struct tipc_msg *m)
{}

static inline u32 msg_blocks(struct tipc_msg *m)
{}

static inline u32 msg_data_sz(struct tipc_msg *m)
{}

static inline int msg_non_seq(struct tipc_msg *m)
{}

static inline void msg_set_non_seq(struct tipc_msg *m, u32 n)
{}

static inline int msg_is_syn(struct tipc_msg *m)
{}

static inline void msg_set_syn(struct tipc_msg *m, u32 d)
{}

static inline int msg_dest_droppable(struct tipc_msg *m)
{}

static inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d)
{}

static inline int msg_is_keepalive(struct tipc_msg *m)
{}

static inline void msg_set_is_keepalive(struct tipc_msg *m, u32 d)
{}

static inline int msg_src_droppable(struct tipc_msg *m)
{}

static inline void msg_set_src_droppable(struct tipc_msg *m, u32 d)
{}

static inline int msg_ack_required(struct tipc_msg *m)
{}

static inline void msg_set_ack_required(struct tipc_msg *m)
{}

static inline int msg_nagle_ack(struct tipc_msg *m)
{}

static inline void msg_set_nagle_ack(struct tipc_msg *m)
{}

static inline bool msg_is_rcast(struct tipc_msg *m)
{}

static inline void msg_set_is_rcast(struct tipc_msg *m, bool d)
{}

static inline void msg_set_size(struct tipc_msg *m, u32 sz)
{}

static inline unchar *msg_data(struct tipc_msg *m)
{}

static inline struct tipc_msg *msg_inner_hdr(struct tipc_msg *m)
{}

/*
 * Word 1
 */
static inline u32 msg_type(struct tipc_msg *m)
{}

static inline void msg_set_type(struct tipc_msg *m, u32 n)
{}

static inline int msg_in_group(struct tipc_msg *m)
{}

static inline bool msg_is_grp_evt(struct tipc_msg *m)
{}

static inline u32 msg_named(struct tipc_msg *m)
{}

static inline u32 msg_mcast(struct tipc_msg *m)
{}

static inline u32 msg_connected(struct tipc_msg *m)
{}

static inline u32 msg_direct(struct tipc_msg *m)
{}

static inline u32 msg_errcode(struct tipc_msg *m)
{}

static inline void msg_set_errcode(struct tipc_msg *m, u32 err)
{}

static inline void msg_set_bulk(struct tipc_msg *m)
{}

static inline u32 msg_is_bulk(struct tipc_msg *m)
{}

static inline void msg_set_last_bulk(struct tipc_msg *m)
{}

static inline u32 msg_is_last_bulk(struct tipc_msg *m)
{}

static inline void msg_set_non_legacy(struct tipc_msg *m)
{}

static inline u32 msg_is_legacy(struct tipc_msg *m)
{}

static inline u32 msg_reroute_cnt(struct tipc_msg *m)
{}

static inline void msg_incr_reroute_cnt(struct tipc_msg *m)
{}

static inline u32 msg_lookup_scope(struct tipc_msg *m)
{}

static inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n)
{}

static inline u16 msg_bcast_ack(struct tipc_msg *m)
{}

static inline void msg_set_bcast_ack(struct tipc_msg *m, u16 n)
{}

/* Note: reusing bits in word 1 for ACTIVATE_MSG only, to re-synch
 * link peer session number
 */
static inline bool msg_dest_session_valid(struct tipc_msg *m)
{}

static inline void msg_set_dest_session_valid(struct tipc_msg *m, bool valid)
{}

static inline u16 msg_dest_session(struct tipc_msg *m)
{}

static inline void msg_set_dest_session(struct tipc_msg *m, u16 n)
{}

/*
 * Word 2
 */
static inline u16 msg_ack(struct tipc_msg *m)
{}

static inline void msg_set_ack(struct tipc_msg *m, u16 n)
{}

static inline u16 msg_seqno(struct tipc_msg *m)
{}

static inline void msg_set_seqno(struct tipc_msg *m, u16 n)
{}

/*
 * Words 3-10
 */
static inline u32 msg_importance(struct tipc_msg *m)
{}

static inline void msg_set_importance(struct tipc_msg *m, u32 i)
{}

static inline u32 msg_prevnode(struct tipc_msg *m)
{}

static inline void msg_set_prevnode(struct tipc_msg *m, u32 a)
{}

static inline u32 msg_origport(struct tipc_msg *m)
{}

static inline void msg_set_origport(struct tipc_msg *m, u32 p)
{}

static inline u16 msg_named_seqno(struct tipc_msg *m)
{}

static inline void msg_set_named_seqno(struct tipc_msg *m, u16 n)
{}

static inline u32 msg_destport(struct tipc_msg *m)
{}

static inline void msg_set_destport(struct tipc_msg *m, u32 p)
{}

static inline u32 msg_mc_netid(struct tipc_msg *m)
{}

static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)
{}

static inline int msg_short(struct tipc_msg *m)
{}

static inline u32 msg_orignode(struct tipc_msg *m)
{}

static inline void msg_set_orignode(struct tipc_msg *m, u32 a)
{}

static inline u32 msg_destnode(struct tipc_msg *m)
{}

static inline void msg_set_destnode(struct tipc_msg *m, u32 a)
{}

static inline u32 msg_nametype(struct tipc_msg *m)
{}

static inline void msg_set_nametype(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_nameinst(struct tipc_msg *m)
{}

static inline u32 msg_namelower(struct tipc_msg *m)
{}

static inline void msg_set_namelower(struct tipc_msg *m, u32 n)
{}

static inline void msg_set_nameinst(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_nameupper(struct tipc_msg *m)
{}

static inline void msg_set_nameupper(struct tipc_msg *m, u32 n)
{}

/*
 * Constants and routines used to read and write TIPC internal message headers
 */

/*
 *  Connection management protocol message types
 */
#define CONN_PROBE
#define CONN_PROBE_REPLY
#define CONN_ACK

/*
 * Name distributor message types
 */
#define PUBLICATION
#define WITHDRAWAL

/*
 * Segmentation message types
 */
#define FIRST_FRAGMENT
#define FRAGMENT
#define LAST_FRAGMENT

/*
 * Link management protocol message types
 */
#define STATE_MSG
#define RESET_MSG
#define ACTIVATE_MSG

/*
 * Changeover tunnel message types
 */
#define SYNCH_MSG
#define FAILOVER_MSG

/*
 * Config protocol message types
 */
#define DSC_REQ_MSG
#define DSC_RESP_MSG
#define DSC_TRIAL_MSG
#define DSC_TRIAL_FAIL_MSG

/*
 * Group protocol message types
 */
#define GRP_JOIN_MSG
#define GRP_LEAVE_MSG
#define GRP_ADV_MSG
#define GRP_ACK_MSG
#define GRP_RECLAIM_MSG
#define GRP_REMIT_MSG

/* Crypto message types */
#define KEY_DISTR_MSG

/*
 * Word 1
 */
static inline u32 msg_seq_gap(struct tipc_msg *m)
{}

static inline void msg_set_seq_gap(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_node_sig(struct tipc_msg *m)
{}

static inline void msg_set_node_sig(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_node_capabilities(struct tipc_msg *m)
{}

static inline void msg_set_node_capabilities(struct tipc_msg *m, u32 n)
{}

/*
 * Word 2
 */
static inline u32 msg_dest_domain(struct tipc_msg *m)
{}

static inline void msg_set_dest_domain(struct tipc_msg *m, u32 n)
{}

static inline void msg_set_bcgap_after(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_bcgap_to(struct tipc_msg *m)
{}

static inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n)
{}

/*
 * Word 4
 */
static inline u32 msg_last_bcast(struct tipc_msg *m)
{}

static inline u32 msg_bc_snd_nxt(struct tipc_msg *m)
{}

static inline void msg_set_last_bcast(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_nof_fragms(struct tipc_msg *m)
{}

static inline void msg_set_nof_fragms(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_fragm_no(struct tipc_msg *m)
{}

static inline void msg_set_fragm_no(struct tipc_msg *m, u32 n)
{}

static inline u16 msg_next_sent(struct tipc_msg *m)
{}

static inline void msg_set_next_sent(struct tipc_msg *m, u16 n)
{}

static inline u32 msg_bc_netid(struct tipc_msg *m)
{}

static inline void msg_set_bc_netid(struct tipc_msg *m, u32 id)
{}

static inline u32 msg_link_selector(struct tipc_msg *m)
{}

/*
 * Word 5
 */
static inline u16 msg_session(struct tipc_msg *m)
{}

static inline void msg_set_session(struct tipc_msg *m, u16 n)
{}

static inline u32 msg_probe(struct tipc_msg *m)
{}

static inline void msg_set_probe(struct tipc_msg *m, u32 val)
{}

static inline char msg_net_plane(struct tipc_msg *m)
{}

static inline void msg_set_net_plane(struct tipc_msg *m, char n)
{}

static inline u32 msg_linkprio(struct tipc_msg *m)
{}

static inline void msg_set_linkprio(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_bearer_id(struct tipc_msg *m)
{}

static inline void msg_set_bearer_id(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_redundant_link(struct tipc_msg *m)
{}

static inline void msg_set_redundant_link(struct tipc_msg *m, u32 r)
{}

static inline u32 msg_peer_stopping(struct tipc_msg *m)
{}

static inline void msg_set_peer_stopping(struct tipc_msg *m, u32 s)
{}

static inline bool msg_bc_ack_invalid(struct tipc_msg *m)
{}

static inline void msg_set_bc_ack_invalid(struct tipc_msg *m, bool invalid)
{}

static inline char *msg_media_addr(struct tipc_msg *m)
{}

static inline u32 msg_bc_gap(struct tipc_msg *m)
{}

static inline void msg_set_bc_gap(struct tipc_msg *m, u32 n)
{}

/*
 * Word 9
 */
static inline u16 msg_msgcnt(struct tipc_msg *m)
{}

static inline void msg_set_msgcnt(struct tipc_msg *m, u16 n)
{}

static inline u16 msg_syncpt(struct tipc_msg *m)
{}

static inline void msg_set_syncpt(struct tipc_msg *m, u16 n)
{}

static inline u32 msg_conn_ack(struct tipc_msg *m)
{}

static inline void msg_set_conn_ack(struct tipc_msg *m, u32 n)
{}

static inline u16 msg_adv_win(struct tipc_msg *m)
{}

static inline void msg_set_adv_win(struct tipc_msg *m, u16 n)
{}

static inline u32 msg_max_pkt(struct tipc_msg *m)
{}

static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_link_tolerance(struct tipc_msg *m)
{}

static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n)
{}

static inline u16 msg_grp_bc_syncpt(struct tipc_msg *m)
{}

static inline void msg_set_grp_bc_syncpt(struct tipc_msg *m, u16 n)
{}

static inline u16 msg_grp_bc_acked(struct tipc_msg *m)
{}

static inline void msg_set_grp_bc_acked(struct tipc_msg *m, u16 n)
{}

static inline u16 msg_grp_remitted(struct tipc_msg *m)
{}

static inline void msg_set_grp_remitted(struct tipc_msg *m, u16 n)
{}

/* Word 10
 */
static inline u16 msg_grp_evt(struct tipc_msg *m)
{}

static inline void msg_set_grp_evt(struct tipc_msg *m, int n)
{}

static inline u16 msg_grp_bc_ack_req(struct tipc_msg *m)
{}

static inline void msg_set_grp_bc_ack_req(struct tipc_msg *m, bool n)
{}

static inline u16 msg_grp_bc_seqno(struct tipc_msg *m)
{}

static inline void msg_set_grp_bc_seqno(struct tipc_msg *m, u32 n)
{}

static inline bool msg_peer_link_is_up(struct tipc_msg *m)
{}

static inline bool msg_peer_node_is_up(struct tipc_msg *m)
{}

static inline bool msg_is_reset(struct tipc_msg *hdr)
{}

/* Word 13
 */
static inline void msg_set_peer_net_hash(struct tipc_msg *m, u32 n)
{}

static inline u32 msg_peer_net_hash(struct tipc_msg *m)
{}

/* Word 14
 */
static inline u32 msg_sugg_node_addr(struct tipc_msg *m)
{}

static inline void msg_set_sugg_node_addr(struct tipc_msg *m, u32 n)
{}

static inline void msg_set_node_id(struct tipc_msg *hdr, u8 *id)
{}

static inline u8 *msg_node_id(struct tipc_msg *hdr)
{}

struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp);
bool tipc_msg_validate(struct sk_buff **_skb);
bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err);
void tipc_skb_reject(struct net *net, int err, struct sk_buff *skb,
		     struct sk_buff_head *xmitq);
void tipc_msg_init(u32 own_addr, struct tipc_msg *m, u32 user, u32 type,
		   u32 hsize, u32 destnode);
struct sk_buff *tipc_msg_create(uint user, uint type, uint hdr_sz,
				uint data_sz, u32 dnode, u32 onode,
				u32 dport, u32 oport, int errcode);
int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf);
bool tipc_msg_try_bundle(struct sk_buff *tskb, struct sk_buff **skb, u32 mss,
			 u32 dnode, bool *new_bundle);
bool tipc_msg_extract(struct sk_buff *skb, struct sk_buff **iskb, int *pos);
int tipc_msg_fragment(struct sk_buff *skb, const struct tipc_msg *hdr,
		      int pktmax, struct sk_buff_head *frags);
int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m,
		   int offset, int dsz, int mtu, struct sk_buff_head *list);
int tipc_msg_append(struct tipc_msg *hdr, struct msghdr *m, int dlen,
		    int mss, struct sk_buff_head *txq);
bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err);
bool tipc_msg_assemble(struct sk_buff_head *list);
bool tipc_msg_reassemble(struct sk_buff_head *list, struct sk_buff_head *rcvq);
bool tipc_msg_pskb_copy(u32 dst, struct sk_buff_head *msg,
			struct sk_buff_head *cpy);
bool __tipc_skb_queue_sorted(struct sk_buff_head *list, u16 seqno,
			     struct sk_buff *skb);
bool tipc_msg_skb_clone(struct sk_buff_head *msg, struct sk_buff_head *cpy);

static inline u16 buf_seqno(struct sk_buff *skb)
{}

static inline int buf_roundup_len(struct sk_buff *skb)
{}

/* tipc_skb_peek(): peek and reserve first buffer in list
 * @list: list to be peeked in
 * Returns pointer to first buffer in list, if any
 */
static inline struct sk_buff *tipc_skb_peek(struct sk_buff_head *list,
					    spinlock_t *lock)
{}

/* tipc_skb_peek_port(): find a destination port, ignoring all destinations
 *                       up to and including 'filter'.
 * Note: ignoring previously tried destinations minimizes the risk of
 *       contention on the socket lock
 * @list: list to be peeked in
 * @filter: last destination to be ignored from search
 * Returns a destination port number, of applicable.
 */
static inline u32 tipc_skb_peek_port(struct sk_buff_head *list, u32 filter)
{}

/* tipc_skb_dequeue(): unlink first buffer with dest 'dport' from list
 * @list: list to be unlinked from
 * @dport: selection criteria for buffer to unlink
 */
static inline struct sk_buff *tipc_skb_dequeue(struct sk_buff_head *list,
					       u32 dport)
{}

/* tipc_skb_queue_splice_tail - append an skb list to lock protected list
 * @list: the new list to append. Not lock protected
 * @head: target list. Lock protected.
 */
static inline void tipc_skb_queue_splice_tail(struct sk_buff_head *list,
					      struct sk_buff_head *head)
{}

/* tipc_skb_queue_splice_tail_init - merge two lock protected skb lists
 * @list: the new list to add. Lock protected. Will be reinitialized
 * @head: target list. Lock protected.
 */
static inline void tipc_skb_queue_splice_tail_init(struct sk_buff_head *list,
						   struct sk_buff_head *head)
{}

/* __tipc_skb_dequeue() - dequeue the head skb according to expected seqno
 * @list: list to be dequeued from
 * @seqno: seqno of the expected msg
 *
 * returns skb dequeued from the list if its seqno is less than or equal to
 * the expected one, otherwise the skb is still hold
 *
 * Note: must be used with appropriate locks held only
 */
static inline struct sk_buff *__tipc_skb_dequeue(struct sk_buff_head *list,
						 u16 seqno)
{}

#endif