Blame usr/flashnode.c

Packit eace71
/*
Packit eace71
 * iSCSI flashnode helpers
Packit eace71
 *
Packit eace71
 * Copyright (C) 2013 QLogic Corporation.
Packit eace71
 * Maintained by open-iscsi@googlegroups.com
Packit eace71
 *
Packit eace71
 * This program is free software; you can redistribute it and/or modify
Packit eace71
 * it under the terms of the GNU General Public License as published
Packit eace71
 * by the Free Software Foundation; either version 2 of the License, or
Packit eace71
 * (at your option) any later version.
Packit eace71
 *
Packit eace71
 * This program is distributed in the hope that it will be useful, but
Packit eace71
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit eace71
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Packit eace71
 * General Public License for more details.
Packit eace71
 *
Packit eace71
 * See the file COPYING included with this distribution for more details.
Packit eace71
 */
Packit eace71
#include <errno.h>
Packit eace71
#include <stdlib.h>
Packit eace71
#include <stdio.h>
Packit eace71
#include <unistd.h>
Packit eace71
#include <string.h>
Packit eace71
#include <sys/stat.h>
Packit eace71
#include <arpa/inet.h>
Packit eace71
Packit eace71
#include "log.h"
Packit eace71
#include "idbm.h"
Packit eace71
#include "iscsi_util.h"
Packit eace71
#include "transport.h"
Packit eace71
#include "iscsi_sysfs.h"
Packit eace71
#include "list.h"
Packit eace71
#include "sysdeps.h"
Packit eace71
#include "idbm_fields.h"
Packit eace71
#include "iscsi_err.h"
Packit eace71
#include "iscsi_ipc.h"
Packit eace71
#include "iscsi_netlink.h"
Packit eace71
#include "flashnode.h"
Packit eace71
#include "iscsi_settings.h"
Packit eace71
Packit eace71
char key[NAME_MAXVAL];
Packit eace71
Packit eace71
char *to_key(const char *fmt)
Packit eace71
{
Packit eace71
	int i = 0;
Packit eace71
	memset(key, 0, sizeof(key));
Packit eace71
	sprintf(key, fmt, i);
Packit eace71
	return key;
Packit eace71
}
Packit eace71
Packit eace71
int flashnode_info_print_flat(void *data, struct flashnode_rec *fnode,
Packit eace71
			      uint32_t host_no, uint32_t flashnode_idx)
Packit eace71
{
Packit eace71
	printf("%s: [%d] ", fnode->transport_name, flashnode_idx);
Packit eace71
	if (!strlen((char *)fnode->conn[0].ipaddress))
Packit eace71
		printf("%s:", UNKNOWN_VALUE);
Packit eace71
	else if (strchr((char *)fnode->conn[0].ipaddress, '.'))
Packit eace71
		printf("%s:", fnode->conn[0].ipaddress);
Packit eace71
	else
Packit eace71
		printf("[%s]:", fnode->conn[0].ipaddress);
Packit eace71
Packit eace71
	if (!fnode->conn[0].port)
Packit eace71
		printf("%s,", UNKNOWN_VALUE);
Packit eace71
	else
Packit eace71
		printf("%u,", fnode->conn[0].port);
Packit eace71
Packit eace71
	printf("%u ", fnode->sess.tpgt);
Packit eace71
Packit eace71
	if (!strlen(fnode->sess.targetname))
Packit eace71
		printf("%s\n", UNKNOWN_VALUE);
Packit eace71
	else
Packit eace71
		printf("%s\n", fnode->sess.targetname);
Packit eace71
Packit eace71
	return 0;
Packit eace71
}
Packit eace71
Packit eace71
static int flashnode_fill_isid(struct flashnode_rec *fnode, struct iovec *iov)
Packit eace71
{
Packit eace71
	struct iscsi_flashnode_param_info *fnode_param;
Packit eace71
	struct nlattr *attr;
Packit eace71
	int len;
Packit eace71
	uint8_t isid[6];
Packit eace71
Packit eace71
	len = sizeof(struct iscsi_flashnode_param_info) + 6;
Packit eace71
	iov->iov_base = iscsi_nla_alloc(ISCSI_FLASHNODE_ISID, len);
Packit eace71
	if (!iov->iov_base)
Packit eace71
		return 1;
Packit eace71
Packit eace71
	attr = iov->iov_base;
Packit eace71
	iov->iov_len = NLA_ALIGN(attr->nla_len);
Packit eace71
Packit eace71
	fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr);
