@@ -22,16 +22,20 @@ static const int DEFAULT_NET = 1;
2222static const mctp_eid_t DEFAULT_EID = 8 ;
2323static const size_t DEFAULT_LEN = 1 ;
2424
25+ // Code Construct allocation
26+ static const uint8_t VENDOR_TYPE_ECHO [3 ] = { 0xcc , 0xde , 0xf0 };
27+ static const uint8_t MCTP_TYPE_VENDOR_PCIE = 0x7e ;
28+
2529/* lladdrlen != -1 to ignore ifindex/lladdr */
2630static int mctp_req (unsigned int net , mctp_eid_t eid ,
2731 unsigned int ifindex , uint8_t * lladdr , int lladdrlen ,
2832 uint8_t * data , size_t len )
2933{
3034 struct sockaddr_mctp_ext addr ;
31- unsigned char * buf , * rxbuf ;
35+ unsigned char * payload , * buf ;
3236 socklen_t addrlen ;
3337 int rc , sd , val ;
34- size_t i ;
38+ size_t i , buf_len ;
3539
3640 sd = socket (AF_MCTP , SOCK_DGRAM , 0 );
3741 if (sd < 0 )
@@ -42,20 +46,23 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
4246 addr .smctp_base .smctp_family = AF_MCTP ;
4347 addr .smctp_base .smctp_network = net ;
4448 addr .smctp_base .smctp_addr .s_addr = eid ;
45- addr .smctp_base .smctp_type = 1 ;
49+ addr .smctp_base .smctp_type = MCTP_TYPE_VENDOR_PCIE ;
4650 addr .smctp_base .smctp_tag = MCTP_TAG_OWNER ;
47- printf ("req: sending to (net %d, eid %d), type %d \n" ,
51+ printf ("req: sending to (net %d, eid %d), type 0x%x \n" ,
4852 net , eid , addr .smctp_base .smctp_type );
4953
50- rxbuf = malloc (len );
51- if (!rxbuf )
54+ buf_len = len + sizeof (VENDOR_TYPE_ECHO );
55+ buf = malloc (buf_len );
56+ if (!buf )
5257 err (EXIT_FAILURE , "malloc" );
58+ memcpy (buf , VENDOR_TYPE_ECHO , sizeof (VENDOR_TYPE_ECHO ));
59+ payload = & buf [sizeof (VENDOR_TYPE_ECHO )];
60+
5361 if (data ) {
54- buf = data ;
62+ memcpy ( payload , data , len ) ;
5563 } else {
56- buf = rxbuf ;
5764 for (i = 0 ; i < len ; i ++ )
58- buf [i ] = i & 0xff ;
65+ payload [i ] = i & 0xff ;
5966 }
6067
6168 /* extended addressing */
@@ -76,20 +83,20 @@ static int mctp_req(unsigned int net, mctp_eid_t eid,
7683
7784
7885 /* send data */
79- rc = sendto (sd , buf , len , 0 ,
86+ rc = sendto (sd , buf , buf_len , 0 ,
8087 (struct sockaddr * )& addr , addrlen );
8188 if (rc != (int )len )
8289 err (EXIT_FAILURE , "sendto(%zd)" , len );
8390
8491 /* receive response */
8592 addrlen = sizeof (addr );
86- rc = recvfrom (sd , rxbuf , len , MSG_TRUNC ,
93+ rc = recvfrom (sd , buf , buf_len , MSG_TRUNC ,
8794 (struct sockaddr * )& addr , & addrlen );
8895 if (rc < 0 )
8996 err (EXIT_FAILURE , "recvfrom" );
90- else if ((size_t )rc != len )
97+ else if ((size_t )rc != buf_len )
9198 errx (EXIT_FAILURE , "unexpected length: got %d, exp %zd" ,
92- rc , len );
99+ rc , buf_len );
93100
94101 if (!(addrlen == sizeof (struct sockaddr_mctp_ext ) ||
95102 addrlen == sizeof (struct sockaddr_mctp )))
@@ -98,24 +105,27 @@ 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 0x%x len %zd\n" ,
102109 addr .smctp_base .smctp_network , addr .smctp_base .smctp_addr .s_addr ,
103110 addr .smctp_base .smctp_type ,
104- len ,
105- rxbuf [0 ]);
111+ len );
106112 if (addrlen == sizeof (struct sockaddr_mctp_ext )) {
107113 printf (" ext ifindex %d ha[0]=0x%02x len %hhu\n" ,
108114 addr .smctp_ifindex ,
109115 addr .smctp_haddr [0 ], addr .smctp_halen );
110116 }
111117
118+ if (memcmp (buf , VENDOR_TYPE_ECHO , sizeof (VENDOR_TYPE_ECHO )) != 0 ) {
119+ errx (EXIT_FAILURE , "unexpected vendor ID" );
120+ }
121+
112122 for (i = 0 ; i < len ; i ++ ) {
113123 uint8_t exp = data ? data [i ] : i & 0xff ;
114- if (rxbuf [i ] != exp )
124+ if (payload [i ] != exp )
115125 errx (EXIT_FAILURE ,
116126 "payload mismatch at byte 0x%zx; "
117127 "sent 0x%02x, received 0x%02x" ,
118- i , exp , rxbuf [i ]);
128+ i , exp , buf [i ]);
119129 }
120130
121131 return 0 ;
0 commit comments