@@ -25,13 +25,14 @@ 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 ;
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
124124static 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