|
@@ -37,10 +37,51 @@
|
|
|
#ifndef _TIPC_MSG_H
|
|
|
#define _TIPC_MSG_H
|
|
|
|
|
|
-#include "core.h"
|
|
|
+#include "bearer.h"
|
|
|
|
|
|
#define TIPC_VERSION 2
|
|
|
|
|
|
+/*
|
|
|
+ * TIPC user data 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 | user |hdr sz |n|d|s|-| message size |
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ * w1:|mstyp| error |rer cnt|lsc|opt p| broadcast ack no |
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ * w2:| link level ack no | broadcast/link level seq no |
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ * w3:| previous node |
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ * w4:| originating port |
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ * w5:| destination port |
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ * w6:| originating node |
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ * w7:| destination node |
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ * w8:| name type / transport sequence number |
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ * w9:| name instance/multicast lower bound |
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ * wA:| multicast upper bound |
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ * / /
|
|
|
+ * \ options \
|
|
|
+ * / /
|
|
|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
+ *
|
|
|
+ */
|
|
|
+
|
|
|
+#define TIPC_CONN_MSG 0
|
|
|
+#define TIPC_MCAST_MSG 1
|
|
|
+#define TIPC_NAMED_MSG 2
|
|
|
+#define TIPC_DIRECT_MSG 3
|
|
|
+
|
|
|
+
|
|
|
#define SHORT_H_SIZE 24 /* Connected, in-cluster messages */
|
|
|
#define DIR_MSG_H_SIZE 32 /* Directly addressed messages */
|
|
|
#define LONG_H_SIZE 40 /* Named messages */
|
|
@@ -52,20 +93,26 @@
|
|
|
#define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE)
|
|
|
|
|
|
|
|
|
-/*
|
|
|
- TIPC user data message header format, version 2
|
|
|
+struct tipc_msg {
|
|
|
+ __be32 hdr[15];
|
|
|
+};
|
|
|
|
|
|
- - Fundamental definitions available to privileged TIPC users
|
|
|
- are located in tipc_msg.h.
|
|
|
- - Remaining definitions available to TIPC internal users appear below.
|
|
|
-*/
|
|
|
|
|
|
+static inline u32 msg_word(struct tipc_msg *m, u32 pos)
|
|
|
+{
|
|
|
+ return ntohl(m->hdr[pos]);
|
|
|
+}
|
|
|
|
|
|
static inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val)
|
|
|
{
|
|
|
m->hdr[w] = htonl(val);
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_bits(struct tipc_msg *m, u32 w, u32 pos, u32 mask)
|
|
|
+{
|
|
|
+ return (msg_word(m, w) >> pos) & mask;
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_bits(struct tipc_msg *m, u32 w,
|
|
|
u32 pos, u32 mask, u32 val)
|
|
|
{
|
|
@@ -112,16 +159,36 @@ static inline void msg_set_user(struct tipc_msg *m, u32 n)
|
|
|
msg_set_bits(m, 0, 25, 0xf, n);
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_importance(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_bits(m, 0, 25, 0xf);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_importance(struct tipc_msg *m, u32 i)
|
|
|
{
|
|
|
msg_set_user(m, i);
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_hdr_sz(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_bits(m, 0, 21, 0xf) << 2;
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_hdr_sz(struct tipc_msg *m,u32 n)
|
|
|
{
|
|
|
msg_set_bits(m, 0, 21, 0xf, n>>2);
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_size(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_bits(m, 0, 0, 0x1ffff);
|
|
|
+}
|
|
|
+
|
|
|
+static inline u32 msg_data_sz(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_size(m) - msg_hdr_sz(m);
|
|
|
+}
|
|
|
+
|
|
|
static inline int msg_non_seq(struct tipc_msg *m)
|
|
|
{
|
|
|
return msg_bits(m, 0, 20, 1);
|
|
@@ -162,11 +229,36 @@ static inline void msg_set_size(struct tipc_msg *m, u32 sz)
|
|
|
* Word 1
|
|
|
*/
|
|
|
|
|
|
+static inline u32 msg_type(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_bits(m, 1, 29, 0x7);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_type(struct tipc_msg *m, u32 n)
|
|
|
{
|
|
|
msg_set_bits(m, 1, 29, 0x7, n);
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_named(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_type(m) == TIPC_NAMED_MSG;
|
|
|
+}
|
|
|
+
|
|
|
+static inline u32 msg_mcast(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_type(m) == TIPC_MCAST_MSG;
|
|
|
+}
|
|
|
+
|
|
|
+static inline u32 msg_connected(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_type(m) == TIPC_CONN_MSG;
|
|
|
+}
|
|
|
+
|
|
|
+static inline u32 msg_errcode(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_bits(m, 1, 25, 0xf);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_errcode(struct tipc_msg *m, u32 err)
|
|
|
{
|
|
|
msg_set_bits(m, 1, 25, 0xf, err);
|
|
@@ -257,31 +349,68 @@ static inline void msg_set_destnode_cache(struct tipc_msg *m, u32 dnode)
|
|
|
*/
|
|
|
|
|
|
|
|
|
+static inline u32 msg_prevnode(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_word(m, 3);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_prevnode(struct tipc_msg *m, u32 a)
|
|
|
{
|
|
|
msg_set_word(m, 3, a);
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_origport(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_word(m, 4);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_origport(struct tipc_msg *m, u32 p)
|
|
|
{
|
|
|
msg_set_word(m, 4, p);
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_destport(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_word(m, 5);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_destport(struct tipc_msg *m, u32 p)
|
|
|
{
|
|
|
msg_set_word(m, 5, p);
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_mc_netid(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_word(m, 5);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)
|
|
|
{
|
|
|
msg_set_word(m, 5, p);
|
|
|
}
|
|
|
|
|
|
+static inline int msg_short(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_hdr_sz(m) == 24;
|
|
|
+}
|
|
|
+
|
|
|
+static inline u32 msg_orignode(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ if (likely(msg_short(m)))
|
|
|
+ return msg_prevnode(m);
|
|
|
+ return msg_word(m, 6);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_orignode(struct tipc_msg *m, u32 a)
|
|
|
{
|
|
|
msg_set_word(m, 6, a);
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_destnode(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_word(m, 7);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_destnode(struct tipc_msg *m, u32 a)
|
|
|
{
|
|
|
msg_set_word(m, 7, a);
|
|
@@ -299,6 +428,11 @@ static inline u32 msg_routed(struct tipc_msg *m)
|
|
|
return(msg_destnode(m) ^ msg_orignode(m)) >> 11;
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_nametype(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_word(m, 8);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_nametype(struct tipc_msg *m, u32 n)
|
|
|
{
|
|
|
msg_set_word(m, 8, n);
|
|
@@ -324,6 +458,16 @@ static inline void msg_set_transp_seqno(struct tipc_msg *m, u32 n)
|
|
|
msg_set_word(m, 8, n);
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_nameinst(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_word(m, 9);
|
|
|
+}
|
|
|
+
|
|
|
+static inline u32 msg_namelower(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_nameinst(m);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_namelower(struct tipc_msg *m, u32 n)
|
|
|
{
|
|
|
msg_set_word(m, 9, n);
|
|
@@ -334,11 +478,21 @@ static inline void msg_set_nameinst(struct tipc_msg *m, u32 n)
|
|
|
msg_set_namelower(m, n);
|
|
|
}
|
|
|
|
|
|
+static inline u32 msg_nameupper(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return msg_word(m, 10);
|
|
|
+}
|
|
|
+
|
|
|
static inline void msg_set_nameupper(struct tipc_msg *m, u32 n)
|
|
|
{
|
|
|
msg_set_word(m, 10, n);
|
|
|
}
|
|
|
|
|
|
+static inline unchar *msg_data(struct tipc_msg *m)
|
|
|
+{
|
|
|
+ return ((unchar *)m) + msg_hdr_sz(m);
|
|
|
+}
|
|
|
+
|
|
|
static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m)
|
|
|
{
|
|
|
return (struct tipc_msg *)msg_data(m);
|