void qfRwinSegment(qfRwin_t *qr, uint32_t unscaled) { if ((qr->val.last > 0) && (unscaled == 0)) { qr->stall++; } sstMeanAdd(&qr->val, unscaled << qr->scale); }
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; }