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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcp_in.c

?? 一個輕量tcpip協議在移植在ucOS2系統上運行
?? C
?? 第 1 頁 / 共 3 頁
字號:
#endif /* LWIP_CALLBACK_API */
    
    /* Register the new PCB so that we can begin receiving segments
       for it. */
    TCP_REG(&tcp_active_pcbs, npcb);
    
    /* Parse any options in the SYN. */
    tcp_parseopt(npcb);
    
    /* Build an MSS option. */
    optdata = htonl(((u32_t)2 << 24) | 
		    ((u32_t)4 << 16) | 
		    (((u32_t)npcb->mss / 256) << 8) |
		    (npcb->mss & 255));
    /* Send a SYN|ACK together with the MSS option. */
    tcp_enqueue(npcb, NULL, 0, TCP_SYN | TCP_ACK, 0, (u8_t *)&optdata, 4);
    return tcp_output(npcb);
  }
  return ERR_OK;
}
/*-----------------------------------------------------------------------------------*/
/* tcp_timewait_input():
 *
 * Called by tcp_input() when a segment arrives for a connection in
 * TIME_WAIT.
 */
/*-----------------------------------------------------------------------------------*/
static err_t
tcp_timewait_input(struct tcp_pcb *pcb)
{
  if(TCP_SEQ_GT(seqno + tcplen, pcb->rcv_nxt)) {
    pcb->rcv_nxt = seqno + tcplen;
  }
  if(tcplen > 0) {
    tcp_ack_now(pcb);
  }
  return tcp_output(pcb);
}
/*-----------------------------------------------------------------------------------*/
/* tcp_process
 *
 * Implements the TCP state machine. Called by tcp_input. In some
 * states tcp_receive() is called to receive data. The tcp_seg
 * argument will be freed by the caller (tcp_input()) unless the
 * recv_data pointer in the pcb is set.
 */
