static int up_to_network(char *packet, int length, int arrived_on) { NL_PACKET *p; CnetAddr addr; p = (NL_PACKET *)packet; if(p->dest == nodeinfo.address) { /* THIS PACKET IS FOR ME */ if(p->kind == NL_DATA && p->seqno == packetexpected(p->src)) { length = p->length; /* modified to go up to my transport layer instead */ /* of application i -- Sumit*/ up_to_transport(p->msg, &length, p->src); inc_packetexpected(p->src); NL_stats(p->src, p->hopstaken, arrived_on, 0); addr = p->src; /* transform NL_DATA into NL_ACK */ p->src = p->dest; p->dest = addr; p->kind = NL_ACK; p->hopsleft = maxhops(p->dest); p->hopstaken = 1; p->length = 0; selective_flood(packet, PACKET_HEADER_SIZE, whichlink(p->dest) ); } else if(p->kind == NL_ACK && p->seqno == ackexpected(p->src)) { CnetInt64 took; /*move this to transport layeri -- Sumit*/ /*CNET_enable_application(p->src);*/ inc_ackexpected(p->src); int64_SUB(took, nodeinfo.time_in_usec, p->timesent); NL_stats(p->src, p->hopstaken, arrived_on, took); } } else { /* THIS PACKET IS FOR SOMEONE ELSE */ if(--p->hopsleft > 0) { /* send it back out again */ p->hopstaken++; NL_stats(p->src, p->hopstaken, arrived_on, 0); selective_flood(packet, length, whichlink(p->dest) & ~(1<<arrived_on)); } } return(0); }
//----------------------------------------------------------------------------- // detect a link for outgoing message int get_next_link_for_dest(CnetAddr destaddr) { // address not exists yet if (route_exists(destaddr) == FALSE) return -1; else return whichlink(destaddr); }
static void down_to_network(char* msg, int length, CnetAddr dest) { /* modified to take stuff form my transport layer instead of application layer -- Sumit*/ NL_PACKET p; p.length = length; memcpy(&(p.msg[0]),msg,length); p.dest = dest; p.src = nodeinfo.address; p.kind = NL_DATA; p.hopsleft = maxhops(p.dest); p.hopstaken = 1; p.timesent = nodeinfo.time_in_usec; p.seqno = nextpackettosend(p.dest); selective_flood((char *)&p, PACKET_SIZE(p), whichlink(p.dest)); }