I've implemented a "no-copy" RX sk buff driver where a low level
driver receives packets into a memory area. I've pre-allocated a
number of zero-length SK buffs, then manipulate the head, data, tail,
and end pointers to point to the memory area of the incoming data from
the low level driver.

On Linux 2.6.18, UDP and ICMP processing appears to work fine. But the
initial incoming TCP SYN packet doesn't ever seem to get processed by
the TCP layer because it never sends back a SYN+ACK.

First, a simple question: What's the name of the Linux TCP function
entry point where packets come into the TCP layer? From there I can at
least walk through the source code and see if there is anything
obvious.

I'm currently using netstat -s to monitor the TCP layer, but that only
tells me that the connection isn't being completed. What can I do to
identify where the TCP layer decides it doesn't like this "no-copy"
SKB?

Does anyone have any experience doing anything like this or have any
ideas or suggestions why this isn't working for TCP?

For the more technical networking gurus out there, the data memory
that I change the SKB to point to has enough room for the data area
plus the shinfo structure that the SK buff facility tacks onto the
end. Since UDP works, I'm assuming the data memory area being pointed
to is accessible without virtual memory translation to the network
stack. Not sure how to pin-point the problem here and would greatly
appreciate any insights or suggestions.

Thanks,
Curt