/*
 * Copyright (C) 2017 Red Hat, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Author: Gris Ge <fge@redhat.com>
 */

#ifndef _LIB_OPEN_ISCSI_USR_SESSION_H_
#define _LIB_OPEN_ISCSI_USR_SESSION_H_

#include "libopeniscsiusr_common.h"

#include <stdint.h>

/**
 * iscsi_session_sid_get() - Retrieve iSCSI session ID of specified session.
 *
 * Retrieve iSCSI session ID. The session ID here is the integer used
 * in '/sys/class/iscsi_session/session<session_id>/'
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	uint32_t.
 */
__DLL_EXPORT uint32_t iscsi_session_sid_get(struct iscsi_session *se);

/**
 * iscsi_session_persistent_address_get() - Retrieve iSCSI target persistent
 * address of specified session
 *
 * Retrieve the iSCSI target persistent address of specified iSCSI session.
 * The 'persistent address' is the network address where iSCSI initiator send
 * initial request. When iSCSI redirection in use, this address might not be
 * the network address used for actual iSCSI transaction.
 * Please use `iscsi_session_address_get()` for target network address of
 * iSCSI transaction.
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	const char *. Empty string if not supported.
 *	No need to free this memory, the resources will get freed by
 *	iscsi_session_free() or iscsi_sessions_free().
 */
__DLL_EXPORT const char *iscsi_session_persistent_address_get
	(struct iscsi_session *se);

/**
 * iscsi_session_persistent_port_get() - Retrieve iSCSI target persistent
 * port of specified session
 *
 * Retrieve the iSCSI target persistent port of specified iSCSI session.
 * The 'persistent port' is the network port where iSCSI initiator send
 * initial request. When iSCSI redirection in use, this port might not be
 * the network port used for actual iSCSI transaction.
 * Please use `iscsi_session_port_get()` for target network address of
 * iSCSI transaction.
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	int32_t. -1 if not supported.
 */
__DLL_EXPORT int32_t iscsi_session_persistent_port_get
	(struct iscsi_session *se);

/**
 * iscsi_session_target_name_get() - Retrieve iSCSI target name of specified
 * session
 *
 * Retrieve the iSCSI target name of specified iSCSI session.
 * The iSCSI Target Name specifies the worldwide unique name of the target.
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	const char *.
 *	No need to free this memory, the resources will get freed by
 *	iscsi_session_free() or iscsi_sessions_free().
 */
__DLL_EXPORT const char *iscsi_session_target_name_get
	(struct iscsi_session *se);

/**
 * iscsi_session_username_get() - Retrieve authentication username of specified
 * session.
 *
 * Retrieve the authentication username of specified iSCSI session.
 * Currently open-iscsi only support CHAP authentication method.
 * It's controlled this setting in iscsid.conf:
 * 'node.session.auth.username'
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	const char *. Empty string if not using CHAP authentication or failed
 *	to read authentication information.
 *	No need to free this memory, the resources will get freed by
 *	iscsi_session_free() or iscsi_sessions_free().
 */
__DLL_EXPORT const char *iscsi_session_username_get(struct iscsi_session *se);

/**
 * iscsi_session_password_get() - Retrieve authentication password of specified
 * session.
 *
 * Retrieve the authentication password of specified iSCSI session.
 * Currently open-iscsi only support CHAP authentication method.
 * It's controlled this setting in iscsid.conf:
 * 'node.session.auth.password'
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	const char *. Empty string if not using CHAP authentication or failed
 *	to read authentication information.
 *	No need to free this memory, the resources will get freed by
 *	iscsi_session_free() or iscsi_sessions_free().
 */
__DLL_EXPORT const char *iscsi_session_password_get(struct iscsi_session *se);

/**
 * iscsi_session_username_in_get() - Retrieve authentication username of
 * specified session.
 *
 * Retrieve the inbound authentication username of specified iSCSI session.
 * Currently open-iscsi only support CHAP authentication method.
 * The inbound authentication here means the iSCSI initiator authenticates the
 * iSCSI target using CHAP.
 * It's controlled this setting in iscsid.conf:
 * 'node.session.auth.username_in'
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	const char *. Empty string if not using inbound CHAP authentication or
 *	failed to read authentication information.
 *	No need to free this memory, the resources will get freed by
 *	iscsi_session_free() or iscsi_sessions_free().
 */
__DLL_EXPORT const char *iscsi_session_username_in_get
	(struct iscsi_session *se);

/**
 * iscsi_session_password_in_get() - Retrieve authentication password of
 * specified session.
 *
 * Retrieve the inbound authentication password of specified iSCSI session.
 * Currently open-iscsi only support CHAP authentication method.
 * The inbound authentication here means the iSCSI initiator authenticates the
 * iSCSI target using CHAP.
 * It's controlled this setting in iscsid.conf:
 * 'node.session.auth.password_in'
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	const char *. Empty string if not using inbound CHAP authentication or
 *	failed to read authentication information.
 *	No need to free this memory, the resources will get freed by
 *	iscsi_session_free() or iscsi_sessions_free().
 */
