⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tskip.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
字号:
#include "Network.h"

#include "funcudp.h"
#include "event.h"


extern OS_MEM			*pMemSml;
extern OS_MEM			*pMemLge;
extern OS_MEM			*pMemHug;

extern UDP_SOCKET_INFO  	UDPSocketInfo[MAX_UDP_SOCKETS];

extern void        UDPInit(void);
extern INT16U IPCheckSum (INT8U rom * Data, INT16U Size);
extern void IPNetSend (INT8U rom * pD, INT16U Len);

#pragma romdata EXTRAM
INT16U rom IPTxID;
INT8U rom IPAddress[4];			//The local IP address

#pragma code MYCODE

void tskIPHandler(void * Pdata){ //only process received packet, the transmit packet is send out using function directly
	void rom * pMsg;
	INT8U	err;
	INT8U rom * pT;
	INT8U rom * pSml;
	INT16U	i;
	INT16U	CurIPPackLen;
	INT8U 	CurIPHeadLen;	//lenght of current IP head in bytes
	INT16U ChkSum;
	
	UDPInit();
	IPTxID	= 0xf0;	
	for(;;){
		pMsg = OSQPend(peventIPHandler, 0, &err);
		if(err == OS_NO_ERR){
			if((INT24U)pMsg >= PTR_MAX){
			}
			else{
				if(((MSG_HEAD *)pMsg)->Msg_ID == MSG_NDATA_PACKET){
					pT = ((MSG_HEAD *)pMsg)->pMem;
					pT += 4;	//Now it point to the head of IP packet
					CurIPPackLen = ((IPDATAGRAM *)pT)->LengthH;
					CurIPPackLen = CurIPPackLen<<8;
					CurIPPackLen += ((IPDATAGRAM *)pT)->LengthL;
					CurIPHeadLen = ((((IPDATAGRAM *)pT)->VerHLen) & 0x0f)* 4;
					//Currentlly, pT point to the head of IP pack
					switch (((IPDATAGRAM *)pT)->Protocol){
						case ICMP:
							pT +=  CurIPHeadLen;
							//Now pT point to the first info byte of IP packet, if the info is ICMP packet, the pT point
							//to "Type" field of ICMP packet
							if(*pT == ECHOREQ){
								//we used the input memblock as the work buffer
								*pT = ECHOREPLY;			//change the type
								((ICMPPACKET *)pT)->Code = 0;
								((ICMPPACKET *)pT)->CheckSumH = 0;
								((ICMPPACKET *)pT)->CheckSumL = 0;
								ChkSum = IPCheckSum(pT, (CurIPPackLen-CurIPHeadLen)>>1);
								((ICMPPACKET *)pT)->CheckSumH = (INT8U)(ChkSum>>8);
								((ICMPPACKET *)pT)->CheckSumL = (INT8U)(ChkSum & 0xff);
								//ICMP finished, now begin making IP
								pT = ((MSG_HEAD *)pMsg)->pMem;
								pT += 4;
								((IPDATAGRAM *)pT)->DestAddress[0] = ((IPDATAGRAM *)pT)->SourceAddress[0];
								((IPDATAGRAM *)pT)->DestAddress[1] = ((IPDATAGRAM *)pT)->SourceAddress[1];
								((IPDATAGRAM *)pT)->DestAddress[2] = ((IPDATAGRAM *)pT)->SourceAddress[2];
								((IPDATAGRAM *)pT)->DestAddress[3] = ((IPDATAGRAM *)pT)->SourceAddress[3];
								((IPDATAGRAM *)pT)->SourceAddress[0] = IPAddress[0];
								((IPDATAGRAM *)pT)->SourceAddress[1] = IPAddress[1];
								((IPDATAGRAM *)pT)->SourceAddress[2] = IPAddress[2];
								((IPDATAGRAM *)pT)->SourceAddress[3] = IPAddress[3];
								//for the containing of IP head is not changed, no checksum needed
								IPNetSend(((MSG_HEAD *)pMsg)->pMem, CurIPPackLen);
							}
							break;
						case UDP:
							pT += CurIPHeadLen;		//Now pT point to the UDP header
							i = ((UDP_HEADER *)pT)->DestinationPort;
							i = swaps(i);			//Now "i" contains the dest port number of rx pack
							//Find out if the received pack matching any existing socket
							for(err = 0; err < MAX_UDP_SOCKETS; err++){
								if(UDPSocketInfo[err].localPort == i){	//a matched socket
									//Maybe some other check shall be executed here such as address check
									//if(UDPSocketInfo[err].remoteAddr.Val == ??)
									break;
								}
							}
							if(err <MAX_UDP_SOCKETS){	//We find a mached socket
								if((INT8U rom *)UDPSocketInfo[err].sockOwner != NULL_PTR){	//the owner is not empty
									pSml = OSMemGet(pMemSml, &err);
									if(err == OS_NO_ERR){
										((MSG_HEAD *)pSml)->Msg_ID = MSG_UDP_DATA;
										((MSG_HEAD *)pSml)->Origin = peventIPHandler;
										((MSG_HEAD *)pSml)->pmemME = pMemSml;
										((MSG_HEAD *)pSml)->Attached = TRUE;
										((MSG_HEAD *)pSml)->pMem = ((MSG_HEAD *)pMsg)->pMem;
										((MSG_HEAD *)pSml)->pmemATT = ((MSG_HEAD *)pMsg)->pmemATT;
								
										((MSG_UDP *)pSml)-> LenOfPayload = ((MSG_HEAD *)pMsg)->LenOfAttach - PPP_HEADLEN - CurIPHeadLen - UDP_HEADLEN;
										i = ((UDP_HEADER *)pT)->SourcePort;
										i = swaps(i);			
										((MSG_UDP *)pSml)-> SourcePort  = i;
										((MSG_UDP *)pSml)-> pPayload = pT+UDP_HEADLEN;
										
										//unattach the data and send it out
										((MSG_HEAD *)pMsg)->Attached = FALSE;
										OSQPost(UDPSocketInfo[err].sockOwner, pSml);
									}
								}
							}
							break;
						case TCP:
							break;
					}
				}
				Func_Clear_Msg(pMsg);
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -