Skip to content

Commit 756a308

Browse files
committed
mctp-req: Use MCTP vendor defined message type
mctp-req and mctp-echo now use a distinct message type instead of PLDM. The length argument is the length of the "payload", with an additional 3 bytes added for message type. The first buffer byte is no longer printed (it would be incorrect for len=0 regardless). Signed-off-by: Matt Johnston <matt@codeconstruct.com.au>
1 parent 14b9b67 commit 756a308

File tree

3 files changed

+56
-21
lines changed

3 files changed

+56
-21
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
1717

1818
2. mctpd: Add `au.com.codeconstruct.MCTP.Network1` interface
1919

20+
3. mctp-bench, mctp-req, mctp-echo: Message format has changed to use a
21+
vendor-defined message type, rather than MCTP type 1.
22+
2023
## [2.1] - 2024-12-16
2124

2225
### Fixed

src/mctp-echo.c

+25-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
#include <sys/socket.h>
1616
#include "mctp.h"
1717

18+
// Code Construct allocation
19+
static const uint8_t VENDOR_TYPE_ECHO[3] = { 0xcc, 0xde, 0xf0 };
20+
static const uint8_t MCTP_TYPE_VENDOR_PCIE = 0x7e;
21+
1822
int main(void)
1923
{
2024
struct sockaddr_mctp addr;
@@ -32,7 +36,7 @@ int main(void)
3236
addr.smctp_family = AF_MCTP;
3337
addr.smctp_network = MCTP_NET_ANY;
3438
addr.smctp_addr.s_addr = MCTP_ADDR_ANY;
35-
addr.smctp_type = 1;
39+
addr.smctp_type = MCTP_TYPE_VENDOR_PCIE;
3640
addr.smctp_tag = MCTP_TAG_OWNER;
3741

3842
buflen = 0;
@@ -70,11 +74,29 @@ int main(void)
7074
continue;
7175
}
7276

73-
printf("echo: message from (net %d, eid %d), tag %d, type %d: len %zd, 0x%02x ..., responding\n",
77+
if (len < (ssize_t)sizeof(VENDOR_TYPE_ECHO)) {
78+
warnx("echo: short message from (net %d, eid %d), tag %d, type 0x%x: len %zd.\n",
79+
addr.smctp_network, addr.smctp_addr.s_addr,
80+
addr.smctp_tag,
81+
addr.smctp_type,
82+
len);
83+
continue;
84+
}
85+
86+
if (memcmp(buf, VENDOR_TYPE_ECHO, sizeof(VENDOR_TYPE_ECHO)) != 0) {
87+
warnx("echo: unexpected vendor ID from (net %d, eid %d), tag %d, type 0x%x, len %zd.\n",
88+
addr.smctp_network, addr.smctp_addr.s_addr,
89+
addr.smctp_tag,
90+
addr.smctp_type,
91+
len);
92+
continue;
93+
}
94+
95+
printf("echo: message from (net %d, eid %d), tag %d, type 0x%x: len %zd, responding\n",
7496
addr.smctp_network, addr.smctp_addr.s_addr,
7597
addr.smctp_tag,
7698
addr.smctp_type,
77-
len, buf[0]);
99+
len);
78100

79101
addr.smctp_tag &= ~MCTP_TAG_OWNER;
80102

src/mctp-req.c

+28-18
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,20 @@ static const int DEFAULT_NET = 1;
2222
static const mctp_eid_t DEFAULT_EID = 8;
2323
static const size_t DEFAULT_LEN = 1;
2424

