static void add_control_event_rdr(ipmi_control_t *control, SaHpiRdrT *rdr, SaHpiEntityPathT parent_ep, SaHpiResourceIdT res_id) { char name[32]; //SaHpiEntityPathT rdr_ep; memset(name,'\0',32); rdr->RecordId = 0; rdr->RdrType = SAHPI_CTRL_RDR; //rdr->Entity.Entry[0].EntityType = (SaHpiEntityTypeT)id; //rdr->Entity.Entry[0].EntityLocation = (SaHpiEntityLocationT)instance; //rdr->Entity.Entry[1].EntityType = 0; //rdr->Entity.Entry[1].EntityLocation = 0; rdr->Entity = parent_ep; /* append ep */ //oh_encode_entitypath(entity_root, &rdr_ep); //oh_concat_ep (&rdr->Entity, &rdr_ep); add_control_event_control_rec(control, &rdr->RdrTypeUnion.CtrlRec); ipmi_control_get_id(control, name, 32); rdr->IdString.DataType = SAHPI_TL_TYPE_ASCII6; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = 32; memcpy(rdr->IdString.Data,name, strlen(name) + 1); }
static zbx_ipmi_control_t *allocate_ipmi_control(zbx_ipmi_host_t *h, ipmi_control_t *control) { size_t sz; zbx_ipmi_control_t *c; char *c_name = NULL; sz = (size_t)ipmi_control_get_id_length(control); c_name = zbx_malloc(c_name, sz + 1); ipmi_control_get_id(control, c_name, sz); zabbix_log(LOG_LEVEL_DEBUG, "In allocate_ipmi_control() %s@[%s]:%d", c_name, h->ip, h->port); h->control_count++; sz = h->control_count * sizeof(zbx_ipmi_control_t); if (NULL == h->controls) h->controls = zbx_malloc(h->controls, sz); else h->controls = zbx_realloc(h->controls, sz); c = &h->controls[h->control_count - 1]; memset(c, 0, sizeof(zbx_ipmi_control_t)); c->control = control; c->c_name = c_name; c->num_values = ipmi_control_get_num_vals(control); sz = sizeof(int) * c->num_values; c->val = zbx_malloc(c->val, sz); memset(c->val, 0, sz); return c; }
static void set_idstring(ipmi_control_t *control, SaHpiRdrT *rdr) { char name[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextTypeT data_type; int name_len; memset(name, '\0' ,SAHPI_MAX_TEXT_BUFFER_LENGTH); ipmi_control_get_id(control, name, SAHPI_MAX_TEXT_BUFFER_LENGTH); name_len = ipmi_control_get_id_length(control); if (name_len >= SAHPI_MAX_TEXT_BUFFER_LENGTH) name_len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 1; data_type = convert_to_hpi_data_type(ipmi_control_get_id_type(control)); rdr->IdString.DataType = data_type; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = name_len; memset(rdr->IdString.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); memcpy(rdr->IdString.Data, name, name_len); }
static void add_control_event_rdr(ipmi_control_t *control, SaHpiRdrT *rdr, SaHpiEntityPathT parent_ep, SaHpiResourceIdT res_id) { char name[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextTypeT data_type; int name_len; memset(name, '\0' ,SAHPI_MAX_TEXT_BUFFER_LENGTH); rdr->RecordId = 0; rdr->RdrType = SAHPI_CTRL_RDR; //rdr->Entity.Entry[0].EntityType = (SaHpiEntityTypeT)id; //rdr->Entity.Entry[0].EntityLocation = (SaHpiEntityLocationT)instance; //rdr->Entity.Entry[1].EntityType = 0; //rdr->Entity.Entry[1].EntityLocation = 0; rdr->Entity = parent_ep; /* append ep */ //oh_encode_entitypath(entity_root, &rdr_ep); //oh_concat_ep (&rdr->Entity, &rdr_ep); add_control_event_control_rec(control, &rdr->RdrTypeUnion.CtrlRec); ipmi_control_get_id(control, name, SAHPI_MAX_TEXT_BUFFER_LENGTH); name_len = ipmi_control_get_id_length(control); if (name_len >= SAHPI_MAX_TEXT_BUFFER_LENGTH) name_len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 1; data_type = convert_to_hpi_data_type(ipmi_control_get_id_type(control)); rdr->IdString.DataType = data_type; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = name_len; memset(rdr->IdString.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); memcpy(rdr->IdString.Data, name, name_len); }
static void trace_ipmi_control(char *str, ipmi_control_t *control, SaHpiRptEntryT *rpt) { if (!getenv("OHOI_TRACE_CONTROL") && !IHOI_TRACE_ALL) { return; } char strtype[24]; char name[24]; ipmi_control_get_id(control, name, 24); switch (ipmi_control_get_type(control)) { case IPMI_CONTROL_ONE_SHOT_RESET: strncpy(strtype,"reset", 24); break; case IPMI_CONTROL_POWER: strncpy(strtype,"power", 24); break; case IPMI_CONTROL_ALARM: strncpy(strtype,"alarm", 24); break; case IPMI_CONTROL_IDENTIFIER: strncpy(strtype,"address", 24); break; case IPMI_CONTROL_LIGHT: strncpy(strtype,"LED", 24); break; default: snprintf(strtype, 24, "unknown(%d)", ipmi_control_get_type(control)); break; } fprintf(stderr, " *** CONTROL %s. type %s (%s). RPT %d(%s)\n", str, strtype, name, rpt->ResourceId, rpt->ResourceTag.Data); }
void ohoi_control_event(enum ipmi_update_e op, ipmi_entity_t *ent, ipmi_control_t *control, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *ohoi_res_info; int ctrl_type = ipmi_control_get_type(control); ipmi_control_id_t cid = ipmi_control_convert_to_id(control); ipmi_entity_id_t entity_id; SaHpiRptEntryT *rpt_entry; char str[24]; int rv; entity_id = ipmi_entity_convert_to_id(ent); rpt_entry = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (!rpt_entry) { dump_entity_id("Control with RPT Entry?!", entity_id); return; } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); ohoi_res_info = oh_get_resource_data(handler->rptcache, rpt_entry->ResourceId); if (op == IPMI_ADDED) { trace_ipmi_control("ADD", control, rpt_entry); /* attach power and reset to chassis entity since IPMI provides them as such */ switch (ctrl_type) { case IPMI_CONTROL_ONE_SHOT_RESET: ohoi_res_info->reset_ctrl = cid; rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_RESET; break; case IPMI_CONTROL_POWER: if ((ipmi_handler->d_type == IPMI_DOMAIN_TYPE_ATCA) && (ipmi_entity_get_entity_id(ent) == SAHPI_ENT_SYSTEM_CHASSIS)) { // never power off ATCA chassis break; } ohoi_res_info->power_ctrl = cid; rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_POWER; break; case IPMI_CONTROL_ALARM: rv = add_alarm_rdrs(handler,rpt_entry,control); if (rv) { dbg("add_alarms_rdrs failed"); break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; break; case IPMI_CONTROL_IDENTIFIER: #if 0 rv = address_control_get(control,handler, ent, rpt_entry); if (rv) { dbg("address_control_get failed"); break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; #endif break; case IPMI_CONTROL_LIGHT: ipmi_control_get_id(control, str, 24); if (add_led_control_event(ent, control, handler, rpt_entry)) { break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; break; default: if (SA_OK != add_control_event(ent, control, handler, rpt_entry->ResourceEntity, rpt_entry->ResourceId)) { break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; break; } } else if (op == IPMI_DELETED) { trace_ipmi_control("DELETE", control, rpt_entry); switch (ctrl_type) { case IPMI_CONTROL_ONE_SHOT_RESET: ipmi_control_id_set_invalid( &ohoi_res_info->reset_ctrl); rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_RESET; break; case IPMI_CONTROL_POWER: ipmi_control_id_set_invalid( &ohoi_res_info->power_ctrl); rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_POWER; break; default: if (ohoi_delete_orig_control_rdr(handler, rpt_entry, &cid)) { // no more controlss for rpt rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_CONTROL; ohoi_res_info->ctrl_count = 0; } break; } if ((oh_get_rdr_next(handler->rptcache, rpt_entry->ResourceId, SAHPI_FIRST_ENTRY) == NULL) && (ohoi_res_info->fru == NULL)) { // no more rdrs for rpt rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_RDR; } } trace_ipmi("Set updated for res_info %p(%d). Control", ohoi_res_info, rpt_entry->ResourceId); entity_rpt_set_updated(ohoi_res_info, ipmi_handler); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); }