blob: 379549dbc32d63d7229d25d61778a791fff151cf [file] [log] [blame]
gokulsanker138ceba2021-04-05 13:25:25 +05301#include "firmware_update.h"
gokulsankereca3e192021-04-05 14:57:41 +05302#include <endian.h>
gokulsankere1fb7a82021-04-05 16:09:29 +05303#include <string.h>
gokulsanker138ceba2021-04-05 13:25:25 +05304
Tom Joseph763b51e2021-06-05 04:50:47 -07005/** @brief Check whether string type value is valid
6 *
7 * @return true if string type value is valid, false if not
8 */
9static bool is_string_type_valid(uint8_t string_type)
10{
11 switch (string_type) {
12 case PLDM_STR_TYPE_UNKNOWN:
Tom Josephbc44b7b2021-06-19 01:13:52 -070013 return false;
Tom Joseph763b51e2021-06-05 04:50:47 -070014 case PLDM_STR_TYPE_ASCII:
15 case PLDM_STR_TYPE_UTF_8:
16 case PLDM_STR_TYPE_UTF_16:
17 case PLDM_STR_TYPE_UTF_16LE:
18 case PLDM_STR_TYPE_UTF_16BE:
19 return true;
20 default:
21 return false;
22 }
23}
24
25/** @brief Return the length of the descriptor type described in firmware update
26 * specification
27 *
28 * @return length of the descriptor type if descriptor type is valid else
29 * return 0
30 */
31static uint16_t get_descriptor_type_length(uint16_t descriptor_type)
32{
33 switch (descriptor_type) {
34
35 case PLDM_FWUP_PCI_VENDOR_ID:
36 return PLDM_FWUP_PCI_VENDOR_ID_LENGTH;
37 case PLDM_FWUP_IANA_ENTERPRISE_ID:
38 return PLDM_FWUP_IANA_ENTERPRISE_ID_LENGTH;
39 case PLDM_FWUP_UUID:
40 return PLDM_FWUP_UUID_LENGTH;
41 case PLDM_FWUP_PNP_VENDOR_ID:
42 return PLDM_FWUP_PNP_VENDOR_ID_LENGTH;
43 case PLDM_FWUP_ACPI_VENDOR_ID:
44 return PLDM_FWUP_ACPI_VENDOR_ID_LENGTH;
45 case PLDM_FWUP_IEEE_ASSIGNED_COMPANY_ID:
46 return PLDM_FWUP_IEEE_ASSIGNED_COMPANY_ID_LENGTH;
47 case PLDM_FWUP_SCSI_VENDOR_ID:
48 return PLDM_FWUP_SCSI_VENDOR_ID_LENGTH;
49 case PLDM_FWUP_PCI_DEVICE_ID:
50 return PLDM_FWUP_PCI_DEVICE_ID_LENGTH;
51 case PLDM_FWUP_PCI_SUBSYSTEM_VENDOR_ID:
52 return PLDM_FWUP_PCI_SUBSYSTEM_VENDOR_ID_LENGTH;
53 case PLDM_FWUP_PCI_SUBSYSTEM_ID:
54 return PLDM_FWUP_PCI_SUBSYSTEM_ID_LENGTH;
55 case PLDM_FWUP_PCI_REVISION_ID:
56 return PLDM_FWUP_PCI_REVISION_ID_LENGTH;
57 case PLDM_FWUP_PNP_PRODUCT_IDENTIFIER:
58 return PLDM_FWUP_PNP_PRODUCT_IDENTIFIER_LENGTH;
59 case PLDM_FWUP_ACPI_PRODUCT_IDENTIFIER:
60 return PLDM_FWUP_ACPI_PRODUCT_IDENTIFIER_LENGTH;
61 case PLDM_FWUP_ASCII_MODEL_NUMBER_LONG_STRING:
62 return PLDM_FWUP_ASCII_MODEL_NUMBER_LONG_STRING_LENGTH;
63 case PLDM_FWUP_ASCII_MODEL_NUMBER_SHORT_STRING:
64 return PLDM_FWUP_ASCII_MODEL_NUMBER_SHORT_STRING_LENGTH;
65 case PLDM_FWUP_SCSI_PRODUCT_ID:
66 return PLDM_FWUP_SCSI_PRODUCT_ID_LENGTH;
67 case PLDM_FWUP_UBM_CONTROLLER_DEVICE_CODE:
68 return PLDM_FWUP_UBM_CONTROLLER_DEVICE_CODE_LENGTH;
69 default:
70 return 0;
71 }
72}
73
Tom Joseph568e4702021-06-07 22:15:49 -070074int decode_pldm_package_header_info(
75 const uint8_t *data, size_t length,
76 struct pldm_package_header_information *package_header_info,
77 struct variable_field *package_version_str)
78{
79 if (data == NULL || package_header_info == NULL ||
80 package_version_str == NULL) {
81 return PLDM_ERROR_INVALID_DATA;
82 }
83
84 if (length < sizeof(struct pldm_package_header_information)) {
85 return PLDM_ERROR_INVALID_LENGTH;
86 }
87
88 struct pldm_package_header_information *data_header =
89 (struct pldm_package_header_information *)(data);
90
91 if (!is_string_type_valid(data_header->package_version_string_type) ||
92 (data_header->package_version_string_length == 0)) {
93 return PLDM_ERROR_INVALID_DATA;
94 }
95
96 if (length < sizeof(struct pldm_package_header_information) +
97 data_header->package_version_string_length) {
98 return PLDM_ERROR_INVALID_LENGTH;
99 }
100
101 if ((data_header->component_bitmap_bit_length %
102 PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) != 0) {
103 return PLDM_ERROR_INVALID_DATA;
104 }
105
106 memcpy(package_header_info->uuid, data_header->uuid,
107 sizeof(data_header->uuid));
108 package_header_info->package_header_format_version =
109 data_header->package_header_format_version;
110 package_header_info->package_header_size =
111 le16toh(data_header->package_header_size);
112 memcpy(package_header_info->timestamp104, data_header->timestamp104,
113 sizeof(data_header->timestamp104));
114 package_header_info->component_bitmap_bit_length =
115 le16toh(data_header->component_bitmap_bit_length);
116 package_header_info->package_version_string_type =
117 data_header->package_version_string_type;
118 package_header_info->package_version_string_length =
119 data_header->package_version_string_length;
120 package_version_str->ptr =
121 data + sizeof(struct pldm_package_header_information);
122 package_version_str->length =
123 package_header_info->package_version_string_length;
124
125 return PLDM_SUCCESS;
126}
127
Tom Joseph64af3452021-06-08 04:05:28 -0700128int decode_firmware_device_id_record(
129 const uint8_t *data, size_t length, uint16_t component_bitmap_bit_length,
130 struct pldm_firmware_device_id_record *fw_device_id_record,
131 struct variable_field *applicable_components,
132 struct variable_field *comp_image_set_version_str,
133 struct variable_field *record_descriptors,
134 struct variable_field *fw_device_pkg_data)
135{
136 if (data == NULL || fw_device_id_record == NULL ||
137 applicable_components == NULL ||
138 comp_image_set_version_str == NULL || record_descriptors == NULL ||
139 fw_device_pkg_data == NULL) {
140 return PLDM_ERROR_INVALID_DATA;
141 }
142
143 if (length < sizeof(struct pldm_firmware_device_id_record)) {
144 return PLDM_ERROR_INVALID_LENGTH;
145 }
146
147 if ((component_bitmap_bit_length %
148 PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) != 0) {
149 return PLDM_ERROR_INVALID_DATA;
150 }
151
152 struct pldm_firmware_device_id_record *data_record =
153 (struct pldm_firmware_device_id_record *)(data);
154
155 if (!is_string_type_valid(
156 data_record->comp_image_set_version_string_type) ||
157 (data_record->comp_image_set_version_string_length == 0)) {
158 return PLDM_ERROR_INVALID_DATA;
159 }
160
161 fw_device_id_record->record_length =
162 le16toh(data_record->record_length);
163 fw_device_id_record->descriptor_count = data_record->descriptor_count;
164 fw_device_id_record->device_update_option_flags.value =
165 le32toh(data_record->device_update_option_flags.value);
166 fw_device_id_record->comp_image_set_version_string_type =
167 data_record->comp_image_set_version_string_type;
168 fw_device_id_record->comp_image_set_version_string_length =
169 data_record->comp_image_set_version_string_length;
170 fw_device_id_record->fw_device_pkg_data_length =
171 le16toh(data_record->fw_device_pkg_data_length);
172
173 if (length < fw_device_id_record->record_length) {
174 return PLDM_ERROR_INVALID_LENGTH;
175 }
176
177 uint16_t applicable_components_length =
178 component_bitmap_bit_length / PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE;
179 uint16_t calc_min_record_length =
180 sizeof(struct pldm_firmware_device_id_record) +
181 applicable_components_length +
182 data_record->comp_image_set_version_string_length +
183 PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN +
184 fw_device_id_record->fw_device_pkg_data_length;
185
186 if (fw_device_id_record->record_length < calc_min_record_length) {
187 return PLDM_ERROR_INVALID_LENGTH;
188 }
189
190 applicable_components->ptr =
191 data + sizeof(struct pldm_firmware_device_id_record);
192 applicable_components->length = applicable_components_length;
193
194 comp_image_set_version_str->ptr =
195 applicable_components->ptr + applicable_components->length;
196 comp_image_set_version_str->length =
197 fw_device_id_record->comp_image_set_version_string_length;
198
199 record_descriptors->ptr = comp_image_set_version_str->ptr +
200 comp_image_set_version_str->length;
201 record_descriptors->length =
202 fw_device_id_record->record_length -
203 sizeof(struct pldm_firmware_device_id_record) -
204 applicable_components_length -
205 fw_device_id_record->comp_image_set_version_string_length -
206 fw_device_id_record->fw_device_pkg_data_length;
207
208 if (fw_device_id_record->fw_device_pkg_data_length) {
209 fw_device_pkg_data->ptr =
210 record_descriptors->ptr + record_descriptors->length;
211 fw_device_pkg_data->length =
212 fw_device_id_record->fw_device_pkg_data_length;
213 }
214
215 return PLDM_SUCCESS;
216}
217
Tom Joseph763b51e2021-06-05 04:50:47 -0700218int decode_descriptor_type_length_value(const uint8_t *data, size_t length,
219 uint16_t *descriptor_type,
220 struct variable_field *descriptor_data)
221{
222 uint16_t descriptor_length = 0;
223
224 if (data == NULL || descriptor_type == NULL ||
225 descriptor_data == NULL) {
226 return PLDM_ERROR_INVALID_DATA;
227 }
228
229 if (length < PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN) {
230 return PLDM_ERROR_INVALID_LENGTH;
231 }
232
233 struct pldm_descriptor_tlv *entry =
234 (struct pldm_descriptor_tlv *)(data);
235
236 *descriptor_type = le16toh(entry->descriptor_type);
237 descriptor_length = le16toh(entry->descriptor_length);
238 if (*descriptor_type != PLDM_FWUP_VENDOR_DEFINED) {
239 if (descriptor_length !=
240 get_descriptor_type_length(*descriptor_type)) {
241 return PLDM_ERROR_INVALID_LENGTH;
242 }
243 }
244
245 if (length < (sizeof(*descriptor_type) + sizeof(descriptor_length) +
246 descriptor_length)) {
247 return PLDM_ERROR_INVALID_LENGTH;
248 }
249
250 descriptor_data->ptr = entry->descriptor_data;
251 descriptor_data->length = descriptor_length;
252
253 return PLDM_SUCCESS;
254}
255
256int decode_vendor_defined_descriptor_value(
257 const uint8_t *data, size_t length, uint8_t *descriptor_title_str_type,
258 struct variable_field *descriptor_title_str,
259 struct variable_field *descriptor_data)
260{
261 if (data == NULL || descriptor_title_str_type == NULL ||
262 descriptor_title_str == NULL || descriptor_data == NULL) {
263 return PLDM_ERROR_INVALID_DATA;
264 }
265
266 if (length < sizeof(struct pldm_vendor_defined_descriptor_title_data)) {
267 return PLDM_ERROR_INVALID_LENGTH;
268 }
269
270 struct pldm_vendor_defined_descriptor_title_data *entry =
271 (struct pldm_vendor_defined_descriptor_title_data *)(data);
272 if (!is_string_type_valid(
273 entry->vendor_defined_descriptor_title_str_type) ||
274 (entry->vendor_defined_descriptor_title_str_len == 0)) {
275 return PLDM_ERROR_INVALID_DATA;
276 }
277
278 // Assuming atleast 1 byte of VendorDefinedDescriptorData
279 if (length < (sizeof(struct pldm_vendor_defined_descriptor_title_data) +
280 entry->vendor_defined_descriptor_title_str_len)) {
281 return PLDM_ERROR_INVALID_LENGTH;
282 }
283
284 *descriptor_title_str_type =
285 entry->vendor_defined_descriptor_title_str_type;
286 descriptor_title_str->ptr = entry->vendor_defined_descriptor_title_str;
287 descriptor_title_str->length =
288 entry->vendor_defined_descriptor_title_str_len;
289
290 descriptor_data->ptr =
291 descriptor_title_str->ptr + descriptor_title_str->length;
292 descriptor_data->length =
293 length - sizeof(entry->vendor_defined_descriptor_title_str_type) -
294 sizeof(entry->vendor_defined_descriptor_title_str_len) -
295 descriptor_title_str->length;
296
297 return PLDM_SUCCESS;
298}
299
gokulsanker138ceba2021-04-05 13:25:25 +0530300int encode_query_device_identifiers_req(uint8_t instance_id,
301 size_t payload_length,
302 struct pldm_msg *msg)
303{
304 if (msg == NULL) {
305 return PLDM_ERROR_INVALID_DATA;
306 }
307
308 if (payload_length != PLDM_QUERY_DEVICE_IDENTIFIERS_REQ_BYTES) {
309 return PLDM_ERROR_INVALID_LENGTH;
310 }
311
312 return encode_pldm_header_only(PLDM_REQUEST, instance_id, PLDM_FWUP,
313 PLDM_QUERY_DEVICE_IDENTIFIERS, msg);
314}
gokulsankereca3e192021-04-05 14:57:41 +0530315
316int decode_query_device_identifiers_resp(const struct pldm_msg *msg,
317 size_t payload_length,
318 uint8_t *completion_code,
319 uint32_t *device_identifiers_len,
320 uint8_t *descriptor_count,
321 uint8_t **descriptor_data)
322{
323 if (msg == NULL || completion_code == NULL ||
324 device_identifiers_len == NULL || descriptor_count == NULL ||
325 descriptor_data == NULL) {
326 return PLDM_ERROR_INVALID_DATA;
327 }
328
329 *completion_code = msg->payload[0];
330 if (PLDM_SUCCESS != *completion_code) {
331 return PLDM_SUCCESS;
332 }
333
334 if (payload_length <
335 sizeof(struct pldm_query_device_identifiers_resp)) {
336 return PLDM_ERROR_INVALID_LENGTH;
337 }
338
339 struct pldm_query_device_identifiers_resp *response =
340 (struct pldm_query_device_identifiers_resp *)msg->payload;
341 *device_identifiers_len = le32toh(response->device_identifiers_len);
342
343 if (*device_identifiers_len < PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN) {
344 return PLDM_ERROR_INVALID_LENGTH;
345 }
346
347 if (payload_length !=
348 sizeof(struct pldm_query_device_identifiers_resp) +
349 *device_identifiers_len) {
350 return PLDM_ERROR_INVALID_LENGTH;
351 }
352 *descriptor_count = response->descriptor_count;
353
354 if (*descriptor_count == 0) {
355 return PLDM_ERROR_INVALID_DATA;
356 }
gokulsankereca3e192021-04-05 14:57:41 +0530357 *descriptor_data =
358 (uint8_t *)(msg->payload +
359 sizeof(struct pldm_query_device_identifiers_resp));
360 return PLDM_SUCCESS;
361}
gokulsanker981fbfb2021-04-05 15:17:25 +0530362
363int encode_get_firmware_parameters_req(uint8_t instance_id,
364 size_t payload_length,
365 struct pldm_msg *msg)
366{
367 if (msg == NULL) {
368 return PLDM_ERROR_INVALID_DATA;
369 }
370
371 if (payload_length != PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES) {
372 return PLDM_ERROR_INVALID_LENGTH;
373 }
374
375 return encode_pldm_header_only(PLDM_REQUEST, instance_id, PLDM_FWUP,
376 PLDM_GET_FIRMWARE_PARAMETERS, msg);
377}
gokulsanker22fbb342021-04-05 15:55:06 +0530378
Tom Joseph3fd3eb82021-06-18 04:13:29 -0700379int decode_get_firmware_parameters_resp(
gokulsanker22fbb342021-04-05 15:55:06 +0530380 const struct pldm_msg *msg, size_t payload_length,
381 struct pldm_get_firmware_parameters_resp *resp_data,
382 struct variable_field *active_comp_image_set_ver_str,
Tom Joseph3fd3eb82021-06-18 04:13:29 -0700383 struct variable_field *pending_comp_image_set_ver_str,
384 struct variable_field *comp_parameter_table)
gokulsanker22fbb342021-04-05 15:55:06 +0530385{
386 if (msg == NULL || resp_data == NULL ||
387 active_comp_image_set_ver_str == NULL ||
Tom Joseph3fd3eb82021-06-18 04:13:29 -0700388 pending_comp_image_set_ver_str == NULL ||
389 comp_parameter_table == NULL) {
gokulsanker22fbb342021-04-05 15:55:06 +0530390 return PLDM_ERROR_INVALID_DATA;
391 }
392
393 if (payload_length < sizeof(struct pldm_get_firmware_parameters_resp)) {
394 return PLDM_ERROR_INVALID_LENGTH;
395 }
396
397 struct pldm_get_firmware_parameters_resp *response =
398 (struct pldm_get_firmware_parameters_resp *)msg->payload;
399
400 resp_data->completion_code = response->completion_code;
401
402 if (PLDM_SUCCESS != resp_data->completion_code) {
403 return PLDM_SUCCESS;
404 }
405
Tom Joseph3fd3eb82021-06-18 04:13:29 -0700406 if (!is_string_type_valid(
407 response->active_comp_image_set_ver_str_type) ||
408 (response->active_comp_image_set_ver_str_len == 0)) {
gokulsanker22fbb342021-04-05 15:55:06 +0530409 return PLDM_ERROR_INVALID_DATA;
410 }
411
Tom Joseph3fd3eb82021-06-18 04:13:29 -0700412 if (response->pending_comp_image_set_ver_str_len == 0) {
413 if (response->pending_comp_image_set_ver_str_type !=
414 PLDM_STR_TYPE_UNKNOWN) {
415 return PLDM_ERROR_INVALID_DATA;
416 }
417 } else {
418 if (!is_string_type_valid(
419 response->pending_comp_image_set_ver_str_type)) {
420 return PLDM_ERROR_INVALID_DATA;
421 }
422 }
gokulsanker22fbb342021-04-05 15:55:06 +0530423
Tom Joseph3fd3eb82021-06-18 04:13:29 -0700424 size_t partial_response_length =
425 sizeof(struct pldm_get_firmware_parameters_resp) +
426 response->active_comp_image_set_ver_str_len +
427 response->pending_comp_image_set_ver_str_len;
428
429 if (payload_length < partial_response_length) {
gokulsanker22fbb342021-04-05 15:55:06 +0530430 return PLDM_ERROR_INVALID_LENGTH;
431 }
432
433 resp_data->capabilities_during_update.value =
434 le32toh(response->capabilities_during_update.value);
gokulsanker22fbb342021-04-05 15:55:06 +0530435 resp_data->comp_count = le16toh(response->comp_count);
gokulsanker22fbb342021-04-05 15:55:06 +0530436 resp_data->active_comp_image_set_ver_str_type =
437 response->active_comp_image_set_ver_str_type;
438 resp_data->active_comp_image_set_ver_str_len =
439 response->active_comp_image_set_ver_str_len;
440 resp_data->pending_comp_image_set_ver_str_type =
441 response->pending_comp_image_set_ver_str_type;
442 resp_data->pending_comp_image_set_ver_str_len =
443 response->pending_comp_image_set_ver_str_len;
444
445 active_comp_image_set_ver_str->ptr =
446 msg->payload + sizeof(struct pldm_get_firmware_parameters_resp);
447 active_comp_image_set_ver_str->length =
448 resp_data->active_comp_image_set_ver_str_len;
449
450 if (resp_data->pending_comp_image_set_ver_str_len != 0) {
451 pending_comp_image_set_ver_str->ptr =
452 msg->payload +
453 sizeof(struct pldm_get_firmware_parameters_resp) +
454 resp_data->active_comp_image_set_ver_str_len;
455 pending_comp_image_set_ver_str->length =
456 resp_data->pending_comp_image_set_ver_str_len;
457 } else {
458 pending_comp_image_set_ver_str->ptr = NULL;
459 pending_comp_image_set_ver_str->length = 0;
460 }
461
Tom Joseph3fd3eb82021-06-18 04:13:29 -0700462 if (payload_length > partial_response_length && resp_data->comp_count) {
463 comp_parameter_table->ptr =
464 msg->payload +
465 sizeof(struct pldm_get_firmware_parameters_resp) +
466 resp_data->active_comp_image_set_ver_str_len +
467 resp_data->pending_comp_image_set_ver_str_len;
468 comp_parameter_table->length =
469 payload_length - partial_response_length;
470 } else {
471 comp_parameter_table->ptr = NULL;
472 comp_parameter_table->length = 0;
473 }
474
gokulsanker22fbb342021-04-05 15:55:06 +0530475 return PLDM_SUCCESS;
476}
gokulsankere1fb7a82021-04-05 16:09:29 +0530477
478int decode_get_firmware_parameters_resp_comp_entry(
479 const uint8_t *data, size_t length,
480 struct pldm_component_parameter_entry *component_data,
481 struct variable_field *active_comp_ver_str,
482 struct variable_field *pending_comp_ver_str)
483{
484 if (data == NULL || component_data == NULL ||
485 active_comp_ver_str == NULL || pending_comp_ver_str == NULL) {
486 return PLDM_ERROR_INVALID_DATA;
487 }
488
489 if (length < sizeof(struct pldm_component_parameter_entry)) {
490 return PLDM_ERROR_INVALID_LENGTH;
491 }
492
493 struct pldm_component_parameter_entry *entry =
494 (struct pldm_component_parameter_entry *)(data);
495 if (entry->active_comp_ver_str_len == 0) {
496 return PLDM_ERROR_INVALID_LENGTH;
497 }
498
499 size_t entry_length = sizeof(struct pldm_component_parameter_entry) +
500 entry->active_comp_ver_str_len +
501 entry->pending_comp_ver_str_len;
502
503 if (length != entry_length) {
504 return PLDM_ERROR_INVALID_LENGTH;
505 }
506
507 component_data->comp_classification =
508 le16toh(entry->comp_classification);
509 component_data->comp_identifier = le16toh(entry->comp_identifier);
510 component_data->comp_classification_index =
511 entry->comp_classification_index;
512 component_data->active_comp_comparison_stamp =
513 le32toh(entry->active_comp_comparison_stamp);
514 component_data->active_comp_ver_str_type =
515 entry->active_comp_ver_str_type;
516 component_data->active_comp_ver_str_len =
517 entry->active_comp_ver_str_len;
518 memcpy(component_data->active_comp_release_date,
519 entry->active_comp_release_date,
520 sizeof(entry->active_comp_release_date));
521 component_data->pending_comp_comparison_stamp =
522 le32toh(entry->pending_comp_comparison_stamp);
523 component_data->pending_comp_ver_str_type =
524 entry->pending_comp_ver_str_type;
525 component_data->pending_comp_ver_str_len =
526 entry->pending_comp_ver_str_len;
527 memcpy(component_data->pending_comp_release_date,
528 entry->pending_comp_release_date,
529 sizeof(entry->pending_comp_release_date));
530 component_data->comp_activation_methods.value =
531 le16toh(entry->comp_activation_methods.value);
532 component_data->capabilities_during_update.value =
533 le32toh(entry->capabilities_during_update.value);
534
535 active_comp_ver_str->ptr =
536 data + sizeof(struct pldm_component_parameter_entry);
537 active_comp_ver_str->length = entry->active_comp_ver_str_len;
538
539 if (entry->pending_comp_ver_str_len != 0) {
540
541 pending_comp_ver_str->ptr =
542 data + sizeof(struct pldm_component_parameter_entry) +
543 entry->active_comp_ver_str_len;
544 pending_comp_ver_str->length = entry->pending_comp_ver_str_len;
545 } else {
546 pending_comp_ver_str->ptr = NULL;
547 pending_comp_ver_str->length = 0;
548 }
549 return PLDM_SUCCESS;
550}