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

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

?? tcpip.c

?? 基于SPCE061A的TCPIP協議
?? C
?? 第 1 頁 / 共 3 頁
字號:
	cptEthHdrBuf->EthType = cEthType_Ip;
		
	if ((guwEthLen += 2*cEthHdrLen) < 60){
		guwEthLen = 60;
	}

send_eth:		
	ether_Send();		// 發送以太包
	guwEthLen = 0;		// 釋放緩沖區
}

//--------------------------------------------------------------------------------------
#if  TCP_ACTIVE_OPEN == 1
UINT16 msip_Connect(UINT16 uwLocalPort, UINT16 *puwRemoteIpAddr, UINT16 uwRemotePort){
	Conn_Stru *pConn;
	
	// 檢查本地端口是否在本機指定的范圍內
	if ((uwLocalPort < cLocalPortStart) && (uwLocalPort > cLocalPortEnd)){
		return 0;
	}

	// 檢查本地端口是否已經分配或占用
	for (pConn = cptConnsStart; pConn < cptConnsEnd; pConn++){
		if ((pConn->TcpStateFlags != cTCP_CLOSED) && (pConn->LocalPort == uwLocalPort)){
			return 0;
		}
	}

	// 查找TCP事務中的未使用聯接(或已經關閉的聯接)
	for (pConn = cptConnsStart; pConn < cptConnsEnd; pConn++){
		if (pConn->TcpStateFlags == cTCP_CLOSED){
		// 構造一個主動聯接事務
			pConn->TcpStateFlags = cTCP_SYN_SENT|cTCP_OUTSTANDING;

			pConn->SeqNum[0] = guwISN[0];
			pConn->SeqNum[1] = guwISN[1];

			pConn->AckNum[0] = guwISN[0];
			pConn->AckNum[1] = guwISN[1];	
			if (++pConn->AckNum[1] == 0){
				++pConn->AckNum[0];
			}

			pConn->NumRetran = 0;
			pConn->Timer = 1; 
			pConn->LocalPort = uwLocalPort;
			pConn->RemotePort = uwRemotePort;
			pConn->RemoteIpAddr[0] = puwRemoteIpAddr[0];
			pConn->RemoteIpAddr[1] = puwRemoteIpAddr[1];
			pConn->MaxSegSize = 0;	// 遠端未知,初始化為:0

			return 1;
		}
	}
	// 找不到空閑的TCP聯接!
	return 0;
}
#endif

//--------------------------------------------------------------------------------------
UINT16 msip_Listen(UINT16 uwPort){
	UINT16 index;
	for (index = 0; index < cMaxListenPorts; index++){
		if (guwListenPorts[index] == 0){
			guwListenPorts[index] = uwPort;
			return 1;
		}
	}
	return 0;
}

//--------------------------------------------------------------------------------------
UINT16 msip_TcpChkSum(void){
	UINT16 SUM , temp;

// 獲取TCP段字節長度
	temp = cptIpHdrBuf->Len - ((cptIpHdrBuf->Vhl & 0x0f) << 2);

// 計算TCP頭和數據段的校驗和
	SUM = checksum(temp, cpTcpHdrBuf);

// 累加計算偽TCP頭的校驗和
	
	// 16bit TCP length
	if ((SUM += temp) < temp)
		++SUM;

	// 8bit Protocol
	if ((SUM += cptIpHdrBuf->Proto) < cptIpHdrBuf->Proto)
		++SUM;

	// Source IP Address
	if ((SUM += cptIpHdrBuf->SrcIpAddr[0]) < cptIpHdrBuf->SrcIpAddr[0])
		++SUM;

	if ((SUM += cptIpHdrBuf->SrcIpAddr[1]) < cptIpHdrBuf->SrcIpAddr[1])
		++SUM;

	// Destination IP Address
	if ((SUM += cptIpHdrBuf->DestIpAddr[0]) < cptIpHdrBuf->DestIpAddr[0])
		++SUM;

	if ((SUM += cptIpHdrBuf->DestIpAddr[1]) < cptIpHdrBuf->DestIpAddr[1])
		++SUM;

	return SUM;	
}

//--------------------------------------------------------------------------------------
void msip_Periodic(){
	// 增加初始序號
	if (++guwISN[1] == 0){
		++guwISN[0];
	}

	for (gptConn = cptConnsStart; gptConn < cptConnsEnd; gptConn++){
		msip_Process(cTCP_TIMER);
	}

	guwMsg_Route &= ~cM_TCP_PERIODIC;	// 清除TCP輪詢事件

}

