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

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

?? tcp.c

?? arm環境下開發以太網的程序
?? C
?? 第 1 頁 / 共 3 頁
字號:

		// Check to make sure that we received a TX Buffer
		if(ps->TxBuffer == INVALID_BUFFER)
			return FALSE;

		ps->TxCount = 0;

		IPSetTxBuffer(ps->TxBuffer, sizeof(TCP_HEADER));
	}

	ps->Flags.bIsTxInProgress = TRUE;

	MACPut(byte);
	ps->RemoteWindow--;

	if(++ps->TxCount >= MAX_TCP_DATA_LEN)
		TCPFlush(s);

	return TRUE;
}

/*********************************************************************
* Function:        BOOL TCPDiscard(TCP_SOCKET s)
*
* PreCondition:    TCPInit() is already called.
*
* Input:           s       - socket
*
* Output:          TRUE if socket received data was discarded
*                  FALSE if socket received data was already
*                          discarded.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            None
********************************************************************/
BOOL TCPDiscard(TCP_SOCKET s)
{
	SOCKET_INFO* ps;

	ps = &TCB[s];

	// This socket must contain data for it to be discarded.
	if(!ps->Flags.bIsGetReady)
		return FALSE;

	MACDiscardRx();
	ps->Flags.bIsGetReady = FALSE;

	return TRUE;
}




/*********************************************************************
* Function:        WORD TCPGetArray(TCP_SOCKET s, BYTE *buffer,
*                                      WORD count)
*
* PreCondition:    TCPInit() is already called     AND
*                  TCPIsGetReady(s) == TRUE
*
* Input:           s       - socket
*                  buffer  - Buffer to hold received data.
*                  count   - Buffer length
*
* Output:          Number of bytes loaded into buffer.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            None
********************************************************************/
WORD TCPGetArray(TCP_SOCKET s, BYTE *buffer, WORD count)
{
	SOCKET_INFO *ps;

	ps = &TCB[s];

	if ( ps->Flags.bIsGetReady )
	{
		if ( ps->Flags.bFirstRead )
		{
			// Position read pointer to begining of TCP data
			IPSetRxBuffer(sizeof(TCP_HEADER));

			ps->Flags.bFirstRead = FALSE;
		}

		ps->Flags.bIsTxInProgress = TRUE;

		return MACGetArray(buffer, count);
	}
	else
		return 0;
}



/*********************************************************************
* Function:        BOOL TCPGet(TCP_SOCKET s, BYTE *byte)
*
* PreCondition:    TCPInit() is already called     AND
*                  TCPIsGetReady(s) == TRUE
*
* Input:           s       - socket
*                  byte    - Pointer to a byte.
*
* Output:          TRUE if a byte was read.
*                  FALSE if byte was not read.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            None
********************************************************************/
BOOL TCPGet(TCP_SOCKET s, BYTE *byte)
{
	SOCKET_INFO* ps;

	ps = &TCB[s];

	if ( ps->Flags.bIsGetReady )
	{
		if ( ps->Flags.bFirstRead )
		{
			// Position read pointer to begining of correct
			// buffer.
			IPSetRxBuffer(sizeof(TCP_HEADER));

			ps->Flags.bFirstRead = FALSE;

		}

		if ( ps->RxCount == 0 )
		{
			MACDiscardRx();
			ps->Flags.bIsGetReady = FALSE;
			return FALSE;
		}

		ps->RxCount--;
		*byte = MACGet();
		return TRUE;
	}
	return FALSE;
}



/*********************************************************************
* Function:        BOOL TCPIsGetReady(TCP_SOCKET s)
*
* PreCondition:    TCPInit() is already called.
*
* Input:           s       - socket to test
*
* Output:          TRUE if socket 's' contains any data.
*                  FALSE if socket 's' does not contain any data.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            None
********************************************************************/
BOOL TCPIsGetReady(TCP_SOCKET s)
{
	/*
	* A socket is said to be "Get" ready when it has already
	* received some data.  Sometime, a socket may be closed,
	* but it still may contain data.  Thus in order to ensure
	* reuse of a socket, caller must make sure that it reads
	* a socket, if is ready.
	*/
	return(TCB[s].Flags.bIsGetReady);
}



