Blame usr/session_info.c

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