On Fri, 2009-01-16 at 10:28 -0800, Bill Paul wrote: > > On Wed, 2009-01-07 at 09:30 -0200, Pablo Borges wrote: > > > > > The only bummer is, after a few minutes surfing teh internets my > > > blackberry reboots (O_O). I guess it has something to do with the > > > firmware that I need to upgrade. :/ > > > > Someone reported something similar to me on my blog the other day: > > > > "Barry does show great potential, but has a show-stopping bug for me. > > See my report on SF: Bug # 2480631…" > > > > http://www.happyassassin.net/2009/01/04/activity-and-blackberry-tethering-article/ > > > and ISTR it's been reported to the list, too. This seems to be a general > > bug...and at least for your case and the blog case, the offending model > > is a Curve... > > > The bug report referred to in the comment is: > > > > http://sourceforge.net/tracker/index.php?func=detail&aid=2480631&group_id=153722&atid=788904 > > -- > > adamw > > http://www.happyassassin.net > > > I seem to have run afoul of the same problem. I just got a Blackberry Curve > 8320 from T-Mobile (OS version 4.5.0.81), and I set up tethering with my > laptop running FreeBSD. In my case, the crash occurs during periods of heavy > network load. One of the first things I did after I set it up was to try to > measure the data transfer speed by downloading a file using fetch(1) (similar > to wget(1) in linux). The transfer would run for a while, then the Blackberry > would reset. > > I've observed two failure modes: > > - The LED turns red, the screen turns white, a spinning hourglass appears and > remains on screen for up to a minute, then the T-Mobile logo appears for > a few seconds, and finally the menu appears. > > - The LED turns red, the screen turns white for about 10 seconds, then the > menu reappears. As soon as the main menu returns, the EDGE link appears > good, but then it drops (red X through the antenna icon) and renegotiates. > > In both cases, the Curve disconnects from the USB bus. This coincides with an > I/O error during usb_bulk_read(). I ran pppob with debugging turned on, and > the log file shows what looks like a partial read: normally it's reading full > sized frames of about 1492 bytes (which corresponds to the TCP segments > arriving) but the last read before the crash only gets about 1088 bytes. > > Oh, with my EDGE connection via T-Mobile, the link speed seems to max out at > about 26KB/sec. (That's kilobytes per second.) > > I do device driver development for a living, and to me, a failure under load > such as this typically indicates a race condition. Races are somewhat less > likely to occur in user mode code, but I suppose they're still possible. > > I don't know for sure what's causing the problem yet, but I have a suspicion. > Looking at the log file generated by pppob, there seems to be a pattern to > the data transfer. In particular, whenever pppob does a USB bulk write, it's > typically followed by a USB bulk read of an "IPModem special packet." The > DataReadThread() method in m_ipmodem.cc does not do any special processing of > these messages and just discards them, but I think this might be the wrong > behavior. It looks an awful lot like these messages are write completion > acknowledgements; if so, I think the right thing to do is wait for the
I don't think that is the case. I think it shows incomplete initialization handshaking. I'm pretty sure I got it to stop sending this packet in response to every write by paying closer attention to the init sequence. > acknowledgement after each write before proceeding to the next write. > > That is, instead of just doing a usb_bulk_write() and returning immediately, > I > think you need to do the bulk write, then issue a bulk read and wait for the > acknowledgement to arrive, _then_ return. (And then it's safe to monitor the > read pipe for incoming traffic again.) My money says that this mechanism is > used to both rate limit the data transfered from the host to the device and > to keep host and device synchronized. > > I looked over the code briefly hoping that I might be able to do a quick > experiment to test this theory, but that turned out to be a little trickier > than I expected. This is partly because the code is written in C++ (I'm an > expert in C, but I only know a little bit about C++), and partly because it > uses threads. The m_ipmodem.cc module in particular uses a thread to listen > for inbound data from the device. This complicates things a little: I was > hoping to avoid having the read and write operations running indepentently of > each other (since I want the "wait for acknowledgement" operation performed > after a write not to collide with the normal read operations -- I especially > don't want to end up trying to queue two bulk read operations at once). > > It should be possible to avoid the use of threads here and obtain the desired > behavior by making use of select() in pppob to monitor both the stdin file > descriptor and the USB bulk read descriptor simultaneously. Unfortunately, > the current design of both pppob and the m_ipmodem.cc module make this a > little hard to do. I think I can rework them a little to make it possible to > at least test this approach and modify the IpModem::Write() method to wait > for acknowledgement, but it may take me a few days. > > Oh, a few notes on getting pppob to work with FreeBSD: > > - Building barry fails unless you have GCC 4. This is because the router.cc > module seems to depend on something called C++ Technical Report 1 library > extensions, which are not present in GCC 3. (Current versions of FreeBSD > include GCC 4 in the base install, but FreeBSD 6.0 comes with GCC 3.4.4. > This means I had to build a newer GCC on my laptop before I could compile > barry.) Is it really necessary to make the code dependent on this extension? > > - The version of pppd included with FreeBSD is 2.3 patch level 5. Linux > seems to use pppd 2.4. The main problem with this is that the "pty" > directive doesn't exist in pppd 2.3pl5, which makes it hard to use > pppob with it. I found a workaround for this, but I still had problems > (pppd would not negotiate a link). I finally gave up on pppd and used the > user-space ppp(8) utility in FreeBSD, and had better luck with it. (The > one trick to it seems to be that you have to disable VJ header compression.) > > -Bill > ------------------------------------------------------------------------------ This SF.net email is sponsored by: SourcForge Community SourceForge wants to tell your story. http://p.sf.net/sfu/sf-spreadtheword _______________________________________________ Barry-devel mailing list Barry-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/barry-devel