@@ -25,13 +25,14 @@ static const size_t DEFAULT_LEN = 1;
25
25
/* lladdrlen != -1 to ignore ifindex/lladdr */
26
26
static int mctp_req (unsigned int net , mctp_eid_t eid ,
27
27
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 )
29
29
{
30
30
struct sockaddr_mctp_ext addr ;
31
31
unsigned char * buf , * rxbuf ;
32
32
socklen_t addrlen ;
33
33
int rc , sd , val ;
34
34
size_t i ;
35
+ ssize_t rlen ;
35
36
36
37
sd = socket (AF_MCTP , SOCK_DGRAM , 0 );
37
38
if (sd < 0 )
@@ -42,10 +43,10 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
42
43
addr .smctp_base .smctp_family = AF_MCTP ;
43
44
addr .smctp_base .smctp_network = net ;
44
45
addr .smctp_base .smctp_addr .s_addr = eid ;
45
- addr .smctp_base .smctp_type = 1 ;
46
+ addr .smctp_base .smctp_type = type ;
46
47
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 );
49
50
50
51
rxbuf = malloc (len );
51
52
if (!rxbuf )
@@ -81,15 +82,24 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
81
82
if (rc != (int )len )
82
83
err (EXIT_FAILURE , "sendto(%zd)" , len );
83
84
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
+
84
95
/* receive response */
85
96
addrlen = sizeof (addr );
86
- rc = recvfrom (sd , rxbuf , len , MSG_TRUNC ,
97
+ rlen = recvfrom (sd , rxbuf , rlen , MSG_TRUNC ,
87
98
(struct sockaddr * )& addr , & addrlen );
88
- if (rc < 0 )
99
+ if (rlen < 0 )
89
100
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" );
93
103
94
104
if (!(addrlen == sizeof (struct sockaddr_mctp_ext ) ||
95
105
addrlen == sizeof (struct sockaddr_mctp )))
@@ -98,33 +108,24 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
98
108
sizeof (struct sockaddr_mctp ));
99
109
100
110
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" ,
102
112
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 );
106
114
if (addrlen == sizeof (struct sockaddr_mctp_ext )) {
107
115
printf (" ext ifindex %d ha[0]=0x%02x len %hhu\n" ,
108
116
addr .smctp_ifindex ,
109
117
addr .smctp_haddr [0 ], addr .smctp_halen );
110
118
}
111
119
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 , " " );
121
122
return 0 ;
122
123
}
123
124
124
125
static void usage (void )
125
126
{
126
127
fprintf (stderr , "mctp-req [eid <eid>] [net <net>] "
127
- "[if <ifindex> lladdr <hwaddr>] [len <len>] "
128
+ "[if <ifindex> lladdr <hwaddr>] [type <type>] [ len <len>]"
128
129
"[data <data>]\n" );
129
130
fprintf (stderr , "default eid %d net %d len %zd\n" ,
130
131
DEFAULT_EID , DEFAULT_NET , DEFAULT_LEN );
@@ -139,6 +140,7 @@ int main(int argc, char ** argv)
139
140
unsigned int net = DEFAULT_NET ;
140
141
mctp_eid_t eid = DEFAULT_EID ;
141
142
size_t len = DEFAULT_LEN , sz ;
143
+ uint8_t type = 1 ;
142
144
char * endp , * optname , * optval ;
143
145
unsigned int tmp , ifindex ;
144
146
bool valid_parse ;
@@ -173,6 +175,10 @@ int main(int argc, char ** argv)
173
175
if (tmp > 64 * 1024 )
174
176
errx (EXIT_FAILURE , "Bad len" );
175
177
len = tmp ;
178
+ } else if (!strcmp (optname , "type" )) {
179
+ if (tmp > 0xff )
180
+ errx (EXIT_FAILURE , "Bad type" );
181
+ type = tmp ;
176
182
} else if (!strcmp (optname , "data" )) {
177
183
sz = (strlen (optval ) + 2 ) / 3 ;
178
184
data = malloc (sz );
@@ -203,5 +209,5 @@ int main(int argc, char ** argv)
203
209
if (data )
204
210
len = datalen ;
205
211
206
- return mctp_req (net , eid , ifindex , lladdr , lladdrlen , data , len );
212
+ return mctp_req (net , eid , ifindex , lladdr , lladdrlen , type , data , len );
207
213
}
0 commit comments