亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? tcp_out.c

?? ARM7的一些試驗(yàn)程序
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
  }
  if (pcb->snd_queuelen != 0) {
    LWIP_ASSERT("tcp_enqueue: valid queue length", pcb->unacked != NULL ||
      pcb->unsent != NULL);
  }
  LWIP_DEBUGF(TCP_QLEN_DEBUG | DBG_STATE, ("tcp_enqueue: %d (with mem err)\n", pcb->snd_queuelen));
  return ERR_MEM;
}

/* find out what we can send and send it */
err_t
tcp_output(struct tcp_pcb *pcb)
{
  struct pbuf *p;
  struct tcp_hdr *tcphdr;
  struct tcp_seg *seg, *useg;
  u32_t wnd;
#if TCP_CWND_DEBUG
  int i = 0;
#endif /* TCP_CWND_DEBUG */

  /* First, check if we are invoked by the TCP input processing
     code. If so, we do not output anything. Instead, we rely on the
     input processing code to call us when input processing is done
     with. */
  if (tcp_input_pcb == pcb) {
    return ERR_OK;
  }

  wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);

  seg = pcb->unsent;

  /* useg should point to last segment on unacked queue */
  useg = pcb->unacked;
  if (useg != NULL) {
    for (; useg->next != NULL; useg = useg->next);
  }                                                                             
   
  /* If the TF_ACK_NOW flag is set and no data will be sent (either
   * because the ->unsent queue is empty or because the window does
   * not allow it), construct an empty ACK segment and send it.
   *
   * If data is to be sent, we will just piggyback the ACK (see below).
   */
  if (pcb->flags & TF_ACK_NOW &&
     (seg == NULL ||
      ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
    p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
    if (p == NULL) {
      LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n"));
      return ERR_BUF;
    }
    LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: sending ACK for %lu\n", pcb->rcv_nxt));
    /* remove ACK flags from the PCB, as we send an empty ACK now */
    pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);

    tcphdr = p->payload;
    tcphdr->src = htons(pcb->local_port);
    tcphdr->dest = htons(pcb->remote_port);
    tcphdr->seqno = htonl(pcb->snd_nxt);
    tcphdr->ackno = htonl(pcb->rcv_nxt);
    TCPH_FLAGS_SET(tcphdr, TCP_ACK);
    tcphdr->wnd = htons(pcb->rcv_wnd);
    tcphdr->urgp = 0;
    TCPH_HDRLEN_SET(tcphdr, 5);

    tcphdr->chksum = 0;
#if CHECKSUM_GEN_TCP
    tcphdr->chksum = inet_chksum_pseudo(p, &(pcb->local_ip), &(pcb->remote_ip),
          IP_PROTO_TCP, p->tot_len);
#endif
    ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
        IP_PROTO_TCP);
    pbuf_free(p);

    return ERR_OK;
  }

#if TCP_OUTPUT_DEBUG
  if (seg == NULL) {
    LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: nothing to send (%p)\n", pcb->unsent));
  }
#endif /* TCP_OUTPUT_DEBUG */
#if TCP_CWND_DEBUG
  if (seg == NULL) {
    LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %lu, cwnd %lu, wnd %lu, seg == NULL, ack %lu\n",
                            pcb->snd_wnd, pcb->cwnd, wnd,
                            pcb->lastack));
  } else {
    LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %lu, cwnd %lu, wnd %lu, effwnd %lu, seq %lu, ack %lu\n",
                            pcb->snd_wnd, pcb->cwnd, wnd,
                            ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
                            ntohl(seg->tcphdr->seqno), pcb->lastack));
  }
#endif /* TCP_CWND_DEBUG */
  /* data available and window allows it to be sent? */
  while (seg != NULL &&
  ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
#if TCP_CWND_DEBUG
    LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %lu, cwnd %lu, wnd %lu, effwnd %lu, seq %lu, ack %lu, i%d\n",
                            pcb->snd_wnd, pcb->cwnd, wnd,
                            ntohl(seg->tcphdr->seqno) + seg->len -
                            pcb->lastack,
                            ntohl(seg->tcphdr->seqno), pcb->lastack, i));
    ++i;
