2 * Hyper Operating System Application Framework
5 * @brief %jp{TCP/IP プロトコル}
7 * Copyright (C) 2006-2007 by Project HOS
8 * http://sourceforge.jp/projects/hos/
13 #include "tcpip_local.h"
14 #include "library/algorithm/ipchecksum/ipchecksum.h"
18 void Tcpip_IcmpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize);
22 void Tcpip_TcpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize)
24 const unsigned char *pubRecvTcp;
25 unsigned short uhMyPort;
26 unsigned short uhYourPort;
28 pubRecvTcp = &pubBuf[20];
30 uhYourPort = (pubRecvTcp[0] << 8) + pubRecvTcp[1];
31 uhMyPort = (pubRecvTcp[2] << 8) + pubRecvTcp[3];
33 if ( pubRecvTcp[13] == TCP_FLAG_SYN )
35 unsigned long uwSeqNum;
36 unsigned char *pubSendBuf;
37 unsigned char *pubSendTcp;
40 pubSendBuf = self->ubSendBuf;
41 pubSendTcp = &pubSendBuf[20];
44 /******** IPヘッダ ********/
46 /* バージョン4, ヘッダ長 0x14 */
53 pubSendBuf[2] = iSize / 256;
54 pubSendBuf[3] = iSize % 256;
57 pubSendBuf[4] = self->uhPacketId / 256;
58 pubSendBuf[5] = self->uhPacketId % 256;
69 pubSendBuf[9] = 0x06; /* TCP */
72 memcpy(&pubSendBuf[12], &pubBuf[16], 4);
75 memcpy(&pubSendBuf[16], &pubBuf[12], 4);
79 /******** TCP ********/
84 IP_SET_HALFWORD(&pubRecvTcp[0], uhMyPort);
85 IP_SET_HALFWORD(&pubRecvTcp[2], uhYourPort);
87 uwSeqNum = IP_GET_WORD(&pubRecvTcp[4]);
88 IpCheckSum_Create(&ics);
89 IpCheckSum_Update(&ics, &pubSendBuf[20], iSize - 20);
90 uhSum = IpCheckSum_GetDigest(&ics);
91 IpCheckSum_Delete(&ics);
97 void Tcpip_UdpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize)
104 void Tcpip_Recv(VPARAM Param)
107 unsigned char *pubRecvBuf;
111 self = (C_TCPIP *)Param;
113 pubRecvBuf = self->ubRecvBuf;
118 if ( (iSize = File_Read(self->hIp, pubRecvBuf, 2048)) < 20 )
124 switch ( pubRecvBuf[9] )
126 case 0x01: /* ICMP */
127 Tcpip_IcmpRecv(self, pubRecvBuf, iSize);
131 Tcpip_TcpRecv(self, pubRecvBuf, iSize);
135 Tcpip_UdpRecv(self, pubRecvBuf, iSize);
142 void Tcpip_IcmpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize)
145 unsigned short uhSum;
146 unsigned char *pubSendBuf;
148 pubSendBuf = self->ubSendBuf;
151 /******** IPヘッダ ********/
153 /* バージョン4, ヘッダ長 0x14 */
154 pubSendBuf[0] = 0x45;
157 pubSendBuf[1] = 0x00;
160 pubSendBuf[2] = iSize / 256;
161 pubSendBuf[3] = iSize % 256;
164 pubSendBuf[4] = self->uhPacketId / 256;
165 pubSendBuf[5] = self->uhPacketId % 256;
169 pubSendBuf[6] = 0x00;
170 pubSendBuf[7] = 0x00;
173 pubSendBuf[8] = 0xff;
176 pubSendBuf[9] = 0x01; /* ICMP */
179 memcpy(&pubSendBuf[12], &pubBuf[16], 4);
182 memcpy(&pubSendBuf[16], &pubBuf[12], 4);
186 /******** ICMP ********/
189 pubSendBuf[20] = 0x00;
192 pubSendBuf[21] = 0x00;
195 pubSendBuf[22] = 0x00;
196 pubSendBuf[23] = 0x00;
199 pubSendBuf[24] = pubBuf[24];
200 pubSendBuf[25] = pubBuf[25];
203 pubSendBuf[26] = pubBuf[26];
204 pubSendBuf[27] = pubBuf[27];
207 memcpy(&pubSendBuf[28], &pubBuf[28], iSize - 28);
210 IpCheckSum_Create(&ics);
211 IpCheckSum_Update(&ics, &pubSendBuf[20], iSize - 20);
212 uhSum = IpCheckSum_GetDigest(&ics);
213 IpCheckSum_Delete(&ics);
215 pubSendBuf[22] = uhSum / 256;
216 pubSendBuf[23] = uhSum % 256;
220 File_Write(self->hIp, pubSendBuf, iSize);