/* 
 * tcplibTest.c
 *
 * x-kernel v3.3
 *
 * Copyright (c) 1993,1991,1990,1996  Arizona Board of Regents
 */

#include <stdio.h>
#include "../include/tcpapps_gcc.h"
#include "../include/brkdn_dist.h"

struct brkdn_dist *b_dist;

int	bd[5];
char	*bdn[]={"ftp", "telnet", "nntp", "smtp", "unknown"};
char	*bdo[100];
int	bdon=0;

int 	td[20], tit[20], tps[20];
int	fcs[20], fni[20], fis[20];
int	sis[20], nni[20], nis[20];

main (argc, argv)

int  argc;
char *argv[];
{
  char *cp, str[200];
  int  i, j, k, n, seed=0, shortFlag=0;
  int  time();

  for (k=1; k<argc; k++)
    if (!strcmp(argv[k], "-seed"))
      sscanf(argv[++k], "%d", &seed);
    else if (!strcmp(argv[k], "-short"))
      shortFlag = 1;

  if (!seed)
    time(&seed);
  srand48(seed);
  b_dist = brkdn_dist();

  for (k=0; k<10000; k++) {
    cp = next_app(b_dist);
    for (j=0; j<4; j++)
      if (!strcmp(cp, bdn[j]))
	break;
    if (j >= 4)
      bdo[bdon++] = cp;
    bd[j]++;
  }
  printf("Connection distributions:\n");
  for (j=0; j<5; j++)
    printf(" %7s %5.1f%%\n", bdn[j], bd[j]/100.0);
  if (bdon > 0) {
    printf("     other: ");
    for (k=0; k<bdon; k++)
      printf("%s ", bdo[k]);
    printf("\n");
  }
  if (shortFlag)
    return;

  for (k=0; k<10000; k++) {
    td[bucket((int)telnet_duration())]++;
    tit[bucket((int)telnet_interarrival())]++;
    tps[bucket(telnet_pktsize())]++;
    
    fcs[bucket(ftp_ctlsize())]++;
    fni[bucket(ftp_nitems())]++;
    fis[bucket(ftp_itemsize())]++;
    
    sis[bucket(smtp_itemsize())]++;
    
    nni[bucket(nntp_nitems())]++;
    nis[bucket(nntp_itemsize())]++;
  }    
  printf("\n\n");
  doit(td, "telnet duration");
  doit(tit, "telnet interarrival");
  doit(tps, "telnet packetsize");
  printf("\n");
  doit(fcs, "ftp ctlsize");
  doit(fni, "ftp nitems");
  doit(fis, "ftp itemsize");
  printf("\n");
  doit(sis, "smtp itemsize");
  printf("\n");
  doit(nni, "nntp nitems");
  doit(nis, "nntp itemsize");
  printf("\n\n");
}
    
int doit(ia, str)
  int  *ia;
  char *str;
{
  int i, j, k;

  printf("%20s", str);
  for (k=0; k<7; k++) {
    printf("  %5.1f ", ia[k]/100.0);
  }
  printf("\n");
}

int bucket(n)
int n;
{
  int k=0;

/*   printf("in: %4d", n); */
  while (n > 10) {
    n /= 10;
    k++;
  }
/*   printf(" out: %d\n", k); */
  return k;
}

error()
{
  printf("Someone called error!\n");
  exit(1);
}
