Beispiel #1
0
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++ );
}
Beispiel #2
0
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;
}
Beispiel #3
0
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));
        }
}
Beispiel #4
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));
	}
}
Beispiel #5
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++ );
}