void beiscsi_destroy_def_ifaces(struct beiscsi_hba *phba) { if (phba->ipv6_iface) iscsi_destroy_iface(phba->ipv6_iface); if (phba->ipv4_iface) iscsi_destroy_iface(phba->ipv4_iface); }
void beiscsi_iface_destroy_default(struct beiscsi_hba *phba) { if (phba->ipv6_iface) { iscsi_destroy_iface(phba->ipv6_iface); phba->ipv6_iface = NULL; } if (phba->ipv4_iface) { iscsi_destroy_iface(phba->ipv4_iface); phba->ipv4_iface = NULL; } }
static int beiscsi_set_ipv6(struct Scsi_Host *shost, struct iscsi_iface_param_info *iface_param, void *data, uint32_t dt_len) { struct beiscsi_hba *phba = iscsi_host_priv(shost); int ret = 0; switch (iface_param->param) { case ISCSI_NET_PARAM_IFACE_ENABLE: if (iface_param->value[0] == ISCSI_IFACE_ENABLE) ret = beiscsi_create_ipv6_iface(phba); else { iscsi_destroy_iface(phba->ipv6_iface); ret = 0; } break; case ISCSI_NET_PARAM_IPV6_ADDR: ret = mgmt_set_ip(phba, iface_param, NULL, ISCSI_BOOTPROTO_STATIC); break; default: beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, "BS_%d : Param %d not supported\n", iface_param->param); } return ret; }
static int beiscsi_iface_config_ipv6(struct Scsi_Host *shost, struct iscsi_iface_param_info *iface_param, void *data, uint32_t dt_len) { struct beiscsi_hba *phba = iscsi_host_priv(shost); int ret = -EPERM; switch (iface_param->param) { case ISCSI_NET_PARAM_IFACE_ENABLE: if (iface_param->value[0] == ISCSI_IFACE_ENABLE) ret = beiscsi_iface_create_ipv6(phba); else { iscsi_destroy_iface(phba->ipv6_iface); phba->ipv6_iface = NULL; } break; case ISCSI_NET_PARAM_IPV6_ADDR: ret = beiscsi_if_en_static(phba, BEISCSI_IP_TYPE_V6, iface_param->value, NULL); break; } return ret; }
static int beiscsi_set_ipv4(struct Scsi_Host *shost, struct iscsi_iface_param_info *iface_param, void *data, uint32_t dt_len) { struct beiscsi_hba *phba = iscsi_host_priv(shost); int ret = 0; /* Check the param */ switch (iface_param->param) { case ISCSI_NET_PARAM_IPV4_GW: ret = mgmt_set_gateway(phba, iface_param); break; case ISCSI_NET_PARAM_IPV4_BOOTPROTO: if (iface_param->value[0] == ISCSI_BOOTPROTO_DHCP) ret = mgmt_set_ip(phba, iface_param, NULL, ISCSI_BOOTPROTO_DHCP); else if (iface_param->value[0] == ISCSI_BOOTPROTO_STATIC) ret = beiscsi_set_static_ip(shost, iface_param, data, dt_len); else beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, "BS_%d : Invalid BOOTPROTO: %d\n", iface_param->value[0]); break; case ISCSI_NET_PARAM_IFACE_ENABLE: if (iface_param->value[0] == ISCSI_IFACE_ENABLE) ret = beiscsi_create_ipv4_iface(phba); else iscsi_destroy_iface(phba->ipv4_iface); break; case ISCSI_NET_PARAM_IPV4_SUBNET: case ISCSI_NET_PARAM_IPV4_ADDR: ret = beiscsi_set_static_ip(shost, iface_param, data, dt_len); break; case ISCSI_NET_PARAM_VLAN_ENABLED: case ISCSI_NET_PARAM_VLAN_TAG: ret = beiscsi_set_vlan_tag(shost, iface_param); break; default: beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, "BS_%d : Param %d not supported\n", iface_param->param); } return ret; }
static int beiscsi_iface_config_ipv4(struct Scsi_Host *shost, struct iscsi_iface_param_info *info, void *data, uint32_t dt_len) { struct beiscsi_hba *phba = iscsi_host_priv(shost); u8 *ip = NULL, *subnet = NULL, *gw; struct nlattr *nla; int ret = -EPERM; /* Check the param */ switch (info->param) { case ISCSI_NET_PARAM_IFACE_ENABLE: if (info->value[0] == ISCSI_IFACE_ENABLE) ret = beiscsi_iface_create_ipv4(phba); else { iscsi_destroy_iface(phba->ipv4_iface); phba->ipv4_iface = NULL; } break; case ISCSI_NET_PARAM_IPV4_GW: gw = info->value; ret = beiscsi_if_set_gw(phba, BEISCSI_IP_TYPE_V4, gw); break; case ISCSI_NET_PARAM_IPV4_BOOTPROTO: if (info->value[0] == ISCSI_BOOTPROTO_DHCP) ret = beiscsi_if_en_dhcp(phba, BEISCSI_IP_TYPE_V4); else if (info->value[0] == ISCSI_BOOTPROTO_STATIC) /* release DHCP IP address */ ret = beiscsi_if_en_static(phba, BEISCSI_IP_TYPE_V4, NULL, NULL); else beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, "BS_%d : Invalid BOOTPROTO: %d\n", info->value[0]); break; case ISCSI_NET_PARAM_IPV4_ADDR: ip = info->value; nla = nla_find(data, dt_len, ISCSI_NET_PARAM_IPV4_SUBNET); if (nla) { info = nla_data(nla); subnet = info->value; } ret = beiscsi_if_en_static(phba, BEISCSI_IP_TYPE_V4, ip, subnet); break; case ISCSI_NET_PARAM_IPV4_SUBNET: /* * OPCODE_COMMON_ISCSI_NTWK_MODIFY_IP_ADDR ioctl needs IP * and subnet both. Find IP to be applied for this subnet. */ subnet = info->value; nla = nla_find(data, dt_len, ISCSI_NET_PARAM_IPV4_ADDR); if (nla) { info = nla_data(nla); ip = info->value; } ret = beiscsi_if_en_static(phba, BEISCSI_IP_TYPE_V4, ip, subnet); break; } return ret; }