@@ -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,6 +995,15 @@ static int handle_control_get_message_type_support(
992995
993996 req = (void * )buf ;
994997 type_count = ctx -> num_supported_msg_types ;
998+
999+ for (i = 0 ; i < ctx -> num_supported_vdm_types ; i ++ ) {
1000+ pcie_support |= ctx -> supported_vdm_types [i ].format ==
1001+ VID_FORMAT_PCIE ;
1002+ iana_support |= ctx -> supported_vdm_types [i ].format ==
1003+ VID_FORMAT_IANA ;
1004+ }
1005+ type_count += (pcie_support + iana_support );
1006+
9951007 // Allocate extra space for the message types
9961008 resp_len = sizeof (* resp ) + type_count ;
9971009 resp_buf = malloc (resp_len );
@@ -1004,13 +1016,19 @@ static int handle_control_get_message_type_support(
10041016 mctp_ctrl_msg_hdr_init_resp (& resp -> ctrl_hdr , req -> ctrl_hdr );
10051017 resp -> completion_code = MCTP_CTRL_CC_SUCCESS ;
10061018
1007- resp -> msg_type_count = type_count ;
10081019 // Append message types after msg_type_count
10091020 msg_types = (uint8_t * )(resp + 1 );
1010- for (i = 0 ; i < type_count ; i ++ ) {
1021+ for (i = 0 ; i < ctx -> num_supported_msg_types ; i ++ ) {
10111022 msg_types [i ] = ctx -> supported_msg_types [i ].msg_type ;
10121023 }
1024+ if (pcie_support ) {
1025+ msg_types [i ++ ] = MCTP_TYPE_VENDOR_PCIE ;
1026+ }
1027+ if (iana_support ) {
1028+ msg_types [i ++ ] = MCTP_TYPE_VENDOR_IANA ;
1029+ }
10131030
1031+ resp -> msg_type_count = type_count ;
10141032 rc = reply_message (ctx , sd , resp , resp_len , addr );
10151033 free (resp_buf );
10161034
@@ -3551,6 +3569,10 @@ static int method_register_type_support(sd_bus_message *call, void *data,
35513569 rc = sd_bus_message_read (call , "y" , & msg_type );
35523570 if (rc < 0 )
35533571 goto err ;
3572+ if (msg_type == 0 || msg_type >= MCTP_TYPE_VENDOR_PCIE ) {
3573+ return sd_bus_error_setf (berr , SD_BUS_ERROR_INVALID_ARGS ,
3574+ "Invalid message type %d" , msg_type );
3575+ }
35543576 rc = sd_bus_message_read_array (call , 'u' , (const void * * )& versions ,
35553577 & versions_len );
35563578 if (rc < 0 )
0 commit comments