Hi Praveen

Is it possible to make the callback to be triggered from saAmfDispatch()?

Thanks
Gary

On 28/6/17, 5:06 pm, "Gary Lee" <[email protected]> wrote:

    Hi Praveen
    
    Ack for the series (with 2 comments). One very minor comment below, the 
other is in Patch 3.
    
    Thanks
    Gary
    
    On 1/6/17, 9:46 pm, "Praveen" <[email protected]> wrote:
    
        * A callback that will be invoked by AMFA whenever a SC joins cluster 
and
          both SCs leaves cluster if SC Absence feature is enabled.
        
          Callback and its argument:
        
              void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT state)
              where OsafAmfSCStatusT is defined as:
                typedef enum {
                  OSAF_AMF_SC_PRESENT = 1,
                  OSAF_AMF_SC_ABSENT = 2,
                } OsafAmfSCStatusT;
        
          This callback can be integrated
          with standard AMF component (even with legacy one also).
        * An API to register/install above callback function:
           void osafAmfInstallSCStatusChangeCallback(
             void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT status));
        ---
         src/amf/agent/ava_mds.cc      | 35 ++++++++++++++++++++++++++++++++++-
         src/amf/agent/ava_mds.h       |  6 ++++--
         src/amf/agent/ava_op.cc       |  5 +++++
         src/amf/amfnd/avnd_mds.h      |  2 +-
         src/amf/amfnd/di.cc           | 39 
++++++++++++++++++++++++++++++++++++++-
         src/amf/amfnd/mds.cc          |  5 ++++-
         src/amf/common/amf_amfparam.h |  7 +++++++
         src/amf/common/amf_n2avamsg.h |  1 +
         src/amf/saf/libSaAmf.map      |  1 +
         src/amf/saf/saAmf_B_04_02.h   |  8 ++++++++
         10 files changed, 103 insertions(+), 6 deletions(-)
        
        diff --git a/src/amf/agent/ava_mds.cc b/src/amf/agent/ava_mds.cc
        index 54a0cfa..42bc139 100644
        --- a/src/amf/agent/ava_mds.cc
        +++ b/src/amf/agent/ava_mds.cc
        @@ -60,7 +60,8 @@ static uint32_t dec_csi_attr_change_msg(NCS_UBAID 
*uba, AVSV_NDA_AVA_MSG *msg);
         
         static const MDS_CLIENT_MSG_FORMAT_VER
             ava_avnd_msg_fmt_map_table[AVA_AVND_SUBPART_VER_MAX] = {
        -        AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2};
        +        AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2,
        +        AVSV_AVND_AVA_MSG_FMT_VER_3};
         
         /**
          * function called when MDS down for avnd (AMF) is received
        @@ -68,6 +69,26 @@ static const MDS_CLIENT_MSG_FORMAT_VER
          */
         static void (*amf_down_cb)(void);
         
        +/**
        + * @brief  SC status change callback. It is called when cluster becomes
        + *         without SCs and with SCs. It can be used by a client to know
        + *         when cluster runs without SCs and with SCs.
        + * @param  state.
        + */
        +static void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT state);
        +
        +//Wrapper function that AMFA uses to invoke SC status change callback.
        +void osafAmfSCStatusChangeCallback_invoke(OsafAmfSCStatusT state) {
        +  TRACE_ENTER();
        +  if (OsafAmfSCStatusChangeCallbackT == nullptr) {
        +     TRACE("Callback not registered");
        +  } else {
        +     TRACE("Invoking SC status change callback");
        +    /* A client has installed a callback pointer, call it */
        +    OsafAmfSCStatusChangeCallbackT(state);
        +  }
        +  TRACE_LEAVE();
        +}
         
/****************************************************************************
           Name          : ava_mds_reg
         
        @@ -893,6 +914,8 @@ uint32_t ava_mds_flat_dec(AVA_CB *cb, 
MDS_CALLBACK_DEC_FLAT_INFO *dec_info) {
                     osaf_decode_sanamet(dec_info->io_uba, 
&pxied_comp_clean->comp_name);
                   }
                 } break;
        +        case AVSV_AMF_SC_STATUS_CHANGE: {
        +        } break;
         
                 default:
                   osafassert(0);
        @@ -1168,6 +1191,16 @@ extern "C" void ava_install_amf_down_cb(void 
(*cb)(void)) {
           TRACE_LEAVE();
         }
         
        +/**
        + * @brief   API for client to install SC status change callback.
        + */
        +void osafAmfInstallSCStatusChangeCallback(void (*cb)(OsafAmfSCStatusT 
status)) {
        +  TRACE_ENTER();
        +  OsafAmfSCStatusChangeCallbackT = cb;
        +  TRACE_LEAVE();
        +}
        +
        +
         void ava_fill_finalize_msg(AVSV_NDA_AVA_MSG *msg, MDS_DEST dst,
                                    SaAmfHandleT hdl, SaNameT comp_name) {
           msg->type = AVSV_AVA_API_MSG;
        diff --git a/src/amf/agent/ava_mds.h b/src/amf/agent/ava_mds.h
        index e0f61dd..882f6a5 100644
        --- a/src/amf/agent/ava_mds.h
        +++ b/src/amf/agent/ava_mds.h
        @@ -35,10 +35,10 @@ extern "C" {
         #endif
         
         /* In Service upgrade support */
        -#define AVA_MDS_SUB_PART_VERSION 2
        +#define AVA_MDS_SUB_PART_VERSION 3
         
         #define AVA_AVND_SUBPART_VER_MIN 1
        -#define AVA_AVND_SUBPART_VER_MAX 2
        +#define AVA_AVND_SUBPART_VER_MAX 3
         
         
/*****************************************************************************
                          Function to fill the MDS message structure
        @@ -101,6 +101,8 @@ uint32_t ava_mds_cbk(NCSMDS_CALLBACK_INFO*);
         uint32_t ava_mds_send(struct ava_cb_tag*, AVSV_NDA_AVA_MSG*,
                               AVSV_NDA_AVA_MSG**);
         
        +void osafAmfSCStatusChangeCallback_invoke(OsafAmfSCStatusT state);
        +
         #ifdef __cplusplus
         }
         #endif
        diff --git a/src/amf/agent/ava_op.cc b/src/amf/agent/ava_op.cc
        index c150b9f..e493955 100644
        --- a/src/amf/agent/ava_op.cc
        +++ b/src/amf/agent/ava_op.cc
        @@ -83,6 +83,11 @@ uint32_t ava_avnd_msg_prc(AVA_CB *cb, 
AVSV_NDA_AVA_MSG *msg) {
             }
           }
         
        +  if (cbk_info->type == AVSV_AMF_SC_STATUS_CHANGE) {
        +    TRACE("SCs Status:%u",cbk_info->param.sc_status_change.sc_status);
        +    
osafAmfSCStatusChangeCallback_invoke(cbk_info->param.sc_status_change.sc_status);
        +    goto done;
        +  }
           /* retrieve the handle record */
           hdl = cbk_info->hdl;
           hdl_rec = (AVA_HDL_REC *)ncshm_take_hdl(NCS_SERVICE_ID_AVA, hdl);
        diff --git a/src/amf/amfnd/avnd_mds.h b/src/amf/amfnd/avnd_mds.h
        index 70173ac..1f9753c 100644
        --- a/src/amf/amfnd/avnd_mds.h
        +++ b/src/amf/amfnd/avnd_mds.h
        @@ -41,7 +41,7 @@
         #define AVND_AVND_SUBPART_VER_MAX 1
         
         #define AVND_AVA_SUBPART_VER_MIN 1
        -#define AVND_AVA_SUBPART_VER_MAX 2
        +#define AVND_AVA_SUBPART_VER_MAX 3
         
         #define AVND_CLA_SUBPART_VER_MIN 1
         #define AVND_CLA_SUBPART_VER_MAX 1
        diff --git a/src/amf/amfnd/di.cc b/src/amf/amfnd/di.cc
        index 6f0a76c..07b9b2e 100644
        --- a/src/amf/amfnd/di.cc
        +++ b/src/amf/amfnd/di.cc
        @@ -516,6 +516,37 @@ done:
           TRACE_LEAVE();
         }
         
        +/*
        + * @brief      Sends message to AMFA about SCs Absence and Presence.
        + * @param [in]  status
        + */
        +void avnd_send_sc_status_message(OsafAmfSCStatusT status) {
        +  TRACE_ENTER();
        +  uint32_t rc = NCSCC_RC_SUCCESS;
        +  AVND_MSG msg;
        +  MDS_DEST mds_dest = 0;
        +  memset(&msg, 0, sizeof(AVND_MSG));
        +
        +  for (auto& it: agent_mds_ver_db) {
        +    if (it.second < AVSV_AVND_AVA_MSG_FMT_VER_3) {
        +      TRACE("AMFA does not support the callback");
        +      continue;
        +    }
        +    msg.info.ava =
        +      static_cast<AVSV_NDA_AVA_MSG *>(calloc(1, 
sizeof(AVSV_NDA_AVA_MSG)));
        +    msg.type = AVND_MSG_AVA;
        +    msg.info.ava->type = AVSV_AVND_AMF_CBK_MSG;
        +    msg.info.ava->info.cbk_info = 
static_cast<AVSV_AMF_CBK_INFO*>(calloc(1, sizeof(AVSV_AMF_CBK_INFO)));
        +    msg.info.ava->info.cbk_info->param.sc_status_change.sc_status = 
status;
        +    msg.info.ava->info.cbk_info->type = AVSV_AMF_SC_STATUS_CHANGE;
        +    mds_dest = it.first;
        +    rc = avnd_mds_send(avnd_cb, &msg, &mds_dest, 0);
        +    if (rc != NCSCC_RC_SUCCESS)
        +      LOG_WA("Message failed to dest");
    
    [GL] typo above?
    
        +    avnd_msg_content_free(avnd_cb, &msg);
        +  }
        +  TRACE_LEAVE();
        +}
         
/****************************************************************************
           Name          : avnd_evt_mds_avd_up
         
        @@ -600,11 +631,13 @@ uint32_t avnd_evt_mds_avd_up_evh(AVND_CB *cb, 
AVND_EVT *evt) {
               avnd_send_node_up_msg();
             }
             cb->is_avd_down = false;
        +
        +    //Inform AMFA about SCs presence now.
        +    avnd_send_sc_status_message(OSAF_AMF_SC_PRESENT);
           }
         
           if (m_AVND_TMR_IS_ACTIVE(cb->sc_absence_tmr))
             avnd_stop_tmr(cb, &cb->sc_absence_tmr);
        -
         done:
           TRACE_LEAVE();
           return NCSCC_RC_SUCCESS;
        @@ -739,6 +772,10 @@ uint32_t avnd_evt_mds_avd_dn_evh(AVND_CB *cb, 
AVND_EVT *evt) {
           // reset msg_id counter
           cb->rcv_msg_id = 0;
           cb->snd_msg_id = 0;
        +
        +  //Inform AMFA about SCs absence now.
        +  avnd_send_sc_status_message(OSAF_AMF_SC_ABSENT);
        +
           TRACE_LEAVE();
           return rc;
         }
        diff --git a/src/amf/amfnd/mds.cc b/src/amf/amfnd/mds.cc
        index 6ef1239..1ee24cf 100644
        --- a/src/amf/amfnd/mds.cc
        +++ b/src/amf/amfnd/mds.cc
        @@ -58,7 +58,8 @@ const MDS_CLIENT_MSG_FORMAT_VER 
avnd_avnd_msg_fmt_map_table[] = {
             AVSV_AVND_AVND_MSG_FMT_VER_1};
         
         const MDS_CLIENT_MSG_FORMAT_VER avnd_ava_msg_fmt_map_table[] = {
        -    AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2};
        +    AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2,
        +    AVSV_AVND_AVA_MSG_FMT_VER_3};
         
         /* static function declarations */
         
        @@ -1034,6 +1035,8 @@ uint32_t avnd_mds_flat_ava_enc(AVND_CB *cb, 
MDS_CALLBACK_ENC_INFO *enc_info) {
                                         
&cbk_info->param.pxied_comp_clean.comp_name);
                   }
                   break;
        +        case AVSV_AMF_SC_STATUS_CHANGE:
        +          break;
         
                 default:
                   osafassert(0);
        diff --git a/src/amf/common/amf_amfparam.h 
b/src/amf/common/amf_amfparam.h
        index e18d3fe..a46b297 100644
        --- a/src/amf/common/amf_amfparam.h
        +++ b/src/amf/common/amf_amfparam.h
        @@ -65,6 +65,7 @@ typedef enum avsv_amf_cbk_type {
           AVSV_AMF_PXIED_COMP_INST,
           AVSV_AMF_PXIED_COMP_CLEAN,
           AVSV_AMF_CSI_ATTR_CHANGE,
        +  AVSV_AMF_SC_STATUS_CHANGE,
           AVSV_AMF_CBK_MAX
         } AVSV_AMF_CBK_TYPE;
         
        @@ -252,6 +253,11 @@ typedef struct avsv_amf_csi_attr_change_param_tag {
           SaAmfCSIAttributeListT csiAttr; /* contains the csi-attr list SAF 
compliant*/
         } AVSV_AMF_CSI_ATTR_CHANGE_PARAM;
         
        +//SC status change callback msg structure from AMFND to AMF agent.
        +typedef struct avsv_amf_sc_status_param_tag {
        +  OsafAmfSCStatusT sc_status;
        +} AVSV_AMF_SC_STATUS_CHANGE_PARAM;
        +
         /* csi remove */
         typedef struct avsv_amf_csi_rem_param_tag {
           SaNameT comp_name;        /* comp name */
        @@ -291,6 +297,7 @@ typedef struct avsv_amf_cbk_info_tag {
             AVSV_AMF_PXIED_COMP_INST_PARAM pxied_comp_inst;
             AVSV_AMF_PXIED_COMP_CLEAN_PARAM pxied_comp_clean;
             AVSV_AMF_CSI_ATTR_CHANGE_PARAM csi_attr_change;
        +    AVSV_AMF_SC_STATUS_CHANGE_PARAM sc_status_change;
           } param;
         } AVSV_AMF_CBK_INFO;
         
        diff --git a/src/amf/common/amf_n2avamsg.h 
