OSDN Git Service

32f3d716abb910d1c24e934a4fa8c8efe34dc8bd
[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 "tcpip_local.h"
14 #include "library/algorithm/ipchecksum/ipchecksum.h"
15
16
17
18 void Tcpip_IcmpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize);
19
20
21
22 void Tcpip_TcpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize)
23 {
24         const unsigned char *pubRecvTcp;
25         unsigned short          uhMyPort;
26         unsigned short          uhYourPort;
27
28         pubRecvTcp = &pubBuf[20];
29         
30         uhYourPort = (pubRecvTcp[0] << 8) + pubRecvTcp[1];
31         uhMyPort   = (pubRecvTcp[2] << 8) + pubRecvTcp[3];
32         
33         if ( pubRecvTcp[13] == TCP_FLAG_SYN )
34         {
35                 unsigned long   uwSeqNum;
36                 unsigned char   *pubSendBuf;
37                 unsigned char   *pubSendTcp;
38                 C_IPCHECKSUM    ics;
39                 
40                 pubSendBuf = self->ubSendBuf;
41                 pubSendTcp = &pubSendBuf[20];
42                 
43                 
44                 /******** IPヘッダ ********/
45                 
46                 /* バージョン4, ヘッダ長 0x14 */
47                 pubSendBuf[0] = 0x45;
48                 
49                 /* 優先度, サービスタイプ */  
50                 pubSendBuf[1] = 0x00;
51                 
52                 /* データ長 */
53                 pubSendBuf[2] = iSize / 256;
54                 pubSendBuf[3] = iSize % 256;
55                 
56                 /* ID */
57                 pubSendBuf[4] = self->uhPacketId / 256;
58                 pubSendBuf[5] = self->uhPacketId % 256;
59                 self->uhPacketId++;
60                 
61                 /* フラグメント */
62                 pubSendBuf[6] = 0x00;
63                 pubSendBuf[7] = 0x00;
64                 
65                 /* TTL */
66                 pubSendBuf[8] = 0xff;
67                 
68                 /* プロトコル */
69                 pubSendBuf[9] = 0x06;   /* TCP */
70                 
71                 /* 送信元IPアドレス */
72                 memcpy(&pubSendBuf[12],  &pubBuf[16], 4);
73
74                 /* 送信先IPアドレス */
75                 memcpy(&pubSendBuf[16],  &pubBuf[12], 4);
76                 
77                 
78                 
79                 /******** TCP ********/
80                 /*
81
82                 pubSendTcp[0] = 0x00;
83
84                 IP_SET_HALFWORD(&pubRecvTcp[0], uhMyPort);
85                 IP_SET_HALFWORD(&pubRecvTcp[2], uhYourPort);
86                 
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);
92                 */
93         }
94 }
95
96
97 void Tcpip_UdpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize)
98 {
99         
100 }
101
102
103 /* 受信プロセス */
104 void Tcpip_Recv(VPARAM Param)
105 {
106         C_TCPIP                 *self;
107         unsigned char   *pubRecvBuf;
108         int                             iSize;
109         
110         /* upper cast */
111         self  = (C_TCPIP *)Param;
112         
113         pubRecvBuf = self->ubRecvBuf;
114         
115         for ( ; ; )
116         {
117                 /* 受信 */
118                 if ( (iSize = File_Read(self->hIp, pubRecvBuf, 2048)) < 20 )
119                 {
120                         continue;
121                 }
122                 
123                 /* プロトコル判定 */
124                 switch ( pubRecvBuf[9] )
125                 {
126                 case 0x01:      /* ICMP */
127                         Tcpip_IcmpRecv(self, pubRecvBuf, iSize);
128                         break;
129
130                 case 0x06:      /* TCP */
131                         Tcpip_TcpRecv(self, pubRecvBuf, iSize);
132                         break;
133
134                 case 0x11:      /* UDP */
135                         Tcpip_UdpRecv(self, pubRecvBuf, iSize);
136                         break;
137                 }
138         }
139 }
140
141
142 void Tcpip_IcmpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize)
143 {
144         C_IPCHECKSUM    ics;
145         unsigned short  uhSum;
146         unsigned char   *pubSendBuf;
147         
148         pubSendBuf = self->ubSendBuf;
149         
150         
151         /******** IPヘッダ ********/
152         
153         /* バージョン4, ヘッダ長 0x14 */
154         pubSendBuf[0] = 0x45;
155         
156         /* 優先度, サービスタイプ */  
157         pubSendBuf[1] = 0x00;
158         
159         /* データ長 */
160         pubSendBuf[2] = iSize / 256;    
161         pubSendBuf[3] = iSize % 256;
162         
163         /* ID */
164         pubSendBuf[4] = self->uhPacketId / 256;
165         pubSendBuf[5] = self->uhPacketId % 256;
166         self->uhPacketId++;
167         
168         /* フラグメント */
169         pubSendBuf[6] = 0x00;
170         pubSendBuf[7] = 0x00;
171         
172         /* TTL */
173         pubSendBuf[8] = 0xff;
174         
175         /* プロトコル */
176         pubSendBuf[9] = 0x01;   /* ICMP */
177         
178         /* 送信元IPアドレス */
179         memcpy(&pubSendBuf[12],  &pubBuf[16], 4);
180
181         /* 送信先IPアドレス */
182         memcpy(&pubSendBuf[16],  &pubBuf[12], 4);
183         
184         
185         
186         /******** ICMP ********/
187         
188         /* タイプ */
189         pubSendBuf[20] = 0x00;
190
191         /* コード */
192         pubSendBuf[21] = 0x00;
193
194         /* チェックサム */
195         pubSendBuf[22] = 0x00;
196         pubSendBuf[23] = 0x00;
197
198         /* ID */
199         pubSendBuf[24] = pubBuf[24];
200         pubSendBuf[25] = pubBuf[25];
201         
202         /* シーケンス番号 */
203         pubSendBuf[26] = pubBuf[26];
204         pubSendBuf[27] = pubBuf[27];
205         
206         /* データ */
207         memcpy(&pubSendBuf[28], &pubBuf[28], iSize - 28);
208         
209         /* ICPM部のチェックサム計算 */
210         IpCheckSum_Create(&ics);
211         IpCheckSum_Update(&ics, &pubSendBuf[20], iSize - 20);
212         uhSum = IpCheckSum_GetDigest(&ics);
213         IpCheckSum_Delete(&ics);
214
215         pubSendBuf[22] = uhSum / 256;
216         pubSendBuf[23] = uhSum % 256;
217         
218         
219         /* 送信 */    
220         File_Write(self->hIp, pubSendBuf, iSize);
221 }
222
223
224
225 /* endof file */