Skip to content

Commit 93f45c9

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 4324538 commit 93f45c9

File tree

1 file changed

+27
-22
lines changed

1 file changed

+27
-22
lines changed

src/mctp-req.c

+27-22
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@ 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;
3232
socklen_t addrlen;
3333
int rc, sd, val;
3434
size_t i;
35+
ssize_t ret;
3536

3637
sd = socket(AF_MCTP, SOCK_DGRAM, 0);
3738
if (sd < 0)
@@ -42,10 +43,10 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
4243
addr.smctp_base.smctp_family = AF_MCTP;
4344
addr.smctp_base.smctp_network = net;
4445
addr.smctp_base.smctp_addr.s_addr = eid;
45-
addr.smctp_base.smctp_type = 1;
46+
addr.smctp_base.smctp_type = type;
4647
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);
48+
printf("req: sending to (net %d, eid %d), type %d, len %zu\n",
49+
net, eid, addr.smctp_base.smctp_type, len);
4950

5051
rxbuf = malloc(len);
5152
if (!rxbuf)
@@ -81,15 +82,21 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
8182
if (rc != (int)len)
8283
err(EXIT_FAILURE, "sendto(%zd)", len);
8384

85+
ret = recvfrom(sd, NULL, 0, MSG_PEEK | MSG_TRUNC, NULL, 0);
86+
if (ret < 0)
87+
err(EXIT_FAILURE, "recvfrom");
88+
len = (size_t)ret;
89+
90+
rxbuf = realloc(rxbuf, len);
91+
if (!rxbuf)
92+
err(EXIT_FAILURE, "realloc");
93+
8494
/* receive response */
8595
addrlen = sizeof(addr);
8696
rc = recvfrom(sd, rxbuf, len, MSG_TRUNC,
8797
(struct sockaddr *)&addr, &addrlen);
8898
if (rc < 0)
8999
err(EXIT_FAILURE, "recvfrom");
90-
else if ((size_t)rc != len)
91-
errx(EXIT_FAILURE, "unexpected length: got %d, exp %zd",
92-
rc, len);
93100

94101
if (!(addrlen == sizeof(struct sockaddr_mctp_ext) ||
95102
addrlen == sizeof(struct sockaddr_mctp)))
@@ -98,33 +105,26 @@ 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 %d len %zd\n",
102109
addr.smctp_base.smctp_network, addr.smctp_base.smctp_addr.s_addr,
103-
addr.smctp_base.smctp_type,
104-
len,
105-
rxbuf[0]);
110+
addr.smctp_base.smctp_type, len);
106111
if (addrlen == sizeof(struct sockaddr_mctp_ext)) {
107112
printf(" ext ifindex %d ha[0]=0x%02x len %hhu\n",
108113
addr.smctp_ifindex,
109114
addr.smctp_haddr[0], addr.smctp_halen);
110115
}
111116

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-
117+
printf("data:\n");
118+
for (i = 0; i < len; i++)
119+
printf("0x%02x ", rxbuf[i]);
120+
printf("\n");
121121
return 0;
122122
}
123123

124124
static void usage(void)
125125
{
126126
fprintf(stderr, "mctp-req [eid <eid>] [net <net>]"
127-
"[ifindex <ifindex> lladdr <hwaddr>] [len <len>]"
127+
"[ifindex <ifindex> lladdr <hwaddr>] [type <type>] [len <len>]"
128128
"[data <data>]\n");
129129
fprintf(stderr, "default eid %d net %d len %zd\n",
130130
DEFAULT_EID, DEFAULT_NET, DEFAULT_LEN);
@@ -139,6 +139,7 @@ int main(int argc, char ** argv)
139139
unsigned int net = DEFAULT_NET;
140140
mctp_eid_t eid = DEFAULT_EID;
141141
size_t len = DEFAULT_LEN, sz;
142+
uint8_t type = 1;
142143
char *endp, *optname, *optval;
143144
unsigned int tmp, ifindex;
144145
bool valid_parse;
@@ -173,6 +174,10 @@ int main(int argc, char ** argv)
173174
if (tmp > 64 * 1024)
174175
errx(EXIT_FAILURE, "Bad len");
175176
len = tmp;
177+
} else if (!strcmp(optname, "type")) {
178+
if (tmp > 0xff)
179+
errx(EXIT_FAILURE, "Bad type");
180+
type = tmp;
176181
} else if (!strcmp(optname, "data")) {
177182
sz = (strlen(optval) + 2) / 3;
178183
data = malloc(sz);
@@ -203,5 +208,5 @@ int main(int argc, char ** argv)
203208
if (data)
204209
len = datalen;
205210

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

0 commit comments

Comments
 (0)