/******************************************************************************
 *
 * Description
 *  mpapi.h - general header file for Multipath Management API Version 1.0
 *  client
 *
 * License:
 *  The contents of this file are subject to the SNIA Public License
 *  Version 1.1 (the "License"); you may not use this file except in
 *  compliance with the License. You may obtain a copy of the License at
 *
 *  http://mp-mgmt-api.sourceforge.net
 *
 *  Software distributed under the License is distributed on an "AS IS"
 *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 *  the License for the specific language governing rights and limitations
 *  under the License.
 *
 * The Original Code is  SNIA iSCSI Management API and Multipath Management API
 *	general header file
 *
 * The Initial Developer of the Original Code is:
 *	Benjamin F. Kuo Troika Networks, Inc. (benk@troikanetworks.com)
 *	David Dillard	VERITAS Software(david.dillard@veritas.com)
 *	Jeff Ding	Adaptec, Inc. (jding@corp.adaptec.com)
 *	Dave Wysochanski Network Appliance, Inc. (davidw@netapp.com)
 *      Hyon Kim       	Sun Microsystems(hyon.kim@sun.com)
 *
 * Contributor(s):
 *	Paul von Behren Sun Microsystems(paul.vonbehren@sun.com)
 *
 ******************************************************************************
 *
 *   Changes:
 *  1/15/2005   Implemented SNIA MP API specification 1.0
 *  10/11/2005 
 *		- Added the license location in the header comment.
 *	  	- Added an implementation note in constants and macros
 *		  declarations section.
 *		- Fixed field name value in struct _MP_PROPRIETARY_PROPERTY.
 *		- Fixed typo in logicalUnitGroupID in 
 *		  _MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES
 *		- Fixed typo in desiredState in struct _MP_TPG_STATE_PAIR.
 *		- Fixed typo in API name MP_GetTargetPortGroupProperties.
 *		- Clarified description of MP_STATUS_INVALID_PARAMETER error
 *		  in MP_GetObjectType().
 *		- Fixed typo in API name 
 *		  MP_GetProprietaryLoadBalanceProperties().
 *  3/6/2006 
 *		- mpapi.h header file is updated for 
 *		  MP_LOAD_BALANCE_TYPE change in the spec.
 *****************************************************************************/