Packit eace71
	fnode_param->param = ISCSI_FLASHNODE_ISID;
Packit eace71
	fnode_param->len = 6;
Packit eace71
Packit eace71
	sscanf(fnode->sess.isid, "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx",
Packit eace71
	       &isid[0], &isid[1], &isid[2], &isid[3], &isid[4], &isid[5]);
Packit eace71
Packit eace71
	memcpy(fnode_param->value, isid, fnode_param->len);
Packit eace71
	return 0;
Packit eace71
}
Packit eace71
Packit eace71
static int flashnode_fill_ipv4_addr(struct flashnode_rec *fnode,
Packit eace71
				    struct iovec *iov, int param_type)
Packit eace71
{
Packit eace71
	struct iscsi_flashnode_param_info *fnode_param;
Packit eace71
	struct nlattr *attr;
Packit eace71
	int len;
Packit eace71
	int rc;
Packit eace71
Packit eace71
	len = sizeof(struct iscsi_flashnode_param_info) + 4;
Packit eace71
	iov->iov_base = iscsi_nla_alloc(param_type, len);
Packit eace71
	if (!iov->iov_base)
Packit eace71
		return 1;
Packit eace71
Packit eace71
	attr = iov->iov_base;
Packit eace71
	iov->iov_len = NLA_ALIGN(attr->nla_len);
Packit eace71
Packit eace71
	fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr);
Packit eace71
	fnode_param->param = param_type;
Packit eace71
	fnode_param->len = 4;
Packit eace71
Packit eace71
	switch (param_type) {
Packit eace71
	case ISCSI_FLASHNODE_IPADDR:
Packit eace71
		rc = inet_pton(AF_INET, (char *)fnode->conn[0].ipaddress,
Packit eace71
			       fnode_param->value);
Packit eace71
		break;
Packit eace71
	case ISCSI_FLASHNODE_REDIRECT_IPADDR:
Packit eace71
		rc = inet_pton(AF_INET, (char *)fnode->conn[0].redirect_ipaddr,
Packit eace71
			       fnode_param->value);
Packit eace71
		break;
Packit eace71
	default:
Packit eace71
		goto free;
Packit eace71
	}
Packit eace71
Packit eace71
	if (rc <= 0)
Packit eace71
		goto free;
Packit eace71
Packit eace71
	return 0;
Packit eace71
Packit eace71
free:
Packit eace71
	free(iov->iov_base);
Packit eace71
	iov->iov_base = NULL;
Packit eace71
	iov->iov_len = 0;
Packit eace71
	return 1;
Packit eace71
}
Packit eace71
Packit eace71
static int flashnode_fill_ipv6_addr(struct flashnode_rec *fnode,
Packit eace71
				    struct iovec *iov, int param_type)
Packit eace71
{
Packit eace71
	struct iscsi_flashnode_param_info *fnode_param;
Packit eace71
	struct nlattr *attr;
Packit eace71
	int len;
Packit eace71
	int rc;
Packit eace71
Packit eace71
	len = sizeof(struct iscsi_flashnode_param_info) + 16;
Packit eace71
	iov->iov_base = iscsi_nla_alloc(param_type, len);
Packit eace71
	if (!iov->iov_base)
Packit eace71
		return 1;
Packit eace71
Packit eace71
	attr = iov->iov_base;
Packit eace71
	iov->iov_len = NLA_ALIGN(attr->nla_len);
Packit eace71
Packit eace71
	fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr);
Packit eace71
	fnode_param->param = param_type;
Packit eace71
	fnode_param->len = 16;
