in common/pldm/pldm.c [87:131]
static uint8_t pldm_resp_msg_process(mctp *mctp_inst, uint8_t *buf, uint32_t len,
mctp_ext_params ext_params)
{
if (!mctp_inst || !buf || !len)
return PLDM_ERROR;
pldm_hdr *hdr = (pldm_hdr *)buf;
sys_snode_t *node;
sys_snode_t *s_node;
sys_snode_t *pre_node = NULL;
sys_snode_t *found_node = NULL;
if (k_mutex_lock(&wait_recv_resp_mutex, K_MSEC(PLDM_RESP_MSG_PROC_MUTEX_TIMEOUT_MS))) {
LOG_WRN("pldm mutex is locked over %d ms!!", PLDM_RESP_MSG_PROC_MUTEX_TIMEOUT_MS);
return PLDM_ERROR;
}
SYS_SLIST_FOR_EACH_NODE_SAFE (&wait_recv_resp_list, node, s_node) {
wait_msg *p = (wait_msg *)node;
/* found the proper handler */
if ((p->msg.hdr.inst_id == hdr->inst_id) &&
(p->msg.hdr.pldm_type == hdr->pldm_type) && (p->msg.hdr.cmd == hdr->cmd) &&
(p->mctp_inst == mctp_inst)) {
found_node = node;
sys_slist_remove(&wait_recv_resp_list, pre_node, node);
break;
} else {
pre_node = node;
}
}
k_mutex_unlock(&wait_recv_resp_mutex);
if (found_node) {
/* invoke resp handler */
wait_msg *p = (wait_msg *)found_node;
if (p->msg.recv_resp_cb_fn)
/* remove pldm header for handler */
p->msg.recv_resp_cb_fn(p->msg.recv_resp_cb_args, buf + sizeof(p->msg.hdr),
len - sizeof(p->msg.hdr));
free(p);
}
return PLDM_SUCCESS;
}