[Click] Nsclick optimalization in todevice

Eddie Kohler kohler at cs.ucla.edu
Fri Jan 19 16:42:33 EST 2007


Wim,

Thanks for this patch!  This looks pretty good, although it could be 
simplified.  So I've checked in a simplified version!

Eddie


Wim Vandenberghe wrote:
> Hi,
> 
> because my nsclick simulations took a long time to complete, I analysed 
> them using a profiler, and i discovered that the main problem was that 
> the run_task of the tosimdevice whas called a lot, and that it tried to 
> pull upstream, even if there were no elements available in the queues 
> before it.
> 
> So i added a notifier to the tosimdevice (like in a unqueue), so that 
> the task will only be scheduled if there is a packet available upstream. 
> First results where very promising, simulations were performed five 
> times faster then before. I have included the changed tosimdevice 
> sources in attachment, maybe some more people could test this code and 
> verify if this speeds up their simulations, and if the simulation 
> results are still the same.
> 
> Kind regards,
> 
> Wim
> 
> 
> ------------------------------------------------------------------------
> 
> /*
>  * tosimdevice.{cc,hh} -- writes packets to simulated network devices
>  *
>  */
> 
> /*****************************************************************************
>  *  Copyright 2002, Univerity of Colorado at Boulder                         *
>  *  Copyright (c) 2006 Regents of the University of California               *
>  *                                                                           *
>  *                        All Rights Reserved                                *
>  *                                                                           *
>  *  Permission to use, copy, modify, and distribute this software and its    *
>  *  documentation for any purpose other than its incorporation into a        *
>  *  commercial product is hereby granted without fee, provided that the      *
>  *  above copyright notice appear in all copies and that both that           *
>  *  copyright notice and this permission notice appear in supporting         *
>  *  documentation, and that the name of the University not be used in        *
>  *  advertising or publicity pertaining to distribution of the software      *
>  *  without specific, written prior permission.                              *
>  *                                                                           *
>  *  UNIVERSITY OF COLORADO DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS      *
>  *  SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND        *
>  *  FITNESS FOR ANY PARTICULAR PURPOSE.  IN NO EVENT SHALL THE UNIVERSITY    *
>  *  OF COLORADO BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL         *
>  *  DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA       *
>  *  OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER        *
>  *  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR         *
>  *  PERFORMANCE OF THIS SOFTWARE.                                            *
>  *                                                                           *
>  ****************************************************************************/
> 
> 
> #include <click/config.h>
> #include "fromsimdevice.hh"
> #include "tosimdevice.hh"
> #include <click/error.hh>
> #include <click/etheraddress.hh>
> #include <click/confparse.hh>
> #include <click/router.hh>
> #include <click/standard/scheduleinfo.hh>
> 
> #include <stdio.h>
> #include <unistd.h>
> CLICK_DECLS
> 
> ToSimDevice::ToSimDevice()
>   : _fd(-1), _my_fd(false), _task(this), _encap_type(SIMCLICK_PTYPE_ETHER),_signals(0)
> {
> }
> 
> ToSimDevice::~ToSimDevice()
> {
>   uninitialize();
> }
> 
> int
> ToSimDevice::configure(Vector<String> &conf, ErrorHandler *errh)
> {
>   String encap_type;
>   if (cp_va_parse(conf, this, errh,
> 		  cpString, "interface name", &_ifname,
> 		  cpOptional,
> 		  cpWord, "encapsulation type", &encap_type,
> 		  cpKeywords,
> 		  "ENCAP", cpWord, "encapsulation type", &encap_type,
> 		  cpEnd) < 0)
>     return -1;
>   if (!_ifname)
>     return errh->error("interface not set");
>   if (!encap_type || encap_type == "ETHER")
>     _encap_type = SIMCLICK_PTYPE_ETHER;
>   else if (encap_type == "IP")
>     _encap_type = SIMCLICK_PTYPE_IP;
>   else if (encap_type == "UNKNOWN")
>       _encap_type = SIMCLICK_PTYPE_UNKNOWN;
>   else
>     return errh->error("bad encapsulation type");
> 
>   return 0;
> }
> 
> int
> ToSimDevice::initialize(ErrorHandler *errh)
> {
>   _fd = -1;
>   if (!_ifname)
>     return errh->error("interface not set");
> 
>   // Get the simulator ifid
>   Router* myrouter = router();
>   _fd = myrouter->sim_get_ifid(_ifname.c_str());
>   if (_fd < 0) return -1;
> 
>   _my_fd = true;
>   if (input_is_pull(0))
>     ScheduleInfo::join_scheduler(this, &_task, errh);
> 
>  //initialize the scheduler element so that run_task will only pull a packet if there is one available in a non-empty queue
>  if (!(_signals = new NotifierSignal[ninputs()]))
> 	return errh->error("out of memory!");
>     for (int i = 0; i < ninputs(); i++)
> 	_signals[i] = Notifier::upstream_empty_signal(this, i, &_task); //the pointer to _task makes sure that the task wel be schedulled if a pakket becomes available in an upstream queue
>     return 0;
> }
> 
> void
> ToSimDevice::uninitialize()
> {
>   _task.unschedule();
> delete[] _signals;
> }
> 
> void
> ToSimDevice::send_packet(Packet *p)
> {
>   Router* myrouter = router();
>   int retval;
>   // We send out either ethernet or IP
>   retval = myrouter->sim_write(_fd,_encap_type,p->data(),p->length(),
> 				 p->get_sim_packetinfo());
>   p->kill();
> }
> 
> void
> ToSimDevice::push(int, Packet *p)
> {
>   assert(p->length() >= 14);
>   //fprintf(stderr,"Hey!!! Pushing!!!\n");
>   send_packet(p);
> }
> 
> bool
> ToSimDevice::run_task()
> {
>   // XXX reduce tickets when idle
>   bool active = false;
>   if (router()->sim_if_ready(_fd)) {
>     //fprintf(stderr,"Hey!!! Pulling ready!!!\n");
>   	if (Packet *p = input(0).pull()) {    
>   		//fprintf(stderr,"Hey!!! Sending a packet!!!\n");
>       		send_packet(p);
>       		active = true;
>     	}
>    }
>  //if there are no packets available in the queues upstream, do not reschedule 
>  if(!_signals[0]){
> 	return active;
> 	}
> 
>   _task.fast_reschedule();
>   return active;
> }
> 
> void
> ToSimDevice::add_handlers()
> {
>   if (input_is_pull(0))
>     add_task_handlers(&_task);
> }
> 
> CLICK_ENDDECLS
> ELEMENT_REQUIRES(FromSimDevice ns)
> EXPORT_ELEMENT(ToSimDevice)
> 
> 
> ------------------------------------------------------------------------
> 
> #ifndef CLICK_TOSIMDEVICE_HH
> #define CLICK_TOSIMDEVICE_HH
> #include <click/element.hh>
> #include <click/string.hh>
> #include <click/task.hh>
> #include <click/notifier.hh>
> CLICK_DECLS
> 
> /*****************************************************************************
>  *  Copyright 2002, Univerity of Colorado at Boulder.                        *
>  *                                                                           *
>  *                        All Rights Reserved                                *
>  *                                                                           *
>  *  Permission to use, copy, modify, and distribute this software and its    *
>  *  documentation for any purpose other than its incorporation into a        *
>  *  commercial product is hereby granted without fee, provided that the      *
>  *  above copyright notice appear in all copies and that both that           *
>  *  copyright notice and this permission notice appear in supporting         *
>  *  documentation, and that the name of the University not be used in        *
>  *  advertising or publicity pertaining to distribution of the software      *
>  *  without specific, written prior permission.                              *
>  *                                                                           *
>  *  UNIVERSITY OF COLORADO DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS      *
>  *  SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND        *
>  *  FITNESS FOR ANY PARTICULAR PURPOSE.  IN NO EVENT SHALL THE UNIVERSITY    *
>  *  OF COLORADO BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL         *
>  *  DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA       *
>  *  OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER        *
>  *  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR         *
>  *  PERFORMANCE OF THIS SOFTWARE.                                            *
>  *                                                                           *
>  ****************************************************************************/
> 
> /*
>  * =title ToSimDevice.u
>  * =c
>  * ToSimDevice(DEVNAME [, ENCAP])
>  * =s netdevices
>  * sends packets to simulated network device
>  * =d
>  *
>  * This manual page describes the ToSimDevice element.
>  *
>  * This element will only work with the click simulator interface.
>  *
>  * Keyword arguments are:
>  *
>  * =over 8
>  *
>  * =item ENCAP
>  *
>  * Word.  The interface's encapsulation type.  Options are ETHER, IP, and
>  * UNKNOWN; default is ETHER.
>  *
>  * =back
>  * 
>  * =a
>  * FromSimDevice.u */
> 
> 
> /*
>  * Write packets to a simulated network interface.
>  * Expects packets that already have an ether header.
>  * Can push or pull.
>  */
> 
> class ToSimDevice : public Element { public:
>   
>   ToSimDevice();
>   ~ToSimDevice();
>   
>   const char *class_name() const		{ return "ToSimDevice"; }
>   const char *port_count() const		{ return PORTS_1_0; }
>   const char *processing() const		{ return AGNOSTIC; }
>   //const char *flags() const			{ return "S2"; }
>   
>   int configure_phase() const { return CONFIGURE_PHASE_LAST; }//wim vdb : makes sure that all upstream elements are initialised first, so that all upstream notifiers can be found
>   int configure(Vector<String> &, ErrorHandler *);
>   int initialize(ErrorHandler *);
>   void uninitialize();
>   void add_handlers();
> 
>   String ifname() const				{ return _ifname; }
>   int fd() const				{ return _fd; }
> 
>   void push(int port, Packet *);
>   bool run_task();
> 
>  private:
> 
>   String _ifname;
>   int _fd;
>   bool _my_fd;
>   Task _task;
>   int _encap_type;
>   
>   void send_packet(Packet *);
>   NotifierSignal *_signals; //used for a smarter rescheduling, no rescheduling if there is no packet available upstream
>   
> };
> 
> CLICK_ENDDECLS
> #endif
> 
> _______________________________________________
> click mailing list
> click at amsterdam.lcs.mit.edu
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click


More information about the click mailing list