#endif /* TCP_CWND_DEBUG */

    pcb->unsent = seg->next;

    if (pcb->state != SYN_SENT) {
      TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
      pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
    }

    tcp_output_segment(seg, pcb);
    pcb->snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
    if (TCP_SEQ_LT(pcb->snd_max, pcb->snd_nxt)) {
      pcb->snd_max = pcb->snd_nxt;
    }
    /* put segment on unacknowledged list if length > 0 */
    if (TCP_TCPLEN(seg) > 0) {
      seg->next = NULL;
      /* unacked list is empty? */
      if (pcb->unacked == NULL) {
        pcb->unacked = seg;
        useg = seg;
      /* unacked list is not empty? */
      } else {
        /* In the case of fast retransmit, the packet should not go to the tail
         * of the unacked queue, but rather at the head. We need to check for
         * this case. -STJ Jul 27, 2004 */
        if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))){
          /* add segment to head of unacked list */
          seg->next = pcb->unacked;
          pcb->unacked = seg;
        } else {
          /* add segment to tail of unacked list */
          useg->next = seg;
          useg = useg->next;
        }
      }
    /* do not queue empty segments on the unacked list */
    } else {
      tcp_seg_free(seg);
    }
    seg = pcb->unsent;
  }
  return ERR_OK;
}

/**
 * Actually send a TCP segment over IP
 */
static void
tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb)
{
  u16_t len;
  struct netif *netif;

  /* The TCP header has already been constructed, but the ackno and
   wnd fields remain. */
  seg->tcphdr->ackno = htonl(pcb->rcv_nxt);

  /* silly window avoidance */
  if (pcb->rcv_wnd < pcb->mss) {
    seg->tcphdr->wnd = 0;
  } else {
    /* advertise our receive window size in this TCP segment */
    seg->tcphdr->wnd = htons(pcb->rcv_wnd);
  }

  /* If we don't have a local IP address, we get one by
     calling ip_route(). */
  if (ip_addr_isany(&(pcb->local_ip))) {
    netif = ip_route(&(pcb->remote_ip));
    if (netif == NULL) {
      return;
    }
    ip_addr_set(&(pcb->local_ip), &(netif->ip_addr));
  }

  pcb->rtime = 0;

  if (pcb->rttest == 0) {
    pcb->rttest = tcp_ticks;
    pcb->rtseq = ntohl(seg->tcphdr->seqno);

    LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_output_segment: rtseq %lu\n", pcb->rtseq));
  }
  LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %lu:%lu\n",
          htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) +
          seg->len));

  len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);

  seg->p->len -= len;
  seg->p->tot_len -= len;

  seg->p->payload = seg->tcphdr;

  seg->tcphdr->chksum = 0;
#if CHECKSUM_GEN_TCP
  seg->tcphdr->chksum = inet_chksum_pseudo(seg->p,
             &(pcb->local_ip),
             &(pcb->remote_ip),
             IP_PROTO_TCP, seg->p->tot_len);
#endif
  TCP_STATS_INC(tcp.xmit);

  ip_output(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
      IP_PROTO_TCP);
}

void
tcp_rst(u32_t seqno, u32_t ackno,
  struct ip_addr *local_ip, struct ip_addr *remote_ip,
  u16_t local_port, u16_t remote_port)
{
  struct pbuf *p;
  struct tcp_hdr *tcphdr;
  p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
  if (p == NULL) {
      LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n"));
      return;
  }

  tcphdr = p->payload;
  tcphdr->src = htons(local_port);
  tcphdr->dest = htons(remote_port);
  tcphdr->seqno = htonl(seqno);
  tcphdr->ackno = htonl(ackno);
  TCPH_FLAGS_SET(tcphdr, TCP_RST | TCP_ACK);
  tcphdr->wnd = htons(TCP_WND);
  tcphdr->urgp = 0;
  TCPH_HDRLEN_SET(tcphdr, 5);

  tcphdr->chksum = 0;
#if CHECKSUM_GEN_TCP
  tcphdr->chksum = inet_chksum_pseudo(p, local_ip, remote_ip,
              IP_PROTO_TCP, p->tot_len);
#endif
  TCP_STATS_INC(tcp.xmit);
   /* Send output with hardcoded TTL since we have no access to the pcb */
  ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP);
  pbuf_free(p);
  LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %lu ackno %lu.\n", seqno, ackno));
}

/* requeue all unacked segments for retransmission */
void
tcp_rexmit_rto(struct tcp_pcb *pcb)
{
  struct tcp_seg *seg;

  if (pcb->unacked == NULL) {
    return;
  }

  /* Move all unacked segments to the head of the unsent queue */
  for (seg = pcb->unacked; seg->next != NULL; seg = seg->next);
  /* concatenate unsent queue after unacked queue */
  seg->next = pcb->unsent;
  /* unsent queue is the concatenated queue (of unacked, unsent) */
  pcb->unsent = pcb->unacked;
  /* unacked queue is now empty */
  pcb->unacked = NULL;

  pcb->snd_nxt = ntohl(pcb->unsent->tcphdr->seqno);
  /* increment number of retransmissions */
  ++pcb->nrtx;

  /* Don't take any RTT measurements after retransmitting. */
  pcb->rttest = 0;

  /* Do the actual retransmission */
  tcp_output(pcb);
}

