00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _VLIB_H_
00021 #define _VLIB_H_
00022
00126 #include "config.h"
00127
00129 #define _GNU_SOURCE
00130
00131 #include <execinfo.h>
00132 #include <stdlib.h>
00133 #include <string.h>
00134 #include <stdarg.h>
00135 #include <unistd.h>
00136 #include <stdio.h>
00137 #include <sys/types.h>
00138 #include <sys/stat.h>
00139 #include <sys/ioctl.h>
00140 #include <sys/time.h>
00141 #include <fcntl.h>
00142 #include <signal.h>
00143 #include <errno.h>
00144 #include <pthread.h>
00145 #include <signal.h>
00146 #include <time.h>
00147 #include <stdint.h>
00148 #include <dirent.h>
00149
00150 #include <hbaapi.h>
00151
00152
00153 #ifdef HBAAPI_VENDOR_LIB
00154
00155
00156
00157
00158
00159 typedef HBA_UINT32(*HBAGetVersionFunc)(void);
00160 typedef HBA_STATUS(*HBALoadLibraryFunc)(void);
00161 typedef HBA_STATUS(*HBAFreeLibraryFunc)(void);
00162 typedef HBA_UINT32(*HBAGetVendorLibraryAttributesFunc)(HBA_LIBRARYATTRIBUTES *);
00163 typedef HBA_UINT32(*HBAGetNumberOfAdaptersFunc)(void);
00164 typedef void(*HBARefreshInformationFunc)(HBA_HANDLE);
00165 typedef void(*HBARefreshAdapterConfigurationFunc)(void);
00166 typedef void(*HBAResetStatisticsFunc)(HBA_HANDLE, HBA_UINT32);
00167
00168
00169 typedef HBA_STATUS(*HBAGetAdapterNameFunc)(HBA_UINT32, char *);
00170 typedef HBA_HANDLE(*HBAOpenAdapterFunc)(char *);
00171 typedef HBA_STATUS(*HBAOpenAdapterByWWNFunc)(HBA_HANDLE *, HBA_WWN);
00172 typedef void(*HBACloseAdapterFunc)(HBA_HANDLE);
00173 typedef HBA_STATUS(*HBAGetAdapterAttributesFunc)
00174 (HBA_HANDLE, HBA_ADAPTERATTRIBUTES *);
00175 typedef HBA_STATUS(*HBAGetAdapterPortAttributesFunc)
00176 (HBA_HANDLE, HBA_UINT32, HBA_PORTATTRIBUTES *);
00177 typedef HBA_STATUS(*HBAGetDiscoveredPortAttributesFunc)
00178 (HBA_HANDLE, HBA_UINT32, HBA_UINT32, HBA_PORTATTRIBUTES *);
00179 typedef HBA_STATUS(*HBAGetPortAttributesByWWNFunc)
00180 (HBA_HANDLE, HBA_WWN, HBA_PORTATTRIBUTES *);
00181 typedef HBA_STATUS(*HBAGetPortStatisticsFunc)
00182 (HBA_HANDLE, HBA_UINT32, HBA_PORTSTATISTICS *);
00183 typedef HBA_STATUS(*HBAGetFC4StatisticsFunc)
00184 (HBA_HANDLE, HBA_WWN, HBA_UINT8, HBA_FC4STATISTICS *);
00185
00186
00187 typedef HBA_STATUS(*HBAGetBindingCapabilityFunc)
00188 (HBA_HANDLE, HBA_WWN, HBA_BIND_CAPABILITY *);
00189 typedef HBA_STATUS(*HBAGetBindingSupportFunc)
00190 (HBA_HANDLE, HBA_WWN, HBA_BIND_CAPABILITY *);
00191 typedef HBA_STATUS(*HBASetBindingSupportFunc)
00192 (HBA_HANDLE, HBA_WWN, HBA_BIND_CAPABILITY);
00193 typedef HBA_STATUS(*HBAGetFcpTargetMappingFunc)
00194 (HBA_HANDLE, HBA_FCPTARGETMAPPING *);
00195 typedef HBA_STATUS(*HBAGetFcpTargetMappingV2Func)
00196 (HBA_HANDLE, HBA_WWN, HBA_FCPTARGETMAPPINGV2 *);
00197 typedef HBA_STATUS(*HBAGetFcpPersistentBindingFunc)
00198 (HBA_HANDLE, HBA_FCPBINDING *);
00199 typedef HBA_STATUS(*HBAGetPersistentBindingV2Func)
00200 (HBA_HANDLE, HBA_WWN, HBA_FCPBINDING2 *);
00201 typedef HBA_STATUS(*HBASetPersistentBindingV2Func)
00202 (HBA_HANDLE, HBA_WWN, HBA_FCPBINDING2 *);
00203 typedef HBA_STATUS(*HBARemovePersistentBindingFunc)
00204 (HBA_HANDLE, HBA_WWN, HBA_FCPBINDING2 *);
00205 typedef HBA_STATUS(*HBARemoveAllPersistentBindingsFunc)(HBA_HANDLE, HBA_WWN);
00206 typedef HBA_STATUS(*HBAGetFCPStatisticsFunc)
00207 (HBA_HANDLE, const HBA_SCSIID *, HBA_FC4STATISTICS *);
00208
00209
00210 typedef HBA_STATUS(*HBASendScsiInquiryFunc)
00211 (HBA_HANDLE, HBA_WWN, HBA_UINT64, HBA_UINT8, HBA_UINT32, void *,
00212 HBA_UINT32, void *, HBA_UINT32);
00213 typedef HBA_STATUS(*HBAScsiInquiryV2Func)
00214 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT64, HBA_UINT8, HBA_UINT8, void *,
00215 HBA_UINT32 *, HBA_UINT8 *, void *, HBA_UINT32 *);
00216 typedef HBA_STATUS(*HBASendReportLUNsFunc)
00217 (HBA_HANDLE, HBA_WWN, void *, HBA_UINT32, void *, HBA_UINT32);
00218 typedef HBA_STATUS(*HBAScsiReportLUNsV2Func)
00219 (HBA_HANDLE, HBA_WWN, HBA_WWN, void *, HBA_UINT32 *, HBA_UINT8 *, void *,
00220 HBA_UINT32 *);
00221 typedef HBA_STATUS(*HBASendReadCapacityFunc)
00222 (HBA_HANDLE, HBA_WWN, HBA_UINT64, void *, HBA_UINT32, void *, HBA_UINT32);
00223 typedef HBA_STATUS(*HBAScsiReadCapacityV2Func)
00224 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT64, void *, HBA_UINT32 *,
00225 HBA_UINT8 *, void *, HBA_UINT32 *);
00226
00227
00228 typedef HBA_STATUS(*HBASendCTPassThruFunc)
00229 (HBA_HANDLE, void *, HBA_UINT32, void *, HBA_UINT32);
00230 typedef HBA_STATUS(*HBASendCTPassThruV2Func)
00231 (HBA_HANDLE, HBA_WWN, void *, HBA_UINT32, void *, HBA_UINT32 *);
00232 typedef HBA_STATUS(*HBASetRNIDMgmtInfoFunc)(HBA_HANDLE, HBA_MGMTINFO *);
00233 typedef HBA_STATUS(*HBAGetRNIDMgmtInfoFunc)(HBA_HANDLE, HBA_MGMTINFO *);
00234 typedef HBA_STATUS(*HBASendRNIDFunc)
00235 (HBA_HANDLE, HBA_WWN, HBA_WWNTYPE, void *, HBA_UINT32 *);
00236 typedef HBA_STATUS(*HBASendRNIDV2Func)
00237 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT32, HBA_UINT32, void *,
00238 HBA_UINT32 *);
00239 typedef HBA_STATUS(*HBASendRPLFunc)
00240 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT32, HBA_UINT32, void *,
00241 HBA_UINT32 *);
00242 typedef HBA_STATUS(*HBASendRPSFunc)
00243 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT32, HBA_WWN, HBA_UINT32, void *,
00244 HBA_UINT32 *);
00245 typedef HBA_STATUS(*HBASendSRLFunc)
00246 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT32, void *, HBA_UINT32 *);
00247 typedef HBA_STATUS(*HBASendLIRRFunc)
00248 (HBA_HANDLE, HBA_WWN, HBA_WWN, HBA_UINT8, HBA_UINT8, void *, HBA_UINT32 *);
00249 typedef HBA_STATUS(*HBASendRLSFunc)
00250 (HBA_HANDLE, HBA_WWN, HBA_WWN, void *, HBA_UINT32 *);
00251
00252
00253 typedef HBA_STATUS(*HBAGetEventBufferFunc)
00254 (HBA_HANDLE, HBA_EVENTINFO *, HBA_UINT32 *);
00255 typedef HBA_STATUS(*HBARegisterForAdapterAddEventsFunc)
00256 (void (*)(void *, HBA_WWN, HBA_UINT32), void *, HBA_CALLBACKHANDLE *);
00257 typedef HBA_STATUS(*HBARegisterForAdapterEventsFunc)
00258 (void (*)(void *, HBA_WWN, HBA_UINT32), void *, HBA_HANDLE,
00259 HBA_CALLBACKHANDLE *);
00260 typedef HBA_STATUS(*HBARegisterForAdapterPortEventsFunc)
00261 (void (*)(void *, HBA_WWN, HBA_UINT32, HBA_UINT32), void *, HBA_HANDLE,
00262 HBA_WWN, HBA_CALLBACKHANDLE *);
00263 typedef HBA_STATUS(*HBARegisterForAdapterPortStatEventsFunc)
00264 (void (*)(void *, HBA_WWN, HBA_UINT32), void *, HBA_HANDLE, HBA_WWN,
00265 HBA_PORTSTATISTICS, HBA_UINT32, HBA_CALLBACKHANDLE *);
00266 typedef HBA_STATUS(*HBARegisterForTargetEventsFunc)
00267 (void (*)(void *, HBA_WWN, HBA_WWN, HBA_UINT32), void *, HBA_HANDLE,
00268 HBA_WWN, HBA_WWN, HBA_CALLBACKHANDLE *, HBA_UINT32);
00269 typedef HBA_STATUS(*HBARegisterForLinkEventsFunc)
00270 (void (*)(void *, HBA_WWN, HBA_UINT32, void *, HBA_UINT32), void *,
00271 void *, HBA_UINT32, HBA_HANDLE, HBA_CALLBACKHANDLE *);
00272 typedef HBA_STATUS(*HBARemoveCallbackFunc)(HBA_CALLBACKHANDLE);
00273
00274
00275
00276 typedef struct HBA_EntryPoints {
00277 HBAGetVersionFunc GetVersionHandler;
00278 HBALoadLibraryFunc LoadLibraryHandler;
00279 HBAFreeLibraryFunc FreeLibraryHandler;
00280 HBAGetNumberOfAdaptersFunc GetNumberOfAdaptersHandler;
00281 HBAGetAdapterNameFunc GetAdapterNameHandler;
00282 HBAOpenAdapterFunc OpenAdapterHandler;
00283 HBACloseAdapterFunc CloseAdapterHandler;
00284 HBAGetAdapterAttributesFunc GetAdapterAttributesHandler;
00285 HBAGetAdapterPortAttributesFunc GetAdapterPortAttributesHandler;
00286 HBAGetPortStatisticsFunc GetPortStatisticsHandler;
00287 HBAGetDiscoveredPortAttributesFunc
00288 GetDiscoveredPortAttributesHandler;
00289 HBAGetPortAttributesByWWNFunc GetPortAttributesByWWNHandler;
00290 HBASendCTPassThruFunc SendCTPassThruHandler;
00291 HBARefreshInformationFunc RefreshInformationHandler;
00292 HBAResetStatisticsFunc ResetStatisticsHandler;
00293 HBAGetFcpTargetMappingFunc GetFcpTargetMappingHandler;
00294 HBAGetFcpPersistentBindingFunc GetFcpPersistentBindingHandler;
00295 HBAGetEventBufferFunc GetEventBufferHandler;
00296 HBASetRNIDMgmtInfoFunc SetRNIDMgmtInfoHandler;
00297 HBAGetRNIDMgmtInfoFunc GetRNIDMgmtInfoHandler;
00298 HBASendRNIDFunc SendRNIDHandler;
00299 HBASendScsiInquiryFunc ScsiInquiryHandler;
00300 HBASendReportLUNsFunc ReportLUNsHandler;
00301 HBASendReadCapacityFunc ReadCapacityHandler;
00302 } HBA_ENTRYPOINTS;
00303
00304 HBA_STATUS HBA_RegisterLibrary(HBA_ENTRYPOINTS *);
00305
00306 typedef struct HBA_EntryPointsV2 {
00307 HBAGetVersionFunc GetVersionHandler;
00308 HBALoadLibraryFunc LoadLibraryHandler;
00309 HBAFreeLibraryFunc FreeLibraryHandler;
00310 HBAGetNumberOfAdaptersFunc GetNumberOfAdaptersHandler;
00311 HBAGetAdapterNameFunc GetAdapterNameHandler;
00312 HBAOpenAdapterFunc OpenAdapterHandler;
00313 HBACloseAdapterFunc CloseAdapterHandler;
00314 HBAGetAdapterAttributesFunc GetAdapterAttributesHandler;
00315 HBAGetAdapterPortAttributesFunc GetAdapterPortAttributesHandler;
00316 HBAGetPortStatisticsFunc GetPortStatisticsHandler;
00317 HBAGetDiscoveredPortAttributesFunc
00318 GetDiscoveredPortAttributesHandler;
00319 HBAGetPortAttributesByWWNFunc GetPortAttributesByWWNHandler;
00320 HBASendCTPassThruFunc SendCTPassThruHandler;
00321 HBARefreshInformationFunc RefreshInformationHandler;
00322 HBAResetStatisticsFunc ResetStatisticsHandler;
00323 HBAGetFcpTargetMappingFunc GetFcpTargetMappingHandler;
00324 HBAGetFcpPersistentBindingFunc GetFcpPersistentBindingHandler;
00325 HBAGetEventBufferFunc GetEventBufferHandler;
00326 HBASetRNIDMgmtInfoFunc SetRNIDMgmtInfoHandler;
00327 HBAGetRNIDMgmtInfoFunc GetRNIDMgmtInfoHandler;
00328 HBASendRNIDFunc SendRNIDHandler;
00329 HBASendScsiInquiryFunc ScsiInquiryHandler;
00330 HBASendReportLUNsFunc ReportLUNsHandler;
00331 HBASendReadCapacityFunc ReadCapacityHandler;
00332 HBAOpenAdapterByWWNFunc OpenAdapterByWWNHandler;
00333 HBAGetFcpTargetMappingV2Func GetFcpTargetMappingV2Handler;
00334 HBASendCTPassThruV2Func SendCTPassThruV2Handler;
00335 HBARefreshAdapterConfigurationFunc RefreshAdapterConfigurationHandler;
00336 HBAGetBindingCapabilityFunc GetBindingCapabilityHandler;
00337 HBAGetBindingSupportFunc GetBindingSupportHandler;
00338 HBASetBindingSupportFunc SetBindingSupportHandler;
00339 HBASetPersistentBindingV2Func SetPersistentBindingV2Handler;
00340 HBAGetPersistentBindingV2Func GetPersistentBindingV2Handler;
00341 HBARemovePersistentBindingFunc RemovePersistentBindingHandler;
00342 HBARemoveAllPersistentBindingsFunc
00343 RemoveAllPersistentBindingsHandler;
00344 HBASendRNIDV2Func SendRNIDV2Handler;
00345 HBAScsiInquiryV2Func ScsiInquiryV2Handler;
00346 HBAScsiReportLUNsV2Func ScsiReportLUNsV2Handler;
00347 HBAScsiReadCapacityV2Func ScsiReadCapacityV2Handler;
00348 HBAGetVendorLibraryAttributesFunc
00349 GetVendorLibraryAttributesHandler;
00350 HBARemoveCallbackFunc RemoveCallbackHandler;
00351 HBARegisterForAdapterAddEventsFunc
00352 RegisterForAdapterAddEventsHandler;
00353 HBARegisterForAdapterEventsFunc RegisterForAdapterEventsHandler;
00354 HBARegisterForAdapterPortEventsFunc
00355 RegisterForAdapterPortEventsHandler;
00356 HBARegisterForAdapterPortStatEventsFunc
00357 RegisterForAdapterPortStatEventsHandler;
00358 HBARegisterForTargetEventsFunc RegisterForTargetEventsHandler;
00359 HBARegisterForLinkEventsFunc RegisterForLinkEventsHandler;
00360 HBASendRPLFunc SendRPLHandler;
00361 HBASendRPSFunc SendRPSHandler;
00362 HBASendSRLFunc SendSRLHandler;
00363 HBASendLIRRFunc SendLIRRHandler;
00364 HBAGetFC4StatisticsFunc GetFC4StatisticsHandler;
00365 HBAGetFCPStatisticsFunc GetFCPStatisticsHandler;
00366 HBASendRLSFunc SendRLSHandler;
00367 } HBA_ENTRYPOINTSV2;
00368
00369 HBA_STATUS HBA_RegisterLibraryV2(HBA_ENTRYPOINTSV2 *);
00370
00371 #endif
00372
00374 #define HBAAPI_LIBRARY_VERSION 2
00375
00378 #define HBAAPI_LIBRARY_FINAL 0
00379
00381 #define HBAAPI_LIBRARY_REVISION VERSION
00382
00384 #define VLIB_ENV_LOG_LEVEL "LIB_ZFCP_HBAAPI_LOG_LEVEL"
00385
00387 #define VLIB_ENV_LOG_FILE "LIB_ZFCP_HBAAPI_LOG_FILE"
00388
00390 #define VLIB_ADAPTERNAME_PREFIX "com.ibm-FICON-FCP-"
00391
00393 #define VLIB_ADAPTERNAME_LEN 256
00394
00396 #define VLIB_INVALID_HANDLE 0
00397
00399 #define REPORTLUNS_WLUN 0xc101000000000000
00400 #define REPORTLUNS_WLUN_DEC 49409
00401
00402 typedef uint64_t devid_t;
00403 typedef uint64_t wwn_t;
00404 typedef uint32_t fc_id_t;
00405 typedef uint64_t fcp_lun_t;
00406
00408 struct block
00409 {
00410 void *data;
00411 size_t used;
00412 size_t allocated;
00413 };
00414
00416 struct vlib_unit
00417 {
00418 unsigned int isInvalid:1;
00419 unsigned int host;
00420 unsigned int channel;
00421 unsigned int target;
00422 unsigned int lun;
00423 uint64_t fcLun;
00424 char sg_dev[16];
00425 };
00426
00428 struct vlib_port
00429 {
00430 unsigned int isInvalid:1;
00431 wwn_t wwpn;
00432 wwn_t wwnn;
00433 fc_id_t did;
00434 struct block units;
00435 char name[32];
00437 unsigned int host;
00438 unsigned int channel;
00439 unsigned int target;
00440 };
00441
00443 struct vlib_adapter_ident
00444 {
00445 devid_t devid;
00446 wwn_t wwnn;
00447 wwn_t wwpn;
00448 unsigned short host;
00449 char bus_dev_name[9];
00452 char class_dev_name[9];
00455 };
00456
00458 struct vlib_adapter
00459 {
00460 unsigned int isInvalid:1;
00461 struct vlib_adapter_ident ident;
00462 HBA_HANDLE handle;
00463 struct block ports;
00464 };
00465
00467 struct vlib_data
00468 {
00469 unsigned int isLoaded:1;
00470 unsigned int unloading:1;
00471 unsigned int isValid:1;
00474 int loglevel;
00476 FILE *errfp;
00478 struct block adapters;
00481 pthread_mutex_t mutex;
00482 };
00483
00493 extern struct vlib_data vlib_data;
00494
00496 static inline void vlib_print_error(int errnum, const char * function,
00497 const char * file, int line,
00498 char * fmt, ...)
00499 {
00500 char buffer[256];
00501 va_list ap;
00502
00503 if (0 == vlib_data.loglevel) {
00504 return;
00505 }
00506
00507 fprintf(vlib_data.errfp, "(%s:%d)%s: ", file, line, function);
00508
00509 va_start(ap, fmt);
00510 vfprintf(vlib_data.errfp, fmt, ap);
00511 va_end(ap);
00512
00513 if (errnum != 0) {
00514 fprintf(vlib_data.errfp, ": %s\n",
00515 strerror_r(errnum, buffer, 256));
00516 }
00517 }
00518
00521 #define VLIB_PERROR(errnum, fmt, args...) \
00522 vlib_print_error(errnum, __FUNCTION__, __FILE__, __LINE__, fmt, ##args)
00523
00525 #define VLIB_LOG(fmt, args...) \
00526 vlib_print_error(0, __FUNCTION__, __FILE__, __LINE__, fmt, ##args)
00527
00533 #ifdef HBAAPI_BACKTRACE
00534 #define BT_SIZE 50
00535 static inline void vlib_bt(void)
00536 {
00537 int num;
00538 void *array[BT_SIZE] = { 0 };
00539
00540 num = backtrace(array, BT_SIZE);
00541 backtrace_symbols_fd(array, num, fileno(stderr));
00542 }
00543 #else
00544 #define vlib_bt()
00545 #endif
00546
00554 #define VLIB_MUTEX_LOCK(mutex) \
00555 do{ \
00556 int __ret; \
00557 if (((__ret = pthread_mutex_lock(mutex)) == EDEADLK)){ \
00558 VLIB_LOG("BUG: VLIB_MUTEX_LOCK: deadlock detected!\n"); \
00559 vlib_bt(); \
00560 exit(1); \
00561 } else if (__ret == EINVAL){ \
00562 VLIB_LOG("BUG: VLIB_MUTEX_LOCK: mutex not properly " \
00563 "initialized\n"); \
00564 vlib_bt(); \
00565 exit(1); \
00566 } \
00567 } while(0)
00568
00576 #define VLIB_MUTEX_UNLOCK(mutex) \
00577 do{ \
00578 int __ret; \
00579 if (((__ret = pthread_mutex_unlock(mutex)) == EPERM)){ \
00580 VLIB_LOG("BUG: VLIB_MUTEX_UNLOCK: thread does not own " \
00581 "mutex!\n"); \
00582 vlib_bt(); \
00583 exit(1); \
00584 } else if (__ret == EINVAL){ \
00585 VLIB_LOG("BUG: VLIB_MUTEX_UNLOCK: " \
00586 "mutex not properly initialized\n"); \
00587 vlib_bt(); \
00588 exit(1); \
00589 } \
00590 } while(0)
00591
00592
00593 #include "vlib_aux.h"
00594 #include "vlib_sysfs.h"
00595 #include "vlib_sg.h"
00596
00597 #endif