@@ -25,7 +25,7 @@ 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 ;
@@ -42,10 +42,10 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
42
42
addr .smctp_base .smctp_family = AF_MCTP ;
43
43
addr .smctp_base .smctp_network = net ;
44
44
addr .smctp_base .smctp_addr .s_addr = eid ;
45
- addr .smctp_base .smctp_type = 1 ;
45
+ addr .smctp_base .smctp_type = type ;
46
46
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 );
49
49
50
50
rxbuf = malloc (len );
51
51
if (!rxbuf )
@@ -81,15 +81,20 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
81
81
if (rc != (int )len )
82
82
err (EXIT_FAILURE , "sendto(%zd)" , len );
83
83
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
+
84
92
/* receive response */
85
93
addrlen = sizeof (addr );
86
94
rc = recvfrom (sd , rxbuf , len , MSG_TRUNC ,
87
95
(struct sockaddr * )& addr , & addrlen );
88
96
if (rc < 0 )
89
97
err (EXIT_FAILURE , "recvfrom" );
90
- else if ((size_t )rc != len )
91
- errx (EXIT_FAILURE , "unexpected length: got %d, exp %zd" ,
92
- rc , len );
93
98
94
99
if (!(addrlen == sizeof (struct sockaddr_mctp_ext ) ||
95
100
addrlen == sizeof (struct sockaddr_mctp )))
@@ -98,33 +103,26 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
98
103
sizeof (struct sockaddr_mctp ));
99
104
100
105
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" ,
102
107
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 );
106
109
if (addrlen == sizeof (struct sockaddr_mctp_ext )) {
107
110
printf (" ext ifindex %d ha[0]=0x%02x len %hhu\n" ,
108
111
addr .smctp_ifindex ,
109
112
addr .smctp_haddr [0 ], addr .smctp_halen );
110
113
}
111
114
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" );
121
119
return 0 ;
122
120
}
123
121
124
122
static void usage (void )
125
123
{
126
124
fprintf (stderr , "mctp-req [eid <eid>] [net <net>]"
127
- "[if <ifindex> lladdr <hwaddr>] [len <len>]"
125
+ "[if <ifindex> lladdr <hwaddr>] [type <type>] [ len <len>]"
128
126
"[data <data>]\n" );
129
127
fprintf (stderr , "default eid %d net %d len %zd\n" ,
130
128
DEFAULT_EID , DEFAULT_NET , DEFAULT_LEN );
@@ -139,6 +137,7 @@ int main(int argc, char ** argv)
139
137
unsigned int net = DEFAULT_NET ;
140
138
mctp_eid_t eid = DEFAULT_EID ;
141
139
size_t len = DEFAULT_LEN , sz ;
140
+ uint8_t type = 1 ;
142
141
char * endp , * optname , * optval ;
143
142
unsigned int tmp , ifindex ;
144
143
bool valid_parse ;
@@ -173,6 +172,10 @@ int main(int argc, char ** argv)
173
172
if (tmp > 64 * 1024 )
174
173
errx (EXIT_FAILURE , "Bad len" );
175
174
len = tmp ;
175
+ } else if (!strcmp (optname , "type" )) {
176
+ if (tmp > 0xff )
177
+ errx (EXIT_FAILURE , "Bad type" );
178
+ type = tmp ;
176
179
} else if (!strcmp (optname , "data" )) {
177
180
sz = (strlen (optval ) + 2 ) / 3 ;
178
181
data = malloc (sz );
@@ -203,5 +206,5 @@ int main(int argc, char ** argv)
203
206
if (data )
204
207
len = datalen ;
205
208
206
- return mctp_req (net , eid , ifindex , lladdr , lladdrlen , data , len );
209
+ return mctp_req (net , eid , ifindex , lladdr , lladdrlen , type , data , len );
207
210
}
0 commit comments