I am developing an embedded CPU board with Kendin KS8723 Ethernet Chip. The ping and UDP socket are working, but the TCP socket does not work.

I tried to used the ethereal to capture the traffic between the embedded board (EB) and a PC. When I use the EB as TCP client (connect), I see the SYN was sent out and the PC responds a SYN+ACK, but the EB seems never received the reply from the PC and just keep sending SYN or ARP to the PC.

The second test I did is using the EB as TCP server (accept), I see the SYN was sent out from the PC (connect), but the EB never responds to it.

So I get into the TCP source code of the kernel and try to find out where is packet from the PC got lost. The following is what I found:

the ip_rcv(...) function in ip_input.c received the packet and calls function nf_hook_slow to process the packet. I put some print out there and verified that the packet header is correct. I traced down and found out that the nf_hook_slow then calls ip_rcv_finish and at the end of ip_rcv_finish it return skb->dst->input (skb). At this point, I can not find where is the input function was assigned (it is a function pointer).

The question I have is:

Could you please help me find where is the skb->dst->input function gets assigned (for TCP/IP)?

The UDP program and ping, ARP are all working, but the TCP program does not. What could be the possible cause and where should I go to fix it?

BTW, I use 2.4.18 kernel. I tried the sundance ethernet driver and my modified version of st201 ethernet driver from Kendin.

Your help is very important to me, I really appreciate your kindly help!
Thanks!

Dongliang Chen
EMS Technologies, Inc