Exemplo n.º 1
0
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);
}
Exemplo n.º 2
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);
}
Exemplo n.º 3
0
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));
}