Hi Vu,

Thanks you for your spent time to review. I will update.

Best Regards,
ThienHuynh

-----Original Message-----
From: Nguyen Minh Vu <vu.m.ngu...@dektech.com.au> 
Sent: Monday, February 3, 2020 4:15 PM
To: thien.m.huynh <thien.m.hu...@dektech.com.au>
Cc: opensaf-devel@lists.sourceforge.net
Subject: Re: [PATCH 1/3] log: make facility ID configurable [#3131]

Hi Thien,

Ack with comments.

Regards, Vu

On 1/20/20 2:59 PM, thien.m.huynh wrote:
> Streaming log record is packaged in RFC5424 format and they all carry a fixed
> facility ID (16). Therefore, log record receiver i.e. rsyslogd is not able to
> filter log records on their facility id such as which ones are regular logs
> or which ones are security.
>
> The ticket is to have the facility ID configurable so that the receiver can
> differentiate among types of log records based on that number.
> Configure facility id via a new attribute `saLogStreamFacilityId` in class
> `SaLogStreamConfig`. The valid range is [0-23]. The default value is 16 to 
> keep
> the streaming feature backward compatible. Always keep the value of attribute
> `saLogStreamFacilityId` in sync with the standby. If user deletes value of the
> attribute `saLogStreamFacilityId`, it will go back to the default value (16).
> ---
>   .../test_saImmOiRtObjectCreate_2.c            |   9 +-
>   .../implementer/test_saImmOiRtObjectDelete.c  |   4 +-
>   .../test_saImmOiRtObjectUpdate_2.c            |   4 +-
>   src/log/Makefile.am                           |   2 +
>   src/log/config/logsv_classes.xml              |  14 +
>   src/log/logd/lgs_cache.cc                     |  16 +-
>   src/log/logd/lgs_dest.cc                      |   1 +
>   src/log/logd/lgs_dest.h                       |   6 +-
>   src/log/logd/lgs_evt.cc                       |   8 +-
>   src/log/logd/lgs_imm.cc                       |  83 +++-
>   src/log/logd/lgs_mbcsv.cc                     | 370 +++++++++++-------
>   src/log/logd/lgs_mbcsv.h                      |  33 +-
>   src/log/logd/lgs_mbcsv_cache.cc               |  15 +-
>   src/log/logd/lgs_mbcsv_v2.cc                  |   2 +-
>   src/log/logd/lgs_mbcsv_v3.cc                  |   2 +-
>   src/log/logd/lgs_mbcsv_v5.cc                  |   4 +-
>   src/log/logd/lgs_mbcsv_v9.cc                  | 242 ++++++++++++
>   src/log/logd/lgs_mbcsv_v9.h                   |  67 ++++
>   src/log/logd/lgs_recov.cc                     |  10 +
>   src/log/logd/lgs_stream.cc                    |  13 +-
>   src/log/logd/lgs_stream.h                     |   1 +
>   src/log/logd/lgs_unixsock_dest.cc             |   5 +-
>   22 files changed, 718 insertions(+), 193 deletions(-)
>   create mode 100644 src/log/logd/lgs_mbcsv_v9.cc
>   create mode 100644 src/log/logd/lgs_mbcsv_v9.h
>
> diff --git a/src/imm/apitest/implementer/test_saImmOiRtObjectCreate_2.c 
> b/src/imm/apitest/implementer/test_saImmOiRtObjectCreate_2.c
> index df260a9d5..709332954 100644
> --- a/src/imm/apitest/implementer/test_saImmOiRtObjectCreate_2.c
> +++ b/src/imm/apitest/implementer/test_saImmOiRtObjectCreate_2.c
> @@ -59,9 +59,11 @@ static SaImmAttrValuesT_2 v10 = 
> {"saLogStreamSeverityFilter",
>                                SA_IMM_ATTR_SAUINT32T, 1, (void **)int1Values};
>   static SaImmAttrValuesT_2 v11 = {"saLogStreamCreationTimestamp",
>                                SA_IMM_ATTR_SATIMET, 1, (void **)lint1Values};
> +static SaImmAttrValuesT_2 v12 = {"saLogStreamFacilityId",
> +                             SA_IMM_ATTR_SAUINT32T, 1, (void **)int1Values};
>   
>   static const SaImmAttrValuesT_2 *attrValues[] = {
> -    &v1, &v2, &v3, &v4, &v5, &v6, &v7, &v8, &v9, &v10, &v11, NULL};
> +    &v1, &v2, &v3, &v4, &v5, &v6, &v7, &v8, &v9, &v10, &v11, &v12, NULL};
>   static const SaImmClassNameT className = "SaLogStream";
>   
>   void saImmOiRtObjectCreate_2_01(void)
> @@ -188,8 +190,9 @@ void saImmOiRtObjectCreate_2_07(void)
>       // const SaNameT *nameValues27[] = {&rdnObj27};
>       const SaImmAttrValuesT_2 v27 = {"safLgStr", SA_IMM_ATTR_SASTRINGT, 1,
>                                       (void **)nameValues27};
> -     const SaImmAttrValuesT_2 *attrValues27[] = {
> -         &v1, &v27, &v3, &v4, &v5, &v6, &v7, &v8, &v9, &v10, &v11, NULL};
> +     const SaImmAttrValuesT_2 *attrValues27[] = {&v1,  &v27, &v3, &v4, &v5,
> +                                                 &v6,  &v7,  &v8, &v9, &v10,
> +                                                 &v11, &v12, NULL};
>   
>       SaNameT tmpName;
>   
> diff --git a/src/imm/apitest/implementer/test_saImmOiRtObjectDelete.c 
> b/src/imm/apitest/implementer/test_saImmOiRtObjectDelete.c
> index 986ec88aa..341d5144a 100644
> --- a/src/imm/apitest/implementer/test_saImmOiRtObjectDelete.c
> +++ b/src/imm/apitest/implementer/test_saImmOiRtObjectDelete.c
> @@ -59,9 +59,11 @@ static SaImmAttrValuesT_2 v10 = 
> {"saLogStreamSeverityFilter",
>                                SA_IMM_ATTR_SAUINT32T, 1, (void **)int1Values};
>   static SaImmAttrValuesT_2 v11 = {"saLogStreamCreationTimestamp",
>                                SA_IMM_ATTR_SATIMET, 1, (void **)lint1Values};
> +static SaImmAttrValuesT_2 v12 = {"saLogStreamFacilityId",
> +                             SA_IMM_ATTR_SAUINT32T, 1, (void **)int1Values};
>   
>   static const SaImmAttrValuesT_2 *attrValues[] = {
> -    &v1, &v2, &v3, &v4, &v5, &v6, &v7, &v8, &v9, &v10, &v11, NULL};
> +    &v1, &v2, &v3, &v4, &v5, &v6, &v7, &v8, &v9, &v10, &v11, &v12, NULL};
>   static const SaImmClassNameT className = "SaLogStream";
>   
>   void saImmOiRtObjectDelete_01(void)
> diff --git a/src/imm/apitest/implementer/test_saImmOiRtObjectUpdate_2.c 
> b/src/imm/apitest/implementer/test_saImmOiRtObjectUpdate_2.c
> index 1a551fd9f..2f2b941dc 100644
> --- a/src/imm/apitest/implementer/test_saImmOiRtObjectUpdate_2.c
> +++ b/src/imm/apitest/implementer/test_saImmOiRtObjectUpdate_2.c
> @@ -55,9 +55,11 @@ static SaImmAttrValuesT_2 v10 = 
> {"saLogStreamSeverityFilter",
>                                SA_IMM_ATTR_SAUINT32T, 1, (void **)int1Values};
>   static SaImmAttrValuesT_2 v11 = {"saLogStreamCreationTimestamp",
>                                SA_IMM_ATTR_SATIMET, 1, (void **)lint1Values};
> +static SaImmAttrValuesT_2 v12 = {"saLogStreamFacilityId",
> +                             SA_IMM_ATTR_SAUINT32T, 1, (void **)int1Values};
>   
>   static const SaImmAttrValuesT_2 *attrValues[] = {
> -    &v1, &v2, &v3, &v4, &v5, &v6, &v7, &v8, &v9, &v10, &v11, NULL};
> +    &v1, &v2, &v3, &v4, &v5, &v6, &v7, &v8, &v9, &v10, &v11, &v12, NULL};
>   
>   static const SaImmClassNameT className = "SaLogStream";
>   
> diff --git a/src/log/Makefile.am b/src/log/Makefile.am
> index 767e25369..a2a98baec 100644
> --- a/src/log/Makefile.am
> +++ b/src/log/Makefile.am
> @@ -87,6 +87,7 @@ noinst_HEADERS += \
>       src/log/logd/lgs_mbcsv_v3.h \
>       src/log/logd/lgs_mbcsv_v5.h \
>       src/log/logd/lgs_mbcsv_v6.h \
> +     src/log/logd/lgs_mbcsv_v9.h \
>       src/log/logd/lgs_oi_admin.h \
>       src/log/logd/lgs_recov.h \
>       src/log/logd/lgs_stream.h \
> @@ -151,6 +152,7 @@ bin_osaflogd_SOURCES = \
>       src/log/logd/lgs_mbcsv_v3.cc \
>       src/log/logd/lgs_mbcsv_v5.cc \
>       src/log/logd/lgs_mbcsv_v6.cc \
> +     src/log/logd/lgs_mbcsv_v9.cc \
>       src/log/logd/lgs_mds.cc \
>       src/log/logd/lgs_oi_admin.cc \
>       src/log/logd/lgs_recov.cc \
> diff --git a/src/log/config/logsv_classes.xml 
> b/src/log/config/logsv_classes.xml
> index 084e8915d..8aa8e69c2 100644
> --- a/src/log/config/logsv_classes.xml
> +++ b/src/log/config/logsv_classes.xml
> @@ -78,6 +78,12 @@
>                       <type>SA_UINT64_T</type>
>                       <category>SA_RUNTIME</category>
>               </attr>
> +             <attr>
> +                     <name>saLogStreamFacilityId</name>
> +                     <type>SA_UINT32_T</type>
> +                     <category>SA_RUNTIME</category>
> +                     <flag>SA_CACHED</flag>
> +             </attr>
>       </class>
>       <class name="SaLogStreamConfig">
>               <category>SA_CONFIG</category>
> @@ -171,6 +177,14 @@
>                       <type>SA_UINT64_T</type>
>                       <category>SA_RUNTIME</category>
>               </attr>
> +             <attr>
> +                     <name>saLogStreamFacilityId</name>
> +                     <type>SA_UINT32_T</type>
> +                     <category>SA_CONFIG</category>
> +                     <flag>SA_WRITABLE</flag>
> +                     <flag>SA_STRONG_DEFAULT</flag>
> +                     <default-value>16</default-value>
> +             </attr>
>       </class>
>       <class name="OpenSafLogConfig">
>   <!-- Care is needed when changing to the default values for the attributes 
> of this class
> diff --git a/src/log/logd/lgs_cache.cc b/src/log/logd/lgs_cache.cc
> index d94f4ea0d..02d14609d 100644
> --- a/src/log/logd/lgs_cache.cc
> +++ b/src/log/logd/lgs_cache.cc
> @@ -161,6 +161,7 @@ void Cache::Data::Streaming() const {
>     data.hostname    = param_->from_node;
>     data.appname     = param_->svc_name;
>     data.sev         = param_->severity;
> +  data.facilityId  = stream->facilityId;
>     time.tv_sec      = (param_->log_stamp / (SaTimeT)SA_TIME_ONE_SECOND);
>     time.tv_nsec     = (param_->log_stamp % (SaTimeT)SA_TIME_ONE_SECOND);
>     data.time        = time;
> @@ -198,7 +199,8 @@ void Cache::Data::CloneData(CkptPushAsync* output) const {
>   int Cache::Data::SyncPushWithStandby() const {
>     TRACE_ENTER();
>     assert(is_active() == true && "This instance does not run with active 
> role");
> -  if (lgs_is_peer_v8() == false) return NCSCC_RC_SUCCESS;
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8) == false)
> +    return NCSCC_RC_SUCCESS;
>     lgsv_ckpt_msg_v8_t ckpt_v8;
>     void* ckpt_data;
>     memset(&ckpt_v8, 0, sizeof(ckpt_v8));
> @@ -214,7 +216,8 @@ int Cache::Data::SyncPushWithStandby() const {
>   int Cache::Data::SyncPopWithStandby() const {
>     TRACE_ENTER();
>     assert(is_active() == true && "This instance does not run with active 
> role");
> -  if (lgs_is_peer_v8() == false) return NCSCC_RC_SUCCESS;
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8) == false)
> +    return NCSCC_RC_SUCCESS;
>     lgsv_ckpt_msg_v8_t ckpt_v8;
>     memset(&ckpt_v8, 0, sizeof(ckpt_v8));
>     ckpt_v8.header.ckpt_rec_type = LGS_CKPT_POP_ASYNC;
> @@ -228,7 +231,8 @@ int Cache::Data::SyncPopWithStandby() const {
>   int Cache::Data::SyncWriteWithStandby() const {
>     TRACE_ENTER();
>     assert(is_active() == true && "This instance does not run with active 
> role");
> -  if (lgs_is_peer_v8() == false) return NCSCC_RC_SUCCESS;
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8) == false)
> +    return NCSCC_RC_SUCCESS;
>     log_stream_t* stream = param_->stream();
>     if (stream == nullptr) {
>       LOG_NO("The stream id (%u) is closed. Drop the write sync.", 
> param_->stream_id);
> @@ -286,7 +290,8 @@ void Cache::Data::AckToClient(SaAisErrorT code) const {
>   int Cache::EncodeColdSync(NCS_UBAID* uba) const {
>     TRACE_ENTER();
>     assert(is_active() == true && "This instance does not run with active 
> role");
> -  if (lgs_is_peer_v8() == false) return NCSCC_RC_SUCCESS;
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8) == false)
> +    return NCSCC_RC_SUCCESS;
>   
>     uint8_t* pheader = ncs_enc_reserve_space(uba, sizeof(lgsv_ckpt_header_t));
>     if (pheader == nullptr) {
> @@ -323,7 +328,8 @@ int Cache::DecodeColdSync(NCS_UBAID* uba, 
> lgsv_ckpt_header_t* header,
>                             size_t ckpt_rec_size) const {
>     TRACE_ENTER();
>     assert(is_active() == false && "This instance does not run with standby 
> role");
> -  if (lgs_is_peer_v8() == false) return NCSCC_RC_SUCCESS;
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8) == false)
> +    return NCSCC_RC_SUCCESS;
>   
>     assert(uba && header && "Either uba or header is nullptr");
>     if (dec_ckpt_header(uba, header) != NCSCC_RC_SUCCESS) {
> diff --git a/src/log/logd/lgs_dest.cc b/src/log/logd/lgs_dest.cc
> index 0e70ddd12..71aecc92d 100644
> --- a/src/log/logd/lgs_dest.cc
> +++ b/src/log/logd/lgs_dest.cc
> @@ -392,6 +392,7 @@ bool WriteToDestination(const RecordData& data, const 
> VectorString& destnames) {
>     info.stream_dn = data.name;
>     info.app_name = data.appname;
>     info.severity = data.sev;
> +  info.facilityId = data.facilityId;
>     info.time = data.time;
>     info.origin = origin.c_str();
>   
> diff --git a/src/log/logd/lgs_dest.h b/src/log/logd/lgs_dest.h
> index 6fe7c1782..c119de356 100644
> --- a/src/log/logd/lgs_dest.h
> +++ b/src/log/logd/lgs_dest.h
> @@ -75,6 +75,7 @@ struct RecordData {
>     bool isRtStream;
>     uint32_t recordId;
>     uint16_t sev;
> +  uint32_t facilityId;
>     timespec time;
>   
>     RecordData()
> @@ -86,7 +87,8 @@ struct RecordData {
>           msgid{nullptr},
>           isRtStream{false},
>           recordId{0},
> -        sev{0} {
> +        sev{0},
> +        facilityId{16} {
[Vu] Consider using a descriptive constant name instead of a fixed value.
e.g:

namespace Facility {
const uint32_t kLocal0 = 16;
};

then use:

facilityId{Facility::kLocal0}

>       time = base::ReadRealtimeClock();
>     }
>   };
> @@ -175,6 +177,7 @@ class DestinationHandler {
>       const char* log_record;
>       const char* app_name;
>       uint16_t severity;
> +    uint32_t facilityId;
>       uint32_t record_id;
>       struct timespec time;
>   
> @@ -186,6 +189,7 @@ class DestinationHandler {
>             log_record{nullptr},
>             app_name{nullptr},
>             severity{0},
> +          facilityId{16},
[Vu] See above comment.
>             record_id{0} {
>         time = base::ReadRealtimeClock();
>       }
> diff --git a/src/log/logd/lgs_evt.cc b/src/log/logd/lgs_evt.cc
> index f169ea1e9..e9a059874 100644
> --- a/src/log/logd/lgs_evt.cc
> +++ b/src/log/logd/lgs_evt.cc
> @@ -429,7 +429,7 @@ static uint32_t proc_lga_updn_mds_msg(lgsv_lgs_evt_t 
> *evt) {
>           /*Send an async checkpoint update to STANDBY EDS peer */
>           if (lgs_cb->ha_state == SA_AMF_HA_ACTIVE) {
>             void *ckpt_ptr;
> -          if (lgs_is_peer_v2()) {
> +          if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>               memset(&ckpt_v2, 0, sizeof(ckpt_v2));
>               ckpt_v2.header.ckpt_rec_type = LGS_CKPT_CLIENT_DOWN;
>               ckpt_v2.header.num_ckpt_records = 1;
> @@ -666,7 +666,7 @@ static uint32_t lgs_ckpt_initialized_client(lgs_cb_t *cb, 
> MDS_DEST mds_dest,
>     TRACE_ENTER();
>   
>     if (cb->ha_state == SA_AMF_HA_ACTIVE) {
> -    if (lgs_is_peer_v6()) {
> +    if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>         lgs_ckpt_initialize_msg_v6_t *ckpt_rec_ptr;
>         memset(&ckpt_v6, 0, sizeof(ckpt_v6));
>         header_ptr = &ckpt_v6.header;
> @@ -796,7 +796,7 @@ static uint32_t proc_finalize_msg(lgs_cb_t *cb, 
> lgsv_lgs_evt_t *evt) {
>       goto snd_rsp;
>     }
>   
> -  if (lgs_is_peer_v2()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       memset(&ckpt_v2, 0, sizeof(ckpt_v2));
>       ckpt_v2.header.ckpt_rec_type = LGS_CKPT_CLIENT_FINALIZE;
>       ckpt_v2.header.num_ckpt_records = 1;
> @@ -1237,7 +1237,7 @@ static uint32_t proc_stream_close_msg(lgs_cb_t *cb, 
> lgsv_lgs_evt_t *evt) {
>     log_stream_close(&stream, &closetime);
>   
>     /* Checkpointing */
> -  if (lgs_is_peer_v2()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       memset(&ckpt_v2, 0, sizeof(ckpt_v2));
>       ckpt_v2.header.ckpt_rec_type = LGS_CKPT_CLOSE_STREAM;
>       ckpt_v2.header.num_ckpt_records = 1;
> diff --git a/src/log/logd/lgs_imm.cc b/src/log/logd/lgs_imm.cc
> index 24318bf90..49cd2c3d0 100644
> --- a/src/log/logd/lgs_imm.cc
> +++ b/src/log/logd/lgs_imm.cc
> @@ -41,6 +41,7 @@
>   #include <saImmOi.h>
>   
>   #include "osaf/immutil/immutil.h"
> +#include "base/log_message.h"
>   #include "base/osaf_time.h"
>   #include "log/logd/lgs.h"
>   #include "log/logd/lgs_util.h"
> @@ -56,6 +57,7 @@
>   #include "log/logd/lgs_mbcsv_v3.h"
>   #include "log/logd/lgs_mbcsv_v5.h"
>   #include "log/logd/lgs_mbcsv_v6.h"
> +#include "log/logd/lgs_mbcsv_v9.h"
>   #include "base/saf_error.h"
>   
>   /* TYPE DEFINITIONS
> @@ -181,13 +183,13 @@ static uint32_t ckpt_lgs_cfg(bool is_root_dir_changed,
>   
>     TRACE_ENTER();
>   
> -  if (!lgs_is_peer_v2()) {
> +  if (!lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       /* Can be called only if we are OI. This is not the case if Standby */
>       TRACE("%s Called when check-pointing version 1", __FUNCTION__);
>       return NCSCC_RC_FAILURE;
>     }
>   
> -  if (lgs_is_peer_v5()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_5)) {
>       /* Checkpoint version 5 */
>       memset(&ckpt_v5, 0, sizeof(ckpt_v5));
>       ckpt_v5.header.ckpt_rec_type = LGS_CKPT_LGS_CFG_V5;
> @@ -198,7 +200,7 @@ static uint32_t ckpt_lgs_cfg(bool is_root_dir_changed,
>       ckpt_v5.ckpt_rec.lgs_cfg.buffer_size = v5_ckpt->ckpt_buffer_size;
>       ckpt = &ckpt_v5;
>       TRACE("\tCheck-pointing v5");
> -  } else if (lgs_is_peer_v4()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_4)) {
>       /* Checkpoint version 4 */
>       memset(&ckpt_v3, 0, sizeof(ckpt_v3));
>       ckpt_v3.header.ckpt_rec_type = LGS_CKPT_LGS_CFG_V3;
> @@ -245,12 +247,40 @@ static uint32_t ckpt_stream_config(log_stream_t 
> *stream) {
>     lgsv_ckpt_msg_v1_t ckpt_v1;
>     lgsv_ckpt_msg_v2_t ckpt_v2;
>     lgsv_ckpt_msg_v6_t ckpt_v3;
> +  lgsv_ckpt_msg_v9_t ckpt_v4;
[Vu] naming 'v4' for 'v4' message is confusing. Recommend using `ckpt_v9`;
>   
>     void *ckpt_ptr;
>   
>     TRACE_ENTER();
>   
> -  if (lgs_is_peer_v6()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +    memset(&ckpt_v4, 0, sizeof(ckpt_v4));
> +    ckpt_v4.header.ckpt_rec_type = LGS_CKPT_CFG_STREAM;
> +    ckpt_v4.header.num_ckpt_records = 1;
> +    ckpt_v4.header.data_len = 1;
> +
> +    ckpt_v4.ckpt_rec.stream_cfg.name = const_cast<char 
> *>(stream->name.c_str());
> +    ckpt_v4.ckpt_rec.stream_cfg.fileName =
> +        const_cast<char *>(stream->fileName.c_str());
> +    ckpt_v4.ckpt_rec.stream_cfg.pathName =
> +        const_cast<char *>(stream->pathName.c_str());
> +    ckpt_v4.ckpt_rec.stream_cfg.maxLogFileSize = stream->maxLogFileSize;
> +    ckpt_v4.ckpt_rec.stream_cfg.fixedLogRecordSize = 
> stream->fixedLogRecordSize;
> +    ckpt_v4.ckpt_rec.stream_cfg.logFullAction = stream->logFullAction;
> +    ckpt_v4.ckpt_rec.stream_cfg.logFullHaltThreshold =
> +        stream->logFullHaltThreshold;
> +    ckpt_v4.ckpt_rec.stream_cfg.maxFilesRotated = stream->maxFilesRotated;
> +    ckpt_v4.ckpt_rec.stream_cfg.logFileFormat = stream->logFileFormat;
> +    ckpt_v4.ckpt_rec.stream_cfg.severityFilter = stream->severityFilter;
> +    ckpt_v4.ckpt_rec.stream_cfg.logFileCurrent =
> +        const_cast<char *>(stream->logFileCurrent.c_str());
> +    ckpt_v4.ckpt_rec.stream_cfg.dest_names =
> +        const_cast<char *>(stream->stb_dest_names.c_str());
> +    ckpt_v4.ckpt_rec.stream_cfg.c_file_close_time_stamp =
> +        stream->act_last_close_timestamp;
> +    ckpt_v4.ckpt_rec.stream_cfg.facilityId = stream->facilityId;
> +    ckpt_ptr = &ckpt_v4;
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       memset(&ckpt_v3, 0, sizeof(ckpt_v3));
>       ckpt_v3.header.ckpt_rec_type = LGS_CKPT_CFG_STREAM;
>       ckpt_v3.header.num_ckpt_records = 1;
> @@ -276,7 +306,7 @@ static uint32_t ckpt_stream_config(log_stream_t *stream) {
>       ckpt_v3.ckpt_rec.stream_cfg.c_file_close_time_stamp =
>           stream->act_last_close_timestamp;
>       ckpt_ptr = &ckpt_v3;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       memset(&ckpt_v2, 0, sizeof(ckpt_v2));
>       ckpt_v2.header.ckpt_rec_type = LGS_CKPT_CFG_STREAM;
>       ckpt_v2.header.num_ckpt_records = 1;
> @@ -345,7 +375,7 @@ static uint32_t ckpt_stream_close(log_stream_t *stream, 
> time_t closetime) {
>   
>     TRACE_ENTER();
>   
> -  if (lgs_is_peer_v2()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       memset(&ckpt_v2, 0, sizeof(ckpt_v2));
>       ckpt_v2.header.ckpt_rec_type = LGS_CKPT_CLOSE_STREAM;
>       ckpt_v2.header.num_ckpt_records = 1;
> @@ -1281,6 +1311,8 @@ static SaAisErrorT check_attr_validity(
>     bool i_maxFilesRotated_mod = false;
>     SaUint32T i_severityFilter = 0;
>     bool i_severityFilter_mod = false;
> +  SaUint32T i_facilityId = 0;
> +  bool i_facilityId_mod = false;
>   
>     TRACE_ENTER();
>   
> @@ -1338,8 +1370,8 @@ static SaAisErrorT check_attr_validity(
>       if (attribute->attrValuesNumber > 0) {
>         value = attribute->attrValues[0];
>       } else if (opdata->operationType == CCBUTIL_MODIFY) {
> -      if (!strcmp(attribute->attrName, "saLogRecordDestination")) {
> -        // do nothing
> +      if (!strcmp(attribute->attrName, "saLogRecordDestination") ||
> +          !strcmp(attribute->attrName, "saLogStreamFacilityId")) {
[Vu] Keep the comment 'do nothing' to explicitly saying 'do nothing' is 
intentional.
>         } else {
>           /* An attribute without a value is never valid if modify */
>           report_oi_error(immOiHandle, opdata->ccbId, "Attribute %s has no 
> value",
> @@ -1403,6 +1435,11 @@ static SaAisErrorT check_attr_validity(
>         i_severityFilter_mod = true;
>         TRACE("Saved attribute \"%s\" = %d", attribute->attrName,
>               i_severityFilter);
> +    } else if (!strcmp(attribute->attrName, "saLogStreamFacilityId") &&
> +               attribute->attrValuesNumber > 0) {
> +      i_facilityId = *(reinterpret_cast<SaUint32T *>(value));
> +      i_facilityId_mod = true;
> +      TRACE("Saved attribute \"%s\"", attribute->attrName);
>       } else if (!strcmp(attribute->attrName, "saLogRecordDestination")) {
>         std::vector<std::string> vstring{};
>         for (unsigned i = 0; i < attribute->attrValuesNumber; i++) {
> @@ -1641,6 +1678,18 @@ static SaAisErrorT check_attr_validity(
>           goto done;
>         }
>       }
> +
> +    /* saLogStreamFacilityId <= 23 */
> +    if (i_facilityId_mod) {
> +      TRACE("Checking saLogStreamFacilityId");
> +      if (i_facilityId > 23) {
> +        report_oi_error(immOiHandle, opdata->ccbId, "Invalid facility ID: 
> %u",
> +                        i_facilityId);
> +        rc = SA_AIS_ERR_BAD_OPERATION;
> +        TRACE("Invalid facility ID: %u", i_facilityId);
> +        goto done;
> +      }
> +    }
>     }
>   
>   done:
> @@ -2268,6 +2317,10 @@ static SaAisErrorT stream_create_and_configure1(
>                            "saLogStreamSeverityFilter")) {
>           (*stream)->severityFilter = *((SaUint32T *)value);
>           TRACE("severityFilter: %u", (*stream)->severityFilter);
> +      } else if (!strcmp(ccb->param.create.attrValues[i]->attrName,
> +                         "saLogStreamFacilityId")) {
> +        (*stream)->facilityId = *(reinterpret_cast<SaUint32T *>(value));
> +        TRACE("facilityId: %u", (*stream)->facilityId);
>         } else if (!strcmp(ccb->param.create.attrValues[i]->attrName,
>                            "saLogRecordDestination")) {
>           std::vector<std::string> vstring{};
> @@ -2403,6 +2456,12 @@ static void stream_ccb_apply_modify(const 
> CcbUtilOperationData_t *opdata) {
>           log_stream_delete_dest_name(stream, dname);
>           attrMod = opdata->param.modify.attrMods[i++];
>           continue;
> +      } else if (!strcmp(attribute->attrName, "saLogStreamFacilityId")) {
> +        LOG_NO("%s deleted", __func__);
> +        stream->facilityId =
> +            static_cast<uint32_t>(base::LogMessage::Facility::kLocal0);
[Vu] To avoid type casting, using Facility::kLocal0 as I mentioned above.
> +        attrMod = opdata->param.modify.attrMods[i++];
> +        continue;
>         }
>       }
>   
> @@ -2464,6 +2523,10 @@ static void stream_ccb_apply_modify(const 
> CcbUtilOperationData_t *opdata) {
>           TRACE("%s: stream %s - msgid = %s", __func__, stream->name.c_str(),
>                 stream->rfc5424MsgId.c_str());
>         }
> +    } else if (!strcmp(attribute->attrName, "saLogStreamFacilityId")) {
> +      if (value != nullptr) {
[Vu] This check is redundant; value in this case never be a nullptr.
> +        stream->facilityId = *(reinterpret_cast<SaUint32T *>(value));
> +      }
>       } else {
>         LOG_ER("Error: Unknown attribute name");
>         osafassert(0);
> @@ -2795,6 +2858,9 @@ static SaAisErrorT stream_create_and_configure(
>            */
>           stream->creationTimeStamp = *(static_cast<SaTimeT *>(value));
>         }
> +    } else if (!strcmp(attribute->attrName, "saLogStreamFacilityId")) {
> +      stream->facilityId = *(reinterpret_cast<SaUint32T *>(value));
> +      TRACE("facilityId: %u", stream->facilityId);
>       }
>     }
>   
> @@ -3184,6 +3250,7 @@ int lgs_get_streamobj_attr(SaImmAttrValuesT_2 
> ***attrib_out,
>         const_cast<char *>("saLogStreamLogFileFormat"),
>         const_cast<char *>("saLogStreamSeverityFilter"),
>         const_cast<char *>("saLogStreamCreationTimestamp"),
> +      const_cast<char *>("saLogStreamFacilityId"),
>         NULL};
>   
>     TRACE_ENTER2("object_name_in \"%s\"", object_name_in.c_str());
> diff --git a/src/log/logd/lgs_mbcsv.cc b/src/log/logd/lgs_mbcsv.cc
> index f83d9ec20..0380bd1b1 100644
> --- a/src/log/logd/lgs_mbcsv.cc
> +++ b/src/log/logd/lgs_mbcsv.cc
> @@ -23,6 +23,7 @@
>   
>   #include "osaf/immutil/immutil.h"
>   #include "log/logd/lgs_dest.h"
> +#include "log/logd/lgs_mbcsv_v9.h"
>   #include "log/logd/lgs_mbcsv_v6.h"
>   #include "log/logd/lgs_mbcsv_v5.h"
>   #include "log/logd/lgs_mbcsv_v3.h"
> @@ -141,7 +142,96 @@ uint32_t edp_ed_open_stream_rec(EDU_HDL *edu_hdl, 
> EDU_TKN *edu_tkn,
>     uint32_t rc = NCSCC_RC_SUCCESS;
>     lgs_ckpt_stream_open_t *ckpt_open_stream_msg_ptr = NULL,
>                            **ckpt_open_stream_msg_dec_ptr;
> -  if (lgs_is_peer_v6()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +    EDU_INST_SET ckpt_open_stream_rec_ed_rules[] = {
> +        {EDU_START, edp_ed_open_stream_rec, 0, 0, 0,
> +         sizeof(lgs_ckpt_stream_open_t), 0, NULL},
> +        {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +         (int64_t) & (reinterpret_cast<lgs_ckpt_stream_open_t 
> *>(0))->streamId,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +         (int64_t) & (reinterpret_cast<lgs_ckpt_stream_open_t 
> *>(0))->clientId,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +         (int64_t) & (reinterpret_cast<lgs_ckpt_stream_open_t 
> *>(0))->logFile,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +         (int64_t) & (reinterpret_cast<lgs_ckpt_stream_open_t 
> *>(0))->logPath,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->logFileCurrent,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->dest_names,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_uns64, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->maxFileSize,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_int32, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t 
> *>(0))->maxLogRecordSize,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_int32, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t 
> *>(0))->logFileFullAction,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_int32, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t 
> *>(0))->maxFilesRotated,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +         (int64_t) & (reinterpret_cast<lgs_ckpt_stream_open_t 
> *>(0))->fileFmt,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->logStreamName,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_uns64, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t 
> *>(0))->creationTimeStamp,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->numOpeners,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->streamType,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->logRecordId,
> +         0, NULL},
> +        {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +         (int64_t) &
> +             (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->facilityId,
> +         0, NULL},
> +        {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
> +    };
> +
> +    if (op == EDP_OP_TYPE_ENC) {
> +      ckpt_open_stream_msg_ptr = static_cast<lgs_ckpt_stream_open_t *>(ptr);
> +    } else if (op == EDP_OP_TYPE_DEC) {
> +      ckpt_open_stream_msg_dec_ptr =
> +          static_cast<lgs_ckpt_stream_open_t **>(ptr);
> +      if (*ckpt_open_stream_msg_dec_ptr == NULL) {
> +        *o_err = EDU_ERR_MEM_FAIL;
> +        return NCSCC_RC_FAILURE;
> +      }
> +      memset(*ckpt_open_stream_msg_dec_ptr, '\0',
> +             sizeof(lgs_ckpt_stream_open_t));
> +      ckpt_open_stream_msg_ptr = *ckpt_open_stream_msg_dec_ptr;
> +    } else {
> +      ckpt_open_stream_msg_ptr = static_cast<lgs_ckpt_stream_open_t *>(ptr);
> +    }
> +
> +    rc = m_NCS_EDU_RUN_RULES(edu_hdl, edu_tkn, ckpt_open_stream_rec_ed_rules,
> +                             ckpt_open_stream_msg_ptr, ptr_data_len, buf_env,
> +                             op, o_err);
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       EDU_INST_SET ckpt_open_stream_rec_ed_rules[] = {
>           {EDU_START, edp_ed_open_stream_rec, 0, 0, 0,
>            sizeof(lgs_ckpt_stream_open_t), 0, NULL},
> @@ -420,75 +510,12 @@ uint32_t lgs_mbcsv_dispatch(NCS_MBCSV_HDL mbcsv_hdl) {
>   }
>   
>   /**
> - * Check if peer is version 2 (or later)
> + * Mbcsv check peer version
> + * @param version
>    * @return bool
>    */
> -bool lgs_is_peer_v2() {
> -  if (lgs_cb->mbcsv_peer_version >= LGS_MBCSV_VERSION_2) {
> -    return true;
> -  } else {
> -    return false;
> -  }
> -}
> -
> -/**
> - * Check if peer is version 4 (or later)
> - * @return bool
> - */
> -bool lgs_is_peer_v4() {
> -  if (lgs_cb->mbcsv_peer_version >= LGS_MBCSV_VERSION_4) {
> -    return true;
> -  } else {
> -    return false;
> -  }
> -}
> -
> -/**
> - * Check if peer is version 5 (or later)
> - * @return bool
> - */
> -bool lgs_is_peer_v5() {
> -  if (lgs_cb->mbcsv_peer_version >= LGS_MBCSV_VERSION_5) {
> -    return true;
> -  } else {
> -    return false;
> -  }
> -}
> -
> -/**
> - * Check if peer is version 6 (or later)
> - * @return bool
> - */
> -bool lgs_is_peer_v6() {
> -  if (lgs_cb->mbcsv_peer_version >= LGS_MBCSV_VERSION_6) {
> -    return true;
> -  } else {
> -    return false;
> -  }
> -}
> -
> -/**
> - * Check if peer is version 7 (or later)
> - * @return bool
> - */
> -bool lgs_is_peer_v7() {
> -  if (lgs_cb->mbcsv_peer_version >= LGS_MBCSV_VERSION_7) {
> -    return true;
> -  } else {
> -    return false;
> -  }
> -}
> -
> -/**
> - * Check if peer is version 8 (or later)
> - * @return bool
> - */
> -bool lgs_is_peer_v8() {
> -  if (lgs_cb->mbcsv_peer_version >= LGS_MBCSV_VERSION_8) {
> -    return true;
> -  } else {
> -    return false;
> -  }
> +bool lgs_check_peer_version(lgs_mbcsv_version_t version) {
> +  return (lgs_cb->mbcsv_peer_version >= version);
>   }
[Vu] many code are changed according this minor adding; very hard to 
review the patch because of this.
I prefer to keeping the original code, only adding the new 
`lgs_is_peer_v9`.
>   
>   /**
> @@ -502,7 +529,8 @@ bool lgs_is_split_file_system() {
>     lgs_file_config =
>         *static_cast<const SaUint32T 
> *>(lgs_cfg_get(LGS_IMM_LOG_FILE_SYS_CONFIG));
>   
> -  if ((lgs_file_config == LGS_LOG_SPLIT_FILESYSTEM) && lgs_is_peer_v2()) {
> +  if ((lgs_file_config == LGS_LOG_SPLIT_FILESYSTEM) &&
> +      lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       return true;
>     } else {
>       return false;
> @@ -736,8 +764,9 @@ void lgs_ckpt_stream_open_set(log_stream_t *logStream,
>     stream_open->maxFilesRotated = logStream->maxFilesRotated;
>     stream_open->creationTimeStamp = logStream->creationTimeStamp;
>     stream_open->numOpeners = logStream->numOpeners;
> +  stream_open->facilityId = logStream->facilityId;
>   
> -  if (lgs_is_peer_v7() == true) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_7) == true) {
>       stream_open->streamType = logStream->streamType;
>     } else {
>       if ((logStream->streamType == STREAM_TYPE_APPLICATION_RT) ||
> @@ -852,7 +881,7 @@ static uint32_t edu_enc_reg_list(lgs_cb_t *cb, NCS_UBAID 
> *uba) {
>     for (const auto &value : *clientMap) {
>       client = value.second;
>   
> -    if (lgs_is_peer_v6()) {
> +    if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>         ckpt_reg_rec_v6.client_id = client->client_id;
>         ckpt_reg_rec_v6.mds_dest = client->mds_dest;
>         ckpt_reg_rec_v6.stream_list = client->stream_list_root;
> @@ -908,6 +937,7 @@ static uint32_t edu_enc_reg_list(lgs_cb_t *cb, NCS_UBAID 
> *uba) {
>   
>   static uint32_t ckpt_encode_async_update(lgs_cb_t *lgs_cb, EDU_HDL edu_hdl,
>                                            NCS_MBCSV_CB_ARG *cbk_arg) {
> +  lgsv_ckpt_msg_v9_t *data_v9 = NULL;
>     lgsv_ckpt_msg_v8_t *data_v8 = NULL;
>     lgsv_ckpt_msg_v6_t *data_v6 = NULL;
>     lgsv_ckpt_msg_v5_t *data_v5 = NULL;
> @@ -921,27 +951,32 @@ static uint32_t ckpt_encode_async_update(lgs_cb_t 
> *lgs_cb, EDU_HDL edu_hdl,
>   
>     TRACE_ENTER();
>     /* Set reo_hdl from callback arg to ckpt_rec */
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +    data_v9 = reinterpret_cast<lgsv_ckpt_msg_v9_t *>(
> +        static_cast<int64_t>(cbk_arg->info.encode.io_reo_hdl));
> +    vdata = data_v9;
> +    edp_function = edp_ed_ckpt_msg_v9;
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       data_v8 = reinterpret_cast<lgsv_ckpt_msg_v8_t *>(
>           static_cast<long>(cbk_arg->info.encode.io_reo_hdl));
>       vdata = data_v8;
>       edp_function = edp_ed_ckpt_msg_v8;
> -  } else if (lgs_is_peer_v6()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       data_v6 = reinterpret_cast<lgsv_ckpt_msg_v6_t *>(
>           static_cast<long>(cbk_arg->info.encode.io_reo_hdl));
>       vdata = data_v6;
>       edp_function = edp_ed_ckpt_msg_v6;
> -  } else if (lgs_is_peer_v5()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_5)) {
>       data_v5 = reinterpret_cast<lgsv_ckpt_msg_v5_t *>(
>           static_cast<long>(cbk_arg->info.encode.io_reo_hdl));
>       vdata = data_v5;
>       edp_function = edp_ed_ckpt_msg_v5;
> -  } else if (lgs_is_peer_v4()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_4)) {
>       data_v3 = reinterpret_cast<lgsv_ckpt_msg_v3_t *>(
>           static_cast<long>(cbk_arg->info.encode.io_reo_hdl));
>       vdata = data_v3;
>       edp_function = edp_ed_ckpt_msg_v3;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       data_v2 = reinterpret_cast<lgsv_ckpt_msg_v2_t *>(
>           static_cast<long>(cbk_arg->info.encode.io_reo_hdl));
>       vdata = data_v2;
> @@ -1111,12 +1146,12 @@ static uint32_t ckpt_decode_log_write(lgs_cb_t *cb, 
> void *ckpt_msg,
>     const int sleep_delay_ms = 10;
>     const int max_waiting_time_ms = 100;
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *ckpt_msg_v8 =
>           static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_msg);
>       write_log = &ckpt_msg_v8->ckpt_rec.write_log;
>       edp_function = edp_ed_write_rec_v2;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *ckpt_msg_v2 =
>           static_cast<lgsv_ckpt_msg_v2_t *>(ckpt_msg);
>       write_log = &ckpt_msg_v2->ckpt_rec.write_log;
> @@ -1158,12 +1193,12 @@ static uint32_t ckpt_decode_log_close(lgs_cb_t *cb, 
> void *ckpt_msg,
>     void *stream_close;
>     EDU_PROG_HANDLER edp_function;
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *ckpt_msg_v8 =
>           static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_msg);
>       stream_close = &ckpt_msg_v8->ckpt_rec.stream_close;
>       edp_function = edp_ed_close_stream_rec_v2;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *ckpt_msg_v2 =
>           static_cast<lgsv_ckpt_msg_v2_t *>(ckpt_msg);
>       stream_close = &ckpt_msg_v2->ckpt_rec.stream_close;
> @@ -1189,12 +1224,12 @@ static uint32_t 
> ckpt_decode_log_client_finalize(lgs_cb_t *cb, void *ckpt_msg,
>     void *finalize_client;
>     EDU_PROG_HANDLER edp_function;
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *ckpt_msg_v8 =
>           static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_msg);
>       finalize_client = &ckpt_msg_v8->ckpt_rec.finalize_client;
>       edp_function = edp_ed_finalize_rec_v2;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *ckpt_msg_v2 =
>           static_cast<lgsv_ckpt_msg_v2_t *>(ckpt_msg);
>       finalize_client = &ckpt_msg_v2->ckpt_rec.finalize_client;
> @@ -1220,12 +1255,12 @@ static uint32_t ckpt_decode_log_client_down(lgs_cb_t 
> *cb, void *ckpt_msg,
>     void *client_down;
>     EDU_PROG_HANDLER edp_function;
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *ckpt_msg_v8 =
>           static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_msg);
>       client_down = &ckpt_msg_v8->ckpt_rec.agent_down;
>       edp_function = edp_ed_agent_down_rec_v2;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *ckpt_msg_v2 =
>           static_cast<lgsv_ckpt_msg_v2_t *>(ckpt_msg);
>       client_down = &ckpt_msg_v2->ckpt_rec.agent_down;
> @@ -1250,17 +1285,22 @@ static uint32_t ckpt_decode_log_cfg_stream(lgs_cb_t 
> *cb, void *ckpt_msg,
>     void *stream_cfg;
>     EDU_PROG_HANDLER edp_function;
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +    lgsv_ckpt_msg_v9_t *ckpt_msg_v9 =
> +        static_cast<lgsv_ckpt_msg_v9_t *>(ckpt_msg);
> +    stream_cfg = &ckpt_msg_v9->ckpt_rec.stream_cfg;
> +    edp_function = edp_ed_cfg_stream_rec_v9;
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *ckpt_msg_v8 =
>           static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_msg);
>       stream_cfg = &ckpt_msg_v8->ckpt_rec.stream_cfg;
>       edp_function = edp_ed_cfg_stream_rec_v6;
> -  } else if (lgs_is_peer_v6()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       lgsv_ckpt_msg_v6_t *ckpt_msg_v6 =
>           static_cast<lgsv_ckpt_msg_v6_t *>(ckpt_msg);
>       stream_cfg = &ckpt_msg_v6->ckpt_rec.stream_cfg;
>       edp_function = edp_ed_cfg_stream_rec_v6;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *ckpt_msg_v2 =
>           static_cast<lgsv_ckpt_msg_v2_t *>(ckpt_msg);
>       stream_cfg = &ckpt_msg_v2->ckpt_rec.stream_cfg;
> @@ -1290,23 +1330,23 @@ static uint32_t ckpt_decode_log_cfg(lgs_cb_t *cb, 
> void *ckpt_msg,
>     lgsv_ckpt_msg_v3_t *ckpt_msg_v3;
>     lgsv_ckpt_msg_v2_t *ckpt_msg_v2;
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       ckpt_msg_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_msg);
>       lgs_cfg = &ckpt_msg_v8->ckpt_rec.lgs_cfg;
>       edp_function = edp_ed_lgs_cfg_rec_v5;
> -  } else if (lgs_is_peer_v6()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       ckpt_msg_v6 = static_cast<lgsv_ckpt_msg_v6_t *>(ckpt_msg);
>       lgs_cfg = &ckpt_msg_v6->ckpt_rec.lgs_cfg;
>       edp_function = edp_ed_lgs_cfg_rec_v5;
> -  } else if (lgs_is_peer_v5()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_5)) {
>       ckpt_msg_v5 = static_cast<lgsv_ckpt_msg_v5_t *>(ckpt_msg);
>       lgs_cfg = &ckpt_msg_v5->ckpt_rec.lgs_cfg;
>       edp_function = edp_ed_lgs_cfg_rec_v5;
> -  } else if (lgs_is_peer_v4()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_4)) {
>       ckpt_msg_v3 = static_cast<lgsv_ckpt_msg_v3_t *>(ckpt_msg);
>       lgs_cfg = &ckpt_msg_v3->ckpt_rec.lgs_cfg;
>       edp_function = edp_ed_lgs_cfg_rec_v3;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       ckpt_msg_v2 = static_cast<lgsv_ckpt_msg_v2_t *>(ckpt_msg);
>       lgs_cfg = &ckpt_msg_v2->ckpt_rec.lgs_cfg;
>       edp_function = edp_ed_lgs_cfg_rec_v2;
> @@ -1341,6 +1381,8 @@ static uint32_t ckpt_decode_async_update(lgs_cb_t *cb,
>     lgsv_ckpt_msg_v6_t *ckpt_msg_v6 = &msg_v6;
>     lgsv_ckpt_msg_v8_t msg_v8;
>     lgsv_ckpt_msg_v8_t *ckpt_msg_v8 = &msg_v8;
> +  lgsv_ckpt_msg_v9_t msg_v9;
> +  lgsv_ckpt_msg_v9_t *ckpt_msg_v9 = &msg_v9;
>     void *ckpt_msg;
>     lgsv_ckpt_header_t hdr, *hdr_ptr = &hdr;
>   
> @@ -1361,19 +1403,22 @@ static uint32_t ckpt_decode_async_update(lgs_cb_t *cb,
>   
>     TRACE_2("\tckpt_rec_type: %d ", (int)hdr_ptr->ckpt_rec_type);
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +    ckpt_msg_v9->header = hdr;
> +    ckpt_msg = ckpt_msg_v9;
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       ckpt_msg_v8->header = hdr;
>       ckpt_msg = ckpt_msg_v8;
> -  } else if (lgs_is_peer_v6()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       ckpt_msg_v6->header = hdr;
>       ckpt_msg = ckpt_msg_v6;
> -  } else if (lgs_is_peer_v5()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_5)) {
>       ckpt_msg_v5->header = hdr;
>       ckpt_msg = ckpt_msg_v5;
> -  } else if (lgs_is_peer_v4()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_4)) {
>       ckpt_msg_v3->header = hdr;
>       ckpt_msg = ckpt_msg_v3;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       ckpt_msg_v2->header = hdr;
>       ckpt_msg = ckpt_msg_v2;
>     } else {
> @@ -1385,19 +1430,22 @@ static uint32_t ckpt_decode_async_update(lgs_cb_t *cb,
>     switch (hdr_ptr->ckpt_rec_type) {
>       case LGS_CKPT_CLIENT_INITIALIZE:
>         TRACE_2("\tINITIALIZE REC: UPDATE");
> -      if (lgs_is_peer_v8()) {
> +      if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +        reg_rec = &ckpt_msg_v9->ckpt_rec.initialize_client;
> +        edp_function_reg = edp_ed_reg_rec_v6;
> +      } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>           reg_rec = &ckpt_msg_v8->ckpt_rec.initialize_client;
>           edp_function_reg = edp_ed_reg_rec_v6;
> -      } else if (lgs_is_peer_v6()) {
> +      } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>           reg_rec = &ckpt_msg_v6->ckpt_rec.initialize_client;
>           edp_function_reg = edp_ed_reg_rec_v6;
> -      } else if (lgs_is_peer_v5()) {
> +      } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_5)) {
>           reg_rec = &ckpt_msg_v5->ckpt_rec.initialize_client;
>           edp_function_reg = edp_ed_reg_rec;
> -      } else if (lgs_is_peer_v4()) {
> +      } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_4)) {
>           reg_rec = &ckpt_msg_v3->ckpt_rec.initialize_client;
>           edp_function_reg = edp_ed_reg_rec;
> -      } else if (lgs_is_peer_v2()) {
> +      } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>           reg_rec = &ckpt_msg_v2->ckpt_rec.initialize_client;
>           edp_function_reg = edp_ed_reg_rec;
>         } else {
> @@ -1421,15 +1469,17 @@ static uint32_t ckpt_decode_async_update(lgs_cb_t *cb,
>   
>       case LGS_CKPT_OPEN_STREAM: /* 4 */
>         TRACE_2("\tSTREAM OPEN: UPDATE");
> -      if (lgs_is_peer_v8()) {
> +      if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +        stream_open = &ckpt_msg_v9->ckpt_rec.stream_open;
> +      } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>           stream_open = &ckpt_msg_v8->ckpt_rec.stream_open;
> -      } else if (lgs_is_peer_v6()) {
> +      } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>           stream_open = &ckpt_msg_v6->ckpt_rec.stream_open;
> -      } else if (lgs_is_peer_v5()) {
> +      } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_5)) {
>           stream_open = &ckpt_msg_v5->ckpt_rec.stream_open;
> -      } else if (lgs_is_peer_v4()) {
> +      } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_4)) {
>           stream_open = &ckpt_msg_v3->ckpt_rec.stream_open;
> -      } else if (lgs_is_peer_v2()) {
> +      } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>           stream_open = &ckpt_msg_v2->ckpt_rec.stream_open;
>         } else {
>           stream_open = &ckpt_msg_v1->ckpt_rec.stream_open;
> @@ -1542,6 +1592,7 @@ static uint32_t ckpt_decode_cold_sync(lgs_cb_t *cb, 
> NCS_MBCSV_CB_ARG *cbk_arg) {
>     lgsv_ckpt_msg_v2_t msg_v2;
>     lgsv_ckpt_msg_v6_t msg_v6;
>     lgsv_ckpt_msg_v8_t msg_v8;
> +  lgsv_ckpt_msg_v9_t msg_v9;
>     uint32_t num_rec = 0;
>     void *reg_rec = NULL;
>     lgs_ckpt_stream_open_t *stream_rec = NULL;
> @@ -1563,7 +1614,16 @@ static uint32_t ckpt_decode_cold_sync(lgs_cb_t *cb, 
> NCS_MBCSV_CB_ARG *cbk_arg) {
>        | Header|RegRecords1..n|Header|streamRecords1..n|
>        -------------------------------------------------
>     */
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +    lgsv_ckpt_msg_v9_t *data_v9 = &msg_v9;
> +    header = &data_v9->header;
> +    initialize_client_rec_ptr = &data_v9->ckpt_rec.initialize_client;
> +    stream_open_rec_ptr = &data_v9->ckpt_rec.stream_open;
> +    vdata = data_v9;
> +    vckpt_rec = &data_v9->ckpt_rec;
> +    ckpt_rec_size = sizeof(data_v9->ckpt_rec);
> +    edp_function_reg = edp_ed_reg_rec_v6;
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *data_v8 = &msg_v8;
>       header = &data_v8->header;
>       initialize_client_rec_ptr = &data_v8->ckpt_rec.initialize_client;
> @@ -1572,7 +1632,7 @@ static uint32_t ckpt_decode_cold_sync(lgs_cb_t *cb, 
> NCS_MBCSV_CB_ARG *cbk_arg) {
>       vckpt_rec = &data_v8->ckpt_rec;
>       ckpt_rec_size = sizeof(data_v8->ckpt_rec);
>       edp_function_reg = edp_ed_reg_rec_v6;
> -  } else if (lgs_is_peer_v6()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       lgsv_ckpt_msg_v6_t *data_v6 = &msg_v6;
>       header = &data_v6->header;
>       initialize_client_rec_ptr = &data_v6->ckpt_rec.initialize_client;
> @@ -1581,7 +1641,7 @@ static uint32_t ckpt_decode_cold_sync(lgs_cb_t *cb, 
> NCS_MBCSV_CB_ARG *cbk_arg) {
>       vckpt_rec = &data_v6->ckpt_rec;
>       ckpt_rec_size = sizeof(data_v6->ckpt_rec);
>       edp_function_reg = edp_ed_reg_rec_v6;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *data_v2 = &msg_v2;
>       header = &data_v2->header;
>       initialize_client_rec_ptr = &data_v2->ckpt_rec.initialize_client;
> @@ -1725,25 +1785,29 @@ uint32_t process_ckpt_data(lgs_cb_t *cb, void *data) {
>     lgsv_ckpt_msg_v5_t *data_v5;
>     lgsv_ckpt_msg_v6_t *data_v6;
>     lgsv_ckpt_msg_v8_t *data_v8;
> +  lgsv_ckpt_msg_v9_t *data_v9;
>   
>     if ((!cb) || (data == NULL)) {
>       TRACE("%s - FAILED: (!cb) || (data == NULL)", __FUNCTION__);
>       return (rc = NCSCC_RC_FAILURE);
>     }
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +    data_v9 = static_cast<lgsv_ckpt_msg_v9_t *>(data);
> +    lgsv_ckpt_msg_type = data_v9->header.ckpt_rec_type;
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       data_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(data);
>       lgsv_ckpt_msg_type = data_v8->header.ckpt_rec_type;
> -  } else if (lgs_is_peer_v6()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       data_v6 = static_cast<lgsv_ckpt_msg_v6_t *>(data);
>       lgsv_ckpt_msg_type = data_v6->header.ckpt_rec_type;
> -  } else if (lgs_is_peer_v5()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_5)) {
>       data_v5 = static_cast<lgsv_ckpt_msg_v5_t *>(data);
>       lgsv_ckpt_msg_type = data_v5->header.ckpt_rec_type;
> -  } else if (lgs_is_peer_v4()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_4)) {
>       data_v3 = static_cast<lgsv_ckpt_msg_v3_t *>(data);
>       lgsv_ckpt_msg_type = data_v3->header.ckpt_rec_type;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       data_v2 = static_cast<lgsv_ckpt_msg_v2_t *>(data);
>       lgsv_ckpt_msg_type = data_v2->header.ckpt_rec_type;
>     } else {
> @@ -1788,7 +1852,7 @@ static uint32_t ckpt_proc_initialize_client(lgs_cb_t 
> *cb, void *data) {
>     log_client_t *client;
>   
>     TRACE_ENTER();
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgs_ckpt_initialize_msg_v6_t *param;
>       lgsv_ckpt_msg_v8_t *data_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(data);
>       param = &data_v8->ckpt_rec.initialize_client;
> @@ -1811,7 +1875,7 @@ static uint32_t ckpt_proc_initialize_client(lgs_cb_t 
> *cb, void *data) {
>           lgs_exit("Client attributes differ", SA_AMF_COMPONENT_RESTART);
>         }
>       }
> -  } else if (lgs_is_peer_v6()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       lgs_ckpt_initialize_msg_v6_t *param;
>       lgsv_ckpt_msg_v6_t *data_v6 = static_cast<lgsv_ckpt_msg_v6_t *>(data);
>       param = &data_v6->ckpt_rec.initialize_client;
> @@ -2102,7 +2166,7 @@ static uint32_t ckpt_proc_log_write(lgs_cb_t *cb, void 
> *data) {
>   
>     TRACE_ENTER();
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *data_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(data);
>       streamId = data_v8->ckpt_rec.write_log.streamId;
>       recordId = data_v8->ckpt_rec.write_log.recordId;
> @@ -2111,7 +2175,7 @@ static uint32_t ckpt_proc_log_write(lgs_cb_t *cb, void 
> *data) {
>       logRecord = data_v8->ckpt_rec.write_log.logRecord;
>       c_file_close_time_stamp =
>           data_v8->ckpt_rec.write_log.c_file_close_time_stamp;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *data_v2 = static_cast<lgsv_ckpt_msg_v2_t *>(data);
>       streamId = data_v2->ckpt_rec.write_log.streamId;
>       recordId = data_v2->ckpt_rec.write_log.recordId;
> @@ -2167,14 +2231,14 @@ static uint32_t ckpt_proc_close_stream(lgs_cb_t *cb, 
> void *data) {
>   
>     TRACE_ENTER();
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *data_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(data);
>       streamId = data_v8->ckpt_rec.stream_close.streamId;
>       clientId = data_v8->ckpt_rec.stream_close.clientId;
>       /* Set time for closing. Used for renaming */
>       closetime_ptr = reinterpret_cast<time_t *>(
>           &data_v8->ckpt_rec.stream_close.c_file_close_time_stamp);
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *data_v2 = static_cast<lgsv_ckpt_msg_v2_t *>(data);
>       streamId = data_v2->ckpt_rec.stream_close.streamId;
>       clientId = data_v2->ckpt_rec.stream_close.clientId;
> @@ -2230,13 +2294,16 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t *cb, void 
> *data) {
>   
>     TRACE_ENTER();
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +    lgsv_ckpt_msg_v9_t *data_v9 = static_cast<lgsv_ckpt_msg_v9_t *>(data);
> +    param = &data_v9->ckpt_rec.stream_open;
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *data_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(data);
>       param = &data_v8->ckpt_rec.stream_open;
> -  } else if (lgs_is_peer_v6()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       lgsv_ckpt_msg_v6_t *data_v6 = static_cast<lgsv_ckpt_msg_v6_t *>(data);
>       param = &data_v6->ckpt_rec.stream_open;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *data_v2 = static_cast<lgsv_ckpt_msg_v2_t *>(data);
>       param = &data_v2->ckpt_rec.stream_open;
>     } else {
> @@ -2289,6 +2356,7 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t *cb, void 
> *data) {
>       stream->logFileCurrent = param->logFileCurrent;
>       stream->stb_prev_actlogFileCurrent = param->logFileCurrent;
>       stream->stb_logFileCurrent = param->logFileCurrent;
> +    stream->facilityId = param->facilityId;
>   
>       if (stream->streamType == STREAM_TYPE_APPLICATION) {
>         // Note: Previous handling for backwards compatibility
> @@ -2310,7 +2378,7 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t *cb, void 
> *data) {
>       }
>   
>       // Only update destination names if peer is v6 or upper.
> -    if (lgs_is_peer_v6()) {
> +    if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>         if (param->dest_names != nullptr && strlen(param->dest_names) != 0) {
>           TRACE("Dest_name %s", param->dest_names);
>           stream->stb_dest_names = std::string{param->dest_names};
> @@ -2388,12 +2456,12 @@ static uint32_t ckpt_proc_finalize_client(lgs_cb_t 
> *cb, void *data) {
>     uint32_t client_id;
>     time_t *closetime_ptr;
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *data_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(data);
>       lgs_ckpt_finalize_msg_v2_t *param = &data_v8->ckpt_rec.finalize_client;
>       closetime_ptr = reinterpret_cast<time_t 
> *>(&param->c_file_close_time_stamp);
>       client_id = param->client_id;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *data_v2 = static_cast<lgsv_ckpt_msg_v2_t *>(data);
>       lgs_ckpt_finalize_msg_v2_t *param = &data_v2->ckpt_rec.finalize_client;
>       closetime_ptr = reinterpret_cast<time_t 
> *>(&param->c_file_close_time_stamp);
> @@ -2435,12 +2503,12 @@ uint32_t ckpt_proc_agent_down(lgs_cb_t *cb, void 
> *data) {
>   
>     TRACE_ENTER();
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *data_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(data);
>       closetime_ptr = reinterpret_cast<time_t *>(
>           &data_v8->ckpt_rec.agent_down.c_file_close_time_stamp);
>       agent_dest = data_v8->ckpt_rec.agent_down.agent_dest;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *data_v2 = static_cast<lgsv_ckpt_msg_v2_t *>(data);
>       closetime_ptr = reinterpret_cast<time_t *>(
>           &data_v2->ckpt_rec.agent_down.c_file_close_time_stamp);
> @@ -2497,10 +2565,27 @@ static uint32_t ckpt_proc_cfg_stream(lgs_cb_t *cb, 
> void *data) {
>     SaUint32T severityFilter;
>     char *logFileCurrent;
>     bool new_cfg_file_needed = false;
> +  uint32_t facilityId = 16;
>   
>     TRACE_ENTER();
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +    lgsv_ckpt_msg_v9_t *data_v9 = static_cast<lgsv_ckpt_msg_v9_t *>(data);
> +    name = data_v9->ckpt_rec.stream_cfg.name;
> +    fileName = data_v9->ckpt_rec.stream_cfg.fileName;
> +    pathName = data_v9->ckpt_rec.stream_cfg.pathName;
> +    maxLogFileSize = data_v9->ckpt_rec.stream_cfg.maxLogFileSize;
> +    fixedLogRecordSize = data_v9->ckpt_rec.stream_cfg.fixedLogRecordSize;
> +    logFullAction = data_v9->ckpt_rec.stream_cfg.logFullAction;
> +    logFullHaltThreshold = data_v9->ckpt_rec.stream_cfg.logFullHaltThreshold;
> +    maxFilesRotated = data_v9->ckpt_rec.stream_cfg.maxFilesRotated;
> +    logFileFormat = data_v9->ckpt_rec.stream_cfg.logFileFormat;
> +    severityFilter = data_v9->ckpt_rec.stream_cfg.severityFilter;
> +    logFileCurrent = data_v9->ckpt_rec.stream_cfg.logFileCurrent;
> +    dest_names = data_v9->ckpt_rec.stream_cfg.dest_names;
> +    closetime = data_v9->ckpt_rec.stream_cfg.c_file_close_time_stamp;
> +    facilityId = data_v9->ckpt_rec.stream_cfg.facilityId;
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *data_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(data);
>       name = data_v8->ckpt_rec.stream_cfg.name;
>       fileName = data_v8->ckpt_rec.stream_cfg.fileName;
> @@ -2515,7 +2600,7 @@ static uint32_t ckpt_proc_cfg_stream(lgs_cb_t *cb, void 
> *data) {
>       logFileCurrent = data_v8->ckpt_rec.stream_cfg.logFileCurrent;
>       dest_names = data_v8->ckpt_rec.stream_cfg.dest_names;
>       closetime = data_v8->ckpt_rec.stream_cfg.c_file_close_time_stamp;
> -  } else if (lgs_is_peer_v6()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       lgsv_ckpt_msg_v6_t *data_v6 = static_cast<lgsv_ckpt_msg_v6_t *>(data);
>       name = data_v6->ckpt_rec.stream_cfg.name;
>       fileName = data_v6->ckpt_rec.stream_cfg.fileName;
> @@ -2530,7 +2615,7 @@ static uint32_t ckpt_proc_cfg_stream(lgs_cb_t *cb, void 
> *data) {
>       logFileCurrent = data_v6->ckpt_rec.stream_cfg.logFileCurrent;
>       dest_names = data_v6->ckpt_rec.stream_cfg.dest_names;
>       closetime = data_v6->ckpt_rec.stream_cfg.c_file_close_time_stamp;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *data_v2 = static_cast<lgsv_ckpt_msg_v2_t *>(data);
>       name = data_v2->ckpt_rec.stream_cfg.name;
>       fileName = data_v2->ckpt_rec.stream_cfg.fileName;
> @@ -2581,6 +2666,7 @@ static uint32_t ckpt_proc_cfg_stream(lgs_cb_t *cb, void 
> *data) {
>     stream->logFullAction = logFullAction;
>     stream->logFullHaltThreshold = logFullHaltThreshold;
>     stream->maxFilesRotated = maxFilesRotated;
> +  stream->facilityId = facilityId;
>   
>     if (stream->logFileFormat != NULL) {
>       free(stream->logFileFormat);
> @@ -2591,7 +2677,7 @@ static uint32_t ckpt_proc_cfg_stream(lgs_cb_t *cb, void 
> *data) {
>     stream->severityFilter = severityFilter;
>     stream->logFileCurrent = logFileCurrent;
>     // Only update destination name if peer is v6 or upper.
> -  if (lgs_is_peer_v6()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       if (dest_names != nullptr && strlen(dest_names) != 0) {
>         TRACE("dest_names: %s", dest_names);
>         stream->stb_dest_names = std::string{dest_names};
> @@ -2690,23 +2776,27 @@ uint32_t lgs_ckpt_send_async(lgs_cb_t *cb, void 
> *ckpt_rec, uint32_t action) {
>   
>     TRACE_ENTER();
>   
> -  if (lgs_is_peer_v8()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_9)) {
> +    lgsv_ckpt_msg_v9_t *ckpt_rec_v9 =
> +        static_cast<lgsv_ckpt_msg_v9_t *>(ckpt_rec);
> +    ckpt_rec_type = ckpt_rec_v9->header.ckpt_rec_type;
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>       lgsv_ckpt_msg_v8_t *ckpt_rec_v8 =
>           static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_rec);
>       ckpt_rec_type = ckpt_rec_v8->header.ckpt_rec_type;
> -  } else if (lgs_is_peer_v6()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       lgsv_ckpt_msg_v6_t *ckpt_rec_v6 =
>           static_cast<lgsv_ckpt_msg_v6_t *>(ckpt_rec);
>       ckpt_rec_type = ckpt_rec_v6->header.ckpt_rec_type;
> -  } else if (lgs_is_peer_v5()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_5)) {
>       lgsv_ckpt_msg_v5_t *ckpt_rec_v5 =
>           static_cast<lgsv_ckpt_msg_v5_t *>(ckpt_rec);
>       ckpt_rec_type = ckpt_rec_v5->header.ckpt_rec_type;
> -  } else if (lgs_is_peer_v4()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_4)) {
>       lgsv_ckpt_msg_v3_t *ckpt_rec_v3 =
>           static_cast<lgsv_ckpt_msg_v3_t *>(ckpt_rec);
>       ckpt_rec_type = ckpt_rec_v3->header.ckpt_rec_type;
> -  } else if (lgs_is_peer_v2()) {
> +  } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       lgsv_ckpt_msg_v2_t *ckpt_rec_v2 =
>           static_cast<lgsv_ckpt_msg_v2_t *>(ckpt_rec);
>       ckpt_rec_type = ckpt_rec_v2->header.ckpt_rec_type;
> @@ -3110,7 +3200,7 @@ void lgs_ckpt_log_async(log_stream_t* stream, char* 
> record) {
>       lgsv_ckpt_msg_v1_t ckpt_v1;
>       lgsv_ckpt_msg_v2_t ckpt_v2;
>       lgsv_ckpt_msg_v8_t ckpt_v8;
> -    if (lgs_is_peer_v8()) {
> +    if (lgs_check_peer_version(LGS_MBCSV_VERSION_8)) {
>         memset(&ckpt_v8, 0, sizeof(ckpt_v8));
>         ckpt_v8.header.ckpt_rec_type = LGS_CKPT_LOG_WRITE;
>         ckpt_v8.header.num_ckpt_records = 1;
> @@ -3124,7 +3214,7 @@ void lgs_ckpt_log_async(log_stream_t* stream, char* 
> record) {
>         ckpt_v8.ckpt_rec.write_log.c_file_close_time_stamp =
>             stream->act_last_close_timestamp;
>         ckpt_ptr = &ckpt_v8;
> -    } else if (lgs_is_peer_v2()) {
> +    } else if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>         memset(&ckpt_v2, 0, sizeof(ckpt_v2));
>         ckpt_v2.header.ckpt_rec_type = LGS_CKPT_LOG_WRITE;
>         ckpt_v2.header.num_ckpt_records = 1;
> diff --git a/src/log/logd/lgs_mbcsv.h b/src/log/logd/lgs_mbcsv.h
> index 998e843e4..4ec5a4769 100644
> --- a/src/log/logd/lgs_mbcsv.h
> +++ b/src/log/logd/lgs_mbcsv.h
> @@ -36,18 +36,23 @@
>    *            changed from version 2. Instead the configuration object is 
> always
>    *            read when changing from standby to active.
>    */
> -#define LGS_MBCSV_VERSION_1 1
> -#define LGS_MBCSV_VERSION_2 2
> -#define LGS_MBCSV_VERSION_4 4
> -#define LGS_MBCSV_VERSION_5 5
> -#define LGS_MBCSV_VERSION_6 6
> -#define LGS_MBCSV_VERSION_7 7
> -#define LGS_MBCSV_VERSION_8 8
>   
>   /* Current version */
> -#define LGS_MBCSV_VERSION 8
> +#define LGS_MBCSV_VERSION 9
>   #define LGS_MBCSV_VERSION_MIN 1
>   
> +typedef enum {
> +  LGS_MBCSV_VERSION_1 = 1,
> +  LGS_MBCSV_VERSION_2,
> +  LGS_MBCSV_VERSION_3,
> +  LGS_MBCSV_VERSION_4,
> +  LGS_MBCSV_VERSION_5,
> +  LGS_MBCSV_VERSION_6,
> +  LGS_MBCSV_VERSION_7,
> +  LGS_MBCSV_VERSION_8,
> +  LGS_MBCSV_VERSION_9
> +} lgs_mbcsv_version_t;
> +
>   /* Checkpoint message types(Used as 'reotype' w.r.t mbcsv)  */
>   
>   /* Checkpoint update messages are processed similar to lgsv internal
> @@ -108,19 +113,13 @@ typedef struct {
>     char *dest_names;
>     logStreamTypeT streamType;
>     uint32_t logRecordId; /* log record identifier increased for each record 
> */
> +  uint32_t facilityId;
>   } lgs_ckpt_stream_open_t;
>   
>   uint32_t lgs_mbcsv_init(lgs_cb_t *lgs_cb, SaAmfHAStateT ha_state);
>   uint32_t lgs_mbcsv_change_HA_state(lgs_cb_t *cb, SaAmfHAStateT ha_state);
> -bool lgs_is_peer_v2();
> -bool lgs_is_peer_v3();
> -bool lgs_is_peer_v4();
> -bool lgs_is_peer_v5();
> -bool lgs_is_peer_v6();
> -// New numeric values added to logStreamTypeT used in the
> -// lgs_ckpt_stream_open_t structure
> -bool lgs_is_peer_v7();
> -bool lgs_is_peer_v8();
> +
> +bool lgs_check_peer_version(lgs_mbcsv_version_t version);
>   
>   bool lgs_is_split_file_system();
>   uint32_t lgs_mbcsv_dispatch(NCS_MBCSV_HDL mbcsv_hdl);
> diff --git a/src/log/logd/lgs_mbcsv_cache.cc b/src/log/logd/lgs_mbcsv_cache.cc
> index b190c5bea..f9823dcca 100644
> --- a/src/log/logd/lgs_mbcsv_cache.cc
> +++ b/src/log/logd/lgs_mbcsv_cache.cc
> @@ -160,7 +160,7 @@ uint32_t EncodeDecodePopAndWriteAsync(EDU_HDL* edu_hdl, 
> EDU_TKN* edu_tkn,
>   
>   uint32_t DecodePushAsync(lgs_cb_t* cb, void* ckpt_msg,
>                            NCS_MBCSV_CB_ARG* cbk_arg) {
> -  assert(lgs_is_peer_v8());
> +  assert(lgs_check_peer_version(LGS_MBCSV_VERSION_8));
>     TRACE_ENTER();
>     auto ckpt_msg_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_msg);
>     auto data = &ckpt_msg_v8->ckpt_rec.push_async;
> @@ -170,7 +170,7 @@ uint32_t DecodePushAsync(lgs_cb_t* cb, void* ckpt_msg,
>   
>   uint32_t DecodePopAsync(lgs_cb_t* cb, void* ckpt_msg,
>                           NCS_MBCSV_CB_ARG* cbk_arg) {
> -  assert(lgs_is_peer_v8());
> +  assert(lgs_check_peer_version(LGS_MBCSV_VERSION_8));
>     auto ckpt_msg_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_msg);
>     auto data = &ckpt_msg_v8->ckpt_rec.pop_async;
>     return ckpt_decode_log_struct(cb, cbk_arg, ckpt_msg, data,
> @@ -179,7 +179,7 @@ uint32_t DecodePopAsync(lgs_cb_t* cb, void* ckpt_msg,
>   
>   uint32_t DecodePopAndWriteAsync(lgs_cb_t* cb, void* ckpt_msg,
>                                   NCS_MBCSV_CB_ARG* cbk_arg) {
> -  assert(lgs_is_peer_v8());
> +  assert(lgs_check_peer_version(LGS_MBCSV_VERSION_8));
>     auto ckpt_msg_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_msg);
>     auto data = &ckpt_msg_v8->ckpt_rec.pop_and_write_async;
>     return ckpt_decode_log_struct(cb, cbk_arg, ckpt_msg, data,
> @@ -188,7 +188,8 @@ uint32_t DecodePopAndWriteAsync(lgs_cb_t* cb, void* 
> ckpt_msg,
>   
>   uint32_t ckpt_proc_push_async(lgs_cb_t* cb, void* data) {
>     TRACE_ENTER();
> -  assert(lgs_is_peer_v8() && "The peer should run with V8 or beyond!");
> +  assert(lgs_check_peer_version(LGS_MBCSV_VERSION_8) &&
> +         "The peer should run with V8 or beyond!");
>     auto data_v8 = static_cast<lgsv_ckpt_msg_v8_t*>(data);
>     auto param = &data_v8->ckpt_rec.push_async;
>     //Dump(param);
> @@ -204,7 +205,8 @@ uint32_t ckpt_proc_push_async(lgs_cb_t* cb, void* data) {
>   
>   uint32_t ckpt_proc_pop_async(lgs_cb_t* cb, void* data) {
>     TRACE_ENTER();
> -  assert(lgs_is_peer_v8() && "The peer should run with V8 or beyond!");
> +  assert(lgs_check_peer_version(LGS_MBCSV_VERSION_8) &&
> +         "The peer should run with V8 or beyond!");
>     auto data_v8 = static_cast<lgsv_ckpt_msg_v8_t*>(data);
>     auto param = &data_v8->ckpt_rec.pop_async;
>     uint64_t seq_id = param->seq_id;
> @@ -222,7 +224,8 @@ uint32_t ckpt_proc_pop_async(lgs_cb_t* cb, void* data) {
>   
>   uint32_t ckpt_proc_pop_write_async(lgs_cb_t* cb, void* data) {
>     TRACE_ENTER();
> -  assert(lgs_is_peer_v8() && "The peer should run with V8 or beyond!");
> +  assert(lgs_check_peer_version(LGS_MBCSV_VERSION_8) &&
> +         "The peer should run with V8 or beyond!");
>     auto data_v8 = static_cast<lgsv_ckpt_msg_v8_t*>(data);
>     auto param = &data_v8->ckpt_rec.pop_and_write_async;
>     uint64_t seq_id = param->seq_id;
> diff --git a/src/log/logd/lgs_mbcsv_v2.cc b/src/log/logd/lgs_mbcsv_v2.cc
> index e543ad7e7..70726e841 100644
> --- a/src/log/logd/lgs_mbcsv_v2.cc
> +++ b/src/log/logd/lgs_mbcsv_v2.cc
> @@ -47,7 +47,7 @@
>   uint32_t ckpt_proc_lgs_cfg_v2(lgs_cb_t *cb, void *data) {
>     TRACE_ENTER();
>   
> -  if (!lgs_is_peer_v2()) {
> +  if (!lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       LOG_ER("%s ERROR: Called when ceck-point version 1", __FUNCTION__);
>       osafassert(0);
>     }
> diff --git a/src/log/logd/lgs_mbcsv_v3.cc b/src/log/logd/lgs_mbcsv_v3.cc
> index 75fd98dba..f790f9b08 100644
> --- a/src/log/logd/lgs_mbcsv_v3.cc
> +++ b/src/log/logd/lgs_mbcsv_v3.cc
> @@ -46,7 +46,7 @@ uint32_t ckpt_proc_lgs_cfg_v3(lgs_cb_t *cb, void *data) {
>     const char *logsv_data_groupname =
>         static_cast<const char *>(lgs_cfg_get(LGS_IMM_DATA_GROUPNAME));
>   
> -  if (!lgs_is_peer_v4()) {
> +  if (!lgs_check_peer_version(LGS_MBCSV_VERSION_4)) {
>       /* Should never enter here */
>       LOG_ER("%s: Called when peer is not version 4. We should never enter 
> here",
>              __FUNCTION__);
> diff --git a/src/log/logd/lgs_mbcsv_v5.cc b/src/log/logd/lgs_mbcsv_v5.cc
> index d219f8a5b..f3fcfe27b 100644
> --- a/src/log/logd/lgs_mbcsv_v5.cc
> +++ b/src/log/logd/lgs_mbcsv_v5.cc
> @@ -55,7 +55,7 @@ uint32_t ckpt_proc_lgs_cfg_v5(lgs_cb_t *cb, void *data) {
>     /* Flag set if any of the mailbox limit values have changed */
>     bool mailbox_lim_upd = false;
>   
> -  if (!lgs_is_peer_v5()) {
> +  if (!lgs_check_peer_version(LGS_MBCSV_VERSION_5)) {
>       /* Should never enter here */
>       LOG_ER(
>           "%s: Called when peer is not version 5. "
> @@ -137,7 +137,7 @@ uint32_t ckpt_proc_lgs_cfg_v5(lgs_cb_t *cb, void *data) {
>     }
>   
>     // Only support destination configuration since V6
> -  if (lgs_is_peer_v6()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_6)) {
>       const VectorString *vdest;
>       vdest = reinterpret_cast<const VectorString *>(
>           lgs_cfg_get(LGS_IMM_LOG_RECORD_DESTINATION_CONFIGURATION));
> diff --git a/src/log/logd/lgs_mbcsv_v9.cc b/src/log/logd/lgs_mbcsv_v9.cc
> new file mode 100644
> index 000000000..9829ecb31
> --- /dev/null
> +++ b/src/log/logd/lgs_mbcsv_v9.cc
> @@ -0,0 +1,242 @@
> +/*      -*- OpenSAF  -*-
> + *
> + * Copyright Ericsson AB 2020 - All Rights Reserved.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
> + * under the GNU Lesser General Public License Version 2.1, February 1999.
> + * The complete license can be accessed from the following location:
> + * http://opensource.org/licenses/lgpl-license.php
> + * See the Copying file included with the OpenSAF distribution for full
> + * licensing terms.
> + *
> + * Author(s): Ericsson AB
> + *
> + */
> +
> +#include "log/logd/lgs_mbcsv_v9.h"
> +#include "base/logtrace.h"
> +
> +/****************************************************************************
> + * Name          : edp_ed_cfg_stream_rec_v9
> + *
> + * Description   : This function is an EDU program for encoding/decoding
> + *                 lgsv checkpoint cfg_update_stream log rec.
> + *
> + * Arguments     : EDU_HDL - pointer to edu handle,
> + *                 EDU_TKN - internal edu token to help encode/decode,
> + *                 POINTER to the structure to encode/decode from/to,
> + *                 data length specifying number of structures,
> + *                 EDU_BUF_ENV - pointer to buffer for encoding/decoding.
> + *                 op - operation type being encode/decode.
> + *                 EDU_ERR - out param to indicate errors in processing.
> + *
> + * Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
> + *
> + * Notes         : None.
> + 
> *****************************************************************************/
> +
> +uint32_t edp_ed_cfg_stream_rec_v9(EDU_HDL *edu_hdl, EDU_TKN *edu_tkn,
> +                                  NCSCONTEXT ptr, uint32_t *ptr_data_len,
> +                                  EDU_BUF_ENV *buf_env, EDP_OP_TYPE op,
> +                                  EDU_ERR *o_err) {
> +  uint32_t rc = NCSCC_RC_SUCCESS;
> +  lgs_ckpt_stream_cfg_v4_t *ckpt_stream_cfg_msg_ptr = nullptr,
> +                           **ckpt_stream_cfg_msg_dec_ptr;
> +  TRACE_ENTER();
> +  EDU_INST_SET ckpt_stream_cfg_rec_ed_rules[] = {
> +      {EDU_START, edp_ed_cfg_stream_rec_v9, 0, 0, 0,
> +       sizeof(lgs_ckpt_stream_cfg_v4_t), 0, nullptr},
> +      {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +       (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->name, 
> 0,
> +       nullptr},
> +      {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +       (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t 
> *>(0))->fileName,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +       (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t 
> *>(0))->pathName,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_uns64, 0, 0, 0,
> +       (int64_t) &
> +           (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->maxLogFileSize,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +       (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))
> +                       ->fixedLogRecordSize,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +       (int64_t) &
> +           (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->haProperty,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +       (int64_t) &
> +           (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->logFullAction,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +       (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))
> +                       ->logFullHaltThreshold,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +       (int64_t) &
> +           (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t 
> *>(0))->maxFilesRotated,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +       (int64_t) &
> +           (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->logFileFormat,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +       (int64_t) &
> +           (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->severityFilter,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +       (int64_t) &
> +           (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->logFileCurrent,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_string, 0, 0, 0,
> +       (int64_t) &
> +           (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->dest_names,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_uns64, 0, 0, 0,
> +       (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))
> +                       ->c_file_close_time_stamp,
> +       0, nullptr},
> +      {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
> +       (int64_t) &
> +           (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->facilityId,
> +       0, nullptr},
> +      {EDU_END, 0, 0, 0, 0, 0, 0, nullptr},
> +  };
> +
> +  if (op == EDP_OP_TYPE_ENC) {
> +    ckpt_stream_cfg_msg_ptr = static_cast<lgs_ckpt_stream_cfg_v4_t *>(ptr);
> +  } else if (op == EDP_OP_TYPE_DEC) {
> +    ckpt_stream_cfg_msg_dec_ptr = static_cast<lgs_ckpt_stream_cfg_v4_t 
> **>(ptr);
> +    if (*ckpt_stream_cfg_msg_dec_ptr == nullptr) {
> +      *o_err = EDU_ERR_MEM_FAIL;
> +      return NCSCC_RC_FAILURE;
> +    }
> +    memset(*ckpt_stream_cfg_msg_dec_ptr, '\0',
> +           sizeof(lgs_ckpt_stream_cfg_v4_t));
> +    ckpt_stream_cfg_msg_ptr = *ckpt_stream_cfg_msg_dec_ptr;
> +  } else {
> +    ckpt_stream_cfg_msg_ptr = static_cast<lgs_ckpt_stream_cfg_v4_t *>(ptr);
> +  }
> +
> +  rc = m_NCS_EDU_RUN_RULES(edu_hdl, edu_tkn, ckpt_stream_cfg_rec_ed_rules,
> +                           ckpt_stream_cfg_msg_ptr, ptr_data_len, buf_env, 
> op,
> +                           o_err);
> +  TRACE_LEAVE();
> +  return rc;
> +}
> +
> +/****************************************************************************
> + * Name          : edp_ed_ckpt_msg_v9
> + *
> + * Description   : This function is an EDU program for encoding/decoding
> + *                 lgsv checkpoint messages. This program runs the
> + *                 edp_ed_hdr_rec program first to decide the
> + *                 checkpoint message type based on which it will call the
> + *                 appropriate EDU programs for the different checkpoint
> + *                 messages.
> + *
> + * Arguments     : EDU_HDL - pointer to edu handle,
> + *                 EDU_TKN - internal edu token to help encode/decode,
> + *                 POINTER to the structure to encode/decode from/to,
> + *                 data length specifying number of structures,
> + *                 EDU_BUF_ENV - pointer to buffer for encoding/decoding.
> + *                 op - operation type being encode/decode.
> + *                 EDU_ERR - out param to indicate errors in processing.
> + *
> + * Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
> + *
> + * Notes         : None.
> + 
> *****************************************************************************/
> +
> +uint32_t edp_ed_ckpt_msg_v9(EDU_HDL *edu_hdl, EDU_TKN *edu_tkn, NCSCONTEXT 
> ptr,
> +                            uint32_t *ptr_data_len, EDU_BUF_ENV *buf_env,
> +                            EDP_OP_TYPE op, EDU_ERR *o_err) {
> +  uint32_t rc = NCSCC_RC_SUCCESS;
> +  lgsv_ckpt_msg_v9_t *ckpt_msg_ptr = nullptr, **ckpt_msg_dec_ptr;
> +  TRACE_ENTER();
> +  EDU_INST_SET ckpt_msg_ed_rules[] = {
> +      {EDU_START, edp_ed_ckpt_msg_v9, 0, 0, 0, sizeof(lgsv_ckpt_msg_v9_t), 0,
> +       nullptr},
> +      {EDU_EXEC, edp_ed_header_rec, 0, 0, 0,
> +       (int64_t) & (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->header, 0,
> +       nullptr},
> +
> +      {EDU_TEST, ncs_edp_uns32, 0, 0, 0,
> +       (int64_t) & (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->header, 0,
> +       (EDU_EXEC_RTINE)ckpt_msg_test_type},
> +
> +      /* Reg Record */
> +      {EDU_EXEC, edp_ed_reg_rec_v6, 0, 0, static_cast<int>(EDU_EXIT),
> +       (int64_t) & (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))
> +                       ->ckpt_rec.initialize_client,
> +       0, nullptr},
> +
> +      /* Finalize record */
> +      {EDU_EXEC, edp_ed_finalize_rec_v2, 0, 0, static_cast<int>(EDU_EXIT),
> +       (int64_t) & (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))
> +                       ->ckpt_rec.finalize_client,
> +       0, nullptr},
> +
> +      /* write log Record */
> +      {EDU_EXEC, edp_ed_write_rec_v2, 0, 0, static_cast<int>(EDU_EXIT),
> +       (int64_t) &
> +           (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->ckpt_rec.write_log,
> +       0, nullptr},
> +
> +      /* Open stream */
> +      {EDU_EXEC, edp_ed_open_stream_rec, 0, 0, static_cast<int>(EDU_EXIT),
> +       (int64_t) &
> +           (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->ckpt_rec.stream_open,
> +       0, nullptr},
> +
> +      /* Close stream */
> +      {EDU_EXEC, edp_ed_close_stream_rec_v2, 0, 0, 
> static_cast<int>(EDU_EXIT),
> +       (int64_t) &
> +           (reinterpret_cast<lgsv_ckpt_msg_v9_t 
> *>(0))->ckpt_rec.stream_close,
> +       0, nullptr},
> +
> +      /* Agent dest */
> +      {EDU_EXEC, edp_ed_agent_down_rec_v2, 0, 0, static_cast<int>(EDU_EXIT),
> +       (int64_t) &
> +           (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->ckpt_rec.stream_cfg,
> +       0, nullptr},
> +
> +      /* Cfg stream */
> +      {EDU_EXEC, edp_ed_cfg_stream_rec_v9, 0, 0, static_cast<int>(EDU_EXIT),
> +       (int64_t) &
> +           (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->ckpt_rec.stream_cfg,
> +       0, nullptr},
> +
> +      /* Lgs cfg */
> +      {EDU_EXEC, edp_ed_lgs_cfg_rec_v5, 0, 0, static_cast<int>(EDU_EXIT),
> +       (int64_t) &
> +           (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->ckpt_rec.lgs_cfg,
> +       0, nullptr},
> +
> +      {EDU_END, 0, 0, 0, 0, 0, 0, nullptr},
> +  };
> +
> +  if (op == EDP_OP_TYPE_ENC) {
> +    ckpt_msg_ptr = static_cast<lgsv_ckpt_msg_v9_t *>(ptr);
> +  } else if (op == EDP_OP_TYPE_DEC) {
> +    ckpt_msg_dec_ptr = static_cast<lgsv_ckpt_msg_v9_t **>(ptr);
> +    if (*ckpt_msg_dec_ptr == nullptr) {
> +      *o_err = EDU_ERR_MEM_FAIL;
> +      return NCSCC_RC_FAILURE;
> +    }
> +    memset(*ckpt_msg_dec_ptr, '\0', sizeof(lgsv_ckpt_msg_v9_t));
> +    ckpt_msg_ptr = *ckpt_msg_dec_ptr;
> +  } else {
> +    ckpt_msg_ptr = static_cast<lgsv_ckpt_msg_v9_t *>(ptr);
> +  }
> +
> +  rc = m_NCS_EDU_RUN_RULES(edu_hdl, edu_tkn, ckpt_msg_ed_rules, ckpt_msg_ptr,
> +                           ptr_data_len, buf_env, op, o_err);
> +  TRACE_LEAVE();
> +  return rc;
> +}
> diff --git a/src/log/logd/lgs_mbcsv_v9.h b/src/log/logd/lgs_mbcsv_v9.h
> new file mode 100644
> index 000000000..7c3ef9722
> --- /dev/null
> +++ b/src/log/logd/lgs_mbcsv_v9.h
> @@ -0,0 +1,67 @@
> +/*      -*- OpenSAF  -*-
> + *
> + * Copyright Ericsson AB 2020 - All Rights Reserved.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
> + * under the GNU Lesser General Public License Version 2.1, February 1999.
> + * The complete license can be accessed from the following location:
> + * http://opensource.org/licenses/lgpl-license.php
> + * See the Copying file included with the OpenSAF distribution for full
> + * licensing terms.
> + *
> + * Author(s): Ericsson AB
> + *
> + */
> +
> +#ifndef LOG_LOGD_LGS_MBCSV_V9_H_
> +#define LOG_LOGD_LGS_MBCSV_V9_H_
> +
> +#include "log/logd/lgs.h"
> +#include "log/logd/lgs_config.h"
> +#include "log/logd/lgs_mbcsv_v2.h"
> +#include "log/logd/lgs_mbcsv_v5.h"
> +#include "log/logd/lgs_mbcsv_v6.h"
> +
> +typedef struct {
> +  char *name;
> +  char *fileName;
> +  char *pathName;
> +  SaUint64T maxLogFileSize;
> +  SaUint32T fixedLogRecordSize;
> +  SaBoolT haProperty; /* app log stream only */
> +  SaLogFileFullActionT logFullAction;
> +  SaUint32T logFullHaltThreshold; /* !app log stream */
> +  SaUint32T maxFilesRotated;
> +  char *logFileFormat;
> +  SaUint32T severityFilter;
> +  char *logFileCurrent;
> +  char *dest_names;
> +  uint64_t c_file_close_time_stamp; /* Time in sec for file rename on Active 
> */
> +  uint32_t facilityId;
> +} lgs_ckpt_stream_cfg_v4_t;
> +
> +typedef struct {
> +  lgsv_ckpt_header_t header;
> +  union {
> +    lgs_ckpt_initialize_msg_v6_t initialize_client;
> +    lgs_ckpt_finalize_msg_v2_t finalize_client;
> +    lgs_ckpt_write_log_v2_t write_log;
> +    lgs_ckpt_agent_down_v2_t agent_down;
> +    lgs_ckpt_stream_open_t stream_open;
> +    lgs_ckpt_stream_close_v2_t stream_close;
> +    lgs_ckpt_stream_cfg_v4_t stream_cfg;
> +    lgs_ckpt_lgs_cfg_v5_t lgs_cfg;
> +  } ckpt_rec;
> +} lgsv_ckpt_msg_v9_t;
> +
> +uint32_t edp_ed_cfg_stream_rec_v9(EDU_HDL *edu_hdl, EDU_TKN *edu_tkn,
> +                                  NCSCONTEXT ptr, uint32_t *ptr_data_len,
> +                                  EDU_BUF_ENV *buf_env, EDP_OP_TYPE op,
> +                                  EDU_ERR *o_err);
> +uint32_t edp_ed_ckpt_msg_v9(EDU_HDL *edu_hdl, EDU_TKN *edu_tkn, NCSCONTEXT 
> ptr,
> +                            uint32_t *ptr_data_len, EDU_BUF_ENV *buf_env,
> +                            EDP_OP_TYPE op, EDU_ERR *o_err);
> +
> +#endif  // LOG_LOGD_LGS_MBCSV_V9_H_
> diff --git a/src/log/logd/lgs_recov.cc b/src/log/logd/lgs_recov.cc
> index 7c0197b7f..c5f35885c 100644
> --- a/src/log/logd/lgs_recov.cc
> +++ b/src/log/logd/lgs_recov.cc
> @@ -320,6 +320,7 @@ int lgs_restore_one_app_stream(const std::string 
> &stream_name,
>     log_stream_t *log_stream = nullptr;
>     SaTimeT restored_creationTimeStamp = 0;
>     SaUint32T restored_severityFilter = 0;
> +  SaUint32T restored_facilityId = 16;
>   
>     std::string fileName;
>     std::string pathName, fullPathName;
> @@ -501,6 +502,14 @@ int lgs_restore_one_app_stream(const std::string 
> &stream_name,
>         }
>         restored_severityFilter = *(static_cast<SaUint32T *>(value));
>         TRACE("\t saLogStreamSeverityFilter=%d", restored_severityFilter);
> +    } else if (!strcmp(name, "saLogStreamFacilityId")) {
> +      if (value == nullptr) {
> +        TRACE("%s: Fail, has empty value", name);
> +        rc_out = -1;
> +        goto done_free_attr;
> +      }
> +      restored_facilityId = *(static_cast<SaUint32T *>(value));
> +      TRACE("\t saLogStreamFacilityId=%d", restored_facilityId);
>       }
>     }
>   
> @@ -567,6 +576,7 @@ int lgs_restore_one_app_stream(const std::string 
> &stream_name,
>     log_stream->severityFilter = restored_severityFilter;
>     log_stream->filtered = 0;
>     log_stream->isRtStream = SA_TRUE;
> +  log_stream->facilityId = restored_facilityId;
>   
>     TRACE("\t Stream obj attributes handled and stream is created");
>   
> diff --git a/src/log/logd/lgs_stream.cc b/src/log/logd/lgs_stream.cc
> index f2f7df940..bc94a498c 100644
> --- a/src/log/logd/lgs_stream.cc
> +++ b/src/log/logd/lgs_stream.cc
> @@ -33,6 +33,7 @@
>   #include "base/osaf_time.h"
>   #include "osaf/immutil/immutil.h"
>   
> +#include "base/log_message.h"
>   #include "log/logd/lgs.h"
>   #include "log/logd/lgs_config.h"
>   #include "log/logd/lgs_file.h"
> @@ -418,6 +419,7 @@ void log_stream_print(log_stream_t *stream) {
>     TRACE_2("  filtered:             %llu", stream->filtered);
>     TRACE_2("  stb_dest_names:       %s", stream->stb_dest_names.c_str());
>     TRACE_2("  isRtStream:           %d", stream->isRtStream);
> +  TRACE_2("  facilityId:           %u", stream->facilityId);
>   }
>   
>   /**
> @@ -665,6 +667,12 @@ SaAisErrorT lgs_create_appstream_rt_object(log_stream_t 
> *const stream) {
>           .attrValueType = SA_IMM_ATTR_SATIMET,
>           .attrValuesNumber = 1,
>           .attrValues = arr11};
> +    void *arr12[] = {&stream->facilityId};
> +    const SaImmAttrValuesT_2 attr_saLogStreamFacilityId = {
> +        .attrName = const_cast<SaImmAttrNameT>("saLogStreamFacilityId"),
> +        .attrValueType = SA_IMM_ATTR_SAUINT32T,
> +        .attrValuesNumber = 1,
> +        .attrValues = arr12};
>       const SaImmAttrValuesT_2 *attrValues[] = {
>           &attr_safLgStr,
>           &attr_safLogStreamFileName,
> @@ -677,6 +685,7 @@ SaAisErrorT lgs_create_appstream_rt_object(log_stream_t 
> *const stream) {
>           &attr_saLogStreamLogFileFormat,
>           &attr_saLogStreamSeverityFilter,
>           &attr_saLogStreamCreationTimestamp,
> +        &attr_saLogStreamFacilityId,
>           NULL};
>   
>       SaNameT object_name;
> @@ -723,6 +732,8 @@ log_stream_t *log_stream_new(const std::string &name, int 
> stream_id) {
>     stream->severityFilter = 0x7f; /* by default all levels are allowed */
>     stream->isRtStream = SA_FALSE;
>     stream->dest_names.clear();
> +  stream->facilityId =
> +      static_cast<uint32_t>(base::LogMessage::Facility::kLocal0);
>   
>     /* Initiate local or shared stream file descriptor dependant on shared or
>      * split file system
> @@ -1649,7 +1660,7 @@ void lgs_ckpt_stream_open(log_stream_t *stream, 
> uint32_t client_id) {
>   
>     TRACE_ENTER();
>   
> -  if (lgs_is_peer_v2()) {
> +  if (lgs_check_peer_version(LGS_MBCSV_VERSION_2)) {
>       memset(&ckpt_v2, 0, sizeof(ckpt_v2));
>       header_ptr = &ckpt_v2.header;
>       stream_open_ptr = &ckpt_v2.ckpt_rec.stream_open;
> diff --git a/src/log/logd/lgs_stream.h b/src/log/logd/lgs_stream.h
> index 8fdb5693d..a9659582b 100644
> --- a/src/log/logd/lgs_stream.h
> +++ b/src/log/logd/lgs_stream.h
> @@ -53,6 +53,7 @@ typedef struct log_stream {
>     SaUint32T numOpeners;
>     SaUint64T filtered; /* discarded by server due to filtering */
>     std::string rfc5424MsgId;
> +  uint32_t facilityId;
>     /* --- end correspond to IMM Class --- */
>   
>     uint32_t streamId; /* The unique stream id for this stream */
> diff --git a/src/log/logd/lgs_unixsock_dest.cc 
> b/src/log/logd/lgs_unixsock_dest.cc
> index a48250063..e5cbfae0a 100644
> --- a/src/log/logd/lgs_unixsock_dest.cc
> +++ b/src/log/logd/lgs_unixsock_dest.cc
> @@ -70,13 +70,14 @@ void UnixSocketHandler::Open() { FlushStatus(); }
>   
>   void UnixSocketHandler::FormRfc5424(const DestinationHandler::RecordInfo& 
> msg,
>                                       RfcBuffer* buf) {
> +  base::LogMessage::Facility facilityId =
> +      static_cast<base::LogMessage::Facility>(msg.facilityId);
>     base::LogMessage::Severity sev{Sev(msg.severity)};
>     base::LogMessage::HostName hostname{msg.origin};
>     base::LogMessage::ProcId procid{""};
>     base::LogMessage::AppName appname{msg.app_name};
>   
> -  base::LogMessage::Write(base::LogMessage::Facility::kLocal0, sev, msg.time,
> -                          hostname, appname, procid,
> +  base::LogMessage::Write(facilityId, sev, msg.time, hostname, appname, 
> procid,
>                             base::LogMessage::MsgId{msg.msgid}, {},
>                             std::string{msg.log_record}, buf);
>   }





_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to