sonumb

ns2 - How to get routing agent (AODV agent) 본문

개발자 이야기/Network

ns2 - How to get routing agent (AODV agent)

sonumb 2010. 3. 31. 23:55
3가지 방법이 있다.

1. agent 간에 패킷에 해당 객체의 주소를 넣어 주고 받는다.
(high complexity)

 2. cc 코드 상에서 실행.
MyAgent.cc
class MyAgent: public Agent{
..
void get_aodv( void );
};

void MyAgent::get_aodv( void ){
   Tcl& tcl=Tcl::instance();
   sprintf( tcl.buffer(),"$node_(%d) set ragent_",addr() ); 
   // TCL 코드상에서 $node_(번호)라는 변수가 선언이 되어야 한다.
   tcl.eval();
   AODV* agent = (AODV*)TclObject::lookup(tcl.result());
   agent->hello();
}
Tcl 스크립트상에서 $node_(번호)라는 변수와 위의 함수내에 굵게 처리한 부분과 일치해야하며,
변수의 %d 부분과 자신의 주소(addr())이 동일해야 동작한다.
(한마디로 low scalability이다. -_-;)

3. Tcl 스크립트와 연동하여 사용. (Recommendable)
Myagent.cc
class MyAgent: public Agent{
..
AODV* agent_;
};

void MyAgent::command(int argc, ...... ){
   Tcl& tcl=Tcl::instance();
   ...
   if( argc == 2 ) {
     if( strcasecmp(argv[1], "start" ) == 0) {
         ....
      }
   }
   else if( argc == 3) {
      if( strcasecmp(argv[1], "get-aodv" ) == 0){
         agent = (AODV*)TclObject::lookup(argv[2]);
         return TCL_OK;
      }
     else if ( 
           .........
   }
   ...
}


simulation.tcl 에서 
...
set var(rp)     AODV
...
$ns_ node-config -adhocRouting $val(rp) \
...
for {set i 0} {$i < 5 } {incr i} {
 set node_($i) [$ns node_]
 set p_($i) [new Agent/Protoname]
 $ns_ attach-agent $node_($i) $p_($i)
}

for {set i 0} {$i < 5 } {incr i} {
 set ra [$node_($i) set ragent_] ;#1
 $ns_ at 4.5 "$p_($i) get-aodv $ra" ;#2

 $ns_ at 5.0 "$p_($i) start";
}
....

#1.
Tcl 문법에서 클래스의 멤버변수에 값을 할당하기 위해 <인스턴스 set 변수 세팅할_값> 순서로 스크립팅한다. 세팅할_값 을 생략하면 그 변수가 가지고 있는 값을 리턴하는 것이 Tcl 문법인것 같다.(추측 ;) 

#2 
<#1>실행으로 획득한 Tcl 변수 ra의 값은 특정 TclObject간접적으로 가리키는 유일한 스트링 값이다. (포인터 처럼 직접적으로 가리키진 않음)
언더바+문자+숫자, 예를 들어 _o17 이런식으로 이루어져있다.


반응형