Packit eace71
Packit eace71
	switch (param_type) {
Packit eace71
	case ISCSI_FLASHNODE_IPADDR:
Packit eace71
		rc = inet_pton(AF_INET6, (char *)fnode->conn[0].ipaddress,
Packit eace71
			       fnode_param->value);
Packit eace71
		break;
Packit eace71
	case ISCSI_FLASHNODE_REDIRECT_IPADDR:
Packit eace71
		rc = inet_pton(AF_INET6, (char *)fnode->conn[0].redirect_ipaddr,
Packit eace71
			       fnode_param->value);
Packit eace71
		break;
Packit eace71
	case ISCSI_FLASHNODE_LINK_LOCAL_IPV6:
Packit eace71
		rc = inet_pton(AF_INET6, (char *)fnode->conn[0].link_local_ipv6,
Packit eace71
			       fnode_param->value);
Packit eace71
		break;
Packit eace71
	default:
Packit eace71
		goto free;
Packit eace71
	}
Packit eace71
Packit eace71
	if (rc <= 0)
Packit eace71
		goto free;
Packit eace71
Packit eace71
	return 0;
Packit eace71
Packit eace71
free:
Packit eace71
	free(iov->iov_base);
Packit eace71
	iov->iov_base = NULL;
Packit eace71
	iov->iov_len = 0;
Packit eace71
	return 1;
Packit eace71
}
Packit eace71
Packit eace71
static int flashnode_fill_ipaddr(struct flashnode_rec *fnode, struct iovec *iov,
Packit eace71
				 int param_type)
Packit eace71
{
Packit eace71
	int rc = 0;
Packit eace71
Packit eace71
	if (!strncmp(fnode->sess.portal_type, "ipv4", 4))
Packit eace71
		rc = flashnode_fill_ipv4_addr(fnode, iov, param_type);
Packit eace71
	else
Packit eace71
		rc = flashnode_fill_ipv6_addr(fnode, iov, param_type);
Packit eace71
Packit eace71
	return rc;
Packit eace71
}
Packit eace71
Packit eace71
static int flashnode_fill_uint8(struct flashnode_rec *fnode, struct iovec *iov,
Packit eace71
				int param_type, uint8_t val)
Packit eace71
{
Packit eace71
	struct iscsi_flashnode_param_info *fnode_param;
Packit eace71
	struct nlattr *attr;
Packit eace71
	int len;
Packit eace71
Packit eace71
	len = sizeof(struct iscsi_flashnode_param_info) + 1;
Packit eace71
	iov->iov_base = iscsi_nla_alloc(param_type, len);
Packit eace71
	if (!iov->iov_base)
Packit eace71
		return 1;
Packit eace71
Packit eace71
	attr = iov->iov_base;
Packit eace71
	iov->iov_len = NLA_ALIGN(attr->nla_len);
Packit eace71
Packit eace71
	fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr);
Packit eace71
	fnode_param->param = param_type;
Packit eace71
	fnode_param->len = 1;
Packit eace71
	fnode_param->value[0] = val;
Packit eace71
	return 0;
Packit eace71
}
Packit eace71
Packit eace71
static int flashnode_fill_uint16(struct flashnode_rec *fnode, struct iovec *iov,
Packit eace71
				 int param_type, uint16_t val)
Packit eace71
{
Packit eace71
	struct iscsi_flashnode_param_info *fnode_param;
Packit eace71
	struct nlattr *attr;
Packit eace71
	int len;
Packit eace71
Packit eace71
	len = sizeof(struct iscsi_flashnode_param_info) + 2;
Packit eace71
	iov->iov_base = iscsi_nla_alloc(param_type, len);
Packit eace71
	if (!iov->iov_base)
Packit eace71
		return 1;
Packit eace71
Packit eace71
	attr = iov->iov_base;
Packit eace71
	iov->iov_len = NLA_ALIGN(attr->nla_len);
Packit eace71
Packit eace71
	fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr);
Packit eace71
	fnode_param->param = param_type;
Packit eace71
	fnode_param->len = 2;
Packit eace71
	memcpy(fnode_param->value, &val, fnode_param->len);
Packit eace71
	return 0;
Packit eace71
}
Packit eace71
Packit eace71
static int flashnode_fill_uint32(struct flashnode_rec *fnode, struct iovec *iov,
Packit eace71
				 int param_type, uint32_t val)
