18 Jun 2016

24257

0

Google SoC lwIP Report Week 4

This week, I started off chasing down how to handle TDI sending a new IRQ to create a connection context immediately after a connection has been accepted on the server end. At first, I thought it was for socket multiplexing. As I talked more with Art and looked more into the lwIP source code, I realized that this is an attempt by TDI to support backlogging. As such, this was not something I had to actively handle since lwIP has full backlogging support. 

Another thing I discovered along the way was how to handle the separation between connection contexts and transport addresses. The original socket storage data structure I started off working with, an ADDRESS_FILE, was only sufficient for a connectionless sockets. For TCP, which has a connection context, I created a TCP_CONTEXT data structure. I would allocate a TCP_CONTEXT on a CREATE IRQ for a connection context, and add a pointer to the TCP_CONTEXT to an ADDRESS_FILE on an ASSOCIATE_ADDRESS IRQ. When an ASSOCIATE_ADDRESS IRQ arrives for an ADDRESS_FILE that already has an associated address, I would assume that this was an attempt to start building a backlog, and immediately deallocate the TCP_CONTEXT that is not already associated with the ADDRESS_FILE. With this scheme, I was able to establish a connection between the server and client without causing crashes. 

This fix still left the programs frozen and uninterruptible because I did not have a framework in place for cancelling IRQs. The fix for this was rather simple compared to everything else I've done so far, since I did not have to work with any new data structures. I only had to figure out how to free the ones I'm already allocating. In a short half-day, I was able to successfully cancel pending IRQs. 

In the middle of the week, I got access to a branch forked directly from trunk. This was great, since the branch I had been working on had been forked before a large directory tree reorganization in ReactOS. For about a day, I dug through the old and new branches to figure out what I needed to change to merge my code into the fresh-off-of-trunk branch. The most puzzling problem I ran into in this process turned out to be because TCP, UDP, and RAW had all been disabled in lwIP's options header. I suspect that however lwIP was being used in trunk, everything was linked through the rosip.h file. 

The latter part of the week was spent working on implementing the TDI_SEND and TDI_RECEIVE IRQs. I am code-complete, but I still have a lot of testing ahead to see if my implementation works. I already discovered a problem where I don't handle NDIS_BUFFERs correctly. 

Discussion

This blog post represents the personal opinion of the author and is not representative of the position of the ReactOS Project.

The Blog Posts

Opinions, technical details, side projects or lovely kittens created directly by the ReactOS Devs.

Their opinions are theirs, so...well...any injuries, wounds, or dead-kittens due them, are..well..their own responsibility.

Visit the "Project News" for official statements.