static int qla4xxx_get_iface_param()

in qla4xxx/ql4_os.c [1260:1700]


static int qla4xxx_get_iface_param(struct iscsi_iface *iface,
				   enum iscsi_param_type param_type,
				   int param, char *buf)
{
	struct Scsi_Host *shost = iscsi_iface_to_shost(iface);
	struct scsi_qla_host *ha = to_qla_host(shost);
	int ival;
	char *pval = NULL;
	int len = -ENOSYS;

	if (param_type == ISCSI_NET_PARAM) {
		switch (param) {
		case ISCSI_NET_PARAM_IPV4_ADDR:
			len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address);
			break;
		case ISCSI_NET_PARAM_IPV4_SUBNET:
			len = sprintf(buf, "%pI4\n",
				      &ha->ip_config.subnet_mask);
			break;
		case ISCSI_NET_PARAM_IPV4_GW:
			len = sprintf(buf, "%pI4\n", &ha->ip_config.gateway);
			break;
		case ISCSI_NET_PARAM_IFACE_ENABLE:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
				OP_STATE(ha->ip_config.ipv4_options,
					 IPOPT_IPV4_PROTOCOL_ENABLE, pval);
			} else {
				OP_STATE(ha->ip_config.ipv6_options,
					 IPV6_OPT_IPV6_PROTOCOL_ENABLE, pval);
			}

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
			len = sprintf(buf, "%s\n",
				      (ha->ip_config.tcp_options &
				       TCPOPT_DHCP_ENABLE) ?
				      "dhcp" : "static");
			break;
		case ISCSI_NET_PARAM_IPV6_ADDR:
			if (iface->iface_num == 0)
				len = sprintf(buf, "%pI6\n",
					      &ha->ip_config.ipv6_addr0);
			if (iface->iface_num == 1)
				len = sprintf(buf, "%pI6\n",
					      &ha->ip_config.ipv6_addr1);
			break;
		case ISCSI_NET_PARAM_IPV6_LINKLOCAL:
			len = sprintf(buf, "%pI6\n",
				      &ha->ip_config.ipv6_link_local_addr);
			break;
		case ISCSI_NET_PARAM_IPV6_ROUTER:
			len = sprintf(buf, "%pI6\n",
				      &ha->ip_config.ipv6_default_router_addr);
			break;
		case ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG:
			pval = (ha->ip_config.ipv6_addl_options &
				IPV6_ADDOPT_NEIGHBOR_DISCOVERY_ADDR_ENABLE) ?
				"nd" : "static";

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG:
			pval = (ha->ip_config.ipv6_addl_options &
				IPV6_ADDOPT_AUTOCONFIG_LINK_LOCAL_ADDR) ?
				"auto" : "static";

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_VLAN_ID:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4)
				ival = ha->ip_config.ipv4_vlan_tag &
				       ISCSI_MAX_VLAN_ID;
			else
				ival = ha->ip_config.ipv6_vlan_tag &
				       ISCSI_MAX_VLAN_ID;

			len = sprintf(buf, "%d\n", ival);
			break;
		case ISCSI_NET_PARAM_VLAN_PRIORITY:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4)
				ival = (ha->ip_config.ipv4_vlan_tag >> 13) &
				       ISCSI_MAX_VLAN_PRIORITY;
			else
				ival = (ha->ip_config.ipv6_vlan_tag >> 13) &
				       ISCSI_MAX_VLAN_PRIORITY;

			len = sprintf(buf, "%d\n", ival);
			break;
		case ISCSI_NET_PARAM_VLAN_ENABLED:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
				OP_STATE(ha->ip_config.ipv4_options,
					 IPOPT_VLAN_TAGGING_ENABLE, pval);
			} else {
				OP_STATE(ha->ip_config.ipv6_options,
					 IPV6_OPT_VLAN_TAGGING_ENABLE, pval);
			}
			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_MTU:
			len = sprintf(buf, "%d\n", ha->ip_config.eth_mtu_size);
			break;
		case ISCSI_NET_PARAM_PORT:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4)
				len = sprintf(buf, "%d\n",
					      ha->ip_config.ipv4_port);
			else
				len = sprintf(buf, "%d\n",
					      ha->ip_config.ipv6_port);
			break;
		case ISCSI_NET_PARAM_IPADDR_STATE:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
				pval = iscsi_get_ipaddress_state_name(
						ha->ip_config.ipv4_addr_state);
			} else {
				if (iface->iface_num == 0)
					pval = iscsi_get_ipaddress_state_name(
						ha->ip_config.ipv6_addr0_state);
				else if (iface->iface_num == 1)
					pval = iscsi_get_ipaddress_state_name(
						ha->ip_config.ipv6_addr1_state);
			}

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE:
			pval = iscsi_get_ipaddress_state_name(
					ha->ip_config.ipv6_link_local_state);
			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV6_ROUTER_STATE:
			pval = iscsi_get_router_state_name(
				      ha->ip_config.ipv6_default_router_state);
			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_DELAYED_ACK_EN:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
				OP_STATE(~ha->ip_config.tcp_options,
					 TCPOPT_DELAYED_ACK_DISABLE, pval);
			} else {
				OP_STATE(~ha->ip_config.ipv6_tcp_options,
					 IPV6_TCPOPT_DELAYED_ACK_DISABLE, pval);
			}
			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_TCP_NAGLE_DISABLE:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
				OP_STATE(~ha->ip_config.tcp_options,
					 TCPOPT_NAGLE_ALGO_DISABLE, pval);
			} else {
				OP_STATE(~ha->ip_config.ipv6_tcp_options,
					 IPV6_TCPOPT_NAGLE_ALGO_DISABLE, pval);
			}
			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_TCP_WSF_DISABLE:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
				OP_STATE(~ha->ip_config.tcp_options,
					 TCPOPT_WINDOW_SCALE_DISABLE, pval);
			} else {
				OP_STATE(~ha->ip_config.ipv6_tcp_options,
					 IPV6_TCPOPT_WINDOW_SCALE_DISABLE,
					 pval);
			}
			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_TCP_WSF:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4)
				len = sprintf(buf, "%d\n",
					      ha->ip_config.tcp_wsf);
			else
				len = sprintf(buf, "%d\n",
					      ha->ip_config.ipv6_tcp_wsf);
			break;
		case ISCSI_NET_PARAM_TCP_TIMER_SCALE:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4)
				ival = (ha->ip_config.tcp_options &
					TCPOPT_TIMER_SCALE) >> 1;
			else
				ival = (ha->ip_config.ipv6_tcp_options &
					IPV6_TCPOPT_TIMER_SCALE) >> 1;

			len = sprintf(buf, "%d\n", ival);
			break;
		case ISCSI_NET_PARAM_TCP_TIMESTAMP_EN:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
				OP_STATE(ha->ip_config.tcp_options,
					 TCPOPT_TIMESTAMP_ENABLE, pval);
			} else {
				OP_STATE(ha->ip_config.ipv6_tcp_options,
					 IPV6_TCPOPT_TIMESTAMP_EN, pval);
			}
			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_CACHE_ID:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4)
				len = sprintf(buf, "%d\n",
					      ha->ip_config.ipv4_cache_id);
			else
				len = sprintf(buf, "%d\n",
					      ha->ip_config.ipv6_cache_id);
			break;
		case ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN:
			OP_STATE(ha->ip_config.tcp_options,
				 TCPOPT_DNS_SERVER_IP_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN:
			OP_STATE(ha->ip_config.tcp_options,
				 TCPOPT_SLP_DA_INFO_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_TOS_EN:
			OP_STATE(ha->ip_config.ipv4_options,
				 IPOPT_IPV4_TOS_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_TOS:
			len = sprintf(buf, "%d\n", ha->ip_config.ipv4_tos);
			break;
		case ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN:
			OP_STATE(ha->ip_config.ipv4_options,
				 IPOPT_GRAT_ARP_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN:
			OP_STATE(ha->ip_config.ipv4_options, IPOPT_ALT_CID_EN,
				 pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID:
			pval = (ha->ip_config.ipv4_alt_cid_len) ?
			       (char *)ha->ip_config.ipv4_alt_cid : "";

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN:
			OP_STATE(ha->ip_config.ipv4_options,
				 IPOPT_REQ_VID_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN:
			OP_STATE(ha->ip_config.ipv4_options,
				 IPOPT_USE_VID_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID:
			pval = (ha->ip_config.ipv4_vid_len) ?
			       (char *)ha->ip_config.ipv4_vid : "";

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN:
			OP_STATE(ha->ip_config.ipv4_options,
				 IPOPT_LEARN_IQN_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE:
			OP_STATE(~ha->ip_config.ipv4_options,
				 IPOPT_FRAGMENTATION_DISABLE, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN:
			OP_STATE(ha->ip_config.ipv4_options,
				 IPOPT_IN_FORWARD_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_REDIRECT_EN:
			if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
				OP_STATE(ha->ip_config.ipv4_options,
					 IPOPT_ARP_REDIRECT_EN, pval);
			} else {
				OP_STATE(ha->ip_config.ipv6_options,
					 IPV6_OPT_REDIRECT_EN, pval);
			}
			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV4_TTL:
			len = sprintf(buf, "%d\n", ha->ip_config.ipv4_ttl);
			break;
		case ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN:
			OP_STATE(ha->ip_config.ipv6_options,
				 IPV6_OPT_GRAT_NEIGHBOR_ADV_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV6_MLD_EN:
			OP_STATE(ha->ip_config.ipv6_addl_options,
				 IPV6_ADDOPT_MLD_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_NET_PARAM_IPV6_FLOW_LABEL:
			len = sprintf(buf, "%u\n", ha->ip_config.ipv6_flow_lbl);
			break;
		case ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS:
			len = sprintf(buf, "%d\n",
				      ha->ip_config.ipv6_traffic_class);
			break;
		case ISCSI_NET_PARAM_IPV6_HOP_LIMIT:
			len = sprintf(buf, "%d\n",
				      ha->ip_config.ipv6_hop_limit);
			break;
		case ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO:
			len = sprintf(buf, "%d\n",
				      ha->ip_config.ipv6_nd_reach_time);
			break;
		case ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME:
			len = sprintf(buf, "%d\n",
				      ha->ip_config.ipv6_nd_rexmit_timer);
			break;
		case ISCSI_NET_PARAM_IPV6_ND_STALE_TMO:
			len = sprintf(buf, "%d\n",
				      ha->ip_config.ipv6_nd_stale_timeout);
			break;
		case ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT:
			len = sprintf(buf, "%d\n",
				      ha->ip_config.ipv6_dup_addr_detect_count);
			break;
		case ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU:
			len = sprintf(buf, "%d\n",
				      ha->ip_config.ipv6_gw_advrt_mtu);
			break;
		default:
			len = -ENOSYS;
		}
	} else if (param_type == ISCSI_IFACE_PARAM) {
		switch (param) {
		case ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO:
			len = sprintf(buf, "%d\n", ha->ip_config.def_timeout);
			break;
		case ISCSI_IFACE_PARAM_HDRDGST_EN:
			OP_STATE(ha->ip_config.iscsi_options,
				 ISCSIOPTS_HEADER_DIGEST_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_IFACE_PARAM_DATADGST_EN:
			OP_STATE(ha->ip_config.iscsi_options,
				 ISCSIOPTS_DATA_DIGEST_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_IFACE_PARAM_IMM_DATA_EN:
			OP_STATE(ha->ip_config.iscsi_options,
				 ISCSIOPTS_IMMEDIATE_DATA_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_IFACE_PARAM_INITIAL_R2T_EN:
			OP_STATE(ha->ip_config.iscsi_options,
				 ISCSIOPTS_INITIAL_R2T_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN:
			OP_STATE(ha->ip_config.iscsi_options,
				 ISCSIOPTS_DATA_SEQ_INORDER_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_IFACE_PARAM_PDU_INORDER_EN:
			OP_STATE(ha->ip_config.iscsi_options,
				 ISCSIOPTS_DATA_PDU_INORDER_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_IFACE_PARAM_ERL:
			len = sprintf(buf, "%d\n",
				      (ha->ip_config.iscsi_options &
				       ISCSIOPTS_ERL));
			break;
		case ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH:
			len = sprintf(buf, "%u\n",
				      ha->ip_config.iscsi_max_pdu_size *
				      BYTE_UNITS);
			break;
		case ISCSI_IFACE_PARAM_FIRST_BURST:
			len = sprintf(buf, "%u\n",
				      ha->ip_config.iscsi_first_burst_len *
				      BYTE_UNITS);
			break;
		case ISCSI_IFACE_PARAM_MAX_R2T:
			len = sprintf(buf, "%d\n",
				      ha->ip_config.iscsi_max_outstnd_r2t);
			break;
		case ISCSI_IFACE_PARAM_MAX_BURST:
			len = sprintf(buf, "%u\n",
				      ha->ip_config.iscsi_max_burst_len *
				      BYTE_UNITS);
			break;
		case ISCSI_IFACE_PARAM_CHAP_AUTH_EN:
			OP_STATE(ha->ip_config.iscsi_options,
				 ISCSIOPTS_CHAP_AUTH_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_IFACE_PARAM_BIDI_CHAP_EN:
			OP_STATE(ha->ip_config.iscsi_options,
				 ISCSIOPTS_BIDI_CHAP_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL:
			OP_STATE(ha->ip_config.iscsi_options,
				 ISCSIOPTS_DISCOVERY_AUTH_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN:
			OP_STATE(ha->ip_config.iscsi_options,
				 ISCSIOPTS_DISCOVERY_LOGOUT_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN:
			OP_STATE(ha->ip_config.iscsi_options,
				 ISCSIOPTS_STRICT_LOGIN_COMP_EN, pval);

			len = sprintf(buf, "%s\n", pval);
			break;
		case ISCSI_IFACE_PARAM_INITIATOR_NAME:
			len = sprintf(buf, "%s\n", ha->ip_config.iscsi_name);
			break;
		default:
			len = -ENOSYS;
		}
	}

	return len;
}