📄 funcip.c
字号:
#include "network.h"
extern INT16U rom IPTxID;
extern INT8U rom IPAddress[4]; //The local IP address
extern INT16U swaps(INT16U v);
extern INT8U PPPSendPacket (INT8U rom *Buffer, INT16U len);
/***********************************************************************
Function : IPChecksum
Parameters : Data: A pointer to an array of Words
Size: Size of the array
Date : August 2000
Desc : Obtains the IP checksum of an array of 16-bit words of size "Size"
***********************************************************************/
INT16U IPCheckSum (INT8U rom * Data, INT16U Size) {
INT32U Sum;
INT16U Temp;
Sum = 0;
while (Size-->0) {
Temp = *Data;
Temp = Temp <<8;
Temp += *(Data+1);
Sum += Temp;
//Sum += ((INT32U)((*Data << 8) + *(Data+1)) & 0xFFFF);
Data+=2;
}
Sum = (Sum >> 16) + (Sum & 0xFFFF);
Sum += (Sum >> 16);
return (INT16U) ~Sum;
}
//when called, the dest and src address has been set by the upper layer
void IPNetSend (INT8U rom * pD, INT16U Len) {
INT8U rom * pT;
pT = pD+4;
pD[0] = 0xff;
pD[1] = 0x03;
pD[2] = 0x00;
pD[3] = 0x21;
((IPDATAGRAM *)pT)->VerHLen = 0x45; /* Header Forma=IPv4, Length = 5 DWORDs */
((IPDATAGRAM *)pT)->Service = 0; /* Always zero */
((IPDATAGRAM *)pT)->LengthH = 0; /* High byte of datagram Length */
OS_ENTER_CRITICAL();
((IPDATAGRAM *)pT)->ID = swaps(IPTxID); /*Merge IP ID */
OS_EXIT_CRITICAL();
((IPDATAGRAM *)pT)->Frag = 0; /* No flags nor enable fragmentation */
((IPDATAGRAM *)pT)->TTL = 0x80; /* Time to live set to default */
((IPDATAGRAM *)pT)->Checksum = 0; /* Clear checksum to avoid miscalculations */
((IPDATAGRAM *)pT)->Checksum = swaps(IPCheckSum (pT, 10)); /* Get checksum of entire datagram */
IPTxID++;
PPPSendPacket (pD, Len+4);
}
INT8U rom *IPMakeHeader(IP_ADDR remoteAddr,
INT8U rom * pBuf,
INT8U Protocol,
INT16U LenOfPayload){
((IPDATAGRAM *)pBuf)->VerHLen = 0x45; /* Header Forma=IPv4, Length = 5 DWORDs */
((IPDATAGRAM *)pBuf)->Service = 0; /* Always zero */
((IPDATAGRAM *)pBuf)->LengthH = (LenOfPayload + IP_HEADLEN)>>8; /* High byte of datagram Length */
((IPDATAGRAM *)pBuf)->LengthL = (LenOfPayload + IP_HEADLEN)&0xff;
OS_ENTER_CRITICAL();
((IPDATAGRAM *)pBuf)->ID = swaps(IPTxID); /*Merge IP ID */
OS_EXIT_CRITICAL();
((IPDATAGRAM *)pBuf)->Frag = 0; /* No flags nor enable fragmentation */
((IPDATAGRAM *)pBuf)->TTL = 0x80; /* Time to live set to default */
((IPDATAGRAM *)pBuf)->Protocol = Protocol;
((IPDATAGRAM *)pBuf)->Checksum = 0; /* Clear checksum to avoid miscalculations */
((IPDATAGRAM *)pBuf)->SourceAddress[0] = IPAddress[0];
((IPDATAGRAM *)pBuf)->SourceAddress[1] = IPAddress[1];
((IPDATAGRAM *)pBuf)->SourceAddress[2] = IPAddress[2];
((IPDATAGRAM *)pBuf)->SourceAddress[3] = IPAddress[3];
((IPDATAGRAM *)pBuf)->DestAddress[0] = remoteAddr.v[0];
((IPDATAGRAM *)pBuf)->DestAddress[1] = remoteAddr.v[1];
((IPDATAGRAM *)pBuf)->DestAddress[2] = remoteAddr.v[2];
((IPDATAGRAM *)pBuf)->DestAddress[3] = remoteAddr.v[3];
((IPDATAGRAM *)pBuf)->Checksum = swaps(IPCheckSum (pBuf, 10)); /* Get checksum of entire datagram */
OS_ENTER_CRITICAL();
IPTxID++;
OS_EXIT_CRITICAL();
return(pBuf + IP_HEADLEN);
}
//these functions can be called by the application to extract IP address from received datagram
INT32U IPGetSrcAddress(INT8U rom * pD){
pD += PPP_HEADLEN;
pD = (INT8U rom *)(&(((IPDATAGRAM *)pD)->SourceAddress));
return(*((INT32U rom*)pD));
}
INT32U IPGetDestAddress(INT8U rom * pD){
pD += PPP_HEADLEN;
pD = (INT8U rom *)(&(((IPDATAGRAM *)pD)->DestAddress));
return(*((INT32U rom*)pD));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -