ack, code review. MInor comments inlined/Thanks HansN

On 02/29/2016 04:14 PM, Anders Widell wrote:
>   osaf/services/saf/amf/amfd/clm.cc         |  21 +++++-
>   osaf/services/saf/amf/amfd/include/amfd.h |   2 +
>   osaf/services/saf/amf/amfd/include/cb.h   |   1 +
>   osaf/services/saf/amf/amfd/include/role.h |   2 +
>   osaf/services/saf/amf/amfd/main.cc        |  78 ++++++---------------------
>   osaf/services/saf/amf/amfd/ndfsm.cc       |   9 ++-
>   osaf/services/saf/amf/amfd/node.cc        |   7 +--
>   osaf/services/saf/amf/amfd/role.cc        |  86 
> ++++++++++++++++++++++++++++++-
>   osaf/services/saf/amf/amfd/sgproc.cc      |  11 +++-
>   osaf/services/saf/amf/amfnd/clm.cc        |  27 ++++++--
>   10 files changed, 160 insertions(+), 84 deletions(-)
>
>
> Add support for configuring the system with more than two OpenSAF 2N SUs. In
> particular, this means that all OpenSAF directors must support starting up
> and running without (initially) getting any assignment from AMF. Locking of
> an OpenSAF 2N SU is currently not supported on a system configured with more
> than two OpenSAF 2N SUs.
>
> diff --git a/osaf/services/saf/amf/amfd/clm.cc 
> b/osaf/services/saf/amf/amfd/clm.cc
> --- a/osaf/services/saf/amf/amfd/clm.cc
> +++ b/osaf/services/saf/amf/amfd/clm.cc
> @@ -21,8 +21,7 @@
>   #include <amfd.h>
>   #include <clm.h>
>   #include <node.h>
> -
> -static SaVersionT clmVersion = { 'B', 4, 1 };
> +#include "osaf_time.h"
>   
>   static void clm_node_join_complete(AVD_AVND *node)
>   {
> @@ -392,9 +391,21 @@ SaAisErrorT avd_clm_init(void)
>           SaAisErrorT error = SA_AIS_OK;
>   
>       TRACE_ENTER();
> -     error = saClmInitialize_4(&avd_cb->clmHandle, &clm_callbacks, 
> &clmVersion);
> -     if (SA_AIS_OK != error) {
> -             LOG_ER("Failed to initialize with CLM %u", error);
> +     for (;;) {
> +             SaVersionT Version = { 'B', 4, 1 };
> +             error = saClmInitialize_4(&avd_cb->clmHandle, &clm_callbacks, 
> &Version);
> +             if (error == SA_AIS_ERR_TRY_AGAIN ||
> +                 error == SA_AIS_ERR_TIMEOUT ||
> +                    error == SA_AIS_ERR_UNAVAILABLE) {
> +                     if (error != SA_AIS_ERR_TRY_AGAIN) {
> +                             LOG_WA("saClmInitialize_4 returned %u",
> +                                    (unsigned) error);
> +                     }
> +                     osaf_nanosleep(&kHundredMilliseconds);
> +                     continue;
> +             }
> +             if (error == SA_AIS_OK) break;
> +             LOG_ER("Failed to Initialize with CLM: %u", error);
>               goto done;
>       }
>       error = saClmSelectionObjectGet(avd_cb->clmHandle, 
> &avd_cb->clm_sel_obj);
> diff --git a/osaf/services/saf/amf/amfd/include/amfd.h 
> b/osaf/services/saf/amf/amfd/include/amfd.h
> --- a/osaf/services/saf/amf/amfd/include/amfd.h
> +++ b/osaf/services/saf/amf/amfd/include/amfd.h
> @@ -33,6 +33,7 @@
>   #ifndef AVD_H
>   #define AVD_H
>   
[HansN] use #include <cstdint>
> +#include <stdint.h>
>   #include "logtrace.h"
>   
>   #include "amf.h"
> @@ -65,5 +66,6 @@
>   #include "ckpt_msg.h"
>   #include "ckpt_edu.h"
>   #include "ckpt_updt.h"
> +#include "saAmf.h"
>   
>   #endif
> diff --git a/osaf/services/saf/amf/amfd/include/cb.h 
> b/osaf/services/saf/amf/amfd/include/cb.h
> --- a/osaf/services/saf/amf/amfd/include/cb.h
> +++ b/osaf/services/saf/amf/amfd/include/cb.h
> @@ -207,6 +207,7 @@ typedef struct cl_cb_tag {
>       SaClmHandleT clmHandle;
>       SaSelectionObjectT clm_sel_obj;
>   
> +     bool fully_initialized;
>       bool swap_switch; /* true - In middle of role switch. */
>   
>       /** true when active services (IMM, LOG, NTF, etc.) exist
> diff --git a/osaf/services/saf/amf/amfd/include/role.h 
> b/osaf/services/saf/amf/amfd/include/role.h
> --- a/osaf/services/saf/amf/amfd/include/role.h
> +++ b/osaf/services/saf/amf/amfd/include/role.h
> @@ -34,6 +34,8 @@ extern uint32_t amfd_switch_qsd_stdby(AV
>   extern uint32_t amfd_switch_stdby_actv(AVD_CL_CB *cb);
>   extern uint32_t amfd_switch_qsd_actv(AVD_CL_CB *cb);
>   extern uint32_t amfd_switch_actv_qsd(AVD_CL_CB *cb);
> +extern uint32_t initialize_for_assignment(cl_cb_tag* cb,
> +                                          SaAmfHAStateT ha_state);
>   
>   #endif /* ROLE_H */
>   
> diff --git a/osaf/services/saf/amf/amfd/main.cc 
> b/osaf/services/saf/amf/amfd/main.cc
> --- a/osaf/services/saf/amf/amfd/main.cc
> +++ b/osaf/services/saf/amf/amfd/main.cc
> @@ -56,6 +56,7 @@
>   #include <sutcomptype.h>
>   #include <sutype.h>
>   #include <su.h>
> +#include "osaf_utility.h"
>   
>   static const char* internal_version_id_  __attribute__ ((used)) = "@(#) 
> $Id: " INTERNAL_VERSION_ID " $";
>   
> @@ -445,7 +446,8 @@ static void rda_cb(uint32_t notused, PCS
>   
>       if (((avd_cb->avail_state_avd == SA_AMF_HA_STANDBY) ||
>            (avd_cb->avail_state_avd == SA_AMF_HA_QUIESCED)) &&
> -         (cb_info->info.io_role == PCS_RDA_ACTIVE)) {
> +         (cb_info->info.io_role == PCS_RDA_ACTIVE ||
> +             cb_info->info.io_role == PCS_RDA_STANDBY)) {
>   
>               uint32_t rc;
>               AVD_EVT *evt;
> @@ -474,7 +476,6 @@ static uint32_t initialize(void)
>   {
>       AVD_CL_CB *cb = avd_cb;
>       int rc = NCSCC_RC_FAILURE;
> -     SaVersionT ntfVersion = { 'A', 0x01, 0x01 };
>       SaAmfHAStateT role;
>       char *val;
>   
> @@ -524,8 +525,13 @@ static uint32_t initialize(void)
>       }
>   
>       cb->init_state = AVD_INIT_BGN;
> +     cb->mbcsv_sel_obj = -1;
> +     cb->imm_sel_obj = -1;
> +     cb->clm_sel_obj = -1;
> +     cb->fully_initialized = false;
>       cb->swap_switch = false;
>       cb->active_services_exist = true;
> +     cb->mbcsv_sel_obj = -1;
>       cb->stby_sync_state = AVD_STBY_IN_SYNC;
>       cb->sync_required = true;
>       
> @@ -544,67 +550,20 @@ static uint32_t initialize(void)
>       /* get the node id of the node on which the AVD is running. */
>       cb->node_id_avd = m_NCS_GET_NODE_ID;
>   
> -     if (avd_mds_init(cb) != NCSCC_RC_SUCCESS) {
> -             LOG_ER("avd_mds_init FAILED");
> -             goto done;
> -     }
> -
> -     if (NCSCC_RC_FAILURE == avsv_mbcsv_register(cb)) {
> -             LOG_ER("avsv_mbcsv_register FAILED");
> -             goto done;
> -     }
> -
> -     if (avd_clm_init() != SA_AIS_OK) {
> -             LOG_EM("avd_clm_init FAILED");
> -             goto done;
> -     }
> -
> -     if (avd_imm_init(cb) != SA_AIS_OK) {
> -             LOG_ER("avd_imm_init FAILED");
> -             goto done;
> -     }
> -
> -     if ((rc = saNtfInitialize(&cb->ntfHandle, nullptr, &ntfVersion)) != 
> SA_AIS_OK) {
> -             LOG_ER("saNtfInitialize Failed (%u)", rc);
> -             rc = NCSCC_RC_FAILURE;
> -             goto done;
> -     }
> -
>       if ((rc = rda_get_role(&role)) != NCSCC_RC_SUCCESS) {
>               LOG_ER("rda_get_role FAILED");
>               goto done;
>       }
>   
> -     cb->avail_state_avd = role;
> -
> -     if (NCSCC_RC_SUCCESS != avd_mds_set_vdest_role(cb, role)) {
> -             LOG_ER("avd_mds_set_vdest_role FAILED");
> -             goto done;
> -     }
> -
> -     if (NCSCC_RC_SUCCESS != avsv_set_ckpt_role(cb, role)) {
> -             LOG_ER("avsv_set_ckpt_role FAILED");
> -             goto done;
> -     }
> -
>       if ((rc = rda_register_callback(0, rda_cb)) != NCSCC_RC_SUCCESS) {
>               LOG_ER("rda_register_callback FAILED %u", rc);
>               goto done;
>       }
>   
> -     if (role == SA_AMF_HA_ACTIVE) {
> -             rc = avd_active_role_initialization(cb, role);
> -             if (rc != NCSCC_RC_SUCCESS) {
> -                     LOG_ER("avd_active_role_initialization FAILED");
> -                     goto done;
> -             }
> -     }
> -     else {
> -             rc = avd_standby_role_initialization(cb);
> -             if (rc != NCSCC_RC_SUCCESS) {
> -                     LOG_ER("avd_standby_role_initialization FAILED");
> -                     goto done;
> -             }
> +     if ((rc = initialize_for_assignment(cb, role))
> +             != NCSCC_RC_SUCCESS) {
> +             LOG_ER("initialize_for_assignment FAILED %u", (unsigned) rc);
> +             goto done;
>       }
>   
>       rc = NCSCC_RC_SUCCESS;
> @@ -647,14 +606,13 @@ static void main_loop(void)
>       fds[FD_TERM].events = POLLIN;
>       fds[FD_MBX].fd = mbx_fd.rmv_obj;
>       fds[FD_MBX].events = POLLIN;
> -     fds[FD_MBCSV].fd = cb->mbcsv_sel_obj;
> -     fds[FD_MBCSV].events = POLLIN;
> -     fds[FD_CLM].fd = cb->clm_sel_obj;
> -     fds[FD_CLM].events = POLLIN;
> -     fds[FD_IMM].fd = cb->imm_sel_obj; // IMM fd must be last in array
> -     fds[FD_IMM].events = POLLIN;
> -
>       while (1) {
> +             fds[FD_MBCSV].fd = cb->mbcsv_sel_obj;
> +             fds[FD_MBCSV].events = POLLIN;
> +             fds[FD_CLM].fd = cb->clm_sel_obj;
> +             fds[FD_CLM].events = POLLIN;
> +             fds[FD_IMM].fd = cb->imm_sel_obj; // IMM fd must be last in 
> array
> +             fds[FD_IMM].events = POLLIN;
>               
>               if (cb->immOiHandle != 0) {
>                       fds[FD_IMM].fd = cb->imm_sel_obj;
> diff --git a/osaf/services/saf/amf/amfd/ndfsm.cc 
> b/osaf/services/saf/amf/amfd/ndfsm.cc
> --- a/osaf/services/saf/amf/amfd/ndfsm.cc
> +++ b/osaf/services/saf/amf/amfd/ndfsm.cc
> @@ -190,8 +190,9 @@ void avd_nd_ncs_su_assigned(AVD_CL_CB *c
>       TRACE_ENTER();
>   
>       for (const auto& ncs_su : avnd->list_of_ncs_su) {
> -             if ((ncs_su->list_of_susi == AVD_SU_SI_REL_NULL) ||
> -                 (ncs_su->list_of_susi->fsm != AVD_SU_SI_STATE_ASGND)) {
> +             if ((ncs_su->sg_of_su->curr_assigned_sus() < 2) &&
> +                     ((ncs_su->list_of_susi == AVD_SU_SI_REL_NULL) ||
> +                     (ncs_su->list_of_susi->fsm != AVD_SU_SI_STATE_ASGND))) {
>                       TRACE_LEAVE();
>                       /* this is an unassigned SU so no need to scan further 
> return here. */
>                       return;
> @@ -328,6 +329,10 @@ void avd_mds_avnd_down_evh(AVD_CL_CB *cb
>   
>               if (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE) {
>                       avd_node_failover(node);
> +                     // Update standby out of sync if standby sc goes down
> +                     if (avd_cb->node_id_avd_other == 
> node->node_info.nodeId) {
> +                             cb->stby_sync_state = AVD_STBY_OUT_OF_SYNC;
> +                     }
>               } else {
>                       /* Remove dynamic info for node but keep in nodeid tree.
>                        * Possibly used at the end of controller failover to
> diff --git a/osaf/services/saf/amf/amfd/node.cc 
> b/osaf/services/saf/amf/amfd/node.cc
> --- a/osaf/services/saf/amf/amfd/node.cc
> +++ b/osaf/services/saf/amf/amfd/node.cc
> @@ -120,7 +120,7 @@ void AVD_AVND::initialize() {
>     pg_csi_list = {};
>     pg_csi_list.order = NCS_DBLIST_ANY_ORDER;
>     pg_csi_list.cmp_cookie = avsv_dblist_uns32_cmp;
> -  type = AVSV_AVND_CARD_PAYLOAD;
> +  type = AVSV_AVND_CARD_SYS_CON;
>     rcv_msg_id = {};
>     snd_msg_id = {};
>     cluster_list_node_next = {};
> @@ -486,11 +486,6 @@ static SaAisErrorT node_ccb_completed_de
>               return SA_AIS_ERR_BAD_OPERATION;
>       }
>   
> -     if (node->type == AVSV_AVND_CARD_SYS_CON) {
> -             report_ccb_validation_error(opdata, "Cannot remove controller 
> node");
> -             return SA_AIS_ERR_BAD_OPERATION;
> -     }
> -
>       /* Check to see that the node is in admin locked state before delete */
>       if (node->saAmfNodeAdminState != SA_AMF_ADMIN_LOCKED_INSTANTIATION) {
>               report_ccb_validation_error(opdata, "Node '%s' is not locked 
> instantiation", opdata->objectName.value);
> diff --git a/osaf/services/saf/amf/amfd/role.cc 
> b/osaf/services/saf/amf/amfd/role.cc
> --- a/osaf/services/saf/amf/amfd/role.cc
> +++ b/osaf/services/saf/amf/amfd/role.cc
> @@ -46,6 +46,7 @@
>   #include <si_dep.h>
>   #include "osaf_utility.h"
>   #include "role.h"
> +#include "nid_api.h"
>   
>   extern pthread_mutex_t imm_reinit_mutex;
>   
> @@ -73,7 +74,15 @@ void avd_role_change_evh(AVD_CL_CB *cb,
>       AVD_ROLE_CHG_CAUSE_T cause = msg->msg_info.d2d_chg_role_req.cause;
>       SaAmfHAStateT role = msg->msg_info.d2d_chg_role_req.role;
>   
> -     TRACE_ENTER2("cause=%u, role=%u", cause, role);
> +     TRACE_ENTER2("cause=%u, role=%u, current_role=%u", cause, role,
> +             cb->avail_state_avd);
> +
> +     if ((status = initialize_for_assignment(cb, role))
> +             != NCSCC_RC_SUCCESS) {
> +             LOG_ER("initialize_for_assignment FAILED %u",
> +                     (unsigned) status);
> +             _exit(EXIT_FAILURE);
> +     }
>   
>       if (cb->avail_state_avd == role) {
>               goto done;
> @@ -128,6 +137,13 @@ void avd_role_change_evh(AVD_CL_CB *cb,
>       }
>   
>       if ((cause == AVD_FAIL_OVER) &&
> +         (cb->avail_state_avd == SA_AMF_HA_QUIESCED) && (role == 
> SA_AMF_HA_STANDBY)) {
> +             /* Fail-over Quiesced to Active */
> +             status = NCSCC_RC_SUCCESS;
> +             goto done;
> +     }
> +
> +     if ((cause == AVD_FAIL_OVER) &&
>           (cb->avail_state_avd == SA_AMF_HA_QUIESCED) && (role == 
> SA_AMF_HA_ACTIVE)) {
>               /* Fail-over Quiesced to Active */
>               status = avd_role_failover_qsd_actv(cb, role);
> @@ -155,7 +171,73 @@ void avd_role_change_evh(AVD_CL_CB *cb,
>       return;
>   }
>   
> -/****************************************************************************\
> +uint32_t initialize_for_assignment(cl_cb_tag* cb, SaAmfHAStateT ha_state)
> +{
> +     TRACE_ENTER2("ha_state = %d", static_cast<int>(ha_state));
> +     SaVersionT ntfVersion = {'A', 0x01, 0x01};
> +     uint32_t rc = NCSCC_RC_SUCCESS;
> +     SaAisErrorT error;
> +     if (cb->fully_initialized) goto done;
> +     cb->avail_state_avd = ha_state;
> +     if (ha_state == SA_AMF_HA_QUIESCED) {
> +             if ((rc = nid_notify(const_cast<char*>("AMFD"),
> +                                  NCSCC_RC_SUCCESS, nullptr)) != 
> NCSCC_RC_SUCCESS) {
> +                     LOG_ER("nid_notify failed");
> +             }
> +             goto done;
> +     }
> +     if ((rc = avd_mds_init(cb)) != NCSCC_RC_SUCCESS) {
> +             LOG_ER("avd_mds_init FAILED");
> +             goto done;
> +     }
> +     if ((rc = avsv_mbcsv_register(cb)) != NCSCC_RC_SUCCESS) {
> +             LOG_ER("avsv_mbcsv_register FAILED");
> +             goto done;
> +     }
> +     if (avd_clm_init() != SA_AIS_OK) {
> +             LOG_EM("avd_clm_init FAILED");
> +             rc = NCSCC_RC_FAILURE;
> +             goto done;
> +     }
> +     if (avd_imm_init(cb) != SA_AIS_OK) {
> +             LOG_ER("avd_imm_init FAILED");
> +             rc = NCSCC_RC_FAILURE;
> +             goto done;
> +     }
> +     if ((error = saNtfInitialize(&cb->ntfHandle, nullptr, &ntfVersion)) !=
> +         SA_AIS_OK) {
> +             LOG_ER("saNtfInitialize Failed (%u)", error);
> +             rc = NCSCC_RC_FAILURE;
> +             goto done;
> +     }
> +     if ((rc = avd_mds_set_vdest_role(cb, ha_state)) != NCSCC_RC_SUCCESS) {
> +             LOG_ER("avd_mds_set_vdest_role FAILED");
> +             goto done;
> +     }
> +     if ((rc = avsv_set_ckpt_role(cb, ha_state)) != NCSCC_RC_SUCCESS) {
> +             LOG_ER("avsv_set_ckpt_role FAILED");
> +             goto done;
> +     }
> +     if (ha_state == SA_AMF_HA_ACTIVE) {
> +             rc = avd_active_role_initialization(cb, ha_state);
> +             if (rc != NCSCC_RC_SUCCESS) {
> +                     LOG_ER("avd_active_role_initialization FAILED");
> +                     goto done;
> +             }
> +     } else if (ha_state == SA_AMF_HA_STANDBY) {
> +             rc = avd_standby_role_initialization(cb);
> +             if (rc != NCSCC_RC_SUCCESS) {
> +                     LOG_ER("avd_standby_role_initialization FAILED");
> +                     goto done;
> +             }
> +     }
> +     cb->fully_initialized = true;
> +done:
> +     TRACE_LEAVE2("rc = %u", rc);
> +     return rc;
> +}
> +
> +/****************************************************************************
>  \
>    * Function: avd_init_role_set
>    *
>    * Purpose:  AVSV function to handle AVD's initial role setting.
> diff --git a/osaf/services/saf/amf/amfd/sgproc.cc 
> b/osaf/services/saf/amf/amfd/sgproc.cc
> --- a/osaf/services/saf/amf/amfd/sgproc.cc
> +++ b/osaf/services/saf/amf/amfd/sgproc.cc
> @@ -1390,7 +1390,16 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
>                                       /* Since a NCS SU has been assigned 
> trigger the node FSM. */
>                                       /* For (ncs_spec == SA_TRUE), su will 
> not be external, so su
>                                                  will have node attached. */
> -                                     avd_nd_ncs_su_assigned(cb, 
> susi->su->su_on_node);
[HansN] The const_cast below is not needed.
> +                                     for (AmfDb<uint32_t, 
> AVD_AVND>::const_iterator it = node_id_db->begin();
> +                                             it != node_id_db->end(); it++) {
> +                                             AVD_AVND *node = 
> const_cast<AVD_AVND*>((*it).second);
> +
> +                                             if (node->node_state == 
> AVD_AVND_STATE_NCS_INIT && node->adest != 0) {
> +                                                     
> avd_nd_ncs_su_assigned(cb, node);
> +                                             } else {
> +                                                     TRACE("Node_state: %u 
> adest: %" PRIx64 " node not ready for assignments", node->node_state, 
> node->adest);
> +                                             }
> +                                     }
>                               }
>                       }
>               } else {
> diff --git a/osaf/services/saf/amf/amfnd/clm.cc 
> b/osaf/services/saf/amf/amfnd/clm.cc
> --- a/osaf/services/saf/amf/amfnd/clm.cc
> +++ b/osaf/services/saf/amf/amfnd/clm.cc
> @@ -37,6 +37,7 @@
>   #include "avnd.h"
>   #include "mds_pvt.h"
>   #include "nid_api.h"
> +#include "osaf_time.h"
>   
>   static void clm_node_left(SaClmNodeIdT node_id)
>   {
> @@ -166,7 +167,6 @@ uint32_t avnd_evt_avd_node_up_evh(AVND_C
>       info = &evt->info.avd->msg_info.d2n_node_up;
>   
>       /*** update this node with the supplied parameters ***/
> -     cb->type = info->node_type;
>       cb->su_failover_max = info->su_failover_max;
>       cb->su_failover_prob = info->su_failover_prob;
>   
> @@ -249,8 +249,6 @@ done:
>       return;
>   }
>   
> -static SaVersionT Version = { 'B', 4, 1 };
> -
>   static const SaClmCallbacksT_4 callbacks = {
>           0,
>           /*.saClmClusterTrackCallback =*/ clm_track_cb
> @@ -263,11 +261,24 @@ SaAisErrorT avnd_clm_init(void)
>   
>       TRACE_ENTER();
>       avnd_cb->first_time_up = true;
> -     error = saClmInitialize_4(&avnd_cb->clmHandle, &callbacks, &Version);
> -        if (SA_AIS_OK != error) {
> -                LOG_ER("Failed to Initialize with CLM: %u", error);
> -                goto done;
> -        }
> +     for (;;) {
> +             SaVersionT Version = { 'B', 4, 1 };
> +             error = saClmInitialize_4(&avnd_cb->clmHandle, &callbacks,
> +                                       &Version);
> +             if (error == SA_AIS_ERR_TRY_AGAIN ||
> +                 error == SA_AIS_ERR_TIMEOUT ||
> +                    error == SA_AIS_ERR_UNAVAILABLE) {
> +                     if (error != SA_AIS_ERR_TRY_AGAIN) {
> +                             LOG_WA("saClmInitialize_4 returned %u",
> +                                    (unsigned) error);
> +                     }
> +                     osaf_nanosleep(&kHundredMilliseconds);
> +                     continue;
> +             }
> +             if (error == SA_AIS_OK) break;
> +             LOG_ER("Failed to Initialize with CLM: %u", error);
> +             goto done;
> +     }
>       error = saClmSelectionObjectGet(avnd_cb->clmHandle, 
> &avnd_cb->clm_sel_obj);
>           if (SA_AIS_OK != error) {
>                   LOG_ER("Failed to get CLM selectionObject: %u", error);


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785231&iu=/4140
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to