__DLL_EXPORT const char *iscsi_session_password_in_get
	(struct iscsi_session *se);

/**
 * iscsi_session_recovery_tmo_get() - Retrieve recovery timeout value of
 * specified session
 *
 * Retrieve the recovery timeout value of specified iSCSI session.
 * The recovery timeout here means the seconds of time to wait for session
 * re-establishment before failing SCSI commands back to the application when
 * running the Linux SCSI Layer error handler.
 * It could be controlled via this setting in iscsid.conf:
 * 'node.session.timeo.replacement_timeout'.
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	int32_t. If the value is 0, IO will be failed immediately. If the value
 *	is less than 0, IO will remain queued until the session is logged back
 *	in, or until the user runs the logout command.
 */
__DLL_EXPORT int32_t iscsi_session_recovery_tmo_get(struct iscsi_session *se);

/**
 * iscsi_session_lu_reset_tmo_get() - Retrieve logical unit timeout value of
 * specified session
 *
 * Retrieve the logical unit timeout value of specified iSCSI session.
 * The logical unit timeout here means the seconds of time to wait for a logical
 * unit response before before failing the operation and trying session
 * re-establishment.
 * It could be controlled via this setting in iscsid.conf:
 * 'node.session.err_timeo.lu_reset_timeout'
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	int32_t. -1 if not supported.
 */
__DLL_EXPORT int32_t iscsi_session_lu_reset_tmo_get(struct iscsi_session *se);

/**
 * iscsi_session_tgt_reset_tmo_get() - Retrieve target response timeout value of
 * of specified session
 *
 * Retrieve the target response timeout value of specified iSCSI session.
 * The target response timeout here means the seconds of time to wait for a
 * target response before before failing the operation and trying session
 * re-establishment.
 * It could be controlled via this setting in iscsid.conf:
 * 'node.session.err_timeo.tgt_reset_timeout'.
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	int32_t. -1 if not supported.
 */
__DLL_EXPORT int32_t iscsi_session_tgt_reset_tmo_get(struct iscsi_session *se);

/**
 * iscsi_session_abort_tmo_get() - Retrieve abort response timeout value of
 * specified session
 *
 * Retrieve the abort response timeout value of specified iSCSI session.
 * The abort response timeout here means the seconds of time to wait for a
 * abort response before before failing the operation and trying session
 * re-establishment.
 * It could be controlled via this setting in iscsid.conf:
 * 'node.session.err_timeo.abort_timeout'.
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	int32_t. -1 if not supported.
 */
__DLL_EXPORT int32_t iscsi_session_abort_tmo_get(struct iscsi_session *se);

/**
 * iscsi_session_tpgt_get() - Retrieve target portal group tag of specified
 * session
 *
 * Retrieve the target portal group tag of specified iSCSI session.
 *
 * The target portal group tag is a value that uniquely identifies a portal
 * group within an iSCSI target node. This key carries the value of the tag of
 * the portal group that is servicing the Login request. The iSCSI target
 * returns this key to the initiator in the Login Response PDU to the first
 * Login Request PDU that has the C bit set to 0 when TargetName is given by the
 * initiator.
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	int32_t. -1 if not supported.
 */
__DLL_EXPORT int32_t iscsi_session_tpgt_get(struct iscsi_session *se);

/**
 * iscsi_session_address_get() - Retrieve iSCSI target address of specified
 * session
 *
 * Retrieve the iSCSI target network address of specified iSCSI session.
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	const char *. Empty string if not supported.
 *	No need to free this memory, the resources will get freed by
 *	iscsi_session_free() or iscsi_sessions_free().
 */
__DLL_EXPORT const char *iscsi_session_address_get
	(struct iscsi_session *se);

/**
 * iscsi_session_port_get() - Retrieve iSCSI target port of specified session
 *
 * Retrieve the iSCSI target port of specified iSCSI session.
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	int32_t. -1 if not supported.
 */
__DLL_EXPORT int32_t iscsi_session_port_get(struct iscsi_session *se);

/**
 * iscsi_session_address_get() - Retrieve iSCSI interface information of
 * specified session
 *
 * Retrieve the iSCSI interface information of specified iSCSI session.
 * For the properties of 'struct iscsi_iface', please refer to the functions
 * defined in 'libopeniscsiusr_iface.h' file.
 *
 * @se:
 *	Pointer of 'struct iscsi_session'.
 *	If this pointer is NULL, your program will be terminated by assert.
 *
 * Return:
 *	Pointer of 'struct iscsi_iface'. NULL if not supported.
 *	No need to free this memory, the resources will get freed by
 *	iscsi_session_free() or iscsi_sessions_free().
 */
__DLL_EXPORT struct iscsi_iface *iscsi_session_iface_get
	(struct iscsi_session *se);

#endif /* End of _LIB_OPEN_ISCSI_USR_SESSION_H_ */
