[Click] nsclick readhandler and writehandler patches

Bart Braem bart.braem at ua.ac.be
Wed Feb 15 03:44:28 EST 2006


Hello,

Currently nsclick does not pass a simstate when calling handlers from ns. This 
can pose problems as the time passed by ns might be completely wrong. This 
poses problems when handler callback functions use something with time. The 
proper approach is the same as when running loadclick.

classifier-click.cc should contain the following code:
    else if (strcmp(argv[1], "readhandler") == 0) {
      char* readreturn = 0;
      simclick_simstate simstate; 
      simstate.curtime = GetSimTime(); 
      readreturn = simclick_click_read_handler(clickinst_,argv[2],argv[3],0,0, 
&simstate);
      //fprintf(stderr, "readhandler: %s\n",clickretc);
      if (readreturn) {
        tcl.resultf("%s", readreturn);
        free(readreturn);
        readreturn = 0;
      }
      else {
        tcl.resultf("");
      }
      return TCL_OK;
    }
  } else if (argc == 5) {
    if (strcmp(argv[1], "writehandler") == 0) {
      int clickret;
       simclick_simstate simstate; 
       simstate.curtime = GetSimTime(); 
       clickret = simclick_click_write_handler(clickinst_, argv[2], argv[3],
                                              argv[4], &simstate);
      //fprintf(stderr, "writehandler: %i\n",clickret);
      tcl.resultf("%i", clickret);
      return TCL_OK;
    }
  }

(Perhaps the simstate initialisation part should become a separate 
method/constructor)

include/click/simclick.h should accept the simstate parameter:
char* simclick_click_read_handler(simclick_click clickinst,
                                  const char* elementname,
                                  const char* handlername,
                                  SIMCLICK_MEM_ALLOC memalloc,
                                  void* memparam,
                                  simclick_simstate* state);

int simclick_click_write_handler(simclick_click clickinst,
                                 const char* elemname, const char* 
handlername,
                                 const char* writestring, simclick_simstate* 
state);

ns/nsclick.cc should set the state:
char* simclick_click_read_handler(simclick_click clickinst,
                                  const char* elementname,
                                  const char* handlername,
                                  SIMCLICK_MEM_ALLOC memalloc,
                                  void* memparam,
                                  simclick_simstate* state){
    Router *r = ((SimState*)clickinst)->router;
    if (!r) {
      click_chatter("simclick_click_read_handler: call with null router");
      return 0;
    }
    setsimstate(state);

int simclick_click_write_handler(simclick_click clickinst,
                                 const char* elemname, const char* 
handlername,
                                 const char* writestring, simclick_simstate* 
state){
    Router *r = ((SimState*)clickinst)->router;
    if (!r) {
      click_chatter("simclick_click_write_handler: call with null router");
      return -3;
    }
    setsimstate(state);

Credit for this patch goes to Michael Voorhaen, he discovered the problem and 
worked out the solution.

Bart
-- 
Bart Braem
PATS research group
Dept. of Mathematics and Computer Sciences
University of Antwerp
G2.36, Building G
Middelheimlaan 1
2020 Antwerpen, Belgium
Phone: +32 (0)3 265.35.19.
Fax: +32 (0)3 265.37.77.
Web: www.pats.ua.ac.be
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 307 bytes
Desc: not available
Url : https://amsterdam.lcs.mit.edu/pipermail/click/attachments/20060215/34be632b/attachment.pgp


More information about the click mailing list