|
Mike Christie |
3949e15 |
commit ac38eee2083821eb29d098227ad044c950d115e4
|
|
Mike Christie |
3949e15 |
Author: Mike Christie <michaelc@cs.wisc.edu>
|
|
Mike Christie |
3949e15 |
Date: Sun Aug 14 22:14:04 2011 -0500
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
iscsi tools: fix default iface binding setup
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
If a driver supports multiple ifaces only one is getting
|
|
Mike Christie |
3949e15 |
auto created. This modifies the default iface setup code
|
|
Mike Christie |
3949e15 |
so that it creates a iface per kernel iface or a iface per
|
|
Mike Christie |
3949e15 |
host if kernel ifaces are not supported.
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
diff --git a/usr/iface.c b/usr/iface.c
|
|
Mike Christie |
3949e15 |
index 5d5f7bf..9c70d09 100644
|
|
Mike Christie |
3949e15 |
--- a/usr/iface.c
|
|
Mike Christie |
3949e15 |
+++ b/usr/iface.c
|
|
Mike Christie |
3949e15 |
@@ -424,12 +424,61 @@ int iface_get_by_net_binding(struct iface_rec *pattern,
|
|
Mike Christie |
3949e15 |
return ISCSI_ERR_NO_OBJS_FOUND;
|
|
Mike Christie |
3949e15 |
}
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
+static int iface_get_iptype(struct iface_rec *iface)
|
|
Mike Christie |
3949e15 |
+{
|
|
Mike Christie |
3949e15 |
+ if (strcmp(iface->bootproto, "dhcp") && !strstr(iface->ipaddress, "."))
|
|
Mike Christie |
3949e15 |
+ return ISCSI_IFACE_TYPE_IPV6;
|
|
Mike Christie |
3949e15 |
+ else
|
|
Mike Christie |
3949e15 |
+ return ISCSI_IFACE_TYPE_IPV4;
|
|
Mike Christie |
3949e15 |
+}
|
|
Mike Christie |
3949e15 |
+
|
|
Mike Christie |
3949e15 |
+static int iface_setup_binding_from_kern_iface(void *data,
|
|
Mike Christie |
3949e15 |
+ struct iface_rec *kern_iface)
|
|
Mike Christie |
3949e15 |
+{
|
|
Mike Christie |
3949e15 |
+ struct host_info *hinfo = data;
|
|
Mike Christie |
3949e15 |
+ struct iface_rec iface;
|
|
Mike Christie |
3949e15 |
+
|
|
Mike Christie |
3949e15 |
+ if (!strlen(hinfo->iface.hwaddress)) {
|
|
Mike Christie |
3949e15 |
+ log_error("Invalid offload iSCSI host %u. Missing "
|
|
Mike Christie |
3949e15 |
+ "hwaddress. Try upgrading %s driver.\n",
|
|
Mike Christie |
3949e15 |
+ hinfo->host_no, hinfo->iface.transport_name);
|
|
Mike Christie |
3949e15 |
+ return 0;
|
|
Mike Christie |
3949e15 |
+ }
|
|
Mike Christie |
3949e15 |
+
|
|
Mike Christie |
3949e15 |
+ memset(&iface, 0, sizeof(struct iface_rec));
|
|
Mike Christie |
3949e15 |
+ strcpy(iface.hwaddress, hinfo->iface.hwaddress);
|
|
Mike Christie |
3949e15 |
+ strcpy(iface.transport_name, hinfo->iface.transport_name);
|
|
Mike Christie |
3949e15 |
+
|
|
Mike Christie |
3949e15 |
+ if (kern_iface) {
|
|
Mike Christie |
3949e15 |
+ iface.iface_num = kern_iface->iface_num;
|
|
Mike Christie |
3949e15 |
+
|
|
Mike Christie |
3949e15 |
+ snprintf(iface.name, sizeof(iface.name), "%s.%s.%s.%u",
|
|
Mike Christie |
3949e15 |
+ kern_iface->transport_name,
|
|
Mike Christie |
3949e15 |
+ kern_iface->hwaddress,
|
|
Mike Christie |
3949e15 |
+ iface_get_iptype(kern_iface) == ISCSI_IFACE_TYPE_IPV4 ?
|
|
Mike Christie |
3949e15 |
+ "ipv4" : "ipv6", kern_iface->iface_num);
|
|
Mike Christie |
3949e15 |
+ } else {
|
|
Mike Christie |
3949e15 |
+ snprintf(iface.name, sizeof(iface.name), "%s.%s",
|
|
Mike Christie |
3949e15 |
+ hinfo->iface.transport_name, hinfo->iface.hwaddress);
|
|
Mike Christie |
3949e15 |
+ }
|
|
Mike Christie |
3949e15 |
+
|
|
Mike Christie |
3949e15 |
+ if (iface_conf_read(&iface)) {
|
|
Mike Christie |
3949e15 |
+ /* not found so create it */
|
|
Mike Christie |
3949e15 |
+ if (iface_conf_write(&iface)) {
|
|
Mike Christie |
3949e15 |
+ log_error("Could not create default iface conf %s.",
|
|
Mike Christie |
3949e15 |
+ iface.name);
|
|
Mike Christie |
3949e15 |
+ /* fall through - will not be persistent */
|
|
Mike Christie |
3949e15 |
+ }
|
|
Mike Christie |
3949e15 |
+ }
|
|
Mike Christie |
3949e15 |
+
|
|
Mike Christie |
3949e15 |
+ return 0;
|
|
Mike Christie |
3949e15 |
+}
|
|
Mike Christie |
3949e15 |
+
|
|
Mike Christie |
3949e15 |
static int __iface_setup_host_bindings(void *data, struct host_info *hinfo)
|
|
Mike Christie |
3949e15 |
{
|
|
Mike Christie |
3949e15 |
struct iface_rec *def_iface;
|
|
Mike Christie |
3949e15 |
- struct iface_rec iface;
|
|
Mike Christie |
3949e15 |
struct iscsi_transport *t;
|
|
Mike Christie |
3949e15 |
- int i = 0;
|
|
Mike Christie |
3949e15 |
+ int i = 0, nr_found;
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
t = iscsi_sysfs_get_transport_by_hba(hinfo->host_no);
|
|
Mike Christie |
3949e15 |
if (!t)
|
|
Mike Christie |
3949e15 |
@@ -441,26 +490,12 @@ static int __iface_setup_host_bindings(void *data, struct host_info *hinfo)
|
|
Mike Christie |
3949e15 |
return 0;
|
|
Mike Christie |
3949e15 |
}
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
- if (iface_get_by_net_binding(&hinfo->iface, &iface) ==
|
|
Mike Christie |
3949e15 |
- ISCSI_ERR_NO_OBJS_FOUND) {
|
|
Mike Christie |
3949e15 |
- /* Must be a new port */
|
|
Mike Christie |
3949e15 |
- if (!strlen(hinfo->iface.hwaddress)) {
|
|
Mike Christie |
3949e15 |
- log_error("Invalid offload iSCSI host %u. Missing "
|
|
Mike Christie |
3949e15 |
- "hwaddress. Try upgrading %s driver.\n",
|
|
Mike Christie |
3949e15 |
- hinfo->host_no, t->name);
|
|
Mike Christie |
3949e15 |
- return 0;
|
|
Mike Christie |
3949e15 |
- }
|
|
Mike Christie |
3949e15 |
-
|
|
Mike Christie |
3949e15 |
- memset(&iface, 0, sizeof(struct iface_rec));
|
|
Mike Christie |
3949e15 |
- strcpy(iface.hwaddress, hinfo->iface.hwaddress);
|
|
Mike Christie |
3949e15 |
- strcpy(iface.transport_name, hinfo->iface.transport_name);
|
|
Mike Christie |
3949e15 |
- snprintf(iface.name, sizeof(iface.name), "%s.%s",
|
|
Mike Christie |
3949e15 |
- t->name, hinfo->iface.hwaddress);
|
|
Mike Christie |
3949e15 |
- if (iface_conf_write(&iface))
|
|
Mike Christie |
3949e15 |
- log_error("Could not create default iface conf %s.",
|
|
Mike Christie |
3949e15 |
- iface.name);
|
|
Mike Christie |
3949e15 |
- /* fall through - will not be persistent */
|
|
Mike Christie |
3949e15 |
- }
|
|
Mike Christie |
3949e15 |
+ nr_found = 0;
|
|
Mike Christie |
3949e15 |
+ iscsi_sysfs_for_each_iface_on_host(hinfo, hinfo->host_no,
|
|
Mike Christie |
3949e15 |
+ &nr_found,
|
|
Mike Christie |
3949e15 |
+ iface_setup_binding_from_kern_iface);
|
|
Mike Christie |
3949e15 |
+ if (!nr_found)
|
|
Mike Christie |
3949e15 |
+ iface_setup_binding_from_kern_iface(hinfo, NULL);
|
|
Mike Christie |
3949e15 |
return 0;
|
|
Mike Christie |
3949e15 |
}
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
@@ -843,7 +878,6 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
|
|
Mike Christie |
3949e15 |
memset(iface->name, 0, sizeof(iface->name));
|
|
Mike Christie |
3949e15 |
snprintf(iface->name, sizeof(iface->name), "%s.%s",
|
|
Mike Christie |
3949e15 |
iface->transport_name, context->mac);
|
|
Mike Christie |
3949e15 |
-
|
|
Mike Christie |
3949e15 |
strlcpy(iface->hwaddress, context->mac,
|
|
Mike Christie |
3949e15 |
sizeof(iface->hwaddress));
|
|
Mike Christie |
3949e15 |
strlcpy(iface->ipaddress, context->ipaddr,
|
|
Mike Christie |
3949e15 |
@@ -921,9 +955,7 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface)
|
|
Mike Christie |
3949e15 |
if (strcmp(iface_params->primary->hwaddress, iface->hwaddress))
|
|
Mike Christie |
3949e15 |
return 0;
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
- if (strcmp(iface->bootproto, "dhcp") && !strstr(iface->ipaddress, "."))
|
|
Mike Christie |
3949e15 |
- iptype = ISCSI_IFACE_TYPE_IPV6;
|
|
Mike Christie |
3949e15 |
-
|
|
Mike Christie |
3949e15 |
+ iptype = iface_get_iptype(iface);
|
|
Mike Christie |
3949e15 |
if (iptype == ISCSI_IFACE_TYPE_IPV4) {
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
if (strcmp(iface->state, "disable")) {
|
|
Mike Christie |
3949e15 |
@@ -1466,12 +1498,10 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface)
|
|
Mike Christie |
3949e15 |
if (strcmp(net_config->primary->hwaddress, iface->hwaddress))
|
|
Mike Christie |
3949e15 |
return 0;
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
- if (strcmp(iface->bootproto, "dhcp") && !strstr(iface->ipaddress, "."))
|
|
Mike Christie |
3949e15 |
- iptype = ISCSI_IFACE_TYPE_IPV6;
|
|
Mike Christie |
3949e15 |
-
|
|
Mike Christie |
3949e15 |
/* start at 2, because 0 is for nlmsghdr and 1 for event */
|
|
Mike Christie |
3949e15 |
iov = net_config->iovs + 2;
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
+ iptype = iface_get_iptype(iface);
|
|
Mike Christie |
3949e15 |
if (iptype == ISCSI_IFACE_TYPE_IPV4) {
|
|
Mike Christie |
3949e15 |
if (!strcmp(iface->state, "disable")) {
|
|
Mike Christie |
3949e15 |
if (!iface_fill_net_state(&iov[net_config->count],
|
|
Mike Christie |
3949e15 |
diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c
|
|
Mike Christie |
3949e15 |
index 995549e..961cefd 100644
|
|
Mike Christie |
3949e15 |
--- a/usr/iscsi_sysfs.c
|
|
Mike Christie |
3949e15 |
+++ b/usr/iscsi_sysfs.c
|
|
Mike Christie |
3949e15 |
@@ -425,9 +425,10 @@ uint32_t iscsi_sysfs_get_host_no_from_hwinfo(struct iface_rec *iface, int *rc)
|
|
Mike Christie |
3949e15 |
static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no,
|
|
Mike Christie |
3949e15 |
char *session, char *iface_kern_id)
|
|
Mike Christie |
3949e15 |
{
|
|
Mike Christie |
3949e15 |
+ uint32_t tmp_host_no, iface_num;
|
|
Mike Christie |
3949e15 |
char host_id[NAME_SIZE];
|
|
Mike Christie |
3949e15 |
struct iscsi_transport *t;
|
|
Mike Christie |
3949e15 |
- int ret;
|
|
Mike Christie |
3949e15 |
+ int ret, iface_type;
|
|
Mike Christie |
3949e15 |
|
|
Mike Christie |
3949e15 |
t = iscsi_sysfs_get_transport_by_hba(host_no);
|
|
Mike Christie |
3949e15 |
if (!t)
|
|
Mike Christie |
3949e15 |
@@ -582,6 +583,10 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no,
|
|
Mike Christie |
3949e15 |
&iface->vlan_id);
|
|
Mike Christie |
3949e15 |
sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, "vlan_priority",
|
|
Mike Christie |
3949e15 |
&iface->vlan_priority);
|
|
Mike Christie |
3949e15 |
+
|
|
Mike Christie |
3949e15 |
+ if (sscanf(iface_kern_id, "ipv%d-iface-%u-%u", &iface_type,
|
|
Mike Christie |
3949e15 |
+ &tmp_host_no, &iface_num) == 3)
|
|
Mike Christie |
3949e15 |
+ iface->iface_num = iface_num;
|
|
Mike Christie |
3949e15 |
done:
|
|
Mike Christie |
3949e15 |
if (ret)
|
|
Mike Christie |
3949e15 |
return ISCSI_ERR_SYSFS_LOOKUP;
|