LCOV - code coverage report
Current view: top level - spdm_common_lib - libspdm_com_event.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 92.0 % 50 46
Test Date: 2026-10-01 20:56:25 Functions: 100.0 % 3 3
Branches: 73.3 % 15 11

             Branch data     Line data    Source code
       1                 :             : /**
       2                 :             :  *  Copyright Notice:
       3                 :             :  *  Copyright 2025 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_common_lib.h"
       8                 :             : 
       9                 :             : #if LIBSPDM_EVENT_RECIPIENT_SUPPORT
      10                 :             : 
      11                 :          27 : bool libspdm_validate_dmtf_event_type(uint16_t event_type_id, uint16_t event_detail_len)
      12                 :             : {
      13   [ +  +  +  +  :          27 :     switch (event_type_id) {
                      - ]
      14                 :          15 :     case SPDM_DMTF_EVENT_TYPE_EVENT_LOST:
      15                 :          15 :         return (event_detail_len == SPDM_DMTF_EVENT_TYPE_EVENT_LOST_SIZE);
      16                 :           2 :     case SPDM_DMTF_EVENT_TYPE_MEASUREMENT_CHANGED:
      17                 :           2 :         return (event_detail_len == SPDM_DMTF_EVENT_TYPE_MEASUREMENT_CHANGED_SIZE);
      18                 :           2 :     case SPDM_DMTF_EVENT_TYPE_MEASUREMENT_PRE_UPDATE:
      19                 :           2 :         return (event_detail_len == SPDM_DMTF_EVENT_TYPE_MEASUREMENT_PRE_UPDATE_SIZE);
      20                 :           8 :     case SPDM_DMTF_EVENT_TYPE_CERTIFICATE_CHANGED:
      21                 :           8 :         return (event_detail_len == SPDM_DMTF_EVENT_TYPE_CERTIFICATE_CHANGED_SIZE);
      22                 :           0 :     default:
      23                 :           0 :         return false;
      24                 :             :     }
      25                 :             : }
      26                 :             : 
      27                 :          19 : bool libspdm_parse_and_send_event(libspdm_context_t *context, uint32_t session_id,
      28                 :             :                                   const void *event_data, const void **next_event_data)
      29                 :             : {
      30                 :             :     libspdm_return_t status;
      31                 :             :     const uint8_t *ptr;
      32                 :             :     uint32_t event_instance_id;
      33                 :             :     uint8_t svh_id;
      34                 :             :     uint8_t svh_vendor_id_len;
      35                 :             :     const void *svh_vendor_id;
      36                 :             :     uint16_t event_type_id;
      37                 :             :     uint16_t event_detail_len;
      38                 :             : 
      39         [ -  + ]:          19 :     LIBSPDM_ASSERT(context->process_event != NULL);
      40                 :             : 
      41                 :          19 :     ptr = event_data;
      42                 :          19 :     event_instance_id = libspdm_read_uint32(ptr);
      43                 :             : 
      44                 :          19 :     ptr += sizeof(uint32_t);
      45                 :          19 :     ptr += sizeof(uint32_t);
      46                 :          19 :     svh_id = *ptr;
      47                 :          19 :     ptr++;
      48                 :          19 :     svh_vendor_id_len = *ptr;
      49                 :          19 :     ptr++;
      50                 :             : 
      51         [ +  - ]:          19 :     if (svh_vendor_id_len == 0) {
      52                 :          19 :         svh_vendor_id = NULL;
      53                 :             :     } else {
      54                 :           0 :         svh_vendor_id = ptr;
      55                 :             :     }
      56                 :          19 :     ptr += svh_vendor_id_len;
      57                 :             : 
      58                 :          19 :     event_type_id = libspdm_read_uint16(ptr);
      59                 :          19 :     ptr += sizeof(uint16_t);
      60                 :          19 :     event_detail_len = libspdm_read_uint16(ptr);
      61                 :          19 :     ptr += sizeof(uint16_t);
      62                 :             : 
      63                 :          19 :     status = context->process_event(context, session_id, event_instance_id, svh_id,
      64                 :             :                                     svh_vendor_id_len, svh_vendor_id, event_type_id,
      65                 :             :                                     event_detail_len, ptr);
      66                 :             : 
      67         [ +  + ]:          19 :     if (next_event_data != NULL) {
      68                 :          15 :         ptr += event_detail_len;
      69                 :          15 :         *next_event_data = ptr;
      70                 :             :     }
      71                 :             : 
      72                 :          19 :     return (status == LIBSPDM_STATUS_SUCCESS);
      73                 :             : }
      74                 :             : 
      75                 :           8 : const void *libspdm_find_event_instance_id(const void *events_list_start, uint32_t event_count,
      76                 :             :                                            uint32_t target_event_instance_id)
      77                 :             : {
      78                 :             :     uint32_t index;
      79                 :             :     const uint8_t *ptr;
      80                 :             : 
      81                 :           8 :     ptr = events_list_start;
      82                 :             : 
      83         [ +  - ]:          12 :     for (index = 0; index < event_count; index++) {
      84                 :             :         uint32_t event_instance_id;
      85                 :             : 
      86                 :          12 :         event_instance_id = libspdm_read_uint32(ptr);
      87                 :             : 
      88         [ +  + ]:          12 :         if (event_instance_id == target_event_instance_id) {
      89                 :           8 :             return ptr;
      90                 :             :         } else {
      91                 :             :             uint8_t vendor_id_len;
      92                 :             :             uint16_t event_detail_len;
      93                 :             : 
      94                 :           4 :             ptr += sizeof(uint32_t) +  sizeof(uint32_t) + sizeof(uint8_t);
      95                 :           4 :             vendor_id_len = *ptr;
      96                 :           4 :             ptr += sizeof(uint8_t);
      97                 :           4 :             ptr += vendor_id_len;
      98                 :           4 :             ptr += sizeof(uint16_t);
      99                 :           4 :             event_detail_len = libspdm_read_uint16(ptr);
     100                 :           4 :             ptr += sizeof(uint16_t);
     101                 :           4 :             ptr += event_detail_len;
     102                 :             :         }
     103                 :             :     }
     104                 :             : 
     105                 :           0 :     return NULL;
     106                 :             : }
     107                 :             : 
     108                 :             : #endif /* LIBSPDM_EVENT_RECIPIENT_SUPPORT */
        

Generated by: LCOV version 2.0-1