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