int add_node(CnetNodetype nodetype, char *name, int defn, int *wasnew) { extern int strcasecmp(const char *, const char *); NODE *np; int n; for(n=0 ; n<_NNODES ; n++) if(strcasecmp(name, NP[n].nodename) == 0) { if(defn) NP[n].nodetype = nodetype; /* over-ride */ *wasnew = FALSE; return(n); /* node seen before */ } if(strlen(name) >= MAX_NODENAME_LEN) { fprintf(stderr,"%s: node name '%s' is too long (max is %d)\n", argv0, name, MAX_NODENAME_LEN-1); ++nerrors; /* continue anyway */ } NP = (NODE *)realloc((char *)NP, (unsigned)(_NNODES+1)*sizeof(NODE)); np = &(NP[_NNODES]); memset((char *)np, 0, sizeof(NODE)); np->nodetype = nodetype; np->nodename = strdup(name); np->nlinks = 0; np->links = NEW(int); np->runstate = STATE_REBOOTING; #if (NODE_CLOCK_SKEW == 0) np->clock_skew = int64_ZERO; #else if(cflag) np->clock_skew = int64_ZERO; else int64_I2L(np->clock_skew, ((int)nrand48(xsubi)%(2*NODE_CLOCK_SKEW) - NODE_CLOCK_SKEW)); #endif init_nodeattrs(&(np->nattr)); np->nattr.address = (CnetAddr)(DEFAULTNODE.address + _NNODES); init_linkattrs(&(np->lattr)); *wasnew = TRUE; return( _NNODES++ ); }
static int nodemenu_select(ClientData data, Tcl_Interp *interp, int argc, char *argv[]) { extern void unschedule_node(int node); int n, s; if(vflag) { for(n=0 ; n<argc-1 ; ++n) fprintf(stderr,"%s ", argv[n]); fprintf(stderr,"%s\n", argv[argc-1]); } if(argc != 3) { interp->result = "wrong # args"; return TCL_ERROR; } n = atoi(argv[1]); s = atoi(argv[2]); if(n < 0 || n >= _NNODES || s < 0 || s >= N_NODEMENU_STRINGS) { interp->result = "invalid node or menu arg"; return TCL_ERROR; } switch (s) { case RE : NP[n].runstate = STATE_REBOOTING; schedule_event(EV_REBOOT, n, int64_ONE, NULLTIMER, NP[n].data[(int)EV_REBOOT]); break; case CR : NP[n].runstate = STATE_CRASHED; unschedule_node(n); break; case SR : NP[n].runstate = STATE_AUTOREBOOT; schedule_event(EV_REBOOT, n, int64_ONE, NULLTIMER, NP[n].data[(int)EV_REBOOT]); break; case P1 : case P6 : NP[n].runstate = STATE_PAUSED; int64_I2L(NP[n].will_resume, (s == P1 ? 10000000 : 60000000)); schedule_event(EV_REBOOT, n, NP[n].will_resume, NULLTIMER, NP[n].data[(int)EV_REBOOT]); int64_ADD(NP[n].will_resume, TIMENOW_in_USEC,NP[n].will_resume); break; } draw_node_icon(FALSE,n); if(dflag) fprintf(stderr,"%s.menu -> %s\n", NP[n].nodename, menu_strings[s]); return TCL_OK; }
static void show_table(CnetEvent ev, CnetTimer timer, CnetData data) { int t, n; CNET_clear(); printf("\n%14s %14s %14s %14s %14s\n", "destination","packets-ack'ed","min-hops","minhop-link", "round-trip-time"); for(t=0 ; t<table_size ; ++t) if((n = table[t].ackexpected) > 0) { CnetInt64 avtime; int64_I2L(avtime, n); int64_DIV(avtime, table[t].totaltime, avtime); printf("%14d %14d %14ld %14ld %14s\n", (int)table[t].address, table[t].ackexpected, table[t].minhops, table[t].minhop_link, int64_L2A(avtime,0)); } }
static void show_detailed(CnetEvent ev, CnetTimer timer, CnetData data) { NL_TABLE *tp; int t; CNET_clear(); printf("\n%14s %14s %14s %14s %14s\n", "destination","packets-ack'ed","min-hops","minhop-link", "round-trip-time"); for(t=0, tp=table ; t<table_size ; ++t, ++tp) if(tp->ackexpected > 0) { CnetInt64 avtime; printf("%14d %14d %14d", (int)tp->destaddr, tp->ackexpected, tp->minhops); if(tp->minhop_link == ALL_LINKS) printf(" %14s", "ALL-LINKS"); else printf(" %14d", tp->minhop_link); int64_I2L(avtime, tp->ackexpected); int64_DIV(avtime, tp->totaltime, avtime); printf(" %14s\n", int64_L2A(avtime,0)); } }
int add_link(CnetLinktype linktype, int src, int dest, CnetNicaddr nicaddr) { LINK *lp; LINKATTR *lap; int t; if(linktype == LT_ETHERNET) { LP = (LINK *)realloc((char *)LP, (unsigned)(_NLINKS+1)*sizeof(LINK)); lp = &LP[_NLINKS]; memset((char *)lp, 0, sizeof(LINK)); /* clears linkattrs too */ lp->linktype = LT_ETHERNET; lp->linkup = TRUE; lp->endmin = src; lp->endmax = dest; /* the ethernet segment # */ lap = &lp->lattrmin; memcpy(lap->nicaddr, nicaddr, LEN_NICADDR); lap->bandwidth = ETH_Mbps * 1000000; lap->transmitbufsize = ETH_MAXPACKET; int64_I2L(lap->propagationdelay, ETH_SLOTTIME); t = ++NP[src].nlinks; NP[src].links = (int *)realloc((char *)NP[src].links,(t+1)*sizeof(int)); NP[src].links[t] = _NLINKS; } else if(linktype == LT_POINT2POINT) { int minnode, maxnode, l; if(src < dest) minnode = src, maxnode = dest; else minnode = dest, maxnode = src; /* CHECK IF WE'VE SEEN A POINT-TO-POINT LINK BETWEEN THESE TWO NODES BEFORE */ for(l=0 ; l<_NLINKS ; l++) if(LP[l].endmin == minnode && LP[l].endmax == maxnode) return(l); LP = (LINK *)realloc((char *)LP, (unsigned)(_NLINKS+1)*sizeof(LINK)); lp = &LP[_NLINKS]; memset((char *)lp, 0, sizeof(LINK)); /* clears linkattrs too */ lp->linktype = LT_POINT2POINT; lp->linkup = TRUE; lp->endmin = minnode; lp->endmax = maxnode; lp->lattrmin = NP[minnode].lattr; /* copy node's default lattrs */ lp->lattrmax = NP[maxnode].lattr; t = ++NP[minnode].nlinks; NP[minnode].links = (int *)realloc((char *)NP[minnode].links, (t+1)*sizeof(int)); NP[minnode].links[t] = _NLINKS; t = ++NP[maxnode].nlinks; NP[maxnode].links = (int *)realloc((char *)NP[maxnode].links, (t+1)*sizeof(int)); NP[maxnode].links[t] = _NLINKS; } return( _NLINKS++ ); }