/*********************************************************************
* Function:        void TCPTick(void)
*
* PreCondition:    TCPInit() is already called.
*
* Input:           None
*
* Output:          Each socket FSM is executed for any timeout
*                  situation.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            None
********************************************************************/
void TCPTick(void)
{
	TCP_SOCKET s;
	TICK diffTicks;
	TICK tick;
	SOCKET_INFO* ps;
	DWORD seq;
	BYTE flags;

	flags = 0x00;
	// Periodically all "not closed" sockets must perform timed operations
	for(s = 0; s < MAX_SOCKETS; s++)
	{
		ps = &TCB[s];

		if ( ps->Flags.bIsGetReady || ps->Flags.bIsTxInProgress )
			continue;


		// Closed or Passively Listening socket do not care
		// about timeout conditions.
		if ( (ps->smState == TCP_CLOSED) ||
			(ps->smState == TCP_LISTEN &&
			ps->Flags.bServer == TRUE) )
			continue;

		tick = TickGet();

		// Calculate timeout value for this socket.
		diffTicks = TickGetDiff(tick, ps->startTick);

		// If timeout has not occured, do not do anything.
		if(diffTicks <= ps->TimeOut)
			continue;

		// Most states require retransmission, so check for transmitter
		// availability right here - common for all.
		if(!IPIsTxReady(TRUE))
			return;

		// Restart timeout reference.
		ps->startTick = TickGet();

		// Update timeout value if there is need to wait longer.
		ps->TimeOut <<= 1;

		// This will be one more attempt.
		ps->RetryCount++;

		// A timeout has occured.  Respond to this timeout condition
		// depending on what state this socket is in.
		switch(ps->smState)
		{
		case TCP_SYN_SENT:
			// Keep sending SYN until we hear from remote node.
			// This may be for infinite time, in that case
			// caller must detect it and do something.
			// Bug Fix: 11/1/02
			flags = SYN;
			break;

		case TCP_SYN_RECEIVED:
			// We must receive ACK before timeout expires.
			// If not, resend SYN+ACK.
			// Abort, if maximum attempts counts are reached.
			if(ps->RetryCount <= MAX_RETRY_COUNTS)
			{
				flags = SYN | ACK;
			}
			else
			{
				if(ps->Flags.bServer)
				{
					ps->smState = TCP_LISTEN;
				}
				else
				{
					flags = SYN;
					ps->smState = TCP_SYN_SENT;
				}
			}
			break;

		case TCP_ESTABLISHED:
#if !defined(TCP_NO_WAIT_FOR_ACK)
			// Don't let this connection idle for very long time.
			// If we did not receive or send any message before timeout
			// expires, close this connection.
			if(ps->RetryCount <= MAX_RETRY_COUNTS)
			{
				if(ps->TxBuffer != INVALID_BUFFER)
				{
					MACSetTxBuffer(ps->TxBuffer, 0);
					MACFlush();
				}
				else
					flags = ACK;
			}
			else
			{
				// Forget about previous transmission.
				if(ps->TxBuffer != INVALID_BUFFER)
				{
					MACDiscardTx(ps->TxBuffer);
					ps->TxBuffer = INVALID_BUFFER;
				}

#endif
				// Request closure.
				flags = FIN | ACK;
				DebugPrint("!");

				ps->smState = TCP_FIN_WAIT_1;
#if !defined(TCP_NO_WAIT_FOR_ACK)
			}
#endif
			break;

		case TCP_FIN_WAIT_1:
			if(ps->RetryCount <= MAX_RETRY_COUNTS)
			{
					// Send another FIN
					flags = FIN;
			}
			else
			{
				// Close on our own, we can't seem to communicate 
				// with the remote node anymore
				CloseSocket(ps);
			}
			break;

		case TCP_FIN_WAIT_2:
		case TCP_CLOSING:
			// Close on our own, we can't seem to communicate 
			// with the remote node anymore
			CloseSocket(ps);
			break;

		case TCP_TIME_WAIT:
			// Wait around for a while (2MSL) and then goto closed state
			CloseSocket(ps);
			break;
		
		case TCP_CLOSE_WAIT:
			flags = FIN;
			ps->smState = TCP_LAST_ACK;
			break;

		case TCP_LAST_ACK:
			// Send some more FINs or close anyway
			if(ps->RetryCount <= MAX_RETRY_COUNTS)
				flags = FIN;
			else
				CloseSocket(ps);
			break;
		}


		if(flags)
		{
			if(flags & ACK)
				seq = ps->SND_SEQ;
			else
				seq = ps->SND_SEQ++;

			SendTCP(&ps->remote,
				ps->localPort,
				ps->remotePort,
				seq,
				ps->SND_ACK,
				flags);
		}
	}
}



