core: Fix flags on tx packetisation
We need to set proper SOM, EOM and sequence number tags.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Change-Id: I9daaa8edf7df3779a0ea7f77bad17933dc4a081d
diff --git a/core.c b/core.c
index b855ced..560a4a7 100644
--- a/core.c
+++ b/core.c
@@ -393,11 +393,12 @@
struct mctp_hdr *hdr;
struct mctp_bus *bus;
size_t pkt_len, p;
+ int i;
bus = find_bus_for_eid(mctp, eid);
/* queue up packets, each of max MCTP_MTU size */
- for (p = 0; p < msg_len; ) {
+ for (p = 0, i = 0; p < msg_len; i++) {
pkt_len = msg_len - p;
if (pkt_len > MCTP_MTU)
pkt_len = MCTP_MTU;
@@ -409,12 +410,16 @@
hdr->ver = bus->binding->version & 0xf;
hdr->dest = eid;
hdr->src = bus->eid;
- hdr->flags_seq_tag = MCTP_HDR_FLAG_SOM |
- MCTP_HDR_FLAG_EOM |
- (0 << MCTP_HDR_SEQ_SHIFT) |
- MCTP_HDR_FLAG_TO |
+ hdr->flags_seq_tag = MCTP_HDR_FLAG_TO |
(0 << MCTP_HDR_TAG_SHIFT);
+ if (i == 0)
+ hdr->flags_seq_tag |= MCTP_HDR_FLAG_SOM;
+ if (p + pkt_len >= msg_len)
+ hdr->flags_seq_tag |= MCTP_HDR_FLAG_EOM;
+ hdr->flags_seq_tag |=
+ (i & MCTP_HDR_SEQ_MASK) << MCTP_HDR_SEQ_SHIFT;
+
memcpy(mctp_pktbuf_data(pkt), msg + p, pkt_len);
/* add to tx queue */