/*
 * tcp_trace.h
 *
 * x-kernel v3.3
 *
 * Copyright (c) 1996,1991  Arizona Board of Regents
 *
 * $Revision: 1.4 $
 * $Date: 1996/06/14 21:25:37 $
 */

#ifndef tcp_trace_h
#define tcp_trace_h

#include "datatrace.h"

#ifndef X_TRACE

#undef xTrace0
#undef xTrace1
#undef xTrace2
#undef xTrace3
#undef xTrace4
#undef xTrace5

#define xTrace0(t,l,f)
#define xTrace1(t,l,f,a1)
#define xTrace2(t,l,f,a1,a2)
#define xTrace3(t,l,f,a1,a2,a3)
#define xTrace4(t,l,f,a1,a2,a3,a4)
#define xTrace5(t,l,f,a1,a2,a3,a4,a5)

#endif /* X_TRACE */

#ifdef TCP_TRACE

#define TCP_TRACE_MAX_ENTRIES 20000
#define TCP_EVENT_DATA        1
#define TCP_EVENT_OUT         2
#define TCP_EVENT_OUT0        3
#define TCP_EVENT_OUT1        4
#define TCP_EVENT_IN          5
#define TCP_EVENT_IN0         6
#define TCP_EVENT_IN1         7
#define TCP_EVENT_BADSUM      8
#define TCP_EVENT_ROPT        9
#define TCP_EVENT_DROPAA      10
#define TCP_EVENT_DROPWR      11
#define TCP_EVENT_DROP        12
#define TCP_EVENT_OPEN        13
#define TCP_EVENT_OPEN0       14
#define TCP_EVENT_OPEN1       15
#define TCP_EVENT_PUSH        16
#define TCP_EVENT_PUSHW       17
#define TCP_EVENT_PUSHA       18
#define TCP_EVENT_PUSHEC      19
#define TCP_EVENT_PUSHEO      20
#define TCP_EVENT_CTL_PUSH    21
#define TCP_EVENT_FAST_TO     22
#define TCP_EVENT_SLOW_TO     23
#define TCP_EVENT_TIMER       24
#define TCP_EVENT_DUP         25
#define TCP_EVENT_SET_TO      26
#define TCP_EVENT_WSND        27
#define TCP_EVENT_NFAST_TO    28
#define TCP_EVENT_MOD_NDUP    29
#define TCP_EVENT_CTL_NDUP    30
#define TCP_EVENT_CTL_SSN     31
#define TCP_EVENT_CTL0        32
#define TCP_EVENT_RCWND       33
#define TCP_EVENT_RTO         34
#define TCP_EVENT_OTHER1      101
#define TCP_EVENT_OTHER2      102
#define TCP_EVENT_OTHER3      103
#define TCP_EVENT_OTHER4      104
#define TCP_EVENT_OTHER5      105
#define TCP_EVENT_OTHER6      106
#define TCP_EVENT_OTHER7      107
#define TCP_EVENT_OTHER8      108
#define TCP_EVENT_OTHER9      109
#define TCP_EVENT_OTHERa      110
#define TCP_EVENT_OTHERb      111
#define TCP_EVENT_OTHERc      112
#define TCP_EVENT_OTHERd      113
#define TCP_EVENT_OTHERe      114
#define TCP_EVENT_OTHERf      115

#define TCP_NOTE_DUPACK  1
#define TCP_NOTE_WORRIED 2

#define DO_TRACE(ps,e,t,d,id)                                 \
  if ((ps)->traceObj && (ps)->traceObj->fileHdr.bufferSize) { \
    ((TcpTrace *)(ps)->traceObj->current)->event = (e);       \
    ((TcpTrace *)(ps)->traceObj->current)->time  = (t);       \
    ((TcpTrace *)(ps)->traceObj->current)->data  = (d);       \
    ((TcpTrace *)(ps)->traceObj->current)->sid = (id);        \
    dtWrapBuffer((ps)->traceObj, sizeof(TcpTrace));}

#define GET_TID(r,l) ( ((r)>>8) + ((r)&0xff) + (((l)>>4)&0xff) + \
  ((((l)>>8)&0xf0)|(l)&0x0f) )
#define GET_TIDHR(h) ( (((h).th_sport)>>8) + ((h).th_sport&0xff) + \
  (((h).th_dport>>4)&0xff) + ((((h).th_dport>>8)&0xf0)|(h).th_dport& 0x0f) )
#define GET_TIDHS(h) ( (((h).th_dport)>>8) + ((h).th_dport&0xff) + \
  (((h).th_sport>>4)&0xff) + ((((h).th_sport>>8)&0xf0)|(h).th_sport& 0x0f) )

typedef struct {
  int     time;
  u_short data;
  u_char  sid;
  u_char  event;
} TcpTrace;

typedef struct {
  int time;
  int sndbyte;
  int rcvbyte;
  int run_time;
  int read_np_lost;
  int zero;
  int tcpstatlen;
  struct tcpstat stat;
} TcpTraceMisc;

/* extern TcpTrace Traces[TCP_TRACE_MAX_ENTRIES]; */
/* extern int      TraceNum; */
/* extern XTime    Tcp_beg_time; */
#ifdef __STDC__
int tcpGetTime(void);
int tcpInitTime(void);
#else
int tcpGetTime();
int tcpInitTime();
#endif

#else /* TCP_TRACE */

#define DO_TRACE(ps,e,t,d,id)
#define GET_TID(r,l)
#endif /* TCP_TRACE */

#endif  /* TCP_TRACE_H */