/*-----------------------------------------------------------------------------------*/
static err_t
tcp_process(struct tcp_pcb *pcb)
{
  struct tcp_seg *rseg;
  u8_t acceptable = 0;
  err_t err;
  

  err = ERR_OK;
  
  /* Process incoming RST segments. */
  if(flags & TCP_RST) {
    /* First, determine if the reset is acceptable. */
    if(pcb->state == SYN_SENT) {
      if(ackno == pcb->snd_nxt) {
	acceptable = 1;
      }
    } else {
      if(TCP_SEQ_GEQ(seqno, pcb->rcv_nxt) &&
	 TCP_SEQ_LEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {
	acceptable = 1;
      }
    }
    
    if(acceptable) {
      DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n"));
      LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED);
      recv_flags = TF_RESET;
      pcb->flags &= ~TF_ACK_DELAY;
      return ERR_RST;
    } else {
      DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: unacceptable reset seqno %lu rcv_nxt %lu\n",
	     seqno, pcb->rcv_nxt));
      DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %lu rcv_nxt %lu\n",
	     seqno, pcb->rcv_nxt));
      return ERR_OK;
    }
  }

  /* Update the PCB (in)activity timer. */
  pcb->tmr = tcp_ticks;
  
  /* Do different things depending on the TCP state. */
  switch(pcb->state) {
  case SYN_SENT:
    DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %lu pcb->snd_nxt %lu unacked %lu\n", ackno,
	   pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno)));
    if(flags & (TCP_ACK | TCP_SYN) &&
       ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
      pcb->rcv_nxt = seqno + 1;
      pcb->lastack = ackno;
      pcb->snd_wnd = pcb->snd_wl1 = tcphdr->wnd;
      pcb->state = ESTABLISHED;
      pcb->cwnd = pcb->mss;
      --pcb->snd_queuelen;
      DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %d\n", pcb->snd_queuelen));
      rseg = pcb->unacked;
      pcb->unacked = rseg->next;
      tcp_seg_free(rseg);

      /* Parse any options in the SYNACK. */
      tcp_parseopt(pcb);

      /* Call the user specified function to call when sucessfully
	 connected. */
      TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
      tcp_ack(pcb);
    }    
    break;
  case SYN_RCVD:
    if(flags & TCP_ACK &&
       !(flags & TCP_RST)) {
      if(TCP_SEQ_LT(pcb->lastack, ackno) &&
	 TCP_SEQ_LEQ(ackno, pcb->snd_nxt)) {
        pcb->state = ESTABLISHED;
        DEBUGF(DEMO_DEBUG, ("TCP connection established %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest));
	LWIP_ASSERT("pcb->accept != NULL", pcb->accept != NULL);
	/* Call the accept function. */
	TCP_EVENT_ACCEPT(pcb, ERR_OK, err);
	if(err != ERR_OK) {
	  /* If the accept function returns with an error, we abort
	     the connection. */
	  tcp_abort(pcb);
	  return ERR_ABRT;
	}	
	/* If there was any data contained within this ACK,
	   we'd better pass it on to the application as well. */
	tcp_receive(pcb);
	pcb->cwnd = pcb->mss;
      }	
    }  
    break;
  case CLOSE_WAIT:
    /* FALLTHROUGH */
  case ESTABLISHED:
    tcp_receive(pcb);	  
    if(flags & TCP_FIN) {
      tcp_ack_now(pcb);
      pcb->state = CLOSE_WAIT;
    }
    break;
  case FIN_WAIT_1:
    tcp_receive(pcb);
    if(flags & TCP_FIN) {
      if(flags & TCP_ACK && ackno == pcb->snd_nxt) {
        DEBUGF(DEMO_DEBUG,
	       ("TCP connection closed %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest));
	tcp_ack_now(pcb);
	tcp_pcb_purge(pcb);
	TCP_RMV(&tcp_active_pcbs, pcb);
	pcb->state = TIME_WAIT;
	TCP_REG(&tcp_tw_pcbs, pcb);
      } else {
	tcp_ack_now(pcb);
	pcb->state = CLOSING;
      }
    } else if(flags & TCP_ACK && ackno == pcb->snd_nxt) {
      pcb->state = FIN_WAIT_2;
    }
    break;
  case FIN_WAIT_2:
    tcp_receive(pcb);
    if(flags & TCP_FIN) {
      DEBUGF(DEMO_DEBUG, ("TCP connection closed %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest));
      tcp_ack_now(pcb);
      tcp_pcb_purge(pcb);
      TCP_RMV(&tcp_active_pcbs, pcb);
      pcb->state = TIME_WAIT;
      TCP_REG(&tcp_tw_pcbs, pcb);
    }
    break;
  case CLOSING:
    tcp_receive(pcb);
    if(flags & TCP_ACK && ackno == pcb->snd_nxt) {
      DEBUGF(DEMO_DEBUG, ("TCP connection closed %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest));
      tcp_ack_now(pcb);
      tcp_pcb_purge(pcb);
      TCP_RMV(&tcp_active_pcbs, pcb);
      pcb->state = TIME_WAIT;
      TCP_REG(&tcp_tw_pcbs, pcb);
    }
    break;
  case LAST_ACK:
    tcp_receive(pcb);
    if(flags & TCP_ACK && ackno == pcb->snd_nxt) {
      DEBUGF(DEMO_DEBUG, ("TCP connection closed %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest));
      pcb->state = CLOSED;
      recv_flags = TF_CLOSED;
    }
    break;
  default:
    break;
  }
  
  return ERR_OK;
}
/*-----------------------------------------------------------------------------------*/
/* tcp_receive:
 *
 * Called by tcp_process. Checks if the given segment is an ACK for outstanding
 * data, and if so frees the memory of the buffered data. Next, is places the
 * segment on any of the receive queues (pcb->recved or pcb->ooseq). If the segment
 * is buffered, the pbuf is referenced by pbuf_ref so that it will not be freed until
 * i it has been removed from the buffer.
 *
 * If the incoming segment constitutes an ACK for a segment that was used for RTT
 * estimation, the RTT is estimated here as well.
 */
/*-----------------------------------------------------------------------------------*/
static void
tcp_receive(struct tcp_pcb *pcb)
{
  struct tcp_seg *next;
#if TCP_QUEUE_OOSEQ
  struct tcp_seg *prev, *cseg;
#endif
  struct pbuf *p;
  s32_t off;
  int m;
  u32_t right_wnd_edge;

      
  if(flags & TCP_ACK) {
    right_wnd_edge = pcb->snd_wnd + pcb->snd_wl1;

    /* Update window. */
    if(TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
       (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
       (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
      pcb->snd_wnd = tcphdr->wnd;
      pcb->snd_wl1 = seqno;
      pcb->snd_wl2 = ackno;
      DEBUGF(TCP_WND_DEBUG, ("tcp_receive: window update %lu\n", pcb->snd_wnd));
#if TCP_WND_DEBUG
    } else {
      if(pcb->snd_wnd != tcphdr->wnd) {
        DEBUGF(TCP_WND_DEBUG, ("tcp_receive: no window update lastack %lu snd_max %lu ackno %lu wl1 %lu seqno %lu wl2 %lu\n",
                               pcb->lastack, pcb->snd_max, ackno, pcb->snd_wl1, seqno, pcb->snd_wl2));
      }
#endif /* TCP_WND_DEBUG */
    }
    

    if(pcb->lastack == ackno) {
      pcb->acked = 0;

      if(pcb->snd_wl1 + pcb->snd_wnd == right_wnd_edge){
	++pcb->dupacks;
	if(pcb->dupacks >= 3 && pcb->unacked != NULL) {
	  if(!(pcb->flags & TF_INFR)) {
	    /* This is fast retransmit. Retransmit the first unacked segment. */
	    DEBUGF(TCP_FR_DEBUG, ("tcp_receive: dupacks %d (%lu), fast retransmit %lu\n",
				  pcb->dupacks, pcb->lastack,
				  ntohl(pcb->unacked->tcphdr->seqno)));
	    tcp_rexmit(pcb);
	    /* Set ssthresh to max (FlightSize / 2, 2*SMSS) */
	    pcb->ssthresh = UMAX((pcb->snd_max -
				  pcb->lastack) / 2,
				 2 * pcb->mss);
	    
	    pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;
	    pcb->flags |= TF_INFR;          
	  } else {
	    /* Inflate the congestion window, but not if it means that
	       the value overflows. */
	    if((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
	      pcb->cwnd += pcb->mss;
	    }
	  }
	}
      } else {
	DEBUGF(TCP_FR_DEBUG, ("tcp_receive: dupack averted %lu %lu\n",
			      pcb->snd_wl1 + pcb->snd_wnd, right_wnd_edge));	
      }
    } else if(TCP_SEQ_LT(pcb->lastack, ackno) &&
              TCP_SEQ_LEQ(ackno, pcb->snd_max)) {
      /* We come here when the ACK acknowledges new data. */

      /* Reset the "IN Fast Retransmit" flag, since we are no longer
         in fast retransmit. Also reset the congestion window to the
         slow start threshold. */
      if(pcb->flags & TF_INFR) {
	pcb->flags &= ~TF_INFR;
	pcb->cwnd = pcb->ssthresh;
      }

      /* Reset the number of retransmissions. */
      pcb->nrtx = 0;
      
      /* Reset the retransmission time-out. */
      pcb->rto = (pcb->sa >> 3) + pcb->sv;
      
      /* Update the send buffer space. */
      pcb->acked = ackno - pcb->lastack;
      pcb->snd_buf += pcb->acked;

      /* Reset the fast retransmit variables. */
      pcb->dupacks = 0;
      pcb->lastack = ackno;
      
      /* Update the congestion control variables (cwnd and
         ssthresh). */
      if(pcb->state >= ESTABLISHED) {
        if(pcb->cwnd < pcb->ssthresh) {
	  if((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
	    pcb->cwnd += pcb->mss;
	  }
          DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %u\n", pcb->cwnd));
        } else {
	  u16_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd);
	  if(new_cwnd > pcb->cwnd) {
	    pcb->cwnd = new_cwnd;
	  }
          DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: congestion avoidance cwnd %u\n", pcb->cwnd)); 
        }
      }
      DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: ACK for %lu, unacked->seqno %lu:%lu\n",
                               ackno,
                               pcb->unacked != NULL?
                               ntohl(pcb->unacked->tcphdr->seqno): 0,
                               pcb->unacked != NULL?
                               ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));

      /* Remove segment from the unacknowledged list if the incoming
	 ACK acknowlegdes them. */
      while(pcb->unacked != NULL && 
	    TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) +
			TCP_TCPLEN(pcb->unacked), ackno)) {
	DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %lu:%lu from pcb->unacked\n",
				 ntohl(pcb->unacked->tcphdr->seqno),
				 ntohl(pcb->unacked->tcphdr->seqno) +
				 TCP_TCPLEN(pcb->unacked)));

	next = pcb->unacked;
	pcb->unacked = pcb->unacked->next;
	
	DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %d ... ", pcb->snd_queuelen));
	pcb->snd_queuelen -= pbuf_clen(next->p);
	tcp_seg_free(next);
	
	DEBUGF(TCP_QLEN_DEBUG, ("%d (after freeing unacked)\n", pcb->snd_queuelen));
	if(pcb->snd_queuelen != 0) {
	  LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL ||
		 pcb->unsent != NULL);      
	}
      }
      pcb->polltmr = 0;
    }

      /* We go through the ->unsent list to see if any of the segments
         on the list are acknowledged by the ACK. This may seem
         strange since an "unsent" segment shouldn't be acked. The
         rationale is that lwIP puts all outstanding segments on the
         ->unsent list after a retransmission, so these segments may
         in fact have been sent once. */
      while(pcb->unsent != NULL && 
	    TCP_SEQ_LEQ(ntohl(pcb->unsent->tcphdr->seqno) + TCP_TCPLEN(pcb->unsent),
                        ackno) &&
	    TCP_SEQ_LEQ(ackno, pcb->snd_max)) {
	DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %lu:%lu from pcb->unsent\n",
				 ntohl(pcb->unsent->tcphdr->seqno),
				 ntohl(pcb->unsent->tcphdr->seqno) +
				 TCP_TCPLEN(pcb->unsent)));

	next = pcb->unsent;
	pcb->unsent = pcb->unsent->next;
	DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %d ... ", pcb->snd_queuelen));
	pcb->snd_queuelen -= pbuf_clen(next->p);
	tcp_seg_free(next);
	DEBUGF(TCP_QLEN_DEBUG, ("%d (after freeing unsent)\n", pcb->snd_queuelen));
	if(pcb->snd_queuelen != 0) {
	  LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL ||
		 pcb->unsent != NULL);      
	}
	
        if(pcb->unsent != NULL) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品ww久久久久久p站| 中文一区一区三区高中清不卡| 成人av资源网站| 国产麻豆一精品一av一免费| 国产在线不卡视频| 国产精品一卡二卡| 成人毛片在线观看| 99久久99久久精品免费观看| 91麻豆免费观看| 欧美日韩国产首页| 欧美一级爆毛片| 久久免费精品国产久精品久久久久| 精品乱人伦小说| 国产精品美女久久久久aⅴ | 午夜av一区二区| 日韩成人精品视频| 精品一区二区久久久| 国产大陆a不卡| 97成人超碰视| 在线综合亚洲欧美在线视频| 2023国产精品自拍| 国产精品情趣视频| 午夜av区久久| 成人免费毛片aaaaa**| av一区二区不卡| 国产欧美日韩精品一区| 国产亲近乱来精品视频| 亚洲黄色av一区| 精品一区二区免费视频| 色综合久久久久网| 日韩免费福利电影在线观看| 一区视频在线播放| 日韩综合小视频| 高清在线成人网| 欧美人伦禁忌dvd放荡欲情| 久久综合av免费| 一区二区欧美精品| 国产成人在线视频网站| 精品视频在线看| 中文字幕精品三区| 日本亚洲视频在线| 色94色欧美sute亚洲线路一ni| 日韩视频免费观看高清完整版 | 精品福利一区二区三区免费视频| 国产视频一区二区三区在线观看| 午夜精品福利视频网站| 国产成a人亚洲精| 日韩欧美一级在线播放| 亚洲综合在线免费观看| 成人永久看片免费视频天堂| 制服丝袜中文字幕亚洲| 一区二区三区丝袜| 不卡视频在线观看| 久久精品一区二区三区不卡| 麻豆精品视频在线观看免费| 欧美性猛片aaaaaaa做受| 中文字幕一区在线观看| 国产乱码字幕精品高清av| 欧美精品aⅴ在线视频| 亚洲人成影院在线观看| 成人久久久精品乱码一区二区三区| 欧美一卡2卡3卡4卡| 亚洲成人av一区二区| 91国内精品野花午夜精品 | 日本精品视频一区二区| 中文字幕成人av| 国产成人亚洲综合a∨婷婷| 精品奇米国产一区二区三区| 日日骚欧美日韩| 欧美另类变人与禽xxxxx| 一区二区三区在线视频观看58| caoporen国产精品视频| 国产欧美日韩精品在线| 成人av网址在线| 国产精品久久久久久久久搜平片| 国产不卡在线视频| 国产欧美日韩综合| 成人免费毛片aaaaa**| 国产精品入口麻豆原神| a4yy欧美一区二区三区| 亚洲精品乱码久久久久久| 91久久精品一区二区三| 亚洲高清免费观看 | 国产在线观看一区二区| 久久精品在这里| av在线不卡网| 亚洲一区影音先锋| 91麻豆精品国产91久久久 | 午夜欧美大尺度福利影院在线看| 欧美怡红院视频| 麻豆精品国产91久久久久久| 国产婷婷精品av在线| av一区二区三区黑人| 亚洲图片欧美视频| 日韩三级视频在线观看| 国产精品亚洲午夜一区二区三区 | 欧美巨大另类极品videosbest | 亚洲品质自拍视频网站| 884aa四虎影成人精品一区| 激情综合色丁香一区二区| 国产日韩欧美在线一区| 色视频欧美一区二区三区| 蜜桃一区二区三区在线观看| 欧美激情综合在线| 欧美日韩视频在线第一区| 国产主播一区二区| 亚洲国产一区在线观看| 国产偷v国产偷v亚洲高清| 欧美在线观看18| 国产精品一二二区| 亚洲成人午夜电影| 国产欧美精品区一区二区三区| 色成人在线视频| 国产九色精品成人porny | 久久久久久亚洲综合| 91福利国产精品| 国产精品综合久久| 亚洲aⅴ怡春院| 国产精品不卡一区| 欧美v亚洲v综合ⅴ国产v| 91麻豆成人久久精品二区三区| 丝袜a∨在线一区二区三区不卡| 国产清纯白嫩初高生在线观看91 | 久久综合色鬼综合色| 在线日韩av片| 国产成人免费视| 美国三级日本三级久久99| 亚洲精品日韩一| 欧美韩国日本综合| 精品精品国产高清一毛片一天堂| 欧美亚洲自拍偷拍| 99视频在线精品| 国产精品一区二区在线观看网站| 性做久久久久久免费观看| 亚洲三级电影全部在线观看高清| 久久奇米777| 日韩精品一区二区在线| 欧美日本在线观看| 欧美中文一区二区三区| 色婷婷久久久亚洲一区二区三区| 国产精品77777| 经典三级在线一区| 久久精品久久99精品久久| 日韩不卡一二三区| 日韩国产欧美视频| 婷婷综合五月天| 三级不卡在线观看| 日韩vs国产vs欧美| 日本不卡一区二区三区高清视频| 亚洲国产欧美另类丝袜| 亚洲一区二区在线视频| 一区二区三区精品久久久| 亚洲欧美精品午睡沙发| 亚洲免费观看高清在线观看| 亚洲欧洲日韩在线| 亚洲色图欧洲色图| 亚洲精品视频一区| 亚洲一区在线视频观看| 日韩精品一区第一页| 日韩电影在线免费看| 久久精品久久精品| 粉嫩在线一区二区三区视频| 成人性色生活片免费看爆迷你毛片| 国产夫妻精品视频| 色综合天天狠狠| 欧美一区二区三区的| 337p日本欧洲亚洲大胆色噜噜| 久久综合给合久久狠狠狠97色69| 日本一区二区高清| 一个色在线综合| 麻豆国产精品一区二区三区| 国产电影一区在线| 欧美午夜精品电影| 欧美岛国在线观看| 中日韩av电影| 亚洲 欧美综合在线网络| 蓝色福利精品导航| 99视频热这里只有精品免费| 欧美亚洲精品一区| 久久综合九色欧美综合狠狠| 亚洲视频资源在线| 日本麻豆一区二区三区视频| 国产精品一级在线| 欧美日韩mp4| 国产日产欧产精品推荐色| 亚洲成a人片在线观看中文| 久久疯狂做爰流白浆xx| 99国产欧美久久久精品| 日韩欧美一级二级三级| 中文字幕日韩精品一区 | 国产乱子轮精品视频| 色哟哟国产精品| 欧美tickling网站挠脚心| 亚洲精品一二三四区| 国产九色精品成人porny| 欧美精品电影在线播放| 亚洲同性gay激情无套| 国产永久精品大片wwwapp| 精品婷婷伊人一区三区三| 国产精品国产三级国产aⅴ中文|