Blame usr/session_info.c

Packit eace71
#include <stdlib.h>
Packit eace71
#include <stdio.h>
Packit eace71
#include <errno.h>
Packit eace71
#include <stdint.h>
Packit eace71
#include <inttypes.h>
Packit eace71
Packit eace71
#include <libopeniscsiusr/libopeniscsiusr.h>
Packit eace71
Packit eace71
#include "list.h"
Packit eace71
#include "log.h"
Packit eace71
#include "iscsi_sysfs.h"
Packit eace71
#include "version.h"
Packit eace71
#include "iscsi_settings.h"
Packit eace71
#include "mgmt_ipc.h"
Packit eace71
#include "session_info.h"
Packit eace71
#include "transport.h"
Packit eace71
#include "initiator.h"
Packit eace71
#include "iface.h"
Packit eace71
#include "iscsid_req.h"
Packit eace71
#include "iscsi_err.h"
Packit eace71
Packit eace71
static int session_info_print_flat(struct iscsi_session *se);
Packit eace71
Packit eace71
int session_info_create_list(void *data, struct session_info *info)
Packit eace71
{
Packit eace71
	struct session_link_info *link_info = data;
Packit eace71
	struct list_head *list = link_info->list;
Packit eace71
	struct session_info *new, *curr, *match = NULL;
Packit eace71
Packit eace71
	if (link_info->match_fn && !link_info->match_fn(link_info->data, info))
Packit eace71
		return -1;
Packit eace71
Packit eace71
	new = calloc(1, sizeof(*new));
Packit eace71
	if (!new)
Packit eace71
		return ISCSI_ERR_NOMEM;
Packit eace71
	memcpy(new, info, sizeof(*new));
Packit eace71
	INIT_LIST_HEAD(&new->list);
Packit eace71
Packit eace71
	if (list_empty(list)) {
Packit eace71
		list_add_tail(&new->list, list);
Packit eace71
		return 0;
Packit eace71
	}
Packit eace71
Packit eace71
	list_for_each_entry(curr, list, list) {
Packit eace71
		if (!strcmp(curr->targetname, info->targetname)) {
Packit eace71
			match = curr;
Packit eace71
Packit eace71
			if (!strcmp(curr->address, info->address)) {
Packit eace71
				match = curr;
Packit eace71
Packit eace71
				if (curr->port == info->port) {
Packit eace71
					match = curr;
Packit eace71
					break;
Packit eace71
				}
Packit eace71
			}
Packit eace71
		}
Packit eace71
	}
Packit eace71
Packit eace71
	list_add_tail(&new->list, match ? match->list.next : list);
Packit eace71
	return 0;
Packit eace71
}
Packit eace71
Packit eace71
void session_info_free_list(struct list_head *list)
Packit eace71
{
Packit eace71
	struct session_info *curr, *tmp;
Packit eace71
Packit eace71
	list_for_each_entry_safe(curr, tmp, list, list) {
Packit eace71
		list_del(&curr->list);
Packit eace71
		free(curr);
Packit eace71
	}
Packit eace71
}
Packit eace71
Packit eace71
static char *get_iscsi_node_type(uint32_t sid)
Packit eace71
{
Packit eace71
	int pid = iscsi_sysfs_session_user_created((int) sid);
Packit eace71
Packit eace71
	if (!pid)
Packit eace71
		return "flash";
Packit eace71
	else
Packit eace71
		return "non-flash";
Packit eace71
}
Packit eace71
Packit eace71
static int session_info_print_flat(struct iscsi_session *se)
Packit eace71
{
Packit eace71
	uint32_t sid = 0;
Packit eace71
	struct iscsi_transport *t = NULL;
Packit eace71
Packit eace71
	sid = iscsi_session_sid_get(se);
Packit eace71
	t = iscsi_sysfs_get_transport_by_sid((int) sid);
Packit eace71
Packit eace71
	if (strchr(iscsi_session_persistent_address_get(se), '.'))
Packit eace71
		printf("%s: [%" PRIu32 "] %s:%" PRIi32 ",%"PRIi32 " %s (%s)\n",
Packit eace71
			t ? t->name : UNKNOWN_VALUE,
Packit eace71
			sid, iscsi_session_persistent_address_get(se),
Packit eace71
			iscsi_session_persistent_port_get(se),
Packit eace71
			iscsi_session_tpgt_get(se),
Packit eace71
			iscsi_session_target_name_get(se),
Packit eace71
			get_iscsi_node_type(sid));
Packit eace71
	else
Packit eace71
		printf("%s: [%" PRIu32 "] [%s]:%" PRIi32 ",%" PRIi32
Packit eace71
		       " %s (%s)\n",
Packit eace71
			t ? t->name : UNKNOWN_VALUE,
Packit eace71
			sid, iscsi_session_persistent_address_get(se),
Packit eace71
			iscsi_session_persistent_port_get(se),
Packit eace71
			iscsi_session_tpgt_get(se),
Packit eace71
			iscsi_session_target_name_get(se),
Packit eace71
			get_iscsi_node_type(sid));
Packit eace71
	return 0;
Packit eace71
}
Packit eace71
Packit eace71
static int print_iscsi_state(int sid, char *prefix, int tmo)
Packit eace71
{
Packit eace71
	iscsiadm_req_t req;
Packit eace71
	iscsiadm_rsp_t rsp;
Packit eace71
	int err;
Packit eace71
	char *state = NULL;
Packit eace71
	char state_buff[SCSI_MAX_STATE_VALUE];
Packit eace71
	static char *conn_state[] = {
Packit eace71
		"FREE",
Packit eace71
		"TRANSPORT WAIT",
Packit eace71
		"IN LOGIN",
Packit eace71
		"LOGGED IN",
Packit eace71
		"IN LOGOUT",
Packit eace71
		"LOGOUT REQUESTED",
Packit eace71
		"CLEANUP WAIT",
Packit eace71
	};
Packit eace71
	static char *session_state[] = {
Packit eace71
		"NO CHANGE",
Packit eace71
		"CLEANUP",
Packit eace71
		"REOPEN",
Packit eace71
		"REDIRECT",
Packit eace71
	};
Packit eace71
Packit eace71
	memset(&req, 0, sizeof(iscsiadm_req_t));
Packit eace71
	req.command = MGMT_IPC_SESSION_INFO;
Packit eace71
	req.u.session.sid = sid;
Packit eace71
Packit eace71
	err = iscsid_exec_req(&req, &rsp, 1, tmo);
Packit eace71
	/*
Packit eace71
	 * for drivers like qla4xxx, iscsid does not display
Packit eace71
	 * anything here since it does not know about it.
Packit eace71
	 */
Packit eace71
	if (!err && rsp.u.session_state.conn_state >= 0 &&
Packit eace71
	    rsp.u.session_state.conn_state <= ISCSI_CONN_STATE_CLEANUP_WAIT)
Packit eace71
		state = conn_state[rsp.u.session_state.conn_state];
Packit eace71
	printf("%s\t\tiSCSI Connection State: %s\n", prefix,
Packit eace71
	       state ? state : "Unknown");
Packit eace71
	state = NULL;
Packit eace71
Packit eace71
	memset(state_buff, 0, SCSI_MAX_STATE_VALUE);
Packit eace71
	if (!iscsi_sysfs_get_session_state(state_buff, sid))
Packit eace71
		printf("%s\t\tiSCSI Session State: %s\n", prefix, state_buff);
Packit eace71
	else
Packit eace71
		printf("%s\t\tiSCSI Session State: Unknown\n", prefix);
Packit eace71
Packit eace71
	if (!err && rsp.u.session_state.session_state >= 0 &&
Packit eace71
	   rsp.u.session_state.session_state <= R_STAGE_SESSION_REDIRECT)
Packit eace71
		state = session_state[rsp.u.session_state.session_state];
Packit eace71
	printf("%s\t\tInternal iscsid Session State: %s\n", prefix,
Packit eace71
	       state ? state : "Unknown");
Packit eace71
	return 0;
Packit eace71
}
Packit eace71
Packit eace71
static void print_iscsi_params(int sid, char *prefix)
Packit eace71
{
Packit eace71
	struct iscsi_session_operational_config session_conf;
Packit eace71
	struct iscsi_conn_operational_config conn_conf;
Packit eace71
Packit eace71
	iscsi_sysfs_get_negotiated_session_conf(sid, &session_conf);
Packit eace71
	iscsi_sysfs_get_negotiated_conn_conf(sid, &conn_conf);
Packit eace71
Packit eace71
	printf("%s\t\t************************\n", prefix);
Packit eace71
	printf("%s\t\tNegotiated iSCSI params:\n", prefix);
Packit eace71
	printf("%s\t\t************************\n", prefix);
Packit eace71
Packit eace71
	if (is_valid_operational_value(conn_conf.HeaderDigest))
Packit eace71
		printf("%s\t\tHeaderDigest: %s\n", prefix,
Packit eace71
			conn_conf.HeaderDigest ? "CRC32C" : "None");
Packit eace71
	if (is_valid_operational_value(conn_conf.DataDigest))
Packit eace71
		printf("%s\t\tDataDigest: %s\n", prefix,
Packit eace71
			conn_conf.DataDigest ? "CRC32C" : "None");
Packit eace71
	if (is_valid_operational_value(conn_conf.MaxRecvDataSegmentLength))
Packit eace71
		printf("%s\t\tMaxRecvDataSegmentLength: %d\n", prefix,
Packit eace71
			conn_conf.MaxRecvDataSegmentLength);
Packit eace71
	if (is_valid_operational_value(conn_conf.MaxXmitDataSegmentLength))
Packit eace71
		printf("%s\t\tMaxXmitDataSegmentLength: %d\n", prefix,
Packit eace71
			conn_conf.MaxXmitDataSegmentLength);
Packit eace71
	if (is_valid_operational_value(session_conf.FirstBurstLength))
Packit eace71
		printf("%s\t\tFirstBurstLength: %d\n", prefix,
Packit eace71
			session_conf.FirstBurstLength);
Packit eace71
	if (is_valid_operational_value(session_conf.MaxBurstLength))
Packit eace71
		printf("%s\t\tMaxBurstLength: %d\n", prefix,
Packit eace71
			session_conf.MaxBurstLength);
Packit eace71
	if (is_valid_operational_value(session_conf.ImmediateData))
Packit eace71
		printf("%s\t\tImmediateData: %s\n", prefix,
Packit eace71
			session_conf.ImmediateData ? "Yes" : "No");
Packit eace71
	if (is_valid_operational_value(session_conf.InitialR2T))
Packit eace71
		printf("%s\t\tInitialR2T: %s\n", prefix,
Packit eace71
			session_conf.InitialR2T ? "Yes" : "No");
Packit eace71
	if (is_valid_operational_value(session_conf.MaxOutstandingR2T))
Packit eace71
		printf("%s\t\tMaxOutstandingR2T: %d\n", prefix,
Packit eace71
			session_conf.MaxOutstandingR2T);
Packit eace71
}
Packit eace71
Packit eace71
static void print_scsi_device_info(void *data, int host_no, int target, int lun)
Packit eace71
{
Packit eace71
	char *prefix = data;
Packit eace71
	char *blockdev, state[SCSI_MAX_STATE_VALUE];
Packit eace71
Packit eace71
	printf("%s\t\tscsi%d Channel 00 Id %d Lun: %d\n", prefix, host_no,
Packit eace71
	       target, lun);
Packit eace71
	blockdev = iscsi_sysfs_get_blockdev_from_lun(host_no, target, lun);
Packit eace71
	if (blockdev) {
Packit eace71
		printf("%s\t\t\tAttached scsi disk %s\t\t", prefix, blockdev);
Packit eace71
		free(blockdev);
Packit eace71
Packit eace71
		if (!iscsi_sysfs_get_device_state(state, host_no, target, lun))
Packit eace71
			printf("State: %s\n", state);
Packit eace71
		else
Packit eace71
			printf("State: Unknown\n");
Packit eace71
	}
Packit eace71
}
Packit eace71
Packit eace71
static int print_scsi_state(int sid, char *prefix, unsigned int flags)
Packit eace71
{
Packit eace71
	int host_no = -1, err = 0;
Packit eace71
	char state[SCSI_MAX_STATE_VALUE];
Packit eace71
Packit eace71
	printf("%s\t\t************************\n", prefix);
Packit eace71
	printf("%s\t\tAttached SCSI devices:\n", prefix);
Packit eace71
	printf("%s\t\t************************\n", prefix);
Packit eace71
Packit eace71
	host_no = iscsi_sysfs_get_host_no_from_sid(sid, &err;;
Packit eace71
	if (err) {
Packit eace71
		printf("%s\t\tUnavailable\n", prefix);
Packit eace71
		return err;
Packit eace71
	}
Packit eace71
Packit eace71
	if (flags & SESSION_INFO_HOST_DEVS) {
Packit eace71
		printf("%s\t\tHost Number: %d\t", prefix, host_no);
Packit eace71
		if (!iscsi_sysfs_get_host_state(state, host_no))
Packit eace71
			printf("State: %s\n", state);
Packit eace71
		else
Packit eace71
			printf("State: Unknown\n");
Packit eace71
	}
Packit eace71
Packit eace71
	if (flags & SESSION_INFO_SCSI_DEVS)
Packit eace71
		iscsi_sysfs_for_each_device(prefix, host_no, sid,
Packit eace71
					    print_scsi_device_info);
Packit eace71
	return 0;
Packit eace71
}
Packit eace71
Packit eace71
void session_info_print_tree(struct iscsi_session **ses, uint32_t se_count,
Packit eace71
			     char *prefix, unsigned int flags, int do_show)
Packit eace71
{
Packit eace71
	struct iscsi_session *curr = NULL;
Packit eace71
	struct iscsi_session *prev = NULL;
Packit eace71
	const char *curr_targetname = NULL;
Packit eace71
	const char *curr_address = NULL;
Packit eace71
	const char *persistent_address = NULL;
Packit eace71
	const char *prev_targetname = NULL;
Packit eace71
	const char *prev_address = NULL;
Packit eace71
	int32_t curr_port = 0;
Packit eace71
	int32_t prev_port = 0;
Packit eace71
	uint32_t i = 0;
Packit eace71
	uint32_t sid = 0;
Packit eace71
	char *new_prefix = NULL;
Packit eace71
	int32_t tgt_reset_tmo = -1;
Packit eace71
	int32_t lu_reset_tmo = -1;
Packit eace71
	int32_t abort_tmo = -1;
Packit eace71
	const char *pass = NULL;
Packit eace71
Packit eace71
	for (i = 0; i < se_count; ++i) {
Packit eace71
		curr = ses[i];
Packit eace71
		curr_targetname = iscsi_session_target_name_get(curr);
Packit eace71
		sid = iscsi_session_sid_get(curr);
Packit eace71
		if (prev != NULL)
Packit eace71
			prev_targetname = iscsi_session_target_name_get(prev);
Packit eace71
		else
Packit eace71
			prev_targetname = NULL;
Packit eace71
Packit eace71
		if (! ((prev_targetname != NULL) &&
Packit eace71
		       (curr_targetname != NULL) &&
Packit eace71
		       (strcmp(prev_targetname, curr_targetname) == 0))) {
Packit eace71
			printf("%sTarget: %s (%s)\n", prefix, curr_targetname,
Packit eace71
				get_iscsi_node_type(sid));
Packit eace71
			prev = NULL;
Packit eace71
		}
Packit eace71
		curr_address = iscsi_session_address_get(curr);
Packit eace71
		curr_port = iscsi_session_port_get(curr);
Packit eace71
Packit eace71
		if (prev != NULL) {
Packit eace71
			prev_address = iscsi_session_address_get(prev);
Packit eace71
			prev_port = iscsi_session_port_get(prev);
Packit eace71
		} else {
Packit eace71
			prev_address = NULL;
Packit eace71
			prev_port = 0;
Packit eace71
		}
Packit eace71
		if (! ((prev_address != NULL) &&
Packit eace71
		       (curr_address != NULL) &&
Packit eace71
		       (prev_port != 0) &&
Packit eace71
		       (curr_port != 0) &&
Packit eace71
		       (strcmp(prev_address, curr_address) == 0) &&
Packit eace71
		       (curr_port == prev_port))) {
Packit eace71
			if (strchr(curr_address, '.'))
Packit eace71
				printf("%s\tCurrent Portal: %s:%" PRIi32
Packit eace71
				       ",%" PRIi32 "\n",
Packit eace71
				       prefix, curr_address, curr_port,
Packit eace71
				       iscsi_session_tpgt_get(curr));
Packit eace71
			else
Packit eace71
				printf("%s\tCurrent Portal: [%s]:%" PRIi32
Packit eace71
				       ",%" PRIi32 "\n",
Packit eace71
				       prefix, curr_address, curr_port,
Packit eace71
				       iscsi_session_tpgt_get(curr));
Packit eace71
			persistent_address =
Packit eace71
				iscsi_session_persistent_address_get(curr);
Packit eace71
Packit eace71
			if (strchr(persistent_address, '.'))
Packit eace71
				printf("%s\tPersistent Portal: %s:%" PRIi32
Packit eace71
				       ",%" PRIi32 "\n",
Packit eace71
				       prefix, persistent_address,
Packit eace71
				       iscsi_session_persistent_port_get(curr),
Packit eace71
				       iscsi_session_tpgt_get(curr));
Packit eace71
			else
Packit eace71
				printf("%s\tPersistent Portal: [%s]:%" PRIi32
Packit eace71
				       ",%" PRIi32 "\n",
Packit eace71
				       prefix, persistent_address,
Packit eace71
				       iscsi_session_persistent_port_get(curr),
Packit eace71
				       iscsi_session_tpgt_get(curr));
Packit eace71
		} else
Packit eace71
			printf("\n");
Packit eace71
Packit eace71
		if (flags & SESSION_INFO_IFACE) {
Packit eace71
			printf("%s\t\t**********\n", prefix);
Packit eace71
			printf("%s\t\tInterface:\n", prefix);
Packit eace71
			printf("%s\t\t**********\n", prefix);
Packit eace71
Packit eace71
			new_prefix = calloc(1, 1 + strlen(prefix) +
Packit eace71
					    strlen("\t\t"));
Packit eace71
			if (new_prefix == NULL) {
Packit eace71
				printf("Could not print interface info. "
Packit eace71
					"Out of Memory.\n");
Packit eace71
				return;
Packit eace71
			} else {
Packit eace71
				sprintf(new_prefix, "%s%s", prefix, "\t\t");
Packit eace71
				iface_print(iscsi_session_iface_get(curr),
Packit eace71
					    new_prefix);
Packit eace71
			}
Packit eace71
			free(new_prefix);
Packit eace71
		}
Packit eace71
Packit eace71
		if (flags & SESSION_INFO_ISCSI_STATE) {
Packit eace71
			printf("%s\t\tSID: %" PRIu32 "\n", prefix, sid);
Packit eace71
			print_iscsi_state((int) sid, prefix, -1 /* tmo */);
Packit eace71
			/* TODO(Gris Ge): It seems in the whole project,
Packit eace71
			 *		  tmo is always -1, correct?
Packit eace71
			 */
Packit eace71
		}
Packit eace71
Packit eace71
		if (flags & SESSION_INFO_ISCSI_TIM) {
Packit eace71
			printf("%s\t\t*********\n", prefix);
Packit eace71
			printf("%s\t\tTimeouts:\n", prefix);
Packit eace71
			printf("%s\t\t*********\n", prefix);
Packit eace71
Packit eace71
			printf("%s\t\tRecovery Timeout: %" PRIi32 "\n", prefix,
Packit eace71
			       iscsi_session_recovery_tmo_get(curr));
Packit eace71
Packit eace71
			tgt_reset_tmo = iscsi_session_tgt_reset_tmo_get(curr);
Packit eace71
			lu_reset_tmo = iscsi_session_lu_reset_tmo_get(curr);
Packit eace71
			abort_tmo = iscsi_session_abort_tmo_get(curr);
Packit eace71
Packit eace71
			if (tgt_reset_tmo >= 0)
Packit eace71
				printf("%s\t\tTarget Reset Timeout: %" PRIi32
Packit eace71
				       "\n", prefix, tgt_reset_tmo);
Packit eace71
			else
Packit eace71
				printf("%s\t\tTarget Reset Timeout: %s\n",
Packit eace71
					prefix, UNKNOWN_VALUE);
Packit eace71
Packit eace71
			if (lu_reset_tmo >= 0)
Packit eace71
				printf("%s\t\tLUN Reset Timeout: %" PRIi32 "\n",
Packit eace71
				       prefix, lu_reset_tmo);
Packit eace71
			else
Packit eace71
				printf("%s\t\tLUN Reset Timeout: %s\n", prefix,
Packit eace71
					UNKNOWN_VALUE);
Packit eace71
Packit eace71
			if (abort_tmo >= 0)
Packit eace71
				printf("%s\t\tAbort Timeout: %" PRIi32 "\n",
Packit eace71
				       prefix, abort_tmo);
Packit eace71
			else
Packit eace71
				printf("%s\t\tAbort Timeout: %s\n", prefix,
Packit eace71
					UNKNOWN_VALUE);
Packit eace71
Packit eace71
		}
Packit eace71
		if (flags & SESSION_INFO_ISCSI_AUTH) {
Packit eace71
			printf("%s\t\t*****\n", prefix);
Packit eace71
			printf("%s\t\tCHAP:\n", prefix);
Packit eace71
			printf("%s\t\t*****\n", prefix);
Packit eace71
			printf("%s\t\tusername: %s\n", prefix,
Packit eace71
			       strlen(iscsi_session_username_get(curr)) ?
Packit eace71
			       iscsi_session_username_get(curr) :
Packit eace71
			       UNKNOWN_VALUE);
Packit eace71
Packit eace71
			if (!do_show)
Packit eace71
				printf("%s\t\tpassword: %s\n", prefix,
Packit eace71
					"********");
Packit eace71
			else {
Packit eace71
				pass = iscsi_session_password_get(curr);
Packit eace71
				printf("%s\t\tpassword: %s\n", prefix,
Packit eace71
				       strlen(pass) ?  pass : UNKNOWN_VALUE);
Packit eace71
			}
Packit eace71
Packit eace71
			printf("%s\t\tusername_in: %s\n", prefix,
Packit eace71
			       strlen(iscsi_session_username_in_get(curr)) ?
Packit eace71
			       iscsi_session_username_in_get(curr) :
Packit eace71
			       UNKNOWN_VALUE);
Packit eace71
			if (!do_show)
Packit eace71
				printf("%s\t\tpassword_in: %s\n", prefix,
Packit eace71
					"********");
Packit eace71
			else {
Packit eace71
				pass = iscsi_session_password_in_get(curr);
Packit eace71
				printf("%s\t\tpassword: %s\n", prefix,
Packit eace71
				       strlen(pass) ?  pass : UNKNOWN_VALUE);
Packit eace71
			}
Packit eace71
		}
Packit eace71
Packit eace71
		if (flags & SESSION_INFO_ISCSI_PARAMS)
Packit eace71
			print_iscsi_params((int) sid, prefix);
Packit eace71
Packit eace71
		if (flags & (SESSION_INFO_SCSI_DEVS | SESSION_INFO_HOST_DEVS))
Packit eace71
			print_scsi_state((int) sid, prefix, flags);
Packit eace71
Packit eace71
		prev = curr;
Packit eace71
	}
Packit eace71
}
Packit eace71
Packit eace71
int session_info_print(int info_level, struct iscsi_session **ses,
Packit eace71
		       uint32_t se_count, int do_show)
Packit eace71
{
Packit eace71
	int err = 0;
Packit eace71
	char *version;
Packit eace71
	unsigned int flags = 0;
Packit eace71
	uint32_t i = 0;
Packit eace71
Packit eace71
	switch (info_level) {
Packit eace71
	case 0:
Packit eace71
	case -1:
Packit eace71
		for (i = 0; i < se_count; ++i) {
Packit eace71
			err = session_info_print_flat(ses[i]);
Packit eace71
			if (err != 0)
Packit eace71
				break;
Packit eace71
		}
Packit eace71
		break;
Packit eace71
	case 3:
Packit eace71
		version = iscsi_sysfs_get_iscsi_kernel_version();
Packit eace71
		if (version) {
Packit eace71
			printf("iSCSI Transport Class version %s\n",
Packit eace71
				version);
Packit eace71
			printf("version %s\n", ISCSI_VERSION_STR);
Packit eace71
			free(version);
Packit eace71
		}
Packit eace71
Packit eace71
		flags |= (SESSION_INFO_SCSI_DEVS | SESSION_INFO_HOST_DEVS);
Packit eace71
		/* fall through */
Packit eace71
	case 2:
Packit eace71
		flags |= (SESSION_INFO_ISCSI_PARAMS | SESSION_INFO_ISCSI_TIM
Packit eace71
				| SESSION_INFO_ISCSI_AUTH);
Packit eace71
		/* fall through */
Packit eace71
	case 1:
Packit eace71
		flags |= (SESSION_INFO_ISCSI_STATE | SESSION_INFO_IFACE);
Packit eace71
		session_info_print_tree(ses, se_count, "", flags, do_show);
Packit eace71
		break;
Packit eace71
	default:
Packit eace71
		log_error("Invalid info level %d. Try 0 - 3.", info_level);
Packit eace71
		return ISCSI_ERR_INVAL;
Packit eace71
	}
Packit eace71
Packit eace71
	if (err) {
Packit eace71
		log_error("Can not get list of active sessions (%d)", err);
Packit eace71
		return err;
Packit eace71
	}
Packit eace71
	return 0;
Packit eace71
}