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

Re: [ns] fix snoop



Hi,
	I had made these changes before. For getting rid of
segmentation fault, add the following line in the
"add-interface" method of Node/MobileNode in
ns-mobilenode.tcl :
#
# link layer
#
$ll ifq $ifq

This is not sufficient. We have to add the "command"
function to LLSnoop in which we have to invoke the
command function of the parent class, i.e. the LL
class.
This will properly set the ifq_ variable and won't
give any segmentation fault.

Prashant 
--- Benyuan Liu <[email protected]> wrote:
> 	
> Hi,	
> 
>   The Berkerly Snoop in NS has been broken since
> version ns-2.1.b4. I
> looked into the code recently and was able to make
> it work except for
> a small problem. In the following I will describe
> how I fixed and
> validated the code. Hope this will help other people
> in the community.
> 
>    The reason that Snoop doesn't work in current
> version is due to the 
> change in MAC layer. In Snoop, (Handler *h == 0) is
> used to
> determine the direction of the packet (up or down).
> But in current
> implementation of ns,  MAC class is a subclass of
> BiConnector. In
> BiConnector, ( HDR_CMN(p)->direction()), instead of
> the (Handler *h==
> 0) is used to determine whether to send up or down.
> So one need to
> replace all conditions (h==0) with
> (HDR_CMN(p)->direction() == hdr_cmn::UP)
> in Snoop.cc. 
> 
>   Also, to send a packet down at the link
> layer(snoop.cc), one needs to
> specify the direction of the packet. For example, in
> 
> void Snoop::recv() and  int Snoop::snoop_rxmit(),
> add 
> 
> 			hdr_cmn *ch = HDR_CMN(p);       
> 			ch->direction() = hdr_cmn::DOWN; 
> 
> before calling parent_->sendDown(p);
> 
>  For some reason, in snoop.cc,
> parent_->ifq()->length() always causes
> segmentation fault. The reason may be the C++ side
> doesn't get the correct
> pointer to the interface queue (ifq_). For now I
> just commented out
> the condition and make the queue limit to be big so
> the queue doesn't
> overflow.  
>  
>  After the above changes, the Snoop agent should be
> able to work. I
> validated the functionality of the Snoop agent by
> manually droping
> some packets and studying the detail trace. I
> validated all the major
> operations like :
>    (X)  Snoop timeout retransmission  
>    (X)  Ack suppress
>    (X)  Snoop Buffer operations
> 
> and the program works correctly.
> 
>  By the way, the original snoop test file
> (snoop.tcl) doesn't work.
> One problem "add-error" procedure uses old
> interface. The following is
> my own test file.
> 
>
-------------------------------------------------------------------------
> puts "sourcing tcl/lan/vlan.tcl..."
> source tcl/lan/vlan.tcl
> source tcl/lan/ns-mac.tcl
> 
> 
> set opt(tr)	out.tr
> set opt(namtr)	"MySnoop.nam"
> set opt(seed)	0
> set opt(stop)	10
> set opt(node)	2
> 
> set opt(qsize)	100
> set opt(bw)	10Mb
> set opt(delay)	1ms
> set opt(ll)	LL
> set opt(ifq)	Queue/DropTail
> set opt(mac)	Mac/802_3
> set opt(chan)	Channel
> set opt(tcp)	TCP/Reno
> set opt(sink)	TCPSink
> 
> set opt(app)	FTP
> 
> set loss_prob 10
> 
> 
> proc finish {} {
> 	global ns opt
> 
> 	$ns flush-trace
> 
> 	exec nam $opt(namtr) &
> 
> 	exit 0
> }
> 
> 
> proc create-trace {} {
> 	global ns opt
> 
> 	if [file exists $opt(tr)] {
> 		catch "exec rm -f $opt(tr) $opt(tr)-bw [glob
> $opt(tr).*]"
> 	}
> 
> 	set trfd [open $opt(tr) w]
> 	$ns trace-all $trfd
> 	if {$opt(namtr) != ""} {
> 		$ns namtrace-all [open $opt(namtr) w]
> 	}
> 	return $trfd
> }
> 
> proc add-error {LossyLink} {
> 
>     global loss_prob
>     
>     # creating the uniform distribution random
> variable
>     set loss_random_variable [new
> RandomVariable/Uniform] 
>     $loss_random_variable set min_ 0    # set the
> range of the random variable;
>     $loss_random_variable set max_ 100
>     
>     # create the error model;
>     set loss_module [new ErrorModel]  
>     $loss_module drop-target [new Agent/Null] 
>     $loss_module set rate_ $loss_prob  # set error
> rate to (0.1 = 10 / (100 - 0));
>     # error unit: packets (the default);
>     $loss_module unit pkt      
>     
>     # attach random var. to loss module;
>     $loss_module ranvar $loss_random_variable 
> 
>     # keep a handle to the loss module;
>     #set sessionhelper [$ns create-session $n0
> $tcp0] 
>     $LossyLink errormodule $loss_module
> 
> 
> 
> }
> 
> proc create-topology {} {
> 	global ns opt 
> 	global lan node s d
> 
> 	set num $opt(node)
> 	for {set i 1} {$i < $num} {incr i} {
> 		set node($i) [$ns node]
> 		lappend nodelist $node($i)
> 	}
> 	
> 
> 	set lan [$ns make-lan $nodelist $opt(bw) \
> 			$opt(delay) $opt(ll) $opt(ifq) $opt(mac)
> $opt(chan)]
> 	
> 
> 	set opt(ll) LL/LLSnoop
> 
> 	set opt(ifq) Queue/DropTail
> 	$opt(ifq) set limit_ 100
> 
> 	# set up snoop agent
> 	set node(0) [$ns node]
> 	$lan addNode [list $node(0)]  $opt(bw) $opt(delay)
> $opt(ll) $opt(ifq) $opt(mac)
> 	
> 	# set source and connect to node(0)
> 	set s [$ns node]
> 	$ns duplex-link $s $node(0) 20Mb 20ms DropTail
> 	$ns queue-limit $s $node(0) 100000
> 	$ns duplex-link-op $s $node(0) orient right
> 
> 	# set dest and connect to node(1)
> 	set d [$ns node]
> 	$ns duplex-link $node(1) $d 10Mb 0ms DropTail
> 	$ns queue-limit $node(1) $d 1000
> 	$ns duplex-link-op $d $node(1) orient left
> 
> 
> 
> 	set LossyLink [$ns link $node(1) $d]  
> 
> 	add-error $LossyLink
> }
> 
> ## MAIN ##
> 
=== message truncated ===


__________________________________________________
Do You Yahoo!?
Get email at your own domain with Yahoo! Mail. 
http://personal.mail.yahoo.com/?.refer=text