Beispiel #1
0
void ci_tcp_listenq_drop(ci_netif* ni, ci_tcp_socket_listen* tls,
                         ci_tcp_state_synrecv* tsr)
{
  /* ACKED means that the connection is in ESTABLISHED state.
   * We should reset it when dropping. */
  if( tsr->retries & CI_FLAG_TSR_RETRIES_ACKED ) {
    ci_ip_pkt_fmt* pkt = ci_netif_pkt_alloc(ni);
    if( pkt != NULL )
      ci_tcp_synrecv_send(ni, tls, tsr, pkt,
                          CI_TCP_FLAG_RST | CI_TCP_FLAG_ACK, NULL);
  }
  ci_tcp_listenq_remove(ni, tls, tsr);
}
static void efab_ip_queue_copy(ci_netif *ni_to, ci_ip_pkt_queue *q_to,
                               ci_netif *ni_from, ci_ip_pkt_queue *q_from)
{
  ci_ip_pkt_fmt *pkt_to, *pkt_from;
  oo_pkt_p pp;

  ci_ip_queue_init(q_to);
  if( q_from->num == 0 )
    return;

  ci_assert( OO_PP_NOT_NULL(q_from->head) );
  pp = q_from->head;
  do {
    pkt_from = PKT_CHK(ni_from, pp);
    pkt_to = ci_netif_pkt_alloc(ni_to);
    memcpy(&pkt_to->pay_len, &pkt_from->pay_len,
           CI_CFG_PKT_BUF_SIZE - CI_MEMBER_OFFSET(ci_ip_pkt_fmt, pay_len));
    ci_ip_queue_enqueue(ni_to, q_to, pkt_to);
    if( pp == q_from->tail )
      break;
    pp = pkt_from->next;
  } while(1);
}