ACK, And, back then, i remember arguing with some developers in PLM against use of comparisons where constants are placed in the leftside of a comparison, except maybe when comparing against NULL.
Mathi. On Thu, Apr 4, 2019 at 10:55 PM Jones, Alex <ajo...@rbbn.com> wrote: > This ticket adds support for implementing sections 3.1.3.5 and 6.2.1.1 of > the PLM spec. For now this support is only for threshold sensors. > --- > src/plm/common/plms_hsm.c | 80 ++++++++++++++++++++++ > src/plm/common/plms_notifications.h | 2 +- > src/plm/plmd/plms_he_pres_fsm.c | 101 +++++++++++++++++++++++++++- > src/plm/plmd/plms_notifications.c | 24 +++++-- > 4 files changed, 200 insertions(+), 7 deletions(-) > > diff --git a/src/plm/common/plms_hsm.c b/src/plm/common/plms_hsm.c > index f8f7b6275..fe53f2fbd 100644 > --- a/src/plm/common/plms_hsm.c > +++ b/src/plm/common/plms_hsm.c > @@ -99,6 +99,8 @@ static SaUint32T hsm_send_hotswap_event(SaHpiRptEntryT > *rpt_entry, > SaUint32T retriev_idr_info); > static SaUint32T hsm_send_resource_event(const SaHpiRptEntryT *rpt_entry, > const SaHpiEventT *event); > +static SaUint32T hsm_send_sensor_event(const SaHpiRptEntryT *rpt_entry, > + const SaHpiEventT *event); > SaUint32T hsm_correct_length(SaHpiIdrFieldT *thisfield); > SaUint32T hsm_get_idr_info(SaHpiRptEntryT *rpt_entry, PLMS_INV_DATA > *inv_data); > static SaUint32T hsm_get_idr_product_info(SaHpiRptEntryT *rpt_entry, > @@ -766,6 +768,8 @@ static void *plms_hsm(void) > SAHPI_ENTITY_PRESENCE will be generated, send the status after > upgrade to check that the state has not changed */ > if (event.EventType == SAHPI_ET_SENSOR) { > + hsm_send_sensor_event(&rpt_entry, &event); > + > if (event.EventDataUnion.SensorEvent.SensorType == > SAHPI_ENTITY_PRESENCE) { > hsm_send_hotswap_event( > @@ -1313,6 +1317,82 @@ static SaUint32T hsm_send_resource_event(const > SaHpiRptEntryT *rpt_entry, > return rc; > } > > +/********************************************************************** > +* @brief Sends resource event to PLM main thread > +* > +* > +* @param[in] rpt_entry > +* @param[in] retriev_idr_info > +* > +* @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE > +***********************************************************************/ > +static SaUint32T hsm_send_sensor_event(const SaHpiRptEntryT *rpt_entry, > + const SaHpiEventT *event) > +{ > + PLMS_CB *cb = plms_cb; > + PLMS_EVT *plms_evt = NULL; > + PLMS_EVT_REQ req_evt; > + SaHpiEntityPathT entity_path; > + SaInt8T *entity_path_str = NULL; > + SaUint32T i, rc; > + > + TRACE_ENTER(); > + > + if (NULL == rpt_entry) { > + LOG_ER("Invalid rpt_entry"); > + return NCSCC_RC_FAILURE; > + } > + > + /* Get the entity path */ > + memset(&entity_path, 0, sizeof(SaHpiEntityPathT)); > + for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { > + entity_path.Entry[i] = rpt_entry->ResourceEntity.Entry[i]; > + > + /* Stop copying when we see SAHPI_ENT_ROOT */ > + if (rpt_entry->ResourceEntity.Entry[i].EntityType == > + SAHPI_ENT_ROOT) > + break; > + } > + > + memset(&req_evt, 0, sizeof(PLMS_EVT_REQ)); > + > + req_evt.req_type = PLMS_HPI_EVT_T; > + req_evt.hpi_evt.sa_hpi_evt = *event; > + > + /* convert SaHpiEntityPathT to string format */ > + rc = convert_entitypath_to_string(&entity_path, &entity_path_str); > + if (NCSCC_RC_FAILURE == rc) { > + /* Log */ > + return NCSCC_RC_FAILURE; > + } > + req_evt.hpi_evt.entity_path = entity_path_str; > + > + /* Copy entity key to req_evt*/ > + memcpy(&req_evt.hpi_evt.epath_key, &entity_path, sizeof(entity_path)); > + > + plms_evt = (PLMS_EVT *)malloc(sizeof(PLMS_EVT)); > + if (NULL == plms_evt) { > + LOG_ER("Memory allocation failed ret:%s", strerror(errno)); > + assert(0); > + } > + memset(plms_evt, 0, sizeof(PLMS_EVT)); > + plms_evt->req_res = PLMS_REQ; > + plms_evt->req_evt = req_evt; > + > + TRACE("Sending Sensor_event for res:%u entity:%s Sensor Num:%u \n", > + rpt_entry->ResourceId, entity_path_str, > + event->EventDataUnion.SensorEvent.SensorNum); > + > + /* post event to PLM mailbox */ > + rc = m_NCS_IPC_SEND(&cb->mbx, (NCSCONTEXT)plms_evt, > + MDS_SEND_PRIORITY_MEDIUM); > + if (rc != NCSCC_RC_SUCCESS) > + LOG_ER("m_NCS_IPC_SEND failed error %u", rc); > + > + TRACE_LEAVE(); > + return rc; > +} > + > /*********************************************************************** > * @brief This function retrieves Inventory Data Record (IDR) for > * the given resource > diff --git a/src/plm/common/plms_notifications.h > b/src/plm/common/plms_notifications.h > index 03cba1088..ea2929d6b 100644 > --- a/src/plm/common/plms_notifications.h > +++ b/src/plm/common/plms_notifications.h > @@ -45,7 +45,7 @@ SaAisErrorT plms_hpi_evt_ntf_send(SaNtfHandleT > plm_ntf_hdl, SaNameT *object, > SaAisErrorT plms_alarm_ntf_send(SaNtfHandleT plm_ntf_hdl, SaNameT *object, > SaUint32T event_type, SaInt8T *entity_path, > SaUint32T severity, SaUint32T cause, > - SaUint32T minor_id, > + SaUint32T minor_id, SaTimeT timestamp, > SaUint16T no_of_corr_notifications, > SaNtfIdentifierT *corr_ids, > SaNtfIdentifierT *ntf_id); > diff --git a/src/plm/plmd/plms_he_pres_fsm.c > b/src/plm/plmd/plms_he_pres_fsm.c > index 1cba2e256..244b94199 100644 > --- a/src/plm/plmd/plms_he_pres_fsm.c > +++ b/src/plm/plmd/plms_he_pres_fsm.c > @@ -71,6 +71,33 @@ static SaUint32T > plms_act_resp_mngt_flag_clear(PLMS_ENTITY *); > > static SaUint32T plms_hpi_hs_evt_process(PLMS_EVT *); > static SaUint32T plms_hpi_resource_evt_process(PLMS_EVT *); > +static SaUint32T plms_hpi_sensor_evt_process(PLMS_EVT *); > + > +static SaNtfSeverityT convertSeverity(SaHpiSeverityT hpiSeverity, bool > asserted) > +{ > + SaNtfSeverityT ntfSeverity = SA_NTF_SEVERITY_INDETERMINATE; > + > + if (!asserted) > + ntfSeverity = SA_NTF_SEVERITY_CLEARED; > + else if (hpiSeverity == SAHPI_CRITICAL) > + ntfSeverity = SA_NTF_SEVERITY_CRITICAL; > + else if (hpiSeverity == SAHPI_MAJOR) > + ntfSeverity = SA_NTF_SEVERITY_MAJOR; > + else if (hpiSeverity == SAHPI_MINOR) > + ntfSeverity = SA_NTF_SEVERITY_MINOR; > + > + return ntfSeverity; > +} > + > +static SaNtfProbableCauseT convertCause(SaHpiEventCategoryT category) > +{ > + SaNtfProbableCauseT cause = SA_NTF_UNSPECIFIED_REASON; > + > + if (category == SAHPI_EC_THRESHOLD) > + cause = SA_NTF_THRESHOLD_CROSSED; > + > + return cause; > +} > > > /****************************************************************************** > @brief : Initializes the HE presence state FSM function pointers. > @@ -3114,6 +3141,8 @@ SaUint32T plms_hpi_evt_process(PLMS_EVT *evt) > rc = plms_hpi_hs_evt_process(evt); > else if (evt->req_evt.hpi_evt.sa_hpi_evt.EventType == SAHPI_ET_RESOURCE) > rc = plms_hpi_resource_evt_process(evt); > + else if (evt->req_evt.hpi_evt.sa_hpi_evt.EventType == SAHPI_ET_SENSOR) > + rc = plms_hpi_sensor_evt_process(evt); > else { > LOG_ER("Unknown HPI event received: %i", > evt->req_evt.hpi_evt.sa_hpi_evt.EventType); > @@ -3208,7 +3237,8 @@ static SaUint32T plms_hpi_hs_evt_process(PLMS_EVT > *evt) > hpi_evt->entity_path, > SA_NTF_SEVERITY_CRITICAL, > SA_NTF_AUTHENTICATION_FAILURE, > - SA_PLM_NTFID_UNMAPPED_HE_ALARM, 0, > + SA_PLM_NTFID_UNMAPPED_HE_ALARM, > + hpi_evt->sa_hpi_evt.Timestamp, 0, > NULL /*cor_ids*/, NULL /*buf*/); > if (NCSCC_RC_SUCCESS != ret_err) { > LOG_ER("Unmapped HE notification \ > @@ -3437,6 +3467,75 @@ static SaUint32T > plms_hpi_resource_evt_process(PLMS_EVT *evt) > return rc; > } > > /****************************************************************************** > +@brief : Process HPI sensor events. This function does the > +following things 1. Handle SAHPI_RESE_RESOURCE_FAILURE event, and set > management > +lost 2. Handle SAHPI_RESE_RESOURCE_RESTORED, and clear management lost > + > +@param[in] : <+@param[in]%09:> evt - PLMS_EVT representation of the > SENSOR event. > + > +@return : NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS > > +******************************************************************************/ > +static SaUint32T plms_hpi_sensor_evt_process(PLMS_EVT *evt) > +{ > + SaUint32T rc = NCSCC_RC_SUCCESS; > + PLMS_HPI_EVT *hpi_evt = &(evt->req_evt.hpi_evt); > + SaHpiSensorEventT *sensorEvent = > &hpi_evt->sa_hpi_evt.EventDataUnion.SensorEvent; > + > + TRACE_ENTER2("Entity: %s, sensor num: %u", hpi_evt->entity_path, > + sensorEvent->SensorNum); > + > + do { > + PLMS_EPATH_TO_ENTITY_MAP_INFO *epath_to_ent; > + PLMS_ENTITY *ent; > + PLMS_CB *cb = plms_cb; > + > + if (cb->ha_state == SA_AMF_HA_STANDBY) { > + TRACE_LEAVE2( > + "Ignoring the event as current role is standby"); > + break; > + } > + > + if (hpi_evt->sa_hpi_evt.Severity > SAHPI_MINOR) > + break; > + > + epath_to_ent = > + (PLMS_EPATH_TO_ENTITY_MAP_INFO *)ncs_patricia_tree_get( > + &(cb->epath_to_entity_map_info), > + (SaUint8T *)&(hpi_evt->epath_key)); > + > + if (NULL == epath_to_ent) { > + LOG_ER( > + "Received SENSOR event num %u for unknown resource %s", > + sensorEvent->SensorNum, > + hpi_evt->entity_path); > + break; > + } > + > + ent = epath_to_ent->plms_entity; > + > + rc = plms_alarm_ntf_send(cb->ntf_hdl, > + &ent->dn_name, > + SA_NTF_ALARM_EQUIPMENT, > + hpi_evt->entity_path, > + convertSeverity(hpi_evt->sa_hpi_evt.Severity, > + sensorEvent->Assertion), > + convertCause(sensorEvent->EventCategory), > + SA_PLM_NTFID_HE_ALARM, > + hpi_evt->sa_hpi_evt.Timestamp, > + 0, > + 0, > + 0); > + > + if (rc != NCSCC_RC_SUCCESS) { > + LOG_ER("Failed to send NTF alarm for %s", > + hpi_evt->entity_path); > + } > + } while (false); > + > + TRACE_LEAVE2("Return Val: %d", rc); > + return rc; > +} > > +/****************************************************************************** > @brief : Verifies the HE. > 1. Verifies configured entity paths against hpi published. > 2. Verifies configured inv date against the published one. > diff --git a/src/plm/plmd/plms_notifications.c > b/src/plm/plmd/plms_notifications.c > index 95a61501c..02e9f97a0 100644 > --- a/src/plm/plmd/plms_notifications.c > +++ b/src/plm/plmd/plms_notifications.c > @@ -369,6 +369,7 @@ SaAisErrorT plms_alarm_ntf_send(SaNtfHandleT > plm_ntf_hdl, SaNameT *object, > SaUint32T event_type, SaInt8T *entity_path, > SaUint32T severity, SaUint32T cause, > SaUint32T minor_id, > + SaTimeT timestamp, > SaUint16T no_of_corr_notifications, > SaNtfIdentifierT *corr_ids, > SaNtfIdentifierT *ntf_id) > @@ -376,12 +377,21 @@ SaAisErrorT plms_alarm_ntf_send(SaNtfHandleT > plm_ntf_hdl, SaNameT *object, > SaNtfAlarmNotificationT plm_notification; > SaAisErrorT ret; > SaStringT dest_ptr = NULL; > - SaUint16T ntf_obj_len = 0; > + SaUint16T ntf_obj_len = 0, lengthAdditionalText = 0; > + char additionalText[SA_MAX_NAME_LENGTH + 23] = { 0 }; > + > + if (minor_id == SA_PLM_NTFID_HE_ALARM) { > + snprintf(additionalText, > + object->length, > + "Hardware element %s alarm", > + object->value); > + lengthAdditionalText = strlen(additionalText) + 1; > + } > > ret = saNtfAlarmNotificationAllocate( > plm_ntf_hdl, &plm_notification, > no_of_corr_notifications, /* FIXME no of corelated notifications */ > - 0, /* FIXME Length of additional text */ > + lengthAdditionalText, > 1, /* FIXME assuming only entity path */ > 0, /* FIXME no of specific problems */ > 0, /* FIXME No of monitored attributes */ > @@ -395,9 +405,7 @@ SaAisErrorT plms_alarm_ntf_send(SaNtfHandleT > plm_ntf_hdl, SaNameT *object, > > /* Fill the common parameters of HE, EE and unmapped HE Alarm */ > *(plm_notification.notificationHeader.eventType) = event_type; > - *(plm_notification.notificationHeader.eventTime) = > - (SaTimeT)SA_TIME_UNKNOWN; /* FIXME */ > - ; /* Put current time */ > + *(plm_notification.notificationHeader.eventTime) = timestamp; > > /* Copy noticationObject details give above */ > plm_notification.notificationHeader.notificationObject->length = > @@ -449,6 +457,12 @@ SaAisErrorT plms_alarm_ntf_send(SaNtfHandleT > plm_ntf_hdl, SaNameT *object, > memcpy(dest_ptr, entity_path, strlen(entity_path)); > } > > + if (lengthAdditionalText) { > + strncpy(plm_notification.notificationHeader.additionalText, > + additionalText, > + lengthAdditionalText); > + } > + > ret = saNtfNotificationSend(plm_notification.notificationHandle); > > if (ret != SA_AIS_OK) { > -- > 2.17.2 > > > ------------------------------ > Notice: This e-mail together with any attachments may contain information > of Ribbon Communications Inc. that is confidential and/or proprietary for > the sole use of the intended recipient. Any review, disclosure, reliance or > distribution by others or forwarding without express permission is strictly > prohibited. If you are not the intended recipient, please notify the sender > immediately and then delete all copies, including any attachments. > ------------------------------ > _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel