xref: /onnv-gate/usr/src/lib/libipmi/common/ipmi_impl.h (revision 11756:3ae81edcfbf7)
13798Seschrock /*
23798Seschrock  * CDDL HEADER START
33798Seschrock  *
43798Seschrock  * The contents of this file are subject to the terms of the
53798Seschrock  * Common Development and Distribution License (the "License").
63798Seschrock  * You may not use this file except in compliance with the License.
73798Seschrock  *
83798Seschrock  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93798Seschrock  * or http://www.opensolaris.org/os/licensing.
103798Seschrock  * See the License for the specific language governing permissions
113798Seschrock  * and limitations under the License.
123798Seschrock  *
133798Seschrock  * When distributing Covered Code, include this CDDL HEADER in each
143798Seschrock  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153798Seschrock  * If applicable, add the following below this CDDL HEADER, with the
163798Seschrock  * fields enclosed by brackets "[]" replaced with your own identifying
173798Seschrock  * information: Portions Copyright [yyyy] [name of copyright owner]
183798Seschrock  *
193798Seschrock  * CDDL HEADER END
203798Seschrock  */
213798Seschrock /*
22*11756SRobert.Johnston@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
233798Seschrock  * Use is subject to license terms.
243798Seschrock  */
253798Seschrock 
263798Seschrock #ifndef	_IPMI_IMPL_H
273798Seschrock #define	_IPMI_IMPL_H
283798Seschrock 
293798Seschrock #include <stdlib.h>
30*11756SRobert.Johnston@Sun.COM #include <sys/nvpair.h>
316070Srobj #include <libipmi.h>
323798Seschrock 
333798Seschrock #ifdef	__cplusplus
343798Seschrock extern "C" {
353798Seschrock #endif
363798Seschrock 
376070Srobj typedef struct ipmi_list {
386070Srobj 	struct ipmi_list *l_prev;
396070Srobj 	struct ipmi_list *l_next;
406070Srobj } ipmi_list_t;
416070Srobj 
426070Srobj typedef struct ipmi_hash_link {
436070Srobj 	ipmi_list_t  ihl_list;		/* next on list of all elements */
446070Srobj 	struct ipmi_hash_link *ihl_next;	/* next on this bucket */
456070Srobj } ipmi_hash_link_t;
463798Seschrock 
476070Srobj typedef struct ipmi_hash {
486070Srobj 	ipmi_handle_t *ih_handle;	/* handle to library state */
496070Srobj 	ipmi_hash_link_t **ih_buckets;	/* array of buckets */
506070Srobj 	size_t ih_nbuckets;		/* number of buckets */
516070Srobj 	size_t ih_nelements;		/* number of elements */
526070Srobj 	ipmi_list_t ih_list;		/* list of all elements */
536070Srobj 	size_t ih_linkoffs;		/* offset of ipmi_hash_link in elem */
546070Srobj 	const void *(*ih_convert)(const void *); /* key conversion function */
556070Srobj 	ulong_t (*ih_compute)(const void *); /* hash computing function */
566070Srobj 	int (*ih_compare)(const void *, const void *); /* compare function */
576070Srobj } ipmi_hash_t;
583798Seschrock 
593798Seschrock typedef struct ipmi_transport {
60*11756SRobert.Johnston@Sun.COM 	void *		(*it_open)(struct ipmi_handle *, nvlist_t *);
613798Seschrock 	void		(*it_close)(void *);
623798Seschrock 	int 		(*it_send)(void *, struct ipmi_cmd *, struct ipmi_cmd *,
633798Seschrock 			    int *);
643798Seschrock } ipmi_transport_t;
653798Seschrock 
663798Seschrock struct ipmi_handle {
673798Seschrock 	ipmi_transport_t	*ih_transport;
683798Seschrock 	void			*ih_tdata;
693798Seschrock 	ipmi_cmd_t		ih_response;
703798Seschrock 	int			ih_errno;
713798Seschrock 	uint16_t		ih_reservation;
723798Seschrock 	int			ih_retries;
736070Srobj 	ipmi_hash_t		*ih_sdr_cache;
746070Srobj 	uint32_t		ih_sdr_ts;
756070Srobj 	ipmi_deviceid_t		*ih_deviceid;
766070Srobj 	uint32_t		ih_deviceid_len;
776070Srobj 	char			*ih_firmware_rev;
783798Seschrock 	char			ih_errmsg[1024];
793798Seschrock 	char			ih_errbuf[1024];
806070Srobj 	ipmi_list_t		ih_users;
816070Srobj 	ipmi_hash_t		*ih_entities;
828339SEric.Schrock@Sun.COM 	int			ih_completion;
833798Seschrock };
843798Seschrock 
853798Seschrock /*
863798Seschrock  * Error handling
873798Seschrock  */
883798Seschrock extern int ipmi_set_error(ipmi_handle_t *, int, const char *, ...);
893798Seschrock 
903798Seschrock /*
913798Seschrock  * Memory allocation
923798Seschrock  */
933798Seschrock extern void *ipmi_alloc(ipmi_handle_t *, size_t);
943798Seschrock extern void *ipmi_zalloc(ipmi_handle_t *, size_t);
953798Seschrock extern void ipmi_free(ipmi_handle_t *, void *);
963798Seschrock extern void *impi_realloc(ipmi_handle_t *, void *, size_t);
975345Seschrock extern char *ipmi_strdup(ipmi_handle_t *, const char *);
983798Seschrock 
993798Seschrock /*
1003798Seschrock  * Supported transports
1013798Seschrock  */
1023798Seschrock extern ipmi_transport_t ipmi_transport_bmc;
103*11756SRobert.Johnston@Sun.COM extern ipmi_transport_t ipmi_transport_lan;
1043798Seschrock 
1055017Seschrock /*
1066070Srobj  * Primitives for converting
1076070Srobj  */
1086070Srobj typedef struct ipmi_name_trans {
1096070Srobj 	int		int_value;
1106070Srobj 	const char	*int_name;
1116070Srobj } ipmi_name_trans_t;
1126070Srobj 
1136070Srobj typedef struct ipmi_sensor_trans {
1146070Srobj 	uint8_t			ist_key;
1156070Srobj 	uint8_t			ist_value;
1166070Srobj 	ipmi_name_trans_t	ist_mask[1];
1176070Srobj } ipmi_sensor_trans_t;
1186070Srobj 
1196070Srobj extern ipmi_name_trans_t ipmi_entity_table[];
1206070Srobj extern ipmi_name_trans_t ipmi_sensor_type_table[];
1216070Srobj extern ipmi_name_trans_t ipmi_reading_type_table[];
1226070Srobj extern ipmi_name_trans_t ipmi_errno_table[];
1236070Srobj extern ipmi_name_trans_t ipmi_threshold_state_table[];
1247243Srobj extern ipmi_name_trans_t ipmi_units_type_table[];
1256070Srobj extern ipmi_sensor_trans_t ipmi_reading_state_table[];
1266070Srobj extern ipmi_sensor_trans_t ipmi_specific_state_table[];
1276070Srobj 
1286070Srobj /*
1295017Seschrock  * Miscellaneous routines
1305017Seschrock  */
1316070Srobj extern int ipmi_sdr_init(ipmi_handle_t *);
1325017Seschrock extern void ipmi_sdr_clear(ipmi_handle_t *);
1336070Srobj extern void ipmi_sdr_fini(ipmi_handle_t *);
1345345Seschrock extern void ipmi_user_clear(ipmi_handle_t *);
1356070Srobj extern int ipmi_entity_init(ipmi_handle_t *);
1366070Srobj extern void ipmi_entity_clear(ipmi_handle_t *);
1376070Srobj extern void ipmi_entity_fini(ipmi_handle_t *);
1386070Srobj 
1396070Srobj extern int ipmi_convert_bcd(int);
1406070Srobj extern void ipmi_decode_string(uint8_t type, uint8_t len, char *data,
1416070Srobj     char *buf);
1426070Srobj extern boolean_t ipmi_is_sun_ilom(ipmi_deviceid_t *);
1436070Srobj 
1446070Srobj /*
1456070Srobj  * List routines
1466070Srobj  */
1476070Srobj 
1486070Srobj #define	ipmi_list_prev(elem)	((void *)(((ipmi_list_t *)(elem))->l_prev))
1496070Srobj #define	ipmi_list_next(elem)	((void *)(((ipmi_list_t *)(elem))->l_next))
1506070Srobj 
1516070Srobj extern void ipmi_list_append(ipmi_list_t *, void *);
1526070Srobj extern void ipmi_list_prepend(ipmi_list_t *, void *);
1536070Srobj extern void ipmi_list_insert_before(ipmi_list_t *, void *, void *);
1546070Srobj extern void ipmi_list_insert_after(ipmi_list_t *, void *, void *);
1556070Srobj extern void ipmi_list_delete(ipmi_list_t *, void *);
1566070Srobj 
1576070Srobj /*
1586070Srobj  * Hash table routines
1596070Srobj  */
1606070Srobj 
1616070Srobj extern ipmi_hash_t *ipmi_hash_create(ipmi_handle_t *, size_t,
1626070Srobj     const void *(*convert)(const void *),
1636070Srobj     ulong_t (*compute)(const void *),
1646070Srobj     int (*compare)(const void *, const void *));
1656070Srobj 
1666070Srobj extern void ipmi_hash_destroy(ipmi_hash_t *);
1676070Srobj extern void *ipmi_hash_lookup(ipmi_hash_t *, const void *);
1686070Srobj extern void ipmi_hash_insert(ipmi_hash_t *, void *);
1696070Srobj extern void ipmi_hash_remove(ipmi_hash_t *, void *);
1706070Srobj extern size_t ipmi_hash_count(ipmi_hash_t *);
1716070Srobj 
1726070Srobj extern ulong_t ipmi_hash_strhash(const void *);
1736070Srobj extern int ipmi_hash_strcmp(const void *, const void *);
1746070Srobj 
1756070Srobj extern ulong_t ipmi_hash_ptrhash(const void *);
1766070Srobj extern int ipmi_hash_ptrcmp(const void *, const void *);
1776070Srobj 
1786070Srobj extern void *ipmi_hash_first(ipmi_hash_t *);
1796070Srobj extern void *ipmi_hash_next(ipmi_hash_t *, void *);
1805017Seschrock 
1813798Seschrock #ifdef	__cplusplus
1823798Seschrock }
1833798Seschrock #endif
1843798Seschrock 
1853798Seschrock #endif	/* _IPMI_IMPL_H */
186