/*********************************************************************
* Function:        BOOL TCPProcess(NODE_INFO* remote,
*                                  IP_ADDR *localIP,
*                                  WORD len)
*
* PreCondition:    TCPInit() is already called     AND
*                  TCP segment is ready in MAC buffer
*
* Input:           remote      - Remote node info
*                  len         - Total length of TCP semgent.
*
* Output:          TRUE if this function has completed its task
*                  FALSE otherwise
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            None
********************************************************************/
BOOL TCPProcess(NODE_INFO *remote, IP_ADDR *localIP, WORD len)
{
	TCP_HEADER      TCPHeader;
	PSEUDO_HEADER   pseudoHeader;
	TCP_SOCKET      socket;
	WORD_VAL        checksum1;
	WORD_VAL        checksum2;
	BYTE            optionsSize;

	// Calculate IP pseudoheader checksum.
	pseudoHeader.SourceAddress      = remote->IPAddr;
	pseudoHeader.DestAddress        = *localIP;
	pseudoHeader.Zero               = 0x0;
	pseudoHeader.Protocol           = IP_PROT_TCP;
	pseudoHeader.TCPLength          = len;

	SwapPseudoTCPHeader(pseudoHeader);

	checksum1.Val = ~CalcIPChecksum((BYTE*)&pseudoHeader,
		sizeof(pseudoHeader));


	// Now calculate TCP packet checksum in NIC RAM - should match
	// pesudo header checksum
	checksum2.Val = CalcIPBufferChecksum(len);

	// Compare checksums.  Note that the endianness is different.
	if(checksum1.v[0] != checksum2.v[1] || checksum1.v[1] != checksum2.v[0])
	{
		MACDiscardRx();
		return TRUE;
	}

	// Retrieve TCP header.
	IPSetRxBuffer(0);
	MACGetArray((BYTE*)&TCPHeader, sizeof(TCPHeader));
	SwapTCPHeader(&TCPHeader);


	// Skip over options and retrieve all data bytes.
	optionsSize = (BYTE)((TCPHeader.DataOffset.Val << 2)-
		sizeof(TCPHeader));
	len = len - optionsSize - sizeof(TCPHeader);

	// Position packet read pointer to start of data area.
	IPSetRxBuffer((TCPHeader.DataOffset.Val << 2));

	// Find matching socket.
	socket = FindMatchingSocket(&TCPHeader, remote);
	if(socket != INVALID_SOCKET)
	{
		HandleTCPSeg(socket, remote, &TCPHeader, len);
	}
	else
	{
		// If this is an unknown socket, or we don't have any 
		// listening sockets available, discard it we can't 
		// process it right now
		MACDiscardRx();
		
//		// Send a RESET to the remote node is it knows that we 
//		// are not available
//		TCPHeader.AckNumber += len;
//		if( TCPHeader.Flags.bits.flagSYN ||
//			TCPHeader.Flags.bits.flagFIN )
//			TCPHeader.AckNumber++;
//		
//		SendTCP(remote,
//			TCPHeader.DestPort,
//			TCPHeader.SourcePort,
//			TCPHeader.AckNumber,
//			TCPHeader.SeqNumber,
//			RST);
	}

	return TRUE;
}


