/* callback function invoked from OpenIPMI */ static void domains_iterate_cb(ipmi_domain_t *domain, void *cb_data) { char name[IPMI_DOMAIN_NAME_LEN], *domain_name = cb_data; ipmi_domain_get_name(domain, name, sizeof(name)); if (0 == strcmp(domain_name, name)) domain_id_ptr = ipmi_domain_convert_to_id(domain); }
static void solparm_list(ipmi_domain_t *domain, void *cb_data) { ipmi_cmd_info_t *cmd_info = cb_data; char domain_name[IPMI_DOMAIN_NAME_LEN]; ipmi_domain_get_name(domain, domain_name, sizeof(domain_name)); ipmi_cmdlang_out(cmd_info, "Domain", NULL); ipmi_cmdlang_down(cmd_info); ipmi_cmdlang_out(cmd_info, "Name", domain_name); ipmi_cmdlang_out(cmd_info, "SOLPARMs", NULL); ipmi_cmdlang_down(cmd_info); ipmi_solparm_iterate_solparms(domain, solparm_list_handler, cmd_info); ipmi_cmdlang_up(cmd_info); ipmi_cmdlang_up(cmd_info); }
static int init_domain_handlers(ipmi_domain_t *domain, void *user_data) { struct oh_handler_state *handler = user_data; char dmn_name[IPMI_DOMAIN_NAME_LEN]; int rv; int ret = 0; rv = ipmi_domain_enable_events(domain); if (rv) { fprintf(stderr, "ipmi_domain_enable_events return error %d\n", rv); if (ret == 0) { ret = rv; } } rv = ipmi_domain_add_entity_update_handler(domain, ohoi_entity_event, handler); if (rv) { fprintf(stderr, "ipmi_domain_add_entity_update_handler error %d\n", rv); if (ret == 0) { ret = rv; } } rv = ipmi_domain_add_mc_updated_handler(domain, ohoi_mc_event, handler); if (rv) { fprintf(stderr, "ipmi_domain_register_mc_update_handler return error: %d\n", rv); if (ret == 0) { ret = rv; } } if (ret) { ipmi_domain_get_name(domain, dmn_name, IPMI_DOMAIN_NAME_LEN); fprintf(stderr, "Could not initialize ipmi domain %s\n", dmn_name); } return ret; }
int ipmi_solparm_alloc(ipmi_mc_t *mc, unsigned int channel, ipmi_solparm_t **new_solparm) { ipmi_solparm_t *solparm = NULL; int rv = 0; ipmi_domain_t *domain = ipmi_mc_get_domain(mc); int p, len; locked_list_t *solparml; ipmi_domain_attr_t *attr; CHECK_MC_LOCK(mc); rv = ipmi_domain_register_attribute(domain, IPMI_SOLPARM_ATTR_NAME, solparm_attr_init, solparm_attr_destroy, NULL, &attr); if (rv) return rv; solparml = ipmi_domain_attr_get_data(attr); solparm = ipmi_mem_alloc(sizeof(*solparm)); if (!solparm) { rv = ENOMEM; goto out; } memset(solparm, 0, sizeof(*solparm)); solparm->refcount = 1; solparm->in_list = 1; solparm->mc = ipmi_mc_convert_to_id(mc); solparm->domain = ipmi_domain_convert_to_id(domain); len = sizeof(solparm->name); p = ipmi_domain_get_name(domain, solparm->name, len); len -= p; snprintf(solparm->name+p, len, ".%d", ipmi_domain_get_unique_num(domain)); solparm->os_hnd = ipmi_domain_get_os_hnd(domain); solparm->solparm_lock = NULL; solparm->channel = channel & 0xf; solparm->opq = opq_alloc(solparm->os_hnd); if (!solparm->opq) { rv = ENOMEM; goto out; } if (solparm->os_hnd->create_lock) { rv = solparm->os_hnd->create_lock(solparm->os_hnd, &solparm->solparm_lock); if (rv) goto out; } if (! locked_list_add(solparml, solparm, NULL)) { rv = ENOMEM; goto out; } out: if (rv) { if (solparm) { if (solparm->opq) opq_destroy(solparm->opq); if (solparm->solparm_lock) solparm->os_hnd->destroy_lock(solparm->os_hnd, solparm->solparm_lock); ipmi_mem_free(solparm); } } else { *new_solparm = solparm; } ipmi_domain_attr_put(attr); return rv; }
int ipmi_pet_create_mc(ipmi_mc_t *mc, unsigned int channel, struct in_addr ip_addr, unsigned char mac_addr[6], unsigned int eft_sel, unsigned int policy_num, unsigned int apt_sel, unsigned int lan_dest_sel, ipmi_pet_done_cb done, void *cb_data, ipmi_pet_t **ret_pet) { ipmi_pet_t *pet; int rv; os_handler_t *os_hnd; char domain_name[IPMI_MC_NAME_LEN]; ipmi_domain_t *domain = ipmi_mc_get_domain(mc); ipmi_domain_attr_t *attr; locked_list_t *pets; rv = ipmi_domain_register_attribute(domain, IPMI_PET_ATTR_NAME, pet_attr_init, pet_attr_destroy, NULL, &attr); if (rv) return rv; pets = ipmi_domain_attr_get_data(attr); pet = ipmi_mem_alloc(sizeof(*pet)); if (!pet) { ipmi_domain_attr_put(attr); return ENOMEM; } memset(pet, 0, sizeof(*pet)); ipmi_domain_get_name(domain, domain_name, sizeof(domain_name)); snprintf(pet->name, sizeof(pet->name), "%s.%d", domain_name, ipmi_domain_get_unique_num(domain)); pet->refcount = 1; pet->in_list = 1; pet->mc = ipmi_mc_convert_to_id(mc); pet->domain = ipmi_domain_convert_to_id(domain); pet->channel = channel; pet->ip_addr = ip_addr; pet->policy_num = policy_num; pet->eft_sel = eft_sel; pet->apt_sel = apt_sel; pet->lan_dest_sel = lan_dest_sel; pet->done = done; pet->cb_data = cb_data; memcpy(pet->mac_addr, mac_addr, sizeof(pet->mac_addr)); pet->in_progress = 0; /* Set up all the data we want in the PEF and LANPARMs configuration. */ pet->pef_check[0].conf_num = IPMI_PEFPARM_CONTROL; pet->pef_check[0].data_len = 1; pet->pef_check[0].data[0] = 1; pet->pef_check[0].mask[0] = 1; pet->pef_check[1].conf_num = IPMI_PEFPARM_ACTION_GLOBAL_CONTROL; pet->pef_check[1].data_len = 1; pet->pef_check[1].data[0] = 1; pet->pef_check[1].mask[0] = 1; pet->pef_check[2].conf_num = IPMI_PEFPARM_EVENT_FILTER_TABLE; pet->pef_check[2].set = eft_sel; pet->pef_check[2].data_len = 21; memset(pet->pef_check[2].data, 0xff, 10); memset(pet->pef_check[2].data+10, 0, 21-9); memset(pet->pef_check[2].mask, 0xff, 21); pet->pef_check[2].data[0] = eft_sel; pet->pef_check[2].mask[0] = 0x7f; pet->pef_check[2].data[1] = 0x80; pet->pef_check[2].mask[1] = 0x80; pet->pef_check[2].data[2] = 0x01; pet->pef_check[2].mask[2] = 0x3f; pet->pef_check[2].data[3] = policy_num; pet->pef_check[2].mask[3] = 0x0f; pet->pef_check[2].data[4] = 0; pet->pef_check[2].data[10] = 0xff; pet->pef_check[2].data[11] = 0xff; pet->pef_check[3].conf_num = IPMI_PEFPARM_ALERT_POLICY_TABLE; pet->pef_check[3].set = apt_sel; pet->pef_check[3].data_len = 4; pet->pef_check[3].data[0] = apt_sel; pet->pef_check[3].mask[0] = 0x7f; pet->pef_check[3].data[1] = 0x08 | (policy_num << 4); pet->pef_check[3].mask[1] = 0xff; pet->pef_check[3].data[2] = (channel << 4) | lan_dest_sel; pet->pef_check[3].mask[2] = 0xff; pet->pef_check[3].data[3] = 0; pet->pef_check[3].mask[3] = 0xff; pet->lanparm_check[0].conf_num = IPMI_LANPARM_DEST_TYPE; pet->lanparm_check[0].set = lan_dest_sel; pet->lanparm_check[0].data_len = 4; pet->lanparm_check[0].data[0] = lan_dest_sel; pet->lanparm_check[0].mask[0] = 0x0f; pet->lanparm_check[0].data[1] = 0x80; pet->lanparm_check[0].mask[1] = 0x87; pet->lanparm_check[0].data[2] = IPMI_LANPARM_DEFAULT_ALERT_RETRY_TIMEOUT; pet->lanparm_check[0].mask[2] = 0xff; pet->lanparm_check[0].data[3] = IPMI_LANPARM_DEFAULT_ALERT_RETRIES; pet->lanparm_check[0].mask[3] = 0x07; pet->lanparm_check[1].conf_num = IPMI_LANPARM_DEST_ADDR; pet->lanparm_check[1].set = lan_dest_sel; pet->lanparm_check[1].data_len = 13; pet->lanparm_check[1].data[0] = lan_dest_sel; pet->lanparm_check[1].mask[0] = 0x0f; pet->lanparm_check[1].data[1] = 0x00; pet->lanparm_check[1].mask[1] = 0xf0; pet->lanparm_check[1].data[2] = 0x00; pet->lanparm_check[1].mask[2] = 0x01; memset(pet->lanparm_check[1].mask+3, 0xff, 10); memcpy(pet->lanparm_check[1].data+3, &ip_addr, 4); memcpy(pet->lanparm_check[1].data+7, mac_addr, 6); os_hnd = ipmi_domain_get_os_hnd(domain); pet->os_hnd = os_hnd; /* Start a timer for this PET to periodically check it. */ pet->timer_info = ipmi_mem_alloc(sizeof(*(pet->timer_info))); if (!pet->timer_info) { rv = ENOMEM; goto out_err; } pet->timer_info->cancelled = 0; pet->timer_info->os_hnd = os_hnd; pet->timer_info->pet = pet; pet->timer_info->running = 0; pet->timer_info->lock = NULL; rv = os_hnd->alloc_timer(os_hnd, &pet->timer); if (rv) goto out_err; rv = ipmi_create_lock_os_hnd(os_hnd, &pet->timer_info->lock); if (rv) goto out_err; if (! locked_list_add(pets, pet, NULL)) { rv = ENOMEM; goto out_err; } ipmi_domain_attr_put(attr); rv = start_pet_setup(mc, pet); if (rv) goto out_err; if (ret_pet) *ret_pet = pet; return 0; out_err: locked_list_remove(pets, pet, NULL); ipmi_domain_attr_put(attr); if (pet->timer_info) { if (pet->timer) { if (os_hnd->stop_timer(os_hnd, pet->timer) == 0) { if (pet->timer_info->lock) ipmi_destroy_lock(pet->timer_info->lock); os_hnd->free_timer(os_hnd, pet->timer); ipmi_mem_free(pet->timer_info); } else { pet->timer_info->cancelled = 1; } } else ipmi_mem_free(pet->timer_info); } ipmi_mem_free(pet); return rv; }