@@ -25,7 +25,7 @@ static const size_t DEFAULT_LEN = 1;
2525/* lladdrlen != -1 to ignore ifindex/lladdr */
2626static 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
124122static 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