25+
// Code Construct allocation
26+
static const uint8_t VENDOR_TYPE_ECHO[3] = { 0xcc, 0xde, 0xf0 };
27+
static const uint8_t MCTP_TYPE_VENDOR_PCIE = 0x7e;
28+
2529
/* lladdrlen != -1 to ignore ifindex/lladdr */
2630
static int mctp_req(unsigned int net, mctp_eid_t eid,
2731
unsigned int ifindex, uint8_t *lladdr, int lladdrlen,
2832
uint8_t *data, size_t len)
2933
{
3034
struct sockaddr_mctp_ext addr;
31-
unsigned char *buf, *rxbuf;
35+
unsigned char *payload, *buf;
3236
socklen_t addrlen;
3337
int rc, sd, val;
34-
size_t i;
38+
size_t i, buf_len;
3539

3640
sd = socket(AF_MCTP, SOCK_DGRAM, 0);
3741
if (sd < 0)
@@ -42,20 +46,23 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
4246
addr.smctp_base.smctp_family = AF_MCTP;
4347
addr.smctp_base.smctp_network = net;
4448
addr.smctp_base.smctp_addr.s_addr = eid;
45-
addr.smctp_base.smctp_type = 1;
49+
addr.smctp_base.smctp_type = MCTP_TYPE_VENDOR_PCIE;
4650
addr.smctp_base.smctp_tag = MCTP_TAG_OWNER;
47-
printf("req: sending to (net %d, eid %d), type %d\n",
51+
printf("req: sending to (net %d, eid %d), type 0x%x\n",
4852
net, eid, addr.smctp_base.smctp_type);
4953

50-
rxbuf = malloc(len);
51-
if (!rxbuf)
54+
buf_len = len + sizeof(VENDOR_TYPE_ECHO);
55+
buf = malloc(buf_len);
56+
if (!buf)
5257
err(EXIT_FAILURE, "malloc");
58+
memcpy(buf, VENDOR_TYPE_ECHO, sizeof(VENDOR_TYPE_ECHO));
59+
payload = &buf[sizeof(VENDOR_TYPE_ECHO)];
60+
5361
if (data) {
54-
buf = data;
62+
memcpy(payload, data, len);
5563
} else {
56-
buf = rxbuf;
5764
for (i = 0; i < len; i++)
58-
buf[i] = i & 0xff;
65+
payload[i] = i & 0xff;
5966
}
6067

6168
/* extended addressing */
@@ -76,20 +83,20 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
7683

7784

7885
/* send data */
79-
rc = sendto(sd, buf, len, 0,
86+
rc = sendto(sd, buf, buf_len, 0,
8087
(struct sockaddr *)&addr, addrlen);
8188
if (rc != (int)len)
8289
err(EXIT_FAILURE, "sendto(%zd)", len);
8390

8491
/* receive response */
8592
addrlen = sizeof(addr);
86-
rc = recvfrom(sd, rxbuf, len, MSG_TRUNC,
93+
rc = recvfrom(sd, buf, buf_len, MSG_TRUNC,
8794
(struct sockaddr *)&addr, &addrlen);
8895
if (rc < 0)
8996
err(EXIT_FAILURE, "recvfrom");
90-
else if ((size_t)rc != len)
97+
else if ((size_t)rc != buf_len)
9198
errx(EXIT_FAILURE, "unexpected length: got %d, exp %zd",
92-
rc, len);
99+
rc, buf_len);
93100

94101
if (!(addrlen == sizeof(struct sockaddr_mctp_ext) ||
95102
addrlen == sizeof(struct sockaddr_mctp)))
@@ -98,24 +105,27 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
98105
sizeof(struct sockaddr_mctp));
99106

100107

101-
printf("req: message from (net %d, eid %d) type %d len %zd: 0x%02x..\n",
108+
printf("req: message from (net %d, eid %d) type 0x%x len %zd\n",
102109
addr.smctp_base.smctp_network, addr.smctp_base.smctp_addr.s_addr,
103110
addr.smctp_base.smctp_type,
104-
len,
105-
rxbuf[0]);
111+
len);
106112
if (addrlen == sizeof(struct sockaddr_mctp_ext)) {
107113
printf(" ext ifindex %d ha[0]=0x%02x len %hhu\n",
108114
addr.smctp_ifindex,
109115
addr.smctp_haddr[0], addr.smctp_halen);
110116
}
111117

118+
if (memcmp(buf, VENDOR_TYPE_ECHO, sizeof(VENDOR_TYPE_ECHO)) != 0) {
119+
errx(EXIT_FAILURE, "unexpected vendor ID");
120+
}
121+
112122
for (i = 0; i < len; i++) {
113123
uint8_t exp = data ? data[i] : i & 0xff;
114-
if (rxbuf[i] != exp)
124+
if (payload[i] != exp)
115125
errx(EXIT_FAILURE,
116126
"payload mismatch at byte 0x%zx; "
117127
"sent 0x%02x, received 0x%02x",
118-
i, exp, rxbuf[i]);
128+
i, exp, buf[i]);
119129
}
120130

121131
return 0;

0 commit comments

Comments
 (0)