[Click] assertion problem with port

Eddie Kohler kohler at cs.ucla.edu
Wed Mar 2 09:59:53 EST 2011


There are a lot of problems with your code.

- your element is behaving as if it is push and pull AT THE SAME TIME; this 
doesn't work; each port may be EITHER push OR pull.  Decide which you want 
your element to be.  If you want pull inputs and push outputs, this is 
possible, but you want processing() of PULL_TO_PUSH.  If you want to support 
both pull() and a run_timer() that calls push(), I think you are confused.

- p0, p1, pudp should be local variables not class variables
- your code assumes that you always have at least 3 inputs and outputs, which 
means the port_count should be "3-/="; probably it should just be "3/3"

Eddie


On 3/2/11 6:26 AM, iaaaguru at tce.edu wrote:
> i think the problem is with the line " output(h).push(p);". in the "push"
> finction..if its commented the element works fine... can u pls help
>
>
> ########### time.cc ##########
> #include<click/config.h>
> #include "time.hh"
> #include<click/confparse.hh>
> #include<click/error.hh>
> #include<click/glue.hh>
> #include<click/router.hh>
> CLICK_DECLS
>
> Time::Time()
>      : _interval(0, Timestamp::subsec_per_sec / 2),
>        _count0(0),_count1(0), _active(true), _timer(this)
> {
> 	click_chatter("constructor count0: %d count1: %d",_count0,_count1);
> }
>
> Time::~Time()
> {
> }
>
> int
> Time::configure(Vector<String>  &conf, ErrorHandler *errh)
> {
>    if (cp_va_kparse(conf, this, errh,
> 		   "INTERVAL", cpkP, cpTimestamp,&_interval,
> 		   "ACTIVE", 0, cpBool,&_active,
> 		    cpEnd)<  0)
>      return -1;
>
> }
>
> int
> Time::initialize(ErrorHandler *)
> {
>    _timer.initialize(this);
>    if (_active)
>      _timer.schedule_after(_interval);
>    return 0;
> }
>
> void
> Time::run_timer(Timer *)
> {
>
>
> //@@@@@@@@@@@@@@@@@ get counters from pull element @@@@@@@@@@@@@@@
>
>    click_chatter("Left count : %d Right count :%d",_count1,_count0);
>
>    if ((_count0==0)&&(_count1)==0)
>      click_chatter("No netowrk flow");
>
>    if(_count0>_count1)
>      {
>        click_chatter("Right is hot");
>        hot_int =0;
>      }
>
>    else if ((_count0==0)||(_count1)==0)
>       {
>         if(_count0=0)
>           {
>            if(_count1=0)
>              click_chatter("No network flow");
>            else
>              click_chatter("No flow from left");
>            }
>
>       }
>
>    if(_count1>_count0)
>      {
>        click_chatter("Left is hot");
>        hot_int=1;
>      }
>
> //@@@@@@@@@@@@@@@@@@ reset all counters @@@@@@@@@@@@@@@@@@@@@@@@@@
>    _count0=0;
>    _count1=0;
>     click_chatter("Timer reset");
>
> //@@@@@@@@@@@@@@@@@@@@  UDP section  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
>
>    pudp=input(2).pull();
>    if(pudp)
>      {
>
>       click_chatter("@@@@@@@@@@@@ Recieved UDP packet @@@@@@@@@@@@@@@@@");
>       push(hot_int,pudp);
>
>      }
>
>    _timer.reschedule_after(_interval);
> }
>
> Packet*
> Time::pull(int)
> {
>
>    p0=input(0).pull();
>
> 	if(p0)
> 	 {
> 	    _count0+=1;
>              p0->kill();
> 	  }
>
>    p1=input(1).pull();
>
> 	if(p1)
> 	{
> 	  _count1+=1;
>            p1->kill();
> 	}
>
>
>     return p0;
>
> }
>
> void
> Time::push(int h, Packet *p)
> {
>
>     if(p)
>      {
>      // pudp_n = p->clone();
>
>       click_chatter("Made packet");
>       output(h).push(p);
>       click_chatter("Pushed packet");
>     }
>   }
>
> CLICK_ENDDECLS
> ELEMENT_REQUIRES(userlevel)
> EXPORT_ELEMENT(Time)
> ELEMENT_MT_SAFE(Time)
>
> ########### time.hh ##########
>
>
> #ifndef CLICK_TIME_HH
> #define CLICK_TIME_HH
> #include<click/element.hh>
> #include<click/timer.hh>
> CLICK_DECLS
>
>
> class Time : public Element { public:
>
>    Time();
>    ~Time();
>
>    const char *class_name() const		{ return "Time"; }
>    const char *port_count() const		{ return "-/="; }
>    const char *processing() const		{ return AGNOSTIC; }
>
>    int configure(Vector<String>  &, ErrorHandler *);
>    int initialize(ErrorHandler *);
>
>    void run_timer(Timer *);
>    Packet* pull(int);
>    void push(int, Packet *p);
>
>   private:
>    Packet *p0, *p1, *pudp,*pudp_n;
>    Timestamp _interval;
>    int _count0,_count1,hot_int;
>    bool _active;
>    Timer _timer;
>    int counter;
>    String _data;
>
> };
>
> CLICK_ENDDECLS
> #endif
>
>
>
>
>> Please include your code.
>> - Ian
>>
>>
>> On 03/02/2011 08:16 AM, iaaaguru at tce.edu wrote:
>>> hi all...
>>> i wrote an agnostic element. its pull ekement pull packet from 3 input
>>> ports and push elements on having certain conditions based on pulled
>>> packets  generates packet and pushes it to output port.. while doing
>>> this
>>> i get an error..
>>>
>>> "click: ../include/click/element.hh:559: void
>>> Element::Port::push(Packet*)
>>> const: Assertion `_e&&   p' failed."
>>>
>>> can u pls help...
>>>
>>>
>>>
>>> -----------------------------------------
>>> This email was sent using TCEMail Service.
>>> Thiagarajar College of Engineering
>>> Madurai-625 015, India
>>>
>>> _______________________________________________
>>> click mailing list
>>> click at amsterdam.lcs.mit.edu
>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>> _______________________________________________
>> click mailing list
>> click at amsterdam.lcs.mit.edu
>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>
>
>
>
> -----------------------------------------
> This email was sent using TCEMail Service.
> Thiagarajar College of Engineering
> Madurai-625 015, India
>
>
>
> -----------------------------------------
> This email was sent using TCEMail Service.
> Thiagarajar College of Engineering
> Madurai-625 015, India
>
> _______________________________________________
> click mailing list
> click at amsterdam.lcs.mit.edu
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click


More information about the click mailing list