#ifdef __cplusplus
extern "C" {
#endif


#ifndef MPAPI_H
#define MPAPI_H

#include <time.h>
#include <wchar.h>
#include <string.h>
#include <stdlib.h>


/* Library version string */
#define MP_LIBVERSION 1

/**
 *******************************************************************************
 *
 * Generic MP Constant Definitions
 *
 *******************************************************************************
 */
#define RL_LIBRARY_SEQNUM           0

/**
* Value which can be assigned to an MP_BOOL and or an MP_XBOOL.
*/
#define MP_TRUE        1

/**
* Value which can be assigned to an MP_BOOL and or an MP_XBOOL.
*/
#define MP_FALSE       0

/**
* Value which can be assigned to an MP_XBOOL.
*/
#define MP_UNKNOWN     0xFFFFFFFF


/**
 ******************************************************************************
 *
 * Base MP API Type Definitions
 *
 ******************************************************************************
 */

typedef unsigned char   MP_UINT8;  /* unsigned  8 bits */
typedef char            MP_INT8;   /* signed    8 bits */
typedef unsigned short  MP_UINT16; /* unsigned 16 bits */
typedef short           MP_INT16;  /* signed   16 bits */
typedef unsigned int    MP_UINT32; /* unsigned 32 bits */
typedef int             MP_INT32;  /* signed   32 bits */
typedef void*           MP_PVOID;  /* pointer  to void */
typedef MP_UINT32       MP_VOID32; /* opaque   32 bits */
typedef long long	MP_INT64;  /* signed   64 bits */
typedef unsigned long long	 MP_UINT64; /* unsigned 64 bits */

/**
 * A character.
 */
typedef char MP_CHAR;

/**
 * A wide character.
 */
typedef wchar_t MP_WCHAR;

/**
 * An unsigned character.
 */
typedef unsigned char MP_BYTE;

/**
 * A boolean.
 */
typedef MP_UINT32 MP_BOOL;

/**
 * An extended boolean: can have the values @ref MP_TRUE, @ref MP_FALSE, and
 * @ref MP_UNKNOWN.
 */
typedef MP_UINT32 MP_XBOOL;

/**
 ******************************************************************************
 *
 * Constants and macros declarations related to MP_STATUS
 * Implementation Notes:  This library does validation for OID argument and
 *			  returns the following errors.
 *
 *		1. MP_STATUS_INVALID_OBJECT_TYPE when input OID type is not
 *		   one of legitimate types defined SNIA Multipath Management 
 *		   Spec.
 *		2. MP_STATUS_INVALID_PARAMETER when input OID type is
 *		   legitimate but not a proper type for API.
 *		3. MP_STATUS_OBJECT_NOT_FOUND when the ownerId of input OID is
 *		   not found or no object instance with matching
 *		   sequenceNumber is found. 
 *		   The ownerId is validated by the common library and the 
 *		   sequence number is validated by the plugin library.
 *
 ******************************************************************************
 */
typedef enum {
    MP_STATUS_SUCCESS               = 0,
    MP_STATUS_INVALID_PARAMETER     = 1,
    MP_STATUS_UNKNOWN_FN	    = 2,
    MP_STATUS_FAILED                = 3,
    MP_STATUS_INSUFFICIENT_MEMORY   = 4,
    MP_STATUS_INVALID_OBJECT_TYPE   = 5,
    MP_STATUS_OBJECT_NOT_FOUND      = 6,
    MP_STATUS_UNSUPPORTED           = 7,
    MP_STATUS_FN_REPLACED           = 8,
    MP_STATUS_ACCESS_STATE_INVALID  = 9,
    MP_STATUS_INVALID_WEIGHT        = 10,
    MP_STATUS_PATH_NONOPERATIONAL   = 11,
    MP_STATUS_TRY_AGAIN		    = 12,
    MP_STATUS_NOT_PERMITTED	    = 13

} MP_STATUS;

/**
 ******************************************************************************
 *
 * Declaration of the MP_PATH_STATE constants
 *
 ******************************************************************************
 */
#define MP_PATH_STATE_OKAY	    0
#define MP_PATH_STATE_PATH_ERR      1
#define MP_PATH_STATE_LU_ERR        2
#define MP_PATH_STATE_RESERVED      3
#define MP_PATH_STATE_REMOVED       4
#define MP_PATH_STATE_TRANSITIONING 5
#define MP_PATH_STATE_OPERATIONAL_CLOSED    6
#define MP_PATH_STATE_INVALID_CLOSED	    7
#define MP_PATH_STATE_OFFLINE_CLOSED	    8
#define MP_PATH_STATE_UNKNOWN       	    9

typedef MP_UINT32 MP_PATH_STATE;

/**
 *******************************************************************************
 *
 * Declaration of the MP_OBJECT_TYPE constants
 *
 *******************************************************************************
 */
#define MP_OBJECT_TYPE_UNKNOWN              0
#define MP_OBJECT_TYPE_PLUGIN               1
#define MP_OBJECT_TYPE_INITIATOR_PORT       2
#define MP_OBJECT_TYPE_TARGET_PORT          3
#define MP_OBJECT_TYPE_MULTIPATH_LU         4
#define MP_OBJECT_TYPE_PATH_LU              5
#define MP_OBJECT_TYPE_DEVICE_PRODUCT       6
#define MP_OBJECT_TYPE_TARGET_PORT_GROUP    7
#define MP_OBJECT_TYPE_PROPRIETARY_LOAD_BALANCE	8

/* set to the highest constant of object type. */
#define MP_OBJECT_TYPE_MAX          8

typedef MP_UINT32 MP_OBJECT_TYPE;

/**
 *******************************************************************************
 *
 * Declaration of the MP_PORT_TRANSPORT_TYPE
 *
 *******************************************************************************
 */
#define MP_PORT_TRANSPORT_TYPE_UNKNOWN  0
#define MP_PORT_TRANSPORT_TYPE_MPNODE   1
#define MP_PORT_TRANSPORT_TYPE_FC       2
#define MP_PORT_TRANSPORT_TYPE_SPI      3
#define MP_PORT_TRANSPORT_TYPE_ISCSI    4
#define MP_PORT_TRANSPORT_TYPE_IFB      5

typedef MP_UINT32 MP_PORT_TRANSPORT_TYPE;

/**
 *******************************************************************************
 *
 * Declaration of the MP_ACCESS_STATE_TYPE constants
 *
 *******************************************************************************
 */
#define MP_ACCESS_STATE_ACTIVE_OPTIMIZED    (0x0)
#define MP_ACCESS_STATE_ACTIVE_NONOPTIMIZED (0x1)
#define MP_ACCESS_STATE_STANDBY             (0x2)
#define MP_ACCESS_STATE_UNAVAILABLE         (0x3)
#define MP_ACCESS_STATE_TRANSITIONING       (0xF)
#define MP_ACCESS_STATE_ACTIVE              (0x10)

typedef MP_UINT32 MP_ACCESS_STATE_TYPE;

/**
 *******************************************************************************
 *
 * Declaration of the MP_LOAD_BALANCE_TYPE constants
 *
 *******************************************************************************
 */
#define MP_LOAD_BALANCE_TYPE_UNKNOWN        (1<<0)
#define MP_LOAD_BALANCE_TYPE_ROUNDROBIN     (1<<1)
#define MP_LOAD_BALANCE_TYPE_LEASTBLOCKS    (1<<2)
#define MP_LOAD_BALANCE_TYPE_LEASTIO        (1<<3)
#define MP_LOAD_BALANCE_TYPE_DEVICE_PRODUCT (1<<4)
#define MP_LOAD_BALANCE_TYPE_LBA_REGION     (1<<5)
#define MP_LOAD_BALANCE_TYPE_FAILOVER_ONLY  (1<<6)
/**
 * Proprietary load balance type should start from 0x10000(1<<16) or greater.
 * It is exposed through API MP_GetProprietaryLoadBalanceProperties if exists.
 */

typedef MP_UINT32 MP_LOAD_BALANCE_TYPE;

/**
 *******************************************************************************
 *
 * Declaration of the MP_PROPRIETARY_PROPERTY
 *
 *******************************************************************************
 */
typedef struct _MP_PROPRIETARY_PROPERTY
{
    MP_WCHAR                name[16];
    MP_WCHAR                value[48];

} MP_PROPRIETARY_PROPERTY;

/**
 *******************************************************************************
 *
 * Declaration of the MP_PROPRIETARY_LOAD_BALANCE_PROPERTIES
 *
 *******************************************************************************
 */
typedef struct _MP_PROPRIETARY_LOAD_BALANCE_PROPERTIES
{
    MP_LOAD_BALANCE_TYPE    typeIndex;
    MP_WCHAR                name[256];
    MP_WCHAR                vendorName[256];
    MP_UINT32		    proprietaryPropertyCount;
    MP_PROPRIETARY_PROPERTY proprietaryProperties[8];

} MP_PROPRIETARY_LOAD_BALANCE_PROPERTIES;

/**
 *******************************************************************************
 *
 * Declaration of the MP_UINT32 MP_LOGICAL_UNIT_NAME_TYPE constants
 *
 *******************************************************************************
 */
#define MP_LU_NAME_TYPE_UNKNOWN         0
#define MP_LU_NAME_TYPE_VPD83_TYPE1     1
#define MP_LU_NAME_TYPE_VPD83_TYPE2     2
#define MP_LU_NAME_TYPE_VPD83_TYPE3     3
#define MP_LU_NAME_TYPE_DEVICE_SPECIFIC 4

typedef MP_UINT32 MP_LOGICAL_UNIT_NAME_TYPE;

/**
 *******************************************************************************
 *
 * Declaration of the MP_UINT32 MP_AUTOFAILBACK_SUPPORT constants
 *
 *******************************************************************************
 */
#define MP_AUTOFAILBACK_SUPPORT_NONE	0
#define MP_AUTOFAILBACK_SUPPORT_PLUGIN	1
#define MP_AUTOFAILBACK_SUPPORT_MPLU	2
#define MP_AUTOFAILBACK_SUPPORT_PLUGINANDMPLU	3

typedef MP_UINT32 MP_AUTOFAILBACK_SUPPORT;

/**
 *******************************************************************************
 *
 * Declaration of the MP_UINT32 MP_AUTOPROBING_SUPPORT constants
 *
 *******************************************************************************
 */
#define MP_AUTOPROBING_SUPPORT_NONE	0
#define MP_AUTOPROBING_SUPPORT_PLUGIN	1
#define MP_AUTORPOBING_SUPPORT_MPLU	2
#define MP_AUTORPOBING_SUPPORT_PLUGINANDMPLU	3

typedef MP_UINT32 MP_AUTOPROBING_SUPPORT;

/**
 *******************************************************************************
 *
 * Declaration of the MP_OID structure
 *
 * This structure should be treated as opaque by clients of the API.
 * Appropriate APIs should be used to extract information from the structure.
 *
 * Also ZERO_OID is defined for APIs that may handle multiple plugin OIDs.
 *
 *******************************************************************************
 */
typedef struct _MP_OID
{
    /**
     * The type of the object.  When an object ID is supplied as a parameter
     * to an API the library uses this value to insure that the supplied
     * object ID's type is appropriate for the API.
     */
    MP_OBJECT_TYPE objectType;

    /**
     * A value determined by the library which it uses to uniquely identify the
     * owner of an object.  The owner of an object is either the library itself
     * or a plugin.  When an object ID is supplied as a parameter to an API the
     * library uses this value to determine if it should handle the call itself
     * or direct the call to one or more plugins.
     */
    MP_UINT32      ownerId;

    /**
     * A value determined by a plugin which a plugin uses, perhaps in
     * combination with the object type, to uniquely identify one of its
     * objects.
     */
    MP_UINT64      objectSequenceNumber;

} MP_OID;

#define ZERO_OID ((const MP_OID){MP_OBJECT_TYPE_UNKNOWN,0,0}) 

/**
 *******************************************************************************
 *
 * Declaration of the MP_OID_LIST structure
 *
 * This structure is used by a number of APIs to return lists of objects.  Any
 * instance of this structure returned by an API must be freed by a client
 * using the MP_FreeOidList API.  Although oids is declared to be an
 * array of one
 * @ref MP_OID structure it can in fact contain any number of
 * @ref MP_OID structures.  The oidCount indicates the number of @ref MP_OID
 * structures in the oids array.
 *
 * @note The @a oids array is a variable length array, despite its declaration
 *       below it can be of any length.
 *
 *******************************************************************************
 */
typedef struct _MP_OID_LIST
{
    /**
     * The number of object IDs in the @a oids array.
     */
    MP_UINT32       oidCount;

    /**
     * A variable length array of zero or more object IDs.  There are
     * 'oidCount' object IDs in this array.
     */
    MP_OID         oids[1];

} MP_OID_LIST;

/**
 *******************************************************************************
 *
 * Declaration of the MP_LIBRARY_PROPERTIES structure
 *
 * This structure is returned by the MP_GetLibraryProperties() API.
 *
 *******************************************************************************
 */
typedef struct _MP_LIBRARY_PROPERTIES
{
    /**
     * The version of the Multipath Management API implemented by the library.
     */
    MP_UINT32       supportedMpVersion;

    /**
     * A null terminated ASCII string containing the name of the vendor that
     * created the binary version of the library.
     */
    MP_WCHAR        vendor[256];

    /**
     * A null terminated ASCII string containing the implementation version
     * of the library from the vendor specified in the 'vendor' field.
     */
    MP_WCHAR        implementationVersion[256];

    /**
     * A null terminated ASCII string ideally containing the path and file
     * name of the library that is being used by the currently executing
     * process can be found. If the path cannot be determined then it is
     * acceptable to fill this field with only the name (and extension if
     * applicable) of the file of the library.  If this cannot be determined
     * then this field should be an empty string.
     */
    MP_CHAR        fileName[256];

    /**
     * The time and date that the library that is executing was built.
     */
    MP_WCHAR        buildTime[256];

} MP_LIBRARY_PROPERTIES;

/**
 *******************************************************************************
 *
 * Declaration of the MP_PLUGIN_PROPERTIES structure
 *
 * This structure is returned by the MP_GetPluginProperties() API.
 *
 *******************************************************************************
 */
typedef struct _MP_PLUGIN_PROPERTIES
{
    /**
     * The version of the Multipath Management API implemented by a plugin.
     */
    MP_UINT32 supportedMpVersion;

    /**
     * A null terminated Unicode string containing the name of the vendor that
     * created the binary version of the plugin.
     */
    MP_WCHAR vendor[256];

    /**
     * A null terminated Unicode string containing the implementation version
     * of the plugin from the vendor specified in vendor.
     */
    MP_WCHAR implementationVersion[256];

    /**
     * A null terminated ASCII string ideally containing the path and file
     * name of the plugin that is filling in this structure.
     */
    MP_CHAR fileName[256];

    /**
     * The time and date that the plugin that is executing was built.
     */
    MP_WCHAR buildTime[256];

    /**
     * A null terminated Unicode string containing the name of the multipath
     * driver vendor associated with this plugin.
     */
    MP_WCHAR driverVendor[256];

    /**
     * A null terminated Unicode string ideally containing the path and file
     * name of the plugin that is filling in this structure.
     */
    MP_CHAR driverName[256];

    /**
     * A null terminated Unicode string containing the version number of
     * the multipath driver.
     */
    MP_WCHAR driverVersion[256];

    /**
     * A set of flags representing the load balance types
     * (MP_LOAD_BALANCE_TYPES) supported by the plugin/driver as a plugin-wide
     * property.
     */
    MP_UINT32 supportedLoadBalanceTypes;

    /**
     * boolean indicating whether the implementation supports activating target
     * port groups.
     */
    MP_BOOL canSetTPGAccess;

    /**
     * A Boolean indicating whether the implementations supports overriding
     * paths. Setting this to true indicates MP_SetOverridePath and
     * MP_CancelOverridePath are supported.
     */
    MP_BOOL canOverridePaths;

    /**
     * A boolean indicating whether the implementation exposes (or leaves
     * exposed) device files for the individual paths encapsulated by the
     * multipath device file. This is typically true for MP drivers that sit
     * near the top of the driver stack..
     */
    MP_BOOL exposesPathDeviceFiles;

    /**
     * A string representing the primary file names the driver uses for
     * multipath logical units.
     */
    MP_CHAR deviceFileNamespace[256];

    /**
     * A boolean indicating whether the driver limits multipath capabilities
     * to certain device types. If true, then the driver only provides multipath
     * support to devices exposed through MP_DEVICE_PRODUCT_PROPERTIES
     * instances. If false, then the driver supports any device that provides
     * standard SCSI logical unit identifiers.
     */
    MP_BOOL onlySupportsSpecifiedProducts;

    /**
     * Describes the range of administer settable path weights supported by the
     * driver. A driver with no path preference capabilities should set
     * this property to zero. A driver with the ability to enable/disable
     * paths should set this property to 1. Drivers with more weight settings
     * can set the property appropriately.
     */
    MP_UINT32 maximumWeight;

    /**
     * The autofailback support indicates whether the implementation supports
     * auto-failback (to reenable paths that revert to a good state) at the
     * plugin level, the multipath logical unit level, both levels or whether
     * auto-failback is unsupported.
     */
    MP_AUTOFAILBACK_SUPPORT autoFailbackSupport;

    /**
     * A Boolean indicating whether plugin-wide autofailback is currently
     * enabled. This parameter is undefined if autoFailbackSupport is
     * MP_AUTOFAILBACK_SUPPORT_NONE or MP_AUTOFAILBACK_SUPPORT_MPLU.
     */
    MP_BOOL pluginAutoFailbackEnabled;

    /**
     * The maximum plugin-wide polling rate (in seconds) for auto-failback
     * supported by the driver. A value of zero indicates the driver/plugin
     * does not support polling. Undefined if autoFailbackSupport is
     * MP_AUTOFAILBACK_SUPPORT_NONE or MP_AUTOFAILBACK_SUPPORT_MPLU. If the
     * plugin/driver supports auto-failback without polling or does not provide
     * a way to set the polling rate, then this must be set to zero (0).
     * This value is set by the plugin and cannot be modified by users.
     */
    MP_UINT32 failbackPollingRateMax;

    /**
     * The current plugin-wide auto-failback polling rate (in seconds).
     * Undefined if autofailbackSupport is MP_AUTOFAILBACK_SUPPORT_NONE or 
     * MP_AUTOFAILBACK_SUPPORT_MPLU. Cannot be more that plooingRateMax.
     */
    MP_UINT32 currentFailbackPollingRate;

    /**
     * An enumerated type indicating whether the implementation supports
     * auto-probing at the plugin level, the multipath logical unit level, both
     * levels or whether auto-probing is unsupported.
     */
    MP_AUTOPROBING_SUPPORT autoProbingSupport;

    /**
     * A boolean indicating that plugin-wide auto-probing is enabled. This
     * property is undefined if autoProbingSupport is
     * MP_AUTOPROBING_SUPPORT_NONE or MP_AUTOPROBING_SUPPORT_MPLU.
     */
    MP_BOOL pluginAutoProbingEnabled;

    /**
     * The maximum plugin-wide polling rate (in seconds) for auto-probing
     * supported by the driver. Undefined if autoProbingSupport is
     * MP_AUTOPROBING_SUPPORT_NONE or MP_AUTOPROBING_SUPPORT_MPLU. If the
     * plugin/driver supports auto-probing without polling or does not provide a
     * way to set the probing polling rate, then this must be set to zero (0).
     * This value is set by the plugin and cannot be modified by users.
     */
    MP_UINT32 probingPollingRateMax;

    /**
     * The current plugin-wide auto-probing polling rate (in seconds).
     * Undefined if autoProbingSupport is MP_AUTOPROBING_SUPPORT_NONE or
     * MP_AUTOPROBING_SUPPORT_MPLU. Cannot be more that probingPollingRateMax.
     */
    MP_UINT32 currentProbingPollingRate;

    /**
     * The load balance type that will be used by the driver for devices
     * (without a corresponding MP_DEVICE_PRODUCT_PROPERTIES instance) unless
     * overridden by the administrator. Any logical unit with vendor, product,
     * and revision properties matching a MP_DEVICE_PRODUCT_PROPERTIES instance
     * will default to a device-specific load balance type.
     */
    MP_LOAD_BALANCE_TYPE defaultloadBalanceType;

    /**
     * The count of proprietary properties (less that or equal to eight)
     * supported.
     */
    MP_UINT32	proprietaryPropertyCount;

    /**
     * A list of proprietary property name/value pairs.
     */
    MP_PROPRIETARY_PROPERTY proprietaryProperties[8];

} MP_PLUGIN_PROPERTIES;

/**
 *******************************************************************************
 *
 * Declaration of the MP_DEVICE_PRODUCT_PROPERTIES structure.
 *
 * This structure is returned by the MP_GetDeviceProductProperties() API.
 *
 *******************************************************************************
 */
typedef struct _MP_DEVICE_PRODUCT_PROPERTIES
{
    MP_CHAR	    vendor[8];
    MP_CHAR	    product[16];
    MP_CHAR	    revision[4];
    MP_UINT32	    supportedLoadBalanceTypes;

} MP_DEVICE_PRODUCT_PROPERTIES;

/**
 *******************************************************************************
 *
 * Declaration of the MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES structure.
 *
 * This structure is returned by the MP_GetMPLogicalUnitProperties() API.
 *
 *******************************************************************************
 */
typedef struct _MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES
{
    MP_CHAR			vendor[8];
    MP_CHAR			product[16];
    MP_CHAR			revision[4];
    MP_CHAR			name[256];
    MP_LOGICAL_UNIT_NAME_TYPE   nameType;
    MP_CHAR			deviceFileName[256];
    MP_BOOL			asymmetric;
    MP_OID			overridePath;
    MP_LOAD_BALANCE_TYPE	currentLoadBalanceType;
    MP_UINT32			logicalUnitGroupID;
    MP_XBOOL			autoFailbackEnabled;
    MP_UINT32			failbackPollingRateMax;
    MP_UINT32			currentFailbackPollingRate;
    MP_XBOOL 			autoProbingEnabled;
    MP_UINT32 			probingPollingRateMax;
    MP_UINT32 			currentProbingPollingRate;
    MP_UINT32 			proprietaryPropertyCount;
    MP_PROPRIETARY_PROPERTY 	proprietaryProperties[8];

} MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES;

/**
 *******************************************************************************
 *
 * Declaration of the MP_PATH_LOGICAL_UNIT_PROPERTIES structure.
 *
 * This structure is returned by the MP_GetPathLogicalUnitProperties() API.
 *
 *******************************************************************************
 */
typedef struct _MP_PATH_LOGICAL_UNIT_PROPERTIES
{
    MP_UINT32	    weight;
    MP_PATH_STATE   pathState;
    MP_BOOL	    disabled;		
    MP_OID	    initiatorPortOid;
    MP_OID	    targetPortOid;
    MP_OID	    logicalUnitOid;
    MP_UINT64	    logicalUnitNumber;
    MP_CHAR	    deviceFileName[256];
    MP_UINT32	    busNumber;
    MP_UINT32	    portNumber;

} MP_PATH_LOGICAL_UNIT_PROPERTIES;

/**
 *******************************************************************************
 *
 * Declaration of the MP_INITIATOR_PORT_PROPERTIES structure.
 *
 * This structure is returned by the MP_GetInitiatorPortProperties() API.
 *
 *******************************************************************************
 */
typedef struct _MP_INITIATOR_PORT_PROPERTIES
{
    MP_CHAR		    portID[256];
    MP_PORT_TRANSPORT_TYPE  portType;
    MP_CHAR		    osDeviceFile[256];
    MP_WCHAR		    osFriendlyName[256];

} MP_INITIATOR_PORT_PROPERTIES;

/**
 *******************************************************************************
 *
 * Declaration of the MP_TARGET_PORT_PROPERTIES structure.
 *
 * This structure is returned by the MP_GetTargetPortProperties() API.
 *
 *******************************************************************************
 */
typedef struct _MP_TARGET_PORT_PROPERTIES
{
    MP_CHAR	portID[256];
    MP_UINT32	relativePortID;

} MP_TARGET_PORT_PROPERTIES;

/**
 *******************************************************************************
 *
 * Declaration of the MP_TARGET_PORT_GROUP_PROPERTIES structure.
 *
 * This structure is returned by the MP_GetTargetPortGroupProperties() API.
 *
 *******************************************************************************
 */
typedef struct _MP_TARGET_PORT_GROUP_PROPERTIES
{
    MP_ACCESS_STATE_TYPE    accessState;
    MP_BOOL                 explicitFailover;
    MP_BOOL                 supportsLuAssignment;
    MP_BOOL		    preferredLuPath;
    MP_UINT32		    tpgID;

} MP_TARGET_PORT_GROUP_PROPERTIES;

/**
 *******************************************************************************
 *
 * Declaration of the MP_TPG_STATE_PAIR structure.
 *
 * This structure is used as an argument for the MP_SetTPGAcess() API.
 *
 *******************************************************************************
 */
typedef struct _MP_TPG_STATE_PAIR
{
    MP_OID                  tpgOid;
    MP_ACCESS_STATE_TYPE    desiredState;

} MP_TPG_STATE_PAIR;

/**
 *******************************************************************************
 *
 * Declaration of call back function type for event support
 *
 *******************************************************************************
 */
typedef void (* MP_OBJECT_PROPERTY_FN) (
    MP_OID_LIST *pOidList, void *pCallerData
);

typedef void (* MP_OBJECT_VISIBILITY_FN) (
    MP_BOOL becomingVisible, MP_OID_LIST *pOidList, void *pCallerData
);

void InitLibrary();
void ExitLibrary();

/**
 ******************************************************************************
 *
 * The APIs for property and object related discovery.
 *
 * - MP_GetLibraryProperties
 * - MP_GetPluginOidList
 * - MP_GetPluginProperties
 * - MP_GetAssociatedPluginOid
 * - MP_GetObjectType
 * - MP_GetDeviceProductOidList
 * - MP_GetDeviceProductProperties
 * - MP_GetInitiatorPortOidList
 * - MP_GetInitiatorPortProperties
 * - MP_GetMultipathLus
 * - MP_GetMPLogicalUnitProperties
 * - MP_GetAssociatedPathOidList
 * - MP_GetPathLogicalUnitProperties
 * - MP_GetAssociatedTPGOidList
 * - MP_GetTargetPortGroupProperties
 * - MP_GetMPLuOidListFromTPG
 * - MP_GetProprietaryLoadBalanceOidList
 * - MP_GetProprietaryLoadBalanceProperties
 * - MP_GetTargetPortOidList
 * - MP_GetTargetPortProperties
 *
 ******************************************************************************
 */

/**
 *******************************************************************************
 *
 * Gets the properties of the MP API library that is being used.
 *
 * @param  pProps
 *         A pointer to an MP_LIBRARY_PROPERTIES structure allocated by
 *         the caller.  On successful return this structure will contain the
 *         properties of the MP API library.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *          Returned if the library properties were successfully returned.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if ppList pointer passed as placeholder for holding the
 *      library properties is found to be invalid.
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the implementation does not support the API.
 *
 ******************************************************************************
 */
MP_STATUS MP_GetLibraryProperties(
        MP_LIBRARY_PROPERTIES *pProps
);

/**
 ******************************************************************************
 *
 * Gets a list of the object IDs of all currently loaded plugins.
 *
 * @param ppList
 *        A pointer to a pointer to an MP_OID_LIST.  On successful
 *        return this will contain a pointer to an @ref MP_OID_LIST
 *        which contains the object IDs of all of the plugins currently
 *        loaded by the library.
 *
 * @return MP_STATUS indicating if the operation was successful or
 *          if an error occurred.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *      Returned if oid does not specify any valid object type. This is
 *      most likely to happen if an uninitialized object ID is passed to
 *      the API.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if ppList is NULL or specifies a memory area to which data
 *      cannot be written. MP_STATUS_SUCCESS Returned when the operation is
 *      successful.
 *
 * @retval MP_STATUS_INSUFFICIENT_MEMORY
 *      Returned when memory allocation failure occurs*
 *
 * @retval MP_STATUS_SUCCESS
 *          Returned if the plugin ID list was successfully returned.
 *
 ******************************************************************************
 */
MP_STATUS MP_GetPluginOidList(
        MP_OID_LIST **ppList
);

/**
 *******************************************************************************
 *
 * Gets the properties of the specified vendor plugin.
 *
 * @param  oid
 *         The ID of the plugin whose properties are being retrieved.
 *
 * @param  pProps
 *         A pointer to an @ref MP_PLUGIN_PROPERTIES structure allocated by
 *         the caller.  On successful return this will contain the properties
 *         of the plugin specified by pluginOid.
 *
 * @return An MP_STATUS indicating if the operation was successful or if an
 *         error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned if the plugin properties were successfully returned.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *         Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *         Returned if oid has an owner that is not currently known to
 *     the system.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *         Returned if 'pProps' is NULL or specifies a memory area to
 *         which data cannot be written.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetPluginProperties(
        MP_OID                oid,
        MP_PLUGIN_PROPERTIES *pProps
);


/**
 *******************************************************************************
 *
 * Gets the object ID for the plugin associated with the specified object ID.
 *
 * @param  oid
 *         The object ID of an object that has been received from a previous
 *         library call.
 *
 * @param  pPluginOid
 *         A pointer to an MP_OID structure allocated by the caller.  On
 *         successful return this will contain the object ID of the plugin
 *         associated with the object specified by @a objectId.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *          Returned if the associated plugin ID was successfully returned.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *          Returned if oid does not specify a plugin that is currently known to
 *     the system.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *          Returned if 'oid' specifies an object not owned by a plugin or
 *     	    if pPluginOid is NULL or specifies a memory area to which data
 *          cannot be written.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if 'oid' specifies an object with an invalid type.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetAssociatedPluginOid(
        MP_OID  oid,
        MP_OID *pPluginOid
);


/**
 *******************************************************************************
 *
 * Gets the object type of an initialized object ID.
 *
 * @param  oid
 *         The object ID of an object that has been received from a previous
 *         library call.
 *
 * @param  pObjectType
 *         A pointer to an MP_OBJECT_TYPE variable allocated by the caller.
 *         On successful return this will contain the object type of oid.
 *
 * @return An MP_STATUS indicating if the operation was successful or
 *         if an error occurred.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *      Returned if oid has an owner that is not currently known to
 *      the system.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetObjectType(
        MP_OID          oid,
        MP_OBJECT_TYPE *pObjectType
);


/**
 *******************************************************************************
 *
 * Gets a list of the object IDs of all the device product properties
 *       associated with this plugin.
 *
 * @param  oid
 *         The object ID of plugin.
 *
 * @param  ppList
 *      A pointer to a pointer to an MP_OID_LIST structure.
 *      On a successful return, this will contain a pointer to
 *      an MP_OID_LIST that contains the object IDs of all the device
 *      product descriptors associated with the specified plugin.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if ppList pointer passed as placeholder for holding
 *      the device product list is found to be invalid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *         Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *         Returned when the plugin for the specified oid is not found.
 *
 * @retval MP_STATUS_INSUFFICIENT_MEMORY
 *      Returned when memory allocation failure occurs
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the API is not supported.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetDeviceProductOidList(
        MP_OID        oid,
        MP_OID_LIST **ppList
);

/**
 *******************************************************************************
 *
 * Gets the device product properties of the specified plugin oid.
 *
 * @param  oid
 *         The object ID of the plugin.
 *
 * @param  ppProps
 *      A pointer to an MP_DEVICE_PRODUCT_PROPERTIES structure
 *      allocated by the caller. On successful return it will contain
 *      a pointer to an MP_DEVICE_PRODUCT_PROPERTIES structure allocated
 *      by the library.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if ppProps pointer passed as placeholder for holding
 *      the device product properties is found to be invalid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *         Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *         Returned when the plugin for the specified oid is not found.
 *
 * @retval MP_STATUS_INSUFFICIENT_MEMORY
 *      Returned when memory allocation failure occurs
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the API is not supported.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetDeviceProductProperties(
        MP_OID                         oid,
        MP_DEVICE_PRODUCT_PROPERTIES *pProps
);

/**
 *******************************************************************************
 *
 * Gets a list of the object IDs of all the initiator ports associated
 * with this plugin.
 *
 * @param  oid
 *         The object ID of plugin.
 *
 * @param  ppList
 *      A pointer to a pointer to an MP_OID_LIST structure.
 *      On a successful return, this will contain a pointer to
 *      an MP_OID_LIST that contains the object IDs of all the initiator
 *      ports associated with the specified plugin.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if ppList pointer passed as placeholder for holding
 *      the initiator port list is found to be invalid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *          Returned when the plugin for the specified oid is not found.
 *
 * @retval MP_STATUS_INSUFFICIENT_MEMORY
 *      Returned when memory allocation failure occurs
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the API is not supported.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetInitiatorPortOidList(
        MP_OID        oid,
        MP_OID_LIST **ppList
);

/**
 *******************************************************************************
 *
 * Gets the properties of the specified initiator port.
 *
 * @param  oid
 *         The object ID of the initiator port.
 *
 * @param  pProps
 *      A pointer to an MP_INITIATOR_PORT_PROPERTIES structure
 *      allocated by the caller. On successful return, this structure
 *      will contain the properties of the port specified by oid.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pProps is NULL or specifies a memory area to
 *      which data cannot be written.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *          Returned if oid has an owner that is not currently known to
 *      the system.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetInitiatorPortProperties(
        MP_OID                        oid,
        MP_INITIATOR_PORT_PROPERTIES *pProps
);

/**
 *******************************************************************************
 *
 * Gets a list of multipath logical units associated to a plugin.
 *
 * @param  oid
 *         The object ID of plugin.
 *
 * @param  ppList
 *      A pointer to a pointer to an MP_OID_LIST structure.
 *      On a successful return, this will contain a pointer to
 *      an MP_OID_LIST that contains the object IDs of all the multipath
 *      logical units associated with the specified plugin.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if ppList pointer passed as placeholder for holding
 *      the multipath logical unit list is found to be invalid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *          Returned when the plugin for the specified oid is not found.
 *
 * @retval MP_STATUS_INSUFFICIENT_MEMORY
 *      Returned when memory allocation failure occurs
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the API is not supported.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetMultipathLus(
        MP_OID        oid,
        MP_OID_LIST **ppList
);

/**
 *******************************************************************************
 *
 * Gets the properties of the specified logical unit.
 *
 * @param  oid
 *         The object ID of the multipath logical unit.
 *
 * @param  pProps
 *      A pointer to an MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES structure
 *      allocated by the caller. On successful return, this structure
 *      will contain the properties of the port specified by oid.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pProps is NULL or specifies a memory area to
 *      which data cannot be written.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *          Returned if oid has an owner that is not currently known to
 *      the system.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetMPLogicalUnitProperties(
        MP_OID                                oid,
        MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES *pProps
);

/**
 *******************************************************************************
 *
 * Gets a list of the object IDs of all the path logical units associated
 * with the specified multipath logical unit, initiator port, or target port.
 *
 * @param  oid
 *         The object ID of multipath logical unit, initiator port, or
 *     target port.
 *
 * @param  ppList
 *      A pointer to a pointer to an MP_OID_LIST structure.
 *      On a successful return, this will contain a pointer to
 *      an MP_OID_LIST that contains the object IDs of all the mp path
 *      logical units associated with the specified OID.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if ppList pointer passed as placeholder for holding
 *      the device product list is found to be invalid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *          Returned when the plugin for the specified oid is not found.
 *
 * @retval MP_STATUS_INSUFFICIENT_MEMORY
 *      Returned when memory allocation failure occurs
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *      Returned if oid has an owner that is not currently known to
 *      the system.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetAssociatedPathOidList(
        MP_OID        oid,
        MP_OID_LIST **ppList
);

/**
 *******************************************************************************
 *
 * Gets the properties of the specified path logical unit.
 *
 * @param  oid
 *         The object ID of the path logical unit.
 *
 * @param  pProps
 *      A pointer to an MP_PATH_LOGICAL_UNIT_PROPERTIES structure
 *      allocated by the caller. On successful return, this structure
 *      will contain the properties of the port specified by oid.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pProps is NULL or specifies a memory area to
 *      which data cannot be written.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *          Returned if oid has an owner that is not currently known to
 *      the system.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetPathLogicalUnitProperties(
        MP_OID                           oid,
        MP_PATH_LOGICAL_UNIT_PROPERTIES *pProps
);

/**
 *******************************************************************************
 *
 * Gets a list of the object IDs of all the target port group associated
 * with the specified multipath logical unit.
 *
 * @param  oid
 *         The object ID of the multiple logical unit.
 *
 * @param  ppList
 *      A pointer to a pointer to an MP_OID_LIST structure.
 *      On a successful return, this will contain a pointer to
 *      an MP_OID_LIST that contains the object IDs of all the target
 *      port group associated with the specified multipath logical unit.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if ppList pointer passed as placeholder for holding
 *      the target port group list is found to be invalid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *          Returned when the plugin for the specified oid is not found.
 *
 * @retval MP_STATUS_INSUFFICIENT_MEMORY
 *      Returned when memory allocation failure occurs
 *
 *
 *******************************************************************************
 */
MP_STATUS MP_GetAssociatedTPGOidList(
        MP_OID        oid,
        MP_OID_LIST **ppList
);

/**
 *******************************************************************************
 *
 * Gets the properties of the specified target port group.
 *
 * @param  oid
 *         The object ID of the target port group.
 *
 * @param  pProps
 *      A pointer to an MP_TARGET_PORT_GROUP_PROPERTIES structure
 *      allocated by the caller. On successful return, this structure
 *      will contain the properties of the port specified by oid.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pProps is NULL or specifies a memory area to
 *      which data cannot be written.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *          Returned if oid has an owner that is not currently known to
 *      the system.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetTargetPortGroupProperties(
        MP_OID                           oid,
        MP_TARGET_PORT_GROUP_PROPERTIES *pProps
);

/**
 *******************************************************************************
 *
 * Gets a list of multipath logical units associated with the specific target
 *  port group.
 *
 * @param  oid
 *         The object ID of the target port group.
 *
 * @param  ppList
 *      A pointer to a pointer to an MP_OID_LIST structure.
 *      On a successful return, this will contain a pointer to
 *      an MP_OID_LIST that contains the object IDs of all the multipath
 *      logical units associated with the specified target port group.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if ppList pointer passed as placeholder for holding
 *      the multipath logical unit list is found to be invalid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *          Returned when the plugin for the specified oid is not found.
 *
 * @retval MP_STATUS_INSUFFICIENT_MEMORY
 *      Returned when memory allocation failure occurs
 *
 *******************************************************************************
 */
MP_STATUS MP_GetMPLuOidListFromTPG(
        MP_OID        oid,
        MP_OID_LIST **ppList
);

/**
 *******************************************************************************
 *
 * Gets a list of the object IDs of all the proprietary load balance
 * algorithms associated with this plugin.
 *
 * @param  oid
 *         The object ID of the plugin.
 *
 * @param  ppList
 *      A pointer to a pointer to an MP_OID_LIST structure.
 *      On a successful return, this will contain a pointer to
 *      an MP_OID_LIST that contains the object IDs of all the proprietary
 *      load balance algorithms associated with the specified plugin.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if ppList pointer passed as placeholder for holding
 *      the proprietary load balance oid list is found to be invalid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *          Returned when the plugin for the specified oid is not found.
 *
 * @retval MP_STATUS_INSUFFICIENT_MEMORY
 *      Returned when memory allocation failure occurs
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the API is not supported.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetProprietaryLoadBalanceOidList(
        MP_OID        oid,
        MP_OID_LIST **ppList
);

/**
 *******************************************************************************
 *
 * Gets the properties of the specified load balance properties structure.
 *
 * @param  oid
 *         The object ID of the proprietary load balance structure. 
 *
 * @param  pProps
 *      A pointer to an MP_PROPRIETARY_LOAD_BALANCE_PROPERTIES structure
 *      allocated by the caller. On successful return, this structure
 *      will contain the properties of the port specified by oid.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pProps is NULL or specifies a memory area to
 *      which data cannot be written.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *      Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *      Returned if oid has an owner that is not currently known to
 *      the system.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetProprietaryLoadBalanceProperties(
        MP_OID                     oid,
        MP_PROPRIETARY_LOAD_BALANCE_PROPERTIES *pProps
);

/**
 *******************************************************************************
 *
 * Gets a list of the object IDs of the target ports in the specified target
 * port group.
 *
 * @param  oid
 *         The object ID of the target port group.
 *
 * @param  ppList
 *      A pointer to a pointer to an MP_OID_LIST structure.
 *      On a successful return, this will contain a pointer to
 *      an MP_OID_LIST that contains the object IDs of all the target ports
 *      associated with the specified target port group.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if ppList pointer passed as placeholder for holding
 *      the multipath logical unit list is found to be invalid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *          Returned when the plugin for the specified oid is not found.
 *
 * @retval MP_STATUS_INSUFFICIENT_MEMORY
 *      Returned when memory allocation failure occurs
 *
 *******************************************************************************
 */
MP_STATUS MP_GetTargetPortOidList(
        MP_OID        oid,
        MP_OID_LIST **ppList
);

/**
 *******************************************************************************
 *
 * Gets the properties of the specified target port.
 *
 * @param  oid
 *         The object ID of the target port.
 *
 * @param  pProps
 *      A pointer to an MP_TARGET_PORT_PROPERTIES structure
 *      allocated by the caller. On successful return, this structure
 *      will contain the properties of the port specified by oid.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pProps is NULL or specifies a memory area to
 *      which data cannot be written.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *          Returned if oid has an owner that is not currently known to
 *      the system.
 *
 *******************************************************************************
 */
MP_STATUS MP_GetTargetPortProperties(
        MP_OID                     oid,
        MP_TARGET_PORT_PROPERTIES *pProps
);

/**
 ******************************************************************************
 *
 * The APIs for path management.
 *
 * - MP_AssignLogicalUnitToTPG
 * - MP_SetOverridePath
 * - MP_CancelOverridePath
 * - MP_EnableAutoFailback
 * - MP_DisableAutoFailback
 * - MP_EnableAutoProbing
 * - MP_DisableAutoProbing
 * - MP_EnablePath
 * - MP_DisablePath
 * - MP_SetLogicalUnitLoadBalanceType
 * - MP_SetPluginLoadBalanceType
 * - MP_SetPathWeight
 * - MP_SetFailbackPollingRates
 * - MP_SetProbingPollingRates
 * - MP_SetProprietaryProperties
 * - MP_SetTPGAccess
 *
 ******************************************************************************
 */

/**
 *******************************************************************************
 *
 * Assign a multipath logical unit to a target port group.
 *
 * @param  tpgOid
 *      An MP_TARGET_PORT_GROUP oid. The target port group currently in
 *      active access state that the administrator would like the LU
 *      assigned to.
 *
 * @param  luOid
 *      An MP_MULTIPATH_LOGICAL_UNIT oid.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned when luOid is not associated with tpgOid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *          Returned if oid has an owner that is not currently known to
 *      the system.
 *
 *******************************************************************************
 */
MP_STATUS MP_AssignLogicalUnitToTPG(
        MP_OID tpgOid,
        MP_OID luOid
);

/**
 *******************************************************************************
 *
 * Manually override the path for a logical unit. The path exclusively used to
 * access the logical unit until cleared.
 *
 * @param  logicalUnitOid
 *      The object ID of the multipath logical unit.
 *
 * @param  pathOid
 *      The object ID of the path logical unit.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if the oid of the object is not valid
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the implementation does not support the API
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_PATH_NONOPERATIONAL
 *          Returned when the driver cannot communicate through selected path.
 *
 *******************************************************************************
 */
MP_STATUS MP_SetOverridePath(
    MP_OID logicalUnitOid,
    MP_OID pathOid
);

/**
 *******************************************************************************
 *
 * Cancel a path override and re-enable load balancing.
 *
 * @param  luOid
 *         An MP_MULTIPATH_LOGICAL_UNIT oid.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if MP_MULTIPATH_LOGICAL_UNIT with the luOid is not found.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *          Returned if oid has an owner that is not currently known to
 *      the system.
 *
 *******************************************************************************
 */
MP_STATUS MP_CancelOverridePath(
        MP_OID logicalUnitOid
);

/**
 *******************************************************************************
 *
 * Enables Auto-failback.
 *
 * @param  oid
 *      The oid of the plugin or the multipath logical unit.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if oid is NULL or specifies a memory area that is not
 *      a valid plugin oid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 *******************************************************************************
 */
MP_STATUS MP_EnableAutoFailback(
    MP_OID oid
);

/**
 *******************************************************************************
 *
 * Disables Auto-failback.
 *
 * @param  oid
 *      The oid of the plugin or the multipath logical unit..
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if oid is NULL or specifies a memory area that is not
 *      a valid plugin oid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 *******************************************************************************
 */
MP_STATUS MP_DisableAutoFailback(
    MP_OID oid
);

/**
 *******************************************************************************
 *
 * Enables Auto-probing.
 *
 * @param  oid
 *      The oid of the plugin or the multipath logical unit.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if oid is NULL or specifies a memory area that is not
 *      a valid plugin oid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 *******************************************************************************
 */
MP_STATUS MP_EnableAutoProbing(
    MP_OID oid
);

/**
 *******************************************************************************
 *
 * Disables Auto-probing.
 *
 * @param  oid
 *      The oid of the plugin or the multipath logical unit.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if oid is NULL or specifies a memory area that is not
 *      a valid plugin oid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 *******************************************************************************
 */
MP_STATUS MP_DisableAutoProbing(
    MP_OID oid
);

/**
 *******************************************************************************
 *
 * Enables a path. This API may cause failover in a logical unit with
 * asymmetric access.
 *
 * @param  oid
 *      The oid of the path.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if oid is NULL or specifies a memory area that is not
 *      a valid path oid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 *******************************************************************************
 */
MP_STATUS MP_EnablePath(
    MP_OID oid
);

/**
 *******************************************************************************
 *
 * Disables a path. This API may cause failover in a logical unit with
 * asymmetric access. This API may cause a logical unit to become unavailable.
 *
 * @param  oid
 *      The oid of the path.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if oid is NULL or specifies a memory area that is not
 *      a valid path oid.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_UNSUPPORTED
 *          Returned when the API is not supported.
 *
 * @retval MP_STATUS_TRY_AGAIN
 *          Returned when path cannot be disabled at this time.
 *
 * @retval MP_STATUS_NOT_PERMITTED
 *          Returned when disabling thsi path would cause the login unit to
 * 	    become unavailable.
 *
 *******************************************************************************
 */
MP_STATUS MP_DisablePath(
    MP_OID oid
);

/**
 *******************************************************************************
 *
 * Set the multipath logical unit s load balancing policy.
 *
 * @param  logicalUnitoid
 *      The object ID of the multipath logical unit.
 *
 * @param  loadBanlance
 *      The desired load balance policy for the specified logical unit.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if no MP_MULTIPATH_LOGICAL_UNIT associated with
 *      @ref ligicalUnitrOid is found or invalid MP_LOAD_BALANCE_TYPE is
 *      specified.
 *
 * @retval MP_STATUS_FAILED
 *      Returned when the specified loadBalance type cannot be handled
 *      by the plugin.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 *******************************************************************************
 */
MP_STATUS MP_SetLogicalUnitLoadBalanceType(
    MP_OID               logicalUnitOid,
    MP_LOAD_BALANCE_TYPE loadBalance
);

/**
 *******************************************************************************
 *
 * Set the weight to be assigned to a particular path.
 *
 * @param  pathOid
 *      The object ID of the path logical unit.
 *
 * @param  weight
 *      weight that will be assigned to the path logical unit.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *      Returned when the MP Path specified by the PathOid could not be
 *      found.
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the implementation does not support the API
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *          Returned when the operation failed.
 *
 * @retval MP_STATUS_INVALID_WEIGHT
 *          Returned when the weight parameter is greater than the plugin's
 *      maxWeight property.
 *
 *******************************************************************************
 */
MP_STATUS MP_SetPathWeight(
    MP_OID    pathOid,
    MP_UINT32 weight
);

/**
 *******************************************************************************
 *
 * Set the default load balance policy for the plugin.
 *
 * @param  oid
 *      The object ID of the plugin
 *
 * @param  loadBalance
 *      The desired default load balance policy for the specified plugin.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *      Returned when the the plugin specified by @ref oid could not be
 *      found.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if the oid of the object is not valid.
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the implementation does not support the API
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *          Returned when the specified loadBalance type cannot be handled
 *      by the plugin.
 *
 *******************************************************************************
 */
MP_STATUS MP_SetPluginLoadBalanceType(
    MP_OID               oid,
    MP_LOAD_BALANCE_TYPE loadBalance
);

/**
 *******************************************************************************
 *
 * Set the failback polling rates. Setting both rates to zero disables polling.
 *
 * @param  pluginOid
 *      The object ID of either the plugin or a multipath logical unit.
 *
 * @param  pollingRate
 *      The value to be set in MP_PLUGIN_PROPERTIES current pollingRate or
 *	MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES pollingRate.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *      Returned when the the plugin specified by @ref oid could not be
 *      found.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if one of the polling values is outside the range
 *      supported by the driver.
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the implementation does not support the API
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 *******************************************************************************
 */
MP_STATUS MP_SetFailbackPollingRate(
    MP_OID    oid,
    MP_UINT32 pollingRate
);

/**
 *******************************************************************************
 *
 * Set the probing polling rates. Setting both rates to zero disables polling.
 *
 * @param  pluginOid
 *      The object ID of either the plugin or a multipath logical unit.
 *
 * @param  pollingRate
 *      The value to be set in MP_PLUGIN_PROPERTIES current pollingRate or
 *	MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES pollingRate.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *      Returned when the the plugin specified by @ref oid could not be
 *      found.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if one of the polling values is outside the range
 *      supported by the driver.
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the implementation does not support the API
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 *******************************************************************************
 */
MP_STATUS MP_SetProbingPollingRate(
    MP_OID    oid,
    MP_UINT32 pollingRate
);

/**
 *******************************************************************************
 *
 * Set proprietary properties in supported object instances.
 *
 * @param  pluginOid
 *      The object ID of MP_PROPRIETARY_LOAD_BALANCE_PROPERTIES,
 *	MP_PLUGIN_PROPERTIES or MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES.
 *
 * @param  count
 *	   The number of valid items in pPropertyList.
 *
 * @param  pPropertyList
 *	   A pointer to an array of property name/value pairs. This array must
 *	   contain the same number of elements as count.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *      Returned when the the plugin specified by @ref oid could not be
 *      found.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if one of the polling values is outside the range
 *      supported by the driver.
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the implementation does not support the API
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 *******************************************************************************
 */
MP_STATUS MP_SetProprietaryProperties(
    MP_OID    oid,
    MP_UINT32 count,
    MP_PROPRIETARY_PROPERTY *pPropertyList
);

/**
 *******************************************************************************
 *
 * Set the access state for a list of target port groups. This allows
 * a client to force a failover or failback to a desired set of target port
 * groups.
 *
 * @param  luOid
 *      The object ID of the logical unit where the command is sent.
 *
 * @param  count
 *      The number of valid items in the pTpgStateList.
 *
 * @param  pTpgStateList
 *      A pointer to an array of TPG/access-state values. This array must
 *      contain the same number of elements as @ref count.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_OBJECT_NOT_FOUND
 *      Returned when the MP_MULTIPATH_LOGICAL_UNIT associated with @ref
 *      oid could not be found.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pTpgStateList is null or if one of the TPGs referenced
 *      in the list is not associated with the specified MP logical unit.
 *
 * @retval MP_STATUS_UNSUPPORTED
 *      Returned when the implementation does not support the API
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if oid does not specify any valid object type.
 *
 * @retval MP_STATUS_ACCESS_STATE_INVALID
 *         Returned if the target device returns a status indicating the caller
 *     is attempting to establish an illegal combination of access states.
 *
 * @retval MP_STATUS_FAILED
 *          Returned if the underlying interface failed the commend for some
 *      reason other than MP_STATUS_ACCESS_STATE_INVALID
 *
 *******************************************************************************
 */
MP_STATUS MP_SetTPGAccess(
    MP_OID             luOid,
    MP_UINT32          count,
    MP_TPG_STATE_PAIR *pTpgStateList
);

/**
 ******************************************************************************
 *
 * The APIs that are associated with event support.
 *
 * - MP_RegisterForObjectPropertyChanges
 * - MP_DeregisterForObjectPropertyChanges
 * - MP_RegisterForObjectVisibilityChanges
 * - MP_DeregisterForObjectVisibilityChanges
 *
 ******************************************************************************
 */

/**
 *******************************************************************************
 *
 * Registers a client function that is to be called
 * whenever the property of an an object changes.
 *
 * @param  pClientFn,
 *      A pointer to an MP_OBJECT_PROPERTY_FN function defined by the
 *      client. On successful return this function will be called to
 *      inform the client of objects that have had one or more properties
 *      change.
 *
 * @param  objectType
 *      The type of object the client wishes to deregister for
 *      property change callbacks. If null, then all objects types are
 *      deregistered.
 *
 * @param  pCallerData
 *      A pointer that is passed to the callback routine with each event.
 *      This may be used by the caller to correlate the event to source of
 *      the registration.
 *
 * @param  pluginOid
 *      A plugin oid that the client wishes to deregister for property change.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pClientFn is NULL or specifies a memory area
 *      that is not executable.
 *
 * @retval MP_STATUS_FN_REPLACED
 *      Returned when an existing client function is replaced with the one
 *      specified in pClientFn.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if objectType does not specify any valid object type.
 *
 *******************************************************************************
 */
MP_STATUS MP_RegisterForObjectPropertyChanges(
    MP_OBJECT_PROPERTY_FN   pClientFn,
    MP_OBJECT_TYPE	    objectType,
    void		    *pCallerData,
    MP_OID		    pluginOid
);

/**
 *******************************************************************************
 *
 * Deregisters a previously registered client function that is to be invoked
 * whenever an object's property changes.
 *
 * @param  pClientFn,
 *      A pointer to an MP_OBJECT_PROPERTY_FN function defined by the
 *      client that was previously registered using
 *      the MP_RegisterForObjectPropertyChanges API. On successful return
 *      this function will no longer be called to inform the client of
 *      object property changes.
 *
 * @param  objectType
 *      The type of object the client wishes to deregister for
 *      property change callbacks. If null, then all objects types are
 *      deregistered.
 *
 * @param  pluginOid
 *      A plugin oid that the client wishes to deregister for property change.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pClientFn is NULL or specifies a memory area
 *      that is not executable.
 *
 * @retval MP_STATUS_UNKNOWN_FN
 *      Returned if pClientFn is not the same as the previously registered
 *      function.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if objectType does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *          Returned if pClientFn deregistration is not possible at this time.
 *
 *******************************************************************************
 */
MP_STATUS MP_DeregisterForObjectPropertyChanges(
    MP_OBJECT_PROPERTY_FN   pClientFn,
    MP_OBJECT_TYPE	    objectType,
    MP_OID		    pluginOid
);

/**
 *******************************************************************************
 *
 * Registers a client function that is to be called
 * whenever a high level object appears or disappears.
 *
 * @param  pClientFn,
 *      A pointer to an MP_OBJECT_VISIBILITY_FN function defined by the
 *      client. On successful return this function will be called to
 *      inform the client of objects whose visibility has changed.
 *
 * @param  objectType
 *      The type of object the client wishes to deregister for
 *      property change callbacks. If null, then all objects types are
 *      deregistered.
 *
 * @param  pCallerData
 *      A pointer that is passed to the callback routine with each event.
 *      This may be used by the caller to correlate the event to source of
 *      the registration.
 *
 * @param  pluginOid
 *      A plugin oid that the client wishes to deregister for property change.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pClientFn is NULL or specifies a memory area
 *      that is not executable.
 *
 * @retval MP_STATUS_FN_REPLACED
 *      Returned when an existing client function is replaced with the one
 *      specified in pClientFn.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if objectType does not specify any valid object type.
 *
 *******************************************************************************
 */
MP_STATUS MP_RegisterForObjectVisibilityChanges(
    MP_OBJECT_VISIBILITY_FN pClientFn,
    MP_OBJECT_TYPE	    objectType,
    void		    *pCallerData,
    MP_OID		    pluginOid
);

/**
 *******************************************************************************
 *
 * Deregisters a previously registered client function that is to be invoked
 * whenever a high level object appears or disappears.
 *
 * @param  pClientFn,
 *      A pointer to an MP_OBJECT_VISIBILITY_FN function defined by the
 *      client that was previously registered using
 *      the MP_RegisterForObjectVisibilityChanges API. On successful return
 *      this function will no longer be called to inform the client of
 *      object property changes.
 *
 * @param  objectType
 *      The type of object the client wishes to deregister for visibility
 *      change callbacks. If null, then all objects types are
 *      deregistered.
 *
 * @param  pluginOid
 *      A plugin oid that the client wishes to deregister for property change.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the operation is successful.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pClientFn is NULL or specifies a memory area
 *      that is not executable.
 *
 * @retval MP_STATUS_UNKNOWN_FN
 *      Returned if pClientFn is not the same as the previously registered
 *      function.
 *
 * @retval MP_STATUS_INVALID_OBJECT_TYPE
 *          Returned if objectType does not specify any valid object type.
 *
 * @retval MP_STATUS_FAILED
 *          Returned if pClientFn deregistration is not possible at this time.
 *
 *******************************************************************************
 */
MP_STATUS MP_DeregisterForObjectVisibilityChanges(
    MP_OBJECT_VISIBILITY_FN pClientFn,
    MP_OBJECT_TYPE          objectType,
    MP_OID		    pluginOid
);

/**
 ******************************************************************************
 *
 * The utility APIs
 *
 * - MP_CompareOIDs
 * - MP_FreeOidList
 * - MP_RegisterPlugin
 * - MP_DeregisterPlugin
 *
 ******************************************************************************
 */

/**
 *******************************************************************************
 *
 * Compare two Oids for equality to see whether they refer to the same object.
 *
 * @param  oid1
 *          Oid to compare.
 *
 * @param  oid2
 *          Oid to compare.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when the two Oids do refer to the same object.
 *
 * @retval MP_STATUS_FAILED
 *      Returned if the Oids don't compare.
 *
 *******************************************************************************
 */
MP_STATUS MP_CompareOIDs(
    MP_OID oid1,
    MP_OID oid2
);

/**
 *******************************************************************************
 *
 * Frees memory returned by an MP API.
 *
 * @param  pMemory
 *      A pointer to the memory returned by an MP API. On successful
        return, the allocated memory is freed.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when pPluginId is deregistered successfully.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pMemory is NULL or specifies a memory area to which
 *      data cannot be written.
 *
 *******************************************************************************
 */
MP_STATUS MP_FreeOidList(
    MP_OID_LIST *pOidList
);

/**
 *******************************************************************************
 *
 * Registers a plugin with common library.  The implementation of this routine
 * is based on configuration file /etc/mpapi.conf that contains a list of
 * plugin libraries.
 *
 * @param  pPluginId
 *      A pointer to the key name shall be the reversed domain name of
 *      the vendor followed by followed by the vendor specific name for
 *      the plugin that uniquely identifies the plugin.
 *
 * @param  pFileName
 *      The full path to the plugin library.
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when pPluginId is deregistered successfully.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pPluginId is NULL or specifies a memory area that
 *      is not executable.
 *
 * @retval MP_STATUS_FAILED
 *          Returned if pClientFn deregistration is not possible at this time.
 *
 *******************************************************************************
 */
MP_STATUS MP_RegisterPlugin(
    MP_WCHAR *pPluginId,
    MP_CHAR *pFileName
);

/**
 *******************************************************************************
 *
 * Deregisters a plugin from the common library.
 *
 * @param  pPluginId
 *      A pointer to a Plugin ID previously registered using
 *      the MP_RegisterPlugin API..
 *
 * @return An MP_STATUS indicating if the operation was successful or if
 *         an error occurred.
 *
 * @retval MP_STATUS_SUCCESS
 *         Returned when pPluginId is deregistered successfully.
 *
 * @retval MP_STATUS_INVALID_PARAMETER
 *      Returned if pPluginId is NULL or specifies a memory area that
 *      is not executable.
 *
 * @retval MP_STATUS_FAILED
 *          Returned if pClientFn deregistration is not possible at this time.
 *
 *******************************************************************************
 */
MP_STATUS MP_DeregisterPlugin(
    MP_WCHAR *pPluginId
);

#endif

#ifdef __cplusplus
};
#endif

