Sebastien,
thanks much for the comments! I will go through them and get back to you..
--Sowmini
On (11/20/07 18:32), Sebastien Roy wrote:
>
> Brussels team,
>
> Here are my belated comments. Overall a great addition to the framework.
>
> General:
>
> * I'm sure you're aware, but there are a couple of files with empty
> deltas, or seemingly unecessary changes. I'll mention them just in
> case:
> usr/src/cmd/dladm/Makefile
> usr/src/uts/common/io/ipw/ipw2100.c
> usr/src/uts/common/io/strplumb.c
>
>
> usr/src/cmd/dladm/dladm.c
>
> * General: There are a lot of new inter-related data structures and
> functions. It would be nice to have a single block comment explaining
> the design so that someone writing a new show-* command can easily do
> so.
>
> It would also help to organize the top portion of dladm.c so that data
> structures aren't so spread out. For example, place all of the
> print_fields_t arrays in one place, etc... Another way to organize
> things would be to put all of the "ether" related arrays and
> structures together (and do the same for other show-* objects) so that
> one can easily see how they're related and how to create new show-*
> subcommands.
>
> * General: Is there a difference between a "field" (i.e.,
> "ether_fields"), an "arg" (i.e., "link_args_t"), and an "attr" (i.e.,
> "link_attr"? These terms seem to be used interchangealy here and
> there throughout the code, and it hurts the readability of the code.
> Please use a consistent naming scheme for data structures and
> functions.
>
> * 75: What is <name>? Is it "pf_name", or "pf_header"?
>
> * 87: I don't understand the need for this union, nor what pf_mask is.
> It doesn't appear to be a mask at all, since it's used in a switch
> statement at 3494.
>
> * 88: On a related note, what is the need to store an offset here rather
> than a pointer to an actual buffer? I can see this being much simpler
> if you define a single global wad of output buffers like:
>
> struct {
> col_link_name[BLABLA];
> col_link_class[BLABLA];
> /* ... */
> col_vlan_vid[BLABLA];
> /* ... */
> } output_columns;
>
> typedef struct print_column_s {
> const char *pc_name;
> char *pc_buffer;
> /* ... */
> } print_column_t;
>
> static print_column_t show_link_columns[] = {
> { "link", output_columns.col_link_name, /* ... */ },
> { "class", output_columns.col_link_class, /* ... */ },
> /* ... */
> };
>
> * 137: Why glom the show-{link,phys,vlan} buffers together, but not the
> buffers for other show-* commands? This seems somewhat random.
>
> * 150: The members of this structure aren't arguments (they're output
> buffers, right?), so I don't think link_args_t is an appropriate type
> name.
>
> * 365,369: Inconsistent use of "-" and "_". Is there a rationale?
>
> * 399: This looks a lot like dev_fields. Please expand the comment to
> explain what its for.
>
> * 424: There's one too many spaces at the end of this string.
>
> * 444,449: Missing -o option for these subcommands.
>
> * 1295-1311: This array is stranded here; the other similar arrays are
> at the beginning of the file. Please organize these things so that
> they're all in one place.
>
> * 1371: Why the "void *"? It would be more straightforward to pass in a
> pointer to a link_args_t as the last argument, no?
>
> * 1639,1781,etc.: "j" is not an intelligible variable name. Same
> comment for a bunch of other functions in this file.
>
> * 1662: Can this code be less confusing please? At a minimum, it needs
> comments. You're using pointer arithmetic to see which offset into
> the array you're at to find out which field you're printing. This is
> practically unmaintainable. At some point in the future, someone will
> make a change to a print_field_t array somewhere and all of this will
> fall appart unintentionally.
>
> * 1664,1668,etc.: Where do these constants come from? This is very
> fragile. Please replace these with a proper enum datatype, and put
> that in print_field_t. You'll then be able to un-obfuscate all of the
> pointer arithmetic related to my previous comment.
>
> * 1671: There are dozens of individual "--" strings everywhere. Let's
> just have a global "const char" and use that instead.
>
> * 1805,1810,etc.: Same comment as above, please replace the use of
> seemingly arbitrary numbers related to array offsets with proper enums
> or manifest constants. This comment goes for the other functions in
> this file with the same problem.
>
> * 3577: This shouldn't be const (and you'll be able to lose the cast at
> 3593.)
>
> * 4517: What are the error semantics of DLADM_STATUS_BUSY? It looks
> like if DLADM_STATUS_BUSY is returned, we silently don't do anything
> and pretend that the command succeeded.
>
> * 5241: die() exits; there's no need for this exit() call.
>
> * 5269: media, class, and flags are never used. You can pass in NULL
> arguments to dladm_datalink_id2info() instead of passing in references
> you'll never use. There are other calls to dladm_datalink_id2info()
> like this where some of the arguments aren't used that you didn't
> introduce, and you could fix those while you're at it if you want.
>
> * 5687: flags is never used.
>
>
> usr/src/lib/libdladm/common/libdllink.h
>
> * General: You added these prototypes to libdllink.h, but the functions
> are defined in libdladm.c. I'd move them to libdllink.c along with
> the other functions declared in libdllink.h.
>
> * 153-154: These lines are unnecessarily split.
>
>
> usr/src/lib/libdladm/common/linkprop.c
>
> * 218-241: Why are these needed? Are there actual alignment issues, or
> are these used to quiet lint? Could memcpy() not be used instead?
>
> * 223: Why htonl()? Since we're dealing with values that don't show up
> on the wire, intuitively, we should be dealing with values in
> host-byte-order. Am I missing something?
>
> * 584: The semantics should be that if DLADM_OPT_ACTIVE isn't set, then
> the caller doesn't want the changes applied to the running kernel.
> While dladm currently doesn't have a command-line flag to do
> persistent-only operations, it doesn't seem too hard to implement that
> in the API.
>
> * 595: If you got DLADM_STATUS_BUSY at 584, the caller will never know,
> and you might return DLADM_STATU_OK, thus pretending that the property
> was successfully set when it wasn't. Honestly, I don't understand why
> DLADM_STATUS_BUSY isn't a regular error like any other error.
>
> * 1577: I see this same arithmetic copied-and-pasted everywhere below
> here. This smells like something that needs to be simplified.
>
> * 1606: There is no need to map the linkid to a link name. Your ioctl
> just maps the link name back to a linkid in the kernel. It would be
> much simpler to just pass down the linkid. As you have things now,
> there are three mappings:
>
> 1. dladm is passed a link name and maps that to a linkid to call
> dladm_set_linkprop().
> 2. dladm_set_linkprop() ends up in dld_buf_init_common(), which maps
> that back to a link name so that it can call your DLD ioctl.
> 3. The ioctl maps that back to a linkid so that it can look up the
> link in the dls hash table.
>
> Only (1) is needed.
>
> * 1639: Need a space or two between functions.
>
> * 1666: Why do you need this? The driver will be able to tell you
> whether the speed passed in was valid for that device, right?
>
> * 1711: I fundamentally disagree with the idea that libdladm somehow
> knows something about acceptable link MTU values. Each driver must
> check to make sure that the given MTU is acceptable anyway, so there's
> no need for libdladm to do anything. Besides, references to Ethernet
> and IP are out of place, as you might be dealing with a datalink that
> has nothing to do with either.
>
> * 1927: I don't see the need for GETINT64() here. Why not a simple
> memcpy()?
>
> * 2031: There are dozens of places in this file where we do:
>
> if ((fd = open(DLD_CONTROL_DEV, ...)) M 0) {
> bla bla
> }
> i_dladm_ioctl(...);
>
> A helper routine that does this would help reduce the duplication
> (i_dld_ioctl, for example).
>
>
> usr/src/uts/common/io/dls/dls_vlan.c
>
> * 967,982: The model for the dls client APIs is that they take a
> datalink_id_t to identify which datalink to operate on (the
> i_dls_vlan_hash is by datalink_id_t.) Passing in a link name means
> that the dls module has to map this to a datalink_id_t before doing
> anything, which means a round trip up to user-space. If you follow
> the trail in the code you have, which does a dls_vlan_hold_by_name(),
> eventually, you end up in dls_mgmt_get_linkid(), which does the upcall
> to the dlmgmtd daemon.
>
> Having these functions take a linkid would allow them to do a simple
> dls_vlan_hold() instead of dls_vlan_hold_by_name(). You'd then do the
> link-name to datalink_id_t translation in user-space prior to calling
> the libdladm API.
>
> Such a change would ripple up to the ioctl handling in dld, obviously.
>
>
> usr/src/uts/common/io/mac/mac.c
>
> * 2971,2985: cstyle: curly brackets needed.
>
> * 3000: The mac_info_t must be comprised of immutable values (see the
> comment in mac.h.) The idea is that mac_info_t is copiedThe min and
> max sdu need to be moved out of mac_info_t, and directly into
> mac_impl_t.
>
> -Seb
> _______________________________________________
> brussels-dev mailing list
> brussels-dev at opensolaris.org
> http://mail.opensolaris.org/mailman/listinfo/brussels-dev