OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / driver / tcpip / tcpip / tcpip_recv.c
1 /** 
2  *  Hyper Operating System  Application Framework
3  *
4  * @file  tcpip.h
5  * @brief %jp{TCP/IP プロトコル}
6  *
7  * Copyright (C) 2006-2007 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12 #include <string.h>
13 #include "hosaplfw.h"
14 #include "tcpip_local.h"
15 #include "library/algorithm/ipchecksum/ipchecksum.h"
16
17
18 static void Tcpip_IcmpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize);
19
20
21
22
23 void Tcpip_UdpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize)
24 {
25         const unsigned char ubDumy[2] = {0, 17};
26         C_TCPIPFILE             *pFile;
27         T_TCPIP_ADDRESS Addr;
28         C_IPCHECKSUM    ics;
29         unsigned short  uhDstPort;
30         unsigned short  uhSrcPort;
31         unsigned short  uhUdpSize;
32         unsigned short  uhCheckSum;
33         unsigned short  uhSum;
34         
35         uhDstPort  = IP_GET_HALFWORD(&pubBuf[20]);
36         uhSrcPort  = IP_GET_HALFWORD(&pubBuf[22]);
37         uhUdpSize  = IP_GET_HALFWORD(&pubBuf[24]);
38         uhCheckSum = IP_GET_HALFWORD(&pubBuf[26]);
39         
40         
41         /* ---------------------- */
42         /*    チェックサム計算    */    
43         /* ---------------------- */
44         
45         IpCheckSum_Create(&ics);
46         
47         /* UDP擬似ヘッダ(pseudo header)*/
48         IpCheckSum_Update(&ics, &pubBuf[12], 8);        /* 送信元アドレス& 送信先アドレス */
49         IpCheckSum_Update(&ics, ubDumy, 2);
50         IpCheckSum_Update(&ics, &pubBuf[24], 2);        /* パケット長 */
51         
52         /* パケット */
53         IpCheckSum_Update(&ics, &pubBuf[20], 6);
54         IpCheckSum_Update(&ics, &pubBuf[28], uhUdpSize - 8);
55         
56         uhSum = IpCheckSum_GetDigest(&ics);
57         
58         IpCheckSum_Delete(&ics);
59
60         if ( uhCheckSum != 0x0000 && uhCheckSum != uhSum )
61         {
62                 return;
63         }
64         
65         
66         /* 受信ポート探索 */
67         pFile = self->pUdpHead;
68         if ( pFile != NULL )
69         {
70                 do
71                 {
72                         if ( pFile->uhPortNum == uhDstPort )
73                         {
74
75                         }
76                 
77                         pFile = pFile->pNext;
78                 } while ( pFile == self->pUdpHead );
79         }
80         
81 }
82
83
84 void Tcpip_TcpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize)
85 {
86         const unsigned char *pubRecvTcp;
87         unsigned short          uhMyPort;
88         unsigned short          uhYourPort;
89
90         pubRecvTcp = &pubBuf[20];
91         
92         uhYourPort = (pubRecvTcp[0] << 8) + pubRecvTcp[1];
93         uhMyPort   = (pubRecvTcp[2] << 8) + pubRecvTcp[3];
94         
95         if ( pubRecvTcp[13] == TCP_FLAG_SYN )
96         {
97                 unsigned long   uwSeqNum;
98                 unsigned char   *pubSendBuf;
99                 unsigned char   *pubSendTcp;
100                 C_IPCHECKSUM    ics;
101                 
102                 pubSendBuf = self->ubSendBuf;
103                 pubSendTcp = &pubSendBuf[20];
104                 
105                 
106                 /******** IPヘッダ ********/
107                 
108                 /* バージョン4, ヘッダ長 0x14 */
109                 pubSendBuf[0] = 0x45;
110                 
111                 /* 優先度, サービスタイプ */  
112                 pubSendBuf[1] = 0x00;
113                 
114                 /* データ長 */
115                 pubSendBuf[2] = iSize / 256;
116                 pubSendBuf[3] = iSize % 256;
117                 
118                 /* ID */
119                 pubSendBuf[4] = self->uhPacketId / 256;
120                 pubSendBuf[5] = self->uhPacketId % 256;
121                 self->uhPacketId++;
122                 
123                 /* フラグメント */
124                 pubSendBuf[6] = 0x00;
125                 pubSendBuf[7] = 0x00;
126                 
127                 /* TTL */
128                 pubSendBuf[8] = 0xff;
129                 
130                 /* プロトコル */
131                 pubSendBuf[9] = 0x06;   /* TCP */
132                 
133                 /* 送信元IPアドレス */
134                 memcpy(&pubSendBuf[12],  &pubBuf[16], 4);
135
136                 /* 送信先IPアドレス */
137                 memcpy(&pubSendBuf[16],  &pubBuf[12], 4);
138                 
139                 
140                 
141                 /******** TCP ********/
142                 /*
143
144                 pubSendTcp[0] = 0x00;
145
146                 IP_SET_HALFWORD(&pubRecvTcp[0], uhMyPort);
147                 IP_SET_HALFWORD(&pubRecvTcp[2], uhYourPort);
148                 
149                 uwSeqNum = IP_GET_WORD(&pubRecvTcp[4]);
150                 IpCheckSum_Create(&ics);
151                 IpCheckSum_Update(&ics, &pubSendBuf[20], iSize - 20);
152                 uhSum = IpCheckSum_GetDigest(&ics);
153                 IpCheckSum_Delete(&ics);
154                 */
155         }
156 }
157
158
159
160
161 /* 受信プロセス */
162 void Tcpip_Recv(VPARAM Param)
163 {
164         C_TCPIP                 *self;
165         unsigned char   *pubRecvBuf;
166         int                             iSize;
167         
168         /* upper cast */
169         self  = (C_TCPIP *)Param;
170         
171         pubRecvBuf = self->ubRecvBuf;
172         
173         for ( ; ; )
174         {
175                 /* 受信 */
176                 if ( (iSize = File_Read(self->hIp, pubRecvBuf, 2048)) < 20 )
177                 {
178                         continue;
179                 }
180                 
181                 /* プロトコル判定 */
182                 switch ( pubRecvBuf[9] )
183                 {
184                 case 0x01:      /* ICMP */
185                         Tcpip_IcmpRecv(self, pubRecvBuf, iSize);
186                         break;
187
188                 case 0x06:      /* TCP */
189                         Tcpip_TcpRecv(self, pubRecvBuf, iSize);
190                         break;
191
192                 case 0x11:      /* UDP */
193                         Tcpip_UdpRecv(self, pubRecvBuf, iSize);
194                         break;
195                 }
196         }
197 }
198
199
200 void Tcpip_IcmpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize)
201 {
202         C_IPCHECKSUM    ics;
203         unsigned short  uhSum;
204         unsigned char   *pubSendBuf;
205         
206         pubSendBuf = self->ubSendBuf;
207         
208         
209         /******** IPヘッダ ********/
210         
211         /* バージョン4, ヘッダ長 0x14 */
212         pubSendBuf[0] = 0x45;
213         
214         /* 優先度, サービスタイプ */  
215         pubSendBuf[1] = 0x00;
216         
217         /* データ長 */
218         pubSendBuf[2] = iSize / 256;    
219         pubSendBuf[3] = iSize % 256;
220         
221         /* ID */
222         pubSendBuf[4] = self->uhPacketId / 256;
223         pubSendBuf[5] = self->uhPacketId % 256;
224         self->uhPacketId++;
225         
226         /* フラグメント */
227         pubSendBuf[6] = 0x00;
228         pubSendBuf[7] = 0x00;
229         
230         /* TTL */
231         pubSendBuf[8] = 0xff;
232         
233         /* プロトコル */
234         pubSendBuf[9] = 0x01;   /* ICMP */
235         
236         /* 送信元IPアドレス */
237         memcpy(&pubSendBuf[12],  &pubBuf[16], 4);
238
239         /* 送信先IPアドレス */
240         memcpy(&pubSendBuf[16],  &pubBuf[12], 4);
241         
242         
243         
244         /******** ICMP ********/
245         
246         /* タイプ */
247         pubSendBuf[20] = 0x00;
248
249         /* コード */
250         pubSendBuf[21] = 0x00;
251
252         /* チェックサム */
253         pubSendBuf[22] = 0x00;
254         pubSendBuf[23] = 0x00;
255
256         /* ID */
257         pubSendBuf[24] = pubBuf[24];
258         pubSendBuf[25] = pubBuf[25];
259         
260         /* シーケンス番号 */
261         pubSendBuf[26] = pubBuf[26];
262         pubSendBuf[27] = pubBuf[27];
263         
264         /* データ */
265         memcpy(&pubSendBuf[28], &pubBuf[28], iSize - 28);
266         
267         /* ICPM部のチェックサム計算 */
268         IpCheckSum_Create(&ics);
269         IpCheckSum_Update(&ics, &pubSendBuf[20], iSize - 20);
270         uhSum = IpCheckSum_GetDigest(&ics);
271         IpCheckSum_Delete(&ics);
272
273         pubSendBuf[22] = uhSum / 256;
274         pubSendBuf[23] = uhSum % 256;
275         
276         
277         /* 送信 */    
278         File_Write(self->hIp, pubSendBuf, iSize);
279 }
280
281
282
283 /* endof file */