131 #include <execinfo.h> 137 #include <sys/types.h> 138 #include <sys/stat.h> 139 #include <sys/ioctl.h> 140 #include <sys/time.h> 149 #include <sys/socket.h> 150 #include <linux/netlink.h> 151 #include <scsi/scsi_netlink_fc.h> 157 #ifdef HBAAPI_VENDOR_LIB 163 typedef HBA_UINT32(*HBAGetVersionFunc)(void);
164 typedef HBA_STATUS(*HBALoadLibraryFunc)(void);
165 typedef HBA_STATUS(*HBAFreeLibraryFunc)(void);
166 typedef HBA_UINT32(*HBAGetVendorLibraryAttributesFunc)(HBA_LIBRARYATTRIBUTES *);
167 typedef HBA_UINT32(*HBAGetNumberOfAdaptersFunc)(void);
168 typedef void(*HBARefreshInformationFunc)(HBA_HANDLE);
169 typedef void(*HBARefreshAdapterConfigurationFunc)(void);
170 typedef void(*HBAResetStatisticsFunc)(HBA_HANDLE, HBA_UINT32);
173 typedef HBA_STATUS(*HBAGetAdapterNameFunc)(HBA_UINT32,
char *);
174 typedef HBA_HANDLE(*HBAOpenAdapterFunc)(
char *);
175 typedef HBA_STATUS(*HBAOpenAdapterByWWNFunc)(HBA_HANDLE *, HBA_WWN);
176 typedef void(*HBACloseAdapterFunc)(HBA_HANDLE);
177 typedef HBA_STATUS(*HBAGetAdapterAttributesFunc)
178 (HBA_HANDLE, HBA_ADAPTERATTRIBUTES *);
179 typedef HBA_STATUS(*HBAGetAdapterPortAttributesFunc)
180 (HBA_HANDLE, HBA_UINT32, HBA_PORTATTRIBUTES *);
181 typedef HBA_STATUS(*HBAGetDiscoveredPortAttributesFunc)
182 (HBA_HANDLE, HBA_UINT32, HBA_UINT32, HBA_PORTATTRIBUTES *);
183 typedef HBA_STATUS(*HBAGetPortAttributesByWWNFunc)
184 (HBA_HANDLE, HBA_WWN, HBA_PORTATTRIBUTES *);
185 typedef HBA_STATUS(*HBAGetPortStatisticsFunc)
186 (HBA_HANDLE, HBA_UINT32, HBA_PORTSTATISTICS *);
187 typedef HBA_STATUS(*HBAGetFC4StatisticsFunc)
188 (HBA_HANDLE, HBA_WWN, HBA_UINT8, HBA_FC4STATISTICS *);
191 typedef HBA_STATUS(*HBAGetBindingCapabilityFunc)
192 (HBA_HANDLE, HBA_WWN, HBA_BIND_CAPABILITY *);
193 typedef HBA_STATUS(*HBAGetBindingSupportFunc)
194 (HBA_HANDLE, HBA_WWN, HBA_BIND_CAPABILITY *);
195 typedef HBA_STATUS(*HBASetBindingSupportFunc)
196 (HBA_HANDLE, HBA_WWN, HBA_BIND_CAPABILITY);
197 typedef HBA_STATUS(*HBAGetFcpTargetMappingFunc)
198 (HBA_HANDLE, HBA_FCPTARGETMAPPING *);
199 typedef HBA_STATUS(*HBAGetFcpTargetMappingV2Func)
200 (HBA_HANDLE, HBA_WWN, HBA_FCPTARGETMAPPINGV2 *);
201 typedef HBA_STATUS(*HBAGetFcpPersistentBindingFunc)
202 (HBA_HANDLE, HBA_FCPBINDING *);
203 typedef HBA_STATUS(*HBAGetPersistentBindingV2Func)
204 (HBA_HANDLE, HBA_WWN, HBA_FCPBINDING2 *);
205 typedef HBA_STATUS(*HBASetPersistentBindingV2Func)
206 (HBA_HANDLE, HBA_WWN, HBA_FCPBINDING2 *);
207 typedef HBA_STATUS(*HBARemovePersistentBindingFunc)
208 (HBA_HANDLE, HBA_WWN, HBA_FCPBINDING2 *);
209 typedef HBA_STATUS(*HBARemoveAllPersistentBindingsFunc)(HBA_HANDLE, HBA_WWN);
210 typedef HBA_STATUS(*HBAGetFCPStatisticsFunc)
211 (HBA_HANDLE,
const HBA_SCSIID *, HBA_FC4STATISTICS *);
214 typedef HBA_STATUS(*HBASendScsiInquiryFunc)
215 (HBA_HANDLE, HBA_WWN, HBA_UINT64, HBA_UINT8, HBA_UINT32,
void *,
216 HBA_UINT32,
void *, HBA_UINT32);
217 typedef HBA_STATUS(*HBAScsiInquiryV2Func)
218 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT64, HBA_UINT8, HBA_UINT8,
void *,
219 HBA_UINT32 *, HBA_UINT8 *,
void *, HBA_UINT32 *);
220 typedef HBA_STATUS(*HBASendReportLUNsFunc)
221 (HBA_HANDLE, HBA_WWN,
void *, HBA_UINT32,
void *, HBA_UINT32);
222 typedef HBA_STATUS(*HBAScsiReportLUNsV2Func)
223 (HBA_HANDLE, HBA_WWN, HBA_WWN,
void *, HBA_UINT32 *, HBA_UINT8 *,
void *,
225 typedef HBA_STATUS(*HBASendReadCapacityFunc)
226 (HBA_HANDLE, HBA_WWN, HBA_UINT64,
void *, HBA_UINT32,
void *, HBA_UINT32);
227 typedef HBA_STATUS(*HBAScsiReadCapacityV2Func)
228 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT64,
void *, HBA_UINT32 *,
229 HBA_UINT8 *,
void *, HBA_UINT32 *);
232 typedef HBA_STATUS(*HBASendCTPassThruFunc)
233 (HBA_HANDLE,
void *, HBA_UINT32,
void *, HBA_UINT32);
234 typedef HBA_STATUS(*HBASendCTPassThruV2Func)
235 (HBA_HANDLE, HBA_WWN,
void *, HBA_UINT32,
void *, HBA_UINT32 *);
236 typedef HBA_STATUS(*HBASetRNIDMgmtInfoFunc)(HBA_HANDLE, HBA_MGMTINFO *);
237 typedef HBA_STATUS(*HBAGetRNIDMgmtInfoFunc)(HBA_HANDLE, HBA_MGMTINFO *);
238 typedef HBA_STATUS(*HBASendRNIDFunc)
239 (HBA_HANDLE, HBA_WWN, HBA_WWNTYPE,
void *, HBA_UINT32 *);
240 typedef HBA_STATUS(*HBASendRNIDV2Func)
241 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT32, HBA_UINT32,
void *,
243 typedef HBA_STATUS(*HBASendRPLFunc)
244 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT32, HBA_UINT32,
void *,
246 typedef HBA_STATUS(*HBASendRPSFunc)
247 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT32, HBA_WWN, HBA_UINT32,
void *,
249 typedef HBA_STATUS(*HBASendSRLFunc)
250 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT32,
void *, HBA_UINT32 *);
251 typedef HBA_STATUS(*HBASendLIRRFunc)
252 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT8, HBA_UINT8,
void *, HBA_UINT32 *);
253 typedef HBA_STATUS(*HBASendRLSFunc)
254 (HBA_HANDLE, HBA_WWN, HBA_WWN,
void *, HBA_UINT32 *);
257 typedef HBA_STATUS(*HBAGetEventBufferFunc)
258 (HBA_HANDLE, HBA_EVENTINFO *, HBA_UINT32 *);
259 typedef HBA_STATUS(*HBARegisterForAdapterAddEventsFunc)
260 (void (*)(
void *, HBA_WWN, HBA_UINT32),
void *, HBA_CALLBACKHANDLE *);
261 typedef HBA_STATUS(*HBARegisterForAdapterEventsFunc)
262 (void (*)(
void *, HBA_WWN, HBA_UINT32),
void *, HBA_HANDLE,
263 HBA_CALLBACKHANDLE *);
264 typedef HBA_STATUS(*HBARegisterForAdapterPortEventsFunc)
265 (void (*)(
void *, HBA_WWN, HBA_UINT32, HBA_UINT32),
void *, HBA_HANDLE,
266 HBA_WWN, HBA_CALLBACKHANDLE *);
267 typedef HBA_STATUS(*HBARegisterForAdapterPortStatEventsFunc)
268 (void (*)(
void *, HBA_WWN, HBA_UINT32),
void *, HBA_HANDLE, HBA_WWN,
269 HBA_PORTSTATISTICS, HBA_UINT32, HBA_CALLBACKHANDLE *);
270 typedef HBA_STATUS(*HBARegisterForTargetEventsFunc)
271 (void (*)(
void *, HBA_WWN, HBA_WWN, HBA_UINT32),
void *, HBA_HANDLE,
272 HBA_WWN, HBA_WWN, HBA_CALLBACKHANDLE *, HBA_UINT32);
273 typedef HBA_STATUS(*HBARegisterForLinkEventsFunc)
274 (void (*)(
void *, HBA_WWN, HBA_UINT32,
void *, HBA_UINT32),
void *,
275 void *, HBA_UINT32, HBA_HANDLE, HBA_CALLBACKHANDLE *);
276 typedef HBA_STATUS(*HBARemoveCallbackFunc)(HBA_CALLBACKHANDLE);
280 typedef struct HBA_EntryPoints {
281 HBAGetVersionFunc GetVersionHandler;
282 HBALoadLibraryFunc LoadLibraryHandler;
283 HBAFreeLibraryFunc FreeLibraryHandler;
284 HBAGetNumberOfAdaptersFunc GetNumberOfAdaptersHandler;
285 HBAGetAdapterNameFunc GetAdapterNameHandler;
286 HBAOpenAdapterFunc OpenAdapterHandler;
287 HBACloseAdapterFunc CloseAdapterHandler;
288 HBAGetAdapterAttributesFunc GetAdapterAttributesHandler;
289 HBAGetAdapterPortAttributesFunc GetAdapterPortAttributesHandler;
290 HBAGetPortStatisticsFunc GetPortStatisticsHandler;
291 HBAGetDiscoveredPortAttributesFunc
292 GetDiscoveredPortAttributesHandler;
293 HBAGetPortAttributesByWWNFunc GetPortAttributesByWWNHandler;
294 HBASendCTPassThruFunc SendCTPassThruHandler;
295 HBARefreshInformationFunc RefreshInformationHandler;
296 HBAResetStatisticsFunc ResetStatisticsHandler;
297 HBAGetFcpTargetMappingFunc GetFcpTargetMappingHandler;
298 HBAGetFcpPersistentBindingFunc GetFcpPersistentBindingHandler;
299 HBAGetEventBufferFunc GetEventBufferHandler;
300 HBASetRNIDMgmtInfoFunc SetRNIDMgmtInfoHandler;
301 HBAGetRNIDMgmtInfoFunc GetRNIDMgmtInfoHandler;
302 HBASendRNIDFunc SendRNIDHandler;
303 HBASendScsiInquiryFunc ScsiInquiryHandler;
304 HBASendReportLUNsFunc ReportLUNsHandler;
305 HBASendReadCapacityFunc ReadCapacityHandler;
308 HBA_STATUS HBA_RegisterLibrary(HBA_ENTRYPOINTS *);
310 typedef struct HBA_EntryPointsV2 {
311 HBAGetVersionFunc GetVersionHandler;
312 HBALoadLibraryFunc LoadLibraryHandler;
313 HBAFreeLibraryFunc FreeLibraryHandler;
314 HBAGetNumberOfAdaptersFunc GetNumberOfAdaptersHandler;
315 HBAGetAdapterNameFunc GetAdapterNameHandler;
316 HBAOpenAdapterFunc OpenAdapterHandler;
317 HBACloseAdapterFunc CloseAdapterHandler;
318 HBAGetAdapterAttributesFunc GetAdapterAttributesHandler;
319 HBAGetAdapterPortAttributesFunc GetAdapterPortAttributesHandler;
320 HBAGetPortStatisticsFunc GetPortStatisticsHandler;
321 HBAGetDiscoveredPortAttributesFunc
322 GetDiscoveredPortAttributesHandler;
323 HBAGetPortAttributesByWWNFunc GetPortAttributesByWWNHandler;
324 HBASendCTPassThruFunc SendCTPassThruHandler;
325 HBARefreshInformationFunc RefreshInformationHandler;
326 HBAResetStatisticsFunc ResetStatisticsHandler;
327 HBAGetFcpTargetMappingFunc GetFcpTargetMappingHandler;
328 HBAGetFcpPersistentBindingFunc GetFcpPersistentBindingHandler;
329 HBAGetEventBufferFunc GetEventBufferHandler;
330 HBASetRNIDMgmtInfoFunc SetRNIDMgmtInfoHandler;
331 HBAGetRNIDMgmtInfoFunc GetRNIDMgmtInfoHandler;
332 HBASendRNIDFunc SendRNIDHandler;
333 HBASendScsiInquiryFunc ScsiInquiryHandler;
334 HBASendReportLUNsFunc ReportLUNsHandler;
335 HBASendReadCapacityFunc ReadCapacityHandler;
336 HBAOpenAdapterByWWNFunc OpenAdapterByWWNHandler;
337 HBAGetFcpTargetMappingV2Func GetFcpTargetMappingV2Handler;
338 HBASendCTPassThruV2Func SendCTPassThruV2Handler;
339 HBARefreshAdapterConfigurationFunc RefreshAdapterConfigurationHandler;
340 HBAGetBindingCapabilityFunc GetBindingCapabilityHandler;
341 HBAGetBindingSupportFunc GetBindingSupportHandler;
342 HBASetBindingSupportFunc SetBindingSupportHandler;
343 HBASetPersistentBindingV2Func SetPersistentBindingV2Handler;
344 HBAGetPersistentBindingV2Func GetPersistentBindingV2Handler;
345 HBARemovePersistentBindingFunc RemovePersistentBindingHandler;
346 HBARemoveAllPersistentBindingsFunc
347 RemoveAllPersistentBindingsHandler;
348 HBASendRNIDV2Func SendRNIDV2Handler;
349 HBAScsiInquiryV2Func ScsiInquiryV2Handler;
350 HBAScsiReportLUNsV2Func ScsiReportLUNsV2Handler;
351 HBAScsiReadCapacityV2Func ScsiReadCapacityV2Handler;
352 HBAGetVendorLibraryAttributesFunc
353 GetVendorLibraryAttributesHandler;
354 HBARemoveCallbackFunc RemoveCallbackHandler;
355 HBARegisterForAdapterAddEventsFunc
356 RegisterForAdapterAddEventsHandler;
357 HBARegisterForAdapterEventsFunc RegisterForAdapterEventsHandler;
358 HBARegisterForAdapterPortEventsFunc
359 RegisterForAdapterPortEventsHandler;
360 HBARegisterForAdapterPortStatEventsFunc
361 RegisterForAdapterPortStatEventsHandler;
362 HBARegisterForTargetEventsFunc RegisterForTargetEventsHandler;
363 HBARegisterForLinkEventsFunc RegisterForLinkEventsHandler;
364 HBASendRPLFunc SendRPLHandler;
365 HBASendRPSFunc SendRPSHandler;
366 HBASendSRLFunc SendSRLHandler;
367 HBASendLIRRFunc SendLIRRHandler;
368 HBAGetFC4StatisticsFunc GetFC4StatisticsHandler;
369 HBAGetFCPStatisticsFunc GetFCPStatisticsHandler;
370 HBASendRLSFunc SendRLSHandler;
373 HBA_STATUS HBA_RegisterLibraryV2(HBA_ENTRYPOINTSV2 *);
378 #define HBAAPI_LIBRARY_VERSION 2 382 #define HBAAPI_LIBRARY_FINAL 0 385 #define HBAAPI_LIBRARY_REVISION VERSION 388 #define VLIB_ENV_LOG_LEVEL "LIB_ZFCP_HBAAPI_LOG_LEVEL" 391 #define VLIB_ENV_LOG_FILE "LIB_ZFCP_HBAAPI_LOG_FILE" 394 #define VLIB_ADAPTERNAME_PREFIX "com.ibm-FICON-FCP-" 397 #define VLIB_ADAPTERNAME_LEN 256 400 #define VLIB_INVALID_HANDLE 0 403 #define REPORTLUNS_WLUN 0xc101000000000000 404 #define REPORTLUNS_WLUN_DEC 49409 406 typedef uint64_t devid_t;
407 typedef uint64_t wwn_t;
408 typedef uint32_t fc_id_t;
409 typedef uint64_t fcp_lun_t;
413 HBA_EVENTINFO hbaapi_event;
419 unsigned int slots_used;
433 unsigned int isInvalid:1;
444 unsigned int isInvalid:1;
463 char bus_dev_name[9];
466 char class_dev_name[9];
469 char sysfsPath[PATH_MAX];
475 unsigned int isInvalid:1;
485 unsigned int isLoaded:1;
486 unsigned int unloading:1;
487 unsigned int isValid:1;
515 const char *file,
int line,
532 strerror_r(errnum, buffer, 256));
538 #define VLIB_PERROR(errnum, fmt, args...) \ 539 vlib_print_error(errnum, __func__, __FILE__, __LINE__, fmt, ##args) 542 #define VLIB_LOG(fmt, args...) \ 543 vlib_print_error(0, __func__, __FILE__, __LINE__, fmt, ##args) 550 #ifdef HBAAPI_BACKTRACE 552 static inline void vlib_bt(
void)
555 void *array[BT_SIZE] = { 0 };
557 num = backtrace(array, BT_SIZE);
558 backtrace_symbols_fd(array, num, fileno(stderr));
571 #define VLIB_MUTEX_LOCK(mutex) \ 574 __ret = pthread_mutex_lock(mutex); \ 575 if (__ret == EDEADLK) { \ 576 VLIB_LOG("BUG: VLIB_MUTEX_LOCK: deadlock detected!\n"); \ 579 } else if (__ret == EINVAL) { \ 580 VLIB_LOG("BUG: VLIB_MUTEX_LOCK: mutex not properly " \ 594 #define VLIB_MUTEX_UNLOCK(mutex) \ 597 __ret = pthread_mutex_unlock(mutex); \ 598 if (__ret == EPERM) { \ 599 VLIB_LOG("BUG: VLIB_MUTEX_UNLOCK: thread does not own " \ 603 } else if (__ret == EINVAL) { \ 604 VLIB_LOG("BUG: VLIB_MUTEX_UNLOCK: " \ 605 "mutex not properly initialized\n"); \ 615 #include "vlib_sg_io.h" 616 #include "vlib_events.h" 617 #include "vlib_sfhelper.h" static void vlib_print_error(int errnum, const char *function, const char *file, int line, char *fmt,...)
This is a wrapper for the usage of strerror_r().
Definition: vlib.h:514
size_t allocated
total number of elements in the array
Definition: vlib.h:428
unsigned int target
SCSI id.
Definition: vlib.h:436
Event queue data structure used in the library.
Definition: vlib.h:418
Primary data structure used in the library.
Definition: vlib.h:484
wwn_t wwnn
WWNN of the port.
Definition: vlib.h:446
fc_id_t did
FC did of the port.
Definition: vlib.h:462
wwn_t wwpn
WWPN of the port.
Definition: vlib.h:445
FILE * errfp
file used for logging Default is stderr.
Definition: vlib.h:492
Configuration header file after configure script was run.
Auxiliary functions used in the library.
void * data
pointer to an array
Definition: vlib.h:426
pthread_t id
Pthread ID of event handling thread.
Definition: vlib.h:497
HBA_HANDLE handle
Handle for this adapter.
Definition: vlib.h:477
fc_id_t did
FC did of the port.
Definition: vlib.h:447
size_t used
number of used elements in the array
Definition: vlib.h:427
uint64_t fcLun
FCP LUN.
Definition: vlib.h:438
int loglevel
loglevel for library Default is 0 – no logging.
Definition: vlib.h:490
Event data structure used in the library.
Definition: vlib.h:412
wwn_t wwnn
WWN of adapter node.
Definition: vlib.h:459
wwn_t wwpn
WWN of adapter port.
Definition: vlib.h:460
unsigned int target
SCSI id.
Definition: vlib.h:453
pthread_mutex_t mutex
Protects this structure.
Definition: vlib.h:499
Block structure used to hold all needed data for growable arrays.
Definition: vlib.h:425
Identification of an adapter in the library.
Definition: vlib.h:457
unsigned int host
SCSI host.
Definition: vlib.h:434
All calls that need the sysfs.
Represenation of an adapter in the library.
Definition: vlib.h:474
unsigned int channel
SCSI channel.
Definition: vlib.h:452
unsigned int channel
SCSI channel.
Definition: vlib.h:435
devid_t devid
Unique id for adapter device.
Definition: vlib.h:458
unsigned int lun
SCSI LUN.
Definition: vlib.h:437
C header file descriping the HBA API.
unsigned int host
SCSI host.
Definition: vlib.h:451
#define vlib_bt()
Print a stack backtrace.
Definition: vlib.h:561
Representation of a FC port in the library.
Definition: vlib.h:443
Represenation of an FCP unit in the library.
Definition: vlib.h:432
unsigned short host
SCSI host id of this adapter.
Definition: vlib.h:461