📄 msg.h
字号:
/* * net/tipc/msg.h: Include file for TIPC message header routines * * Copyright (c) 2000-2007, Ericsson AB * Copyright (c) 2005-2007, 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 "core.h"#define TIPC_VERSION 2#define DATA_LOW TIPC_LOW_IMPORTANCE#define DATA_MEDIUM TIPC_MEDIUM_IMPORTANCE#define DATA_HIGH TIPC_HIGH_IMPORTANCE#define DATA_CRITICAL TIPC_CRITICAL_IMPORTANCE#define SHORT_H_SIZE 24 /* Connected,in cluster */#define DIR_MSG_H_SIZE 32 /* Directly addressed messages */#define CONN_MSG_H_SIZE 36 /* Routed connected msgs*/#define LONG_H_SIZE 40 /* Named Messages */#define MCAST_H_SIZE 44 /* Multicast messages */#define MAX_H_SIZE 60 /* Inclusive full options */#define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE)#define LINK_CONFIG 13/* TIPC user data message header format, version 2 - Fundamental definitions available to privileged TIPC users are located in tipc_msg.h. - Remaining definitions available to TIPC internal users appear below.*/static inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val){ m->hdr[w] = htonl(val);}static inline void msg_set_bits(struct tipc_msg *m, u32 w, u32 pos, u32 mask, u32 val){ val = (val & mask) << pos; m->hdr[w] &= ~htonl(mask << pos); m->hdr[w] |= htonl(val);}/* * Word 0 */static inline u32 msg_version(struct tipc_msg *m){ return msg_bits(m, 0, 29, 7);}static inline void msg_set_version(struct tipc_msg *m){ msg_set_bits(m, 0, 29, 0xf, TIPC_VERSION);}static inline u32 msg_user(struct tipc_msg *m){ return msg_bits(m, 0, 25, 0xf);}static inline u32 msg_isdata(struct tipc_msg *m){ return (msg_user(m) <= DATA_CRITICAL);}static inline void msg_set_user(struct tipc_msg *m, u32 n){ msg_set_bits(m, 0, 25, 0xf, n);}static inline void msg_set_importance(struct tipc_msg *m, u32 i){ msg_set_user(m, i);}static inline void msg_set_hdr_sz(struct tipc_msg *m,u32 n){ msg_set_bits(m, 0, 21, 0xf, n>>2);}static inline int msg_non_seq(struct tipc_msg *m){ return msg_bits(m, 0, 20, 1);}static inline void msg_set_non_seq(struct tipc_msg *m){ msg_set_bits(m, 0, 20, 1, 1);}static inline int msg_dest_droppable(struct tipc_msg *m){ return msg_bits(m, 0, 19, 1);}static inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d){ msg_set_bits(m, 0, 19, 1, d);}static inline int msg_src_droppable(struct tipc_msg *m){ return msg_bits(m, 0, 18, 1);}static inline void msg_set_src_droppable(struct tipc_msg *m, u32 d){ msg_set_bits(m, 0, 18, 1, d);}static inline void msg_set_size(struct tipc_msg *m, u32 sz){ m->hdr[0] = htonl((msg_word(m, 0) & ~0x1ffff) | sz);}/* * Word 1 */static inline void msg_set_type(struct tipc_msg *m, u32 n){ msg_set_bits(m, 1, 29, 0x7, n);}static inline void msg_set_errcode(struct tipc_msg *m, u32 err){ msg_set_bits(m, 1, 25, 0xf, err);}static inline u32 msg_reroute_cnt(struct tipc_msg *m){ return msg_bits(m, 1, 21, 0xf);}static inline void msg_incr_reroute_cnt(struct tipc_msg *m){ msg_set_bits(m, 1, 21, 0xf, msg_reroute_cnt(m) + 1);}static inline void msg_reset_reroute_cnt(struct tipc_msg *m){ msg_set_bits(m, 1, 21, 0xf, 0);}static inline u32 msg_lookup_scope(struct tipc_msg *m){ return msg_bits(m, 1, 19, 0x3);}static inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n){ msg_set_bits(m, 1, 19, 0x3, n);}static inline void msg_set_options(struct tipc_msg *m, const char *opt, u32 sz){ u32 hsz = msg_hdr_sz(m); char *to = (char *)&m->hdr[hsz/4]; if ((hsz < DIR_MSG_H_SIZE) || ((hsz + sz) > MAX_H_SIZE)) return; msg_set_bits(m, 1, 16, 0x7, (hsz - 28)/4); msg_set_hdr_sz(m, hsz + sz); memcpy(to, opt, sz);}static inline u32 msg_bcast_ack(struct tipc_msg *m){ return msg_bits(m, 1, 0, 0xffff);}static inline void msg_set_bcast_ack(struct tipc_msg *m, u32 n){ msg_set_bits(m, 1, 0, 0xffff, n);}/* * Word 2 */static inline u32 msg_ack(struct tipc_msg *m){ return msg_bits(m, 2, 16, 0xffff);}static inline void msg_set_ack(struct tipc_msg *m, u32 n){ msg_set_bits(m, 2, 16, 0xffff, n);}static inline u32 msg_seqno(struct tipc_msg *m){ return msg_bits(m, 2, 0, 0xffff);}static inline void msg_set_seqno(struct tipc_msg *m, u32 n){ msg_set_bits(m, 2, 0, 0xffff, n);}/* * Words 3-10 */static inline void msg_set_prevnode(struct tipc_msg *m, u32 a){ msg_set_word(m, 3, a);}static inline void msg_set_origport(struct tipc_msg *m, u32 p){ msg_set_word(m, 4, p);}static inline void msg_set_destport(struct tipc_msg *m, u32 p){ msg_set_word(m, 5, p);}static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p){ msg_set_word(m, 5, p);}static inline void msg_set_orignode(struct tipc_msg *m, u32 a){ msg_set_word(m, 6, a);}static inline void msg_set_destnode(struct tipc_msg *m, u32 a){ msg_set_word(m, 7, a);}static inline int msg_is_dest(struct tipc_msg *m, u32 d){ return(msg_short(m) || (msg_destnode(m) == d));}static inline u32 msg_routed(struct tipc_msg *m){ if (likely(msg_short(m))) return 0; return(msg_destnode(m) ^ msg_orignode(m)) >> 11;}static inline void msg_set_nametype(struct tipc_msg *m, u32 n){ msg_set_word(m, 8, n);}static inline u32 msg_transp_seqno(struct tipc_msg *m){ return msg_word(m, 8);}static inline void msg_set_timestamp(struct tipc_msg *m, u32 n){ msg_set_word(m, 8, n);}static inline u32 msg_timestamp(struct tipc_msg *m){ return msg_word(m, 8);}static inline void msg_set_transp_seqno(struct tipc_msg *m, u32 n){ msg_set_word(m, 8, n);}static inline void msg_set_namelower(struct tipc_msg *m, u32 n){ msg_set_word(m, 9, n);}static inline void msg_set_nameinst(struct tipc_msg *m, u32 n){ msg_set_namelower(m, n);}static inline void msg_set_nameupper(struct tipc_msg *m, u32 n){ msg_set_word(m, 10, n);}static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m){ return (struct tipc_msg *)msg_data(m);}static inline void msg_expand(struct tipc_msg *m, u32 destnode){ if (!msg_short(m)) return; msg_set_hdr_sz(m, LONG_H_SIZE); msg_set_orignode(m, msg_prevnode(m)); msg_set_destnode(m, destnode); memset(&m->hdr[8], 0, 12);}/* TIPC internal message header format, version 2 1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ w0:|vers |msg usr|hdr sz |n|resrv| packet size | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ w1:|m typ|rsv=0| sequence gap | broadcast ack no | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ w2:| link level ack no/bc_gap_from | seq no / bcast_gap_to | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ w3:| previous node | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ w4:| next sent broadcast/fragm no | next sent pkt/ fragm msg no | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ w5:| session no |rsv=0|r|berid|link prio|netpl|p| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ w6:| originating node | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ w7:| destination node | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ w8:| transport sequence number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ w9:| msg count / bcast tag | link tolerance | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / User Specific Data / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ NB: CONN_MANAGER use data message format. LINK_CONFIG has own format.*//* * Internal users */#define BCAST_PROTOCOL 5#define MSG_BUNDLER 6#define LINK_PROTOCOL 7#define CONN_MANAGER 8#define ROUTE_DISTRIBUTOR 9#define CHANGEOVER_PROTOCOL 10#define NAME_DISTRIBUTOR 11#define MSG_FRAGMENTER 12#define LINK_CONFIG 13#define INT_H_SIZE 40#define DSC_H_SIZE 40/* * Connection management protocol messages */#define CONN_PROBE 0#define CONN_PROBE_REPLY 1#define CONN_ACK 2/* * Name distributor messages */#define PUBLICATION 0#define WITHDRAWAL 1/* * Word 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -