📄 tskip.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 + -