Home | History | Annotate | Download | only in common
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef	_IPMI_IMPL_H
     27 #define	_IPMI_IMPL_H
     28 
     29 #include <stdlib.h>
     30 #include <libipmi.h>
     31 
     32 #ifdef	__cplusplus
     33 extern "C" {
     34 #endif
     35 
     36 typedef struct ipmi_list {
     37 	struct ipmi_list *l_prev;
     38 	struct ipmi_list *l_next;
     39 } ipmi_list_t;
     40 
     41 typedef struct ipmi_hash_link {
     42 	ipmi_list_t  ihl_list;		/* next on list of all elements */
     43 	struct ipmi_hash_link *ihl_next;	/* next on this bucket */
     44 } ipmi_hash_link_t;
     45 
     46 typedef struct ipmi_hash {
     47 	ipmi_handle_t *ih_handle;	/* handle to library state */
     48 	ipmi_hash_link_t **ih_buckets;	/* array of buckets */
     49 	size_t ih_nbuckets;		/* number of buckets */
     50 	size_t ih_nelements;		/* number of elements */
     51 	ipmi_list_t ih_list;		/* list of all elements */
     52 	size_t ih_linkoffs;		/* offset of ipmi_hash_link in elem */
     53 	const void *(*ih_convert)(const void *); /* key conversion function */
     54 	ulong_t (*ih_compute)(const void *); /* hash computing function */
     55 	int (*ih_compare)(const void *, const void *); /* compare function */
     56 } ipmi_hash_t;
     57 
     58 typedef struct ipmi_transport {
     59 	void *		(*it_open)(struct ipmi_handle *);
     60 	void		(*it_close)(void *);
     61 	int 		(*it_send)(void *, struct ipmi_cmd *, struct ipmi_cmd *,
     62 			    int *);
     63 } ipmi_transport_t;
     64 
     65 struct ipmi_handle {
     66 	ipmi_transport_t	*ih_transport;
     67 	void			*ih_tdata;
     68 	ipmi_cmd_t		ih_response;
     69 	int			ih_errno;
     70 	uint16_t		ih_reservation;
     71 	int			ih_retries;
     72 	ipmi_hash_t		*ih_sdr_cache;
     73 	uint32_t		ih_sdr_ts;
     74 	ipmi_deviceid_t		*ih_deviceid;
     75 	uint32_t		ih_deviceid_len;
     76 	char			*ih_firmware_rev;
     77 	char			ih_errmsg[1024];
     78 	char			ih_errbuf[1024];
     79 	ipmi_list_t		ih_users;
     80 	ipmi_hash_t		*ih_entities;
     81 	int			ih_completion;
     82 };
     83 
     84 /*
     85  * Error handling
     86  */
     87 extern int ipmi_set_error(ipmi_handle_t *, int, const char *, ...);
     88 
     89 /*
     90  * Memory allocation
     91  */
     92 extern void *ipmi_alloc(ipmi_handle_t *, size_t);
     93 extern void *ipmi_zalloc(ipmi_handle_t *, size_t);
     94 extern void ipmi_free(ipmi_handle_t *, void *);
     95 extern void *impi_realloc(ipmi_handle_t *, void *, size_t);
     96 extern char *ipmi_strdup(ipmi_handle_t *, const char *);
     97 
     98 /*
     99  * Supported transports
    100  */
    101 extern ipmi_transport_t ipmi_transport_bmc;
    102 
    103 /*
    104  * Primitives for converting
    105  */
    106 typedef struct ipmi_name_trans {
    107 	int		int_value;
    108 	const char	*int_name;
    109 } ipmi_name_trans_t;
    110 
    111 typedef struct ipmi_sensor_trans {
    112 	uint8_t			ist_key;
    113 	uint8_t			ist_value;
    114 	ipmi_name_trans_t	ist_mask[1];
    115 } ipmi_sensor_trans_t;
    116 
    117 extern ipmi_name_trans_t ipmi_entity_table[];
    118 extern ipmi_name_trans_t ipmi_sensor_type_table[];
    119 extern ipmi_name_trans_t ipmi_reading_type_table[];
    120 extern ipmi_name_trans_t ipmi_errno_table[];
    121 extern ipmi_name_trans_t ipmi_threshold_state_table[];
    122 extern ipmi_name_trans_t ipmi_units_type_table[];
    123 extern ipmi_sensor_trans_t ipmi_reading_state_table[];
    124 extern ipmi_sensor_trans_t ipmi_specific_state_table[];
    125 
    126 /*
    127  * Miscellaneous routines
    128  */
    129 extern int ipmi_sdr_init(ipmi_handle_t *);
    130 extern void ipmi_sdr_clear(ipmi_handle_t *);
    131 extern void ipmi_sdr_fini(ipmi_handle_t *);
    132 extern void ipmi_user_clear(ipmi_handle_t *);
    133 extern int ipmi_entity_init(ipmi_handle_t *);
    134 extern void ipmi_entity_clear(ipmi_handle_t *);
    135 extern void ipmi_entity_fini(ipmi_handle_t *);
    136 
    137 extern int ipmi_convert_bcd(int);
    138 extern void ipmi_decode_string(uint8_t type, uint8_t len, char *data,
    139     char *buf);
    140 extern boolean_t ipmi_is_sun_ilom(ipmi_deviceid_t *);
    141 
    142 /*
    143  * List routines
    144  */
    145 
    146 #define	ipmi_list_prev(elem)	((void *)(((ipmi_list_t *)(elem))->l_prev))
    147 #define	ipmi_list_next(elem)	((void *)(((ipmi_list_t *)(elem))->l_next))
    148 
    149 extern void ipmi_list_append(ipmi_list_t *, void *);
    150 extern void ipmi_list_prepend(ipmi_list_t *, void *);
    151 extern void ipmi_list_insert_before(ipmi_list_t *, void *, void *);
    152 extern void ipmi_list_insert_after(ipmi_list_t *, void *, void *);
    153 extern void ipmi_list_delete(ipmi_list_t *, void *);
    154 
    155 /*
    156  * Hash table routines
    157  */
    158 
    159 extern ipmi_hash_t *ipmi_hash_create(ipmi_handle_t *, size_t,
    160     const void *(*convert)(const void *),
    161     ulong_t (*compute)(const void *),
    162     int (*compare)(const void *, const void *));
    163 
    164 extern void ipmi_hash_destroy(ipmi_hash_t *);
    165 extern void *ipmi_hash_lookup(ipmi_hash_t *, const void *);
    166 extern void ipmi_hash_insert(ipmi_hash_t *, void *);
    167 extern void ipmi_hash_remove(ipmi_hash_t *, void *);
    168 extern size_t ipmi_hash_count(ipmi_hash_t *);
    169 
    170 extern ulong_t ipmi_hash_strhash(const void *);
    171 extern int ipmi_hash_strcmp(const void *, const void *);
    172 
    173 extern ulong_t ipmi_hash_ptrhash(const void *);
    174 extern int ipmi_hash_ptrcmp(const void *, const void *);
    175 
    176 extern void *ipmi_hash_first(ipmi_hash_t *);
    177 extern void *ipmi_hash_next(ipmi_hash_t *, void *);
    178 
    179 #ifdef	__cplusplus
    180 }
    181 #endif
    182 
    183 #endif	/* _IPMI_IMPL_H */
    184