static int cmd_interface_spdm_process_response()

in core/spdm/cmd_interface_spdm.c [26:142]


static int cmd_interface_spdm_process_response (const struct cmd_interface *intf,
	struct cmd_interface_msg *response)
{
	struct cmd_interface_spdm *interface = (struct cmd_interface_spdm*) intf;
	uint8_t rsp_code;
	int status;

	if ((interface == NULL) || (response == NULL)) {
		return CMD_HANDLER_SPDM_INVALID_ARGUMENT;
	}

	status = spdm_get_command_id (response, &rsp_code);
	if (status != 0) {
		return status;
	}

	switch (rsp_code) {
		case SPDM_RESPONSE_GET_VERSION:
			status = spdm_process_get_version_response (response);
			if (status != 0) {
				return status;
			}
			else {
				return observable_notify_observers_with_ptr (&interface->observable,
					offsetof (struct spdm_protocol_observer, on_spdm_get_version_response),
					response);
			}

		case SPDM_RESPONSE_GET_CAPABILITIES:
			status = spdm_process_get_capabilities_response (response);
			if (status != 0) {
				return status;
			}
			else {
				return observable_notify_observers_with_ptr (&interface->observable,
					offsetof (struct spdm_protocol_observer, on_spdm_get_capabilities_response),
					response);
			}

		case SPDM_RESPONSE_NEGOTIATE_ALGORITHMS:
			status = spdm_process_negotiate_algorithms_response (response);
			if (status != 0) {
				return status;
			}
			else {
				return observable_notify_observers_with_ptr (&interface->observable,
					offsetof (struct spdm_protocol_observer, on_spdm_negotiate_algorithms_response),
					response);
			}

		case SPDM_RESPONSE_GET_DIGESTS:
			status = spdm_process_get_digests_response (response);
			if (status != 0) {
				return status;
			}
			else {
				return observable_notify_observers_with_ptr (&interface->observable,
					offsetof (struct spdm_protocol_observer, on_spdm_get_digests_response),
					response);
			}

		case SPDM_RESPONSE_GET_CERTIFICATE:
			status = spdm_process_get_certificate_response (response);
			if (status != 0) {
				return status;
			}
			else {
				return observable_notify_observers_with_ptr (&interface->observable,
					offsetof (struct spdm_protocol_observer, on_spdm_get_certificate_response),
					response);
			}

		case SPDM_RESPONSE_CHALLENGE:
			status = spdm_process_challenge_response (response);
			if (status != 0) {
				return status;
			}
			else {
				return observable_notify_observers_with_ptr (&interface->observable,
					offsetof (struct spdm_protocol_observer, on_spdm_challenge_response), response);
			}

		case SPDM_RESPONSE_GET_MEASUREMENTS:
			status = spdm_process_get_measurements_response (response);
			if (status != 0) {
				return status;
			}
			else {
				return observable_notify_observers_with_ptr (&interface->observable,
					offsetof (struct spdm_protocol_observer, on_spdm_get_measurements_response),
					response);
			}

		case SPDM_RESPONSE_ERROR:
			if (response->payload_length >= sizeof (struct spdm_error_response)) {
				struct spdm_error_response *error_msg =
					(struct spdm_error_response*) response->payload;

				if (error_msg->error_code == SPDM_ERROR_RESPONSE_NOT_READY) {
					return observable_notify_observers_with_ptr (&interface->observable,
						offsetof (struct spdm_protocol_observer, on_spdm_response_not_ready),
						response);
				}
				else {
					debug_log_create_entry (DEBUG_LOG_SEVERITY_ERROR,
						DEBUG_LOG_COMPONENT_CMD_INTERFACE, CMD_LOGGING_ERROR_MESSAGE,
						((error_msg->error_code << 24) | (response->source_eid << 16) |
									(response->target_eid << 8)), error_msg->error_data);
				}
			}

			return CMD_HANDLER_ERROR_MESSAGE;

		default:
			return CMD_HANDLER_SPDM_UNKNOWN_COMMAND;
	}
}