void
tcp_rexmit(struct tcp_pcb *pcb)
{
  struct tcp_seg *seg;

  if (pcb->unacked == NULL) {
    return;
  }

  /* Move the first unacked segment to the unsent queue */
  seg = pcb->unacked->next;
  pcb->unacked->next = pcb->unsent;
  pcb->unsent = pcb->unacked;
  pcb->unacked = seg;

  pcb->snd_nxt = ntohl(pcb->unsent->tcphdr->seqno);

  ++pcb->nrtx;

  /* Don't take any rtt measurements after retransmitting. */
  pcb->rttest = 0;

  /* Do the actual retransmission. */
  tcp_output(pcb);

}


void
tcp_keepalive(struct tcp_pcb *pcb)
{
   struct pbuf *p;
   struct tcp_hdr *tcphdr;

   LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: sending KEEPALIVE probe to %u.%u.%u.%u\n",
                           ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip),
                           ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip)));

   LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %lu   pcb->tmr %lu  pcb->keep_cnt %u\n", tcp_ticks, pcb->tmr, pcb->keep_cnt));
   
   p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);

   if(p == NULL) {
      LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: could not allocate memory for pbuf\n"));
      return;
   }

   tcphdr = p->payload;
   tcphdr->src = htons(pcb->local_port);
   tcphdr->dest = htons(pcb->remote_port);
   tcphdr->seqno = htonl(pcb->snd_nxt - 1);
   tcphdr->ackno = htonl(pcb->rcv_nxt);
   tcphdr->wnd = htons(pcb->rcv_wnd);
   tcphdr->urgp = 0;
   TCPH_HDRLEN_SET(tcphdr, 5);
   
   tcphdr->chksum = 0;
#if CHECKSUM_GEN_TCP
   tcphdr->chksum = inet_chksum_pseudo(p, &pcb->local_ip, &pcb->remote_ip, IP_PROTO_TCP, p->tot_len);
#endif
  TCP_STATS_INC(tcp.xmit);

   /* Send output to IP */
  ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);

  pbuf_free(p);

  LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_keepalive: seqno %lu ackno %lu.\n", pcb->snd_nxt - 1, pcb->rcv_nxt));
}

#endif /* LWIP_TCP */









