Beispiel #1
0
int main(int argc, char *argv[], char **env)
{
	int tcpsock, tcpclientsock;
	int udpsockcap;
	double upcap = 0, downcap = 0;
	double measupcap = 0, measdowncap = 0;
	unsigned int tbresult = 0, tbabortflag = 0,
		tbmindepth = 0, tbmaxdepth = 0;
	double tbrate = 0, trueupcap = 0, truedowncap = 0;
	double sleepRes = 1;
	struct sockaddr_in saddr;
	unsigned int ssz = sizeof(saddr);
	char tracefile[256], filename[256];
	struct timeval tv;
	struct sockaddr_in from;
	FILE *fp;
	extern double TB_RATE_AVG_INTERVAL;
	int clientversion = 0;
	double upCapLimit = 100000; double upProbeLimit = 95000;
	double downCapLimit = 100000; double downProbeLimit = 95000;

	TB_RATE_AVG_INTERVAL = 0.3;
	memset(tracefile, 0, 256);

	tcpsock = create_server();
	sleepRes = prober_sleep_resolution();
	printf("sleep time resolution: %.2f ms.\n", sleepRes*1000);

while(1)
{
	printf("Waiting for new clients..\n");

	udpsockcap = prober_bind_port(SERV_PORT_UDP);
	CHKRET(udpsockcap);

	tcpclientsock = handle_clients(tcpsock, udpsockcap);
	CHKRET(tcpclientsock);
	close(tcpsock);

	begintimer();

	if(getpeername(tcpclientsock, (struct sockaddr *)&saddr, &ssz) == -1)
	fprintf(stderr, "cannot get peer address\n");
	gettimeofday(&tv, NULL);
	memset(filename, 0, 256);
	printf("Probing from %s\n", inet_ntoa(saddr.sin_addr));

	printf("\nEstimating capacity:\n");

	fp = openLog(filename, inet_ntoa(saddr.sin_addr), tv); //assume this opens a fp
	fprintf(fp, "sleep time resolution: %.2f ms.\n", sleepRes*1000);

	CHKRET(preprocess_newclient(tcpclientsock, udpsockcap, &clientversion,
				&upcap, &downcap, &from, tracefile, fp, filename));
	trueupcap = upcap; truedowncap = downcap;

	if(clientversion > 3) // newer clients
	{ upCapLimit = 200000; upProbeLimit = 195000;
	downCapLimit = 200000; downProbeLimit = 195000; }

	if(upcap > upCapLimit /*200000*/) { upcap = upProbeLimit /*195000*/; }
	if(downcap > downCapLimit /*200000*/) { downcap = downProbeLimit /*195000*/; }

	mflowReceiver(tcpclientsock, udpsockcap, &measupcap, fp, 0);
	mflowSender(tcpclientsock, udpsockcap, &from, downcap, sleepRes, &measdowncap, 0);
	printf("recvrates: up %f, down %f Kbps\n", measupcap, measdowncap);
	upcap = measupcap; downcap = measdowncap;

	fprintf(fp, "upstream capacity: %.2f Kbps.\n", upcap);
	fprintf(fp, "downstream capacity: %.2f Kbps.\n", downcap);
	fprintf(fp, "### UPSTREAM ###\n");
	printf("upstream capacity: %.2f Kbps.\n", upcap);
	printf("downstream capacity: %.2f Kbps.\n", downcap);
	if(upcap > upCapLimit /*200000*/) { upcap = upProbeLimit /*195000*/; } //else { upcap *= 0.95; }
	if(downcap > downCapLimit /*200000*/) { downcap = downProbeLimit /*195000*/; } //else { downcap *= 0.95; }

	printf("Checking for traffic shapers:\n");
	if(clientversion > 3) //backwards-compatibility
	mflowReceiver(tcpclientsock, udpsockcap, NULL, fp, 1);
	CHKRET(tbdetectReceiver(tcpclientsock, udpsockcap, upcap, sleepRes,
		&tbresult, &tbmindepth, &tbmaxdepth, &tbrate, &tbabortflag, fp));
	if(tbresult == 1) trueupcap = tbrate;
	printShaperResult(tbresult, tbmindepth, tbmaxdepth, tbrate, 0, fp);

	if(clientversion > 3) //backwards-compatibility
	mflowSender(tcpclientsock, udpsockcap, &from, -1, sleepRes, NULL, 1);
	CHKRET(tbdetectSender(tcpclientsock, udpsockcap, &from, downcap, sleepRes,
		&tbresult, &tbmindepth, &tbmaxdepth, &tbrate, &tbabortflag, fp));
	if(tbresult == 1) truedowncap = tbrate;
	printShaperResult(tbresult, tbmindepth, tbmaxdepth, tbrate, 1, fp);
	recvData(tcpclientsock, fp, 1 /*0 up 1 down*/);

	fclose(fp);
	close(udpsockcap);
	close(tcpclientsock);

	break;
}

	execl("/bin/bzip2", "/bin/bzip2", filename, NULL);

	return(0);
}
int main(int argc, char *argv[])
{
    int tcpsock = 0;
    int udpsock = 0;
    struct sockaddr_in from;
    double capacityup = 0, capacitydown = 0;
    double measupcap = 0, measdowncap = 0;
    unsigned int tbresult = 0, tbmindepth = 0, tbmaxdepth = 0, tbabortflag = 0;
    double tbrate = 0, truecapup = 0, truecapdown = 0;
    double sleepRes = 1;
    char filename[256], tracefile[256];
    int fileid = -1;
    struct in_addr sin_addr;
    struct timeval tv;
    FILE *fp;
    extern double TB_RATE_AVG_INTERVAL;

    TB_RATE_AVG_INTERVAL = 0.3;

    printf("DiffProbe beta release. October 2009.\n");
    printf("Shaper Detection Module.\n\n");

    memset(tracefile, 0, 256);
    CHKRET(prober_config_load(argc, argv, tracefile, &fileid));

    sleepRes = prober_sleep_resolution();

    tcpsock = connect2server(serverip, fileid);
    //tcpsock = selectServer(fileid);
    if(tcpsock <= 0) printf("Server busy. Please try again later.\n");
    CHKRET(tcpsock);

    memset(&from, 0, sizeof(from));
    from.sin_family      = PF_INET;
    //from.sin_port        = htons(SERV_PORT_UDP);
    from.sin_port        = htons(serv_port);
    from.sin_addr.s_addr = serverip;

    gettimeofday(&tv, NULL);
    sin_addr.s_addr = serverip;
    memset(filename, 0, 256);
    sprintf(filename, "%s_%d.txt", inet_ntoa(sin_addr), (int)tv.tv_sec);
    //fp = fopen(filename, "w");
    //fprintf(fp, "sleep time resolution: %.2f ms.\n", sleepRes*1000);

    //udpsock = udpclient(serverip, SERV_PORT_UDP);
    udpsock = udpclient(serverip, serv_port);
    CHKRET(udpsock);
    sin_addr.s_addr = serverip;
    printf("Connected to server %s.\n", inet_ntoa(sin_addr));

    printf("\nEstimating capacity:\n");
    capacityup = estimateCapacity(tcpsock, udpsock, &from);
    CHKRET(capacityup);
    CHKRET(sendCapEst(tcpsock));
    capacitydown = capacityEstimation(tcpsock, udpsock, &from, fp);
    CHKRET(capacitydown);

    mflowSender(tcpsock, udpsock, &from,
                (capacityup > 100000) ? 95000 : capacityup, sleepRes, &measupcap);
    mflowReceiver(tcpsock, udpsock, &measdowncap, fp);
    //XXX: the meas code needs trains and lower cpu
    if(capacityup < 80000) capacityup = measupcap;
    if(capacitydown < 80000) capacitydown = measdowncap;
    if(capacityup > 100000)
    {
        //printf("Upstream: greater than 100 Mbps.\n");
        printf("Upstream: %d Kbps.\n", (int)capacityup);
        capacityup = 95000;
    }
    else
    {
        printf("Upstream: %d Kbps.\n", (int)capacityup);
//	  capacityup *= 0.95; //reduce loss-based aborts
    }
    truecapup = capacityup;
    if(capacitydown > 100000)
    {
        //printf("Downstream: greater than 100 Mbps.\n");
        printf("Downstream: %d Kbps.\n", (int)capacitydown);
        capacitydown = 95000;
    }
    else
    {
        printf("Downstream: %d Kbps.\n", (int)capacitydown);
//	  capacitydown *= 0.95; //reduce loss-based aborts
    }
    truecapdown = capacitydown;

    printf("\nThe measurement will last for about %.1f minutes. Please wait.\n",
           0.5*ceil(2*(
                        (2 * (60)  // probing + low-rate
                         + (40560 + 3.5 * capacitydown * (60) ) * 8 / (1000*capacityup))/60)));  // to upload file

    printf("\nChecking for traffic shapers:\n\n");
    CHKRET(tbdetectSender(tcpsock, udpsock, &from, capacityup, sleepRes,
                          &tbresult, &tbmindepth, &tbmaxdepth, &tbrate, &tbabortflag, fp));
    if(tbresult == 1) truecapup = tbrate;
//  mflowSender(tcpsock, udpsock, &from, (tbresult == 1) ? tbrate : capacityup/2.0, sleepRes);
    printShaperResult(tbresult, tbmindepth, tbmaxdepth, tbrate, tbabortflag, 0, stdout);

    CHKRET(tbdetectReceiver(tcpsock, udpsock, capacitydown, sleepRes,
                            &tbresult, &tbmindepth, &tbmaxdepth, &tbrate, &tbabortflag, fp));
    if(tbresult == 1) truecapdown = tbrate;
//  mflowReceiver(tcpsock, udpsock, fp);
    //fclose(fp);
    //sendData(tcpsock, filename);
    printShaperResult(tbresult, tbmindepth, tbmaxdepth, tbrate, tbabortflag, 1, stdout);

    close(udpsock);
    close(tcpsock);

    printf("\nFor more information, visit: http://www.cc.gatech.edu/~partha/diffprobe\n");

    return(0);
}