(file) Return to ping_udp.c CVS log (file) Jump to this file's LXR Page (dir) Up to [CENS] / emstar / fusd / test

File: [CENS] / emstar / fusd / test / ping_udp.c (download) / (as text)
Revision: 1.1, Wed Apr 28 18:11:52 2004 UTC (5 years, 6 months ago) by nithya
Branch: MAIN
CVS Tags: scale_radio_channel, rdd_alpha_version_1, pregeonet, nims-lab-Sep07-2004, nims-jr-Sep05-04, mote, lessgps_release, kiss_release, bp_scale_radio_channel, acoustic-05-18-06, PRE_TOSNIC_FIX, PRE_NOMEGA_MOTENIC, PRE_MOTENIC_CLEANUP, PRE_CEILING_FIX, PRE_64BIT, MOTENIC_PRE_BUGFIX_20050415, LESSGPS_1_00, LAURA_CALIBRATION_EXPERIMENTS, KISS_1_0, HOSTMOTE_V_6_EXPERIMENTAL, HOSTMOTE_PROTOCOL_VERSION_7, HOSTMOTE_PROTOCOL_VERSION_6_WITH_HOSTMOAP, HOSTMOTE_PROTOCOL_VERSION_5_WITH_HOSTMOAP, HOSTMOTE_PROTOCOL_VERSION_5, HOSTMOTE_PROTOCOL_VERSION_4, HOSTMOTE_PROTOCOL_VERSION_3, HEAD, ESS_RELEASE_3_5, ESS_RELEASE_3_4, ESS_RELEASE_3_3, ESS_RELEASE_3_2, ESS_RELEASE_3_1, ESS_RELEASE_3_0, ESS_RELEASE_2_0, ESS_CONNECTIVITY, ESS_CENTROUTE_TESTING, ESS2-CMS-V1_5_pretest, ESS2-CMS-V1_4cMergeSympathy_2, ESS2-CMS-V1_4c, ESS2-CMS-V1_4b, ESS2-CMS-V1_4a, ESS2-CMS-V1_3, ESS2-CMS-V1_2, ESS2-CMS-V1_1, ESS2-CMS-V1_0, EMSTAR_RELEASE_2_5, EMSTAR_RELEASE_2_1_BRANCH, EMSTAR_RELEASE_2_1, EMSTAR_RELEASE_2_0, EMSTAR_PRE_HTML, CYCLOPS_RELEASE_CANDIDATE_2_0, CYCLOPS_PRERELEASE_STABLE, CENTROUTE_EMSTAR_SOCKETS, BG_1_0, BANGLADESH_ARSENIC_1_2, BANGLADESH_ARSENIC_1_1, AMARSS_JR_DEPLOYMENT_6_05_07
ping_udp used to test udp-raw for usenix 04 paper

#include "libmisc/misc.h"
#include <sys/socket.h>
#include "glib.h"
#include "libmisc/file.h"

#define CLIENT_LISTEN_PORT 6234
#define CLIENT_WRITE_PORT 8349

#define SERVER_WRITE_PORT 6234
#define SERVER_LISTEN_PORT 8349

#define LOCAL_HOST_ADDR_LO "127.0.0.1"
#define LOCAL_HOST_ADDR_ETH "eth0"

#define NUM_MESSAGES 1050
#define NUM_MESSAGES_QUEUED 50

#define BLOCKING

int convert(int num)
{
  if (num == 64)
    return 6;
  if (num == 128)
    return 7;
  else if (num == 256)
    return 8;
  else if (num == 512)
    return 9;
  else if (num == 1024)
    return 10;
  else if (num == 2048)
    return 11;
  else if (num == 4096)
    return 12;
  else if (num == 8192)
    return 13;
  else if (num == 16384)
    return 14;
  else if (num == 32768)
    return 15;
  else
    return -1;
}

