Joe,
I've taken your suggestions if not otherwise mentioned in my replies below.
I will resubmit the webrev when I finish then changes replacing
MAXNAMELEN with proper sizes.
Joseph J VLcek wrote:
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
> usr/src/cmd/auto-install/ai_manifest.rng 35 lines changed
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
>
> Issue/Question:
> -----------------------
>
> 207 <element name="target_device_iscsi_target_ip">
> 208 <text/>
>
> Would it be better fo use something more specific for IP address instead
> of text? Maybe not but I thought I would ask you to think about it.
>
> I Googled and found this for IPv4 addresses:
> <datatype name="IP" source="string">
> <pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}
> (1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
> <annotation>
> <info>
> Datatype for representing IP addresses. Examples,
> 129.83.64.255, 64.128.2.71, etc.
> This datatype restricts each field of the IP address
> to have a value between zero and 255, i.e.,
> [0-255].[0-255].[0-255].[0-255]
> Note: in the value attribute (above) the regular
> expression has been split over two lines. This is
> for readability purposes only. In practive the R.E.
> would all be on one line.
> </info>
> </annotation>
> </pattern>
> </datatype>
I found references to this online. It has a couple of errors, and it
does not apply to Relax NG.
>
> Same issue with LUN:
> ...
Yes, it would be better for manifest validation to do these things. It
cannot be done with the basic datatypes - a supplemental validation
library or extension of RNG would have to be created. This should be
addressed in semantic validation, since it might be done better in C or
Python.
>
>
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
> usr/src/cmd/auto-install/auto_install.c 60 lines changed
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
>
> Issue/Question:
> -----------------------
>
> 48 #define ISCSI_BOOT_INDICATOR_FILE "/tmp/.iscsi_boot"
>
> I think this is a good idea as it is consistent with /.autoinstall
> and /.livecd but I was wondering why you put this one in "/tmp" instead
> of "/".
>
>
>
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
> usr/src/cmd/auto-install/auto_install.h 24 lines changed
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
>
> Nit/Issue/Question:
> -----------------------
>
> 206 char diskiscsiname[MAXNAMELEN];
> 207 char diskiscsiip[MAXNAMELEN];
> 208 char diskiscsilun[MAXNAMELEN];
> 209 unsigned long diskiscsiport;
> 210 char diskiscsichapname[MAXNAMELEN];
> 211 char diskiscsichapsecret[MAXNAMELEN];
> 212 char diskiscsiinitiator[MAXNAMELEN];
>
>
> I find these names difficult to read. How would you feel about adding
> a random "_" here or there? ;)
>
> e.g.:
> 206 char diskiscsi_name[MAXNAMELEN];
> 207 char diskiscsi_ip[MAXNAMELEN];
> 208 char diskiscsi_lun[MAXNAMELEN];
> 209 unsigned long diskiscsi_port;
> 210 char diskiscsi_chap_name[MAXNAMELEN];
> 211 char diskiscsi_chap_secret[MAXNAMELEN];
> 212 char diskiscsi_initiator[MAXNAMELEN];
>
> Issue/Question:
> -----------------------
>
> Is MAXNAMELEN sufficiently accurate for these?
>
>
>
>
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
> usr/src/cmd/auto-install/auto_parse.c 38 lines changed
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
>
> Nit: 187-> 224
> -----------------------
>
> Please add a CR above the consecutive ai_get_manifest_element_value()
> invocations for readibility?
> I found this a little hard to read and noticed the <CR> above
> calls to ai_get_manifest_element_value elsewhere in the file
> improved readibilty.
>
> Nit/Issue/Question:
> -----------------------
>
> 209 adi->diskiscsiport = strtoll(p, NULL, 0);
>
> Should the expected format be described as a comment in ai_manifest.rng?
I think that comments in the RNG file should be limited to explaining
specific RNG issues, and the rest should be commented in the code. In
this case, it's just a port number used for a TCP connection.
>
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
> usr/src/cmd/auto-install/auto_td.c 231 lines changed
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
>
> Issue/Question:
> -----------------------
>
> 471 char *diskiscsiname = "";
> 472 char *diskiscsiip = "";
> 473 char *diskiscsiporta = "";
> ...
> 475 char *diskiscsilun = "";
> 476 char *diskiscsiprotocol = "";
>
> ...
> 492 char rootpath[MAXPATHLEN] = "";
>
> Wouldn't it be better to initialize there to (char*)NULL or NULL?
Subsequent code expects NULL-terminated strings and does not check for
NULL. I'm not sure that it is better one way or the other.
>
> Issue/Question:
> -----------------------
>
> 454 * Returns -1 if error encountered
> 455 * Returns 0 if no parameters found, which assumes no iSCSI boot
> desired
> 456 * Attempts to mount using libima with iSCSI initiator
> 457 * Returns 0 and writes Solaris device name of iSCSI target if
> mounted
> 458 * Returns -1 if specified target not mounted successfully
>
>
> Return of -1 and 0 are differently commented twice.
I was trying to document an algorithm explaining return codes. Changed
to make it more conventional.
>
> Issue/Question:
> -----------------------
>
> 482 if (adi->diskiscsiname[0] == '\0' ^ adi->diskiscsiip[0] == '\0') {
>
> Why are you using bitwise OR, ^ ? Shouldn't this be logical OR, || ?
This is an exclusive OR, which does not have a logical form in C.
Improved comments to clarify this.
>
> Issue/Question:
> -----------------------
>
> 510 if ((ret = pclose(pipe_fp)) != 0)
> 511 auto_log_print("Error in command to check DHCP "
> 512 "for iSCSI boot client. Command:%s\n", cmd);
> ...
>
> If ret is -1 does ERRNO need to be checked?
>
> Issue/Question:
> -----------------------
>
> Please confirm the "Parsing iSCSI Rootpath" logic.
>
> 546 *p++ = '\0';
> 547 diskiscsiip = p; /* IP */
> 548 if ((p = strchr(p, ':')) == NULL)
>
> I think you are truncating p before you are done parsing it.
p is a utility pointer that is used to find the separator ":". Each
time it finds it, it writes a NULL and increments so that it points to
the next token, which is an iSCSI boot parameter (or the next separator
if it is empty). Setting *p to \0 is not necessary in 546, but it is
necessary in later lines to NULL-terminate the iSCSI boot parameters.
>
> Issue/Question:
> -----------------------
>
> 634 char mydevname[512]; /* size used in sscanf format */
>
> Is there a better constant to user for mydevname instead of 512?
sscanf (see comment above) does not take constants to limit the input
size (token pasting can be done, but it is a little messy). I thought it
better to use the constant and document that the constant was used in
the sscanf format.
>
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
> usr/src/lib/libict_pymod/ict.py 60 lines changed
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
>
> Issue:
> -----------------------
>
> 1356 if os.path.exists(ISCSI_BOOT_INDICATOR_FILE):
>
> self.ISCSI_INSTALL should be set in the constructor to be consistant
> with:
>
> 338 self.LIVECD_INSTALL = False
> 339 self.AUTO_INSTALL = False
>
> Issue:
> -----------------------
>
> 1277 if status == 0:
>
> if status == 0 is backwards from how this is handled throughout.
> and add logging message before return ICT_SVCCFG_FAILURE
>
> Suggestion:
>
> 1277 if status == 0:
> 1278 return 0
> 1279 return ICT_SVCCFG_FAILURE
>
> Change to:
>
> if status != 0:
> prerror('Unexpected error issuing svccfg -f command.')
> prerror('Failure. Returning: ICT_SVCCFG_FAILURE')
> return ICT_SVCCFG_FAILURE
>
> return 0
>
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
> usr/src/lib/libtd/Makefile 4 lines changed
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
>
> Looks OK
>
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
> usr/src/lib/libtd/td_api.h 30 lines changed
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
>
> Nit:
> -----------------------
>
> 244 td_errno_t td_target_search(nvlist_t *);
>
> Why was td_target_search inserted in the middle of the td_discoverXYZ
> functions?
It is placed below the discover functions and above the more general use
functions.
>
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
> usr/src/lib/libtd/td_mg.c 36 lines changed
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
>
>
> Nit/Issue/Question:
> -----------------------
>
> 684 switch (target_type) {
> 685 case TD_TARGET_TYPE_ISCSI_STATIC_CONFIG:
>
> Is a switch for a single case better than an "if" statement here?
I coded it with a switch to emphasize that the new TD interface is
generic and that target_type determines the function that will call a
function for that specific target_type. It should make it easier to add
additional target types later.
Will inform when code review is updated.
Thank you,
William
>
>
>
>
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
> New usr/src/lib/libtd/td_iscsi.c 572 lines changed
> +-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
>
>
>
> General Nit/Issue:
> -----------------------
>
> Please provide more extensive function block comments.
> Good examples can be found in td_mountall.c
>
> Nit/Issue:
> -----------------------
>
> 57 * return 0: success
> 58 * 1: failure
>
> -1, not 1, is returned on error
>
>
> Suggestion:
>
> 57 * return 0: success
> 58 * !0: failure
>
>
> Question:
> -----------------------
>
> 136 (void) sprintf(targetIpaddr, "%s:%lu", ipaddress, port);
> 137
> 138 (void)
> mbstowcs(staticConfig.targetAddress.hostnameIpAddress.
> 139 id.hostname, targetIpaddr, IMA_HOST_NAME_LEN);
>
> Does this work for both IPv4 and IPv6 ?
>
>
> Nit:
> -----------------------
>
> 238 * Wait fro a while here for updating.
>
> fro -> for
>
> Issue/Question:
> -----------------------
>
> 240 (void) sleep(INSTISCSI_SLEEP_INTERVAL * 2);
>
> How is it known this length of sleep will be sufficient.
>
>
> Issue/Question:
> -----------------------
>
> 433 (void) nvlist_lookup_uint32(attrs, TD_ISCSI_ATTR_PORT,
> &port);
> 448 (void) nvlist_lookup_string(attrs, TD_ISCSI_ATTR_LUN,
> &lun_num);
>
> Why isn't the return of nvlist_lookup_uint32/sting checked here?
>
>
>
> General Questions:
> - iSCSI only supported in AI why not LiveCD?
> - Shouldn't test_td.c be updated to support td_iscsi?
>