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 34extern "C" { 35#endif 36 37typedef struct ipmi_list { 38 struct ipmi_list *l_prev; 39 struct ipmi_list *l_next; 40} ipmi_list_t; 41 42typedef 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 47typedef 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 59typedef 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 66struct 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 */ 88extern int ipmi_set_error(ipmi_handle_t *, int, const char *, ...); 89 90/* 91 * Memory allocation 92 */ 93extern void *ipmi_alloc(ipmi_handle_t *, size_t); 94extern void *ipmi_zalloc(ipmi_handle_t *, size_t); 95extern void ipmi_free(ipmi_handle_t *, void *); 96extern void *impi_realloc(ipmi_handle_t *, void *, size_t); 97extern char *ipmi_strdup(ipmi_handle_t *, const char *); 98 99/* 100 * Supported transports 101 */ 102extern ipmi_transport_t ipmi_transport_bmc; 103extern ipmi_transport_t ipmi_transport_lan; 104 105/* 106 * Primitives for converting 107 */ 108typedef struct ipmi_name_trans { 109 int int_value; 110 const char *int_name; 111} ipmi_name_trans_t; 112 113typedef 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 119extern ipmi_name_trans_t ipmi_entity_table[]; 120extern ipmi_name_trans_t ipmi_sensor_type_table[]; 121extern ipmi_name_trans_t ipmi_reading_type_table[]; 122extern ipmi_name_trans_t ipmi_errno_table[]; 123extern ipmi_name_trans_t ipmi_threshold_state_table[]; 124extern ipmi_name_trans_t ipmi_units_type_table[]; 125extern ipmi_sensor_trans_t ipmi_reading_state_table[]; 126extern ipmi_sensor_trans_t ipmi_specific_state_table[]; 127 128/* 129 * Miscellaneous routines 130 */ 131extern int ipmi_sdr_init(ipmi_handle_t *); 132extern void ipmi_sdr_clear(ipmi_handle_t *); 133extern void ipmi_sdr_fini(ipmi_handle_t *); 134extern void ipmi_user_clear(ipmi_handle_t *); 135extern int ipmi_entity_init(ipmi_handle_t *); 136extern void ipmi_entity_clear(ipmi_handle_t *); 137extern void ipmi_entity_fini(ipmi_handle_t *); 138 139extern int ipmi_convert_bcd(int); 140extern void ipmi_decode_string(uint8_t type, uint8_t len, char *data, 141 char *buf); 142extern 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 151extern void ipmi_list_append(ipmi_list_t *, void *); 152extern void ipmi_list_prepend(ipmi_list_t *, void *); 153extern void ipmi_list_insert_before(ipmi_list_t *, void *, void *); 154extern void ipmi_list_insert_after(ipmi_list_t *, void *, void *); 155extern void ipmi_list_delete(ipmi_list_t *, void *); 156 157/* 158 * Hash table routines 159 */ 160 161extern 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 166extern void ipmi_hash_destroy(ipmi_hash_t *); 167extern void *ipmi_hash_lookup(ipmi_hash_t *, const void *); 168extern void ipmi_hash_insert(ipmi_hash_t *, void *); 169extern void ipmi_hash_remove(ipmi_hash_t *, void *); 170extern size_t ipmi_hash_count(ipmi_hash_t *); 171 172extern ulong_t ipmi_hash_strhash(const void *); 173extern int ipmi_hash_strcmp(const void *, const void *); 174 175extern ulong_t ipmi_hash_ptrhash(const void *); 176extern int ipmi_hash_ptrcmp(const void *, const void *); 177 178extern void *ipmi_hash_first(ipmi_hash_t *); 179extern void *ipmi_hash_next(ipmi_hash_t *, void *); 180 181#ifdef __cplusplus 182} 183#endif 184 185#endif /* _IPMI_IMPL_H */ 186