Skip to content

Commit 88d0816

Browse files
mctp-req: Make it generic
The mctp-req was acting like a echo client that sends and receive the same data. Change the code to make it a generic sender and receiver, so that user could use it to send all types of data and prints the received data. * Add a `type` argument to specify the mctp type, default to 1 (PLDM). * Remove the code that expects the same len and data for sent and received data. * Add print of the received data. Tested: Get UUID of an endpoint: $ mctp-req eid 9 type 0 data 80:03 req: sending to (net 1, eid 9), type 0, len 2 req: message from (net 1, eid 9) type 0 len 19 data: 0x00 0x03 0x00 0x7e 0x92 0x05 0xfc 0x01 0xc2 0xeb 0x11 0x80 0x00 0xb8 0xce 0xf6 0xae 0xcd 0x16 Signed-off-by: Lei YU <[email protected]>
1 parent cface4f commit 88d0816

File tree

1 file changed

+25
-22
lines changed

1 file changed

+25
-22
lines changed

src/mctp-req.c

+25-22
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static const size_t DEFAULT_LEN = 1;
2525
/* lladdrlen != -1 to ignore ifindex/lladdr */
2626
static int mctp_req(unsigned int net, mctp_eid_t eid,
2727
unsigned int ifindex, uint8_t *lladdr, int lladdrlen,
28-
uint8_t *data, size_t len)
28+
uint8_t type, uint8_t *data, size_t len)
2929
{
3030
struct sockaddr_mctp_ext addr;
3131
unsigned char *buf, *rxbuf;
@@ -42,10 +42,10 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
4242
addr.smctp_base.smctp_family = AF_MCTP;
4343
addr.smctp_base.smctp_network = net;
4444
addr.smctp_base.smctp_addr.s_addr = eid;
45-
addr.smctp_base.smctp_type = 1;
45+
addr.smctp_base.smctp_type = type;
4646
addr.smctp_base.smctp_tag = MCTP_TAG_OWNER;
47-
printf("req: sending to (net %d, eid %d), type %d\n",
48-
net, eid, addr.smctp_base.smctp_type);
47+
printf("req: sending to (net %d, eid %d), type %d, len %d\n",
48+
net, eid, addr.smctp_base.smctp_type, len);
4949

5050
rxbuf = malloc(len);
5151
if (!rxbuf)
@@ -81,15 +81,20 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
8181
if (rc != (int)len)
8282
err(EXIT_FAILURE, "sendto(%zd)", len);
8383

84+
len = recvfrom(sd, NULL, 0, MSG_PEEK | MSG_TRUNC, NULL, 0);
85+
if (len < 0)
86+
err(EXIT_FAILURE, "recvfrom");
87+
88+
rxbuf = realloc(rxbuf, len);
89+
if (!rxbuf)
90+
err(EXIT_FAILURE, "realloc");
91+
8492
/* receive response */
8593
addrlen = sizeof(addr);
8694
rc = recvfrom(sd, rxbuf, len, MSG_TRUNC,
8795
(struct sockaddr *)&addr, &addrlen);
8896
if (rc < 0)
8997
err(EXIT_FAILURE, "recvfrom");
90-
else if ((size_t)rc != len)
91-
errx(EXIT_FAILURE, "unexpected length: got %d, exp %zd",
92-
rc, len);
9398

9499
if (!(addrlen == sizeof(struct sockaddr_mctp_ext) ||
95100
addrlen == sizeof(struct sockaddr_mctp)))
@@ -98,33 +103,26 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
98103
sizeof(struct sockaddr_mctp));
99104

100105

101-
printf("req: message from (net %d, eid %d) type %d len %zd: 0x%02x..\n",
106+
printf("req: message from (net %d, eid %d) type %d len %zd\n",
102107
addr.smctp_base.smctp_network, addr.smctp_base.smctp_addr.s_addr,
103-
addr.smctp_base.smctp_type,
104-
len,
105-
rxbuf[0]);
108+
addr.smctp_base.smctp_type, len);
106109
if (addrlen == sizeof(struct sockaddr_mctp_ext)) {
107110
printf(" ext ifindex %d ha[0]=0x%02x len %hhu\n",
108111
addr.smctp_ifindex,
109112
addr.smctp_haddr[0], addr.smctp_halen);
110113
}
111114

112-
for (i = 0; i < len; i++) {
113-
uint8_t exp = data ? data[i] : i & 0xff;
114-
if (rxbuf[i] != exp)
115-
errx(EXIT_FAILURE,
116-
"payload mismatch at byte 0x%zx; "
117-
"sent 0x%02x, received 0x%02x",
118-
i, exp, rxbuf[i]);
119-
}
120-
115+
printf("data:\n");
116+
for (i = 0; i < len; i++)
117+
printf("0x%02x ", rxbuf[i]);
118+
printf("\n");
121119
return 0;
122120
}
123121

124122
static void usage(void)
125123
{
126124
fprintf(stderr, "mctp-req [eid <eid>] [net <net>]"
127-
"[if <ifindex> lladdr <hwaddr>] [len <len>]"
125+
"[if <ifindex> lladdr <hwaddr>] [type <type>] [len <len>]"
128126
"[data <data>]\n");
129127
fprintf(stderr, "default eid %d net %d len %zd\n",
130128
DEFAULT_EID, DEFAULT_NET, DEFAULT_LEN);
@@ -139,6 +137,7 @@ int main(int argc, char ** argv)
139137
unsigned int net = DEFAULT_NET;
140138
mctp_eid_t eid = DEFAULT_EID;
141139
size_t len = DEFAULT_LEN, sz;
140+
uint8_t type = 1;
142141
char *endp, *optname, *optval;
143142
unsigned int tmp, ifindex;
144143
bool valid_parse;
@@ -173,6 +172,10 @@ int main(int argc, char ** argv)
173172
if (tmp > 64 * 1024)
174173
errx(EXIT_FAILURE, "Bad len");
175174
len = tmp;
175+
} else if (!strcmp(optname, "type")) {
176+
if (tmp > 0xff)
177+
errx(EXIT_FAILURE, "Bad type");
178+
type = tmp;
176179
} else if (!strcmp(optname, "data")) {
177180
sz = (strlen(optval) + 2) / 3;
178181
data = malloc(sz);
@@ -203,5 +206,5 @@ int main(int argc, char ** argv)
203206
if (data)
204207
len = datalen;
205208

206-
return mctp_req(net, eid, ifindex, lladdr, lladdrlen, data, len);
209+
return mctp_req(net, eid, ifindex, lladdr, lladdrlen, type, data, len);
207210
}

0 commit comments

Comments
 (0)