On Tue, Aug 30, 2005 at 03:07:33PM +0200, Jirka Bohac wrote:
> Hi,
> 
> > +/* wrappers of WE functions that don't check for errors */
> > +static inline int _iwe_stream_add_point(struct translate_scan *data,
> > 
> >     You may wonder why the original API of iwe_stream_add_point(()
> > is the way it is rather than the way you expect. I'll explain :
> > working closely with people doing embedded systems, one of my prime
> > concern has always been footprint and code simplicity, and this
> > explain those choices.
> 
> ...
> 
> > 
> >     Obviously, in your case it would be slightly different, so you
> > could do something like this :
> > ------------------------------------------------------
> >     res = ieee80211_networks_foreach(ieee, ieee80211_translate_scan, &data);
> >     if (res > 0) res = 0;
> >     if (data.stop - data.start <= IW_EV_ADDR_LEN)
> >             res = -E2BIG;
> >     wrqu->data.length = data.start - extra;
> > ------------------------------------------------------
> >     Then, obviously, you would be able to drop all the checks in
> > _iwe_stream_add_event(). Would you mind to try that and see how it
> > affect footprint and code readability ?
> 
> You're suggesting this check:
>       if (data.stop - data.start <= IW_EV_ADDR_LEN)
> 
> Think of this sequence: add(8b); add(10b); add(8b) -- adding the
> ten bytes could silently do nothing, but subsequently adding
> eight bytes might succeed
> 
> This would only work in cases where the largest event put into
> the stream would not exceed IW_EV_ADDR_LEN bytes; This is not the
> case. Think of the rates that are passed as a freeform string
> in an IWEVCUSTOM event (which is bad anyway).
> 
> Even if we used the size of the largest possible event in the
> check above, I don't like the idea of lying to the userspace -
> returning -E2BIG even if there is enough space in the buffer.
> Let alone how error-prone the resulting code would be - anyone
> adding another event to the scan results would need
> to understand this dirty hack...
> 
> I think the wrapper really makes the code cleaner and more
> readable.

        Good point. I prefer to add that directly in the upstream
functions, to avoid wrapper of wrapper and make the code more
efficient, so I'll prepare a patch for Wireless Extensions ASAP.

        Thinking about it, what about this alternate form that allow
to keep the overflow check offline :
---------------------------------------------------------
struct translate_scan {
        char *start;
        char *stop;
        int count;
        int error;
};

static inline int _iwe_stream_add_point(struct translate_scan *data,
                                         struct iw_event *iwe, char *extra)
{
        char *new_start;
        new_start = iwe_stream_add_point(data->start, data->stop, iwe, extra);
        if (unlikely(new_start == data->start))
                data->error = -E2BIG;
        data->start = new_start;
        return 0;
}
---------------------------------------------------------
        Tell me, and I'll work on it.

> >     This brings us to my second point. You don't seem to support
> > arbitrary size scan buffer (WE-17). That would be a trivial
> > modification of your code, and allow to remove the arbitrary limit on
> > IW_SCAN_MAX_DATA.
> 
> Good point, thanks. Will be fixed.

        Technically, this is not a fix, but a new feature ;-)

> Regards,
> 
> -- 
> Jirka Bohac <[EMAIL PROTECTED]>

        Jean
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to