NS2 - OTcl linkage

|

$NS/tclcl-1.17/tclcl.h, Tcl.cc
$NS/tclcl-1.17/tcl-object.tcl


class TclObject

  • split object의 base class
  • 제공하는 기능
    • 멤버 변수 바인딩
    • OTcl상에서 C++ 접근
    • OTcl에서 선언된 split object의 C++상의 인스턴스 접근
  • 바인딩
    • split object의 OTcl상의 멤버변수와 C++상의 멤버변수를 묶어줌
    • 어느 한곳의 값이 변하면 다른 곳에 바로 적용됨
    • C++ 상에서 bind_XXX()함수 이용
    • 보통 생성자에서 해줌
    • bind("<OTcl상에서 멤버변수 이름>", &<C++상에서 멤버변수 이름>);
      • ASRMAgent::ASRMAgent(){
      •  bind("pdistance_",&pdistance_);
      •  bind_time("lastSent_", &lastSessSent");
      •  bind_bw("ctrlLinit_",&ctrlBWLimit_);
      •  bind_bool("running_",&running_)
      • }
    • Bandwidth,Time은 고려해서 기본단위로 C++상의 멤버변수에 저장이 됨
    • Boolean은 true면 1, false면 0이 C++상의 멤버변수에 저장
    • 바인된 변수 초기화
      • $ns/tcl/lib/ns-default.tcl에 추가
      • 추가하지 않으면 경고가 뜸
    • 5가지 변수
    • real (double형)
      • $object set realvar 1.2e3
    • bandwidth (double형)
      • $object set bwvar 1.5m
      • $object set bwvar 1500k
      • 접미사 지원
        • kilo - k,K
        • mega - m, M
        • B - byte
        • b - bit(default)
    • time (double형)
      • $object set timevar 1500m
      • $object set timevar 1.5e9n
      • $object set timevar 1.5e9p
      • 접미사 지원
        • mili second - m
        • nano second - n
        • pico second - p
        • second - s(default)
    • integer (int형)
      • $object set intVar 12
    • boolean (int형)
      • true : 1 또는 t나 T로 시작하는 문자열
        • $object set boolvar t
        • $object set boolvar true
        • $object set boolbar 1
      • false : 0 또는 t나 T로 시작하지 않는 문자열
        • $object set boolvar false
        • $object set boolvar junk
        • $object set boolvar 0
  • OTcl상에서의 C++ 접근
    • OTcl상에서 클래스의 멤버함수가 아닌 커맨드도 존재
    • 커맨드가 클래스 멤버함수 중 존재하지 않으면
      • $object cmd 커맨드 인자들
      • cmd는 split object의 C++상의 클래스의 command()를 호출
        • int ASRMAgent::command(int argc, const char*const*argv) {
        •  Tcl &tcl = tcl::instance();
        •  if(strcmp(argv[1], "distance?") == 0) {
        •    int sender = atoi(argv[2]);
        •    SRMinfo *sp = get_state(sender);
        •    tcl.resultf("%f",sp->distance_);
        •    return TCL_OK; //cf> TCL_ERROR
        •    }
        •   }
        •  return (SRMAgent::command(argc,argv));
        • }
      • argv[0] <- cmd
      • argv[1] <- 명령어
      • argv[2] <- arg1
      • argv[3] <- arg2
      • command()내에서 성공시 return TCL_OK; 실패시 return TCL_ERROR;를 해줘야 함
  • Split object 접근
      • class TclObject{
      • ...
      •  inline static lookup(const char *name) {
      •   return (Tcl::instance().lookup(name));
      •  }
      • }
    • TclObject::lookup("oNNN")
      • OTcl 상에서 reference가 _oNNN인 split object의 C++상의 인스턴스(포인터)를 리턴
    • Typecasting을 해줘야 함

class Tcl

  • OTcl interpreter에 접근하고 통신하는 방법을 제공
    • OTcl 커맨드 실행
    • interpreter에서 실행된 결과의 리턴 값을 얻어 옴
    • interpreter로 결과값을 리턴
    • Tcl &tcl = Tcl::instance();
      • 이 instance로 OTcl interpreter 접근
    • OTcl 명령어 실행(OTcl 상에서 실행
      • tcl.eval(char *)
      • tcl.evalc(const char *) : 문자열 상수인 경우 ""
      • tcl.eval():tcl.buffer()있는 문자열로 실행
      • tcl.evalf(const char *) : formated string
    • OTcl로 / OTcl로부터 리턴
      • 결과(리턴값-문자열)을 OTcl상으로 넘기거나, OTcl상에서부터 받아온다.
      • 결과값 넘기기
        • tcl.result(const char *s)
        • tcl.resultf(const char* fmt, ...)
      • 결과값 가져오기
        • tcl.result()

class TclClass

  • C++상의 클래스 계층에 대응하는 OTcl 상의 클래스 계층을 만든다.
  • C++상의 클래스의 인스턴스를 만드는 멤버함수를 제공한다.
      • static class RenoTcpclass:public TclClass{
      •  public:
      •   RenoTcpClass():TclClass("Agnet/TCP/Reno") {}
      •   TclObject* create(int argc, const char*const*argv){
      •    return (new RenoTcpAgent());
      • }class_reno;
      • 클래스 정의 후 인스턴스까지 만듬
      • 생성자에서 하는 일은 없음
      • 부모 생성자 TclClass가 전 슬라이드에 언급한 일을 수행
      • argv[4] 부터 추가 변수
      • new Agent/TCP/Reno 시 내부적으로 RenoTcpClass::create() 실행
      • "Agent/TCP/Reno"는 OTcl상에 클래스 이름
      • static 클래스 정의와 정시에 선언 => C++상의 클래스에 대응하는 OTcl상의 클래스의 계층을 만듦.
    • SplitObject proc register className
      • OTcl 상에서 SplitObject(TclObject)를 최상위로 해서 클래스 계층을 만들어 준다.
    • create-shadow
      • TclClass::create_shadow()를 호출, create()를 호출한다.
  • 최종적으로 SplitObject의 생성자가 호출됨
  • SplitObject는 $self create-shadow 호출
  • create-shadow는 TclClass::create_shadow() 호출
  • TclClass::create_shadow()는 create()호출
  • TclClass를 상속한 class의 create()에서 C++상의 클래스의 인스턴스를 생성해야 함

'Network > Ns2_Lecture' 카테고리의 다른 글

Making NS-2 simulate an 802.11b link  (0) 2009.01.18
NS2 - 무선환경 시뮬레이션  (0) 2009.01.18
NS2 trace  (0) 2009.01.18
awk  (0) 2009.01.18
NS2 스크립트 - 유선환경 시뮬레이션  (0) 2009.01.18
And