On Wed, 2009-08-12 at 13:54 -0700, Darren Reed wrote:
> On 12/08/09 06:37 AM, Sebastien Roy wrote: 
> > Darren,
> > 
> > On Mon, 2009-07-27 at 19:01 -0700, Darren Reed wrote:
> > > http://cr.opensolaris.org/~darrenr/onnv-pcapture/
> > > 
> > 
> > I reviewed the changes to ipnet and ip:
> > 
> > General: There are quite a bit of changes related to the style of
> > local variable declaration that was changed, thus adding to the volume
> > of the review.  In general, it would be preferable to restrict the set
> > of changes to the functionality being added, and to cstyle and lint
> > issues found while making these changes.  Otherwise, sticking with the
> > existing style of the file without making sweeping changes to style
> > based on personal preference should be the modus operandi.  I won't
> > comment on each instance, I've restricted my specific comments to
> > things not related to local variable declarations. :-)
> 
> 
> As we discussed, i want there to be *1* style for the file.
> I have no interest in which style that is. I just don't like
> working on source code with mixed styles because it isn't
> clear which one should be used going forward...
> 
> Is it to be:
> <type><tab><variable>
> or
> <type><n tabs><variables> 
> .. where all the variables are aligned and an arbitrary number
> of tabs are inserted.
> 
> The difference is (what I've currently done):
> 
> struct ip        ip;
> int     foo;
> 
> one tab between type and name, vs:
> 
> struct ip        ip
> int              foo;
> 
> where short type names have extra tabs.
> 
> At present, compare _init()'s variables (space between type and
> variable name) with those in ipnet_if_init().
> _init()'s use the latter of the above - multiple tabs to bring
> variables out to the same position, which is different to what
> I interpreted your earlier suggestion (single tab) as being.

All variable names should be aligned at a tab boundary, and initialized
in the declaration where possible.  That's the style used throughout the
file.  There may be a couple of exceptions (i.e. mistakes), but that's
not reason enough to change the entire file to use an entirely new
style.  If there's a function that isn't using this style, then let's
fix it rather than fix every other function.  e.g.

        netstack_t      *ns = netstack_find_by_zoneid(ifp->if_zoneid);
        ip_stack_t      *ipst = ns->netstack_ip;
        ipnet_t         *ipnet;
        char            name[32];
        int             error = 0;

> 
> > 
> > uts/common/inet/ipnet.h
> > 
> > * 58: This may need to be atomic (atomic_inc_64())
> 
> Discuss.
> In a similar vein to many of the counters in IP not being
> atomic increments, so to is this. There's a real cost for
> using atomic_() ops and it seems that unless there is an
> absolute need for it to be 100% reliable (reference count,
> etc), the "danger" in just using "++" for general statistics
> seems to be accepted. Compare with MIB_BUMP() and
> other _BUMP() macros in $SRC/uts/common/inet/*.h.

I would think that the cost of the atomic_inc_*() APIs are quite minimal
(and they're relatively widely used in IP), but I can't say that I care
very much either way.  Having an accurate error count would seem like an
important thing, and performance when recording an error would seem like
a secondary concern (and again, I doubt that atomic operations would
affect performance of ipnet).

> > 
> > * 1168: What's the purpose of this addition?  This function only gets
> >   called for ipnet_t streams that are on the /dev/lo0 device.
> 
> Discuss.
> ipnet_loaccept() is used twice: once in ipnet_open() and once in
> ipnet_promisc_add().

I don't follow.  ipnet_acceptfn should only be set to ipnet_loaccept()
if /dev/lo0 is opened, and in no other case.  Therefore the check you
added in the function itself: "if (getminor(ipnet->ipnet_if->if_dev) ==
IPNET_MINOR_LO)" is redundant.  If ipnet_loaccept() is getting called
when it shouldn't be, then something else is wrong.

> > 
> > * 1327-1328,2300-2304: This is not correct.  The IPNETIF_LOOPBACK code
> >   breaks the semantics defined in PSARC 2006/475 as we talked about on
> >   clearview-discuss.
> 
> Accept.
> IPNETIF_LOOPBACK is now only used by the BPF code path.

In what case, and what does it mean?  Remember that /dev/lo0
and /dev/ipnet/lo0 have different semantics, and that ipnet_loaccept()
is only strictly implementing the semantics of /dev/lo0.

> > * 1959: What is the reason for this callback having to duplicate every
> >  packet passed to it?  Why wouldn't the code that dispatches packets
> >  to callbacks always simply pass a duplicate?  An observability hook
> >  should always have those semantics (it should never manipulate the
> >  original or block while processing it), so hard-coding such
> >  semantics for all NH_OBSERVE hooks would make sense to me.
> 
> Discuss.
> The duplication here has been moved from ip.c`ipobs_hook() to here.
> Whereas ipobs_hook() was previously just walking a list of functions
> to call and doing the duplication there, as required, now the list
> walking is separated (pfhooks) from the packet duplication. Thus the
> dispatching comes out of pfhooks and jumps through ipobs_bounce_func_cb()
> to do the duplication for the real recipient (func).

Ah, I see.

> But, if your
> comments above are correct, then dupmsg() should be removed and only
> copymsg() used, otherwise the observe is presented with the real
> packet data (in dblk_t's off of its own mblk_t.) There is a performance
> cost with this, though: it enforces a deep copy of all observed packets,
> copying all of the dblk_t's, not just a shallow one (creating new mblk_t's.)
> The current implementation only does a deep copy if the shallow one
> fails.

Okay.

> > * 2203-2232: datalink_id_t is not the same as IP interface index.
> >   They don't represent the same objects, and they don't exist at the
> >   same layer.  if_index is an IP interface index, and a datalink_id_t
> >   is a linkid as handled in the GLDv3 framework.  This code has
> >   nothing to do with GLDv3, and is strictly contained at the IP-layer,
> >   so it shouldn't be handling datalink_id_t.
> 
> Discuss.
> The index used is the index from IP, but seeing as there is no
> ipindex_t, I used datalink_id_t to put the index in. It would
> seem that using datalink_id_t as a type here is cause for confusion
> so it might be better to just use uint_t.

Yep, I think so.

-Seb



Reply via email to