?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产性做久久久久久| 看电视剧不卡顿的网站| 国产精品热久久久久夜色精品三区 | 中文字幕一区二区三| 中文字幕第一区二区| 国产欧美va欧美不卡在线| 国产欧美日产一区| 2014亚洲片线观看视频免费| 精品日韩在线观看| 久久蜜桃av一区二区天堂| 久久久久99精品国产片| 亚洲国产精品成人久久综合一区| 国产精品的网站| 亚洲六月丁香色婷婷综合久久| 一区二区三区在线视频观看| 又紧又大又爽精品一区二区| 亚洲午夜久久久久久久久电影网 | 日韩三级精品电影久久久| 91精品国产高清一区二区三区蜜臀 | 久久国产精品一区二区| 久久国产尿小便嘘嘘| 国产精品一区在线| 99精品久久只有精品| 欧美日韩中文一区| 日韩欧美在线综合网| 国产偷国产偷精品高清尤物| 国产精品久久久久久亚洲伦| 一二三四区精品视频| 日韩国产欧美在线播放| 精品一区二区在线视频| 成人性视频网站| 欧美视频一区二区三区| 日韩欧美一区中文| 欧美激情一区不卡| 亚洲综合区在线| 久久99精品国产.久久久久久| 成人午夜激情影院| 欧美日韩一区 二区 三区 久久精品| 日韩欧美国产午夜精品| 国产精品美女久久福利网站| 亚洲伊人色欲综合网| 狠狠色丁香久久婷婷综合_中| 成人app网站| 欧美一区二区网站| 国产精品久久久久影院色老大| 亚洲一区二区视频在线观看| 国产一区二区影院| 欧美在线制服丝袜| 精品sm在线观看| 一区二区三区在线观看视频| 久久精品国产免费看久久精品| av一区二区三区在线| 制服丝袜亚洲播放| 亚洲视频小说图片| 久久精品久久精品| 一本一道久久a久久精品综合蜜臀| 欧美高清性hdvideosex| 国产精品无码永久免费888| 日本vs亚洲vs韩国一区三区二区| 成人黄色小视频在线观看| 欧美一区二区免费观在线| 亚洲色图制服诱惑| 激情小说亚洲一区| 欧美另类变人与禽xxxxx| 国产精品无遮挡| 精一区二区三区| 在线影视一区二区三区| 国产午夜一区二区三区| 日韩高清在线一区| 在线观看视频91| 国产精品欧美久久久久无广告 | 亚洲成人动漫av| 99re8在线精品视频免费播放| 欧美电影影音先锋| 日韩理论在线观看| 国产精品66部| 日韩欧美亚洲一区二区| 亚洲综合一区在线| 99re视频精品| 国产精品色噜噜| 国内精品久久久久影院色| 777色狠狠一区二区三区| 夜夜夜精品看看| 91亚洲永久精品| 国产精品久久久久影院亚瑟| 国产精品白丝jk黑袜喷水| 欧美不卡一区二区三区| 丝袜a∨在线一区二区三区不卡| 91天堂素人约啪| 中文字幕一区二区三区不卡在线| 国产成人在线电影| 26uuu久久天堂性欧美| 精品制服美女丁香| 欧美电影免费观看高清完整版在 | 99综合影院在线| 国产精品色哟哟网站| 粉嫩在线一区二区三区视频| 久久久久久久一区| 国产做a爰片久久毛片| 精品国产不卡一区二区三区| 蜜桃久久av一区| 日韩午夜中文字幕| 久色婷婷小香蕉久久| 日韩欧美国产1| 久久电影网站中文字幕| 精品精品国产高清a毛片牛牛| 蜜桃久久久久久| 久久综合狠狠综合久久综合88 | 免费观看成人av| 欧美大片免费久久精品三p | 日韩欧美自拍偷拍| 久久精品国产亚洲aⅴ| 久久影音资源网| 国产成人av一区二区三区在线 | xvideos.蜜桃一区二区| 精品一区二区在线播放| 国产日本欧美一区二区| jiyouzz国产精品久久| 亚洲美腿欧美偷拍| 欧美日韩一区二区三区高清 | 欧美久久婷婷综合色| 免费观看一级特黄欧美大片| 久久嫩草精品久久久久| 成人av午夜电影| 一区二区三区日韩欧美| 91超碰这里只有精品国产| 韩国精品久久久| 国产精品激情偷乱一区二区∴| 色综合天天做天天爱| 婷婷中文字幕一区三区| 欧美精品一区二| a级高清视频欧美日韩| 亚洲成a人v欧美综合天堂| 精品处破学生在线二十三| 成人av小说网| 午夜欧美电影在线观看| 亚洲精品一区二区三区影院| 成人a区在线观看| 亚洲成人综合视频| 久久奇米777| 在线观看视频一区| 久久99最新地址| 亚洲色图丝袜美腿| 91精品国产福利| 不卡的电视剧免费网站有什么| 亚洲成人7777| 中文字幕免费一区| 欧美疯狂做受xxxx富婆| 国产成人免费视| 香港成人在线视频| 欧美国产精品劲爆| 欧美巨大另类极品videosbest| 国产成人精品亚洲777人妖| 亚洲国产一区在线观看| 国产亚洲一本大道中文在线| 在线观看亚洲a| 国产**成人网毛片九色 | 91小视频免费观看| 精品一区二区三区视频在线观看| 亚洲女人的天堂| 精品日韩一区二区三区| 欧美视频一区二区三区在线观看| 国产乱人伦偷精品视频不卡 | www.日韩精品| 毛片不卡一区二区| 亚洲一区在线观看视频| 欧美激情综合五月色丁香 | 亚洲男人的天堂一区二区| 精品日韩一区二区| 欧美日韩国产123区| 成人av免费网站| 国内精品免费**视频| 日韩精品一级二级| 夜夜嗨av一区二区三区网页| 国产日韩欧美在线一区| 日韩欧美一级二级三级久久久| 欧美在线一区二区| 91在线观看一区二区| 国产一区在线看| 久久精品99久久久| 午夜av电影一区| 亚洲国产视频网站| 亚洲三级电影全部在线观看高清| 精品sm在线观看| 欧美成人aa大片| 日韩视频一区二区| 欧美区视频在线观看| 欧美三级电影精品| 色噜噜狠狠成人中文综合| 暴力调教一区二区三区| 丁香五精品蜜臀久久久久99网站| 精品一区二区影视| 精品无人码麻豆乱码1区2区 | 成人免费毛片嘿嘿连载视频| 国产精品一二一区| 国产美女视频91| 国产精品99久久久久久久女警 | 色综合久久88色综合天天| 成人av免费在线观看| 成人精品视频一区二区三区|