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); }
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; }
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); }