Packit eace71
{
Packit eace71
	struct iscsi_flashnode_param_info *fnode_param;
Packit eace71
	struct nlattr *attr;
Packit eace71
	int len;
Packit eace71
Packit eace71
	len = sizeof(struct iscsi_flashnode_param_info) + 4;
Packit eace71
	iov->iov_base = iscsi_nla_alloc(param_type, len);
Packit eace71
	if (!iov->iov_base)
Packit eace71
		return 1;
Packit eace71
Packit eace71
	attr = iov->iov_base;
Packit eace71
	iov->iov_len = NLA_ALIGN(attr->nla_len);
Packit eace71
Packit eace71
	fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr);
Packit eace71
	fnode_param->param = param_type;
Packit eace71
	fnode_param->len = 4;
Packit eace71
	memcpy(fnode_param->value, &val, fnode_param->len);
Packit eace71
	return 0;
Packit eace71
}
Packit eace71
Packit eace71
static int flashnode_fill_str(struct flashnode_rec *fnode, struct iovec *iov,
Packit eace71
			      int param_type, char *buf, int buflen)
Packit eace71
{
Packit eace71
	struct iscsi_flashnode_param_info *fnode_param;
Packit eace71
	struct nlattr *attr;
Packit eace71
	int len;
Packit eace71
Packit eace71
	len = sizeof(struct iscsi_flashnode_param_info) + buflen;
Packit eace71
	iov->iov_base = iscsi_nla_alloc(param_type, len);
Packit eace71
	if (!iov->iov_base)
Packit eace71
		return 1;
Packit eace71
Packit eace71
	attr = iov->iov_base;
Packit eace71
	iov->iov_len = NLA_ALIGN(attr->nla_len);
Packit eace71
Packit eace71
	fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr);
Packit eace71
	fnode_param->param = param_type;
Packit eace71
	fnode_param->len = buflen;
Packit eace71
	memcpy(fnode_param->value, buf, fnode_param->len);
Packit eace71
	return 0;
Packit eace71
}
Packit eace71
Packit eace71
int flashnode_build_config(struct list_head *params,
Packit eace71
			   struct flashnode_rec *fnode, struct iovec *iovs)
Packit eace71
{
Packit eace71
	struct user_param *param;
Packit eace71
	struct iovec *iov = NULL;
Packit eace71
	int count = 0;
Packit eace71
	int port = 3260;
Packit eace71
Packit eace71
	/* start at 2, because 0 is for nlmsghdr and 1 for event */
Packit eace71
	iov = iovs + 2;
Packit eace71
Packit eace71
	list_for_each_entry(param, params, list) {
Packit eace71
		if (!strcmp(param->name, FLASHNODE_SESS_AUTO_SND_TGT_DISABLE)) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE,
Packit eace71
			    fnode->sess.auto_snd_tgt_disable))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
				   FLASHNODE_SESS_DISCOVERY_SESS)) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_DISCOVERY_SESS,
Packit eace71
			    fnode->sess.discovery_session))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_ENTRY_EN)) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_ENTRY_EN,
Packit eace71
			    fnode->sess.entry_enable))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_IMM_DATA_EN)) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_IMM_DATA_EN,
Packit eace71
			    fnode->sess.immediate_data))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
				   FLASHNODE_SESS_INITIAL_R2T_EN)) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_INITIAL_R2T_EN,
Packit eace71
			    fnode->sess.initial_r2t))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
				  FLASHNODE_SESS_DATASEQ_INORDER)) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_DATASEQ_INORDER,
Packit eace71
			    fnode->sess.data_seq_in_order))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_PDU_INORDER)) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_PDU_INORDER,
Packit eace71
			    fnode->sess.data_pdu_in_order))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_CHAP_AUTH_EN)) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_CHAP_AUTH_EN,
Packit eace71
			    fnode->sess.chap_auth_en))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
				  FLASHNODE_SESS_DISCOVERY_LOGOUT_EN)) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN,
Packit eace71
			    fnode->sess.discovery_logout_en))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_BIDI_CHAP_EN )) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_BIDI_CHAP_EN,
Packit eace71
			    fnode->sess.bidi_chap_en))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
				  FLASHNODE_SESS_DISCOVERY_AUTH_OPTIONAL)) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL,
Packit eace71
			    fnode->sess.discovery_auth_optional))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_ERL)) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_ERL,
