[iscsi-initiator-utils/f19: 6/15] additional parameters for network configuration
Chris Leech
cleech at fedoraproject.org
Mon Apr 14 18:20:55 UTC 2014
commit a288e4f537c0570d0599bc9ecab44e2a161ffa00
Author: Chris Leech <cleech at redhat.com>
Date: Mon Feb 17 14:35:35 2014 -0800
additional parameters for network configuration
Resolves: #948134
Signed-off-by: Chris Leech <cleech at redhat.com>
...-Setup-iface-conf-file-with-all-iface-att.patch | 46 +
...Remove-numbers-used-for-network-parameter.patch | 65 +
...Additional-parameters-for-network-param-s.patch | 122 ++
...s-Use-macro-to-set-IPv4-IPv6-IP-addresses.patch | 243 ++++
...-Use-single-function-to-enable-disable-ne.patch | 220 +++
...-Use-single-function-to-set-integer-netwo.patch | 215 +++
...-Ignore-network-parameter-if-not-enabled-.patch | 44 +
...-Additional-parameters-for-network-settin.patch | 1445 ++++++++++++++++++++
...-iface-params-should-be-updated-for-node_.patch | 119 ++
...i-tools-Let-default-type-of-iface-be-ipv4.patch | 33 +
...ols-Show-iface-params-based-on-iface-type.patch | 310 +++++
iscsi-initiator-utils.spec | 23 +
12 files changed, 2885 insertions(+), 0 deletions(-)
---
diff --git a/0042-iscsi-tools-Setup-iface-conf-file-with-all-iface-att.patch b/0042-iscsi-tools-Setup-iface-conf-file-with-all-iface-att.patch
new file mode 100644
index 0000000..7e72808
--- /dev/null
+++ b/0042-iscsi-tools-Setup-iface-conf-file-with-all-iface-att.patch
@@ -0,0 +1,46 @@
+From 0a95bc409c6282b95c48ba39a16e17c3e6e26537 Mon Sep 17 00:00:00 2001
+From: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Date: Fri, 18 Oct 2013 09:29:17 -0400
+Subject: [PATCH] iscsi tools: Setup iface conf file with all iface attrs
+ exported in sysfs
+
+Currently, iface conf file does not get populated with all the iface
+attrs that are exported in corresponding sysfs entry.
+This patch allows to setup conf file with all iface attrs in sysfs.
+
+Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Signed-off-by: Vikas Chaudhary <vikas.chaudhary at qlogic.com>
+---
+ usr/iface.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/usr/iface.c b/usr/iface.c
+index c86892e..8580d1a 100644
+--- a/usr/iface.c
++++ b/usr/iface.c
+@@ -476,11 +476,8 @@ static int iface_setup_binding_from_kern_iface(void *data,
+ }
+
+ memset(&iface, 0, sizeof(struct iface_rec));
+- strcpy(iface.hwaddress, hinfo->iface.hwaddress);
+- strcpy(iface.transport_name, hinfo->iface.transport_name);
+-
+ if (kern_iface) {
+- iface.iface_num = kern_iface->iface_num;
++ memcpy(&iface, kern_iface, sizeof(iface));
+
+ snprintf(iface.name, sizeof(iface.name), "%s.%s.%s.%u",
+ kern_iface->transport_name,
+@@ -492,6 +489,9 @@ static int iface_setup_binding_from_kern_iface(void *data,
+ hinfo->iface.transport_name, hinfo->iface.hwaddress);
+ }
+
++ strcpy(iface.hwaddress, hinfo->iface.hwaddress);
++ strcpy(iface.transport_name, hinfo->iface.transport_name);
++
+ memset(iface_path, 0, sizeof(iface_path));
+ snprintf(iface_path, PATH_MAX, "%s/%s", IFACE_CONFIG_DIR,
+ iface.name);
+--
+1.8.3.1
+
diff --git a/0043-iscsi_if.h-Remove-numbers-used-for-network-parameter.patch b/0043-iscsi_if.h-Remove-numbers-used-for-network-parameter.patch
new file mode 100644
index 0000000..40cafea
--- /dev/null
+++ b/0043-iscsi_if.h-Remove-numbers-used-for-network-parameter.patch
@@ -0,0 +1,65 @@
+From 026c8d771c1df457cd26e7066b503cadfbbc98df Mon Sep 17 00:00:00 2001
+From: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Date: Fri, 18 Oct 2013 09:29:18 -0400
+Subject: [PATCH] iscsi_if.h: Remove numbers used for network parameter
+ settings
+
+Signed-off-by: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Signed-off-by: Vikas Chaudhary <vikas.chaudhary at qlogic.com>
+---
+ include/iscsi_if.h | 38 +++++++++++++++++++-------------------
+ 1 file changed, 19 insertions(+), 19 deletions(-)
+
+diff --git a/include/iscsi_if.h b/include/iscsi_if.h
+index 0284662..e837dd0 100644
+--- a/include/iscsi_if.h
++++ b/include/iscsi_if.h
+@@ -395,25 +395,25 @@ struct iscsi_path {
+ /* iSCSI network params */
+ enum iscsi_net_param {
+ ISCSI_NET_PARAM_IPV4_ADDR = 1,
+- ISCSI_NET_PARAM_IPV4_SUBNET = 2,
+- ISCSI_NET_PARAM_IPV4_GW = 3,
+- ISCSI_NET_PARAM_IPV4_BOOTPROTO = 4,
+- ISCSI_NET_PARAM_MAC = 5,
+- ISCSI_NET_PARAM_IPV6_LINKLOCAL = 6,
+- ISCSI_NET_PARAM_IPV6_ADDR = 7,
+- ISCSI_NET_PARAM_IPV6_ROUTER = 8,
+- ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG = 9,
+- ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG = 10,
+- ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG = 11,
+- ISCSI_NET_PARAM_IFACE_ENABLE = 12,
+- ISCSI_NET_PARAM_VLAN_ID = 13,
+- ISCSI_NET_PARAM_VLAN_PRIORITY = 14,
+- ISCSI_NET_PARAM_VLAN_ENABLED = 15,
+- ISCSI_NET_PARAM_VLAN_TAG = 16,
+- ISCSI_NET_PARAM_IFACE_TYPE = 17,
+- ISCSI_NET_PARAM_IFACE_NAME = 18,
+- ISCSI_NET_PARAM_MTU = 19,
+- ISCSI_NET_PARAM_PORT = 20,
++ ISCSI_NET_PARAM_IPV4_SUBNET,
++ ISCSI_NET_PARAM_IPV4_GW,
++ ISCSI_NET_PARAM_IPV4_BOOTPROTO,
++ ISCSI_NET_PARAM_MAC,
++ ISCSI_NET_PARAM_IPV6_LINKLOCAL,
++ ISCSI_NET_PARAM_IPV6_ADDR,
++ ISCSI_NET_PARAM_IPV6_ROUTER,
++ ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG,
++ ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG,
++ ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG,
++ ISCSI_NET_PARAM_IFACE_ENABLE,
++ ISCSI_NET_PARAM_VLAN_ID,
++ ISCSI_NET_PARAM_VLAN_PRIORITY,
++ ISCSI_NET_PARAM_VLAN_ENABLED,
++ ISCSI_NET_PARAM_VLAN_TAG,
++ ISCSI_NET_PARAM_IFACE_TYPE,
++ ISCSI_NET_PARAM_IFACE_NAME,
++ ISCSI_NET_PARAM_MTU,
++ ISCSI_NET_PARAM_PORT,
+ };
+
+ enum iscsi_conn_state {
+--
+1.8.3.1
+
diff --git a/0044-iscsi_if.h-Additional-parameters-for-network-param-s.patch b/0044-iscsi_if.h-Additional-parameters-for-network-param-s.patch
new file mode 100644
index 0000000..4fea308
--- /dev/null
+++ b/0044-iscsi_if.h-Additional-parameters-for-network-param-s.patch
@@ -0,0 +1,122 @@
+From d1e07af2ed3aa480107213378a54bfc9a6a36c0a Mon Sep 17 00:00:00 2001
+From: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Date: Fri, 18 Oct 2013 09:29:19 -0400
+Subject: [PATCH] iscsi_if.h: Additional parameters for network param settings
+
+Added support to display and update additional network parameters
+through iscsiadm
+
+Signed-off-by: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Signed-off-by: Vikas Chaudhary <vikas.chaudhary at qlogic.com>
+---
+ include/iscsi_if.h | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 79 insertions(+)
+
+diff --git a/include/iscsi_if.h b/include/iscsi_if.h
+index e837dd0..e59bcd0 100644
+--- a/include/iscsi_if.h
++++ b/include/iscsi_if.h
+@@ -320,6 +320,7 @@ enum iscsi_param_type {
+ ISCSI_NET_PARAM, /* iscsi_net_param */
+ ISCSI_FLASHNODE_PARAM, /* iscsi_flashnode_param */
+ ISCSI_CHAP_PARAM, /* iscsi_chap_param */
++ ISCSI_IFACE_PARAM, /* iscsi_iface_param */
+ };
+
+ /* structure for minimalist usecase */
+@@ -392,6 +393,10 @@ struct iscsi_path {
+ #define ISCSI_VLAN_DISABLE 0x01
+ #define ISCSI_VLAN_ENABLE 0x02
+
++/* iscsi generic enable/disabled setting for various features */
++#define ISCSI_NET_PARAM_DISABLE 0x01
++#define ISCSI_NET_PARAM_ENABLE 0x02
++
+ /* iSCSI network params */
+ enum iscsi_net_param {
+ ISCSI_NET_PARAM_IPV4_ADDR = 1,
+@@ -414,6 +419,80 @@ enum iscsi_net_param {
+ ISCSI_NET_PARAM_IFACE_NAME,
+ ISCSI_NET_PARAM_MTU,
+ ISCSI_NET_PARAM_PORT,
++ ISCSI_NET_PARAM_IPADDR_STATE,
++ ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE,
++ ISCSI_NET_PARAM_IPV6_ROUTER_STATE,
++ ISCSI_NET_PARAM_DELAYED_ACK_EN,
++ ISCSI_NET_PARAM_TCP_NAGLE_DISABLE,
++ ISCSI_NET_PARAM_TCP_WSF_DISABLE,
++ ISCSI_NET_PARAM_TCP_WSF,
++ ISCSI_NET_PARAM_TCP_TIMER_SCALE,
++ ISCSI_NET_PARAM_TCP_TIMESTAMP_EN,
++ ISCSI_NET_PARAM_CACHE_ID,
++ ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN,
++ ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN,
++ ISCSI_NET_PARAM_IPV4_TOS_EN,
++ ISCSI_NET_PARAM_IPV4_TOS,
++ ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN,
++ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN,
++ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID,
++ ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN,
++ ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN,
++ ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID,
++ ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN,
++ ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE,
++ ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN,
++ ISCSI_NET_PARAM_IPV4_TTL,
++ ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN,
++ ISCSI_NET_PARAM_IPV6_MLD_EN,
++ ISCSI_NET_PARAM_IPV6_FLOW_LABEL,
++ ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS,
++ ISCSI_NET_PARAM_IPV6_HOP_LIMIT,
++ ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO,
++ ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME,
++ ISCSI_NET_PARAM_IPV6_ND_STALE_TMO,
++ ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT,
++ ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU,
++ ISCSI_NET_PARAM_REDIRECT_EN,
++};
++
++enum iscsi_ipaddress_state {
++ ISCSI_IPDDRESS_STATE_UNCONFIGURED,
++ ISCSI_IPDDRESS_STATE_ACQUIRING,
++ ISCSI_IPDDRESS_STATE_TENTATIVE,
++ ISCSI_IPDDRESS_STATE_VALID,
++ ISCSI_IPDDRESS_STATE_DISABLING,
++ ISCSI_IPDDRESS_STATE_INVALID,
++ ISCSI_IPDDRESS_STATE_DEPRECATED,
++};
++
++enum iscsi_router_state {
++ ISCSI_ROUTER_STATE_UNKNOWN,
++ ISCSI_ROUTER_STATE_ADVERTISED,
++ ISCSI_ROUTER_STATE_MANUAL,
++ ISCSI_ROUTER_STATE_STALE,
++};
++
++/* iSCSI specific settings params for iface */
++enum iscsi_iface_param {
++ ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO,
++ ISCSI_IFACE_PARAM_HDRDGST_EN,
++ ISCSI_IFACE_PARAM_DATADGST_EN,
++ ISCSI_IFACE_PARAM_IMM_DATA_EN,
++ ISCSI_IFACE_PARAM_INITIAL_R2T_EN,
++ ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN,
++ ISCSI_IFACE_PARAM_PDU_INORDER_EN,
++ ISCSI_IFACE_PARAM_ERL,
++ ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH,
++ ISCSI_IFACE_PARAM_FIRST_BURST,
++ ISCSI_IFACE_PARAM_MAX_R2T,
++ ISCSI_IFACE_PARAM_MAX_BURST,
++ ISCSI_IFACE_PARAM_CHAP_AUTH_EN,
++ ISCSI_IFACE_PARAM_BIDI_CHAP_EN,
++ ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL,
++ ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN,
++ ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN,
++ ISCSI_IFACE_PARAM_INITIATOR_NAME,
+ };
+
+ enum iscsi_conn_state {
+--
+1.8.3.1
+
diff --git a/0045-iscsi-tools-Use-macro-to-set-IPv4-IPv6-IP-addresses.patch b/0045-iscsi-tools-Use-macro-to-set-IPv4-IPv6-IP-addresses.patch
new file mode 100644
index 0000000..6ef8896
--- /dev/null
+++ b/0045-iscsi-tools-Use-macro-to-set-IPv4-IPv6-IP-addresses.patch
@@ -0,0 +1,243 @@
+From 466efaad99b0fc0d1181443386b823739a8b483b Mon Sep 17 00:00:00 2001
+From: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Date: Fri, 18 Oct 2013 09:29:20 -0400
+Subject: [PATCH] iscsi tools: Use macro to set IPv4/IPv6 IP addresses
+
+Signed-off-by: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Signed-off-by: Vikas Chaudhary <vikas.chaudhary at qlogic.com>
+Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+---
+ usr/iface.c | 154 +++++++++++++++++++++++++++---------------------------------
+ 1 file changed, 69 insertions(+), 85 deletions(-)
+
+diff --git a/usr/iface.c b/usr/iface.c
+index 8580d1a..19ad5ab 100644
+--- a/usr/iface.c
++++ b/usr/iface.c
+@@ -1484,8 +1484,8 @@ static int iface_fill_router_autocfg(struct iovec *iov, struct iface_rec *iface)
+ }
+
+ /* IPv4 IPAddress/Subnet Mask/Gateway: 4 bytes */
+-static int iface_fill_net_ipv4_addr(struct iovec *iov, struct iface_rec *iface,
+- uint32_t param)
++static int iface_fill_net_ipv4_addr(struct iovec *iov, uint32_t iface_num,
++ uint16_t param, char *param_val)
+ {
+ int rc = 1;
+ int len;
+@@ -1502,29 +1502,12 @@ static int iface_fill_net_ipv4_addr(struct iovec *iov, struct iface_rec *iface,
+ net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
+ net_param->param = param;
+ net_param->iface_type = ISCSI_IFACE_TYPE_IPV4;
+- net_param->iface_num = iface->iface_num;
++ net_param->iface_num = iface_num;
+ net_param->len = 4;
+ net_param->param_type = ISCSI_NET_PARAM;
+-
+- switch (param) {
+- case ISCSI_NET_PARAM_IPV4_ADDR:
+- rc = inet_pton(AF_INET, iface->ipaddress, net_param->value);
+- if (rc <= 0)
+- goto free;
+- break;
+- case ISCSI_NET_PARAM_IPV4_SUBNET:
+- rc = inet_pton(AF_INET, iface->subnet_mask, net_param->value);
+- if (rc <= 0)
+- goto free;
+- break;
+- case ISCSI_NET_PARAM_IPV4_GW:
+- rc = inet_pton(AF_INET, iface->gateway, net_param->value);
+- if (rc <= 0)
+- goto free;
+- break;
+- default:
++ rc = inet_pton(AF_INET, param_val, net_param->value);
++ if (rc <= 0)
+ goto free;
+- }
+
+ /* validate */
+ if (!net_param->value[0] && !net_param->value[1] &&
+@@ -1539,9 +1522,19 @@ free:
+ return 1;
+ }
+
++#define IFACE_SET_NET_PARAM_IPV4_ADDR(iov, inum, param, ival, gcnt, \
++ lcnt) { \
++ if (strstr(ival, ".")) { \
++ if (!iface_fill_net_ipv4_addr(iov, inum, param, ival)) {\
++ (*gcnt)++; \
++ (*lcnt)++; \
++ } \
++ } \
++}
++
+ /* IPv6 IPAddress/LinkLocal/Router: 16 bytes */
+-static int iface_fill_net_ipv6_addr(struct iovec *iov, struct iface_rec *iface,
+- uint32_t param)
++static int iface_fill_net_ipv6_addr(struct iovec *iov, uint32_t iface_num,
++ uint16_t param, char *param_val)
+ {
+ int rc;
+ int len;
+@@ -1558,30 +1551,12 @@ static int iface_fill_net_ipv6_addr(struct iovec *iov, struct iface_rec *iface,
+ net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
+ net_param->param = param;
+ net_param->iface_type = ISCSI_IFACE_TYPE_IPV6;
+- net_param->iface_num = iface->iface_num;
++ net_param->iface_num = iface_num;
+ net_param->param_type = ISCSI_NET_PARAM;
+ net_param->len = 16;
+-
+- switch (param) {
+- case ISCSI_NET_PARAM_IPV6_ADDR:
+- rc = inet_pton(AF_INET6, iface->ipaddress, net_param->value);
+- if (rc <= 0)
+- goto free;
+- break;
+- case ISCSI_NET_PARAM_IPV6_LINKLOCAL:
+- rc = inet_pton(AF_INET6, iface->ipv6_linklocal,
+- net_param->value);
+- if (rc <= 0)
+- goto free;
+- break;
+- case ISCSI_NET_PARAM_IPV6_ROUTER:
+- rc = inet_pton(AF_INET6, iface->ipv6_router, net_param->value);
+- if (rc <= 0)
+- goto free;
+- break;
+- default:
++ rc = inet_pton(AF_INET6, param_val, net_param->value);
++ if (rc <= 0)
+ goto free;
+- }
+
+ return 0;
+ free:
+@@ -1591,6 +1566,16 @@ free:
+ return 1;
+ }
+
++#define IFACE_SET_NET_PARAM_IPV6_ADDR(iov, inum, param, ival, gcnt, \
++ lcnt) { \
++ if (strstr(ival, ":")) { \
++ if (!iface_fill_net_ipv6_addr(iov, inum, param, ival)) {\
++ (*gcnt)++; \
++ (*lcnt)++; \
++ } \
++ } \
++}
++
+ struct iface_net_config {
+ struct iface_rec *primary;
+ struct iovec *iovs;
+@@ -1635,28 +1620,27 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ net_config->count++;
+ count++;
+ }
+- if (!iface_fill_net_ipv4_addr(&iov[net_config->count],
+- iface,
+- ISCSI_NET_PARAM_IPV4_ADDR)) {
+- net_config->count++;
+- count++;
+- }
+- if (strstr(iface->subnet_mask, ".")) {
+- if (!iface_fill_net_ipv4_addr(
+- &iov[net_config->count], iface,
+- ISCSI_NET_PARAM_IPV4_SUBNET)) {
+- net_config->count++;
+- count++;
+- }
+- }
+- if (strstr(iface->gateway, ".")) {
+- if (!iface_fill_net_ipv4_addr(
+- &iov[net_config->count], iface,
+- ISCSI_NET_PARAM_IPV4_GW)) {
+- net_config->count++;
+- count++;
+- }
+- }
++
++ IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_NET_PARAM_IPV4_ADDR,
++ iface->ipaddress,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_NET_PARAM_IPV4_SUBNET,
++ iface->subnet_mask,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_NET_PARAM_IPV4_GW,
++ iface->gateway,
++ &net_config->count,
++ &count);
+ }
+
+ /*
+@@ -1727,12 +1711,12 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ count++;
+ }
+ /* User provided IPv6 Address */
+- if (!iface_fill_net_ipv6_addr(&iov[net_config->count],
+- iface,
+- ISCSI_NET_PARAM_IPV6_ADDR)) {
+- net_config->count++;
+- count++;
+- }
++ IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_NET_PARAM_IPV6_ADDR,
++ iface->ipaddress,
++ &net_config->count,
++ &count);
+ }
+
+ /* For LinkLocal Address */
+@@ -1751,12 +1735,12 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ count++;
+ }
+ /* User provided Link Local Address */
+- if (!iface_fill_net_ipv6_addr(&iov[net_config->count],
+- iface,
+- ISCSI_NET_PARAM_IPV6_LINKLOCAL)) {
+- net_config->count++;
+- count++;
+- }
++ IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_NET_PARAM_IPV6_LINKLOCAL,
++ iface->ipv6_linklocal,
++ &net_config->count,
++ &count);
+ }
+
+ /* For Router Address */
+@@ -1773,12 +1757,12 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ count++;
+ }
+ /* User provided Router Address */
+- if (!iface_fill_net_ipv6_addr(&iov[net_config->count],
+- iface,
+- ISCSI_NET_PARAM_IPV6_ROUTER)) {
+- net_config->count++;
+- count++;
+- }
++ IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_NET_PARAM_IPV6_ROUTER,
++ iface->ipv6_router,
++ &net_config->count,
++ &count);
+ }
+
+ /*
+--
+1.8.3.1
+
diff --git a/0046-iscsi-tools-Use-single-function-to-enable-disable-ne.patch b/0046-iscsi-tools-Use-single-function-to-enable-disable-ne.patch
new file mode 100644
index 0000000..22334e1
--- /dev/null
+++ b/0046-iscsi-tools-Use-single-function-to-enable-disable-ne.patch
@@ -0,0 +1,220 @@
+From 2220ee4334637946e93dca5c68889b5e3e807515 Mon Sep 17 00:00:00 2001
+From: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Date: Fri, 18 Oct 2013 09:29:21 -0400
+Subject: [PATCH] iscsi tools: Use single function to enable/disable network
+ parameters
+
+Signed-off-by: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Signed-off-by: Vikas Chaudhary <vikas.chaudhary at qlogic.com>
+---
+ usr/iface.c | 148 ++++++++++++++++++++++++++++++------------------------------
+ 1 file changed, 74 insertions(+), 74 deletions(-)
+
+diff --git a/usr/iface.c b/usr/iface.c
+index 19ad5ab..292c804 100644
+--- a/usr/iface.c
++++ b/usr/iface.c
+@@ -1311,60 +1311,45 @@ static int iface_fill_vlan_id(struct iovec *iov, struct iface_rec *iface,
+ return 0;
+ }
+
+-/* IPv4/IPv6 VLAN state: disable/enable */
+-static int iface_fill_vlan_state(struct iovec *iov, struct iface_rec *iface,
+- uint32_t iface_type)
++/* disable/enable parameters */
++static int iface_fill_param_state(struct iovec *iov, uint32_t iface_num,
++ uint8_t iface_type, uint16_t param,
++ uint8_t param_type, char *param_val)
+ {
+ int len;
+ struct iscsi_iface_param_info *net_param;
+ struct nlattr *attr;
+
++ if (!param_val[0])
++ return 1;
++
+ len = sizeof(struct iscsi_iface_param_info) + 1;
+- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_VLAN_ENABLED, len);
++ iov->iov_base = iscsi_nla_alloc(param, len);
+ if (!(iov->iov_base))
+ return 1;
+
+ attr = iov->iov_base;
+ iov->iov_len = NLA_ALIGN(attr->nla_len);
+ net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
+- net_param->param = ISCSI_NET_PARAM_VLAN_ENABLED;
+- net_param->iface_type = iface_type;
+- net_param->iface_num = iface->iface_num;
+- net_param->param_type = ISCSI_NET_PARAM;
++ net_param->iface_num = iface_num;
+ net_param->len = 1;
+- if (strcmp(iface->vlan_state, "disable") && iface->vlan_id)
+- net_param->value[0] = ISCSI_VLAN_ENABLE;
++ net_param->param = param;
++ net_param->iface_type = iface_type;
++ net_param->param_type = param_type;
++ if (strcmp(param_val, "disable"))
++ net_param->value[0] = ISCSI_NET_PARAM_ENABLE;
+ else /* Assume disabled */
+- net_param->value[0] = ISCSI_VLAN_DISABLE;
++ net_param->value[0] = ISCSI_NET_PARAM_DISABLE;
+ return 0;
+ }
+
+-/* IPv4/IPv6 Network state: disable/enable */
+-static int iface_fill_net_state(struct iovec *iov, struct iface_rec *iface,
+- uint32_t iface_type)
+-{
+- int len;
+- struct iscsi_iface_param_info *net_param;
+- struct nlattr *attr;
+-
+- len = sizeof(struct iscsi_iface_param_info) + 1;
+- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_IFACE_ENABLE, len);
+- if (!(iov->iov_base))
+- return 1;
+-
+- attr = iov->iov_base;
+- iov->iov_len = NLA_ALIGN(attr->nla_len);
+- net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
+- net_param->param = ISCSI_NET_PARAM_IFACE_ENABLE;
+- net_param->iface_type = iface_type;
+- net_param->iface_num = iface->iface_num;
+- net_param->param_type = ISCSI_NET_PARAM;
+- net_param->len = 1;
+- if (!strcmp(iface->state, "disable"))
+- net_param->value[0] = ISCSI_IFACE_DISABLE;
+- else /* Assume enabled */
+- net_param->value[0] = ISCSI_IFACE_ENABLE;
+- return 0;
++#define IFACE_SET_PARAM_STATE(iov, inum, itype, param, ptype, ival, \
++ gcnt, lcnt) { \
++ if (!iface_fill_param_state(iov, inum, itype, param, ptype, \
++ ival)) { \
++ (*gcnt)++; \
++ (*lcnt)++; \
++ } \
+ }
+
+ /* IPv4 Bootproto: DHCP/static */
+@@ -1598,13 +1583,14 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ iptype = iface_get_iptype(iface);
+ if (iptype == ISCSI_IFACE_TYPE_IPV4) {
+ if (!strcmp(iface->state, "disable")) {
+- if (!iface_fill_net_state(&iov[net_config->count],
+- iface,
+- ISCSI_IFACE_TYPE_IPV4)) {
+- net_config->count++;
+- count++;
+- }
+-
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IFACE_ENABLE,
++ ISCSI_NET_PARAM,
++ iface->state,
++ &net_config->count,
++ &count);
+ return 0;
+ }
+
+@@ -1648,18 +1634,24 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ * fill state and other parameters (if any)
+ */
+ if (count) {
+- if (!iface_fill_net_state(&iov[net_config->count],
+- iface,
+- ISCSI_IFACE_TYPE_IPV4)) {
+- net_config->count++;
+- count++;
+- }
+- if (!iface_fill_vlan_state(&iov[net_config->count],
+- iface,
+- ISCSI_IFACE_TYPE_IPV4)) {
+- net_config->count++;
+- count++;
+- }
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IFACE_ENABLE,
++ ISCSI_NET_PARAM,
++ iface->state,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_VLAN_ENABLED,
++ ISCSI_NET_PARAM,
++ iface->vlan_state,
++ &net_config->count,
++ &count);
++
+ if (strcmp(iface->vlan_state, "disable") &&
+ iface->vlan_id) {
+ if (!iface_fill_vlan_id(&iov[net_config->count],
+@@ -1687,12 +1679,14 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ }
+ } else if (iptype == ISCSI_IFACE_TYPE_IPV6) {
+ if (!strcmp(iface->state, "disable")) {
+- if (!iface_fill_net_state(&iov[net_config->count],
+- iface,
+- ISCSI_IFACE_TYPE_IPV6)) {
+- net_config->count++;
+- count++;
+- }
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_IFACE_ENABLE,
++ ISCSI_NET_PARAM,
++ iface->state,
++ &net_config->count,
++ &count);
+ return 0;
+ }
+
+@@ -1770,18 +1764,24 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ * fill state and other parameters
+ */
+ if (count) {
+- if (!iface_fill_net_state(&iov[net_config->count],
+- iface,
+- ISCSI_IFACE_TYPE_IPV6)) {
+- net_config->count++;
+- count++;
+- }
+- if (!iface_fill_vlan_state(&iov[net_config->count],
+- iface,
+- ISCSI_IFACE_TYPE_IPV6)) {
+- net_config->count++;
+- count++;
+- }
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_IFACE_ENABLE,
++ ISCSI_NET_PARAM,
++ iface->state,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_VLAN_ENABLED,
++ ISCSI_NET_PARAM,
++ iface->vlan_state,
++ &net_config->count,
++ &count);
++
+ if (strcmp(iface->vlan_state, "disable") &&
+ iface->vlan_id) {
+ if (!iface_fill_vlan_id(&iov[net_config->count],
+--
+1.8.3.1
+
diff --git a/0047-iscsi-tools-Use-single-function-to-set-integer-netwo.patch b/0047-iscsi-tools-Use-single-function-to-set-integer-netwo.patch
new file mode 100644
index 0000000..b8f451c
--- /dev/null
+++ b/0047-iscsi-tools-Use-single-function-to-set-integer-netwo.patch
@@ -0,0 +1,215 @@
+From d8991c9e1de373a1c55ad2f8ca07bb3fbda1aa5c Mon Sep 17 00:00:00 2001
+From: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Date: Fri, 18 Oct 2013 09:29:22 -0400
+Subject: [PATCH] iscsi tools: Use single function to set integer network
+ parameters
+
+Signed-off-by: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Signed-off-by: Vikas Chaudhary <vikas.chaudhary at qlogic.com>
+---
+ usr/iface.c | 162 +++++++++++++++++++++++++++++++++---------------------------
+ 1 file changed, 90 insertions(+), 72 deletions(-)
+
+diff --git a/usr/iface.c b/usr/iface.c
+index 292c804..6454f75 100644
+--- a/usr/iface.c
++++ b/usr/iface.c
+@@ -1223,58 +1223,68 @@ int iface_get_param_count(struct iface_rec *iface, int iface_all)
+ return iface_params.count;
+ }
+
+-/* IPv4/IPv6 Port: 3260 or User defined */
+-static int iface_fill_port(struct iovec *iov, struct iface_rec *iface,
+- uint32_t iface_type)
++/* write integer parameter value */
++static int iface_fill_int_param_val(struct iovec *iov, uint32_t iface_num,
++ uint8_t iface_type, uint16_t param,
++ uint8_t param_type, uint32_t param_len,
++ uint32_t param_val)
+ {
+ int len;
+ struct iscsi_iface_param_info *net_param;
+- uint16_t port = 3260;
+ struct nlattr *attr;
++ uint8_t val8 = 0;
++ uint16_t val16 = 0;
++ uint32_t val32 = 0;
++ char *val = NULL;
+
+- len = sizeof(struct iscsi_iface_param_info) + sizeof(port);
+- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_PORT, len);
+- if (!iov->iov_base)
+- return 1;
+- attr = iov->iov_base;
+- iov->iov_len = NLA_ALIGN(attr->nla_len);
+-
+- net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
+- net_param->param = ISCSI_NET_PARAM_PORT;
+- net_param->iface_type = iface_type;
+- net_param->iface_num = iface->iface_num;
+- net_param->param_type = ISCSI_NET_PARAM;
+- net_param->len = 2;
+- if (iface->port)
+- port = iface->port;
+- memcpy(net_param->value, &port, net_param->len);
+- return 0;
+-}
+-
+-static int iface_fill_mtu(struct iovec *iov, struct iface_rec *iface,
+- uint32_t iface_type)
+-{
+- int len;
+- struct iscsi_iface_param_info *net_param;
+- uint16_t mtu = 0;
+- struct nlattr *attr;
+-
+- len = sizeof(struct iscsi_iface_param_info) + 2;
+- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_MTU, len);
++ len = sizeof(struct iscsi_iface_param_info) + param_len;
++ iov->iov_base = iscsi_nla_alloc(param, len);
+ if (!(iov->iov_base))
+ return 1;
++
+ attr = iov->iov_base;
+ iov->iov_len = NLA_ALIGN(attr->nla_len);
+-
+ net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
+- net_param->param = ISCSI_NET_PARAM_MTU;
++ net_param->iface_num = iface_num;
++ net_param->len = param_len;
++ net_param->param = param;
+ net_param->iface_type = iface_type;
+- net_param->iface_num = iface->iface_num;
+- net_param->param_type = ISCSI_NET_PARAM;
+- net_param->len = 2;
+- mtu = iface->mtu;
+- memcpy(net_param->value, &mtu, net_param->len);
++ net_param->param_type = param_type;
++ switch (param_len) {
++ case 1:
++ val8 = (uint8_t)param_val;
++ val = (char *)&val8;
++ break;
++
++ case 2:
++ val16 = (uint16_t)param_val;
++ val = (char *)&val16;
++ break;
++
++ case 4:
++ val32 = (uint32_t)param_val;
++ val = (char *)&val32;
++ break;
++
++ default:
++ goto free;
++ }
++ memcpy(net_param->value, val, param_len);
+ return 0;
++free:
++ free(iov->iov_base);
++ iov->iov_base = NULL;
++ iov->iov_len = 0;
++ return 1;
++}
++
++#define IFACE_SET_PARAM_INTVAL(iov, inum, itype, param, ptype, plen, \
++ ival, gcnt, lcnt) { \
++ if (ival && !iface_fill_int_param_val(iov, inum, itype, param, \
++ ptype, plen, ival)) { \
++ (*gcnt)++; \
++ (*lcnt)++; \
++ } \
+ }
+
+ /* IPv4/IPv6 VLAN_ID: decimal value <= 4095 */
+@@ -1660,22 +1670,26 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ count++;
+ }
+ }
+- if (iface->mtu) {
+- if (!iface_fill_mtu(&iov[net_config->count],
+- iface,
+- ISCSI_IFACE_TYPE_IPV4)) {
+- net_config->count++;
+- count++;
+- }
+- }
+- if (iface->port) {
+- if (!iface_fill_port(&iov[net_config->count],
+- iface,
+- ISCSI_IFACE_TYPE_IPV4)) {
+- net_config->count++;
+- count++;
+- }
+- }
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_MTU,
++ ISCSI_NET_PARAM,
++ 2,
++ iface->mtu,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_PORT,
++ ISCSI_NET_PARAM,
++ 2,
++ iface->port,
++ &net_config->count,
++ &count);
+ }
+ } else if (iptype == ISCSI_IFACE_TYPE_IPV6) {
+ if (!strcmp(iface->state, "disable")) {
+@@ -1791,22 +1805,26 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ count++;
+ }
+ }
+- if (iface->mtu) {
+- if (!iface_fill_mtu(&iov[net_config->count],
+- iface,
+- ISCSI_IFACE_TYPE_IPV6)) {
+- net_config->count++;
+- count++;
+- }
+- }
+- if (iface->port) {
+- if (!iface_fill_port(&iov[net_config->count],
+- iface,
+- ISCSI_IFACE_TYPE_IPV6)) {
+- net_config->count++;
+- count++;
+- }
+- }
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_MTU,
++ ISCSI_NET_PARAM,
++ 2,
++ iface->mtu,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_PORT,
++ ISCSI_NET_PARAM,
++ 2,
++ iface->port,
++ &net_config->count,
++ &count);
+ }
+ }
+ return 0;
+--
+1.8.3.1
+
diff --git a/0048-iscsi-tools-Ignore-network-parameter-if-not-enabled-.patch b/0048-iscsi-tools-Ignore-network-parameter-if-not-enabled-.patch
new file mode 100644
index 0000000..0512f6d
--- /dev/null
+++ b/0048-iscsi-tools-Ignore-network-parameter-if-not-enabled-.patch
@@ -0,0 +1,44 @@
+From da404f2137daa4e5cf06d69e4d7b6a0bff8c13b5 Mon Sep 17 00:00:00 2001
+From: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Date: Fri, 18 Oct 2013 09:29:23 -0400
+Subject: [PATCH] iscsi tools: Ignore network parameter if not enabled/disabled
+
+If iface does not contain network parameter or incorrect value is set,
+do not send that network parameter value to driver.
+
+Signed-off-by: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Signed-off-by: Vikas Chaudhary <vikas.chaudhary at qlogic.com>
+---
+ usr/iface.c | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+diff --git a/usr/iface.c b/usr/iface.c
+index 6454f75..55b0dd4 100644
+--- a/usr/iface.c
++++ b/usr/iface.c
+@@ -1346,11 +1346,18 @@ static int iface_fill_param_state(struct iovec *iov, uint32_t iface_num,
+ net_param->param = param;
+ net_param->iface_type = iface_type;
+ net_param->param_type = param_type;
+- if (strcmp(param_val, "disable"))
+- net_param->value[0] = ISCSI_NET_PARAM_ENABLE;
+- else /* Assume disabled */
++ if (!strcmp(param_val, "disable"))
+ net_param->value[0] = ISCSI_NET_PARAM_DISABLE;
++ else if (!strcmp(param_val, "enable"))
++ net_param->value[0] = ISCSI_NET_PARAM_ENABLE;
++ else
++ goto free;
+ return 0;
++free:
++ free(iov->iov_base);
++ iov->iov_base = NULL;
++ iov->iov_len = 0;
++ return 1;
+ }
+
+ #define IFACE_SET_PARAM_STATE(iov, inum, itype, param, ptype, ival, \
+--
+1.8.3.1
+
diff --git a/0049-iscsi-tools-Additional-parameters-for-network-settin.patch b/0049-iscsi-tools-Additional-parameters-for-network-settin.patch
new file mode 100644
index 0000000..888d34c
--- /dev/null
+++ b/0049-iscsi-tools-Additional-parameters-for-network-settin.patch
@@ -0,0 +1,1445 @@
+From 66d9f120e26d49329667e4b9f5a84076c4f66a6e Mon Sep 17 00:00:00 2001
+From: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Date: Fri, 18 Oct 2013 09:29:24 -0400
+Subject: [PATCH] iscsi tools: Additional parameters for network settings
+
+Signed-off-by: Harish Zunjarrao <harish.zunjarrao at qlogic.com>
+Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Signed-off-by: Vikas Chaudhary <vikas.chaudhary at qlogic.com>
+---
+ usr/config.h | 50 +++-
+ usr/idbm.c | 76 +++++
+ usr/idbm_fields.h | 49 ++++
+ usr/iface.c | 847 ++++++++++++++++++++++++++++++++++++++++++++++++------
+ usr/iscsi_sysfs.c | 200 +++++++++++++
+ 5 files changed, 1132 insertions(+), 90 deletions(-)
+
+diff --git a/usr/config.h b/usr/config.h
+index d457bdd..fd31a54 100644
+--- a/usr/config.h
++++ b/usr/config.h
+@@ -232,11 +232,59 @@ typedef struct iface_rec {
+ * 1 = enable */
+ uint16_t mtu;
+ uint16_t port;
++ char delayed_ack[ISCSI_MAX_STR_LEN];
++ char nagle[ISCSI_MAX_STR_LEN];
++ char tcp_wsf_state[ISCSI_MAX_STR_LEN];
++ uint8_t tcp_wsf;
++ uint8_t tcp_timer_scale;
++ char tcp_timestamp[ISCSI_MAX_STR_LEN];
++ char dhcp_dns[ISCSI_MAX_STR_LEN];
++ char dhcp_slp_da[ISCSI_MAX_STR_LEN];
++ char tos_state[ISCSI_MAX_STR_LEN];
++ uint8_t tos;
++ char gratuitous_arp[ISCSI_MAX_STR_LEN];
++ char dhcp_alt_client_id_state[ISCSI_MAX_STR_LEN];
++ char dhcp_alt_client_id[ISCSI_MAX_STR_LEN];
++ char dhcp_req_vendor_id_state[ISCSI_MAX_STR_LEN];
++ char dhcp_vendor_id_state[ISCSI_MAX_STR_LEN];
++ char dhcp_vendor_id[ISCSI_MAX_STR_LEN];
++ char dhcp_learn_iqn[ISCSI_MAX_STR_LEN];
++ char fragmentation[ISCSI_MAX_STR_LEN];
++ char incoming_forwarding[ISCSI_MAX_STR_LEN];
++ uint8_t ttl;
++ char gratuitous_neighbor_adv[ISCSI_MAX_STR_LEN];
++ char redirect[ISCSI_MAX_STR_LEN];
++ char mld[ISCSI_MAX_STR_LEN];
++ uint32_t flow_label;
++ uint32_t traffic_class;
++ uint8_t hop_limit;
++ uint32_t nd_reachable_tmo;
++ uint32_t nd_rexmit_time;
++ uint32_t nd_stale_tmo;
++ uint8_t dup_addr_detect_cnt;
++ uint32_t router_adv_link_mtu;
++ uint16_t def_task_mgmt_tmo;
++ char header_digest[ISCSI_MAX_STR_LEN];
++ char data_digest[ISCSI_MAX_STR_LEN];
++ char immediate_data[ISCSI_MAX_STR_LEN];
++ char initial_r2t[ISCSI_MAX_STR_LEN];
++ char data_seq_inorder[ISCSI_MAX_STR_LEN];
++ char data_pdu_inorder[ISCSI_MAX_STR_LEN];
++ uint8_t erl;
++ uint32_t max_recv_dlength;
++ uint32_t first_burst_len;
++ uint16_t max_out_r2t;
++ uint32_t max_burst_len;
++ char chap_auth[ISCSI_MAX_STR_LEN];
++ char bidi_chap[ISCSI_MAX_STR_LEN];
++ char strict_login_comp[ISCSI_MAX_STR_LEN];
++ char discovery_auth[ISCSI_MAX_STR_LEN];
++ char discovery_logout[ISCSI_MAX_STR_LEN];
+ char port_state[ISCSI_MAX_STR_LEN];
+ char port_speed[ISCSI_MAX_STR_LEN];
+ /*
+ * TODO: we may have to make this bigger and interconnect
+- * specific for infinniband
++ * specific for infiniband
+ */
+ char hwaddress[ISCSI_HWADDRESS_BUF_SIZE];
+ char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN];
+diff --git a/usr/idbm.c b/usr/idbm.c
+index 6b6f57c..4428ebe 100644
+--- a/usr/idbm.c
++++ b/usr/idbm.c
+@@ -454,6 +454,82 @@ void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri)
+ __recinfo_int(IFACE_NUM, ri, r, iface_num, IDBM_SHOW, num, 1);
+ __recinfo_uint16(IFACE_MTU, ri, r, mtu, IDBM_SHOW, num, 1);
+ __recinfo_uint16(IFACE_PORT, ri, r, port, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, dhcp_alt_client_id_state,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, dhcp_alt_client_id,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_DNS, ri, r, dhcp_dns, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, dhcp_learn_iqn, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, dhcp_req_vendor_id_state,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_VID, ri, r, dhcp_vendor_id_state, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DHCP_VID_STR, ri, r, dhcp_vendor_id, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, dhcp_slp_da, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_FRAGMENTATION, ri, r, fragmentation, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_GRAT_ARP, ri, r, gratuitous_arp, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_IN_FORWARD, ri, r, incoming_forwarding, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_TOS_STATE, ri, r, tos_state, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TOS, ri, r, tos, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TTL, ri, r, ttl, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r, dup_addr_detect_cnt,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, flow_label, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r, gratuitous_neighbor_adv,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, hop_limit, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_MLD, ri, r, mld, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, nd_reachable_tmo,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, nd_rexmit_time, IDBM_SHOW,
++ num, 1);
++ __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, nd_stale_tmo, IDBM_SHOW,
++ num, 1);
++ __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r, router_adv_link_mtu,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, traffic_class, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DELAYED_ACK, ri, r, delayed_ack, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_TCP_NAGLE, ri, r, nagle, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_TCP_WSF_STATE, ri, r, tcp_wsf_state, IDBM_SHOW,
++ num, 1);
++ __recinfo_uint8(IFACE_TCP_WSF, ri, r, tcp_wsf, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TCP_TIMER_SCALE, ri, r, tcp_timer_scale,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_TCP_TIMESTAMP, ri, r, tcp_timestamp, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_REDIRECT, ri, r, redirect, IDBM_SHOW, num, 1);
++ __recinfo_uint16(IFACE_DEF_TMF_TMO, ri, r, def_task_mgmt_tmo, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_HDRDGST, ri, r, header_digest, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DATADGST, ri, r, data_digest, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_IMM_DATA, ri, r, immediate_data, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_INITIAL_R2T, ri, r, initial_r2t, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DSEQ_INORDER, ri, r, data_seq_inorder, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DPDU_INORDER, ri, r, data_pdu_inorder, IDBM_SHOW,
++ num, 1);
++ __recinfo_uint8(IFACE_ERL, ri, r, erl, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_MAX_RECV_DLEN, ri, r, max_recv_dlength,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_FIRST_BURST, ri, r, first_burst_len, IDBM_SHOW,
++ num, 1);
++ __recinfo_uint16(IFACE_MAX_R2T, ri, r, max_out_r2t, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_MAX_BURST, ri, r, max_burst_len, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_CHAP_AUTH, ri, r, chap_auth, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_BIDI_CHAP, ri, r, bidi_chap, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_STRICT_LOGIN_COMP, ri, r, strict_login_comp,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DISCOVERY_AUTH, ri, r, discovery_auth, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DISCOVERY_LOGOUT, ri, r, discovery_logout,
++ IDBM_SHOW, num, 1);
+ }
+
+ void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri)
+diff --git a/usr/idbm_fields.h b/usr/idbm_fields.h
+index 179dda8..5790a03 100644
+--- a/usr/idbm_fields.h
++++ b/usr/idbm_fields.h
+@@ -89,6 +89,55 @@
+ #define IFACE_NUM "iface.iface_num"
+ #define IFACE_MTU "iface.mtu"
+ #define IFACE_PORT "iface.port"
++#define IFACE_DELAYED_ACK "iface.delayed_ack"
++#define IFACE_TCP_NAGLE "iface.tcp_nagle"
++#define IFACE_TCP_WSF_STATE "iface.tcp_wsf_state"
++#define IFACE_TCP_WSF "iface.tcp_wsf"
++#define IFACE_TCP_TIMER_SCALE "iface.tcp_timer_scale"
++#define IFACE_TCP_TIMESTAMP "iface.tcp_timestamp"
++#define IFACE_DHCP_DNS "iface.dhcp_dns"
++#define IFACE_DHCP_SLP_DA "iface.dhcp_slp_da"
++#define IFACE_TOS_STATE "iface.tos_state"
++#define IFACE_TOS "iface.tos"
++#define IFACE_GRAT_ARP "iface.gratuitous_arp"
++#define IFACE_DHCP_ALT_CID "iface.dhcp_alt_client_id_state"
++#define IFACE_DHCP_ALT_CID_STR "iface.dhcp_alt_client_id"
++#define IFACE_DHCP_REQ_VID "iface.dhcp_req_vendor_id_state"
++#define IFACE_DHCP_VID "iface.dhcp_vendor_id_state"
++#define IFACE_DHCP_VID_STR "iface.dhcp_vendor_id"
++#define IFACE_DHCP_LEARN_IQN "iface.dhcp_learn_iqn"
++#define IFACE_FRAGMENTATION "iface.fragmentation"
++#define IFACE_IN_FORWARD "iface.incoming_forwarding"
++#define IFACE_TTL "iface.ttl"
++#define IFACE_GRAT_NEIGHBOR_ADV "iface.gratuitous_neighbor_adv"
++#define IFACE_REDIRECT "iface.redirect"
++#define IFACE_IGNORE_ICMP_ECHO_REQ "iface.ignore_icmp_echo_request"
++#define IFACE_MLD "iface.mld"
++#define IFACE_FLOW_LABEL "iface.flow_label"
++#define IFACE_TRAFFIC_CLASS "iface.traffic_class"
++#define IFACE_HOP_LIMIT "iface.hop_limit"
++#define IFACE_ND_REACHABLE_TMO "iface.nd_reachable_tmo"
++#define IFACE_ND_REXMIT_TIME "iface.nd_rexmit_time"
++#define IFACE_ND_STALE_TMO "iface.nd_stale_tmo"
++#define IFACE_DUP_ADDR_DETECT_CNT "iface.dup_addr_detect_cnt"
++#define IFACE_RTR_ADV_LINK_MTU "iface.router_adv_link_mtu"
++#define IFACE_DEF_TMF_TMO "iface.def_task_mgmt_timeout"
++#define IFACE_HDRDGST "iface.header_digest"
++#define IFACE_DATADGST "iface.data_digest"
++#define IFACE_IMM_DATA "iface.immediate_data"
++#define IFACE_INITIAL_R2T "iface.initial_r2t"
++#define IFACE_DSEQ_INORDER "iface.data_seq_inorder"
++#define IFACE_DPDU_INORDER "iface.data_pdu_inorder"
++#define IFACE_ERL "iface.erl"
++#define IFACE_MAX_RECV_DLEN "iface.max_receive_data_len"
++#define IFACE_FIRST_BURST "iface.first_burst_len"
++#define IFACE_MAX_R2T "iface.max_outstanding_r2t"
++#define IFACE_MAX_BURST "iface.max_burst_len"
++#define IFACE_CHAP_AUTH "iface.chap_auth"
++#define IFACE_BIDI_CHAP "iface.bidi_chap"
++#define IFACE_STRICT_LOGIN_COMP "iface.strict_login_compliance"
++#define IFACE_DISCOVERY_AUTH "iface.discovery_auth"
++#define IFACE_DISCOVERY_LOGOUT "iface.discovery_logout"
+
+ /* discovery fields */
+ #define DISC_STARTUP "discovery.startup"
+diff --git a/usr/iface.c b/usr/iface.c
+index 55b0dd4..87ac875 100644
+--- a/usr/iface.c
++++ b/usr/iface.c
+@@ -601,6 +601,105 @@ void iface_copy(struct iface_rec *dst, struct iface_rec *src)
+ dst->mtu = src->mtu;
+ if (src->port)
+ dst->port = src->port;
++ if (strlen(src->delayed_ack))
++ strcpy(dst->delayed_ack, src->delayed_ack);
++ if (strlen(src->nagle))
++ strcpy(dst->nagle, src->nagle);
++ if (strlen(src->tcp_wsf_state))
++ strcpy(dst->tcp_wsf_state, src->tcp_wsf_state);
++ if (src->tcp_wsf)
++ dst->tcp_wsf = src->tcp_wsf;
++ if (src->tcp_timer_scale)
++ dst->tcp_timer_scale = src->tcp_timer_scale;
++ if (strlen(src->tcp_timestamp))
++ strcpy(dst->tcp_timestamp, src->tcp_timestamp);
++ if (strlen(src->dhcp_dns))
++ strcpy(dst->dhcp_dns, src->dhcp_dns);
++ if (strlen(src->dhcp_slp_da))
++ strcpy(dst->dhcp_slp_da, src->dhcp_slp_da);
++ if (strlen(src->tos_state))
++ strcpy(dst->tos_state, src->tos_state);
++ if (src->tos)
++ dst->tos = src->tos;
++ if (strlen(src->gratuitous_arp))
++ strcpy(dst->gratuitous_arp, src->gratuitous_arp);
++ if (strlen(src->dhcp_alt_client_id_state))
++ strcpy(dst->dhcp_alt_client_id_state,
++ src->dhcp_alt_client_id_state);
++ if (strlen(src->dhcp_alt_client_id))
++ strcpy(dst->dhcp_alt_client_id, src->dhcp_alt_client_id);
++ if (strlen(src->dhcp_req_vendor_id_state))
++ strcpy(dst->dhcp_req_vendor_id_state,
++ src->dhcp_req_vendor_id_state);
++ if (strlen(src->dhcp_vendor_id_state))
++ strcpy(dst->dhcp_vendor_id_state, src->dhcp_vendor_id_state);
++ if (strlen(src->dhcp_vendor_id))
++ strcpy(dst->dhcp_vendor_id, src->dhcp_vendor_id);
++ if (strlen(src->dhcp_learn_iqn))
++ strcpy(dst->dhcp_learn_iqn, src->dhcp_learn_iqn);
++ if (strlen(src->fragmentation))
++ strcpy(dst->fragmentation, src->fragmentation);
++ if (strlen(src->incoming_forwarding))
++ strcpy(dst->incoming_forwarding, src->incoming_forwarding);
++ if (src->ttl)
++ dst->ttl = src->ttl;
++ if (strlen(src->gratuitous_neighbor_adv))
++ strcpy(dst->gratuitous_neighbor_adv,
++ src->gratuitous_neighbor_adv);
++ if (strlen(src->redirect))
++ strcpy(dst->redirect, src->redirect);
++ if (strlen(src->mld))
++ strcpy(dst->mld, src->mld);
++ if (src->flow_label)
++ dst->flow_label = src->flow_label;
++ if (src->traffic_class)
++ dst->traffic_class = src->traffic_class;
++ if (src->hop_limit)
++ dst->hop_limit = src->hop_limit;
++ if (src->nd_reachable_tmo)
++ dst->nd_reachable_tmo = src->nd_reachable_tmo;
++ if (src->nd_rexmit_time)
++ dst->nd_rexmit_time = src->nd_rexmit_time;
++ if (src->nd_stale_tmo)
++ dst->nd_stale_tmo = src->nd_stale_tmo;
++ if (src->dup_addr_detect_cnt)
++ dst->dup_addr_detect_cnt = src->dup_addr_detect_cnt;
++ if (src->router_adv_link_mtu)
++ dst->router_adv_link_mtu = src->router_adv_link_mtu;
++ if (src->def_task_mgmt_tmo)
++ dst->def_task_mgmt_tmo = src->def_task_mgmt_tmo;
++ if (strlen(src->header_digest))
++ strcpy(dst->header_digest, src->header_digest);
++ if (strlen(src->data_digest))
++ strcpy(dst->data_digest, src->data_digest);
++ if (strlen(src->immediate_data))
++ strcpy(dst->immediate_data, src->immediate_data);
++ if (strlen(src->initial_r2t))
++ strcpy(dst->initial_r2t, src->initial_r2t);
++ if (strlen(src->data_seq_inorder))
++ strcpy(dst->data_seq_inorder, src->data_seq_inorder);
++ if (strlen(src->data_pdu_inorder))
++ strcpy(dst->data_pdu_inorder, src->data_pdu_inorder);
++ if (src->erl)
++ dst->erl = src->erl;
++ if (src->max_recv_dlength)
++ dst->max_recv_dlength = src->max_recv_dlength;
++ if (src->first_burst_len)
++ dst->first_burst_len = src->first_burst_len;
++ if (src->max_out_r2t)
++ dst->max_out_r2t = src->max_out_r2t;
++ if (src->max_burst_len)
++ dst->max_burst_len = src->max_burst_len;
++ if (strlen(src->chap_auth))
++ strcpy(dst->chap_auth, src->chap_auth);
++ if (strlen(src->bidi_chap))
++ strcpy(dst->bidi_chap, src->bidi_chap);
++ if (strlen(src->strict_login_comp))
++ strcpy(dst->strict_login_comp, src->strict_login_comp);
++ if (strlen(src->discovery_auth))
++ strcpy(dst->discovery_auth, src->discovery_auth);
++ if (strlen(src->discovery_logout))
++ strcpy(dst->discovery_logout, src->discovery_logout);
+ if (strlen(src->hwaddress))
+ strcpy(dst->hwaddress, src->hwaddress);
+ if (strlen(src->transport_name))
+@@ -1026,6 +1125,79 @@ struct iface_param_count {
+ int count;
+ };
+
++#define IFACE_NET_PARAM_EN_CNT(param_val, cnt) { \
++ if (!strcmp(param_val, "disable") || \
++ !strcmp(param_val, "enable")) \
++ (*cnt)++; \
++}
++
++/**
++ * iface_get_common_param_count - Gets common parameters count for given iface
++ * @iface: iface to setup
++ * @count: number of parameters to set
++ */
++static void iface_get_common_param_count(struct iface_rec *iface, int *count)
++{
++ if (strcmp(iface->vlan_state, "disable")) {
++ /* vlan_state enabled */
++ (*count)++;
++
++ if (iface->vlan_id)
++ /* For vlan value */
++ (*count)++;
++ } else {
++ /* vlan_state disabled */
++ (*count)++;
++ }
++
++ if (iface->mtu)
++ (*count)++;
++
++ if (iface->port)
++ (*count)++;
++
++ IFACE_NET_PARAM_EN_CNT(iface->delayed_ack, count);
++ IFACE_NET_PARAM_EN_CNT(iface->nagle, count);
++ IFACE_NET_PARAM_EN_CNT(iface->tcp_wsf_state, count);
++ IFACE_NET_PARAM_EN_CNT(iface->tcp_timestamp, count);
++ IFACE_NET_PARAM_EN_CNT(iface->redirect, count);
++ IFACE_NET_PARAM_EN_CNT(iface->header_digest, count);
++ IFACE_NET_PARAM_EN_CNT(iface->data_digest, count);
++ IFACE_NET_PARAM_EN_CNT(iface->immediate_data, count);
++ IFACE_NET_PARAM_EN_CNT(iface->initial_r2t, count);
++ IFACE_NET_PARAM_EN_CNT(iface->data_seq_inorder, count);
++ IFACE_NET_PARAM_EN_CNT(iface->data_pdu_inorder, count);
++ IFACE_NET_PARAM_EN_CNT(iface->chap_auth, count);
++ IFACE_NET_PARAM_EN_CNT(iface->bidi_chap, count);
++ IFACE_NET_PARAM_EN_CNT(iface->strict_login_comp, count);
++ IFACE_NET_PARAM_EN_CNT(iface->discovery_auth, count);
++ IFACE_NET_PARAM_EN_CNT(iface->discovery_logout, count);
++
++ if (iface->tcp_wsf)
++ (*count)++;
++
++ if (iface->tcp_timer_scale)
++ (*count)++;
++
++ if (iface->def_task_mgmt_tmo)
++ (*count)++;
++
++ if (iface->erl)
++ (*count)++;
++
++ if (iface->max_recv_dlength)
++ (*count)++;
++
++ if (iface->first_burst_len)
++ (*count)++;
++
++ if (iface->max_burst_len)
++ (*count)++;
++
++ if (iface->max_out_r2t)
++ (*count)++;
++}
++
+ /**
+ * __iface_get_param_count - Gets netconfig parameter count for given iface
+ * @data: iface_param_count structure
+@@ -1044,10 +1216,10 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface)
+ if (iptype == ISCSI_IFACE_TYPE_IPV4) {
+
+ if (strcmp(iface->state, "disable")) {
+- if (strstr(iface->bootproto, "dhcp"))
++ if (strstr(iface->bootproto, "dhcp")) {
+ /* DHCP enabled */
+ count++;
+- else {
++ } else {
+ /* DHCP disabled */
+ count++;
+
+@@ -1062,12 +1234,13 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface)
+ if (strstr(iface->gateway, "."))
+ /* User configured Gateway */
+ count++;
+- } else
++ } else {
+ /*
+ * IPv4 Address not valid, decrement
+ * count of DHCP
+ */
+ count--;
++ }
+ }
+
+ /*
+@@ -1078,37 +1251,68 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface)
+ /* iface state */
+ count++;
+
+- if (strcmp(iface->vlan_state, "disable")) {
+- /* vlan_state enabled */
++ IFACE_NET_PARAM_EN_CNT(iface->dhcp_dns,
++ &count);
++
++ IFACE_NET_PARAM_EN_CNT(iface->dhcp_slp_da,
++ &count);
++
++ IFACE_NET_PARAM_EN_CNT(iface->tos_state,
++ &count);
++
++ IFACE_NET_PARAM_EN_CNT(iface->gratuitous_arp,
++ &count);
++
++ IFACE_NET_PARAM_EN_CNT(
++ iface->dhcp_alt_client_id_state,
++ &count);
++
++ if (iface->dhcp_alt_client_id[0])
+ count++;
+
+- if (iface->vlan_id)
+- /* For vlan value */
+- count++;
+- } else
+- /* vlan_state disabled */
++ IFACE_NET_PARAM_EN_CNT(
++ iface->dhcp_req_vendor_id_state,
++ &count);
++
++ IFACE_NET_PARAM_EN_CNT(
++ iface->dhcp_vendor_id_state,
++ &count);
++
++ if (iface->dhcp_vendor_id[0])
+ count++;
+
+- if (iface->mtu)
++ IFACE_NET_PARAM_EN_CNT(iface->dhcp_learn_iqn,
++ &count);
++
++ IFACE_NET_PARAM_EN_CNT(iface->fragmentation,
++ &count);
++
++ IFACE_NET_PARAM_EN_CNT(
++ iface->incoming_forwarding,
++ &count);
++
++ if (iface->tos)
+ count++;
+
+- if (iface->port)
++ if (iface->ttl)
+ count++;
++
++ iface_get_common_param_count(iface, &count);
+ }
+- } else
++ } else {
+ /* IPv4 is disabled, iface state */
+ count++;
+-
++ }
+ } else if (iptype == ISCSI_IFACE_TYPE_IPV6) {
+
+ if (strcmp(iface->state, "disable")) {
+
+ /* IPv6 Address */
+ if (strstr(iface->ipv6_autocfg, "nd") ||
+- strstr(iface->ipv6_autocfg, "dhcpv6"))
++ strstr(iface->ipv6_autocfg, "dhcpv6")) {
+ /* Autocfg enabled */
+ count++;
+- else {
++ } else {
+ /* Autocfg disabled */
+ count++;
+
+@@ -1169,26 +1373,42 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface)
+ /* iface state */
+ count++;
+
+- if (strcmp(iface->vlan_state, "disable")) {
+- /* vlan_state enabled */
++ IFACE_NET_PARAM_EN_CNT(
++ iface->gratuitous_neighbor_adv,
++ &count);
++
++ IFACE_NET_PARAM_EN_CNT(iface->mld, &count);
++
++ if (iface->flow_label)
++ count++;
++
++ if (iface->traffic_class)
++ count++;
++
++ if (iface->hop_limit)
+ count++;
+
+- if (iface->vlan_id)
+- /* For vlan value */
+- count++;
+- } else
+- /* vlan_state disabled */
++ if (iface->nd_reachable_tmo)
+ count++;
+
+- if (iface->mtu)
++ if (iface->nd_rexmit_time)
+ count++;
+
+- if (iface->port)
++ if (iface->nd_stale_tmo)
+ count++;
++
++ if (iface->dup_addr_detect_cnt)
++ count++;
++
++ if (iface->router_adv_link_mtu)
++ count++;
++
++ iface_get_common_param_count(iface, &count);
+ }
+- } else
++ } else {
+ /* IPv6 is disabled, iface state */
+ count++;
++ }
+ }
+
+ iface_params->count += count;
+@@ -1578,6 +1798,44 @@ free:
+ } \
+ }
+
++/* write string parameter value */
++static int iface_fill_str_param_val(struct iovec *iov, uint32_t iface_num,
++ uint8_t iface_type, uint16_t param,
++ uint32_t param_len, char *param_val)
++{
++ int len;
++ struct iscsi_iface_param_info *net_param;
++ struct nlattr *attr;
++
++ if (!param_val[0])
++ return 1;
++
++ len = sizeof(struct iscsi_iface_param_info) + param_len;
++ iov->iov_base = iscsi_nla_alloc(param, len);
++ if (!(iov->iov_base))
++ return 1;
++
++ attr = iov->iov_base;
++ iov->iov_len = NLA_ALIGN(attr->nla_len);
++ net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
++ net_param->iface_num = iface_num;
++ net_param->len = param_len;
++ net_param->param = param;
++ net_param->iface_type = iface_type;
++ net_param->param_type = ISCSI_NET_PARAM;
++ memcpy(net_param->value, param_val, param_len);
++ return 0;
++}
++
++#define IFACE_SET_NET_PARAM_STRVAL(iov, inum, itype, param, plen, \
++ ival, gcnt, lcnt) { \
++ if (!iface_fill_str_param_val(iov, inum, itype, param, plen, \
++ ival)) { \
++ (*gcnt)++; \
++ (*lcnt)++; \
++ } \
++}
++
+ struct iface_net_config {
+ struct iface_rec *primary;
+ struct iovec *iovs;
+@@ -1597,8 +1855,12 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ /* start at 2, because 0 is for nlmsghdr and 1 for event */
+ iov = net_config->iovs + 2;
+
++ if (!iface->port)
++ iface->port = 3260;
++
+ iptype = iface_get_iptype(iface);
+- if (iptype == ISCSI_IFACE_TYPE_IPV4) {
++ switch (iptype) {
++ case ISCSI_IFACE_TYPE_IPV4:
+ if (!strcmp(iface->state, "disable")) {
+ IFACE_SET_PARAM_STATE(&iov[net_config->count],
+ iface->iface_num,
+@@ -1652,53 +1914,136 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ */
+ if (count) {
+ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN,
++ ISCSI_NET_PARAM,
++ iface->dhcp_dns,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN,
++ ISCSI_NET_PARAM,
++ iface->dhcp_slp_da,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IPV4_TOS_EN,
++ ISCSI_NET_PARAM,
++ iface->tos_state,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
+ iface->iface_num,
+ ISCSI_IFACE_TYPE_IPV4,
+- ISCSI_NET_PARAM_IFACE_ENABLE,
++ ISCSI_NET_PARAM_IPV4_TOS,
+ ISCSI_NET_PARAM,
+- iface->state,
++ 1,
++ iface->tos,
+ &net_config->count,
+ &count);
+
+ IFACE_SET_PARAM_STATE(&iov[net_config->count],
+ iface->iface_num,
+ ISCSI_IFACE_TYPE_IPV4,
+- ISCSI_NET_PARAM_VLAN_ENABLED,
++ ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN,
+ ISCSI_NET_PARAM,
+- iface->vlan_state,
++ iface->gratuitous_arp,
+ &net_config->count,
+ &count);
+
+- if (strcmp(iface->vlan_state, "disable") &&
+- iface->vlan_id) {
+- if (!iface_fill_vlan_id(&iov[net_config->count],
+- iface, ISCSI_IFACE_TYPE_IPV4)) {
+- net_config->count++;
+- count++;
+- }
+- }
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN,
++ ISCSI_NET_PARAM,
++ iface->dhcp_alt_client_id_state,
++ &net_config->count,
++ &count);
+
+- IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
+- iface->iface_num,
+- ISCSI_IFACE_TYPE_IPV4,
+- ISCSI_NET_PARAM_MTU,
+- ISCSI_NET_PARAM,
+- 2,
+- iface->mtu,
+- &net_config->count,
+- &count);
++ IFACE_SET_NET_PARAM_STRVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID,
++ strlen(iface->dhcp_alt_client_id),
++ iface->dhcp_alt_client_id,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN,
++ ISCSI_NET_PARAM,
++ iface->dhcp_req_vendor_id_state,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN,
++ ISCSI_NET_PARAM,
++ iface->dhcp_vendor_id_state,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_NET_PARAM_STRVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID,
++ strlen(iface->dhcp_vendor_id),
++ iface->dhcp_vendor_id,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN,
++ ISCSI_NET_PARAM,
++ iface->dhcp_learn_iqn,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE,
++ ISCSI_NET_PARAM,
++ iface->fragmentation,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV4,
++ ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN,
++ ISCSI_NET_PARAM,
++ iface->incoming_forwarding,
++ &net_config->count,
++ &count);
+
+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
+ iface->iface_num,
+ ISCSI_IFACE_TYPE_IPV4,
+- ISCSI_NET_PARAM_PORT,
++ ISCSI_NET_PARAM_IPV4_TTL,
+ ISCSI_NET_PARAM,
+- 2,
+- iface->port,
++ 1,
++ iface->ttl,
+ &net_config->count,
+ &count);
+ }
+- } else if (iptype == ISCSI_IFACE_TYPE_IPV6) {
++ break;
++
++ case ISCSI_IFACE_TYPE_IPV6:
+ if (!strcmp(iface->state, "disable")) {
+ IFACE_SET_PARAM_STATE(&iov[net_config->count],
+ iface->iface_num,
+@@ -1786,53 +2131,377 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
+ */
+ if (count) {
+ IFACE_SET_PARAM_STATE(&iov[net_config->count],
+- iface->iface_num,
+- ISCSI_IFACE_TYPE_IPV6,
+- ISCSI_NET_PARAM_IFACE_ENABLE,
+- ISCSI_NET_PARAM,
+- iface->state,
+- &net_config->count,
+- &count);
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN,
++ ISCSI_NET_PARAM,
++ iface->gratuitous_neighbor_adv,
++ &net_config->count,
++ &count);
+
+ IFACE_SET_PARAM_STATE(&iov[net_config->count],
+ iface->iface_num,
+ ISCSI_IFACE_TYPE_IPV6,
+- ISCSI_NET_PARAM_VLAN_ENABLED,
++ ISCSI_NET_PARAM_IPV6_MLD_EN,
+ ISCSI_NET_PARAM,
+- iface->vlan_state,
++ iface->mld,
+ &net_config->count,
+ &count);
+
+- if (strcmp(iface->vlan_state, "disable") &&
+- iface->vlan_id) {
+- if (!iface_fill_vlan_id(&iov[net_config->count],
+- iface,
+- ISCSI_IFACE_TYPE_IPV6)) {
+- net_config->count++;
+- count++;
+- }
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_IPV6_FLOW_LABEL,
++ ISCSI_NET_PARAM,
++ 4,
++ iface->flow_label,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS,
++ ISCSI_NET_PARAM,
++ 1,
++ iface->traffic_class,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_IPV6_HOP_LIMIT,
++ ISCSI_NET_PARAM,
++ 1,
++ iface->hop_limit,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO,
++ ISCSI_NET_PARAM,
++ 4,
++ iface->nd_reachable_tmo,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME,
++ ISCSI_NET_PARAM,
++ 4,
++ iface->nd_rexmit_time,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_IPV6_ND_STALE_TMO,
++ ISCSI_NET_PARAM,
++ 4,
++ iface->nd_stale_tmo,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT,
++ ISCSI_NET_PARAM,
++ 1,
++ iface->dup_addr_detect_cnt,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ ISCSI_IFACE_TYPE_IPV6,
++ ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU,
++ ISCSI_NET_PARAM,
++ 4,
++ iface->router_adv_link_mtu,
++ &net_config->count,
++ &count);
++ }
++ break;
++ }
++
++ /* Fill parameters common to IPv4 and IPv6 ifaces */
++ if (count) {
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_NET_PARAM_IFACE_ENABLE,
++ ISCSI_NET_PARAM,
++ iface->state,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_NET_PARAM_VLAN_ENABLED,
++ ISCSI_NET_PARAM,
++ iface->vlan_state,
++ &net_config->count,
++ &count);
++
++ if (strcmp(iface->vlan_state, "disable") && iface->vlan_id) {
++ if (!iface_fill_vlan_id(&iov[net_config->count], iface,
++ iptype)) {
++ net_config->count++;
++ count++;
+ }
+-
+- IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
+- iface->iface_num,
+- ISCSI_IFACE_TYPE_IPV6,
+- ISCSI_NET_PARAM_MTU,
+- ISCSI_NET_PARAM,
+- 2,
+- iface->mtu,
+- &net_config->count,
+- &count);
+-
+- IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
+- iface->iface_num,
+- ISCSI_IFACE_TYPE_IPV6,
+- ISCSI_NET_PARAM_PORT,
+- ISCSI_NET_PARAM,
+- 2,
+- iface->port,
+- &net_config->count,
+- &count);
+ }
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_NET_PARAM_MTU,
++ ISCSI_NET_PARAM,
++ 2,
++ iface->mtu,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_NET_PARAM_PORT,
++ ISCSI_NET_PARAM,
++ 2,
++ iface->port,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_NET_PARAM_DELAYED_ACK_EN,
++ ISCSI_NET_PARAM,
++ iface->delayed_ack,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_NET_PARAM_TCP_NAGLE_DISABLE,
++ ISCSI_NET_PARAM,
++ iface->nagle,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_NET_PARAM_TCP_WSF_DISABLE,
++ ISCSI_NET_PARAM,
++ iface->tcp_wsf_state,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_NET_PARAM_TCP_WSF,
++ ISCSI_NET_PARAM,
++ 1,
++ iface->tcp_wsf,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_NET_PARAM_TCP_TIMER_SCALE,
++ ISCSI_NET_PARAM,
++ 1,
++ iface->tcp_timer_scale,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_NET_PARAM_TCP_TIMESTAMP_EN,
++ ISCSI_NET_PARAM,
++ iface->tcp_timestamp,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_NET_PARAM_REDIRECT_EN,
++ ISCSI_NET_PARAM,
++ iface->redirect,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO,
++ ISCSI_IFACE_PARAM,
++ 2,
++ iface->def_task_mgmt_tmo,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_HDRDGST_EN,
++ ISCSI_IFACE_PARAM,
++ iface->header_digest,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_DATADGST_EN,
++ ISCSI_IFACE_PARAM,
++ iface->data_digest,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_IMM_DATA_EN,
++ ISCSI_IFACE_PARAM,
++ iface->immediate_data,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_INITIAL_R2T_EN,
++ ISCSI_IFACE_PARAM,
++ iface->initial_r2t,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN,
++ ISCSI_IFACE_PARAM,
++ iface->data_seq_inorder,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_PDU_INORDER_EN,
++ ISCSI_IFACE_PARAM,
++ iface->data_pdu_inorder,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_ERL,
++ ISCSI_IFACE_PARAM,
++ 1,
++ iface->erl,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH,
++ ISCSI_IFACE_PARAM,
++ 4,
++ iface->max_recv_dlength,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_FIRST_BURST,
++ ISCSI_IFACE_PARAM,
++ 4,
++ iface->first_burst_len,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_MAX_R2T,
++ ISCSI_IFACE_PARAM,
++ 2,
++ iface->max_out_r2t,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_MAX_BURST,
++ ISCSI_IFACE_PARAM,
++ 4,
++ iface->max_burst_len,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_CHAP_AUTH_EN,
++ ISCSI_IFACE_PARAM,
++ iface->chap_auth,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_BIDI_CHAP_EN,
++ ISCSI_IFACE_PARAM,
++ iface->bidi_chap,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN,
++ ISCSI_IFACE_PARAM,
++ iface->strict_login_comp,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL,
++ ISCSI_IFACE_PARAM,
++ iface->discovery_auth,
++ &net_config->count,
++ &count);
++
++ IFACE_SET_PARAM_STATE(&iov[net_config->count],
++ iface->iface_num,
++ iptype,
++ ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN,
++ ISCSI_IFACE_PARAM,
++ iface->discovery_logout,
++ &net_config->count,
++ &count);
+ }
+ return 0;
+ }
+diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c
+index 04c3673..c916ed8 100644
+--- a/usr/iscsi_sysfs.c
++++ b/usr/iscsi_sysfs.c
+@@ -856,6 +856,71 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no,
+
+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "subnet",
+ iface->subnet_mask, sizeof(iface->subnet_mask));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "dhcp_alt_client_id_en",
++ iface->dhcp_alt_client_id_state,
++ sizeof(iface->dhcp_alt_client_id_state));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "dhcp_alt_client_id",
++ iface->dhcp_alt_client_id,
++ sizeof(iface->dhcp_alt_client_id));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "dhcp_dns_address_en",
++ iface->dhcp_dns, sizeof(iface->dhcp_dns));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "dhcp_learn_iqn_en",
++ iface->dhcp_learn_iqn,
++ sizeof(iface->dhcp_learn_iqn));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "dhcp_req_vendor_id_en",
++ iface->dhcp_req_vendor_id_state,
++ sizeof(iface->dhcp_req_vendor_id_state));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "dhcp_use_vendor_id_en",
++ iface->dhcp_vendor_id_state,
++ sizeof(iface->dhcp_vendor_id_state));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "dhcp_vendor_id",
++ iface->dhcp_vendor_id,
++ sizeof(iface->dhcp_vendor_id));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "dhcp_slp_da_info_en",
++ iface->dhcp_slp_da, sizeof(iface->dhcp_slp_da));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "fragment_disable",
++ iface->fragmentation,
++ sizeof(iface->fragmentation));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "grat_arp_en",
++ iface->gratuitous_arp,
++ sizeof(iface->gratuitous_arp));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "incoming_forwarding_en",
++ iface->incoming_forwarding,
++ sizeof(iface->incoming_forwarding));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "tos_en",
++ iface->tos_state, sizeof(iface->tos_state));
++
++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "tos", &iface->tos))
++ iface->tos = 0;
++
++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "ttl", &iface->ttl))
++ iface->ttl = 0;
+ } else {
+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
+ "ipaddr_autocfg",
+@@ -872,6 +937,53 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no,
+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "router_addr",
+ iface->ipv6_router,
+ sizeof(iface->ipv6_router));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "router_state",
++ iface->router_autocfg,
++ sizeof(iface->router_autocfg));
++
++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "dup_addr_detect_cnt",
++ &iface->dup_addr_detect_cnt))
++ iface->dup_addr_detect_cnt = 0;
++
++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "flow_label", &iface->flow_label))
++ iface->flow_label = 0;
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "grat_neighbor_adv_en",
++ iface->gratuitous_neighbor_adv,
++ sizeof(iface->gratuitous_neighbor_adv));
++
++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "hop_limit", &iface->hop_limit))
++ iface->hop_limit = 0;
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "mld_en",
++ iface->mld, sizeof(iface->mld));
++
++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "nd_reachable_tmo",
++ &iface->nd_reachable_tmo))
++ iface->nd_reachable_tmo = 0;
++
++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "nd_rexmit_time", &iface->nd_rexmit_time))
++ iface->nd_rexmit_time = 0;
++
++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "nd_stale_tmo", &iface->nd_stale_tmo))
++ iface->nd_stale_tmo = 0;
++
++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "router_adv_link_mtu",
++ &iface->router_adv_link_mtu))
++ iface->router_adv_link_mtu = 0;
++
++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "traffic_class", &iface->traffic_class))
++ iface->traffic_class = 0;
+ }
+
+ if (sysfs_get_uint16(iface_kern_id, ISCSI_IFACE_SUBSYS, "port",
+@@ -888,6 +1000,94 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no,
+ &iface->vlan_priority))
+ iface->vlan_priority = UINT8_MAX;
+
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "vlan_enabled",
++ iface->vlan_state, sizeof(iface->vlan_state));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "enabled",
++ iface->state, sizeof(iface->state));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "delayed_ack_en",
++ iface->delayed_ack, sizeof(iface->delayed_ack));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_nagle_disable",
++ iface->nagle, sizeof(iface->nagle));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_wsf_disable",
++ iface->tcp_wsf_state, sizeof(iface->tcp_wsf_state));
++
++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_wsf",
++ &iface->tcp_wsf))
++ iface->tcp_wsf = 0;
++
++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "tcp_timer_scale", &iface->tcp_timer_scale))
++ iface->tcp_timer_scale = 0;
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_timestamp_en",
++ iface->tcp_timestamp, sizeof(iface->tcp_timestamp));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "redirect_en",
++ iface->redirect, sizeof(iface->redirect));
++
++ if (sysfs_get_uint16(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "def_taskmgmt_tmo", &iface->def_task_mgmt_tmo))
++ iface->def_task_mgmt_tmo = 0;
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "header_digest",
++ iface->header_digest, sizeof(iface->header_digest));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "data_digest",
++ iface->data_digest, sizeof(iface->data_digest));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "immediate_data",
++ iface->immediate_data, sizeof(iface->immediate_data));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "initial_r2t",
++ iface->initial_r2t, sizeof(iface->initial_r2t));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "data_seq_in_order",
++ iface->data_seq_inorder, sizeof(iface->data_seq_inorder));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "data_pdu_in_order",
++ iface->data_pdu_inorder, sizeof(iface->data_pdu_inorder));
++
++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, "erl",
++ &iface->erl))
++ iface->erl = 0;
++
++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "max_recv_dlength", &iface->max_recv_dlength))
++ iface->max_recv_dlength = 0;
++
++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "first_burst_len", &iface->first_burst_len))
++ iface->first_burst_len = 0;
++
++ if (sysfs_get_uint16(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "max_outstanding_r2t", &iface->max_out_r2t))
++ iface->max_out_r2t = 0;
++
++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "max_burst_len", &iface->max_burst_len))
++ iface->max_burst_len = 0;
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "chap_auth",
++ iface->chap_auth, sizeof(iface->chap_auth));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "bidi_chap",
++ iface->bidi_chap, sizeof(iface->bidi_chap));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "strict_login_comp_en",
++ iface->strict_login_comp,
++ sizeof(iface->strict_login_comp));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS,
++ "discovery_auth_optional",
++ iface->discovery_auth, sizeof(iface->discovery_auth));
++
++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "discovery_logout",
++ iface->discovery_logout, sizeof(iface->discovery_logout));
++
+ if (sscanf(iface_kern_id, "ipv%d-iface-%u-%u", &iface_type,
+ &tmp_host_no, &iface_num) == 3)
+ iface->iface_num = iface_num;
+--
+1.8.3.1
+
diff --git a/0050-iscsi-tools-iface-params-should-be-updated-for-node_.patch b/0050-iscsi-tools-iface-params-should-be-updated-for-node_.patch
new file mode 100644
index 0000000..28e212f
--- /dev/null
+++ b/0050-iscsi-tools-iface-params-should-be-updated-for-node_.patch
@@ -0,0 +1,119 @@
+From 9260457c1df5f519a63744114cbdf7e50cd75ed7 Mon Sep 17 00:00:00 2001
+From: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Date: Fri, 18 Oct 2013 09:29:25 -0400
+Subject: [PATCH] iscsi tools: iface params should be updated for node_rec as
+ well.
+
+While updating iface params, the changes should get applied to the
+node records as well.
+
+Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Signed-off-by: Vikas Chaudhary <vikas.chaudhary at qlogic.com>
+---
+ usr/idbm.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 90 insertions(+)
+
+diff --git a/usr/idbm.c b/usr/idbm.c
+index 4428ebe..c6460ad 100644
+--- a/usr/idbm.c
++++ b/usr/idbm.c
+@@ -292,6 +292,96 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri)
+ __recinfo_uint16(IFACE_MTU, ri, r, iface.mtu, IDBM_SHOW, num, 1);
+ __recinfo_uint16(IFACE_PORT, ri, r, iface.port, IDBM_SHOW, num, 1);
+
++ __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, iface.dhcp_alt_client_id_state,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, iface.dhcp_alt_client_id,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_DNS, ri, r, iface.dhcp_dns, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, iface.dhcp_learn_iqn,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, iface.dhcp_req_vendor_id_state,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_VID, ri, r, iface.dhcp_vendor_id_state,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_VID_STR, ri, r, iface.dhcp_vendor_id,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, iface.dhcp_slp_da, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_FRAGMENTATION, ri, r, iface.fragmentation,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_GRAT_ARP, ri, r, iface.gratuitous_arp, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_IN_FORWARD, ri, r, iface.incoming_forwarding,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_TOS_STATE, ri, r, iface.tos_state, IDBM_SHOW, num,
++ 1);
++ __recinfo_uint8(IFACE_TOS, ri, r, iface.tos, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TTL, ri, r, iface.ttl, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r,
++ iface.dup_addr_detect_cnt, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, iface.flow_label, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r,
++ iface.gratuitous_neighbor_adv, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, iface.hop_limit, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_MLD, ri, r, iface.mld, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, iface.nd_reachable_tmo,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, iface.nd_rexmit_time,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, iface.nd_stale_tmo,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r,
++ iface.router_adv_link_mtu, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, iface.traffic_class,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DELAYED_ACK, ri, r, iface.delayed_ack, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_TCP_NAGLE, ri, r, iface.nagle, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_TCP_WSF_STATE, ri, r, iface.tcp_wsf_state,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TCP_WSF, ri, r, iface.tcp_wsf, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TCP_TIMER_SCALE, ri, r, iface.tcp_timer_scale,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_TCP_TIMESTAMP, ri, r, iface.tcp_timestamp,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_REDIRECT, ri, r, iface.redirect, IDBM_SHOW, num, 1);
++ __recinfo_uint16(IFACE_DEF_TMF_TMO, ri, r, iface.def_task_mgmt_tmo,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_HDRDGST, ri, r, iface.header_digest, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DATADGST, ri, r, iface.data_digest, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_IMM_DATA, ri, r, iface.immediate_data, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_INITIAL_R2T, ri, r, iface.initial_r2t, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DSEQ_INORDER, ri, r, iface.data_seq_inorder,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DPDU_INORDER, ri, r, iface.data_pdu_inorder,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_ERL, ri, r, iface.erl, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_MAX_RECV_DLEN, ri, r, iface.max_recv_dlength,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_FIRST_BURST, ri, r, iface.first_burst_len,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint16(IFACE_MAX_R2T, ri, r, iface.max_out_r2t, IDBM_SHOW,
++ num, 1);
++ __recinfo_uint32(IFACE_MAX_BURST, ri, r, iface.max_burst_len, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_CHAP_AUTH, ri, r, iface.chap_auth, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_BIDI_CHAP, ri, r, iface.bidi_chap, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_STRICT_LOGIN_COMP, ri, r, iface.strict_login_comp,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DISCOVERY_AUTH, ri, r, iface.discovery_auth,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DISCOVERY_LOGOUT, ri, r, iface.discovery_logout,
++ IDBM_SHOW, num, 1);
++
++
+ __recinfo_str(NODE_DISC_ADDR, ri, r, disc_address, IDBM_SHOW,
+ num, 0);
+ __recinfo_int(NODE_DISC_PORT, ri, r, disc_port, IDBM_SHOW,
+--
+1.8.3.1
+
diff --git a/0051-iscsi-tools-Let-default-type-of-iface-be-ipv4.patch b/0051-iscsi-tools-Let-default-type-of-iface-be-ipv4.patch
new file mode 100644
index 0000000..7149ea8
--- /dev/null
+++ b/0051-iscsi-tools-Let-default-type-of-iface-be-ipv4.patch
@@ -0,0 +1,33 @@
+From 75ee9d0af6e200b34e84b1e7b37971213b2fd629 Mon Sep 17 00:00:00 2001
+From: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Date: Fri, 18 Oct 2013 09:29:26 -0400
+Subject: [PATCH] iscsi tools: Let default type of iface be ipv4
+
+While using iface name to determine its type if the name does not
+contain iface type then assume it be to of type ipv4 by default.
+
+Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Signed-off-by: Vikas Chaudhary <vikas.chaudhary at qlogic.com>
+---
+ usr/iface.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/usr/iface.c b/usr/iface.c
+index 87ac875..870dba0 100644
+--- a/usr/iface.c
++++ b/usr/iface.c
+@@ -450,8 +450,10 @@ int iface_get_iptype(struct iface_rec *iface)
+ /* try to figure out by name */
+ if (strstr(iface->name, "ipv4"))
+ return ISCSI_IFACE_TYPE_IPV4;
+- else
++ else if (strstr(iface->name, "ipv6"))
+ return ISCSI_IFACE_TYPE_IPV6;
++ else /* assume ipv4 by default */
++ return ISCSI_IFACE_TYPE_IPV4;
+ } else {
+ if (strcmp(iface->bootproto, "dhcp") &&
+ !strstr(iface->ipaddress, "."))
+--
+1.8.3.1
+
diff --git a/0052-iscsi-tools-Show-iface-params-based-on-iface-type.patch b/0052-iscsi-tools-Show-iface-params-based-on-iface-type.patch
new file mode 100644
index 0000000..2a1da56
--- /dev/null
+++ b/0052-iscsi-tools-Show-iface-params-based-on-iface-type.patch
@@ -0,0 +1,310 @@
+From 4a5e9e29d7516e34e35a15c7342afbc3a1c8c176 Mon Sep 17 00:00:00 2001
+From: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Date: Fri, 18 Oct 2013 09:29:27 -0400
+Subject: [PATCH] iscsi tools: Show iface params based on iface type
+
+Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi at qlogic.com>
+Signed-off-by: Vikas Chaudhary <vikas.chaudhary at qlogic.com>
+---
+ usr/idbm.c | 250 ++++++++++++++++++++++++++++++++++---------------------------
+ 1 file changed, 138 insertions(+), 112 deletions(-)
+
+diff --git a/usr/idbm.c b/usr/idbm.c
+index c6460ad..1ade099 100644
+--- a/usr/idbm.c
++++ b/usr/idbm.c
+@@ -237,6 +237,9 @@ void
+ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri)
+ {
+ int num = 0, i;
++ int iface_type;
++
++ iface_type = iface_get_iptype(&r->iface);
+
+ __recinfo_str(NODE_NAME, ri, r, name, IDBM_SHOW, num, 0);
+ __recinfo_int(NODE_TPGT, ri, r, tpgt, IDBM_SHOW, num, 0);
+@@ -266,21 +269,6 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri)
+ __recinfo_str(IFACE_TRANSPORTNAME, ri, r, iface.transport_name,
+ IDBM_SHOW, num, 1);
+ __recinfo_str(IFACE_INAME, ri, r, iface.iname, IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_BOOT_PROTO, ri, r, iface.bootproto, IDBM_SHOW,
+- num, 1);
+- __recinfo_str(IFACE_SUBNET_MASK, ri, r, iface.subnet_mask,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_GATEWAY, ri, r, iface.gateway, IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, iface.ipv6_autocfg,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, iface.linklocal_autocfg,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, iface.router_autocfg,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_LINKLOCAL, ri, r, iface.ipv6_linklocal,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_ROUTER, ri, r, iface.ipv6_router, IDBM_SHOW, num,
+- 1);
+ __recinfo_str(IFACE_STATE, ri, r, iface.state, IDBM_SHOW, num, 1);
+ __recinfo_uint16(IFACE_VLAN_ID, ri, r, iface.vlan_id, IDBM_SHOW, num,
+ 1);
+@@ -292,50 +280,73 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri)
+ __recinfo_uint16(IFACE_MTU, ri, r, iface.mtu, IDBM_SHOW, num, 1);
+ __recinfo_uint16(IFACE_PORT, ri, r, iface.port, IDBM_SHOW, num, 1);
+
+- __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, iface.dhcp_alt_client_id_state,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, iface.dhcp_alt_client_id,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_DNS, ri, r, iface.dhcp_dns, IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, iface.dhcp_learn_iqn,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, iface.dhcp_req_vendor_id_state,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_VID, ri, r, iface.dhcp_vendor_id_state,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_VID_STR, ri, r, iface.dhcp_vendor_id,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, iface.dhcp_slp_da, IDBM_SHOW,
+- num, 1);
+- __recinfo_str(IFACE_FRAGMENTATION, ri, r, iface.fragmentation,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_GRAT_ARP, ri, r, iface.gratuitous_arp, IDBM_SHOW,
+- num, 1);
+- __recinfo_str(IFACE_IN_FORWARD, ri, r, iface.incoming_forwarding,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_TOS_STATE, ri, r, iface.tos_state, IDBM_SHOW, num,
+- 1);
+- __recinfo_uint8(IFACE_TOS, ri, r, iface.tos, IDBM_SHOW, num, 1);
+- __recinfo_uint8(IFACE_TTL, ri, r, iface.ttl, IDBM_SHOW, num, 1);
+- __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r,
+- iface.dup_addr_detect_cnt, IDBM_SHOW, num, 1);
+- __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, iface.flow_label, IDBM_SHOW,
+- num, 1);
+- __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r,
+- iface.gratuitous_neighbor_adv, IDBM_SHOW, num, 1);
+- __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, iface.hop_limit, IDBM_SHOW,
+- num, 1);
+- __recinfo_str(IFACE_MLD, ri, r, iface.mld, IDBM_SHOW, num, 1);
+- __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, iface.nd_reachable_tmo,
+- IDBM_SHOW, num, 1);
+- __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, iface.nd_rexmit_time,
+- IDBM_SHOW, num, 1);
+- __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, iface.nd_stale_tmo,
+- IDBM_SHOW, num, 1);
+- __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r,
+- iface.router_adv_link_mtu, IDBM_SHOW, num, 1);
+- __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, iface.traffic_class,
+- IDBM_SHOW, num, 1);
++ if (iface_type == ISCSI_IFACE_TYPE_IPV4) {
++ __recinfo_str(IFACE_BOOT_PROTO, ri, r, iface.bootproto,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_SUBNET_MASK, ri, r, iface.subnet_mask,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_GATEWAY, ri, r, iface.gateway, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DHCP_ALT_CID, ri, r,
++ iface.dhcp_alt_client_id_state, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r,
++ iface.dhcp_alt_client_id, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_DNS, ri, r, iface.dhcp_dns, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r,
++ iface.dhcp_learn_iqn, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_REQ_VID, ri, r,
++ iface.dhcp_req_vendor_id_state, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DHCP_VID, ri, r, iface.dhcp_vendor_id_state,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_VID_STR, ri, r, iface.dhcp_vendor_id,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, iface.dhcp_slp_da,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_FRAGMENTATION, ri, r, iface.fragmentation,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_GRAT_ARP, ri, r, iface.gratuitous_arp,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_IN_FORWARD, ri, r,
++ iface.incoming_forwarding, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_TOS_STATE, ri, r, iface.tos_state,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TOS, ri, r, iface.tos, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TTL, ri, r, iface.ttl, IDBM_SHOW, num, 1);
++ } else if (iface_type == ISCSI_IFACE_TYPE_IPV6) {
++ __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, iface.ipv6_autocfg,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r,
++ iface.linklocal_autocfg, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, iface.router_autocfg,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_LINKLOCAL, ri, r, iface.ipv6_linklocal,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_ROUTER, ri, r, iface.ipv6_router,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r,
++ iface.dup_addr_detect_cnt, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, iface.flow_label,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r,
++ iface.gratuitous_neighbor_adv, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, iface.hop_limit,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_MLD, ri, r, iface.mld, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r,
++ iface.nd_reachable_tmo, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r,
++ iface.nd_rexmit_time, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, iface.nd_stale_tmo,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r,
++ iface.router_adv_link_mtu, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, iface.traffic_class,
++ IDBM_SHOW, num, 1);
++ }
++
+ __recinfo_str(IFACE_DELAYED_ACK, ri, r, iface.delayed_ack, IDBM_SHOW,
+ num, 1);
+ __recinfo_str(IFACE_TCP_NAGLE, ri, r, iface.nagle, IDBM_SHOW, num, 1);
+@@ -515,6 +526,9 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri)
+ void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri)
+ {
+ int num = 0;
++ int iface_type;
++
++ iface_type = iface_get_iptype(r);
+
+ __recinfo_str(IFACE_ISCSINAME, ri, r, name, IDBM_SHOW, num, 0);
+ __recinfo_str(IFACE_NETNAME, ri, r, netdev, IDBM_SHOW, num, 1);
+@@ -523,19 +537,6 @@ void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri)
+ __recinfo_str(IFACE_TRANSPORTNAME, ri, r, transport_name,
+ IDBM_SHOW, num, 1);
+ __recinfo_str(IFACE_INAME, ri, r, iname, IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_BOOT_PROTO, ri, r, bootproto, IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_SUBNET_MASK, ri, r, subnet_mask,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_GATEWAY, ri, r, gateway, IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, ipv6_autocfg,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, linklocal_autocfg,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, router_autocfg,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_LINKLOCAL, ri, r, ipv6_linklocal,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_ROUTER, ri, r, ipv6_router, IDBM_SHOW, num, 1);
+ __recinfo_str(IFACE_STATE, ri, r, state, IDBM_SHOW, num, 1);
+ __recinfo_uint16(IFACE_VLAN_ID, ri, r, vlan_id, IDBM_SHOW, num, 1);
+ __recinfo_uint8(IFACE_VLAN_PRIORITY, ri, r, vlan_priority,
+@@ -544,46 +545,71 @@ void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri)
+ __recinfo_int(IFACE_NUM, ri, r, iface_num, IDBM_SHOW, num, 1);
+ __recinfo_uint16(IFACE_MTU, ri, r, mtu, IDBM_SHOW, num, 1);
+ __recinfo_uint16(IFACE_PORT, ri, r, port, IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, dhcp_alt_client_id_state,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, dhcp_alt_client_id,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_DNS, ri, r, dhcp_dns, IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, dhcp_learn_iqn, IDBM_SHOW,
+- num, 1);
+- __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, dhcp_req_vendor_id_state,
+- IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_DHCP_VID, ri, r, dhcp_vendor_id_state, IDBM_SHOW,
+- num, 1);
+- __recinfo_str(IFACE_DHCP_VID_STR, ri, r, dhcp_vendor_id, IDBM_SHOW,
+- num, 1);
+- __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, dhcp_slp_da, IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_FRAGMENTATION, ri, r, fragmentation, IDBM_SHOW,
+- num, 1);
+- __recinfo_str(IFACE_GRAT_ARP, ri, r, gratuitous_arp, IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_IN_FORWARD, ri, r, incoming_forwarding, IDBM_SHOW,
+- num, 1);
+- __recinfo_str(IFACE_TOS_STATE, ri, r, tos_state, IDBM_SHOW, num, 1);
+- __recinfo_uint8(IFACE_TOS, ri, r, tos, IDBM_SHOW, num, 1);
+- __recinfo_uint8(IFACE_TTL, ri, r, ttl, IDBM_SHOW, num, 1);
+- __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r, dup_addr_detect_cnt,
+- IDBM_SHOW, num, 1);
+- __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, flow_label, IDBM_SHOW,
+- num, 1);
+- __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r, gratuitous_neighbor_adv,
+- IDBM_SHOW, num, 1);
+- __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, hop_limit, IDBM_SHOW, num, 1);
+- __recinfo_str(IFACE_MLD, ri, r, mld, IDBM_SHOW, num, 1);
+- __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, nd_reachable_tmo,
+- IDBM_SHOW, num, 1);
+- __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, nd_rexmit_time, IDBM_SHOW,
+- num, 1);
+- __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, nd_stale_tmo, IDBM_SHOW,
+- num, 1);
+- __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r, router_adv_link_mtu,
+- IDBM_SHOW, num, 1);
+- __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, traffic_class, IDBM_SHOW,
+- num, 1);
++
++ if (iface_type == ISCSI_IFACE_TYPE_IPV4) {
++ __recinfo_str(IFACE_BOOT_PROTO, ri, r, bootproto, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_SUBNET_MASK, ri, r, subnet_mask, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_GATEWAY, ri, r, gateway, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_ALT_CID, ri, r,
++ dhcp_alt_client_id_state, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, dhcp_alt_client_id,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_DNS, ri, r, dhcp_dns, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, dhcp_learn_iqn,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_REQ_VID, ri, r,
++ dhcp_req_vendor_id_state, IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_VID, ri, r, dhcp_vendor_id_state,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_VID_STR, ri, r, dhcp_vendor_id,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, dhcp_slp_da, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_FRAGMENTATION, ri, r, fragmentation,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_GRAT_ARP, ri, r, gratuitous_arp, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_IN_FORWARD, ri, r, incoming_forwarding,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_TOS_STATE, ri, r, tos_state, IDBM_SHOW,
++ num, 1);
++ __recinfo_uint8(IFACE_TOS, ri, r, tos, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TTL, ri, r, ttl, IDBM_SHOW, num, 1);
++ } else if (iface_type == ISCSI_IFACE_TYPE_IPV6) {
++ __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, ipv6_autocfg,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, linklocal_autocfg,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, router_autocfg,
++ IDBM_SHOW, num, 1);
++ __recinfo_str(IFACE_LINKLOCAL, ri, r, ipv6_linklocal, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_ROUTER, ri, r, ipv6_router, IDBM_SHOW,
++ num, 1);
++ __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r,
++ dup_addr_detect_cnt, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, flow_label, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r,
++ gratuitous_neighbor_adv, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, hop_limit, IDBM_SHOW,
++ num, 1);
++ __recinfo_str(IFACE_MLD, ri, r, mld, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r,
++ nd_reachable_tmo, IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, nd_rexmit_time,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, nd_stale_tmo,
++ IDBM_SHOW, num, 1);
++ __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r,
++ router_adv_link_mtu, IDBM_SHOW, num, 1);
++ __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, traffic_class,
++ IDBM_SHOW, num, 1);
++ }
++
+ __recinfo_str(IFACE_DELAYED_ACK, ri, r, delayed_ack, IDBM_SHOW, num, 1);
+ __recinfo_str(IFACE_TCP_NAGLE, ri, r, nagle, IDBM_SHOW, num, 1);
+ __recinfo_str(IFACE_TCP_WSF_STATE, ri, r, tcp_wsf_state, IDBM_SHOW,
+--
+1.8.3.1
+
diff --git a/iscsi-initiator-utils.spec b/iscsi-initiator-utils.spec
index 4fa2d59..e5a8fdf 100644
--- a/iscsi-initiator-utils.spec
+++ b/iscsi-initiator-utils.spec
@@ -55,6 +55,17 @@ Patch38: 0038-README-changes-to-use-long-option-index-instead-of-f.patch
Patch39: 0039-iscsiadm-Add-support-to-set-CHAP-entry-using-host-ch.patch
Patch40: 0040-iscsi-tools-Correctly-get-username_in-and-password_i.patch
Patch41: 0041-README-changes-for-adding-support-to-set-CHAP-entry.patch
+Patch42: 0042-iscsi-tools-Setup-iface-conf-file-with-all-iface-att.patch
+Patch43: 0043-iscsi_if.h-Remove-numbers-used-for-network-parameter.patch
+Patch44: 0044-iscsi_if.h-Additional-parameters-for-network-param-s.patch
+Patch45: 0045-iscsi-tools-Use-macro-to-set-IPv4-IPv6-IP-addresses.patch
+Patch46: 0046-iscsi-tools-Use-single-function-to-enable-disable-ne.patch
+Patch47: 0047-iscsi-tools-Use-single-function-to-set-integer-netwo.patch
+Patch48: 0048-iscsi-tools-Ignore-network-parameter-if-not-enabled-.patch
+Patch49: 0049-iscsi-tools-Additional-parameters-for-network-settin.patch
+Patch50: 0050-iscsi-tools-iface-params-should-be-updated-for-node_.patch
+Patch51: 0051-iscsi-tools-Let-default-type-of-iface-be-ipv4.patch
+Patch52: 0052-iscsi-tools-Show-iface-params-based-on-iface-type.patch
# not (yet) upstream merged
Patch143: 0143-idmb_rec_write-check-for-tpgt-first.patch
@@ -149,6 +160,17 @@ developing applications that use %{name}.
%patch39 -p1
%patch40 -p1
%patch41 -p1
+%patch42 -p1
+%patch43 -p1
+%patch44 -p1
+%patch45 -p1
+%patch46 -p1
+%patch47 -p1
+%patch48 -p1
+%patch49 -p1
+%patch50 -p1
+%patch51 -p1
+%patch52 -p1
# pending upstream merge
%patch143 -p1
%patch145 -p1
@@ -325,6 +347,7 @@ fi
- refresh boot session info patches to final version from upstream,
fixes context issues with later patches
- 1006156, 1006161 Add/Update entries in chap table through Open-iSCSI
+- 948134 extend support to set additional parameters for network configuration
* Fri Jan 24 2014 Daniel Mach <dmach at redhat.com> - 6.2.0.873-18
- Mass rebuild 2014-01-24
More information about the scm-commits
mailing list