@@ -61,6 +61,8 @@ static const char *conf_file_default = MCTPD_CONF_FILE_DEFAULT;
6161
6262static const mctp_eid_t eid_alloc_min = 0x08 ;
6363static const mctp_eid_t eid_alloc_max = 0xfe ;
64+ static const uint8_t MCTP_TYPE_VENDOR_PCIE = 0x7e ;
65+ static const uint8_t MCTP_TYPE_VENDOR_IANA = 0x7f ;
6466
6567// arbitrary sanity
6668static size_t MAX_PEER_SIZE = 1000000 ;
@@ -981,6 +983,7 @@ static int handle_control_get_message_type_support(
981983{
982984 struct mctp_ctrl_resp_get_msg_type_support * resp = NULL ;
983985 struct mctp_ctrl_cmd_get_msg_type_support * req = NULL ;
986+ bool pcie_support = false, iana_support = false;
984987 size_t i , resp_len , type_count ;
985988 uint8_t * resp_buf , * msg_types ;
986989 int rc ;
@@ -992,8 +995,8 @@ static int handle_control_get_message_type_support(
992995
993996 req = (void * )buf ;
994997 type_count = ctx -> num_supported_msg_types ;
995- // Allocate extra space for the message types
996- resp_len = sizeof (* resp ) + type_count ;
998+ // Allocate extra space for the message types. Also two byte for PCIe or IANA VDM
999+ resp_len = sizeof (* resp ) + type_count + sizeof ( uint16_t ) ;
9971000 resp_buf = malloc (resp_len );
9981001 if (!resp_buf ) {
9991002 warnx ("Failed to allocate response buffer" );
@@ -1004,13 +1007,30 @@ static int handle_control_get_message_type_support(
10041007 mctp_ctrl_msg_hdr_init_resp (& resp -> ctrl_hdr , req -> ctrl_hdr );
10051008 resp -> completion_code = MCTP_CTRL_CC_SUCCESS ;
10061009
1007- resp -> msg_type_count = type_count ;
10081010 // Append message types after msg_type_count
10091011 msg_types = (uint8_t * )(resp + 1 );
10101012 for (i = 0 ; i < type_count ; i ++ ) {
10111013 msg_types [i ] = ctx -> supported_msg_types [i ].msg_type ;
10121014 }
10131015
1016+ // Adjust response length and find VDM support
1017+ resp_len -= sizeof (uint16_t );
1018+ for (i = 0 ; i < ctx -> num_supported_vdm_types ; i ++ ) {
1019+ if (!pcie_support &&
1020+ ctx -> supported_vdm_types [i ].format == VID_FORMAT_PCIE ) {
1021+ pcie_support = true;
1022+ msg_types [type_count ++ ] = MCTP_TYPE_VENDOR_PCIE ;
1023+ resp_len ++ ;
1024+ }
1025+ if (!iana_support &&
1026+ ctx -> supported_vdm_types [i ].format == VID_FORMAT_IANA ) {
1027+ iana_support = true;
1028+ msg_types [type_count ++ ] = MCTP_TYPE_VENDOR_IANA ;
1029+ resp_len ++ ;
1030+ }
1031+ }
1032+
1033+ resp -> msg_type_count = type_count ;
10141034 rc = reply_message (ctx , sd , resp , resp_len , addr );
10151035 free (resp_buf );
10161036
0 commit comments