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 2010 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 <sys/nvpair.h> 31 #include <libipmi.h> 32 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 37 typedef struct ipmi_list { 38 struct ipmi_list *l_prev; 39 struct ipmi_list *l_next; 40 } ipmi_list_t; 41 42 typedef struct ipmi_hash_link { 43 ipmi_list_t ihl_list; /* next on list of all elements */ 44 struct ipmi_hash_link *ihl_next; /* next on this bucket */ 45 } ipmi_hash_link_t; 46 47 typedef struct ipmi_hash { 48 ipmi_handle_t *ih_handle; /* handle to library state */ 49 ipmi_hash_link_t **ih_buckets; /* array of buckets */ 50 size_t ih_nbuckets; /* number of buckets */ 51 size_t ih_nelements; /* number of elements */ 52 ipmi_list_t ih_list; /* list of all elements */ 53 size_t ih_linkoffs; /* offset of ipmi_hash_link in elem */ 54 const void *(*ih_convert)(const void *); /* key conversion function */ 55 ulong_t (*ih_compute)(const void *); /* hash computing function */ 56 int (*ih_compare)(const void *, const void *); /* compare function */ 57 } ipmi_hash_t; 58 59 typedef struct ipmi_transport { 60 void * (*it_open)(struct ipmi_handle *, nvlist_t *); 61 void (*it_close)(void *); 62 int (*it_send)(void *, struct ipmi_cmd *, struct ipmi_cmd *, 63 int *); 64 } ipmi_transport_t; 65 66 struct ipmi_handle { 67 ipmi_transport_t *ih_transport; 68 void *ih_tdata; 69 ipmi_cmd_t ih_response; 70 int ih_errno; 71 uint16_t ih_reservation; 72 int ih_retries; 73 ipmi_hash_t *ih_sdr_cache; 74 uint32_t ih_sdr_ts; 75 ipmi_deviceid_t *ih_deviceid; 76 uint32_t ih_deviceid_len; 77 char *ih_firmware_rev; 78 char ih_errmsg[1024]; 79 char ih_errbuf[1024]; 80 ipmi_list_t ih_users; 81 ipmi_hash_t *ih_entities; 82 int ih_completion; 83 }; 84 85 /* 86 * Error handling 87 */ 88 extern int ipmi_set_error(ipmi_handle_t *, int, const char *, ...); 89 90 /* 91 * Memory allocation 92 */ 93 extern void *ipmi_alloc(ipmi_handle_t *, size_t); 94 extern void *ipmi_zalloc(ipmi_handle_t *, size_t); 95 extern void ipmi_free(ipmi_handle_t *, void *); 96 extern void *impi_realloc(ipmi_handle_t *, void *, size_t); 97 extern char *ipmi_strdup(ipmi_handle_t *, const char *); 98 99 /* 100 * Supported transports 101 */ 102 extern ipmi_transport_t ipmi_transport_bmc; 103 extern ipmi_transport_t ipmi_transport_lan; 104 105 /* 106 * Primitives for converting 107 */ 108 typedef struct ipmi_name_trans { 109 int int_value; 110 const char *int_name; 111 } ipmi_name_trans_t; 112 113 typedef struct ipmi_sensor_trans { 114 uint8_t ist_key; 115 uint8_t ist_value; 116 ipmi_name_trans_t ist_mask[1]; 117 } ipmi_sensor_trans_t; 118 119 extern ipmi_name_trans_t ipmi_entity_table[]; 120 extern ipmi_name_trans_t ipmi_sensor_type_table[]; 121 extern ipmi_name_trans_t ipmi_reading_type_table[]; 122 extern ipmi_name_trans_t ipmi_errno_table[]; 123 extern ipmi_name_trans_t ipmi_threshold_state_table[]; 124 extern ipmi_name_trans_t ipmi_units_type_table[]; 125 extern ipmi_sensor_trans_t ipmi_reading_state_table[]; 126 extern ipmi_sensor_trans_t ipmi_specific_state_table[]; 127 128 /* 129 * Miscellaneous routines 130 */ 131 extern int ipmi_sdr_init(ipmi_handle_t *); 132 extern void ipmi_sdr_clear(ipmi_handle_t *); 133 extern void ipmi_sdr_fini(ipmi_handle_t *); 134 extern void ipmi_user_clear(ipmi_handle_t *); 135 extern int ipmi_entity_init(ipmi_handle_t *); 136 extern void ipmi_entity_clear(ipmi_handle_t *); 137 extern void ipmi_entity_fini(ipmi_handle_t *); 138 139 extern int ipmi_convert_bcd(int); 140 extern void ipmi_decode_string(uint8_t type, uint8_t len, char *data, 141 char *buf); 142 extern boolean_t ipmi_is_sun_ilom(ipmi_deviceid_t *); 143 144 /* 145 * List routines 146 */ 147 148 #define ipmi_list_prev(elem) ((void *)(((ipmi_list_t *)(elem))->l_prev)) 149 #define ipmi_list_next(elem) ((void *)(((ipmi_list_t *)(elem))->l_next)) 150 151 extern void ipmi_list_append(ipmi_list_t *, void *); 152 extern void ipmi_list_prepend(ipmi_list_t *, void *); 153 extern void ipmi_list_insert_before(ipmi_list_t *, void *, void *); 154 extern void ipmi_list_insert_after(ipmi_list_t *, void *, void *); 155 extern void ipmi_list_delete(ipmi_list_t *, void *); 156 157 /* 158 * Hash table routines 159 */ 160 161 extern ipmi_hash_t *ipmi_hash_create(ipmi_handle_t *, size_t, 162 const void *(*convert)(const void *), 163 ulong_t (*compute)(const void *), 164 int (*compare)(const void *, const void *)); 165 166 extern void ipmi_hash_destroy(ipmi_hash_t *); 167 extern void *ipmi_hash_lookup(ipmi_hash_t *, const void *); 168 extern void ipmi_hash_insert(ipmi_hash_t *, void *); 169 extern void ipmi_hash_remove(ipmi_hash_t *, void *); 170 extern size_t ipmi_hash_count(ipmi_hash_t *); 171 172 extern ulong_t ipmi_hash_strhash(const void *); 173 extern int ipmi_hash_strcmp(const void *, const void *); 174 175 extern ulong_t ipmi_hash_ptrhash(const void *); 176 extern int ipmi_hash_ptrcmp(const void *, const void *); 177 178 extern void *ipmi_hash_first(ipmi_hash_t *); 179 extern void *ipmi_hash_next(ipmi_hash_t *, void *); 180 181 #ifdef __cplusplus 182 } 183 #endif 184 185 #endif /* _IPMI_IMPL_H */ 186