Hi Arnaldo,

hank you for going through this. I have just backported your recent patches of 
2.6.25
to the DCCP/CCID4/Faster Restart test tree at 
        git://eden-feed.erg.abdn.ac.uk/dccp_exp {dccp,ccid4,dccp_fr}
as per subsequent message.
|        do, so please consider moving DCCP discussion to [EMAIL PROTECTED],
|        where lots of smart networking folks are present and can help our 
efforts
|        on turning RFCs to code.
Are you suggesting using netdev exclusively or in addition to [EMAIL PROTECTED]
  

|       Please take a look at this patch series where I reorganized your work 
on the new
| TFRC rx history handling code. I'll wait for your considerations and then do 
as many
| interactions as reasonable to get your work merged.
| 
|       It should be completely equivalent, plus some fixes and optimizations, 
such as:
It will be necessary to address these points one-by-one. Before diving into 
making
fixes and `optimisations', have you tested your code? The patches you are 
referring to
have been posted and re-posted for a period of over 9 months on [EMAIL 
PROTECTED], and
there are regression tests which show that this code improves on the existing 
Linux
implementation. These are labelled as `test tree' on 
        http://www.linux-foundation.org/en/Net:DCCP_Testing#Regression_testing
So if you are making changes to the code, I would like to ask if you have run 
similar
regression tests, to avoid having to step back later.


 
| . The code that allocates the RX ring deals with failures when one of the 
entries in
|   the ring buffer is not successfully allocated, the original code was 
leaking the
|   successfully allocated entries.
| 
| . We do just one allocation for the ring buffer, as the number of entries is 
fixed we
|   should just do one allocation and not TFRC_NDUPACK times.
Will look at the first point in the patch; with regard to the second point I 
agree, this
will make the code simpler, which is good. 

| . I haven't checked if all the code was commited, as I tried to introduce 
just what was
|   immediatelly used, probably we'll need to do some changes when working on 
the merge
|   of your loss intervals code.
Sorry I don't understand this point.

| . I changed the ccid3_hc_rx_packet_recv code to set hcrx->ccid3hcrx_s for the 
first
|   non-data packet instead of calling ccid3_hc_rx_set_state, that would use 0 
as the
|   initial value in the EWMA calculation.
This is a misunderstanding. Non-data packets are not considered in the moving 
average
for the data packet size `s'; and it would be an error to do (consider 40byte 
Acks vs.
1460byte data packets, also it is in RFC 4342). 
Where would the zero initial value come from? I think this is also a 
misunderstanding.
Please have a look below:
        static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff 
*skb)
        {
                // ...
                u32 sample, payload_size = skb->len - dccp_hdr(skb)->dccph_doff 
* 4;

                if (unlikely(hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA)) {
                        if (is_data_packet) {
                                do_feedback = FBACK_INITIAL;
                                ccid3_hc_rx_set_state(sk, TFRC_RSTATE_DATA);
                                ccid3_hc_rx_update_s(hcrx, payload_size);
                        }
                        goto update_records;
                }

==> Non-data packets are ignored for the purposes of computing s (this is in 
the RFC),
    consequently update_s() is only called for data packets; using the two 
following
    functions:


        static inline u32 tfrc_ewma(const u32 avg, const u32 newval, const u8 
weight)
        {
                return avg ? (weight * avg + (10 - weight) * newval) / 10 : 
newval;
        }

        static inline void ccid3_hc_rx_update_s(struct ccid3_hc_rx_sock *hcrx, 
int len)
        {
                if (likely(len > 0))    /* don't update on empty packets (e.g. 
ACKs) */
                        hcrx->ccid3hcrx_s = tfrc_ewma(hcrx->ccid3hcrx_s, len, 
9);
        }

==> Hence I can't see where a zero value should come from: ccid3hrx_s is 
initially 
    initialised with zero (memset(...,0,...)); when first called, update_s() 
will
    feed a non-zero payload size to tfrc_ewma(), which will return  `newval' = 
payload_size,
    hence the first data packet will contribute a non-zero payload_size.
    Zero-sized DCCP-Data packets are pathological and are ignored by the CCID 
calculations
    (not by the receiver); a corresponding counterpart for zero-sized

| 
|       It is available at:
| 
| master.kernel.org:/pub/scm/linux/kernel/git/acme/net-2.6.25
| 
Need to do this separately. As said, the code has been developed and tested 
over a long time,
it took a long while until it acted predictably, so being careful is very 
important.

I would rather not have my patches merged and continue to run a test tree if 
the current
changes alter the behaviour to the worse.
-
To unsubscribe from this list: send the line "unsubscribe dccp" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to