Packit eace71
			    fnode->sess.erl))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
				  FLASHNODE_SESS_DEF_TIME2WAIT)) {
Packit eace71
			if (!flashnode_fill_uint16(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_DEF_TIME2WAIT,
Packit eace71
			    fnode->sess.def_time2wait))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
				  FLASHNODE_SESS_DEF_TIME2RETAIN)) {
Packit eace71
			if (!flashnode_fill_uint16(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_DEF_TIME2RETAIN,
Packit eace71
			    fnode->sess.def_time2retain))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_MAX_R2T)) {
Packit eace71
			if (!flashnode_fill_uint16(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_MAX_R2T,
Packit eace71
			    fnode->sess.max_outstanding_r2t))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_TSID)) {
Packit eace71
			if (!flashnode_fill_uint16(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_TSID,
Packit eace71
			    fnode->sess.tsid))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_MAX_BURST)) {
Packit eace71
			if (!flashnode_fill_uint32(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_MAX_BURST,
Packit eace71
			    fnode->sess.max_burst_len))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
				  FLASHNODE_SESS_DEF_TASKMGMT_TMO)) {
Packit eace71
			if (!flashnode_fill_uint16(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_DEF_TASKMGMT_TMO,
Packit eace71
			    fnode->sess.def_taskmgmt_tmo))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_NAME)) {
Packit eace71
			if (!flashnode_fill_str(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_NAME,
Packit eace71
			    fnode->sess.targetname,
Packit eace71
			    sizeof(fnode->sess.targetname)))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_FIRST_BURST)) {
Packit eace71
			if (!flashnode_fill_uint32(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_FIRST_BURST,
Packit eace71
			    fnode->sess.first_burst_len))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_ISID)) {
Packit eace71
			if (!flashnode_fill_isid(fnode, &iov[count]))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_ALIAS)) {
Packit eace71
			if (!flashnode_fill_str(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_ALIAS,
Packit eace71
			    fnode->sess.targetalias,
Packit eace71
			    sizeof(fnode->sess.targetalias)))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_TPGT)) {
Packit eace71
			if (!flashnode_fill_uint16(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_TPGT,
Packit eace71
			    fnode->sess.tpgt))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  FLASHNODE_SESS_DISCOVERY_PARENT_IDX)) {
Packit eace71
			if (!flashnode_fill_uint16(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX,
Packit eace71
			    fnode->sess.discovery_parent_idx))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  FLASHNODE_SESS_DISCOVERY_PARENT_TYPE)) {
Packit eace71
			if (!flashnode_fill_str(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE,
Packit eace71
			    fnode->sess.discovery_parent_type,
Packit eace71
			    sizeof(fnode->sess.discovery_parent_type)))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, FLASHNODE_SESS_PORTAL_TYPE)) {
Packit eace71
			if (!flashnode_fill_str(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_PORTAL_TYPE,
Packit eace71
			    fnode->sess.portal_type,
Packit eace71
			    sizeof(fnode->sess.portal_type)))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_SESS_CHAP_OUT_IDX))) {
Packit eace71
			if (!flashnode_fill_uint32(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_CHAP_OUT_IDX,
Packit eace71
			    fnode->sess.chap_out_idx))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name, to_key(FLASHNODE_CONN_PORT))) {
Packit eace71
			if (fnode->conn[0].port)
Packit eace71
				port = fnode->conn[0].port;
Packit eace71
			if (!flashnode_fill_uint16(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_PORT, port))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_IPADDR))) {
Packit eace71
			if (!flashnode_fill_ipaddr(fnode, &iov[count],
Packit eace71
						   ISCSI_FLASHNODE_IPADDR))
Packit eace71
					count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_MAX_RECV_DLENGTH))) {
Packit eace71
			if (!flashnode_fill_uint32(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_MAX_RECV_DLENGTH,
Packit eace71
			    fnode->conn[0].max_recv_dlength))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_IS_FW_ASSIGNED_IPV6))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6,
Packit eace71
			    fnode->conn[0].is_fw_assigned_ipv6))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_HDR_DGST_EN))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_HDR_DGST_EN,
Packit eace71
			    fnode->conn[0].header_digest_en))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_DATA_DGST_EN))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_DATA_DGST_EN,
