Skip to content

Commit 7448d19

Browse files
committed
mctpd: update get msg type if vdm is registered
If VDM type support is registered using dbus call RegisterVDMTypeSupport then add 7E and 7F based on the format in GetMsgType control command response Signed-off-by: Nidhin MS <nidhin.ms@intel.com>
1 parent 7ea8652 commit 7448d19

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

src/mctpd.c

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ static const char *conf_file_default = MCTPD_CONF_FILE_DEFAULT;
6161

6262
static const mctp_eid_t eid_alloc_min = 0x08;
6363
static 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
6668
static 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)

tests/test_mctpd.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1269,6 +1269,14 @@ async def test_get_message_types(dbus, mctpd, routed_ep):
12691269
mctp = await mctpd_mctp_base_iface_obj(dbus)
12701270
await mctp.call_register_type_support(5, [0xF1F2F3F4])
12711271

1272+
# Verify invalid msg type causes error
1273+
with pytest.raises(asyncdbus.errors.DBusError) as ex:
1274+
await mctp.call_register_type_support(0x0, [0xF1F2F3F4])
1275+
assert str(ex.value) == "Invalid message type 0"
1276+
with pytest.raises(asyncdbus.errors.DBusError) as ex:
1277+
await mctp.call_register_type_support(0x7e, [0xF1F2F3F4])
1278+
assert str(ex.value) == "Invalid message type 126"
1279+
12721280
# Verify get message type response includes spdm
12731281
cmd = MCTPControlCommand(True, 0, 0x05, bytes([0x00]))
12741282
rsp = await ep.send_control(mctpd.network.mctp_socket, cmd)
@@ -1333,14 +1341,24 @@ async def test_register_vdm_type_support_dbus_disconnect(mctpd, routed_ep):
13331341
async with asyncdbus.MessageBus().connect() as temp_bus:
13341342
mctp = await mctpd_mctp_base_iface_obj(temp_bus)
13351343

1336-
# Register PCIe VDM: format=0x00, VID=0xABCD, command_set=0x0001
1344+
# Register PCIe VDM: format=0x00, VID=0xABCD, command_set=1 and 2
13371345
v_type = asyncdbus.Variant('q', 0xABCD)
13381346
await mctp.call_register_vdm_type_support(0x00, v_type, 0x0001)
1347+
await mctp.call_register_vdm_type_support(0x00, v_type, 0x0002)
13391348

13401349
# Verify PCIe VDM (selector 0)
13411350
cmd = MCTPControlCommand(True, 0, 0x06, bytes([0x00]))
13421351
rsp = await ep.send_control(mctpd.network.mctp_socket, cmd)
1343-
assert rsp.hex(' ') == '00 06 00 ff 00 ab cd 00 01'
1352+
assert rsp.hex(' ') == '00 06 00 01 00 ab cd 00 01'
1353+
# Verify PCIe VDM (selector 1)
1354+
cmd = MCTPControlCommand(True, 0, 0x06, bytes([0x01]))
1355+
rsp = await ep.send_control(mctpd.network.mctp_socket, cmd)
1356+
assert rsp.hex(' ') == '00 06 00 ff 00 ab cd 00 02'
1357+
1358+
# Verify GetMsgType includes VDM
1359+
cmd = MCTPControlCommand(True, 0, 0x05)
1360+
rsp = await ep.send_control(mctpd.network.mctp_socket, cmd)
1361+
assert rsp.hex(' ') == '00 05 00 02 00 7e'
13441362

13451363
# Give mctpd a moment to process the disconnection
13461364
await trio.sleep(0.1)
@@ -1350,6 +1368,11 @@ async def test_register_vdm_type_support_dbus_disconnect(mctpd, routed_ep):
13501368
rsp = await ep.send_control(mctpd.network.mctp_socket, cmd)
13511369
assert rsp.hex(' ') == '00 06 02' # Should be error again
13521370

1371+
# Verify GetMsgType has only control command
1372+
cmd = MCTPControlCommand(True, 0, 0x05)
1373+
rsp = await ep.send_control(mctpd.network.mctp_socket, cmd)
1374+
assert rsp.hex(' ') == '00 05 00 01 00'
1375+
13531376
""" Test RegisterVDMTypeSupport error handling """
13541377
async def test_register_vdm_type_support_errors(dbus, mctpd):
13551378
mctp = await mctpd_mctp_base_iface_obj(dbus)

0 commit comments

Comments
 (0)