This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Can't Connect,TCP CHECKSUM INCORRECT


Hello,

Please read this mail with next consent.
I never doubt anything of eCos source code.
I just like to find out suffering points because of hardware oddity and
my bad concoction.I beseech you to help me find that suffering points.
And I mail this if my discovery have any merit for you to pinpoint that
suffering points.I am not good at TCP/IP.My opinion is greatly loaded
with conjectures.

I traced tcp_output function.
It looks to me, at tcp_output's next points, append option part.
line 688-691
if (optlen) {
 bcopy(opt, th + 1, optlen);
 th->th_off = (sizeof (struct tcphdr) + optlen) >> 2;
}
Although peer sent 8 bytes option,optlen was 4.

Also it looks to me, in generating SYN-ACK packet, at next switch sentence,
case (TH_SYN|TH_ACK) context should be executed.
But it all passed out these block, never entered if sentence(line 445) block.
At that time tp->t_flags was 0xA1,flags was 0x12.


line 445-510
 /*
 * Send `CC-family' options if our side wants to use them (TF_REQ_CC),
 * options are allowed (!TF_NOOPT) and it's not a RST.
  */
 if ((tp->t_flags & (TF_REQ_CC|TF_NOOPT)) == TF_REQ_CC &&
      (flags & TH_RST) == 0) {
 switch (flags & (TH_SYN|TH_ACK)) {
 /*
  * This is a normal ACK, send CC if we received CC before
  * from our peer.
  */
 case TH_ACK:
  if (!(tp->t_flags & TF_RCVD_CC))
   break;
  /*FALLTHROUGH*/

 /*
  * We can only get here in T/TCP's SYN_SENT* state, when
  * we're a sending a non-SYN segment without waiting for
  * the ACK of our SYN.  A check above assures that we only
  * do this if our peer understands T/TCP.
  */
 case 0:
  opt[optlen++] = TCPOPT_NOP;
  opt[optlen++] = TCPOPT_NOP;
  opt[optlen++] = TCPOPT_CC;
  opt[optlen++] = TCPOLEN_CC;
  *(u_int32_t *)&opt[optlen] = htonl(tp->cc_send);

  optlen += 4;
  break;

 /*
  * This is our initial SYN, check whether we have to use
  * CC or CC.new.
  */
 case TH_SYN:
  opt[optlen++] = TCPOPT_NOP;
  opt[optlen++] = TCPOPT_NOP;
  opt[optlen++] = tp->t_flags & TF_SENDCCNEW ?
     TCPOPT_CCNEW : TCPOPT_CC;
  opt[optlen++] = TCPOLEN_CC;
  *(u_int32_t *)&opt[optlen] = htonl(tp->cc_send);
   optlen += 4;
  break;

 /*
  * This is a SYN,ACK; send CC and CC.echo if we received
  * CC from our peer.
  */
 case (TH_SYN|TH_ACK):
  if (tp->t_flags & TF_RCVD_CC) {
   opt[optlen++] = TCPOPT_NOP;
   opt[optlen++] = TCPOPT_NOP;
   opt[optlen++] = TCPOPT_CC;
   opt[optlen++] = TCPOLEN_CC;
   *(u_int32_t *)&opt[optlen] =
    htonl(tp->cc_send);
   optlen += 4;
   opt[optlen++] = TCPOPT_NOP;
   opt[optlen++] = TCPOPT_NOP;
   opt[optlen++] = TCPOPT_CCECHO;
   opt[optlen++] = TCPOLEN_CC;
   *(u_int32_t *)&opt[optlen] =
    htonl(tp->cc_recv);
   optlen += 4;
  }
  break;
 }
 }

Possibly I am wrong,anyway I inform you on the risk of showing ignarance.

I sincerely beseech your help.

Masahiro Ariga



--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]