Packit eace71
			    fnode->conn[0].data_digest_en))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_SNACK_REQ_EN))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_SNACK_REQ_EN,
Packit eace71
			    fnode->conn[0].snack_req_en))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_TCP_TIMESTAMP_STAT))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT,
Packit eace71
			    fnode->conn[0].tcp_timestamp_stat))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_TCP_NAGLE_DISABLE))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_TCP_NAGLE_DISABLE,
Packit eace71
			    fnode->conn[0].tcp_nagle_disable))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_TCP_WSF_DISABLE))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_TCP_WSF_DISABLE,
Packit eace71
			    fnode->conn[0].tcp_wsf_disable))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_TCP_TIMER_SCALE))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_TCP_TIMER_SCALE,
Packit eace71
			    fnode->conn[0].tcp_timer_scale))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_TCP_TIMESTAMP_EN))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_TCP_TIMESTAMP_EN,
Packit eace71
			    fnode->conn[0].tcp_timestamp_en))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_IP_FRAG_DISABLE))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_IP_FRAG_DISABLE,
Packit eace71
			    fnode->conn[0].fragment_disable))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_MAX_XMIT_DLENGTH))) {
Packit eace71
			if (!flashnode_fill_uint32(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_MAX_XMIT_DLENGTH,
Packit eace71
			    fnode->conn[0].max_xmit_dlength))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_KEEPALIVE_TMO))) {
Packit eace71
			if (!flashnode_fill_uint16(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_KEEPALIVE_TMO,
Packit eace71
			    fnode->conn[0].keepalive_tmo))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_REDIRECT_IPADDR))) {
Packit eace71
			if (!flashnode_fill_ipaddr(fnode, &iov[count],
Packit eace71
					ISCSI_FLASHNODE_REDIRECT_IPADDR))
Packit eace71
					count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_MAX_SEGMENT_SIZE))) {
Packit eace71
			if (!flashnode_fill_uint32(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_MAX_SEGMENT_SIZE,
Packit eace71
			    fnode->conn[0].max_segment_size))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_LOCAL_PORT))) {
Packit eace71
			if (!flashnode_fill_uint16(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_LOCAL_PORT,
Packit eace71
			    fnode->conn[0].local_port))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_IPV4_TOS))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_IPV4_TOS,
Packit eace71
			    fnode->conn[0].ipv4_tos))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_IPV6_TC))) {
Packit eace71
			if (!flashnode_fill_uint8(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_IPV6_TC,
Packit eace71
			    fnode->conn[0].ipv6_traffic_class))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_IPV6_FLOW_LABEL))) {
Packit eace71
			if (!flashnode_fill_uint16(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_IPV6_FLOW_LABEL,
Packit eace71
			    fnode->conn[0].ipv6_flow_lbl))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_LINK_LOCAL_IPV6))) {
Packit eace71
			if (!flashnode_fill_ipv6_addr(fnode, &iov[count],
Packit eace71
					ISCSI_FLASHNODE_LINK_LOCAL_IPV6))
Packit eace71
					count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_TCP_XMIT_WSF))) {
Packit eace71
			if (!flashnode_fill_uint32(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_TCP_XMIT_WSF,
Packit eace71
			    fnode->conn[0].tcp_xmit_wsf))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_TCP_RECV_WSF))) {
Packit eace71
			if (!flashnode_fill_uint32(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_TCP_RECV_WSF,
Packit eace71
			    fnode->conn[0].tcp_recv_wsf))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_STATSN))) {
Packit eace71
			if (!flashnode_fill_uint32(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_STATSN,
Packit eace71
			    fnode->conn[0].stat_sn))
Packit eace71
				count++;
Packit eace71
		} else if (!strcmp(param->name,
Packit eace71
			  to_key(FLASHNODE_CONN_EXP_STATSN))) {
Packit eace71
			if (!flashnode_fill_uint32(fnode, &iov[count],
Packit eace71
			    ISCSI_FLASHNODE_EXP_STATSN,
Packit eace71
			    fnode->conn[0].exp_stat_sn))
Packit eace71
				count++;
Packit eace71
		}
Packit eace71
	}
Packit eace71
Packit eace71
	return count;
Packit eace71
}