[Click] Possible bug in userlevel ToDevice run_task function in Click 2.0
Eddie Kohler
kohler at cs.ucla.edu
Wed Sep 21 16:11:32 EDT 2011
Hi Jaeyong,
Very nice find!! Thank you so much!
I applied a different fix, however -- namely, setting the PCAP file
descriptor so that the add_select() call succeeds. See here:
https://github.com/kohler/click/commit/0d19b2033c06dbc326536eb3005337caf9c0261c
Does this version work for you?
Best,
Eddie
On 9/15/11 2:06 AM, jaeyong yoo wrote:
> Hello Eddie,
>
> While I was using Click ToDevice userlevel element, ToDevice suddenly stops
> pulling packets from a notifierqueue even though the ActiveNotifier signals
> "wake".
> After some debugging, I think the problem is the following.
>
> First of all, I'm using PCAP as capture method.
>
> In ToDevice::run_task(Task *) function, when "send_packet(p)" function
> returns -ENOBUFS or -EAGAIN, it backs off.
> But, when the backoff is just starting (means when _backoff is 0), it uses
> add_select(_fd, SELECT_WRITE) function to register a callback and no other
> callbacks (fast_reschedule, etc) are registered (it looks reasonable).
> But the problem arises when we use PCAP, because _fd is -1 and the
> add_select does not properly register callback and eventually run_task never
> called again.
> Even ActiveNotifier can not wake this run_task up.
>
> I think the problematic code is the following.
>
> if (r == -ENOBUFS || r == -EAGAIN) {
> assert(!_q);
> _q = p;
>
> if (!_backoff) {
> _backoff = 1;
> add_select(_fd, SELECT_WRITE);
> } else {
> _timer.schedule_after(Timestamp::make_usec(_backoff));
> if (_backoff< 32768)
> _backoff *= 2;
> if (_debug) {
> Timestamp now = Timestamp::now();
> click_chatter("%{element} backing off for %d at
> %{timestamp}\n", this, _backoff,&now);
> }
> }
> return count> 0;
>
> and should be changed something like the following.
>
> if (r == -ENOBUFS || r == -EAGAIN) {
> assert(!_q);
> _q = p;
>
> if (!_backoff) {
> _backoff = 1;
> #if TODEVICE_ALLOW_PCAP
> _timer.schedule_after(Timestamp::make_usec(_backoff));
> #endif
>
> #if TODEVICE_ALLOW_LINUX
> add_select(_fd, SELECT_WRITE);
> #endif
> } else {
> _timer.schedule_after(Timestamp::make_usec(_backoff));
> if (_backoff< 32768)
> _backoff *= 2;
> if (_debug) {
> Timestamp now = Timestamp::now();
> click_chatter("%{element} backing off for %d at
> %{timestamp}\n", this, _backoff,&now);
> }
> }
> return count> 0;
>
>
> Best regards,
> Jaeyong
> _______________________________________________
> click mailing list
> click at amsterdam.lcs.mit.edu
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
More information about the click
mailing list