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