[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