/* Code to get timing information from the gateway.
 */

#include	<types.h>
#include	<sys.h>
#include	"const.h"
#include	"param.h"
#include	"defs.h"
#include	"macs.h"
#include	"net.h"
#include	"ext.h"

#define TIMING_PERIOD 2		/* Number of seconds between timing outputs */
#define TIME_LOG_TIME 60*10	/* Number of seconds between logs of info */

static int cnt_pkti, cnt_pkto, cnt_ioin, cnt_ioout, cnt_ovfin,
	cnt_ovfout, cnt_disc;
static int lcnt_pkti, lcnt_pkto, lcnt_ioin, lcnt_ioout, lcnt_ovfin,
	lcnt_ovfout, lcnt_disc;
static time_count;

TIMING()
{
    reg intf i;
    void	print_traffic();
    
    time_count = 0;
    cnt_pkti = cnt_pkto = cnt_ioin = cnt_ioout = cnt_ovfin = cnt_ovfout = cnt_disc = 0;
    lcnt_pkti = lcnt_pkto = lcnt_ioin = lcnt_ioout = lcnt_ovfin = lcnt_ovfout = lcnt_disc = 0;
    for (i = 0; i < nnets; i++) {
	lcnt_pkti = cnt_pkti += nets[i].n_pkti;
	lcnt_pkto = cnt_pkto += nets[i].n_pkto;
	lcnt_ioin = cnt_ioin += nets[i].n_ioin;
	lcnt_ioout = cnt_ioout += nets[i].n_ioout;
	lcnt_ovfin = cnt_ovfin += nets[i].n_ovfin;
	lcnt_ovfout = cnt_ovfout += nets[i].n_ovfout;
	lcnt_disc = cnt_disc += nets[i].n_disc;
    }
    itime(print_traffic, 0, TIMING_PERIOD, 200);
}

print_traffic()
{
    unsl cntd_pkti;
    unsl cntd_pkto;
    unsl cntd_ioin,
	cntd_ioout,
	cntd_ovfin,
	cntd_ovfout,
	cntd_disc;
    reg net *netp;
    
    cntd_pkti = cntd_pkto = cntd_ioin = cntd_ioout = cntd_ovfin = cntd_ovfout = cntd_disc = 0;
    for (netp = nets; netp < lstnet; netp++) {
	cntd_pkti += netp->n_pkti;
	cntd_pkto += netp->n_pkto;
	cntd_ioin += netp->n_ioin;
	cntd_ioout += netp->n_ioout;
	cntd_ovfin += netp->n_ovfin;
	cntd_ovfout += netp->n_ovfout;
	cntd_disc += netp->n_disc;
    }
    printf("in: %-6d out: %-6d errs: %-6d ovfl: %-6d disc: %d\n", 
	   (cntd_pkti - cnt_pkti) / TIMING_PERIOD,
	   (cntd_pkto - cnt_pkto) / TIMING_PERIOD,
	   (cntd_ioin - cnt_ioin + cntd_ioout - cnt_ioout) / TIMING_PERIOD,
	   (cntd_ovfin - cnt_ovfin + cntd_ovfout - cnt_ovfout) / TIMING_PERIOD,
	   (cntd_disc - cnt_disc) / TIMING_PERIOD);
    cnt_pkti = cntd_pkti;
    cnt_pkto = cntd_pkto;
    cnt_ioin = cntd_ioin;
    cnt_ioout = cntd_ioout;
    cnt_ovfin = cntd_ovfin;
    cnt_ovfout = cntd_ovfout;
    cnt_disc = cntd_disc;
}
