Parcourir la source

[iscsi] Change default initiator IQN

The default initiator IQN is "iqn.2000-09.org.etherboot:UNKNOWN".
This is problematic for two reasons:

  a) the etherboot.org domain (and hence the associated IQN namespace)
     is not under the control of the iPXE project, and

  b) some targets (correctly) refuse to allow concurrent connections
     from different initiators using the same initiator IQN.

Solve both problems by changing the default initiator IQN to be

  iqn.2010-04.org.ipxe:<hostname> if a hostname is set, or

  iqn.2010-04.org.ipxe:<uuid> if no hostname is set.

Explicit initiator IQNs set via DHCP option 203 are not affected by
this change.

Unfortunately, this change is likely to break some existing
configurations, where ACL rules have been put in place referring to
the old default initiator IQN.  Users may need to update ACLs, or
force the use of the old IQN using an iPXE script line such as

  set initiator-iqn iqn.2000-09.org.etherboot:UNKNOWN

or a dhcpd.conf option such as

   option iscsi-initiator-iqn "iqn.2000-09.org.etherboot:UNKNOWN"

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown il y a 13 ans
Parent
révision
960dee6dd0
3 fichiers modifiés avec 150 ajouts et 241 suppressions
  1. 6
    5
      src/drivers/block/ibft.c
  2. 4
    1
      src/include/ipxe/iscsi.h
  3. 140
    235
      src/net/tcp/iscsi.c

+ 6
- 5
src/drivers/block/ibft.c Voir le fichier

@@ -281,11 +281,12 @@ static int ibft_fill_nic ( struct ibft_nic *nic,
281 281
  *
282 282
  * @v initiator		Initiator portion of iBFT
283 283
  * @v strings		iBFT string block descriptor
284
+ * @v iscsi		iSCSI session
284 285
  * @ret rc		Return status code
285 286
  */
286 287
 static int ibft_fill_initiator ( struct ibft_initiator *initiator,
287
-				 struct ibft_strings *strings ) {
288
-	const char *initiator_iqn = iscsi_initiator_iqn();
288
+				 struct ibft_strings *strings,
289
+				 struct iscsi_session *iscsi ) {
289 290
 	int rc;
290 291
 
291 292
 	/* Fill in common header */
@@ -297,7 +298,7 @@ static int ibft_fill_initiator ( struct ibft_initiator *initiator,
297 298
 
298 299
 	/* Fill in hostname */
299 300
 	if ( ( rc = ibft_set_string ( strings, &initiator->initiator_name,
300
-				      initiator_iqn ) ) != 0 )
301
+				      iscsi->initiator_iqn ) ) != 0 )
301 302
 		return rc;
302 303
 	DBG ( "iBFT initiator hostname = %s\n",
303 304
 	      ibft_string ( strings, &initiator->initiator_name ) );
