Logo Search packages:      
Sourcecode: tcptrace version File versions  Download package

thruput.c

/*
 * Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
 *               2002, 2003, 2004
 *    Ohio University.
 *
 * ---
 * 
 * Starting with the release of tcptrace version 6 in 2001, tcptrace
 * is licensed under the GNU General Public License (GPL).  We believe
 * that, among the available licenses, the GPL will do the best job of
 * allowing tcptrace to continue to be a valuable, freely-available
 * and well-maintained tool for the networking community.
 *
 * Previous versions of tcptrace were released under a license that
 * was much less restrictive with respect to how tcptrace could be
 * used in commercial products.  Because of this, I am willing to
 * consider alternate license arrangements as allowed in Section 10 of
 * the GNU GPL.  Before I would consider licensing tcptrace under an
 * alternate agreement with a particular individual or company,
 * however, I would have to be convinced that such an alternative
 * would be to the greater benefit of the networking community.
 * 
 * ---
 *
 * This file is part of Tcptrace.
 *
 * Tcptrace was originally written and continues to be maintained by
 * Shawn Ostermann with the help of a group of devoted students and
 * users (see the file 'THANKS').  The work on tcptrace has been made
 * possible over the years through the generous support of NASA GRC,
 * the National Science Foundation, and Sun Microsystems.
 *
 * Tcptrace is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * Tcptrace is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Tcptrace (in the file 'COPYING'); if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 * 
 * Author:  Shawn Ostermann
 *          School of Electrical Engineering and Computer Science
 *          Ohio University
 *          Athens, OH
 *          ostermann@cs.ohiou.edu
 *          http://www.tcptrace.org/
 */
#include "tcptrace.h"
static char const GCC_UNUSED copyright[] =
    "@(#)Copyright (c) 2004 -- Ohio University.\n";
static char const GCC_UNUSED rcsid[] =
    "@(#)$Header: /usr/local/cvs/tcptrace/thruput.c,v 5.5 2003/11/19 14:38:05 sdo Exp $";




void
DoThru(
    tcb *ptcb,
    int nbytes)
{
    double etime;
    double thruput;
    char *myname, *hisname;

    /* init, if not already done */
    if (ZERO_TIME(&ptcb->thru_firsttime)) {
      char title[210];

      ptcb->thru_firsttime = current_time;
      ptcb->thru_lasttime = current_time;
      ptcb->thru_pkts = 1;
      ptcb->thru_bytes = nbytes;
      

      /* bug fix from Michele Clark - UNC */
      if (&ptcb->ptp->a2b == ptcb) {
          myname = ptcb->ptp->a_endpoint;
          hisname = ptcb->ptp->b_endpoint;
      } else {
          myname = ptcb->ptp->b_endpoint;
          hisname = ptcb->ptp->a_endpoint;
      }
      /* create the plotter file */
      snprintf(title,sizeof(title),"%s_==>_%s (throughput)",
            myname, hisname);
      ptcb->thru_plotter = new_plotter(ptcb,NULL,title,
                               "time","thruput (bytes/sec)",
                               THROUGHPUT_FILE_EXTENSION);
      if (graph_time_zero) {
          /* set graph zero points */
          plotter_nothing(ptcb->thru_plotter, current_time);
      }

      /* create lines for average and instantaneous values */
      ptcb->thru_avg_line =
          new_line(ptcb->thru_plotter, "avg. tput", "blue");
      ptcb->thru_inst_line =
          new_line(ptcb->thru_plotter, "inst. tput", "red");

      return;
    }

    /* if no data, then nothing to do */
    if (nbytes == 0)
      return;

    /* see if we should output the stats yet */
    if (ptcb->thru_pkts+1 >= thru_interval) {

      /* compute stats for this interval */
      etime = elapsed(ptcb->thru_firsttime,current_time);
      if (etime == 0.0)
          etime = 1000; /* ick, what if "no time" has passed?? */
      thruput = (double) ptcb->thru_bytes / ((double) etime / 1000000.0);

      /* instantaneous plot */
      extend_line(ptcb->thru_inst_line,
                 current_time, (int) thruput);

      /* compute stats for connection lifetime */
      etime = elapsed(ptcb->ptp->first_time,current_time);
      if (etime == 0.0)
          etime = 1000; /* ick, what if "no time" has passed?? */
      thruput = (double) ptcb->data_bytes / ((double) etime / 1000000.0);

      /* long-term average */
      extend_line(ptcb->thru_avg_line,
                 current_time, (int) thruput);

      /* reset stats for this interval */
      ptcb->thru_firsttime = current_time;
      ptcb->thru_pkts = 0;
      ptcb->thru_bytes = 0;
    }

    /* immediate value in yellow ticks */
    if (plot_tput_instant) {
      etime = elapsed(ptcb->thru_lasttime,current_time);
      if (etime == 0.0)
          etime = 1000; /* ick, what if "no time" has passed?? */
      thruput = (double) nbytes / ((double) etime / 1000000.0);
      plotter_temp_color(ptcb->thru_plotter,"yellow");
      plotter_dot(ptcb->thru_plotter,
                current_time, (int) thruput);
    }

    /* add in the latest packet */
    ptcb->thru_lasttime = current_time;
    ++ptcb->thru_pkts;
    ptcb->thru_bytes += nbytes;
}

Generated by  Doxygen 1.6.0   Back to index