/*
 * This is the statistic file.
 *
 * Copyright 1990 by the Massachusetts Institute of Technology.
 *
 * For copying and distribution information, please see the file
 * <mit-copyright.h>.
 *
 * Tom Coppeto
 * MIT Network Services
 * 8 August 1990
 *
 *    $Source: /afs/net.mit.edu/tools/src/xport/RCS/stats.c,v $
 *    $Author: tom $
 *    $Locker: paco $
 *    $Log:	stats.c,v $
 * Revision 1.1  90/08/15  01:13:12  tom
 * Initial revision
 * 
 */

#ifndef lint
static char *rcsid = "$Header: /afs/net.mit.edu/tools/src/xport/RCS/stats.c,v 1.1 90/08/15 01:13:12 tom Exp Locker: paco $";
#endif

#include "xport.h"
#include <mit-copyright.h>

extern char *buf;
static char buf2[BUFSIZ];
extern getreq reply;

char *
do_device_stats()
{
  objident *obj[SNMPMAXVARS];
  char     a[24];
  char     b[24];
  caddr_t  *dat;
  char     *name;
  char     *maddr;
  struct   in_addr taddr;
  int      total_pkts   = 0;
  int      xmit_colls   = 0;
  int      rec_colls    = 0;
  int      rcircuits    = 0;
  int      dtype        = 0;
  int      len          = 0;
  int      l; 
  int      o;

  o = 0;
  obj[o++] = &vDeviceType;
  obj[o++] = &vDeviceTotalPkts;
  obj[o++] = &vDeviceXmitColls;
  obj[o++] = &vDeviceRecColls;
  obj[o++] = &vDeviceRedundantCts;
  obj[o++] = &vDeviceIPAddress;
  obj[o++] = &vDeviceMACAddress;
  obj[o++] = &vDeviceName;
  obj[o++] = (objident *) NULL;
  
  if(!(dat = make_lots_o_snmp_queries(obj)))
        return;

  o = 0;
  bcopy(dat[o++], &dtype,      sizeof(dtype)); 
  bcopy(dat[o++], &total_pkts, sizeof(total_pkts));  
  bcopy(dat[o++], &xmit_colls, sizeof(xmit_colls));
  bcopy(dat[o++], &rec_colls,  sizeof(rec_colls));
  bcopy(dat[o++], &rcircuits,  sizeof(rcircuits));
  bcopy(dat[o++], &taddr,      sizeof(taddr));
  maddr = make_phys_address(&(reply.varlist.elem[o++].val));
  name  = dat[o++];

  strcpy(a, format_number(total_pkts));
  strcpy(b, format_number(xmit_colls));

  sprintf(buf2, "%-14s %s\n%-14s %s\n%-14s %s\n%-14s %-18s\n%-14s %d\n\n%-16s %15s\n%-16s %15s\n%-16s %15s\n",
	  "Device Type: ",    get_category(dtype, device_type),
	  "Device name: ",    name,
	  "IP Address: ",     inet_ntoa(taddr),
	  "MAC Address: ",    maddr,
	  "Redundant Cts:",   rcircuits,
	  "Packets:",         a,        
	  "Xmit collisions:", b,
	  "Recv collisions:", format_number(rec_colls));

  l    = len;
  len += strlen(buf2);
  if(make_buf(len + 1) < 0)
    return((char *) NULL);
  strcpy(buf + l, buf2);

  return(buf);
}




char *
do_board_stats(num)
     int num;
{
  objident *obj[SNMPMAXVARS];
  char     a[24];
  char     b[24];
  caddr_t  *dat;
  int      total_pkts   = 0;
  int      xmit_colls   = 0;
  int      rec_colls    = 0;
  int      tports       = 0;
  int      oports       = 0;
  int      type         = 0;
  int      len          = 0;
  int      l; 
  int      o;
  
  vBoardType.cmp[vBoardType.ncmp - 1]              = num;
  vBoardTotalPorts.cmp[vBoardTotalPorts.ncmp - 1]  = num;
  vBoardPortsOn.cmp[vBoardPortsOn.ncmp - 1]        = num;
  vBoardTotalPkts.cmp[vBoardTotalPkts.ncmp - 1]    = num;
  vBoardXmitColls.cmp[vBoardXmitColls.ncmp - 1]    = num;
  vBoardRecColls.cmp[vBoardRecColls.ncmp - 1]      = num;

  o = 0;

  obj[o++] = &vBoardType;
  obj[o++] = &vBoardTotalPorts;
  obj[o++] = &vBoardPortsOn;
  obj[o++] = &vBoardTotalPkts;
  obj[o++] = &vBoardXmitColls;
  obj[o++] = &vBoardRecColls;
  obj[o++] = (objident *) NULL;

  if(!(dat = make_lots_o_snmp_queries(obj)))
        return;

  o = 0;

  bcopy(dat[o++], &type,       sizeof(type));
  bcopy(dat[o++], &tports,     sizeof(tports));
  bcopy(dat[o++], &oports,     sizeof(oports));
  bcopy(dat[o++], &total_pkts, sizeof(total_pkts));  
  bcopy(dat[o++], &xmit_colls, sizeof(xmit_colls));
  bcopy(dat[o++], &rec_colls,  sizeof(rec_colls));
  
  strcpy(a, format_number(total_pkts));
  strcpy(b, format_number(xmit_colls));

  sprintf(buf2, "%-16s %s\n%-16s %d/%d\n\n%-16s %15s\n%-16s %15s\n%-16s %15s\n",
	  "Board Type: ",      get_category(type, board[num].nports > 1 ?
					    mpboard_type : spboard_type),
	  "Operating Ports: ", oports, tports,
	  "Packets:",          a,        
	  "Xmit collisions:",  b,
	  "Recv collisions:",  format_number(rec_colls));
  
  l    = len;
  len += strlen(buf2);
  if(make_buf(len + 1) < 0)
    return((char *) NULL);
  strcpy(buf + l, buf2);

  return(buf);
}




