src/log/Makefile.am          |    2 +
 src/log/common/lgsv_defs.h   |    4 +
 src/log/common/lgsv_msg.h    |    2 +-
 src/log/logd/lgs_cb.h        |    1 +
 src/log/logd/lgs_evt.cc      |   92 ++++++++++++++++-----
 src/log/logd/lgs_mbcsv.cc    |  176 ++++++++++++++++++++++++++++++------------
 src/log/logd/lgs_mbcsv.h     |    8 +-
 src/log/logd/lgs_mbcsv_v6.cc |  169 +++++++++++++++++++++++++++++++++++++++++
 src/log/logd/lgs_mbcsv_v6.h  |   56 +++++++++++++
 src/log/logd/lgs_util.cc     |   30 +++++-
 10 files changed, 456 insertions(+), 84 deletions(-)


Checking minor version and return version error if major/minor version is 
higher than
supported major/minor

Add client_version to log_client_t and checkpoint struct  in lgs

Increase checkpoint version and checkpoint client_ver to stand by

Only send filter callback to client that initialized with minor version > 3

diff --git a/src/log/Makefile.am b/src/log/Makefile.am
--- a/src/log/Makefile.am
+++ b/src/log/Makefile.am
@@ -71,6 +71,7 @@ noinst_HEADERS += \
        src/log/logd/lgs_mbcsv_v2.h \
        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_recov.h \
        src/log/logd/lgs_stream.h \
        src/log/logd/lgs_util.h
@@ -117,6 +118,7 @@ bin_osaflogd_SOURCES = \
        src/log/logd/lgs_mbcsv_v2.cc \
        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_mds.cc \
        src/log/logd/lgs_recov.cc \
        src/log/logd/lgs_stream.cc \
diff --git a/src/log/common/lgsv_defs.h b/src/log/common/lgsv_defs.h
--- a/src/log/common/lgsv_defs.h
+++ b/src/log/common/lgsv_defs.h
@@ -26,6 +26,10 @@
 #define LOG_MAJOR_VERSION_0 2
 #define LOG_MINOR_VERSION_0 1
 
+#define LOG_RELEASE_CODE_1 'A'
+#define LOG_MAJOR_VERSION_1 2
+#define LOG_MINOR_VERSION_1 3
+
 // Waiting time in library for sync send, unit 10ms
 #define LGS_WAIT_TIME 1000
 
diff --git a/src/log/common/lgsv_msg.h b/src/log/common/lgsv_msg.h
--- a/src/log/common/lgsv_msg.h
+++ b/src/log/common/lgsv_msg.h
@@ -129,7 +129,7 @@ typedef struct logsv_loga_clm_status_par
 } logsv_lga_clm_status_cbk_t;
 
 typedef struct {
-SaLogSeverityFlagsT log_severity;
+  SaLogSeverityFlagsT log_severity;
 } lgsv_severity_filter_callback_t;
 
 /* wrapper structure for all the callbacks */
diff --git a/src/log/logd/lgs_cb.h b/src/log/logd/lgs_cb.h
--- a/src/log/logd/lgs_cb.h
+++ b/src/log/logd/lgs_cb.h
@@ -59,6 +59,7 @@ typedef struct {
   NCS_PATRICIA_NODE pat_node;
   uint32_t client_id;
   uint32_t client_id_net;
+  SaVersionT client_ver;
   MDS_DEST mds_dest;
   lgs_stream_list_t *stream_list_root;
 } log_client_t;
diff --git a/src/log/logd/lgs_evt.cc b/src/log/logd/lgs_evt.cc
--- a/src/log/logd/lgs_evt.cc
+++ b/src/log/logd/lgs_evt.cc
@@ -21,16 +21,12 @@
 
 #include "lgs_mbcsv_v1.h"
 #include "lgs_mbcsv_v2.h"
+#include "lgs_mbcsv_v6.h"
 #include "lgs_recov.h"
 #include "lgs_imm_gcfg.h"
 #include "base/osaf_extended_name.h"
 #include "lgs_clm.h"
 
-/* Macro to validate the version */
-#define m_LOG_VER_IS_VALID(ver)                                         \
-  ( (ver->releaseCode == LOG_RELEASE_CODE) &&                           \
-    (ver->majorVersion == LOG_MAJOR_VERSION || ver->minorVersion == 
LOG_MINOR_VERSION))
-
 static uint32_t process_api_evt(lgsv_lgs_evt_t *evt);
 static uint32_t proc_lga_updn_mds_msg(lgsv_lgs_evt_t *evt);
 static uint32_t proc_mds_quiesced_ack_msg(lgsv_lgs_evt_t *evt);
