Esempio n. 1
0
void qfRwinSegment(qfRwin_t     *qr,
                   uint32_t     unscaled)
{
    if ((qr->val.last > 0) && (unscaled == 0)) {
        qr->stall++;
    }
    
    sstMeanAdd(&qr->val, unscaled << qr->scale);
}
Esempio n. 2
0
File: qofseq.c Progetto: britram/qof
int qfSeqSegment(qfSeq_t *qs, qfRtt_t *rtt, uint16_t mss,
                 uint8_t flags, uint32_t seq, uint32_t oct,
                 uint32_t ms, uint32_t tsval,
                 gboolean do_ts, gboolean do_iat) {

    uint32_t lastms = 0;
    
    /* Empty segments don't count */
    if (!oct) return 0;
    
    if (qfWrapCompare(seq, qs->nsn) < 0) {
        /* Sequence less than NSN: fill */
        if (seq - qs->nsn > qs->maxooo) {
            qs->maxooo = seq - qs->nsn;
        }
        if (qfSeqGapFill(qs, seq, seq + oct)) {
            qfCountLoss(qs, rtt, ms);
        }
    } else {
        /* Sequence beyond NSN: push */
        if (seq != qs->nsn) {
            qfSeqGapPush(qs, qs->nsn, seq, mss);

            /* signal loss for burst tracking */
            qfCountLoss(qs, rtt, ms);
            
            /* track max out of order */
            if (seq - qs->nsn > qs->maxooo) {
                qs->maxooo = seq - qs->nsn;
            }
        }
        
        /* Detect wrap */
        if (seq + oct < qs->nsn) {
            qs->wrapct++;
        }
        
        /* Determine next sequence number */
        qs->nsn = seq + oct;
        
        /* track timestamp frequency */
        if (do_ts && tsval) {
            /* increment wrap counters if necessary */
            if (tsval < qs->advtsval) {
                qs->tsvalwrap++;
            }
            if (ms < qs->advlms) {
                qs->lmswrap++;
            }

            /* save current value */
            qs->advtsval = tsval;
        }

        /* and advance time */
        lastms = qs->advlms;
        qs->advlms = ms;

        /* calculate interarrival/interdeparture time of advancing segments */
        if (do_iat) {
            uint32_t iat = 0, idt = 0, hz = 0;
            
            iat = ms - lastms;
            sstMeanAdd(&qs->seg_iat, iat);
            if (do_ts && tsval && (hz = qfTimestampHz(qs))) {
                idt = (1000 * (tsval - qs->advtsval)) / hz;
                sstMeanAdd(&qs->seg_variat, iat - idt);
            }
        }
        
        return 1;
    }
    
    /* if we're here, we didn't advance */
    return 0;
}