254 lines
7.8 KiB
C
254 lines
7.8 KiB
C
/* **********************************************************
|
|
* Copyright 2008 - 2009 VMware, Inc. All rights reserved.
|
|
* **********************************************************/
|
|
|
|
/*
|
|
* @VMKAPIMOD_LICENSE@
|
|
*/
|
|
|
|
/*
|
|
* vmkapi_npiv.h --
|
|
*
|
|
* Defines some of the vmkernel specific VPORT types used to interact with
|
|
* NPIV VPORT aware drivers.
|
|
* Version 1 - ESX 3.5
|
|
* Version 2 - ESX 4.0
|
|
*/
|
|
|
|
#ifndef _VMKAPI_NPIV_H_
|
|
#define _VMKAPI_NPIV_H_
|
|
|
|
/** \cond never */
|
|
#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H
|
|
#error This vmkapi file should never be included directly but only via vmkapi.h
|
|
#endif
|
|
/** \endcond never */
|
|
|
|
#include "base/vmkapi_types.h"
|
|
#include "npiv/vmkapi_npiv_wwn.h"
|
|
|
|
/*
|
|
* Definitions
|
|
*/
|
|
|
|
/**
|
|
* \brief VPORT API version values
|
|
*/
|
|
#define VMK_VPORT_API_VERSION 0x00000002 // ESX 4.0 (Latest)
|
|
#define VMK_VPORT_API_VERSION_35 0x00000001 // ESX 3.5
|
|
|
|
/**
|
|
* \brief VPORT API vport specific error codes returned by the fc driver
|
|
*
|
|
* Any of the VPORT API commands can return these errors
|
|
*/
|
|
#define VMK_VPORT_OK 0 /* command completed OK */
|
|
#define VMK_VPORT_ERROR (-1) /* general vport error */
|
|
#define VMK_VPORT_INVAL (-2) /* invalid value passed */
|
|
#define VMK_VPORT_NOMEM (-3) /* no memory available for command */
|
|
#define VMK_VPORT_NORESOURCES (-4) /* no vport resources */
|
|
#define VMK_VPORT_PARAMETER_ERR (-5) /* wrong parameter passed */
|
|
|
|
/**
|
|
* \brief VPORT API default invalid count value
|
|
*/
|
|
#define VMK_VPORT_CNT_INVALID 0xFFFFFFFF
|
|
|
|
/**
|
|
* \brief VPORT API autoretry flag
|
|
*/
|
|
#define VMK_VPORT_OPT_AUTORETRY 0x01
|
|
|
|
/**
|
|
* \brief VPORT API Symbolic (VM) name - NULL terminated string associated with a vport
|
|
*
|
|
* This name will be used at the time of creating a Vport at fc driver. This is
|
|
* an array of 128 bytes (max 128, so the max name length is 127 bytes + 1 NULL).
|
|
*/
|
|
#define VMK_VPORT_VM_NAME_LENGTH 128
|
|
|
|
/**
|
|
* \brief VPORT API future VSAN API use
|
|
*/
|
|
#define VMK_VPORT_VF_ID_UNDEFINED 0xFFFFFFFF
|
|
#define VMK_VPORT_FABRIC_NAME_LENGTH 8
|
|
|
|
/**
|
|
* \brief VPORT API bit masks for active FC4 roles
|
|
*/
|
|
#define VMK_VPORT_ROLE_FCP_INITIATOR 0x01
|
|
#define VMK_VPORT_ROLE_FCP_TARGET 0x02
|
|
#define VMK_VPORT_ROLE_IP_OVER_FC 0x04
|
|
|
|
/*
|
|
* Data structures
|
|
*/
|
|
|
|
/**
|
|
* \brief VPORT API commands
|
|
*
|
|
* These are the commands that are allowed via the NPIV API entry point
|
|
*/
|
|
typedef enum {
|
|
VMK_VPORT_CREATE = 1, /* Create a vport */
|
|
VMK_VPORT_DELETE = 2, /* Delete a vport */
|
|
VMK_VPORT_INFO = 3, /* Get vport info from phys hba */
|
|
VMK_VPORT_TGT_REMOVE = 4, /* Target Remove (not used) */
|
|
VMK_VPORT_SUSPEND = 5 /* suspend/resume vport */
|
|
} vmk_VportOpCmd;
|
|
|
|
/**
|
|
* \brief VPORT API link type
|
|
*
|
|
* Used by underlying transport to inform link type to scsi midlayer
|
|
*/
|
|
typedef enum {
|
|
VMK_VPORT_TYPE_PHYSICAL = 0, /* physical FC-Port */
|
|
VMK_VPORT_TYPE_VIRTUAL /* Virtual Vport Port */
|
|
} vmk_VportLinkType;
|
|
|
|
|
|
/**
|
|
* \brief VPORT API port state
|
|
*/
|
|
typedef enum {
|
|
VMK_VPORT_STATE_OFFLINE = 0, /* vport is offline */
|
|
VMK_VPORT_STATE_ACTIVE, /* vport is active */
|
|
VMK_VPORT_STATE_FAILED /* vport is failed */
|
|
} vmk_VporState;
|
|
|
|
/**
|
|
* \brief VPORT API port specific fail reason
|
|
*/
|
|
typedef enum {
|
|
VMK_VPORT_FAIL_UNKNOWN = 0, /* vport fail unknown reason */
|
|
VMK_VPORT_FAIL_LINKDOWN, /* physical link is down */
|
|
VMK_VPORT_FAIL_FAB_UNSUPPORTED, /* san fabric does not support npiv */
|
|
VMK_VPORT_FAIL_FAB_NORESOURCES, /* not enough reasources in san fabric */
|
|
VMK_VPORT_FAIL_FAB_LOGOUT, /* san logged out the vport */
|
|
VMK_VPORT_FAIL_ADAP_NORESOURCES
|
|
} vmk_VportFailReason;
|
|
|
|
/**
|
|
* \brief VPORT API vport-type flag used by scsi midlayer
|
|
*
|
|
* Vport type flag passed using vmk_ScsiVportArgs.flags used scsi midlayer
|
|
* to inform vmkernel about the vport type backing a vmkernel adapter.
|
|
*/
|
|
typedef enum {
|
|
VMK_SCSI_VPORT_TYPE_LEGACY = 0x00000001, /* vport hba is legacy vport */
|
|
VMK_SCSI_VPORT_TYPE_FULLHBA = 0x00000002, /* vport hba has full HBA status */
|
|
VMK_SCSI_VPORT_TYPE_PASSTHRU = 0x00000004 /* vport hba is a passthru */
|
|
} vmk_ScsiVportTypeFlags;
|
|
|
|
/**
|
|
* \brief VPORT API Args list is used to pass arguments to lowlevel underlying
|
|
* transport layer and eventually to HBA driver through the NPIV API
|
|
*
|
|
* This Structure is used for all types of vport calls made from vmkernel
|
|
* to underlying transport layer.
|
|
*/
|
|
typedef struct vmk_ScsiVportArgs {
|
|
/** \brief Node World Wide Name */
|
|
vmk_VportWwn wwpn;
|
|
/** \brief Port World Wide Name */
|
|
vmk_VportWwn wwnn;
|
|
/** \brief Vport's ScsiHost pointer */
|
|
void *virthost;
|
|
/** \brief Reserved for arguments structure */
|
|
void *arg;
|
|
/** \brief Symbolic name, generally VM's name is used */
|
|
char *name;
|
|
/** \brief Vport's Scsi Adapter */
|
|
void *virtAdapter;
|
|
/** \brief Vport type flag, internal use only */
|
|
vmk_uint32 flags;
|
|
} vmk_ScsiVportArgs;
|
|
|
|
/**
|
|
* \brief VPORT API This Structure is used to get the NPIV specific information
|
|
* from physical host bus adapter.
|
|
*
|
|
* Info structure returned by the VMK_VPORT_INFO command made to the physical
|
|
* HBA adapter
|
|
*/
|
|
typedef struct vmk_VportInfo {
|
|
/** \brief Vport API version */
|
|
vmk_uint32 api_version;
|
|
/** \brief Vport link type */
|
|
vmk_VportLinkType linktype;
|
|
/** \brief State of vport support */
|
|
vmk_VporState state;
|
|
/** \brief reason for VportInfo failure */
|
|
vmk_VportFailReason fail_reason;
|
|
/** \brief previous reason for VportInfo failure */
|
|
vmk_VportFailReason prev_fail_reason;
|
|
/** \brief Node World Wide Name */
|
|
vmk_VportWwn node_name;
|
|
/** \brief Port World Wide Name */
|
|
vmk_VportWwn port_name;
|
|
|
|
/* Following values are valid only on physical ports */
|
|
/** \brief maximum number of vports supported by fc hba */
|
|
vmk_uint32 vports_max;
|
|
/** \brief number of vports that are in use on fc hba */
|
|
vmk_uint32 vports_inuse;
|
|
/** \brief maximum number of RPIs available in the fc FW */
|
|
vmk_uint32 rpi_max;
|
|
/** \brief number of RPIs currently in-use in the fc FW */
|
|
vmk_uint32 rpi_inuse;
|
|
|
|
/* QoS Values */
|
|
/** \brief QoS (Quality of Service) Priority */
|
|
vmk_uint8 QoSPriority;
|
|
/** \brief QoS (Quality of Service) Bandwidth percentage */
|
|
vmk_uint8 QosBandwith;
|
|
|
|
/** \brief Virtual SAN (VSAN) number */
|
|
vmk_int16 vsan_number;
|
|
/** \brief Virtual Fabric (VF) id number, undefined value is -1 */
|
|
vmk_int32 vf_id;
|
|
/** \brief Vport role id initiator/target etc */
|
|
vmk_int32 role_id;
|
|
} vmk_VportInfo;
|
|
|
|
/**
|
|
* \brief VPORT API This structure is to communicate with the host bus adapter
|
|
* driver at the time of vport create operation.
|
|
*
|
|
* On success, a new ScsiHost will be assigned to vport_shost for the newly
|
|
* created virtual port.
|
|
*/
|
|
struct vmk_VportData {
|
|
/** \brief Vport API version */
|
|
vmk_uint32 api_version;
|
|
/** \brief optional values */
|
|
vmk_uint32 options;
|
|
/** \brief Node World Wide Name */
|
|
vmk_VportWwn node_name;
|
|
/** \brief Port World Wide Name */
|
|
vmk_VportWwn port_name;
|
|
/** \brief Vport's ScsiHost pointer */
|
|
void *vport_shost;
|
|
|
|
/** \brief fabric name, zero's if direct connect/private loop */
|
|
vmk_uint8 fabric_name[VMK_VPORT_FABRIC_NAME_LENGTH];
|
|
|
|
/* QoS Values */
|
|
/** \brief QoS (Quality of Service) Priority */
|
|
vmk_uint8 QoSPriority;
|
|
/** \brief QoS (Quality of Service) Bandwidth percentage */
|
|
vmk_uint8 QosBandwith;
|
|
|
|
/** \brief Virtual SAN (VSAN) number */
|
|
vmk_int16 vsan_number;
|
|
/** \brief Virtual Fabric (VF) id number, undefined value is -1 */
|
|
vmk_int32 vf_id;
|
|
/** \brief Vport role id initiator/target etc */
|
|
vmk_int32 role_id;
|
|
|
|
/** \brief Symbolic name, generally VM's name is used */
|
|
vmk_int8 symname[VMK_VPORT_VM_NAME_LENGTH];
|
|
};
|
|
|
|
#endif /* _VMKAPI_NPIV_H_ */
|