char *
do_port_stats(port)
     struct _port *port;
{
  objident *obj[SNMPMAXVARS];
  char     a[24];
  char     b[24];
  caddr_t  *dat;
  int      mtype        = 0;
  int      rcircuit     = 0;
  int      rtype        = 0;
  int      rstatus      = 0;
  int      total_pkts   = 0;
  int      xmit_colls   = 0;
  int      rec_colls    = 0;
  int      len = 0;
  int      l; 
  int      o;

  vPortMediaType.cmp[vPortMediaType.ncmp - 2]             = port->boardnum;
  vPortMediaType.cmp[vPortMediaType.ncmp - 1]             = port->portnum;
  vPortTotalPkts.cmp[vPortTotalPkts.ncmp - 2]             = port->boardnum;
  vPortTotalPkts.cmp[vPortTotalPkts.ncmp - 1]             = port->portnum;
  vPortXmitColls.cmp[vPortXmitColls.ncmp - 2]             = port->boardnum;
  vPortXmitColls.cmp[vPortXmitColls.ncmp - 1]             = port->portnum;
  vPortRecColls.cmp[vPortRecColls.ncmp - 2]               = port->boardnum;
  vPortRecColls.cmp[vPortRecColls.ncmp - 1]               = port->portnum;
  vPortRedundantCt.cmp[vPortRedundantCt.ncmp - 2]         = port->boardnum;
  vPortRedundantCt.cmp[vPortRedundantCt.ncmp - 1]         = port->portnum;
  vPortRedundantType.cmp[vPortRedundantType.ncmp - 2]     = port->boardnum;
  vPortRedundantType.cmp[vPortRedundantType.ncmp - 1]     = port->portnum;
  vPortRedundantStatus.cmp[vPortRedundantStatus.ncmp - 2] = port->boardnum;
  vPortRedundantStatus.cmp[vPortRedundantStatus.ncmp - 1] = port->portnum;

  o = 0;
  obj[o++] = &vPortMediaType;
  obj[o++] = &vPortTotalPkts;
  obj[o++] = &vPortXmitColls;
  obj[o++] = &vPortRecColls;
  obj[o++] = &vPortRedundantCt;
  obj[o++] = &vPortRedundantType;
  obj[o++] = &vPortRedundantStatus;
  obj[o++] = (objident *) NULL;

  if(!(dat = make_lots_o_snmp_queries(obj)))
        return;

  o = 0;
  bcopy(dat[o++], &mtype,      sizeof(mtype));  
  bcopy(dat[o++], &total_pkts, sizeof(total_pkts));  
  bcopy(dat[o++], &xmit_colls, sizeof(xmit_colls));
  bcopy(dat[o++], &rec_colls,  sizeof(rec_colls));
  bcopy(dat[o++], &rcircuit,   sizeof(rcircuit));
  bcopy(dat[o++], &rtype,      sizeof(rtype));
  bcopy(dat[o++], &rstatus,    sizeof(rstatus));

  strcpy(a, format_number(total_pkts));
  strcpy(b, format_number(xmit_colls));

  sprintf(buf2, "%-16s %s\n%-16s %d\n%-16s %s\n%-16s %s\n\n%-16s %15s\n%-16s %15s\n%-16s %15s\n",
	  "Media type: ",     get_category(mtype, media_type),
	  "Redund. Circuit:", rcircuit,
	  "Redund. Type: ",   get_category(rtype, redundant_type),
	  "Redund Status: ",  get_category(rstatus, redundant_status),
	  "Packets:",         a,
	  "Xmit collisions:", b, 
	  "Recv collisions:", format_number(rec_colls));
  
  l    = len;
  len += strlen(buf2);
  if(make_buf(len + 1) < 0)
    return((char *) NULL);
  strcpy(buf + l, buf2);

  return(buf);
}






void
get_port_stats(port)
     struct _port *port;
{
  objident *obj[SNMPMAXVARS];
  caddr_t  *dat;
  int      o;

  port->update = time(0);

  vPortTotalPkts.cmp[vPortTotalPkts.ncmp - 2]             = port->boardnum;
  vPortTotalPkts.cmp[vPortTotalPkts.ncmp - 1]             = port->portnum;
  vPortXmitColls.cmp[vPortXmitColls.ncmp - 2]             = port->boardnum;
  vPortXmitColls.cmp[vPortXmitColls.ncmp - 1]             = port->portnum;
  vPortRecColls.cmp[vPortRecColls.ncmp - 2]               = port->boardnum;
  vPortRecColls.cmp[vPortRecColls.ncmp - 1]               = port->portnum;

  o = 0;
  obj[o++] = &vPortTotalPkts;
  obj[o++] = &vPortXmitColls;
  obj[o++] = &vPortRecColls;
  obj[o++] = (objident *) NULL;

  if(!(dat = make_lots_o_snmp_queries(obj)))
        return;

  o = 0;
  bcopy(dat[o++], &(port->pkts),      sizeof(port->pkts));  
  bcopy(dat[o++], &(port->xmit_coll), sizeof(port->xmit_coll));
  bcopy(dat[o++], &(port->recv_coll), sizeof(port->recv_coll));
}





char *
get_category(i, c)
     int i;
     struct _category *c;
{
  struct _category *cp;
  static char *foo = "unknown";

  cp = c;
  while(cp->name)
    if(cp->id == i)
      return(cp->name);
    else
      ++cp;

  return(foo);
}