@@ -58,6 +54,18 @@ LGSV_LGS_LGA_API_MSG_HANDLER lgs_lga_api
 };
 
 /**
+ * Check if the log version is valid
+ * @param version
+ *
+ * @return true if log version is valid
+ */
+bool log_version_is_valid(SaVersionT *version) {
+  return ((version->releaseCode == LOG_RELEASE_CODE) &&
+          (version->majorVersion <= LOG_MAJOR_VERSION) &&
+          (version->minorVersion <= LOG_MINOR_VERSION));
+}
+
+/**
  * Get client record from client ID
  * @param client_id
  *
@@ -605,6 +613,58 @@ done:
 }
 
 /**
+ * Stream initialize checkpointing
+ * @param cb
+ * @param logStream
+ * @param open_sync_param
+ * @return
+ */
+static uint32_t lgs_ckpt_initialize(lgs_cb_t *cb, MDS_DEST mds_dest,
+                                    log_client_t *client) {
+  uint32_t async_rc = NCSCC_RC_SUCCESS;
+  lgsv_ckpt_msg_v1_t ckpt_v1;
+  lgsv_ckpt_msg_v6_t ckpt_v6;
+  void *ckpt_ptr = NULL;
+  lgsv_ckpt_header_t *header_ptr = NULL;
+
+  TRACE_ENTER();
+
+  if (cb->ha_state == SA_AMF_HA_ACTIVE) {
+    if (lgs_is_peer_v6()) {
+      lgs_ckpt_initialize_msg_v6_t *ckpt_rec_ptr;
+      memset(&ckpt_v6, 0, sizeof(ckpt_v6));
+      header_ptr = &ckpt_v6.header;
+      ckpt_rec_ptr = &ckpt_v6.ckpt_rec.initialize_client;
+      ckpt_ptr = &ckpt_v6;
+
+      ckpt_rec_ptr->client_id = client->client_id;
+      ckpt_rec_ptr->mds_dest = mds_dest;
+      ckpt_rec_ptr->client_ver = client->client_ver;
+    } else {
+      lgs_ckpt_initialize_msg_t *ckpt_rec_ptr;
+      memset(&ckpt_v1, 0, sizeof(ckpt_v1));
+      header_ptr = &ckpt_v1.header;
+      ckpt_rec_ptr = &ckpt_v1.ckpt_rec.initialize_client;
+      ckpt_ptr = &ckpt_v1;
+
+      ckpt_rec_ptr->client_id = client->client_id;
+      ckpt_rec_ptr->mds_dest = mds_dest;
+    }
+
+    header_ptr->ckpt_rec_type = LGS_CKPT_CLIENT_INITIALIZE;
+    header_ptr->num_ckpt_records = 1;
+    header_ptr->data_len = 1;
+    async_rc = lgs_ckpt_send_async(cb, ckpt_ptr, NCS_MBCSV_ACT_ADD);
+    if (async_rc == NCSCC_RC_SUCCESS) {
+      TRACE_4("ASYNC UPDATE SEND SUCCESS for INITIALIZE ..");
+    }
+  }
+
+  TRACE_LEAVE2("async_rc = %d",async_rc);
+  return async_rc;
+}
+
+/**
  * Handle a initialize message
  * @param cb
  * @param evt
@@ -617,21 +677,12 @@ static uint32_t proc_initialize_msg(lgs_
   SaVersionT *version;
   lgsv_msg_t msg;
   log_client_t *client = NULL;
-  lgsv_ckpt_msg_v1_t ckpt_v1;
-  void *ckpt_ptr;
-  lgsv_ckpt_header_t *header_ptr;
-  lgs_ckpt_initialize_msg_t *ckpt_rec_ptr;
 
   TRACE_ENTER2("dest %" PRIx64, evt->fr_dest);
 
-  memset(&ckpt_v1, 0, sizeof(ckpt_v1));
-  header_ptr = &ckpt_v1.header;
-  ckpt_rec_ptr = &ckpt_v1.ckpt_rec.initialize_client;
-  ckpt_ptr = &ckpt_v1;
-
   /* Validate the version */
   version = &(evt->info.msg.info.api_info.param.init.version);