b/src/amf/common/amf_n2avamsg.h
        index 80ebc84..738966b 100644
        --- a/src/amf/common/amf_n2avamsg.h
        +++ b/src/amf/common/amf_n2avamsg.h
        @@ -41,6 +41,7 @@ extern "C" {
         /* Message format versions */
         #define AVSV_AVND_AVA_MSG_FMT_VER_1 1
         #define AVSV_AVND_AVA_MSG_FMT_VER_2 2
        +#define AVSV_AVND_AVA_MSG_FMT_VER_3 3
         
         /* AMF API enums */
         typedef enum avsv_nda_ava_msg_type {
        diff --git a/src/amf/saf/libSaAmf.map b/src/amf/saf/libSaAmf.map
        index cac34ce..dfb6a16 100644
        --- a/src/amf/saf/libSaAmf.map
        +++ b/src/amf/saf/libSaAmf.map
        @@ -5,6 +5,7 @@
                        saAis*;
                        saAmf*;
                        ava_install_amf_down_cb;        # FIXME ava* should be 
local-only
        +               osafAmfInstallSCStatusChangeCallback;
         
                local:
                        *;
        diff --git a/src/amf/saf/saAmf_B_04_02.h b/src/amf/saf/saAmf_B_04_02.h
        index b083031..28ec3fc 100644
        --- a/src/amf/saf/saAmf_B_04_02.h
        +++ b/src/amf/saf/saAmf_B_04_02.h
        @@ -59,6 +59,14 @@ saAmfInitialize_o4(
             const SaAmfCallbacksT_o4 *amfCallbacks,
             SaVersionT *version);
         
        +typedef enum {
        +    OSAF_AMF_SC_PRESENT = 1,
        +    OSAF_AMF_SC_ABSENT = 2,
        +} OsafAmfSCStatusT;
        +
        +extern void osafAmfInstallSCStatusChangeCallback(
        +    void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT status));
        +
         #ifdef  __cplusplus
         }
         #endif
        -- 
        1.9.1
        
        
    



------------------------------------------------------------------------------
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