Example #1
0
void reset_dvr(struct node* a)
{
    struct routing_table_entry *rte = a->connected_edges;
    while(rte != NULL)
    {
        rtappend(a, rte->name, rte->through, rte->delay, rte->drop, rte->weight, 0);
        rte = rte->next;
    }
    rtappend(a, a->name, a->name, 0, 0, 0, 0);
}
Example #2
0
static RTReloc*
addRTReloc(RTClass *rtc, char *field, char *sig, uint flags)
{
	RTReloc *rtr;

	rtr = Malloc(sizeof(RTReloc));
	rtr->field = field;
	rtr->sig = sig;
	rtr->flags = flags;
	rtr->ipatch = Mallocz(sizeof(Ipatch));
	rtr->next = nil;
	if(field[0] == '@')	/* these must go first in the list ! */
		rtprepend(rtc, rtr);
	else
		rtappend(rtc, rtr);
	rtc->n += 1;
	return rtr;
}
Example #3
0
void handledvrmessage(struct node* nodea, struct msgtok* msg)
{
    // i am node a
    char* nodebname = msg->src;
    char* nodecname = msg->dest;
    float bcweight = (float)atof(msg->pay);
    float abweight;
    float abcweight;
    int routingtablechanged = 0;
    struct routing_table_entry* abrte;
    struct routing_table_entry* acrte;
    time_t curtime = time(NULL);
    
    // find distance between a, b
    abrte = getroutingtableentry(nodea, nodebname, 0);
    if (abrte == NULL) {
        return;
    }
    
    abweight = abrte->weight;
    abcweight = abweight + bcweight;

    // compare abcweight against current routing table entry for a to c
    acrte = getroutingtableentry(nodea, nodecname, 0);
    if (acrte == NULL)
    {
        rtappend(nodea, nodecname, nodebname, 0, 0, abcweight, 0);
        routingtablechanged = 1;
    }
    else if (acrte->weight > abcweight) 
    {
	    acrte->weight = abcweight;
	    strcpy(acrte->through, nodebname);
        routingtablechanged = 1;
    }

    if (routingtablechanged)
        log_routing_table(nodea, curtime, 0);
}