/*********************************************************************
* Function:        static void TransmitTCP(NODE_INFO* remote
*                                          TCP_PORT localPort,
*                                          TCP_PORT remotePort,
*                                          DWORD seq,
*                                          DWORD ack,
*                                          BYTE flags,
*                                          BUFFER buffer,
*                                          WORD len)
*
* PreCondition:    TCPInit() is already called     AND
*                  TCPIsPutReady() == TRUE
*
* Input:           remote      - Remote node info
*                  localPort   - Source port number
*                  remotePort  - Destination port number
*                  seq         - Segment sequence number
*                  ack         - Segment acknowledge number
*                  flags       - Segment flags
*                  buffer      - Buffer to which this segment
*                                is to be transmitted
*                  len         - Total data length for this segment.
*
* Output:          A TCP segment is assembled and put to transmit.
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            None
********************************************************************/
static void TransmitTCP(NODE_INFO *remote,
						TCP_PORT localPort,
						TCP_PORT remotePort,
						DWORD tseq,
						DWORD tack,
						BYTE flags,
						BUFFER buffer,
						WORD len)
{
	WORD_VAL        checkSum;
	TCP_HEADER      header;
	TCP_OPTIONS     options;
	PSEUDO_HEADER   pseudoHeader;

	//  Make sure that this Tx buffer isn't currently being transmitted
	while( !IPIsTxReady(TRUE) );	//TODO: This may need to be conditionally false

	// Obtain an AutoFree buffer if this packet is a control packet 
	// only (contains no application data in an already allocated 
	// buffer)
	if(buffer == INVALID_BUFFER)
		buffer = MACGetTxBuffer(TRUE);

	if(buffer == INVALID_BUFFER)
		return;

	IPSetTxBuffer(buffer, 0);

	header.SourcePort           = localPort;
	header.DestPort             = remotePort;
	header.SeqNumber            = tseq;
	header.AckNumber            = tack;
	header.Flags.bits.Reserved2 = 0;
	header.DataOffset.Reserved3 = 0;
	header.Flags.byte           = flags;
	// Receive window = MAC Free buffer size - TCP header (20) - IP header (20)
	//                  - ETHERNET header (14 if using NIC) .
	header.Window               = MACGetFreeRxSize();
#if !defined(STACK_USE_SLIP)
	/*
	* Limit one segment at a time from remote host.
	* This limit increases overall throughput as remote host does not
	* flood us with packets and later retry with significant delay.
	*/
	if ( header.Window >= MAC_RX_BUFFER_SIZE )
		header.Window = MAC_RX_BUFFER_SIZE;

	else if ( header.Window > 54 )
	{
		header.Window -= 54;
	}
	else
		header.Window = 0;
#else
	if ( header.Window > 40 )
	{
		header.Window -= 40;
	}
	else
		header.Window = 0;
#endif

	header.Checksum             = 0;
	header.UrgentPointer        = 0;

	SwapTCPHeader(&header);

	len += sizeof(header);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品丝袜中出| 日韩欧美一区电影| 欧美日韩情趣电影| 欧美白人最猛性xxxxx69交| 久久嫩草精品久久久久| 日韩伦理电影网| 自拍偷自拍亚洲精品播放| 亚洲成人免费在线观看| 国产一区二区91| 色乱码一区二区三区88| 欧美大片顶级少妇| 亚洲精品欧美综合四区| 激情综合五月婷婷| 欧美性三三影院| 久久久久久亚洲综合| 亚洲影院久久精品| 国产成人精品一区二| 欧美日韩国产综合一区二区三区| 国产日韩视频一区二区三区| 亚洲成av人影院在线观看网| 丁香天五香天堂综合| 91精品久久久久久久99蜜桃 | 欧美日韩国产高清一区二区三区 | 麻豆91在线看| 欧美色图片你懂的| 国产亚洲综合在线| 日韩综合小视频| 色综合久久66| 91精品国产欧美一区二区 | 国产成人鲁色资源国产91色综| 不卡的av中国片| 久久久午夜精品理论片中文字幕| 亚洲成人精品影院| 一本久久a久久精品亚洲| 久久久久久电影| 国产在线视频一区二区| 91麻豆精品国产91久久久使用方法| 亚洲欧洲日产国码二区| 久久99精品网久久| 日韩久久免费av| 亚洲1区2区3区4区| 91在线观看下载| 亚洲欧洲精品天堂一级 | 欧洲国内综合视频| 亚洲一区视频在线| 日韩视频免费观看高清完整版 | 蜜桃久久久久久| 精品女同一区二区| 国产69精品久久久久777| 中文字幕一区二区三区四区不卡| 99视频精品在线| 亚洲国产日韩a在线播放性色| 欧美系列在线观看| 老司机精品视频一区二区三区| 精品剧情在线观看| 91在线视频免费91| 日本vs亚洲vs韩国一区三区| 精品精品国产高清a毛片牛牛 | 国产精品色在线| 在线观看免费亚洲| 久久99精品网久久| 亚洲精品久久久久久国产精华液| 欧美视频自拍偷拍| 国产美女主播视频一区| 亚洲人成小说网站色在线| 欧美精品久久久久久久久老牛影院| 另类综合日韩欧美亚洲| 国产精品不卡在线观看| 欧美男生操女生| 粉嫩高潮美女一区二区三区| 亚洲综合丁香婷婷六月香| 精品国产一区二区在线观看| 色婷婷狠狠综合| 国内一区二区视频| 亚洲精品久久嫩草网站秘色| 精品国免费一区二区三区| 欧美制服丝袜第一页| 国产精品88av| 日本va欧美va瓶| 一区二区高清免费观看影视大全| 久久精品亚洲精品国产欧美| 欧美日韩国产精品自在自线| 成人永久看片免费视频天堂| 欧美96一区二区免费视频| 亚洲欧洲av另类| 亚洲精品在线观看网站| 欧美剧情片在线观看| 色婷婷综合久色| jvid福利写真一区二区三区| 久久91精品久久久久久秒播| 性做久久久久久| 亚洲理论在线观看| 国产精品美女久久久久久久久久久| 欧美一区二区三区视频免费播放 | 亚洲综合另类小说| 亚洲丝袜另类动漫二区| 国产视频一区在线播放| 日韩三级在线观看| 91精品国产综合久久久久| 91国偷自产一区二区开放时间 | 日韩三区在线观看| 欧美人狂配大交3d怪物一区| 91丨九色丨蝌蚪富婆spa| 成人午夜免费av| 国产91色综合久久免费分享| 精久久久久久久久久久| 激情图片小说一区| 麻豆精品在线观看| 奇米精品一区二区三区在线观看 | 亚洲一区二区三区小说| 亚洲视频精选在线| 亚洲视频一区二区在线| 亚洲欧洲韩国日本视频| 亚洲少妇30p| 玉米视频成人免费看| 综合欧美亚洲日本| 亚洲免费在线电影| 一区二区三区日韩欧美| 夜夜爽夜夜爽精品视频| 亚洲影院理伦片| 日本特黄久久久高潮| 日韩av二区在线播放| 久久se精品一区精品二区| 另类小说视频一区二区| 狠狠狠色丁香婷婷综合久久五月| 老司机精品视频一区二区三区| 日本午夜精品一区二区三区电影 | 久久精品免视看| 国产精品久久久久久久午夜片| 国产精品久久久久久久第一福利 | 欧美亚洲尤物久久| 91精品国产欧美一区二区18 | 亚洲激情自拍视频| 日韩高清国产一区在线| 国内精品视频666| 北岛玲一区二区三区四区| 在线欧美日韩精品| 欧美精品乱码久久久久久| 久久久久国产精品免费免费搜索| 中文字幕第一区综合| 亚洲中国最大av网站| 麻豆久久久久久久| 成人a区在线观看| 欧美日韩在线一区二区| 久久中文娱乐网| 亚洲黄色小视频| 免费成人结看片| av网站免费线看精品| 精品视频1区2区| 国产亚洲人成网站| 亚洲狠狠爱一区二区三区| 久久精品国产网站| 99久久久国产精品| 日韩一区二区在线观看视频 | 精品欧美一区二区在线观看| 亚洲视频在线一区二区| 蜜桃91丨九色丨蝌蚪91桃色| 成人动漫av在线| 日韩美女视频在线| 亚洲一区二区五区| 国产精品亚洲视频| 欧美日韩一卡二卡三卡 | 99re热这里只有精品视频| 欧美久久婷婷综合色| 国产精品免费久久| 久久成人久久鬼色| 欧美专区日韩专区| 国产精品嫩草久久久久| 麻豆精品在线播放| 欧美视频一区二区三区在线观看 | 91精品国产91综合久久蜜臀| 欧美精彩视频一区二区三区| 亚洲电影欧美电影有声小说| bt7086福利一区国产| 精品国产一区二区三区四区四| 亚洲影院在线观看| 99久久精品国产导航| 国产日产欧美一区二区三区| 日本在线不卡视频| 欧美亚洲日本国产| 日韩美女视频一区二区| 国产激情视频一区二区在线观看| 在线不卡免费av| 亚洲国产一区视频| 一本色道久久综合亚洲91| 国产精品不卡一区| 成人av在线看| 国产精品网友自拍| 国产成人亚洲综合a∨猫咪| 欧美tickling挠脚心丨vk| 日韩激情视频在线观看| 欧美日本一区二区| 亚洲欧美激情一区二区| av成人动漫在线观看| 中文字幕久久午夜不卡| 风间由美一区二区三区在线观看 | 91麻豆精品国产91久久久 | 欧美一区二区三区系列电影| 丝袜美腿亚洲综合| 日韩一区二区三区三四区视频在线观看|