//--------------------------------------------------------------------------------------
void msip_Process(UINT16 uwFlag){
	ArpEntries_Stru *pARP = cptArpTabEnd;	// 給他一個等價的空指針
	UINT16 i,j;

	switch (uwFlag){
	case cTCP_DATA:			// IP輸入處理
		goto ip_input;
	case cTCP_TIMER:		// 檢驗是否TCP事務論詢
		// goto tcp_Periodic;
	}
	
tcp_Periodic:

	guwEthLen = 0;

	if ((gptConn->TcpStateFlags == cTCP_TIME_WAIT) ||
		(gptConn->TcpStateFlags == cTCP_FIN_WAIT_2)){	// TIMER_WAIT狀態:2MSL等待!
		
		if (++gptConn->Timer == cTCP_TIME_WAIT_2MSL){	// 記錄等待超時時間,并判斷超時
			gptConn->TcpStateFlags = cTCP_CLOSED;		// 超時關閉聯接
		}
		
	} else if (gptConn->TcpStateFlags != cTCP_CLOSED){	// 如果是已經關閉的事務,就跳過!

		// 如果在OUTSTANDING狀態(本地已經發出包,但沒有收到回應),需要特殊的重傳處理!
		if (gptConn->TcpStateFlags & cTCP_OUTSTANDING){

			if (--gptConn->Timer == 0){		// 記錄等待時間,并校驗是否等待時間已過

				if (gptConn->NumRetran == cTCP_MAXRTX){		// 記錄重傳次數,并校驗是否到達最大重傳次數

					// 超過重傳次數......
					gptConn->TcpStateFlags = cTCP_CLOSED;	// 關閉聯接

					// 通知應用程序時間益出
					guwFlags = cTCP_TIMEDOUT;
					msip_APPCALL();
					
					// 發RSTACK包通知確認給遠端:本地已經異常停止連接!
  	 				cptTcpHdrBuf->Flags = cTCP_RST | cTCP_ACK;
  	 				
   					goto tcp_send_nodata;
				}

				// 等待時間的指數退避
				gptConn->Timer = cTCP_RTO << (gptConn->NumRetran > 4 ? 4 : gptConn->NumRetran);
				
				++gptConn->NumRetran;	// 記錄重傳次數
				
				// 重傳處理變遷
				switch (gptConn->TcpStateFlags & cTCP_TS_MASK){
				case cTCP_SYN_RCVD:		// SYN_RCVD狀態:發送SYNACK包
					goto tcp_send_synack;
			
#if TCP_ACTIVE_OPEN == 1
				case cTCP_SYN_SENT:		// SYN_SENT狀態:重發SYN包。
					cptTcpHdrBuf->Flags = 0;
					goto tcp_send_syn;
#endif
			
				case cTCP_ESTABLISHED:	// ESTABLISHED狀態:通知應用程序,需要重傳上次發出的數據包?。。?
					guwEthLen = 0;
					guwFlags = cTCP_REXMIT;
					msip_APPCALL();
					goto apprexmit;
				
				case cTCP_CLOSE_WAIT:
				case cTCP_LAST_ACK:			// LAST_ACK狀態,結束當前連接!
					goto tcp_send_finack;	// 重發FINACK包
				case cTCP_FIN_WAIT_1:
					goto tcp_send_finack;	// 重發FINACK包
				case cTCP_FIN_WAIT_2:
				case cTCP_CLOSING:
				case cTCP_TIME_WAIT:
				}
			}
		} else if ((gptConn->TcpStateFlags & cTCP_TS_MASK) == cTCP_ESTABLISHED){
			// ESTABLISHED狀態,通知應用程序允許發送數據。
			guwEthLen = 0;
			guwFlags = cTCP_POLL;
			msip_APPCALL();
			goto appsend;
		}
	}
	
	goto drop;

// IP輸入處理線程
ip_input:

	// IP頭校驗:IP version and header length. vIP4
	if(cptIpHdrBuf->Vhl != cIP_VER_HLEN){ 
		goto drop;
	}

	// IP分片校驗:必須是最后幀才響應(隱含默認:不分片幀)。
	if (cptIpHdrBuf->Flags & cIP_MF){
		goto drop;
	}
	
	// 接收IP包的目標IP地址與本地不相同,丟棄!
	if((cptIpHdrBuf->DestIpAddr[0] != guwIpAddr[0]) ||
	   (cptIpHdrBuf->DestIpAddr[1] != guwIpAddr[1])){
		goto drop;
	}
		
	// 接收IP包的源地址是與本地相同,丟棄!說明遠端在做 DDos 攻擊?。。?!
	if((cptIpHdrBuf->SrcIpAddr[0] == guwIpAddr[0]) &&
		(cptIpHdrBuf->SrcIpAddr[1] == guwIpAddr[1])){
		goto drop;
	}

	// IP校驗和:錯誤丟棄!
	i = ((cptIpHdrBuf->Vhl & 0x0f) << 2);
	if (checksum(i, cpIpHdrBuf) != 0xffff){
		goto drop;
	}
	
	// 合法IP包:獲取IP包緩沖區長度
	guwEthLen = cptIpHdrBuf->Len;
	
	// 合法IP包:更新ARP表,并記錄更新后的映射表指針位置。
	pARP = msip_Arp_Update(cptIpHdrBuf->SrcIpAddr,cptEthHdrBuf->SrcEthAddr);


	// IP協議分組
	switch(cptIpHdrBuf->Proto){
	case cIP_PROTO_ICMP:				// 是否是ICMP包?
		goto icmp_input;
	case cIP_PROTO_TCP:					// 是否TCP包?
		goto tcp_input;
	default:							// 不是我們能處理的包,丟棄!
		goto drop;
	}

	
// ICMP處理線程
icmp_input:

	// ICMP處理:只接受 ping 呼叫,否則丟棄!
	if (cptIcmpHdrBuf->Type != cICMP_ECHO){
		goto drop;
	}

	// 校驗 ICMP CheckSum
	i = cptIpHdrBuf->Len - ((cptIpHdrBuf->Vhl & 0x0f) << 2);
	if (checksum(i, cpIcmpHdrBuf) != 0xffff){
		goto drop;
	}
	
	// 處理ICMP的 ping 回應
	cptIcmpHdrBuf->Type = cICMP_ECHO_REPLY;
	
	// 計算 ICMP PING REPLY ChkSum
	if((cptIcmpHdrBuf->ChkSum += (cICMP_ECHO << 8)) < (cICMP_ECHO << 8)){
		cptIcmpHdrBuf->ChkSum += 1;
	} 

	// Swap IP addresses.
	cptIpHdrBuf->SrcIpAddr[0]  ^= cptIpHdrBuf->DestIpAddr[0];
	cptIpHdrBuf->DestIpAddr[0] ^= cptIpHdrBuf->SrcIpAddr[0];
	cptIpHdrBuf->SrcIpAddr[0]  ^= cptIpHdrBuf->DestIpAddr[0];
	
	cptIpHdrBuf->SrcIpAddr[1]  ^= cptIpHdrBuf->DestIpAddr[1];
	cptIpHdrBuf->DestIpAddr[1] ^= cptIpHdrBuf->SrcIpAddr[1];
	cptIpHdrBuf->SrcIpAddr[1]  ^= cptIpHdrBuf->DestIpAddr[1];

	goto send;	// 發送IP包

// TCP線程處理
tcp_input:
	
	// 校驗 TCP checksum.
	if (msip_TcpChkSum() != 0xffff){
		goto drop;
	}

	// 是否是已經存在的TCP事務聯接
	for (gptConn = cptConnsStart; gptConn < cptConnsEnd; gptConn++){

		if  ((gptConn->TcpStateFlags != cTCP_CLOSED) &&
			(cptIpHdrBuf->SrcIpAddr[0] == gptConn->RemoteIpAddr[0]) &&
			(cptIpHdrBuf->SrcIpAddr[1] == gptConn->RemoteIpAddr[1]) &&
			(cptTcpHdrBuf->DestPort == gptConn->LocalPort) &&
			(cptTcpHdrBuf->SrcPort == gptConn->RemotePort)){

			goto found;
		}
	}
	
	// 如果是不存在的TCP事務:(遠端發同步連接請求)
	if (cptTcpHdrBuf->Flags & cTCP_SYN){
	// 1)如果是SYN請求聯接包,就偵聽本地聯接
		for (i = 0; (i < cMaxListenPorts) && (guwListenPorts[i] != 0); i++){
			if (cptTcpHdrBuf->DestPort == guwListenPorts[i]){
				goto found_listen;
			}
		}
	} 

	// 2)如果也不是SYN請求聯接包,就發送RSTACK,通知遠端本地異常終止該連接?。。。ò氪蜷_狀態)
	// goto reset;	// UIP模式
	goto drop;		// 采用丟棄,防止不相關DDoS攻擊?。?!


reset:	// 本地異常終止連接處理:發送 RSTACK 包

	// 如果接到的是RSTACK包,不響應!
	if (cptTcpHdrBuf->Flags & cTCP_RST){
		goto drop;
	}

	// 準備發送RSTACK包
	guwEthLen = 2*(cIpHdrLen + cTcpHdrLen);
	cptTcpHdrBuf->HdrLen = cTCP_HDR_NOOPT;
	cptTcpHdrBuf->Flags = cTCP_RST|cTCP_ACK;
	
	// 直接使用遠端的SeqNum和AckNum變換為本地的......
	cptTcpHdrBuf->SeqNum[0] ^= cptTcpHdrBuf->AckNum[0];
	cptTcpHdrBuf->AckNum[0] ^= cptTcpHdrBuf->SeqNum[0];
	cptTcpHdrBuf->SeqNum[0] ^= cptTcpHdrBuf->AckNum[0];
	cptTcpHdrBuf->SeqNum[1] ^= cptTcpHdrBuf->AckNum[1];
	cptTcpHdrBuf->AckNum[1] ^= cptTcpHdrBuf->SeqNum[1];
	cptTcpHdrBuf->SeqNum[1] ^= cptTcpHdrBuf->AckNum[1];

	// AckNum加1(SYN邏輯的需要)
	if (++cptTcpHdrBuf->AckNum[1] == 0){
		++cptTcpHdrBuf->AckNum[0];
	}

	// 交換端口
	cptTcpHdrBuf->SrcPort ^= cptTcpHdrBuf->DestPort;
	cptTcpHdrBuf->DestPort ^= cptTcpHdrBuf->SrcPort;
	cptTcpHdrBuf->SrcPort ^= cptTcpHdrBuf->DestPort;

	// 交換IP
	cptIpHdrBuf->SrcIpAddr[0]  ^= cptIpHdrBuf->DestIpAddr[0];
	cptIpHdrBuf->DestIpAddr[0] ^= cptIpHdrBuf->SrcIpAddr[0];
	cptIpHdrBuf->SrcIpAddr[0]  ^= cptIpHdrBuf->DestIpAddr[0];
	cptIpHdrBuf->SrcIpAddr[1]  ^= cptIpHdrBuf->DestIpAddr[1];
	cptIpHdrBuf->DestIpAddr[1] ^= cptIpHdrBuf->SrcIpAddr[1];
	cptIpHdrBuf->SrcIpAddr[1]  ^= cptIpHdrBuf->DestIpAddr[1];

	// 發送RSTACK包
	goto tcp_send_noconn;

// 如果接收的是SYN請求包,本地又有空閑的TCP事務連接
// 1)創建TCP事務連接
// 2)發送SYNACK,進入cTCP_SYN_RCVD|cTCP_OUTSTANDING狀態
found_listen:
	// 查找空閑的TCP聯接
	for (gptConn = cptConnsStart; gptConn < cptConnsEnd; gptConn++){
		if ((gptConn->TcpStateFlags == cTCP_CLOSED) ||

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美一区二区精品性| 在线不卡a资源高清| 国产欧美日韩不卡免费| 国产精品996| 综合激情网...| 欧美日韩在线播放| 狠狠色狠狠色综合系列| 久久欧美中文字幕| 99久久婷婷国产综合精品| 玉足女爽爽91| 日韩精品一区二区三区三区免费 | 国产精品综合在线视频| 国产欧美一区视频| 91在线观看美女| 视频一区中文字幕国产| 亚洲精品一区二区在线观看| 丁香一区二区三区| 亚洲综合色视频| 日韩精品一区二区三区视频在线观看 | 欧美日韩免费视频| 久久精品国产网站| 亚洲人成网站色在线观看| 欧美日韩亚洲国产综合| 国产原创一区二区| 一区二区三区欧美久久| 日韩视频在线永久播放| 成人av集中营| 青青草成人在线观看| 国产精品久久久久久久久免费丝袜 | 粉嫩av亚洲一区二区图片| 一区二区三区在线观看欧美| 日韩免费高清av| 99久久婷婷国产| 精品在线播放免费| 亚洲综合色噜噜狠狠| 久久久精品综合| 欧美日本乱大交xxxxx| 国产精品1024| 美国十次综合导航| 玉足女爽爽91| 国产精品人妖ts系列视频| 777奇米四色成人影色区| 91香蕉视频黄| 韩国在线一区二区| 日韩一区精品字幕| 夜夜亚洲天天久久| 国产精品每日更新| 久久品道一品道久久精品| 欧美精品免费视频| 91蜜桃网址入口| 国产成人免费视频网站| 久久99精品国产.久久久久久| 一区二区在线观看免费| 国产精品久久久久7777按摩| 精品国产亚洲在线| 欧美高清性hdvideosex| 色综合天天狠狠| 成人深夜在线观看| 国产一区激情在线| 久久成人免费网| 蜜臀久久久久久久| 天堂久久久久va久久久久| 综合久久国产九一剧情麻豆| 国产欧美视频一区二区| 精品成人一区二区| 精品国产伦一区二区三区观看方式 | 欧美狂野另类xxxxoooo| 在线国产亚洲欧美| 在线观看成人小视频| 色综合av在线| 91浏览器在线视频| 日本电影亚洲天堂一区| 一本大道av一区二区在线播放| 成人伦理片在线| 91在线码无精品| 色av成人天堂桃色av| 日本精品视频一区二区三区| 91免费在线看| 欧美艳星brazzers| 欧美二区在线观看| 91精品麻豆日日躁夜夜躁| 精品成人免费观看| 日韩视频一区二区在线观看| 日韩亚洲欧美一区二区三区| 日韩午夜精品电影| 久久免费美女视频| 国产精品美日韩| 一区二区三区中文字幕在线观看| 亚洲小说春色综合另类电影| 一区二区三区精品视频在线| 亚洲国产欧美日韩另类综合| 午夜精品视频在线观看| 日韩福利视频网| 韩日欧美一区二区三区| av在线免费不卡| 欧美无砖专区一中文字| 欧美丰满少妇xxxxx高潮对白| 日韩一级片网址| 久久久久久久久久久黄色 | 国产精品久久久久久久久久久免费看 | 国产麻豆一精品一av一免费 | 亚洲不卡av一区二区三区| 水蜜桃久久夜色精品一区的特点| 裸体一区二区三区| 成人h版在线观看| 精品视频色一区| 26uuu欧美| 亚洲精品老司机| 麻豆精品久久精品色综合| 国产成人av电影在线观看| 91国产免费看| 精品成人在线观看| 亚洲男帅同性gay1069| 日本系列欧美系列| 丰满亚洲少妇av| 欧美日本精品一区二区三区| 日韩免费一区二区| 亚洲人成网站在线| 精品在线视频一区| 欧洲一区二区三区免费视频| 欧美va日韩va| 亚洲小少妇裸体bbw| 国产老妇另类xxxxx| 精品视频一区二区不卡| 欧美国产亚洲另类动漫| 日本亚洲欧美天堂免费| 99国产一区二区三精品乱码| 国产女同互慰高潮91漫画| 一区二区三区日韩在线观看| 国产乱码精品一区二区三区忘忧草 | 精品视频在线免费观看| 国产日产欧美一区| 日日欢夜夜爽一区| 91在线观看高清| 久久久不卡网国产精品二区| 亚洲自拍与偷拍| aaa亚洲精品| 久久久久久久网| 久久精品国产亚洲一区二区三区 | 美女性感视频久久| 日本韩国欧美一区二区三区| 精品1区2区在线观看| 日韩中文字幕区一区有砖一区| 99国内精品久久| 国产精品天美传媒| 国产一区二区三区四区五区美女| 欧美日韩视频在线观看一区二区三区| 国产精品毛片久久久久久久| 激情图片小说一区| 欧美电影免费观看完整版| 亚洲电影你懂得| 欧美日韩日本视频| 亚洲国产日韩一级| 欧美在线短视频| 亚洲人成在线观看一区二区| 国产91富婆露脸刺激对白| 欧美精品一区二区不卡| 精品一区精品二区高清| 国产成a人亚洲| 久草这里只有精品视频| 国产精品99久久久久久有的能看| 欧美日韩国产片| 亚洲一区在线观看视频| 91毛片在线观看| 中文字幕国产精品一区二区| 欧美剧情电影在线观看完整版免费励志电影 | 色婷婷av一区二区三区大白胸| 亚洲综合在线电影| 日韩美一区二区三区| 成人看片黄a免费看在线| 一区二区三区小说| 亚洲精品日韩一| 7777精品久久久大香线蕉 | 91玉足脚交白嫩脚丫在线播放| 亚洲尤物在线视频观看| 精品免费视频一区二区| 成人av网站免费观看| 丝袜亚洲精品中文字幕一区| 国产午夜久久久久| 欧美熟乱第一页| 国产一区二区主播在线| 亚洲自拍偷拍网站| 久久久99免费| 欧美日韩国产天堂| a在线欧美一区| 蜜臀精品久久久久久蜜臀| 综合中文字幕亚洲| 日韩欧美一区二区在线视频| 99国产精品久久久久久久久久| 麻豆精品国产传媒mv男同| 亚洲素人一区二区| 久久精品一区八戒影视| 欧美日韩亚洲综合| 成人av电影观看| 精品一区二区综合| 午夜伊人狠狠久久| 一区二区三区资源| 国产精品国产自产拍高清av| 欧美大胆一级视频| 欧美日本高清视频在线观看|