Ejemplo n.º 1
0
static sdata_t *
alloc_sdata(ipmi_sensor_t *sensor)
{
    sdata_t *sdata;

    sdata = malloc(sizeof(*sdata));
    if (!sdata)
	return NULL;

    sdata->es = malloc(ipmi_event_state_size());
    if (!sdata->es) {
	free(sdata);
	return NULL;
    }
    ipmi_event_state_init(sdata->es);

    sdata->th = malloc(ipmi_thresholds_size());
    if (!sdata->th) {
	free(sdata->es);
	free(sdata);
	return NULL;
    }
    ipmi_thresholds_init(sdata->th);

    sdata->refcount = 1;

    sdata->sensor_id = ipmi_sensor_convert_to_id(sensor);
    ipmi_sensor_get_name(sensor, sdata->name, sizeof(sdata->name));

    sdata->next = sdata_list;
    sdata->prev = NULL;
    sdata_list = sdata;

    return sdata;
}
Ejemplo n.º 2
0
static sdata_t *
find_sdata(ipmi_sensor_t *sensor)
{
    ipmi_sensor_id_t id = ipmi_sensor_convert_to_id(sensor);
    sdata_t          *link;

    link = sdata_list;
    while (link) {
	if (ipmi_cmp_sensor_id(id, link->sensor_id) == 0)
	    return link;
	link = link->next;
    }
    return NULL;
}
Ejemplo n.º 3
0
static void add_sensor_event(ipmi_entity_t	*ent,
			     ipmi_sensor_t	*sensor,
			     struct oh_handler_state *handler,
			     SaHpiEntityPathT	parent_ep,
			     SaHpiResourceIdT	rid)
{
	struct ohoi_sensor_info *sensor_info;
	struct oh_event         *e;
        struct ohoi_resource_info *info;

	sensor_info = malloc(sizeof(*sensor_info));

	if (!sensor_info) {
		dbg("Out of memory for sensor info");
		return;
	}

	sensor_info->sensor_id  = ipmi_sensor_convert_to_id(sensor);
	sensor_info->valid = 0;
        sensor_info->enable = SAHPI_TRUE;
	
	e = malloc(sizeof(*e));
	if (!e) {
                free(sensor_info);
		dbg("Out of space");   
		return;
	}
	memset(e, 0, sizeof(*e));

	e->type = OH_ET_RDR;
	add_sensor_event_rdr(sensor, &e->u.rdr_event.rdr, parent_ep, rid);	

        info = oh_get_resource_data(handler->rptcache, rid);
        if (!info) {
                free(e);
                dbg("No info in resource(%d)\n", rid);
                return;
        }
        e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.Num = info->sensor_count;
        info->sensor_count++;

	rid = oh_uid_lookup(&e->u.rdr_event.rdr.Entity);

	oh_add_rdr(handler->rptcache, rid, &e->u.rdr_event.rdr, sensor_info, 1);
}
Ejemplo n.º 4
0
static void sensor_threshold_event(ipmi_sensor_t		*sensor,
				   enum ipmi_event_dir_e	dir,
				   enum ipmi_thresh_e		threshold,
				   enum ipmi_event_value_dir_e	high_low,
				   enum ipmi_value_present_e	value_present,
				   unsigned int			raw_value,
				   double			value,
				   void				*cb_data,
				   ipmi_event_t			*event)
{
	struct oh_event		*e;
        struct oh_handler_state *handler;
	ipmi_entity_id_t	entity_id;
        ipmi_sensor_id_t        sensor_id;
	SaHpiSeverityT		severity;
        SaHpiRptEntryT          *rpt_entry;
        SaHpiRdrT               *rdr;
        unsigned char           *data;
 
        data = ipmi_event_get_data_ptr(event);

      
        handler    = cb_data;
        entity_id  = ipmi_entity_convert_to_id(ipmi_sensor_get_entity(sensor));
        sensor_id = ipmi_sensor_convert_to_id(sensor);
        rpt_entry  = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id);
	
        
        rdr  = ohoi_get_rdr_by_data(handler->rptcache,
                                    rpt_entry->ResourceId,
                                    SAHPI_SENSOR_RDR,
                                    &sensor_id);
        if (!rdr) {
                dbg("No rdr in resource:%d\n",  rpt_entry->ResourceId);
                return;
        }

	e = malloc(sizeof(*e));
	if (!e) {
		dbg("Out of space");
		return;
	}

	memset(e, 0, sizeof(*e));
	e->type = OH_ET_HPI;
	e->u.hpi_event.parent = rpt_entry->ResourceId;
	
	e->u.hpi_event.event.Source = 0;
	/* Do not find EventType in IPMI */
	e->u.hpi_event.event.EventType = SAHPI_ET_SENSOR;
	e->u.hpi_event.event.Timestamp 
                = (SaHpiTimeT)ipmi_get_uint32(data) * 1000000000;

        e->u.hpi_event.event.EventDataUnion.SensorEvent.SensorNum
                = rdr->RdrTypeUnion.SensorRec.Num;

	e->u.hpi_event.event.EventDataUnion.SensorEvent.SensorType 
                = data[7];
	e->u.hpi_event.event.EventDataUnion.SensorEvent.EventCategory 
                = data[9] & 0x7f;
	
	set_thresholed_sensor_event_state(threshold, dir, high_low,
			&e->u.hpi_event.event.EventDataUnion.SensorEvent,
			&severity);
	e->u.hpi_event.event.Severity = severity;

	set_thresholds_sensor_misc_event
		(event, &e->u.hpi_event.event.EventDataUnion.SensorEvent);
        handler->eventq = g_slist_append(handler->eventq, e);

}