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