Branch data Line data Source code
1 : : /**
2 : : * Copyright Notice:
3 : : * Copyright 2021-2022 DMTF. All rights reserved.
4 : : * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
5 : : **/
6 : :
7 : : #include "internal/libspdm_responder_lib.h"
8 : :
9 : 0 : libspdm_return_t libspdm_responder_dispatch_message(void *spdm_context)
10 : : {
11 : : libspdm_return_t status;
12 : : libspdm_context_t *context;
13 : : uint8_t *request;
14 : : size_t request_size;
15 : : uint8_t *response;
16 : : size_t response_size;
17 : : uint32_t tmp_session_id;
18 : : uint32_t *session_id;
19 : : uint32_t *session_id_ptr;
20 : : bool is_app_message;
21 : : void *message;
22 : : size_t message_size;
23 : :
24 : 0 : context = spdm_context;
25 : :
26 : : /* receive and process request message */
27 : 0 : status = libspdm_acquire_receiver_buffer (context, &message_size, (void **)&message);
28 [ # # ]: 0 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
29 : 0 : return status;
30 : : }
31 : 0 : request = message;
32 : 0 : request_size = message_size;
33 : : #if LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP
34 : : /* need get real receiver buffer, because acquire receiver buffer will return scratch buffer*/
35 : 0 : libspdm_get_receiver_buffer (context, (void **)&request, &request_size);
36 : : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP */
37 : 0 : status = context->receive_message(context, &request_size, (void **)&request, 0);
38 [ # # ]: 0 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
39 : 0 : libspdm_release_receiver_buffer (context);
40 : 0 : return status;
41 : : }
42 : 0 : status = libspdm_process_request(context, &session_id, &is_app_message,
43 : : request_size, request);
44 [ # # ]: 0 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
45 : 0 : libspdm_release_receiver_buffer (context);
46 : 0 : return status;
47 : : }
48 : :
49 : : /* save the value of session_id */
50 [ # # ]: 0 : if (session_id != NULL) {
51 : 0 : tmp_session_id = *session_id;
52 : 0 : session_id_ptr = &tmp_session_id;
53 : : } else {
54 : 0 : session_id_ptr = NULL;
55 : : }
56 : : /* release buffer after use session_id, before acquire buffer */
57 : 0 : libspdm_release_receiver_buffer (context);
58 : :
59 : : /* build and send response message */
60 : 0 : status = libspdm_acquire_sender_buffer (context, &message_size, (void **)&message);
61 [ # # ]: 0 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
62 : 0 : return status;
63 : : }
64 : 0 : response = message;
65 : 0 : response_size = message_size;
66 : 0 : libspdm_zero_mem(response, response_size);
67 : :
68 : 0 : status = libspdm_build_response(context, session_id_ptr, is_app_message,
69 : : &response_size, (void **)&response);
70 [ # # ]: 0 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
71 : 0 : libspdm_release_sender_buffer (context);
72 : 0 : return status;
73 : : }
74 : :
75 : 0 : status = context->send_message(context, response_size, response, 0);
76 : :
77 : 0 : libspdm_release_sender_buffer (context);
78 : :
79 : 0 : return status;
80 : : }
|