double ProcessPP (int i_PktNumb) { // Show that we've received some data int processed = 0, count=0, i=0; double sum = 0., mean = 0., median=0.; for (i=0; i<i_PktNumb*2-1; i++) { if (seq[i] == seq[i+1] && seq[i] >= 0 ) //packet pair not lost { if ( processed > seq[i]) continue; // duplicated packet while (processed < seq[i]) // we skip any pairs? { ceflag[processed] = 0; // this pair is not valid printf("[%2d]: Packet pair lost\n", processed); processed ++; } ceflag[processed] = 1; // this pair is valid disperse[count] = (arrival[i+1].tv_sec - arrival[i].tv_sec) * 1000000 + (arrival[i+1].tv_usec - arrival[i].tv_usec); ce[count] = (psize[i+1]*8.0/disperse[count]); // compute effective capacity sr[count] = psize[i+1]*8.0/(sendtime[i+1]-sendtime[i]); // compute sending rate if (ce[count] > 0.) { sum += ce[count]; printf("[%2d]: %d recv in %d usec - Ce: %7.2f Mbps, sendRate: %7.2f Mbps\n", seq[i+1], psize[i+1], disperse[count], ce[count], sr[count]); count ++ ; // increase valid packet pair by 1 } processed ++; // Move to next pair if (processed >= i_PktNumb) break; } } mean = sum/count; sort_double(ce, count); median = (ce[count/2]+ce[count/2+1])/2; printf("Summary of Ce test with %d valid tests out %d pairs:\n\tmedian: %f Mbps\n", count, i_PktNumb, median); if (median >= 0) { return median; } else { return 0.0; } } // end ProcessPP()
void select_high_scoring_seq_for_EM (double *ChIPScore,int numSeq,int numSeqEM,char *Iseq,double fEM) { register int i; int numSeqWithQualityScore,numSeqEMtmp1,numSeqEMtmp2; double *tmpScore; double ChIPscoreCutoff; tmpScore=alloc_double(numSeq); numSeqWithQualityScore=0; for (i=0; i<numSeq; i++) { if (ChIPScore[i]>0) numSeqWithQualityScore++; } tmpScore=alloc_double(numSeq); for (i=0; i<numSeq; i++) tmpScore[i]=ChIPScore[i]; sort_double(tmpScore,numSeq); ChIPscoreCutoff=tmpScore[(int)(fEM*numSeq)]; if (numSeqWithQualityScore<=(int)(fEM*numSeq)) { for (i=0; i<numSeq; i++) Iseq[i]='0'; numSeqEMtmp1=0; for (i=0; i<numSeq; i++) { if (ChIPScore[i]>0) { Iseq[i]='1'; numSeqEMtmp1++; } } numSeqEMtmp2=0; for (i=0; i<numSeq; i++) { if (ChIPScore[i]<=0) { Iseq[i]='1'; numSeqEMtmp2++; if (numSeqEMtmp1+numSeqEMtmp2==numSeqEM) break; } } } else { for (i=0; i<numSeq; i++) Iseq[i]='0'; numSeqEMtmp1=0; numSeqEMtmp2=0; for (i=0; i<numSeq; i++) { if (ChIPScore[i]>=ChIPscoreCutoff) { Iseq[i]='1'; numSeqEMtmp1++; if (numSeqEMtmp1==numSeqEM) break; } } } if (tmpScore) { free(tmpScore); tmpScore=NULL; } if (ChIPScore) { free(ChIPScore); ChIPScore=NULL; } }
/* ******IMPORTANT********* * Process the TCP packets received, and the main logic is in the function. */ void process_tcp_packet(unsigned char* Buffer, int Size) { unsigned short iphdrlen; struct iphdr *iph = (struct iphdr *)Buffer; iphdrlen = iph->ihl*4; struct tcphdr *tcph=(struct tcphdr*)(Buffer + iphdrlen); if (ntohs(tcph->dest) == RECV_PORT) { gettimeofday(&end,NULL); gettimeofday(&last_receive_time,NULL); diff = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec; if(count >= TEST_COUNT * 2) { rtt_filter(); sort_double(ce,valid_counts); final_ce = 1500.0*8/(min_rtt2 - min_rtt1); printf("MIN_RTT1 = %d MIN_RTT2 = %d --> Ce= %f\n",min_rtt1,min_rtt2,final_ce); //avg_ce = 1500.0/(min_rtt2 - min_rtt1) * 8; avg_ce = get_double_avg(ce,valid_counts); avg_rtt1 = get_double_avg(final_rtt1_list, valid_counts); if(valid_counts % 2 == 0){ median_ce = (ce[valid_counts/2-1]+ce[valid_counts/2])/2; median_rtt1 = (final_rtt1_list[valid_counts/2-1]+final_rtt1_list[valid_counts/2])/2; } else{ median_ce = ce[valid_counts/2]; median_rtt1 = final_rtt1_list[valid_counts/2]; } printf("avg_ce = %f\tmedian_ce = %f\n", avg_ce,median_ce); printf("avg_rtt1 = %f\tmedian_rtt1 = %f\n", avg_rtt1, median_rtt1); avaliable_bandwidth = 1500*8/(min_rtt2+avg_rtt1-2*min_rtt1); printf("avg_rtt1 --> Ab = %.2f\n",avaliable_bandwidth); avaliable_bandwidth = 1500*8/(min_rtt2+median_rtt1-2*min_rtt1); printf("median_rtt1 --> Ab = %.2f\n",avaliable_bandwidth); loop = 0; return; } if (count%2 == 0) { rtt1 = diff; gettimeofday(&start,NULL); sendpacket(2); sendpacket(1); } else { rtt2 = diff; //double result = 1500.0/(rtt2 - rtt1) * 8; //printf("#Rtt1 = %d,Rtt2 = %d\n",rtt1,rtt2); //printf("#Ce = %f \n\n",result); //if (result > FILT_MIN && result < FILT_MAX) { //avg_rtt1 = (avg_rtt1*valid_counts+rtt1)/(valid_counts+1); //rtt1_list[valid_counts] = rtt1; //ce[valid_counts] = result; if(rtt2 > rtt1){ rtt1_list[valid_counts] = rtt1; rtt2_list[valid_counts] = rtt2; valid_counts++; min_rtt1 = min_rtt1 > rtt1 ? rtt1 : min_rtt1; min_rtt2 = min_rtt2 > rtt2 ? rtt2 : min_rtt2; } gettimeofday(&start,NULL); sendpacket(1); } count ++; return; } else { gettimeofday(¤t_receive_time,NULL); double duration = 1000000 * (current_receive_time.tv_sec-last_receive_time.tv_sec)+ current_receive_time.tv_usec-last_receive_time.tv_usec; if (duration > EXCEED_TIME) { count = count%2 == 1 ? count - 1 : count; gettimeofday(&start,NULL); sendpacket(1); } //Port number is not valid. return; } }