Skip to content

Commit 985df80

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 10 type 0 data 80:03 req: sending to (net 1, eid 10), type 0, len 2 req: message from (net 1, eid 10) type 0 len 19 data: 00000000 00 03 00 f2 90 58 cc 65 e5 ec 11 80 00 e8 eb d3 |.....X.e........| 00000010 13 91 2e |...| Signed-off-by: Lei YU <[email protected]>
1 parent 4a9237c commit 985df80

File tree

1 file changed

+30
-24
lines changed

1 file changed

+30
-24
lines changed

src/mctp-req.c

+30-24
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 rlen;
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 %zd\n",
49+
net, eid, addr.smctp_base.smctp_type, len);
4950

5051
rxbuf = malloc(len);
5152
if (!rxbuf)
@@ -81,15 +82,24 @@ 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+
rlen = recvfrom(sd, NULL, 0, MSG_PEEK | MSG_TRUNC, NULL, 0);
86+
if (rlen < 0)
87+
err(EXIT_FAILURE, "recvfrom");
88+
if (rlen == 0)
89+
errx(EXIT_FAILURE, "recvfrom returns 0");
90+
91+
rxbuf = realloc(rxbuf, rlen);
92+
if (!rxbuf)
93+
err(EXIT_FAILURE, "realloc");
94+
8495
/* receive response */
8596
addrlen = sizeof(addr);
86-
rc = recvfrom(sd, rxbuf, len, MSG_TRUNC,
97+
rlen = recvfrom(sd, rxbuf, rlen, MSG_TRUNC,
8798
(struct sockaddr *)&addr, &addrlen);
88-
if (rc < 0)
99+
if (rlen < 0)
89100
err(EXIT_FAILURE, "recvfrom");
90-
else if ((size_t)rc != len)
91-
errx(EXIT_FAILURE, "unexpected length: got %d, exp %zd",
92-
rc, len);
101+
if (rlen == 0)
102+
errx(EXIT_FAILURE, "recvfrom returns 0");
93103

94104
if (!(addrlen == sizeof(struct sockaddr_mctp_ext) ||
95105
addrlen == sizeof(struct sockaddr_mctp)))
@@ -98,33 +108,24 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
98108
sizeof(struct sockaddr_mctp));
99109

100110

101-
printf("req: message from (net %d, eid %d) type %d len %zd: 0x%02x..\n",
111+
printf("req: message from (net %d, eid %d) type %d len %zd\n",
102112
addr.smctp_base.smctp_network, addr.smctp_base.smctp_addr.s_addr,
103-
addr.smctp_base.smctp_type,
104-
len,
105-
rxbuf[0]);
113+
addr.smctp_base.smctp_type, rlen);
106114
if (addrlen == sizeof(struct sockaddr_mctp_ext)) {
107115
printf(" ext ifindex %d ha[0]=0x%02x len %hhu\n",
108116
addr.smctp_ifindex,
109117
addr.smctp_haddr[0], addr.smctp_halen);
110118
}
111119

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-
120+
printf("data:\n");
121+
mctp_hexdump(rxbuf, rlen, " ");
121122
return 0;
122123
}
123124

124125
static void usage(void)
125126
{
126127
fprintf(stderr, "mctp-req [eid <eid>] [net <net>] "
127-
"[if <ifindex> lladdr <hwaddr>] [len <len>] "
128+
"[if <ifindex> lladdr <hwaddr>] [type <type>] [len <len>]"
128129
"[data <data>]\n");
129130
fprintf(stderr, "default eid %d net %d len %zd\n",
130131
DEFAULT_EID, DEFAULT_NET, DEFAULT_LEN);
@@ -139,6 +140,7 @@ int main(int argc, char ** argv)
139140
unsigned int net = DEFAULT_NET;
140141
mctp_eid_t eid = DEFAULT_EID;
141142
size_t len = DEFAULT_LEN, sz;
143+
uint8_t type = 1;
142144
char *endp, *optname, *optval;
143145
unsigned int tmp, ifindex;
144146
bool valid_parse;
@@ -173,6 +175,10 @@ int main(int argc, char ** argv)
173175
if (tmp > 64 * 1024)
174176
errx(EXIT_FAILURE, "Bad len");
175177
len = tmp;
178+
} else if (!strcmp(optname, "type")) {
179+
if (tmp > 0xff)
180+
errx(EXIT_FAILURE, "Bad type");
181+
type = tmp;
176182
} else if (!strcmp(optname, "data")) {
177183
sz = (strlen(optval) + 2) / 3;
178184
data = malloc(sz);
@@ -203,5 +209,5 @@ int main(int argc, char ** argv)
203209
if (data)
204210
len = datalen;
205211

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

0 commit comments

Comments
 (0)