[Click] assertion problem with port

Eddie Kohler kohler at cs.ucla.edu
Wed Mar 2 10:15:45 EST 2011


Another possibility is that you want your element to have all input ports pull 
and output port 2 push.  that would be written

port_count() "3/3"
processing() "l/llh"

But your pull() code is still messed up because you are returning a packet 
that you have already killed, which is illegal.

So, yeah.
E


On 3/2/11 6:59 AM, Eddie Kohler wrote:
> 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
> _______________________________________________
> click mailing list
> click at amsterdam.lcs.mit.edu
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click


More information about the click mailing list