WIZnet Developer Forum

w5100 interrupt 발생 시점

안녕하세요.
W5100 을 사용해 TCP/IP 통신을 하고 있고, i/o lib 은 Ver 1.9를 사용 중입니다.

사용 도중, socket.h 의 send() API 를 non-blocking 으로 수정 및 사용하고 싶은데, 문의 드릴 것이 있어
글 남기게 되었습니다.

/**
@brief  This function used to send the data in TCP mode
@return 1 for success else 0.
*/
uint16 send(
  SOCKET s,     /**< the socket index */
  const uint8 * buf,  /**< a pointer to data */
  uint16 len    /**< the data size to be send */
  )
{
  uint8 status=0;
  uint16 ret=0;
  uint16 freesize=0;
#ifdef __DEF_IINCHIP_DBG__
  printf("send()\r\n");
#endif

   if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size.
   else ret = len;

   // if freebuf is available, start.
  do
  {
    freesize = getSn_TX_FSR(s);
    status = IINCHIP_READ(Sn_SR(s));
    if ((status != SOCK_ESTABLISHED) && (status != SOCK_CLOSE_WAIT))
    {
      ret = 0;
      break;
    }
#ifdef __DEF_IINCHIP_DBG__
    printf("socket %d freesize(%d) empty or error\r\n", s, freesize);
#endif
  } while (freesize < ret);

      // copy data
  send_data_processing(s, (uint8 *)buf, ret);
  **IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND);**
=> 이 부분에서, send 명령 후 Sn_IR 확인을 통해 SEND_OK interrupt 를 확인하는 것으로 보이는데,
      이 interrupt 발생 시점이 data 전송 후, ACK 를 통해 전송 완료 확인까지 한 뒤인가요?
      만약, 통신 오류로 ACK 를 받지 못한 경우에도 SEND_OK 가 발생하는지, 그리고 ACK 를 받지 못한 경우,
     자체적으로 RCR, RTR 에 따라 Retry 를 시도한 뒤, Timeout Interrupt 를 발생하나요?

  /* +20071122[chungs]:wait to process the command... */
  while( IINCHIP_READ(Sn_CR(s)) )
    ;
  /* ------- */

/* +2008.01 bj */
#ifdef __DEF_IINCHIP_INT__
  while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK )
#else
  while ( (IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK )
#endif
  {
    /* m2008.01 [bj] : reduce code */
    if ( IINCHIP_READ(Sn_SR(s)) == SOCK_CLOSED )
    {
#ifdef __DEF_IINCHIP_DBG__
      printf("SOCK_CLOSED.\r\n");
#endif
      close(s);
      return 0;
    }
    }
/* +2008.01 bj */
#ifdef __DEF_IINCHIP_INT__
    putISR(s, getISR(s) & (~Sn_IR_SEND_OK));
#else
  IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK);
#endif
    return ret;
}

질문
IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND);
=> 이 부분에서, send 명령 후 Sn_IR 확인을 통해 SEND_OK interrupt 를 확인하는 것으로 보이는데,
이 interrupt 발생 시점이 data 전송 후, ACK 를 통해 전송 완료 확인까지 한 뒤인가요?
만약, 통신 오류로 ACK 를 받지 못한 경우에도 SEND_OK 가 발생하는지, 그리고 ACK 를 받지 못한 경우,
자체적으로 RCR, RTR 에 따라 Retry 를 시도한 뒤, Timeout Interrupt 를 발생하나요?

안녕하세요.

Sn_IR은 소켓의 상태변화나 Command 수행 결과를 알려줍니다.

  1. 이 부분에서, send 명령 후 Sn_IR 확인을 통해 SEND_OK interrupt 를 확인하는 것으로 보이는데,
    이 interrupt 발생 시점이 data 전송 후, ACK 를 통해 전송 완료 확인까지 한 뒤인가요?
    = Sn_CR 커멘트 레지스터가 Send를 완료했을 경우 SEND OK Interrupt가 발생합니다.

  2. RCR, RTR 에 따라 Retry 를 시도한 뒤, Timeout Interrupt 를 발생하나요?
    = ARP 또는 TCP 통신 과정에서 Sn_RCR(Socket Retransmission Count Register)이상의 재전송이 발생하면 Timeout이 발생합니다

감사합니다.

우선, 답변 감사드립니다 :slight_smile:

해주신 답변 중, “Sn_CR 커멘트 레지스터가 Send를 완료했을 경우” 라는 것이


위 그림처럼 전송한 data 를 받은 상대방이 회신한 ACK 를 수신하게 되는 시점 직후를 의미하는 것인지,
아니면 data 를 전송한 시점을 나타내는 것인지 궁금합니다.

Data를 ACK로 수신한 직후에 Interrupt가 발생하는 것이 아니고 현재 전송한 시점을 기준으로 SEND OK interrupt가 발생하는 것 입니다.

감사합니다

그렇다면 두 번째 답변이었던, “ARP 또는 TCP 통신 과정에서 Sn_RCR(Socket Retransmission Count Register)이상의 재전송이 발생하면 Timeout이 발생합니다” 에 대해서
data 전송 이후, ACK 를 받지 못한 상태로 RTR 이 만료된 경우에 Retry 를 발생하는 것으로 이해하면 될까요?

네, 상대방이 응답이 없을 경우에 Retransmission이 발생합니다.
상대방이 응답을 수신할 때까지 설정된 RTR (Retransmission Time Register)시간 값에 따라 Packet을 전송하고 지정된 RCR (Retransmission count register)을 초과하면 Timeout이 발생합니다.

감사합니다

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.