[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[ns] [NS] fix the bug in snoop



version:  ns-2.1b8a
problem:  couldn't get correct result when using snoop
bug:  "Snoop::handle()" in "snoop.cc" didn't process ARP request
fix:  add ARP request processing as LL does

/*----  original "Snoop::handle()" in "snoop.cc" ---*/
void
Snoop::handle(Event *e)
{

        Packet *p = (Packet *) e;
        packet_t type = hdr_cmn::access(p)->ptype();
        //int seq = hdr_tcp::access(p)->seqno();
        int prop = SNOOP_PROPAGATE; // by default;  propagate ack or packet
        Scheduler& s = Scheduler::instance();

        //hdr_ll *llh = hdr_ll::access(p);
        if (hdr_cmn::access(p)->error()) {
                parent_->drop(p);       // drop packet if it's been corrupted
                return;
        }

        if (type == PT_ACK) 
                prop = snoop_ack(p); 

        else if (type == PT_TCP) /* XXX what about TELNET? */
                snoop_wless_data(p);

        if (prop == SNOOP_PROPAGATE)
                s.schedule(recvtarget_, e, parent_->delay());
        else {                  // suppress ack
                /*              printf("---- %f suppressing ack %d\n", s.clock(), seq);*/
                
                //int seq = hdr_tcp::access(p)->seqno();
                Packet::free(p);
        }
}

/*=======================================================================================*/

/*----  fixed "Snoop::handle()" in "snoop.cc" ---*/
void
Snoop::handle(Event *e)
{

        Packet *p = (Packet *) e;
        packet_t type = hdr_cmn::access(p)->ptype();
        //int seq = hdr_tcp::access(p)->seqno();
        int prop = SNOOP_PROPAGATE; // by default;  propagate ack or packet
        Scheduler& s = Scheduler::instance();

        //hdr_ll *llh = hdr_ll::access(p);
        if (hdr_cmn::access(p)->error()) {
                parent_->drop(p);       // drop packet if it's been corrupted
                return;
        }

        if (type == PT_ACK) 
                prop = snoop_ack(p); 

        else if (type == PT_TCP) /* XXX what about TELNET? */
                snoop_wless_data(p);

        if (prop == SNOOP_PROPAGATE)
        {
/*------- process ARP request, refer to "ll.cc".  07/18/2001, wang, [email protected] -------*/
           if (type == PT_ARP) parent_->arp_table()->arpinput(p, this->parent_);
           else s.schedule(recvtarget_, e, parent_->delay());
        }
        else {                  // suppress ack
                /*              printf("---- %f suppressing ack %d\n", s.clock(), seq);*/
                
                //int seq = hdr_tcp::access(p)->seqno();
                Packet::free(p);
        }
}