void MembershipBookkeeping::SyncSourceLink::computeStats() { // See Appendix A.3 // compute cumulative packet lost. setExtendedMaxSeqNum(getMaxSeqNum() + getSeqNumAccum()); uint32 expected = (getExtendedMaxSeqNum() - getBaseSeqNum() + 1); uint32 pc = getObservedPacketCount(); uint32 lost; if ( 0 == pc ) lost = 0; else lost = expected - pc; setCumulativePacketLost(lost); // compute the fraction of packets lost during the last // reporting interval. uint32 expectedDelta = expected - expectedPrior; expectedPrior = expected; uint32 receivedDelta = getObservedPacketCount() - receivedPrior; receivedPrior = getObservedPacketCount(); uint32 lostDelta = expectedDelta - receivedDelta; if ( expectedDelta == 0 || lostDelta <= 0 ) setFractionLost(0); else setFractionLost((lostDelta<<8) / expectedDelta ); }
/*add any new loss to the lossRecord*/ void updateLoss () { uint64_t T_loss; //if (higher==3) add to lossRecord; //if (mylog->rear - mylog->front <4) // return; /*get the third biggest seqNum*/ uint32_t num = getMaxSeqNum(mylog,3); uint32_t num1 = getMaxSeqNum(mylog,4); uint32_t i; int index,j;//index for return value of existSeqNum, j for last receive packet index uint32_t latestNum; /*add all packets(not received) that have exactly 3 higher packet seqNum*/ for (i=num;i>num1;i--) //for (i=num;i>mylog->qBase[mylog->rear]->packet->seqNum;i--) { index = existSeqNum(mylog, i-1); if (index == -1) { T_loss = T_lossCompute(i-1); append(&lossRecord, i-1, T_loss); countDroped++; printf("%u lost\n\n", i-1); latestNum = i-1; } else{ j = index; break; } } //if (ackNum != latestNum){ // preAckNum = ackNum; ackNum = latestNum; //} }