int main(int argc, char **argv)
{
  int i,write_sock,listen_port, write_port;
  float pktsPSec, bytesPSec;
  char snd_buf[65535];
  struct in_addr bcast_addr = {
  };
  struct in_addr local_addr = {
  };
  struct sockaddr_in addr = {
    sin_family: AF_INET
  };

  char interface[15];
  char type[10];
  struct timeval tvi;
  int pkt_size, nonblock, client = 0;
  int64_t timeT;
  struct timeval tvs;
  int t_fd;
  char buf[255];

  if (argc < 5) {
    printf("ERROR, argc: %d < 4\n",argc);
    printf("USAGE: ping_udp <server/client> <lo/eth> <pkt_size> <nonblocking>\n");
    printf("\t\tOptional: <write_port> <read_port>\n");
    exit(1);
  }

  /* Read parameters */
  sprintf(type,argv[1]);
  sprintf(interface,argv[2]);
  pkt_size = atoi(argv[3]);
  nonblock = atoi(argv[4]);

  
  /* Assign ports */
  if (argc >= 7) {
    write_port = atoi(argv[5]);
    listen_port = atoi(argv[6]);
  } else {
    if (strcmp(type,"client") == 0) {
      write_port = CLIENT_WRITE_PORT;
      listen_port = CLIENT_LISTEN_PORT;
    } else if (strcmp(type,"server") == 0) {
      listen_port = SERVER_LISTEN_PORT;
      write_port = SERVER_WRITE_PORT;
    }
  }

  /* Assign interface address */
  if ((get_ifaddr_by_name(LOCAL_HOST_ADDR_ETH, &local_addr, &bcast_addr)) < 0) {
      printf("Can't get intf address for: %s\n", LOCAL_HOST_ADDR_ETH);
      exit(1);
  }

  if (strcmp(interface,"lo") == 0) 
    addr.sin_addr = local_addr;
  else
    addr.sin_addr = bcast_addr;
  write_sock = udp_listen_if(write_port, &addr.sin_addr);

  addr.sin_port = htons(write_port);

  if (write_sock < 0) {
    printf("ERROR, Couldn't open listen socket\n");
    goto fail;
  }

  if (strcmp(type,"client") == 0) {
    if ((t_fd = open("/tmp/throughput.out",O_CREAT|O_APPEND|O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO)) < 0) 
	printf("ERROR, unable to open throughput.out output file!\n");
    client = 1;
  } 
  
  else if (strcmp(type,"server") != 0) {
    printf("ERROR: unrecognized argument!\n");
    goto fail;
  }
 
  /* Open socket for writing */


  /* Send and read ping packets */
  i = 0;
  while ( i < NUM_MESSAGES) {
    if (sendto(write_sock, snd_buf, pkt_size, 0,
	    (struct sockaddr *) &addr, sizeof(addr)) == pkt_size) {
      i++;
      sprintf(buf, "%d successful msgs\n", i);
    }
    
    else {
      printf("ERROR sending!\n");
    }

    if (i == NUM_MESSAGES_QUEUED) {
      gettimeofday(&tvi,NULL);
      printf("Getting time: %s\n", misc_tv_to_str(&tvi));
    }
  }

  gettimeofday(&tvs,NULL);
  printf("Getting final time: %s\n", misc_tv_to_str(&tvs));

  if (client > 0) {
    misc_tv_sub(&tvs,&tvi);
    timeT = misc_timeval_to_int64(&tvs);
    printf("diff in usec: %lld\n", timeT);

    /* Calculate overall throughput: pkts / sec 
     * timeT is in usec, convert to seconds */
    if (timeT > 0) {
      pktsPSec = (NUM_MESSAGES - NUM_MESSAGES_QUEUED) / ((float)timeT/ 1000000.0);
      bytesPSec = pkt_size * pktsPSec;
      printf("pkt_size: %d * pktsPSec: %f = %f\n", pkt_size, pktsPSec, bytesPSec);
    }

    sprintf(snd_buf, "%s", "#h log2pkt Pkts-sec Bytes-sec\n");
    write(t_fd, snd_buf, strlen(snd_buf));

    sprintf(snd_buf, "%d\t%d\t%d\n",convert(pkt_size), (int) pktsPSec, (int) bytesPSec);
    write(t_fd, snd_buf, strlen(snd_buf));
  }

  printf("done\n");

fail:
  close(write_sock);
  close(t_fd);
  printf("Closing files\n");
  return 0;
}

CENS CVS Mailing List
Powered by
ViewCVS 0.9.2