@@ -468,8 +469,8 @@ int ibft_describe ( struct iscsi_session *iscsi,
468 469
 	/* Fill in NIC, Initiator and Target blocks */
469 470
 	if ( ( rc = ibft_fill_nic ( &ibft->nic, &strings, netdev ) ) != 0 )
470 471
 		return rc;
471
-	if ( ( rc = ibft_fill_initiator ( &ibft->initiator,
472
-					  &strings ) ) != 0 )
472
+	if ( ( rc = ibft_fill_initiator ( &ibft->initiator, &strings,
473
+					  iscsi ) ) != 0 )
473 474
 		return rc;
474 475
 	if ( ( rc = ibft_fill_target ( &ibft->target, &strings,
475 476
 				       iscsi ) ) != 0 )

+ 4
- 1
src/include/ipxe/iscsi.h Voir le fichier

@@ -543,6 +543,8 @@ struct iscsi_session {
543 543
 	/** Transport-layer socket */
544 544
 	struct interface socket;
545 545
 
546
+	/** Initiator IQN */
547
+	char *initiator_iqn;
546 548
 	/** Target address */
547 549
 	char *target_address;
548 550
 	/** Target port */
@@ -694,6 +696,7 @@ struct iscsi_session {
694 696
 /** Target authenticated itself correctly */
695 697
 #define ISCSI_STATUS_AUTH_REVERSE_OK 0x00040000
696 698
 
697
-extern const char * iscsi_initiator_iqn ( void );
699
+/** Default initiator IQN prefix */
700
+#define ISCSI_DEFAULT_IQN_PREFIX "iqn.2010-04.org.ipxe"
698 701
 
699 702
 #endif /* _IPXE_ISCSI_H */

+ 140
- 235
src/net/tcp/iscsi.c Voir le fichier

@@ -75,6 +75,10 @@ FEATURE ( FEATURE_PROTOCOL, "iSCSI", DHCP_EB_FEATURE_ISCSI, 1 );
75 75
 	__einfo_error ( EINFO_EINVAL_NO_TARGET_IQN )
76 76
 #define EINFO_EINVAL_NO_TARGET_IQN \
77 77
 	__einfo_uniqify ( EINFO_EINVAL, 0x04, "No target IQN" )
78
+#define EINVAL_NO_INITIATOR_IQN \
79
+	__einfo_error ( EINFO_EINVAL_NO_INITIATOR_IQN )
80
+#define EINFO_EINVAL_NO_INITIATOR_IQN \
81
+	__einfo_uniqify ( EINFO_EINVAL, 0x05, "No initiator IQN" )
78 82
 #define EIO_TARGET_UNAVAILABLE \
79 83
 	__einfo_error ( EINFO_EIO_TARGET_UNAVAILABLE )
80 84
 #define EINFO_EIO_TARGET_UNAVAILABLE \
@@ -128,24 +132,6 @@ FEATURE ( FEATURE_PROTOCOL, "iSCSI", DHCP_EB_FEATURE_ISCSI, 1 );
128 132
 #define EINFO_EPROTO_INVALID_CHAP_RESPONSE \
129 133
 	__einfo_uniqify ( EINFO_EPROTO, 0x04, "Invalid CHAP response" )
130 134
 
131
-/** iSCSI initiator name (explicitly specified) */
132
-static char *iscsi_explicit_initiator_iqn;
133
-
134
-/** Default iSCSI initiator name (constructed from hostname) */
135
-static char *iscsi_default_initiator_iqn;
136
-
137
-/** iSCSI initiator username */
138
-static char *iscsi_initiator_username;
139
-
140
-/** iSCSI initiator password */
141
-static char *iscsi_initiator_password;
142
-
143
-/** iSCSI target username */
144
-static char *iscsi_target_username;
145
-
146
-/** iSCSI target password */
147
-static char *iscsi_target_password;
148
-
149 135
 static void iscsi_start_tx ( struct iscsi_session *iscsi );
150 136
 static void iscsi_start_login ( struct iscsi_session *iscsi );
151 137
 static void iscsi_start_data_out ( struct iscsi_session *iscsi,
@@ -200,6 +186,7 @@ static void iscsi_free ( struct refcnt *refcnt ) {
200 186
 	struct iscsi_session *iscsi =
201 187
 		container_of ( refcnt, struct iscsi_session, refcnt );
202 188
 
189
+	free ( iscsi->initiator_iqn );
203 190
 	free ( iscsi->target_address );
204 191
 	free ( iscsi->target_iqn );
205 192
 	free ( iscsi->initiator_username );
@@ -688,7 +675,7 @@ static int iscsi_build_login_request_strings ( struct iscsi_session *iscsi,
688 675
 				    "TargetName=%s%c"
689 676
 				    "SessionType=Normal%c"
690 677
 				    "AuthMethod=%s%c",
691
-				    iscsi_initiator_iqn(), 0,
678
+				    iscsi->initiator_iqn, 0,
692 679
 				    iscsi->target_iqn, 0, 0,
693 680
 				    auth_method, 0 );
694 681
 	}
@@ -1832,6 +1819,30 @@ enum iscsi_root_path_component {
1832 1819
 	NUM_RP_COMPONENTS
1833 1820
 };
1834 1821
 
1822
+/** iSCSI initiator IQN setting */
1823
+struct setting initiator_iqn_setting __setting = {
1824
+	.name = "initiator-iqn",
1825
+	.description = "iSCSI initiator name",
1826
+	.tag = DHCP_ISCSI_INITIATOR_IQN,
1827
+	.type = &setting_type_string,
1828
+};
1829
+
1830
+/** iSCSI reverse username setting */
1831
+struct setting reverse_username_setting __setting = {
1832
+	.name = "reverse-username",
1833
+	.description = "Reverse user name",
1834
+	.tag = DHCP_EB_REVERSE_USERNAME,
1835
+	.type = &setting_type_string,
1836
+};
1837
+
1838
+/** iSCSI reverse password setting */
1839
+struct setting reverse_password_setting __setting = {
1840
+	.name = "reverse-password",
1841
+	.description = "Reverse password",
1842
+	.tag = DHCP_EB_REVERSE_PASSWORD,
1843
+	.type = &setting_type_string,
1844
+};
1845
+
1835 1846
 /**
1836 1847
  * Parse iSCSI root path
1837 1848
  *
@@ -1883,64 +1894,117 @@ static int iscsi_parse_root_path ( struct iscsi_session *iscsi,
1883 1894
 }
1884 1895
 
1885 1896
 /**
1886
- * Set iSCSI authentication details
1897
+ * Fetch iSCSI settings
1887 1898
  *
1888 1899
  * @v iscsi		iSCSI session
1889
- * @v initiator_username Initiator username, if any
1890
- * @v initiator_password Initiator password, if any
1891
- * @v target_username	Target username, if any
1892
- * @v target_password	Target password, if any
1893 1900
  * @ret rc		Return status code
1894 1901
  */
1895
-static int iscsi_set_auth ( struct iscsi_session *iscsi,
1896
-			    const char *initiator_username,
1897
-			    const char *initiator_password,
1898
-			    const char *target_username,
1899
-			    const char *target_password ) {
1900
-
1901
-	/* Check for initiator or target credentials */
1902
-	if ( initiator_username || initiator_password ||
1903
-	     target_username || target_password ) {
1904
-
1905
-		/* We must have at least an initiator username+password */
1906
-		if ( ! ( initiator_username && initiator_password ) )
1907
-			goto invalid_auth;
1908
-
1909
-		/* Store initiator credentials */
1910
-		iscsi->initiator_username = strdup ( initiator_username );
1911
-		if ( ! iscsi->initiator_username )
1912
-			return -ENOMEM;
1913
-		iscsi->initiator_password = strdup ( initiator_password );
1914
-		if ( ! iscsi->initiator_password )
1915
-			return -ENOMEM;
1916
-
1917
-		/* Check for target credentials */
1918
-		if ( target_username || target_password ) {
1902
+static int iscsi_fetch_settings ( struct iscsi_session *iscsi ) {
1903
+	char *hostname;
1904
+	union uuid uuid;
1905
+	int len;
1919 1906
 
1920
-			/* We must have target username+password */
1921
-			if ( ! ( target_username && target_password ) )
1922
-				goto invalid_auth;
1907
+	/* Fetch relevant settings.  Don't worry about freeing on
1908
+	 * error, since iscsi_free() will take care of that anyway.
1909
+	 */
1910
+	if ( ( len = fetch_string_setting_copy ( NULL, &username_setting,
1911
+					  &iscsi->initiator_username ) ) < 0 ) {
1912
+		DBGC ( iscsi, "iSCSI %p could not fetch username: %s\n",
1913
+		       iscsi, strerror ( len ) );
1914
+		return len;
1915
+	}
1916
+	if ( ( len = fetch_string_setting_copy ( NULL, &password_setting,
1917
+					  &iscsi->initiator_password ) ) < 0 ) {
1918
+		DBGC ( iscsi, "iSCSI %p could not fetch password: %s\n",
1919
+		       iscsi, strerror ( len ) );
1920
+		return len;
1921
+	}
1922
+	if ( ( len = fetch_string_setting_copy( NULL, &reverse_username_setting,
1923
+					     &iscsi->target_username ) ) < 0 ) {
1924
+		DBGC ( iscsi, "iSCSI %p could not fetch reverse username: %s\n",
1925
+		       iscsi, strerror ( len ) );
1926
+		return len;
1927
+	}
1928
+	if ( ( len = fetch_string_setting_copy( NULL, &reverse_password_setting,
1929
+					     &iscsi->target_password ) ) < 0 ) {
1930
+		DBGC ( iscsi, "iSCSI %p could not fetch reverse password: %s\n",
1931
+		       iscsi, strerror ( len ) );
1932
+		return len;
1933
+	}
1923 1934
 
1924
-			/* Store target credentials */
1925
-			iscsi->target_username = strdup ( target_username );
1926
-			if ( ! iscsi->target_username )
1927
-				return -ENOMEM;
1928
-			iscsi->target_password = strdup ( target_password );
1929
-			if ( ! iscsi->target_password )
1930
-				return -ENOMEM;
1935
+	/* Find a suitable initiator name */
1936
+	if ( ( len = fetch_string_setting_copy ( NULL, &initiator_iqn_setting,
1937
+					       &iscsi->initiator_iqn ) ) < 0 ) {
1938
+		DBGC ( iscsi, "iSCSI %p could not fetch initiator IQN: %s\n",
1939
+		       iscsi, strerror ( len ) );
1940
+		return len;
1941
+	}
1942
+	if ( iscsi->initiator_iqn )
1943
+		return 0;
1944
+	if ( ( len = fetch_string_setting_copy ( NULL, &hostname_setting,
1945
+						&hostname ) ) < 0 ) {
1946
+		DBGC ( iscsi, "iSCSI %p could not fetch hostname: %s\n",
1947
+		       iscsi, strerror ( len ) );
1948
+		return len;
1949
+	}
1950
+	if ( hostname ) {
1951
+		len = asprintf ( &iscsi->initiator_iqn,
1952
+				 ISCSI_DEFAULT_IQN_PREFIX ":%s", hostname );
1953
+		free ( hostname );
1954
+		if ( len < 0 ) {
1955
+			DBGC ( iscsi, "iSCSI %p could not allocate initiator "
1956
+			       "IQN\n", iscsi );
1957
+			return -ENOMEM;
1931 1958
 		}
1959
+		assert ( iscsi->initiator_iqn );
1960
+		return 0;
1961
+	}
1962
+	if ( ( len = fetch_uuid_setting ( NULL, &uuid_setting, &uuid ) ) < 0 ) {
1963
+		DBGC ( iscsi, "iSCSI %p has no suitable initiator IQN\n",
1964
+		       iscsi );
1965
+		return -EINVAL_NO_INITIATOR_IQN;
1966
+	}
1967
+	if ( ( len = asprintf ( &iscsi->initiator_iqn,
1968
+				ISCSI_DEFAULT_IQN_PREFIX ":%s",
1969
+				uuid_ntoa ( &uuid ) ) ) < 0 ) {
1970
+		DBGC ( iscsi, "iSCSI %p could not allocate initiator IQN\n",
1971
+		       iscsi );
1972
+		return -ENOMEM;
1932 1973
 	}
1974
+	assert ( iscsi->initiator_iqn );
1933 1975
 
1934 1976
 	return 0;
1977
+}
1978
+
1935 1979
 
1936
- invalid_auth:
1937
-	DBGC ( iscsi, "iSCSI %p invalid credentials: initiator "
1938
-	       "%sname,%spw, target %sname,%spw\n", iscsi,
1939
-	       ( initiator_username ? "" : "no " ),
1940
-	       ( initiator_password ? "" : "no " ),
1941
-	       ( target_username ? "" : "no " ),
1942
-	       ( target_password ? "" : "no " ) );
1943
-	return -EINVAL_BAD_CREDENTIAL_MIX;
1980
+/**
1981
+ * Check iSCSI authentication details
1982
+ *
1983
+ * @v iscsi		iSCSI session
1984
+ * @ret rc		Return status code
1985
+ */
1986
+static int iscsi_check_auth ( struct iscsi_session *iscsi ) {
1987
+
1988
+	/* Check for invalid authentication combinations */
1989
+	if ( ( /* Initiator username without password (or vice-versa) */
1990
+		( !! iscsi->initiator_username ) ^
1991
+		( !! iscsi->initiator_password ) ) ||
1992
+	     ( /* Target username without password (or vice-versa) */
1993
+		( !! iscsi->target_username ) ^
1994
+		( !! iscsi->target_password ) ) ||
1995
+	     ( /* Target (reverse) without initiator (forward) */
1996
+		( iscsi->target_username &&
1997
+		  ( ! iscsi->initiator_username ) ) ) ) {
1998
+		DBGC ( iscsi, "iSCSI %p invalid credentials: initiator "
1999
+		       "%sname,%spw, target %sname,%spw\n", iscsi,
2000
+		       ( iscsi->initiator_username ? "" : "no " ),
2001
+		       ( iscsi->initiator_password ? "" : "no " ),
2002
+		       ( iscsi->target_username ? "" : "no " ),
2003
+		       ( iscsi->target_password ? "" : "no " ) );
2004
+		return -EINVAL_BAD_CREDENTIAL_MIX;
2005
+	}
2006
+
2007
+	return 0;
1944 2008
 }
1945 2009
 
1946 2010
 /**
@@ -1977,12 +2041,11 @@ static int iscsi_open ( struct interface *parent, struct uri *uri ) {
1977 2041
 	if ( ( rc = iscsi_parse_root_path ( iscsi, uri->opaque ) ) != 0 )
1978 2042
 		goto err_parse_root_path;
1979 2043
 	/* Set fields not specified by root path */
1980
-	if ( ( rc = iscsi_set_auth ( iscsi,
1981
-				     iscsi_initiator_username,
1982
-				     iscsi_initiator_password,
1983
-				     iscsi_target_username,
1984
-				     iscsi_target_password ) ) != 0 )
1985
-		goto err_set_auth;
2044
+	if ( ( rc = iscsi_fetch_settings ( iscsi ) ) != 0 )
2045
+		goto err_fetch_settings;
2046
+	/* Validate authentication */
2047
+	if ( ( rc = iscsi_check_auth ( iscsi ) ) != 0 )
2048
+		goto err_check_auth;
1986 2049
 
1987 2050
 	/* Sanity checks */
1988 2051
 	if ( ! iscsi->target_address ) {
@@ -1997,6 +2060,9 @@ static int iscsi_open ( struct interface *parent, struct uri *uri ) {
1997 2060
 		rc = -EINVAL_NO_TARGET_IQN;
1998 2061
 		goto err_sanity_iqn;
1999 2062
 	}
2063
+	DBGC ( iscsi, "iSCSI %p initiator %s\n",iscsi, iscsi->initiator_iqn );
2064
+	DBGC ( iscsi, "iSCSI %p target %s %s\n",
2065
+	       iscsi, iscsi->target_address, iscsi->target_iqn );
2000 2066
 
2001 2067
 	/* Open socket */
2002 2068
 	if ( ( rc = iscsi_open_connection ( iscsi ) ) != 0 )
@@ -2018,7 +2084,8 @@ static int iscsi_open ( struct interface *parent, struct uri *uri ) {
2018 2084
  err_open_connection:
2019 2085
  err_sanity_iqn:
2020 2086
  err_sanity_address:
2021
- err_set_auth:
2087
+ err_check_auth:
2088
+ err_fetch_settings:
2022 2089
  err_parse_root_path:
2023 2090
 	iscsi_close ( iscsi, rc );
2024 2091
 	ref_put ( &iscsi->refcnt );
@@ -2032,165 +2099,3 @@ struct uri_opener iscsi_uri_opener __uri_opener = {
2032 2099
 	.scheme = "iscsi",
2033 2100
 	.open = iscsi_open,
2034 2101
 };
2035
-
2036
-/****************************************************************************
2037
- *
2038
- * Settings
2039
- *
2040
- */
2041
-
2042
-/** iSCSI initiator IQN setting */
2043
-struct setting initiator_iqn_setting __setting = {
2044
-	.name = "initiator-iqn",
2045
-	.description = "iSCSI initiator name",
2046
-	.tag = DHCP_ISCSI_INITIATOR_IQN,
2047
-	.type = &setting_type_string,
2048
-};
2049
-
2050
-/** iSCSI reverse username setting */
2051
-struct setting reverse_username_setting __setting = {
2052
-	.name = "reverse-username",
2053
-	.description = "Reverse user name",
2054
-	.tag = DHCP_EB_REVERSE_USERNAME,
2055
-	.type = &setting_type_string,
2056
-};
2057
-
2058
-/** iSCSI reverse password setting */
2059
-struct setting reverse_password_setting __setting = {
2060
-	.name = "reverse-password",
2061
-	.description = "Reverse password",
2062
-	.tag = DHCP_EB_REVERSE_PASSWORD,
2063
-	.type = &setting_type_string,
2064
-};
2065
-
2066
-/** An iSCSI string setting */
2067
-struct iscsi_string_setting {
2068
-	/** Setting */
2069
-	struct setting *setting;
2070
-	/** String to update */
2071
-	char **string;
2072
-	/** String prefix */
2073
-	const char *prefix;
2074
-};
2075
-
2076
-/** iSCSI string settings */
2077
-static struct iscsi_string_setting iscsi_string_settings[] = {
2078
-	{
2079
-		.setting = &initiator_iqn_setting,
2080
-		.string = &iscsi_explicit_initiator_iqn,
2081
-		.prefix = "",
2082
-	},
2083
-	{
2084
-		.setting = &username_setting,
2085
-		.string = &iscsi_initiator_username,
2086
-		.prefix = "",
2087
-	},
2088
-	{
2089
-		.setting = &password_setting,
2090
-		.string = &iscsi_initiator_password,
2091
-		.prefix = "",
2092
-	},
2093
-	{
2094
-		.setting = &reverse_username_setting,
2095
-		.string = &iscsi_target_username,
2096
-		.prefix = "",
2097
-	},
2098
-	{
2099
-		.setting = &reverse_password_setting,
2100
-		.string = &iscsi_target_password,
2101
-		.prefix = "",
2102
-	},
2103
-	{
2104
-		.setting = &hostname_setting,
2105
-		.string = &iscsi_default_initiator_iqn,
2106
-		.prefix = "iqn.2000-01.org.etherboot:",
2107
-	},
2108
-};
2109
-
2110
-/**
2111
- * Apply iSCSI setting
2112
- *
2113
- * @v setting		iSCSI string setting
2114
- * @ret rc		Return status code
2115
- */
2116
-static int apply_iscsi_string_setting ( struct iscsi_string_setting *setting ){
2117
-	size_t prefix_len;
2118
-	int setting_len;
2119
-	size_t len;
2120
-	int check_len;
2121
-	char *p;
2122
-
2123
-	/* Free old string */
2124
-	free ( *setting->string );
2125
-	*setting->string = NULL;
2126
-
2127
-	/* Allocate new string */
2128
-	prefix_len = strlen ( setting->prefix );
2129
-	setting_len = fetch_setting_len ( NULL, setting->setting );
2130
-	if ( setting_len < 0 ) {
2131
-		/* Missing settings are not errors; leave strings as NULL */
2132
-		return 0;
2133
-	}
2134
-	len = ( prefix_len + setting_len + 1 );
2135
-	p = *setting->string = malloc ( len );
2136
-	if ( ! p )
2137
-		return -ENOMEM;
2138
-
2139
-	/* Fill new string */
2140
-	strcpy ( p, setting->prefix );
2141
-	check_len = fetch_string_setting ( NULL, setting->setting,
2142
-					   ( p + prefix_len ),
2143
-					   ( len - prefix_len ) );
2144
-	assert ( check_len == setting_len );
2145
-
2146
-	return 0;
2147
-}
2148
-
2149
-/**
2150
- * Apply iSCSI settings
2151
- *
2152
- * @ret rc		Return status code
2153
- */
2154
-static int apply_iscsi_settings ( void ) {
2155
-	struct iscsi_string_setting *setting;
2156
-	unsigned int i;
2157
-	int rc;
2158
-
2159
-	for ( i = 0 ; i < ( sizeof ( iscsi_string_settings ) /
2160
-			    sizeof ( iscsi_string_settings[0] ) ) ; i++ ) {
2161
-		setting = &iscsi_string_settings[i];
2162
-		if ( ( rc = apply_iscsi_string_setting ( setting ) ) != 0 ) {
2163
-			DBG ( "iSCSI could not apply setting %s\n",
2164
-			      setting->setting->name );
2165
-			return rc;
2166
-		}
2167
-	}
2168
-
2169
-	return 0;
2170
-}
2171
-
2172
-/** iSCSI settings applicator */
2173
-struct settings_applicator iscsi_settings_applicator __settings_applicator = {
2174
-	.apply = apply_iscsi_settings,
2175
-};
2176
-
2177
-/****************************************************************************
2178
- *
2179
- * Initiator name
2180
- *
2181
- */
2182
-
2183
-/**
2184
- * Get iSCSI initiator IQN
2185
- *
2186
- * @v iscsi		iSCSI session
2187
- * @ret rc		Return status code
2188
- */
2189
-const char * iscsi_initiator_iqn ( void ) {
2190
-
2191
-	if ( iscsi_explicit_initiator_iqn )
2192
-		return iscsi_explicit_initiator_iqn;
2193
-	if ( iscsi_default_initiator_iqn )
2194
-		return iscsi_default_initiator_iqn;
2195
-	return "iqn.2000-09.org.etherboot:UNKNOWN";
2196
-}

Chargement…
Annuler
Enregistrer