|
@@ -75,6 +75,14 @@ static inline void msg_set_bits(struct tipc_msg *m, u32 w,
|
|
m->hdr[w] |= htonl(val);
|
|
m->hdr[w] |= htonl(val);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline void msg_swap_words(struct tipc_msg *msg, u32 a, u32 b)
|
|
|
|
+{
|
|
|
|
+ u32 temp = msg->hdr[a];
|
|
|
|
+
|
|
|
|
+ msg->hdr[a] = msg->hdr[b];
|
|
|
|
+ msg->hdr[b] = temp;
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Word 0
|
|
* Word 0
|
|
*/
|
|
*/
|
|
@@ -119,9 +127,9 @@ static inline int msg_non_seq(struct tipc_msg *m)
|
|
return msg_bits(m, 0, 20, 1);
|
|
return msg_bits(m, 0, 20, 1);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline void msg_set_non_seq(struct tipc_msg *m)
|
|
|
|
|
|
+static inline void msg_set_non_seq(struct tipc_msg *m, u32 n)
|
|
{
|
|
{
|
|
- msg_set_bits(m, 0, 20, 1, 1);
|
|
|
|
|
|
+ msg_set_bits(m, 0, 20, 1, n);
|
|
}
|
|
}
|
|
|
|
|
|
static inline int msg_dest_droppable(struct tipc_msg *m)
|
|
static inline int msg_dest_droppable(struct tipc_msg *m)
|
|
@@ -224,6 +232,25 @@ static inline void msg_set_seqno(struct tipc_msg *m, u32 n)
|
|
msg_set_bits(m, 2, 0, 0xffff, n);
|
|
msg_set_bits(m, 2, 0, 0xffff, n);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * TIPC may utilize the "link ack #" and "link seq #" fields of a short
|
|
|
|
+ * message header to hold the destination node for the message, since the
|
|
|
|
+ * normal "dest node" field isn't present. This cache is only referenced
|
|
|
|
+ * when required, so populating the cache of a longer message header is
|
|
|
|
+ * harmless (as long as the header has the two link sequence fields present).
|
|
|
|
+ *
|
|
|
|
+ * Note: Host byte order is OK here, since the info never goes off-card.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+static inline u32 msg_destnode_cache(struct tipc_msg *m)
|
|
|
|
+{
|
|
|
|
+ return m->hdr[2];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline void msg_set_destnode_cache(struct tipc_msg *m, u32 dnode)
|
|
|
|
+{
|
|
|
|
+ m->hdr[2] = dnode;
|
|
|
|
+}
|
|
|
|
|
|
/*
|
|
/*
|
|
* Words 3-10
|
|
* Words 3-10
|