in qla4xxx/ql4_os.c [2279:2535]
static void qla4xxx_set_ipv4(struct scsi_qla_host *ha,
struct iscsi_iface_param_info *iface_param,
struct addr_ctrl_blk *init_fw_cb)
{
switch (iface_param->param) {
case ISCSI_NET_PARAM_IPV4_ADDR:
memcpy(init_fw_cb->ipv4_addr, iface_param->value,
sizeof(init_fw_cb->ipv4_addr));
break;
case ISCSI_NET_PARAM_IPV4_SUBNET:
memcpy(init_fw_cb->ipv4_subnet, iface_param->value,
sizeof(init_fw_cb->ipv4_subnet));
break;
case ISCSI_NET_PARAM_IPV4_GW:
memcpy(init_fw_cb->ipv4_gw_addr, iface_param->value,
sizeof(init_fw_cb->ipv4_gw_addr));
break;
case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
if (iface_param->value[0] == ISCSI_BOOTPROTO_DHCP)
init_fw_cb->ipv4_tcp_opts |=
cpu_to_le16(TCPOPT_DHCP_ENABLE);
else if (iface_param->value[0] == ISCSI_BOOTPROTO_STATIC)
init_fw_cb->ipv4_tcp_opts &=
cpu_to_le16(~TCPOPT_DHCP_ENABLE);
else
ql4_printk(KERN_ERR, ha, "Invalid IPv4 bootproto\n");
break;
case ISCSI_NET_PARAM_IFACE_ENABLE:
if (iface_param->value[0] == ISCSI_IFACE_ENABLE) {
init_fw_cb->ipv4_ip_opts |=
cpu_to_le16(IPOPT_IPV4_PROTOCOL_ENABLE);
qla4xxx_create_ipv4_iface(ha);
} else {
init_fw_cb->ipv4_ip_opts &=
cpu_to_le16(~IPOPT_IPV4_PROTOCOL_ENABLE &
0xFFFF);
qla4xxx_destroy_ipv4_iface(ha);
}
break;
case ISCSI_NET_PARAM_VLAN_TAG:
if (iface_param->len != sizeof(init_fw_cb->ipv4_vlan_tag))
break;
init_fw_cb->ipv4_vlan_tag =
cpu_to_be16(*(uint16_t *)iface_param->value);
break;
case ISCSI_NET_PARAM_VLAN_ENABLED:
if (iface_param->value[0] == ISCSI_VLAN_ENABLE)
init_fw_cb->ipv4_ip_opts |=
cpu_to_le16(IPOPT_VLAN_TAGGING_ENABLE);
else
init_fw_cb->ipv4_ip_opts &=
cpu_to_le16(~IPOPT_VLAN_TAGGING_ENABLE);
break;
case ISCSI_NET_PARAM_MTU:
init_fw_cb->eth_mtu_size =
cpu_to_le16(*(uint16_t *)iface_param->value);
break;
case ISCSI_NET_PARAM_PORT:
init_fw_cb->ipv4_port =
cpu_to_le16(*(uint16_t *)iface_param->value);
break;
case ISCSI_NET_PARAM_DELAYED_ACK_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_DISABLE)
init_fw_cb->ipv4_tcp_opts |=
cpu_to_le16(TCPOPT_DELAYED_ACK_DISABLE);
else
init_fw_cb->ipv4_tcp_opts &=
cpu_to_le16(~TCPOPT_DELAYED_ACK_DISABLE &
0xFFFF);
break;
case ISCSI_NET_PARAM_TCP_NAGLE_DISABLE:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_DISABLE)
init_fw_cb->ipv4_tcp_opts |=
cpu_to_le16(TCPOPT_NAGLE_ALGO_DISABLE);
else
init_fw_cb->ipv4_tcp_opts &=
cpu_to_le16(~TCPOPT_NAGLE_ALGO_DISABLE);
break;
case ISCSI_NET_PARAM_TCP_WSF_DISABLE:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_DISABLE)
init_fw_cb->ipv4_tcp_opts |=
cpu_to_le16(TCPOPT_WINDOW_SCALE_DISABLE);
else
init_fw_cb->ipv4_tcp_opts &=
cpu_to_le16(~TCPOPT_WINDOW_SCALE_DISABLE);
break;
case ISCSI_NET_PARAM_TCP_WSF:
if (iface_param->iface_num & 0x1)
break;
init_fw_cb->ipv4_tcp_wsf = iface_param->value[0];
break;
case ISCSI_NET_PARAM_TCP_TIMER_SCALE:
if (iface_param->iface_num & 0x1)
break;
init_fw_cb->ipv4_tcp_opts &= cpu_to_le16(~TCPOPT_TIMER_SCALE);
init_fw_cb->ipv4_tcp_opts |=
cpu_to_le16((iface_param->value[0] << 1) &
TCPOPT_TIMER_SCALE);
break;
case ISCSI_NET_PARAM_TCP_TIMESTAMP_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE)
init_fw_cb->ipv4_tcp_opts |=
cpu_to_le16(TCPOPT_TIMESTAMP_ENABLE);
else
init_fw_cb->ipv4_tcp_opts &=
cpu_to_le16(~TCPOPT_TIMESTAMP_ENABLE);
break;
case ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE)
init_fw_cb->ipv4_tcp_opts |=
cpu_to_le16(TCPOPT_DNS_SERVER_IP_EN);
else
init_fw_cb->ipv4_tcp_opts &=
cpu_to_le16(~TCPOPT_DNS_SERVER_IP_EN);
break;
case ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE)
init_fw_cb->ipv4_tcp_opts |=
cpu_to_le16(TCPOPT_SLP_DA_INFO_EN);
else
init_fw_cb->ipv4_tcp_opts &=
cpu_to_le16(~TCPOPT_SLP_DA_INFO_EN);
break;
case ISCSI_NET_PARAM_IPV4_TOS_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE)
init_fw_cb->ipv4_ip_opts |=
cpu_to_le16(IPOPT_IPV4_TOS_EN);
else
init_fw_cb->ipv4_ip_opts &=
cpu_to_le16(~IPOPT_IPV4_TOS_EN);
break;
case ISCSI_NET_PARAM_IPV4_TOS:
if (iface_param->iface_num & 0x1)
break;
init_fw_cb->ipv4_tos = iface_param->value[0];
break;
case ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE)
init_fw_cb->ipv4_ip_opts |=
cpu_to_le16(IPOPT_GRAT_ARP_EN);
else
init_fw_cb->ipv4_ip_opts &=
cpu_to_le16(~IPOPT_GRAT_ARP_EN);
break;
case ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE)
init_fw_cb->ipv4_ip_opts |=
cpu_to_le16(IPOPT_ALT_CID_EN);
else
init_fw_cb->ipv4_ip_opts &=
cpu_to_le16(~IPOPT_ALT_CID_EN);
break;
case ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID:
if (iface_param->iface_num & 0x1)
break;
memcpy(init_fw_cb->ipv4_dhcp_alt_cid, iface_param->value,
(sizeof(init_fw_cb->ipv4_dhcp_alt_cid) - 1));
init_fw_cb->ipv4_dhcp_alt_cid_len =
strlen(init_fw_cb->ipv4_dhcp_alt_cid);
break;
case ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE)
init_fw_cb->ipv4_ip_opts |=
cpu_to_le16(IPOPT_REQ_VID_EN);
else
init_fw_cb->ipv4_ip_opts &=
cpu_to_le16(~IPOPT_REQ_VID_EN);
break;
case ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE)
init_fw_cb->ipv4_ip_opts |=
cpu_to_le16(IPOPT_USE_VID_EN);
else
init_fw_cb->ipv4_ip_opts &=
cpu_to_le16(~IPOPT_USE_VID_EN);
break;
case ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID:
if (iface_param->iface_num & 0x1)
break;
memcpy(init_fw_cb->ipv4_dhcp_vid, iface_param->value,
(sizeof(init_fw_cb->ipv4_dhcp_vid) - 1));
init_fw_cb->ipv4_dhcp_vid_len =
strlen(init_fw_cb->ipv4_dhcp_vid);
break;
case ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE)
init_fw_cb->ipv4_ip_opts |=
cpu_to_le16(IPOPT_LEARN_IQN_EN);
else
init_fw_cb->ipv4_ip_opts &=
cpu_to_le16(~IPOPT_LEARN_IQN_EN);
break;
case ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_DISABLE)
init_fw_cb->ipv4_ip_opts |=
cpu_to_le16(IPOPT_FRAGMENTATION_DISABLE);
else
init_fw_cb->ipv4_ip_opts &=
cpu_to_le16(~IPOPT_FRAGMENTATION_DISABLE);
break;
case ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE)
init_fw_cb->ipv4_ip_opts |=
cpu_to_le16(IPOPT_IN_FORWARD_EN);
else
init_fw_cb->ipv4_ip_opts &=
cpu_to_le16(~IPOPT_IN_FORWARD_EN);
break;
case ISCSI_NET_PARAM_REDIRECT_EN:
if (iface_param->iface_num & 0x1)
break;
if (iface_param->value[0] == ISCSI_NET_PARAM_ENABLE)
init_fw_cb->ipv4_ip_opts |=
cpu_to_le16(IPOPT_ARP_REDIRECT_EN);
else
init_fw_cb->ipv4_ip_opts &=
cpu_to_le16(~IPOPT_ARP_REDIRECT_EN);
break;
case ISCSI_NET_PARAM_IPV4_TTL:
if (iface_param->iface_num & 0x1)
break;
init_fw_cb->ipv4_ttl = iface_param->value[0];
break;
default:
ql4_printk(KERN_ERR, ha, "Unknown IPv4 param = %d\n",
iface_param->param);
break;
}
}