-  if (!m_LOG_VER_IS_VALID(version)) {
+  if (!log_version_is_valid(version)) {
     ais_rc = SA_AIS_ERR_VERSION;
     TRACE("version FAILED");
     goto snd_rsp;
@@ -648,15 +699,10 @@ static uint32_t proc_initialize_msg(lgs_
     goto snd_rsp;
   }
 
+  client->client_ver = *version;
+
   /* Checkpoint */
-  if (cb->ha_state == SA_AMF_HA_ACTIVE) {
-    header_ptr->ckpt_rec_type = LGS_CKPT_CLIENT_INITIALIZE;
-    header_ptr->num_ckpt_records = 1;
-    header_ptr->data_len = 1;
-    ckpt_rec_ptr->client_id = cb->last_client_id;
-    ckpt_rec_ptr->mds_dest = evt->fr_dest;
-    (void)lgs_ckpt_send_async(cb, ckpt_ptr, NCS_MBCSV_ACT_ADD);
-  }
+  lgs_ckpt_initialize(cb, evt->fr_dest, client);
 
 snd_rsp:
   msg.type = LGSV_LGA_API_RESP_MSG;
diff --git a/src/log/logd/lgs_mbcsv.cc b/src/log/logd/lgs_mbcsv.cc
--- a/src/log/logd/lgs_mbcsv.cc
+++ b/src/log/logd/lgs_mbcsv.cc
@@ -20,6 +20,7 @@
 #include "base/ncssysf_mem.h"
 #include "base/osaf_time.h"
 
+#include "lgs_mbcsv_v6.h"
 #include "lgs_mbcsv_v5.h"
 #include "lgs_mbcsv_v3.h"
 #include "lgs_mbcsv_v2.h"
@@ -55,10 +56,6 @@
  *
  */
 
-static uint32_t edp_ed_stream_list(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);
-
 static uint32_t ckpt_proc_initialize_client(lgs_cb_t *cb, void *data);
 static uint32_t ckpt_proc_finalize_client(lgs_cb_t *cb, void *data);
 static uint32_t ckpt_proc_agent_down(lgs_cb_t *cb, void *data);
@@ -360,6 +357,18 @@ bool lgs_is_peer_v5() {
 }
 
 /**
+ * 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 configured for split file system.
  * If other node is version 1 split file system mode is not applicable.
  *
@@ -674,26 +683,21 @@ static uint32_t edu_enc_streams(lgs_cb_t
 
 static uint32_t edu_enc_reg_list(lgs_cb_t *cb, NCS_UBAID *uba) {
   log_client_t *client = NULL;
-  lgs_ckpt_initialize_msg_t *ckpt_reg_rec;
+  lgs_ckpt_initialize_msg_t ckpt_reg_rec ;
+  lgs_ckpt_initialize_msg_v6_t ckpt_reg_rec_v6;
+  void *ckpt_client_reg;
   EDU_ERR ederror;
   uint32_t rc = NCSCC_RC_SUCCESS, num_rec = 0;
   uint8_t *pheader = NULL;
   lgsv_ckpt_header_t ckpt_hdr;
+  EDU_PROG_HANDLER edp_function_reg = NULL;
 
   TRACE_ENTER();
 
-  /* Prepare reg. structure to encode */
-  ckpt_reg_rec = static_cast<lgs_ckpt_initialize_msg_t 
*>(malloc(sizeof(lgs_ckpt_initialize_msg_t)));
-  if (ckpt_reg_rec == NULL) {
-    LOG_WA("malloc FAILED");
-    return (NCSCC_RC_FAILURE);
-  }
-
   /*Reserve space for "Checkpoint Header" */
   pheader = ncs_enc_reserve_space(uba, sizeof(lgsv_ckpt_header_t));
   if (pheader == NULL) {
     TRACE("  ncs_enc_reserve_space FAILED");
-    free(ckpt_reg_rec);
     return (rc = EDU_ERR_MEM_FAIL);
   }
   ncs_enc_claim_space(uba, sizeof(lgsv_ckpt_header_t));
@@ -702,16 +706,26 @@ static uint32_t edu_enc_reg_list(lgs_cb_
 
   /* Walk through the reg list and encode record by record */
   while (client != NULL) {
-    ckpt_reg_rec->client_id = client->client_id;
-    ckpt_reg_rec->mds_dest = client->mds_dest;
-    ckpt_reg_rec->stream_list = client->stream_list_root;
+    if (lgs_is_peer_v6()) {
+      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;
+      ckpt_reg_rec_v6.client_ver = client->client_ver;
+      ckpt_client_reg = &ckpt_reg_rec_v6;
+      edp_function_reg = edp_ed_reg_rec_v6;
+    } else {
+      ckpt_reg_rec.client_id = client->client_id;
+      ckpt_reg_rec.mds_dest = client->mds_dest;
+      ckpt_reg_rec.stream_list = client->stream_list_root;
+      ckpt_client_reg = &ckpt_reg_rec;
+      edp_function_reg = edp_ed_reg_rec;
+    }
 
-    rc = m_NCS_EDU_EXEC(&cb->edu_hdl, edp_ed_reg_rec, uba, EDP_OP_TYPE_ENC, 
ckpt_reg_rec, &ederror);
+    rc = m_NCS_EDU_EXEC(&cb->edu_hdl, edp_function_reg, uba, EDP_OP_TYPE_ENC, 
ckpt_client_reg, &ederror);
 
     if (rc != NCSCC_RC_SUCCESS) {
       m_NCS_EDU_PRINT_ERROR_STRING(ederror);
       TRACE("  m_NCS_EDU_EXEC FAILED");
-      free(ckpt_reg_rec);
       return rc;
     }
     ++num_rec;
@@ -728,7 +742,6 @@ static uint32_t edu_enc_reg_list(lgs_cb_
 
   enc_ckpt_header(pheader, ckpt_hdr);
 
-  free(ckpt_reg_rec);
   TRACE_LEAVE();
   return NCSCC_RC_SUCCESS;
 }       /* End edu_enc_reg_list() */
@@ -750,6 +763,7 @@ static uint32_t edu_enc_reg_list(lgs_cb_
  ****************************************************************************/
 
 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_v6_t *data_v6 = NULL;
   lgsv_ckpt_msg_v5_t *data_v5 = NULL;
   lgsv_ckpt_msg_v3_t *data_v3 = NULL;
   lgsv_ckpt_msg_v2_t *data_v2 = NULL;
@@ -761,7 +775,12 @@ static uint32_t ckpt_encode_async_update
 
   TRACE_ENTER();
   /* Set reo_hdl from callback arg to ckpt_rec */
-  if (lgs_is_peer_v5()) {
+  if (lgs_is_peer_v6()) {
+    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()) {
     data_v5 = reinterpret_cast<lgsv_ckpt_msg_v5_t *>(
         static_cast<long>(cbk_arg->info.encode.io_reo_hdl));
     vdata = data_v5;
@@ -1111,11 +1130,14 @@ static uint32_t ckpt_decode_async_update
   lgsv_ckpt_msg_v3_t *ckpt_msg_v3 = &msg_v3;
   lgsv_ckpt_msg_v5_t msg_v5;
   lgsv_ckpt_msg_v5_t *ckpt_msg_v5 = &msg_v5;
+  lgsv_ckpt_msg_v6_t msg_v6;
+  lgsv_ckpt_msg_v6_t *ckpt_msg_v6 = &msg_v6;
   void *ckpt_msg;
   lgsv_ckpt_header_t hdr, *hdr_ptr = &hdr;
 
+  void *reg_rec;
+  EDU_PROG_HANDLER edp_function_reg = NULL;
   /* Same in all versions */
-  lgs_ckpt_initialize_msg_t *reg_rec;
   lgs_ckpt_stream_open_t *stream_open;
 
   TRACE_ENTER();
@@ -1130,7 +1152,10 @@ static uint32_t ckpt_decode_async_update
 
   TRACE_2("\tckpt_rec_type: %d ", (int)hdr_ptr->ckpt_rec_type);
 
-  if (lgs_is_peer_v5()) {
+  if (lgs_is_peer_v6()) {
+    ckpt_msg_v6->header = hdr;
+    ckpt_msg = ckpt_msg_v6;
+  } else   if (lgs_is_peer_v5()) {
     ckpt_msg_v5->header = hdr;
     ckpt_msg = ckpt_msg_v5;
   } else if (lgs_is_peer_v4()) {
@@ -1148,17 +1173,24 @@ static uint32_t ckpt_decode_async_update
   switch (hdr_ptr->ckpt_rec_type) {
     case LGS_CKPT_CLIENT_INITIALIZE:
       TRACE_2("\tINITIALIZE REC: UPDATE");
-      if (lgs_is_peer_v5()) {
+      if (lgs_is_peer_v6()) {
+        reg_rec = &ckpt_msg_v6->ckpt_rec.initialize_client;
+        edp_function_reg = edp_ed_reg_rec_v6;
+      }  else if (lgs_is_peer_v5()) {
         reg_rec = &ckpt_msg_v5->ckpt_rec.initialize_client;
+        edp_function_reg = edp_ed_reg_rec;
       } else if (lgs_is_peer_v4()) {
         reg_rec = &ckpt_msg_v3->ckpt_rec.initialize_client;
+        edp_function_reg = edp_ed_reg_rec;
       } else if (lgs_is_peer_v2()) {
         reg_rec = &ckpt_msg_v2->ckpt_rec.initialize_client;
+        edp_function_reg = edp_ed_reg_rec;
       } else {
         reg_rec = &ckpt_msg_v1->ckpt_rec.initialize_client;
+        edp_function_reg = edp_ed_reg_rec;
       }
 
-      rc = ckpt_decode_log_struct(cb, cbk_arg, ckpt_msg, reg_rec, 
edp_ed_reg_rec);
+      rc = ckpt_decode_log_struct(cb, cbk_arg, ckpt_msg, reg_rec, 
edp_function_reg);
       if (rc != NCSCC_RC_SUCCESS) {
         goto done;
       }
@@ -1173,7 +1205,9 @@ static uint32_t ckpt_decode_async_update
 
     case LGS_CKPT_OPEN_STREAM: /* 4 */
       TRACE_2("\tSTREAM OPEN: UPDATE");
-      if (lgs_is_peer_v5()) {
+      if (lgs_is_peer_v6()) {
+        stream_open = &ckpt_msg_v6->ckpt_rec.stream_open;
+      } else if (lgs_is_peer_v5()) {
         stream_open = &ckpt_msg_v5->ckpt_rec.stream_open;
       } else if (lgs_is_peer_v4()) {
         stream_open = &ckpt_msg_v3->ckpt_rec.stream_open;
@@ -1267,19 +1301,21 @@ static uint32_t ckpt_decode_cold_sync(lg
   EDU_ERR ederror;
   lgsv_ckpt_msg_v1_t msg_v1;
   lgsv_ckpt_msg_v2_t msg_v2;
+  lgsv_ckpt_msg_v6_t msg_v6;
   uint32_t num_rec = 0;
-  lgs_ckpt_initialize_msg_t *reg_rec = NULL;
+  void *reg_rec = NULL;
   lgs_ckpt_stream_open_t *stream_rec = NULL;
   uint32_t num_of_async_upd;
   uint8_t *ptr;
   uint8_t data_cnt[16];
 
   lgsv_ckpt_header_t *header;
-  lgs_ckpt_initialize_msg_t *initialize_client_rec_ptr;
+  void *initialize_client_rec_ptr;
   lgs_ckpt_stream_open_t *stream_open_rec_ptr;
   void *vckpt_rec;
   size_t ckpt_rec_size;
   void *vdata;
+  EDU_PROG_HANDLER edp_function_reg = edp_ed_reg_rec;
 
   TRACE_ENTER();
   /*
@@ -1288,7 +1324,16 @@ static uint32_t ckpt_decode_cold_sync(lg
      -------------------------------------------------
   */
 
-  if (lgs_is_peer_v2()) {
+  if (lgs_is_peer_v6()) {
+    lgsv_ckpt_msg_v6_t *data_v6 = &msg_v6;
+    header = &data_v6->header;
+    initialize_client_rec_ptr = &data_v6->ckpt_rec.initialize_client;
+    stream_open_rec_ptr = &data_v6->ckpt_rec.stream_open;
+    vdata = data_v6;
+    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()) {
     lgsv_ckpt_msg_v2_t *data_v2 = &msg_v2;
     header = &data_v2->header;
     initialize_client_rec_ptr = &data_v2->ckpt_rec.initialize_client;
@@ -1324,7 +1369,7 @@ static uint32_t ckpt_decode_cold_sync(lg
   TRACE("regid: num_rec = %u", num_rec);
   while (num_rec) {
     reg_rec = initialize_client_rec_ptr;
-    rc = m_NCS_EDU_EXEC(&cb->edu_hdl, edp_ed_reg_rec, 
&cbk_arg->info.decode.i_uba,
+    rc = m_NCS_EDU_EXEC(&cb->edu_hdl, edp_function_reg, 
&cbk_arg->info.decode.i_uba,
                         EDP_OP_TYPE_DEC, &reg_rec, &ederror);
 
     if (rc != NCSCC_RC_SUCCESS) {
@@ -1417,13 +1462,17 @@ static uint32_t process_ckpt_data(lgs_cb
   lgsv_ckpt_msg_v2_t *data_v2;
   lgsv_ckpt_msg_v3_t *data_v3;
   lgsv_ckpt_msg_v5_t *data_v5;
+  lgsv_ckpt_msg_v6_t *data_v6;
 
   if ((!cb) || (data == NULL)) {
     TRACE("%s - FAILED: (!cb) || (data == NULL)", __FUNCTION__);
     return (rc = NCSCC_RC_FAILURE);
   }
 
-  if (lgs_is_peer_v5()) {
+  if (lgs_is_peer_v6()) {
+    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()) {
     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()) {
@@ -1471,30 +1520,48 @@ static uint32_t process_ckpt_data(lgs_cb
 
 static uint32_t ckpt_proc_initialize_client(lgs_cb_t *cb, void *data) {
   log_client_t *client;
-  lgs_ckpt_initialize_msg_t *param;
 
-  if (lgs_is_peer_v2()) {
-    lgsv_ckpt_msg_v2_t *data_v2 = static_cast<lgsv_ckpt_msg_v2_t *>(data);
-    param = &data_v2->ckpt_rec.initialize_client;
+  if (lgs_is_peer_v6()) {
+    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;
+
+    TRACE_ENTER2("client ID: %d", param->client_id);
+    client = lgs_client_get_by_id(param->client_id);
+    if (client == NULL) {
+      /* Client does not exist, create new one */
+      if ((client = lgs_client_new(param->mds_dest, param->client_id, 
param->stream_list)) == NULL) {
+        /* Do not allow standby to get out of sync */
+        lgs_exit("Could not create new client", SA_AMF_COMPONENT_RESTART);
+      } else {
+        client->client_ver = param->client_ver;
+      }
+    } else {
+      /* Client with ID already exist, check other attributes */
+      if (client->mds_dest != param->mds_dest) {
+        /* Do not allow standby to get out of sync */
+        lgs_exit("Client attributes differ", SA_AMF_COMPONENT_RESTART);
+      }
+    }
   } else {
+    lgs_ckpt_initialize_msg_t *param;
     lgsv_ckpt_msg_v1_t *data_v1 = static_cast<lgsv_ckpt_msg_v1_t *>(data);
     param = &data_v1->ckpt_rec.initialize_client;
-  }
 
-  TRACE_ENTER2("client ID: %d", param->client_id);
-
-  client = lgs_client_get_by_id(param->client_id);
-  if (client == NULL) {
-    /* Client does not exist, create new one */
-    if ((client = lgs_client_new(param->mds_dest, param->client_id, 
param->stream_list)) == NULL) {
-      /* Do not allow standby to get out of sync */
-      lgs_exit("Could not create new client", SA_AMF_COMPONENT_RESTART);
-    }
-  } else {
-    /* Client with ID already exist, check other attributes */
-    if (client->mds_dest != param->mds_dest) {
-      /* Do not allow standby to get out of sync */
-      lgs_exit("Client attributes differ", SA_AMF_COMPONENT_RESTART);
+    TRACE_ENTER2("client ID: %d", param->client_id);
+    client = lgs_client_get_by_id(param->client_id);
+    if (client == NULL) {
+      /* Client does not exist, create new one */
+      if ((client = lgs_client_new(param->mds_dest, param->client_id, 
param->stream_list)) == NULL) {
+        /* Do not allow standby to get out of sync */
+        lgs_exit("Could not create new client", SA_AMF_COMPONENT_RESTART);
+      }
+    } else {
+      /* Client with ID already exist, check other attributes */
+      if (client->mds_dest != param->mds_dest) {
+        /* Do not allow standby to get out of sync */
+        lgs_exit("Client attributes differ", SA_AMF_COMPONENT_RESTART);
+      }
     }
   }
 
@@ -2176,7 +2243,10 @@ uint32_t lgs_ckpt_send_async(lgs_cb_t *c
   NCS_MBCSV_ARG mbcsv_arg;
   lgsv_ckpt_msg_type_t ckpt_rec_type;
 
-  if (lgs_is_peer_v5()) {
+  if (lgs_is_peer_v6()) {
+    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()) {
     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()) {
@@ -2232,7 +2302,7 @@ static uint32_t ckpt_peer_info_cbk_handl
 
   lgs_cb->mbcsv_peer_version = arg->info.peer.i_peer_version;
   if (lgs_cb->mbcsv_peer_version < LGS_MBCSV_VERSION_MIN) {
-    TRACE("peer_version not correct!!\n");
+    TRACE("peer_version (%d) not correct!!\n", lgs_cb->mbcsv_peer_version);
     return NCSCC_RC_FAILURE;
   }
   TRACE("%s - peer_version = %d",__FUNCTION__, lgs_cb->mbcsv_peer_version);
@@ -2304,8 +2374,8 @@ static uint32_t ckpt_err_ind_cbk_handler
  * @param o_err
  * @return
  */
-static uint32_t edp_ed_stream_list(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_stream_list(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_stream_list_t *ckpt_stream_list_msg_ptr = NULL, 
**ckpt_stream_list_msg_dec_ptr;
 
diff --git a/src/log/logd/lgs_mbcsv.h b/src/log/logd/lgs_mbcsv.h
--- a/src/log/logd/lgs_mbcsv.h
+++ b/src/log/logd/lgs_mbcsv.h
@@ -38,9 +38,10 @@
 #define LGS_MBCSV_VERSION_2 2
 #define LGS_MBCSV_VERSION_4 4
 #define LGS_MBCSV_VERSION_5 5
+#define LGS_MBCSV_VERSION_6 6
 
 /* Current version */
-#define LGS_MBCSV_VERSION 5
+#define LGS_MBCSV_VERSION 6
 #define LGS_MBCSV_VERSION_MIN 1
 
 /* Checkpoint message types(Used as 'reotype' w.r.t mbcsv)  */
@@ -106,6 +107,7 @@ 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();
 bool lgs_is_split_file_system();
 uint32_t lgs_mbcsv_dispatch(NCS_MBCSV_HDL mbcsv_hdl);
 void lgs_free_edu_mem(char *ptr);
@@ -115,6 +117,10 @@ uint32_t edp_ed_header_rec(EDU_HDL *edu_
                            NCSCONTEXT ptr, uint32_t *ptr_data_len,
                            EDU_BUF_ENV *buf_env, EDP_OP_TYPE op, EDU_ERR 
*o_err);
 int32_t ckpt_msg_test_type(NCSCONTEXT arg);
+
+uint32_t edp_ed_stream_list(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_reg_rec(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);
diff --git a/src/log/logd/lgs_mbcsv_v6.cc b/src/log/logd/lgs_mbcsv_v6.cc
new file mode 100644
--- /dev/null
+++ b/src/log/logd/lgs_mbcsv_v6.cc
@@ -0,0 +1,169 @@
+/*      -*- OpenSAF  -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ * File:   lgs_mbcsv_v5.c
+ *
+ * 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 "lgs_mbcsv_v6.h"
+
+
+/****************************************************************************
+ * Name          : edp_ed_reg_rec_v6
+ *
+ * Description   : This function is an EDU program for encoding/decoding
+ *                 lgsv checkpoint registration 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_reg_rec_v6(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_initialize_msg_t *ckpt_reg_msg_ptr = NULL, **ckpt_reg_msg_dec_ptr;
+
+  EDU_INST_SET ckpt_reg_rec_ed_rules[] = {
+    {EDU_START, edp_ed_reg_rec_v6, 0, 0, 0, 
sizeof(lgs_ckpt_initialize_msg_v6_t), 0, NULL},
+    {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, (long)&((lgs_ckpt_initialize_msg_v6_t 
*)0)->client_id, 0, NULL},
+    {EDU_EXEC, ncs_edp_mds_dest, 0, 0, 0, 
(long)&((lgs_ckpt_initialize_msg_v6_t *)0)->mds_dest, 0, NULL},
+    {EDU_EXEC, edp_ed_stream_list, EDQ_POINTER, 0, 0, 
(long)&((lgs_ckpt_initialize_msg_v6_t *)0)->stream_list,
+     0, NULL},
+    {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, (long)&((lgs_ckpt_initialize_msg_v6_t 
*)0)->client_ver, 0, NULL},
+    {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
+  };
+
+  if (op == EDP_OP_TYPE_ENC) {
+    ckpt_reg_msg_ptr = static_cast<lgs_ckpt_initialize_msg_t *>(ptr);
+  } else if (op == EDP_OP_TYPE_DEC) {
+    ckpt_reg_msg_dec_ptr = static_cast<lgs_ckpt_initialize_msg_t **>(ptr);
+
+    if (*ckpt_reg_msg_dec_ptr == NULL) {
+      *o_err = EDU_ERR_MEM_FAIL;
+      return NCSCC_RC_FAILURE;
+    }
+    memset(*ckpt_reg_msg_dec_ptr, '\0', sizeof(lgs_ckpt_initialize_msg_t));
+    ckpt_reg_msg_ptr = *ckpt_reg_msg_dec_ptr;
+  } else {
+    ckpt_reg_msg_ptr = static_cast<lgs_ckpt_initialize_msg_t *>(ptr);
+  }
+
+  rc = m_NCS_EDU_RUN_RULES(edu_hdl, edu_tkn,
+                           ckpt_reg_rec_ed_rules,
+                           ckpt_reg_msg_ptr,
+                           ptr_data_len,
+                           buf_env, op, o_err);
+  return rc;
+}       /* End edp_ed_reg_rec */
+
+/****************************************************************************
+ * Name          : edp_ed_ckpt_msg_v6
+ *
+ * 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_v6(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_v6_t *ckpt_msg_ptr = NULL, **ckpt_msg_dec_ptr;
+
+  EDU_INST_SET ckpt_msg_ed_rules[] = {
+    {EDU_START, edp_ed_ckpt_msg_v6, 0, 0, 0, sizeof(lgsv_ckpt_msg_v6_t), 0, 
NULL},
+    {EDU_EXEC, edp_ed_header_rec, 0, 0, 0, (long)&((lgsv_ckpt_msg_v6_t 
*)0)->header, 0, NULL},
+
+    {EDU_TEST, ncs_edp_uns32, 0, 0, 0, (long)&((lgsv_ckpt_msg_v6_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),
+     (long)&((lgsv_ckpt_msg_v6_t *)0)->ckpt_rec.initialize_client, 0, NULL},
+
+    /* Finalize record */
+    {EDU_EXEC, edp_ed_finalize_rec_v2, 0, 0, static_cast<int>(EDU_EXIT),
+     (long)&((lgsv_ckpt_msg_v6_t *)0)->ckpt_rec.finalize_client, 0, NULL},
+
+    /* write log Record */
+    {EDU_EXEC, edp_ed_write_rec_v2, 0, 0, static_cast<int>(EDU_EXIT),
+     (long)&((lgsv_ckpt_msg_v6_t *)0)->ckpt_rec.write_log, 0, NULL},
+
+    /* Open stream */
+    {EDU_EXEC, edp_ed_open_stream_rec, 0, 0, static_cast<int>(EDU_EXIT),
+     (long)&((lgsv_ckpt_msg_v6_t *)0)->ckpt_rec.stream_open, 0, NULL},
+
+    /* Close stream */
+    {EDU_EXEC, edp_ed_close_stream_rec_v2, 0, 0, static_cast<int>(EDU_EXIT),
+     (long)&((lgsv_ckpt_msg_v6_t *)0)->ckpt_rec.stream_close, 0, NULL},
+
+    /* Agent dest */
+    {EDU_EXEC, edp_ed_agent_down_rec_v2, 0, 0, static_cast<int>(EDU_EXIT),
+     (long)&((lgsv_ckpt_msg_v6_t *)0)->ckpt_rec.stream_cfg, 0, NULL},
+
+    /* Cfg stream */
+    {EDU_EXEC, edp_ed_cfg_stream_rec_v2, 0, 0, static_cast<int>(EDU_EXIT),
+     (long)&((lgsv_ckpt_msg_v6_t *)0)->ckpt_rec.stream_cfg, 0, NULL},
+
+    /* Lgs cfg */
+    {EDU_EXEC, edp_ed_lgs_cfg_rec_v5, 0, 0, static_cast<int>(EDU_EXIT),
+     (long)&((lgsv_ckpt_msg_v6_t *)0)->ckpt_rec.lgs_cfg, 0, NULL},
+
+    {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
+  };
+
+  if (op == EDP_OP_TYPE_ENC) {
+    ckpt_msg_ptr = static_cast<lgsv_ckpt_msg_v6_t *>(ptr);
+  } else if (op == EDP_OP_TYPE_DEC) {
+    ckpt_msg_dec_ptr = static_cast<lgsv_ckpt_msg_v6_t **>(ptr);
+    if (*ckpt_msg_dec_ptr == NULL) {
+      *o_err = EDU_ERR_MEM_FAIL;
+      return NCSCC_RC_FAILURE;
+    }
+    memset(*ckpt_msg_dec_ptr, '\0', sizeof(lgsv_ckpt_msg_v6_t));
+    ckpt_msg_ptr = *ckpt_msg_dec_ptr;
+  } else {
+    ckpt_msg_ptr = static_cast<lgsv_ckpt_msg_v6_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);
+
+  return rc;
+
+}       /* End edu_enc_dec_ckpt_msg() */
diff --git a/src/log/logd/lgs_mbcsv_v6.h b/src/log/logd/lgs_mbcsv_v6.h
new file mode 100644
--- /dev/null
+++ b/src/log/logd/lgs_mbcsv_v6.h
@@ -0,0 +1,56 @@
+/*      -*- OpenSAF  -*-
+ * File:   lgs_mbcsv_v4.h
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * 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_V6_H_
+#define LOG_LOGD_LGS_MBCSV_V6_H_
+
+#include "log/logd/lgs.h"
+#include "lgs_config.h"
+#include "lgs_mbcsv_v2.h"
+#include "lgs_mbcsv_v5.h"
+
+/* Initialize checkpoint record, used in cold/async checkpoint updates */
+typedef struct {
+  uint32_t client_id;     /* Client Id at Active */
+  MDS_DEST mds_dest;      /* Handy when an LGA instance goes away */
+  lgs_stream_list_t *stream_list;
+  SaVersionT client_ver;  /* Version of client that was initialized */
+} lgs_ckpt_initialize_msg_v6_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_v2_t stream_cfg;
+    lgs_ckpt_lgs_cfg_v5_t lgs_cfg;
+  } ckpt_rec;
+} lgsv_ckpt_msg_v6_t;
+
+uint32_t edp_ed_reg_rec_v6(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_v6(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_V6_H_
diff --git a/src/log/logd/lgs_util.cc b/src/log/logd/lgs_util.cc
--- a/src/log/logd/lgs_util.cc
+++ b/src/log/logd/lgs_util.cc
@@ -835,6 +835,23 @@ bool lgs_is_extended_name_valid(const Sa
   return true;
 }
 
+/**
+ * Check if severity filter is supported for client
+ *
+ * @param client_ver
+ * @return: true if severity filter is supported for client
+ */
+bool is_filter_supported(SaVersionT client_ver) {
+  if ((client_ver.releaseCode > LOG_RELEASE_CODE_1) ||
+      ((client_ver.releaseCode == LOG_RELEASE_CODE_1 &&
+        client_ver.majorVersion > LOG_MAJOR_VERSION_1)) ||
+      ((client_ver.releaseCode == LOG_RELEASE_CODE_1 &&
+        client_ver.majorVersion == LOG_MAJOR_VERSION_1 &&
+        client_ver.minorVersion >= LOG_MINOR_VERSION_1))) {
+    return true;
+  } else
+    return false;
+}
 
 /**
  * Send a severity callback callback message to a client
@@ -894,19 +911,20 @@ void lgs_send_severity_filter_to_clients
 
   rp = reinterpret_cast<log_client_t *>
         (ncs_patricia_tree_getnext(&lgs_cb->client_tree, NULL));
-
   while (rp != NULL) {
     /* Store the client_id_net for getting next  */
     client_id_net = rp->client_id_net;
     /* Do not send to all client. Send to clients that need filter
         callback and associate with this stream */
     stream = rp->stream_list_root;
-    while (stream != NULL) {
-      if (stream->stream_id == stream_id) {
-        lgs_send_filter_msg(rp->client_id, stream_id, severity_filter, 
rp->mds_dest);
-        break;
+    if (is_filter_supported(rp->client_ver)) {
+      while (stream != NULL) {
+        if (stream->stream_id == stream_id) {
+          lgs_send_filter_msg(rp->client_id, stream_id, severity_filter, 
rp->mds_dest);
+          break;
+        }
+        stream = stream->next;
       }
-      stream = stream->next;
     }
     rp = reinterpret_cast<log_client_t *>(ncs_patricia_tree_getnext(
           &lgs_cb->client_tree, reinterpret_cast<uint8_t *>(&client_id_net)));

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to