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

struct nameIntVal {
    char *name;
    int  val;
};

static struct nameIntVal traceNameArray[] = {
    { "TR_NEVER", TR_NEVER },
    { "TR_FULL_TRACE", TR_FULL_TRACE },
    { "TR_DETAILED", TR_DETAILED },
    { "TR_FUNCTIONAL_TRACE", TR_FUNCTIONAL_TRACE },
    { "TR_MORE_EVENTS", TR_MORE_EVENTS },
    { "TR_EVENTS", TR_EVENTS },
    { "TR_SOFT_ERRORS", TR_SOFT_ERRORS },
    { "TR_MAJOR_EVENTS", TR_MAJOR_EVENTS },
    { "TR_GROSS_EVENTS", TR_GROSS_EVENTS },
    { "TR_ERRORS", TR_ERRORS },
    { "TR_ALWAYS", TR_ALWAYS },
    { NULL, 0 }
};

extern int tracetcpp;
extern int tracemalloc;
extern int traceevent;
extern int traceprocesscreation;
extern int traceprocessswitch;
extern int tracelist;
extern int tracemsg;
extern int tracenetmask;
extern int tracecksum;
extern int traceptbl;
extern int tracesessngc;
       int traceprotocol;
extern int traceprotdef;

struct {
    char *name;
    void (*initFunc)();
    int  *traceAddr;
} simOtherTab[] = {
    { "tcp", NULL, &tracetcpp },
    { "malloc", NULL, &tracemalloc },
    { "event", NULL, &traceevent },
    { "processcreation", NULL, &traceprocesscreation },
    { "processswitch", NULL, &traceprocessswitch },
    { "list", NULL, &tracelist },
    { "msg", NULL, &tracemsg },
    { "netmask", NULL, &tracenetmask },
    { "cksum", NULL, &tracecksum },
    { "ptbl", NULL, &traceptbl },
    { "sessngc", NULL, &tracesessngc },
    { "protocol", NULL, &traceprotocol },
    { "protdef", NULL, &traceprotdef },
    { NULL, NULL, NULL }
};

void sim_FCFS_init(ROUTER_STATE *, int, char **);
void sim_RED_init (ROUTER_STATE *, int, char **);

struct {
    char *name;
    void (*fn)();
} simRouterInitFns[] = {
    { "FCFS", sim_FCFS_init },
    {"RED",  sim_RED_init},
    { NULL, NULL }
};

static ROUTER_STATE *Routers[MAX_ROUTERS];
static int          RoutersCnt = 0;

int TcpCntMax = 0;

static int    maxLevel = 0;
static int    nextIndex = 1;
static int    cur;
static int    done = 0;
static int    debug = 0;
static int    filePosition = 0;
static int    fileLine = 1;
static FILE   *fin = NULL;
static IPhost ipLocalHost = { 0, 0, 0, 0 }; 
static PNODE  simNode;
/* static PNODE *freePnodeList = NULL, *usedPnodeList = NULL; */
static OBJ    *hostList = NULL, *routerList = NULL;
static int    hostCnt = 0, routerCnt = 0;
static NET    *netList = NULL;
static Sc     objNames;
static Sc     varNames;
static char   *nullName = "";
static char   *objTypes[] = { "Host", "Router", NULL };
static char   Str[200];
#ifdef XMEMTRACK
static int    TrackId = 0;
#endif

static void error1(char *, char *);
static void error2(char *, char *, char *);
static void syntaxErrorString(char *);
static void syntaxErrorChar(char, char);
static char *xerox(char *);
static char *join(char *, char *);
static void get(void);
static void skip_blanks_force(void);
static void skip_blanks(void);
static void force_string(char *);
static void force_char(char);
static char *NONBLANK(void);
static char *OBJNAME(void);
static char *PROTOCOL(void);
static char *IP_ADDRESS(void);
static void ARGS(char **, int *);
static void NAMES(OBJ *, PNODE *);
static void PROTOCOL_LIST(OBJ *);
static void PROTOCOLS(OBJ *);
static void HOST(void);
static void PROT_ARG(OBJ *);
static void S(void);
static void parse(void);
static void createNetwork(SIM_PSTATE *);
static void showProt(PNODE *);
static void ROUTER(void);
static void NETWORK(void);
static void CONNECT_LIST(NET *);
static void TRACE(void);
static void SET(void);
static void doLevels(void);
static int  getLevel(PNODE *);
static void my_build_pgraph(void);
       void sim_build_pgraph(void);
static void createProt(PNODE *, int);
static void fixNames(void);
static void create(SIM_PSTATE *);
static void getIpMask(IPhost *, IPhost *);
static char *getArg(int, char **, char *);
static void addKey(SIM_PSTATE *, char *, char *, IPhost *, int, char *, int,
		   int, int);
static void *simGetOtherInitFuncAddr(char *);
static void *simGetOtherTraceVarAddr(char *);

/* global vars, this should be defined in xsim.h
------------------------------------------------*/
int  xsimArgc;
char **xsimArgv;

