* tar xzf utvpn-src-unix-v101-7101-public-2010.06.27.tar.gz
[lab.git] / utvpn / utvpn-unix-v101-7101-public / src / Cedar / TcpIp.h
1 // SoftEther UT-VPN SourceCode\r
2 // \r
3 // Copyright (C) 2004-2010 SoftEther Corporation.\r
4 // Copyright (C) 2004-2010 University of Tsukuba, Japan.\r
5 // Copyright (C) 2003-2010 Daiyuu Nobori.\r
6 // All Rights Reserved.\r
7 // \r
8 // http://utvpn.tsukuba.ac.jp/\r
9 // \r
10 // This program is free software; you can redistribute it and/or\r
11 // modify it under the terms of the GNU General Public License\r
12 // version 2 as published by the Free Software Foundation.\r
13 // \r
14 // This program is distributed in the hope that it will be useful,\r
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
17 // GNU General Public License for more details.\r
18 // \r
19 // You should have received a copy of the GNU General Public License version 2\r
20 // along with this program; if not, write to the Free Software\r
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
22 // \r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。\r
28 // \r
29 // この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の\r
30 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )\r
31 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって\r
32 // ホストされています。\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、\r
34 // および、試験または研究のために利用が行われることを想定して配布\r
35 // しています。\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に\r
37 // あります。\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース\r
42 // に組み込みさせていただきます。\r
43 // \r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
46 // \r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
51 // ください。\r
52 // \r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、\r
58 // 公益保護にご協力いただきますようお願い申し上げます。\r
59 // \r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客\r
62 // を保護するための努力を行います。\r
63 // \r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/\r
65 // 日本国内の脆弱性情報届出受付公的機関:\r
66 //         独立行政法人 情報処理推進機構\r
67 //         http://www.ipa.go.jp/security/vuln/report/\r
68 // \r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/\r
71 \r
72 // -----------------------------------------------\r
73 // [ChangeLog]\r
74 // 2010.05.20\r
75 //  新規リリース by SoftEther\r
76 // -----------------------------------------------\r
77 \r
78 // TcpIp.h\r
79 // TcpIp.c のヘッダ\r
80 \r
81 #ifndef TCPIP_H\r
82 #define TCPIP_H\r
83 \r
84 #ifdef  OS_WIN32\r
85 #pragma pack(push, 1)\r
86 #endif  // OS_WIN32\r
87 \r
88 // MAC ヘッダ\r
89 struct MAC_HEADER\r
90 {\r
91         UCHAR   DestAddress[6];                 // 送信元 MAC アドレス\r
92         UCHAR   SrcAddress[6];                  // 宛先 MAC アドレス\r
93         USHORT  Protocol;                               // プロトコル\r
94 } GCC_PACKED;\r
95 \r
96 // MAC プロトコル\r
97 #define MAC_PROTO_ARPV4         0x0806  // ARPv4 パケット\r
98 #define MAC_PROTO_IPV4          0x0800  // IPv4 パケット\r
99 #define MAC_PROTO_IPV6          0x86dd  // IPv6 パケット\r
100 #define MAC_PROTO_TAGVLAN       0x8100  // タグ付き VLAN パケット\r
101 \r
102 // LLC ヘッダ\r
103 struct LLC_HEADER\r
104 {\r
105         UCHAR   Dsap;\r
106         UCHAR   Ssap;\r
107         UCHAR   Ctl;\r
108 } GCC_PACKED;\r
109 \r
110 // LLC ヘッダの DSAP, SSAP の値\r
111 #define LLC_DSAP_BPDU           0x42\r
112 #define LLC_SSAP_BPDU           0x42\r
113 \r
114 // BPDU ヘッダ\r
115 struct BPDU_HEADER\r
116 {\r
117         USHORT  ProtocolId;                             // プロトコル ID (STP == 0x0000)\r
118         UCHAR   Version;                                // バージョン\r
119         UCHAR   Type;                                   // 種類\r
120         UCHAR   Flags;                                  // フラグ\r
121         USHORT  RootPriority;                   // ルートブリッジのプライオリティ\r
122         UCHAR   RootMacAddress[6];              // ルートブリッジの MAC アドレス\r
123         UINT    RootPathCost;                   // ルートブリッジまでのパスコスト\r
124         USHORT  BridgePriority;                 // 発信ブリッジのプライオリティ\r
125         UCHAR   BridgeMacAddress[6];    // 発信ブリッジの MAC アドレス\r
126         USHORT  BridgePortId;                   // 発信ブリッジのポート ID\r
127         USHORT  MessageAge;                             // 有効期限\r
128         USHORT  MaxAge;                                 // 最大有効期限\r
129         USHORT  HelloTime;                              // Hello Time\r
130         USHORT  ForwardDelay;                   // Forward Delay\r
131 } GCC_PACKED;\r
132 \r
133 // ARPv4 ヘッダ\r
134 struct ARPV4_HEADER\r
135 {\r
136         USHORT  HardwareType;                   // ハードウェアタイプ\r
137         USHORT  ProtocolType;                   // プロトコルタイプ\r
138         UCHAR   HardwareSize;                   // ハードウェアサイズ\r
139         UCHAR   ProtocolSize;                   // プロトコルサイズ\r
140         USHORT  Operation;                              // オペレーション\r
141         UCHAR   SrcAddress[6];                  // 送信元 MAC アドレス\r
142         UINT    SrcIP;                                  // 送信元 IP アドレス\r
143         UCHAR   TargetAddress[6];               // ターゲット MAC アドレス\r
144         UINT    TargetIP;                               // ターゲット IP アドレス\r
145 } GCC_PACKED;\r
146 \r
147 // ARP ハードウェア種類\r
148 #define ARP_HARDWARE_TYPE_ETHERNET              0x0001\r
149 \r
150 // ARP オペレーション種類\r
151 #define ARP_OPERATION_REQUEST                   1\r
152 #define ARP_OPERATION_RESPONSE                  2\r
153 \r
154 // タグ付き VLAN ヘッダ\r
155 struct TAGVLAN_HEADER\r
156 {\r
157         UCHAR Data[2];                                  // データ\r
158 } GCC_PACKED;\r
159 \r
160 // IPv4 ヘッダ\r
161 struct IPV4_HEADER\r
162 {\r
163         UCHAR   VersionAndHeaderLength;         // バージョンとヘッダサイズ\r
164         UCHAR   TypeOfService;                          // サービスタイプ\r
165         USHORT  TotalLength;                            // 合計サイズ\r
166         USHORT  Identification;                         // 識別子\r
167         UCHAR   FlagsAndFlagmentOffset[2];      // フラグとフラグメントオフセット\r
168         UCHAR   TimeToLive;                                     // TTL\r
169         UCHAR   Protocol;                                       // プロトコル\r
170         USHORT  Checksum;                                       // チェックサム\r
171         UINT    SrcIP;                                          // 送信元 IP アドレス\r
172         UINT    DstIP;                                          // 宛先 IP アドレス\r
173 } GCC_PACKED;\r
174 \r
175 // IPv4 ヘッダ操作用マクロ\r
176 #define IPV4_GET_VERSION(h)                     (((h)->VersionAndHeaderLength >> 4 & 0x0f))\r
177 #define IPV4_SET_VERSION(h, v)          ((h)->VersionAndHeaderLength |= (((v) & 0x0f) << 4))\r
178 #define IPV4_GET_HEADER_LEN(h)          ((h)->VersionAndHeaderLength & 0x0f)\r
179 #define IPV4_SET_HEADER_LEN(h, v)       ((h)->VersionAndHeaderLength |= ((v) & 0x0f))\r
180 \r
181 // IPv4 フラグメント関係操作用マクロ\r
182 #define IPV4_GET_FLAGS(h)                       (((h)->FlagsAndFlagmentOffset[0] >> 5) & 0x07)\r
183 #define IPV4_SET_FLAGS(h, v)            ((h)->FlagsAndFlagmentOffset[0] |= (((v) & 0x07) << 5))\r
184 #define IPV4_GET_OFFSET(h)                      (((h)->FlagsAndFlagmentOffset[0] & 0x1f) * 256 + ((h)->FlagsAndFlagmentOffset[1]))\r
185 #define IPV4_SET_OFFSET(h, v)           {(h)->FlagsAndFlagmentOffset[0] |= (UCHAR)((v) / 256); (h)->FlagsAndFlagmentOffset[1] = (UCHAR)((v) % 256);}\r
186 \r
187 // IPv4 プロトコル\r
188 #define IP_PROTO_ICMPV4         0x01    // ICMPv4 プロトコル\r
189 \r
190 // IPv6 プロトコル\r
191 #define IP_PROTO_ICMPV6         0x3a    // ICMPv6 プロトコル\r
192 \r
193 // IPv4 / IPv6 共通プロトコル\r
194 #define IP_PROTO_TCP            0x06    // TCP プロトコル\r
195 #define IP_PROTO_UDP            0x11    // UDP プロトコル\r
196 \r
197 \r
198 // UDP ヘッダ\r
199 struct UDP_HEADER\r
200 {\r
201         USHORT  SrcPort;                                        // 送信元ポート番号\r
202         USHORT  DstPort;                                        // 宛先ポート番号\r
203         USHORT  PacketLength;                   // データ長\r
204         USHORT  Checksum;                               // チェックサム\r
205 } GCC_PACKED;\r
206 \r
207 // UDPv4 擬似ヘッダ\r
208 struct UDPV4_PSEUDO_HEADER\r
209 {\r
210         UINT    SrcIP;                                  // 送信元 IP アドレス\r
211         UINT    DstIP;                                  // 宛先 IP アドレス\r
212         UCHAR   Reserved;                               // 未使用\r
213         UCHAR   Protocol;                               // プロトコル番号\r
214         USHORT  PacketLength1;                  // UDP データ長 1\r
215         USHORT  SrcPort;                                        // 送信元ポート番号\r
216         USHORT  DstPort;                                        // 宛先ポート番号\r
217         USHORT  PacketLength2;                  // UDP データ長 2\r
218         USHORT  Checksum;                               // チェックサム\r
219 } GCC_PACKED;\r
220 \r
221 // TCPv4 擬似ヘッダ\r
222 struct TCPV4_PSEUDO_HEADER\r
223 {\r
224         UINT    SrcIP;                                  // 送信元 IP アドレス\r
225         UINT    DstIP;                                  // 宛先 IP アドレス\r
226         UCHAR   Reserved;                               // 未使用\r
227         UCHAR   Protocol;                               // プロトコル番号\r
228         USHORT  PacketLength;                   // UDP データ長 1\r
229 } GCC_PACKED;\r
230 \r
231 // TCP ヘッダ\r
232 struct TCP_HEADER\r
233 {\r
234         USHORT  SrcPort;                                        // 送信元ポート番号\r
235         USHORT  DstPort;                                        // 宛先ポート番号\r
236         UINT    SeqNumber;                              // シーケンス番号\r
237         UINT    AckNumber;                              // 確認応答番号\r
238         UCHAR   HeaderSizeAndReserved;  // ヘッダサイズと予約領域\r
239         UCHAR   Flag;                                   // フラグ\r
240         USHORT  WindowSize;                             // ウインドウサイズ\r
241         USHORT  Checksum;                               // チェックサム\r
242         USHORT  UrgentPointer;                  // 緊急ポインタ\r
243 } GCC_PACKED;\r
244 \r
245 // TCP マクロ\r
246 #define TCP_GET_HEADER_SIZE(h)  (((h)->HeaderSizeAndReserved >> 4) & 0x0f)\r
247 #define TCP_SET_HEADER_SIZE(h, v)       ((h)->HeaderSizeAndReserved = (((v) & 0x0f) << 4))\r
248 \r
249 // TCP フラグ\r
250 #define TCP_FIN                                         1\r
251 #define TCP_SYN                                         2\r
252 #define TCP_RST                                         4\r
253 #define TCP_PSH                                         8\r
254 #define TCP_ACK                                         16\r
255 #define TCP_URG                                         32\r
256 \r
257 // ICMP ヘッダ\r
258 struct ICMP_HEADER\r
259 {\r
260         UCHAR   Type;                                   // タイプ\r
261         UCHAR   Code;                                   // コード\r
262         USHORT  Checksum;                               // チェックサム\r
263 } GCC_PACKED;\r
264 \r
265 #define ICMP_TYPE_ECHO_REQUEST          8               // ICMP Echo 要求\r
266 #define ICMP_TYPE_ECHO_RESPONSE         0               // ICMP Echo 応答\r
267 \r
268 // ICMP Echo\r
269 struct ICMP_ECHO\r
270 {\r
271         USHORT  Identifier;                                             // ID\r
272         USHORT  SeqNo;                                                  // シーケンス番号\r
273 } GCC_PACKED;\r
274 \r
275 // DHCPv4 ヘッダ\r
276 struct DHCPV4_HEADER\r
277 {\r
278         UCHAR   OpCode;                         // オペコード\r
279         UCHAR   HardwareType;           // ハードウェア種類\r
280         UCHAR   HardwareAddressSize;    // ハードウェアアドレスサイズ\r
281         UCHAR   Hops;                           // ホップ数\r
282         UINT    TransactionId;          // トランザクション ID\r
283         USHORT  Seconds;                                // 秒数\r
284         USHORT  Flags;                          // フラグ\r
285         UINT    ClientIP;                       // クライアント IP アドレス\r
286         UINT    YourIP;                         // 割り当て IP アドレス\r
287         UINT    ServerIP;                       // サーバー IP アドレス\r
288         UINT    RelayIP;                                // リレー IP アドレス\r
289         UCHAR   ClientMacAddress[6];    // クライアント MAC アドレス\r
290         UCHAR   Padding[10];                    // Ethernet 以外のためにパディング\r
291 } GCC_PACKED;\r
292 \r
293 // DNSv4 ヘッダ\r
294 struct DNSV4_HEADER\r
295 {\r
296         USHORT  TransactionId;                  // トランザクション ID\r
297         UCHAR   Flag1;                                  // フラグ 1\r
298         UCHAR   Flag2;                                  // フラグ 2\r
299         USHORT  NumQuery;                               // クエリ数\r
300         USHORT  AnswerRRs;                              // 回答 RR 数\r
301         USHORT  AuthorityRRs;                   // 権威 RR 数\r
302         USHORT  AdditionalRRs;                  // 追加 RR 数\r
303 } GCC_PACKED;\r
304 \r
305 #define DHCP_MAGIC_COOKIE       0x63825363      // Magic Cookie (固定)\r
306 \r
307 // IPv6 ヘッダパケット情報\r
308 struct IPV6_HEADER_PACKET_INFO\r
309 {\r
310         IPV6_HEADER *IPv6Header;                                        // IPv6 ヘッダ\r
311         IPV6_OPTION_HEADER *HopHeader;                          // ホップバイホップオプションヘッダ\r
312         UINT HopHeaderSize;                                                     // ホップバイホップオプションヘッダサイズ\r
313         IPV6_OPTION_HEADER *EndPointHeader;                     // 終点オプションヘッダ\r
314         UINT EndPointHeaderSize;                                        // 終点オプションヘッダサイズ\r
315         IPV6_OPTION_HEADER *RoutingHeader;                      // ルーティングヘッダ\r
316         UINT RoutingHeaderSize;                                         // ルーティングヘッダサイズ\r
317         IPV6_FRAGMENT_HEADER *FragmentHeader;           // フラグメントヘッダ\r
318         void *Payload;                                                          // ペイロード\r
319         UINT PayloadSize;                                                       // ペイロードサイズ\r
320         UCHAR Protocol;                                                         // ペイロードプロトコル\r
321         bool IsFragment;                                                        // フラグメントパケットかどうか\r
322 };\r
323 \r
324 // IPv6 ヘッダ\r
325 struct IPV6_HEADER\r
326 {\r
327         UCHAR VersionAndTrafficClass1;          // バージョン番号 (4 bit) とトラフィッククラス 1 (4 bit)\r
328         UCHAR TrafficClass2AndFlowLabel1;       // トラフィッククラス 2 (4 bit) とフローラベル 1 (4 bit)\r
329         UCHAR FlowLabel2;                                       // フローラベル 2 (8 bit)\r
330         UCHAR FlowLabel3;                                       // フローラベル 3 (8 bit)\r
331         USHORT PayloadLength;                           // ペイロードの長さ (拡張ヘッダを含む)\r
332         UCHAR NextHeader;                                       // 次のヘッダ\r
333         UCHAR HopLimit;                                         // ホップリミット\r
334         IPV6_ADDR SrcAddress;                           // ソースアドレス\r
335         IPV6_ADDR DestAddress;                          // 宛先アドレス\r
336 } GCC_PACKED;\r
337 \r
338 \r
339 // IPv6 ヘッダ操作用マクロ\r
340 #define IPV6_GET_VERSION(h)                     (((h)->VersionAndTrafficClass1 >> 4) & 0x0f)\r
341 #define IPV6_SET_VERSION(h, v)          ((h)->VersionAndTrafficClass1 = ((h)->VersionAndTrafficClass1 & 0x0f) | ((v) << 4) & 0xf0)\r
342 #define IPV6_GET_TRAFFIC_CLASS(h)       ((((h)->VersionAndTrafficClass1 << 4) & 0xf0) | ((h)->TrafficClass2AndFlowLabel1 >> 4) & 0x0f)\r
343 #define IPV6_SET_TRAFFIC_CLASS(h, v)    ((h)->VersionAndTrafficClass1 = ((h)->VersionAndTrafficClass1 & 0xf0) | (((v) >> 4) & 0x0f),\\r
344         (h)->TrafficClass2AndFlowLabel1 = (h)->TrafficClass2AndFlowLabel1 & 0x0f | ((v) << 4) & 0xf0)\r
345 #define IPV6_GET_FLOW_LABEL(h)          ((((h)->TrafficClass2AndFlowLabel1 << 16) & 0xf0000) | (((h)->FlowLabel2 << 8) & 0xff00) |\\r
346         (((h)->FlowLabel3) & 0xff))\r
347 #define IPV6_SET_FLOW_LABEL(h, v)       ((h)->TrafficClass2AndFlowLabel1 = ((h)->TrafficClass2AndFlowLabel1 & 0xf0 | ((v) >> 16) & 0x0f),\\r
348         (h)->FlowLabel2 = ((v) >> 8) & 0xff,\\r
349         (h)->FlowLabel3 = (v) & 0xff)\r
350 \r
351 \r
352 // IPv6 ホップ最大値 (ルーティングしない)\r
353 #define IPV6_HOP_MAX                                    255\r
354 \r
355 // IPv6 ホップ標準数\r
356 #define IPV6_HOP_DEFAULT                                127\r
357 \r
358 // IPv6 ヘッダ番号\r
359 #define IPV6_HEADER_HOP                                 0       // ホップバイホップオプションヘッダ\r
360 #define IPV6_HEADER_ENDPOINT                    60      // 終点オプションヘッダ\r
361 #define IPV6_HEADER_ROUTING                             43      // ルーティングヘッダ\r
362 #define IPV6_HEADER_FRAGMENT                    44      // フラグメントヘッダ\r
363 #define IPV6_HEADER_NONE                                59      // 次ヘッダ無し\r
364 \r
365 // IPv6 オプションヘッダ\r
366 // (ホップオプションヘッダ、終点オプションヘッダ、ルーティングヘッダで使用される)\r
367 struct IPV6_OPTION_HEADER\r
368 {\r
369         UCHAR NextHeader;                                       // 次のヘッダ\r
370         UCHAR Size;                                                     // ヘッダサイズ (/8)\r
371 } GCC_PACKED;\r
372 \r
373 // IPv6 フラグメントヘッダ\r
374 // (フラグメント不可能部分は、ルーティングヘッダがある場合はその直前まで、\r
375 //  ホップバイホップオプションヘッダがある場合はその直前まで、\r
376 //  それ以外の場合は最初の拡張ヘッダもしくはペイロードの直前まで)\r
377 struct IPV6_FRAGMENT_HEADER\r
378 {\r
379         UCHAR NextHeader;                                       // 次のヘッダ\r
380         UCHAR Reserved;                                         // 予約\r
381         UCHAR FlagmentOffset1;                          // フラグメントオフセット 1 (/8, 8 bit)\r
382         UCHAR FlagmentOffset2AndFlags;          // フラグメントオフセット 2 (/8, 5 bit) + 予約 (2 bit) + More フラグ (1 bit)\r
383         UINT Identification;                            // ID\r
384 } GCC_PACKED;\r
385 \r
386 // IPv6 フラグメントヘッダ操作用マクロ\r
387 #define IPV6_GET_FRAGMENT_OFFSET(h)             (((((h)->FlagmentOffset1) << 5) & 0x1fe0) | (((h)->FlagmentOffset2AndFlags >> 3) & 0x1f))\r
388 #define IPV6_SET_FRAGMENT_OFFSET(h, v)  ((h)->FlagmentOffset1 = (v / 32) & 0xff,        \\r
389         ((h)->FlagmentOffset2AndFlags = ((v % 256) << 3) & 0xf8) | ((h)->FlagmentOffset2AndFlags & 0x07))\r
390 #define IPV6_GET_FLAGS(h)                               ((h)->FlagmentOffset2AndFlags & 0x0f)\r
391 #define IPV6_SET_FLAGS(h, v)                            ((h)->FlagmentOffset2AndFlags = (((h)->FlagmentOffset2AndFlags & 0xf8) | (v & 0x07)))\r
392 \r
393 // フラグ\r
394 #define IPV6_FRAGMENT_HEADER_FLAG_MORE_FRAGMENTS                0x01    // 次のフラグメントがある\r
395 \r
396 // IPv6 仮想ヘッダ\r
397 struct IPV6_PSEUDO_HEADER\r
398 {\r
399         IPV6_ADDR SrcAddress;                           // ソースアドレス\r
400         IPV6_ADDR DestAddress;                          // 宛先アドレス\r
401         UINT UpperLayerPacketSize;                      // 上位レイヤのパケットサイズ\r
402         UCHAR Padding[3];                                       // パディング\r
403         UCHAR NextHeader;                                       // 次ヘッダ (TCP / UDP)\r
404 } GCC_PACKED;\r
405 \r
406 // ICMPv6 ルータ要請ヘッダ\r
407 struct ICMPV6_ROUTER_SOLICIATION_HEADER\r
408 {\r
409         UINT Reserved;                                                  // 予約\r
410         // + オプション (ソースリンクレイヤアドレス[任意])\r
411 } GCC_PACKED;\r
412 \r
413 // ICMPv6 ルータ広告ヘッダ\r
414 struct ICMPV6_ROUTER_ADVERTISEMENT_HEADER\r
415 {\r
416         UCHAR CurHopLimit;                                              // デフォルトのホップリミット数\r
417         UCHAR Flags;                                                    // フラグ (0)\r
418         USHORT Lifetime;                                                // 寿命\r
419         UINT ReachableTime;                                             // 0\r
420         UINT RetransTimer;                                              // 0\r
421         // + オプション (プレフィックス情報[必須], MTU[任意])\r
422 } GCC_PACKED;\r
423 \r
424 // ICMPv6 近隣要請ヘッダ\r
425 struct ICMPV6_NEIGHBOR_SOLICIATION_HEADER\r
426 {\r
427         UINT Reserved;                                                  // 予約\r
428         IPV6_ADDR TargetAddress;                                // ターゲットアドレス\r
429         // + オプション (ソースリンクレイヤアドレス[必須])\r
430 } GCC_PACKED;\r
431 \r
432 // ICMPv6 近隣広告ヘッダ\r
433 struct ICMPV6_NEIGHBOR_ADVERTISEMENT_HEADER\r
434 {\r
435         UCHAR Flags;                                                    // フラグ\r
436         UCHAR Reserved[3];                                              // 予約\r
437         IPV6_ADDR TargetAddress;                                // ターゲットアドレス\r
438         // + オプション (ターゲットリンクレイヤアドレス)\r
439 } GCC_PACKED;\r
440 \r
441 #define ICMPV6_NEIGHBOR_ADVERTISEMENT_FLAG_ROUTER               0x80    // ルータ\r
442 #define ICMPV6_NEIGHBOR_ADVERTISEMENT_FLAG_SOLICITED    0x40    // 要請フラグ\r
443 #define ICMPV6_NEIGHBOR_ADVERTISEMENT_FLAG_OVERWRITE    0x20    // 上書きフラグ\r
444 \r
445 // ICMPv6 オプションリスト\r
446 struct ICMPV6_OPTION_LIST\r
447 {\r
448         ICMPV6_OPTION_LINK_LAYER *SourceLinkLayer;              // ソースリンクレイヤアドレス\r
449         ICMPV6_OPTION_LINK_LAYER *TargetLinkLayer;              // ターゲットリンクレイヤアドレス\r
450         ICMPV6_OPTION_PREFIX *Prefix;                                   // プレフィックス情報\r
451         ICMPV6_OPTION_MTU *Mtu;                                                 // MTU\r
452 } GCC_PACKED;\r
453 \r
454 // ICMPv6 オプション\r
455 struct ICMPV6_OPTION\r
456 {\r
457         UCHAR Type;                                                             // タイプ\r
458         UCHAR Length;                                                   // 長さ (/8, タイプと長さを含める)\r
459 } GCC_PACKED;\r
460 \r
461 #define ICMPV6_OPTION_TYPE_SOURCE_LINK_LAYER    1               // ソースリンクレイヤアドレス\r
462 #define ICMPV6_OPTION_TYPE_TARGET_LINK_LAYER    2               // ターゲットリンクレイヤアドレス\r
463 #define ICMPV6_OPTION_TYPE_PREFIX                               3               // プレフィックス情報\r
464 #define ICMPV6_OPTION_TYPE_MTU                                  5               // MTU\r
465 \r
466 // ICMPv6 リンクレイヤオプション\r
467 struct ICMPV6_OPTION_LINK_LAYER\r
468 {\r
469         ICMPV6_OPTION IcmpOptionHeader;                 // オプションヘッダ\r
470         UCHAR Address[6];                                               // MAC アドレス\r
471 } GCC_PACKED;\r
472 \r
473 // ICMPv6 プレフィックス情報オプション\r
474 struct ICMPV6_OPTION_PREFIX\r
475 {\r
476         ICMPV6_OPTION IcmpOptionHeader;                 // オプションヘッダ\r
477         UCHAR SubnetLength;                                             // サブネット長\r
478         UCHAR Flags;                                                    // フラグ\r
479         UINT ValidLifetime;                                             // 正式な寿命\r
480         UINT PreferredLifetime;                                 // 望ましい寿命\r
481         UINT Reserved;                                                  // 予約\r
482         IPV6_ADDR Prefix;                                               // プレフィックスアドレス\r
483 } GCC_PACKED;\r
484 \r
485 #define ICMPV6_OPTION_PREFIX_FLAG_ONLINK                0x80    // リンク上\r
486 #define ICMPV6_OPTION_PREFIX_FLAG_AUTO                  0x40    // 自動\r
487 \r
488 // ICMPv6 MTU オプション\r
489 struct ICMPV6_OPTION_MTU\r
490 {\r
491         ICMPV6_OPTION IcmpOptionHeader;                 // オプションヘッダ\r
492         USHORT Reserved;                                                // 予約\r
493         UINT Mtu;                                                               // MTU 値\r
494 } GCC_PACKED;\r
495 \r
496 \r
497 // IPv6 ヘッダ情報\r
498 struct IPV6_HEADER_INFO\r
499 {\r
500         bool IsRawIpPacket;\r
501         USHORT Size;\r
502         UINT Id;\r
503         UCHAR Protocol;\r
504         UCHAR HopLimit;\r
505         IPV6_ADDR SrcIpAddress;\r
506         IPV6_ADDR DestIpAddress;\r
507         bool UnicastForMe;\r
508         bool UnicastForRouting;\r
509         bool UnicastForRoutingWithProxyNdp;\r
510         bool IsBroadcast;\r
511         UINT TypeL4;\r
512 };\r
513 \r
514 // ICMPv6 ヘッダ情報\r
515 struct ICMPV6_HEADER_INFO\r
516 {\r
517         UCHAR Type;\r
518         UCHAR Code;\r
519         USHORT DataSize;\r
520         void *Data;\r
521         ICMP_ECHO EchoHeader;\r
522         void *EchoData;\r
523         UINT EchoDataSize;\r
524 \r
525         union\r
526         {\r
527                 // Type の値によって意味が決まる\r
528                 ICMPV6_ROUTER_SOLICIATION_HEADER *RouterSoliciationHeader;\r
529                 ICMPV6_ROUTER_ADVERTISEMENT_HEADER *RouterAdvertisementHeader;\r
530                 ICMPV6_NEIGHBOR_SOLICIATION_HEADER *NeighborSoliciationHeader;\r
531                 ICMPV6_NEIGHBOR_ADVERTISEMENT_HEADER *NeighborAdvertisementHeader;\r
532                 void *HeaderPointer;\r
533         } Headers;\r
534 \r
535         ICMPV6_OPTION_LIST OptionList;\r
536 };\r
537 \r
538 // ICMPv6 の Type の値\r
539 #define ICMPV6_TYPE_ECHO_REQUEST                                128             // ICMPv6 Echo 要求\r
540 #define ICMPV6_TYPE_ECHO_RESPONSE                               129             // ICMPv6 Echo 応答\r
541 #define ICMPV6_TYPE_ROUTER_SOLICIATION                  133             // ルータ要請\r
542 #define ICMPV6_TYPE_ROUTER_ADVERTISEMENT                134             // ルータ広告\r
543 #define ICMPV6_TYPE_NEIGHBOR_SOLICIATION                135             // 近隣要請\r
544 #define ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT              136             // 近隣広告\r
545 \r
546 // パケット\r
547 struct PKT\r
548 {\r
549         // このあたりは急いで実装したのでコードがあまり美しくない。\r
550         UCHAR                   *PacketData;    // パケットデータ本体\r
551         UINT                    PacketSize;             // パケットサイズ\r
552         MAC_HEADER              *MacHeader;             // MAC ヘッダ\r
553         UCHAR                   *MacAddressSrc; // 送信元 MAC アドレス\r
554         UCHAR                   *MacAddressDest;        // 宛先 MAC アドレス\r
555         bool                    BroadcastPacket;                // ブロードキャストパケット\r
556         bool                    InvalidSourcePacket;    // ソースアドレスが不正なパケット\r
557         bool                    AccessChecked;  // アクセスリストで通過が確認されたパケット\r
558         UINT                    VlanTypeID;             // タグ付き VLAN の TypeID (通常は 0x8100)\r
559         UINT                    VlanId;                 // VLAN ID\r
560         UINT                    Delay;                  // 遅延\r
561         UINT                    Jitter;                 // ジッタ\r
562         UINT                    Loss;                   // パケットロス\r
563         UINT64                  DelayedForwardTick;     // 遅延した場合における送信時刻\r
564         SESSION                 *DelayedSrcSession;     // 送信元のセッション\r
565         UINT                    TypeL3;                 // Layer-3 パケット分類\r
566         IPV6_HEADER_PACKET_INFO IPv6HeaderPacketInfo;   // IPv6 ヘッダパケット情報 (TypeL3 == L3_IPV6 の場合のみ)\r
567         ICMPV6_HEADER_INFO ICMPv6HeaderPacketInfo;              // ICMPv6 ヘッダ情報 (TypeL4 == L4_ICMPV6 の場合のみ)\r
568         union\r
569         {\r
570                 IPV4_HEADER             *IPv4Header;    // IPv4 ヘッダ\r
571                 ARPV4_HEADER    *ARPv4Header;   // ARPv4 ヘッダ\r
572                 IPV6_HEADER             *IPv6Header;    // IPv6 ヘッダ\r
573                 TAGVLAN_HEADER  *TagVlanHeader; // タグヘッダ\r
574                 BPDU_HEADER             *BpduHeader;    // BPDU ヘッダ\r
575                 void                    *PointerL3;\r
576         } L3;\r
577         UINT                    TypeL4;                         // Layer-4 パケット分類\r
578         union\r
579         {\r
580                 UDP_HEADER      *UDPHeader;                     // UDP ヘッダ\r
581                 TCP_HEADER      *TCPHeader;                     // TCP ヘッダ\r
582                 ICMP_HEADER     *ICMPHeader;            // ICMP ヘッダ\r
583                 void            *PointerL4;\r
584         } L4;\r
585         UINT                    TypeL7;                 // Layer-7 パケット分類\r
586         union\r
587         {\r
588                 DHCPV4_HEADER   *DHCPv4Header;  // DHCPv4 ヘッダ\r
589                 void                    *PointerL7;\r
590         } L7;\r
591 } GCC_PACKED;\r
592 \r
593 // Layer-3 パケット分類\r
594 #define L3_UNKNOWN                      0               // 不明\r
595 #define L3_ARPV4                        1               // ARPv4 パケット\r
596 #define L3_IPV4                         2               // IPv4 パケット\r
597 #define L3_TAGVLAN                      3               // タグ付き VLAN パケット\r
598 #define L3_BPDU                         4               // BPDU パケット\r
599 #define L3_IPV6                         5               // IPv6 パケット\r
600 \r
601 // Layer-4 パケット分類\r
602 #define L4_UNKNOWN                      0               // 不明\r
603 #define L4_UDP                          1               // UDPv4 パケット\r
604 #define L4_TCP                          2               // TCPv4 パケット\r
605 #define L4_ICMPV4                       3               // ICMPv4 パケット\r
606 #define L4_ICMPV6                       4               // ICMPv6 パケット\r
607 #define L4_FRAGMENT                     5               // フラグメントパケット\r
608 \r
609 // Layer-7 パケット分類\r
610 #define L7_UNKNOWN                      0               // 不明\r
611 #define L7_DHCPV4                       1               // DHCPv4 パケット\r
612 \r
613 \r
614 PKT *ParsePacket(UCHAR *buf, UINT size);\r
615 PKT *ParsePacketEx(UCHAR *buf, UINT size, bool no_l3);\r
616 PKT *ParsePacketEx2(UCHAR *buf, UINT size, bool no_l3, UINT vlan_type_id);\r
617 PKT *ParsePacketEx3(UCHAR *buf, UINT size, bool no_l3, UINT vlan_type_id, bool bridge_id_as_mac_address);\r
618 void FreePacket(PKT *p);\r
619 void FreePacketIPv4(PKT *p);\r
620 void FreePacketTagVlan(PKT *p);\r
621 void FreePacketARPv4(PKT *p);\r
622 void FreePacketUDPv4(PKT *p);\r
623 void FreePacketTCPv4(PKT *p);\r
624 void FreePacketICMPv4(PKT *p);\r
625 void FreePacketDHCPv4(PKT *p);\r
626 bool ParsePacketL2(PKT *p, UCHAR *buf, UINT size);\r
627 bool ParsePacketL2Ex(PKT *p, UCHAR *buf, UINT size, bool no_l3);\r
628 bool ParsePacketARPv4(PKT *p, UCHAR *buf, UINT size);\r
629 bool ParsePacketIPv4(PKT *p, UCHAR *buf, UINT size);\r
630 bool ParsePacketBPDU(PKT *p, UCHAR *buf, UINT size);\r
631 bool ParsePacketTAGVLAN(PKT *p, UCHAR *buf, UINT size);\r
632 bool ParseICMPv4(PKT *p, UCHAR *buf, UINT size);\r
633 bool ParseICMPv6(PKT *p, UCHAR *buf, UINT size);\r
634 bool ParseTCP(PKT *p, UCHAR *buf, UINT size);\r
635 bool ParseUDP(PKT *p, UCHAR *buf, UINT size);\r
636 void ParseDHCPv4(PKT *p, UCHAR *buf, UINT size);\r
637 PKT *ClonePacket(PKT *p, bool copy_data);\r
638 void FreeClonePacket(PKT *p);\r
639 \r
640 bool ParsePacketIPv6(PKT *p, UCHAR *buf, UINT size);\r
641 bool ParsePacketIPv6Header(IPV6_HEADER_PACKET_INFO *info, UCHAR *buf, UINT size);\r
642 bool ParseIPv6ExtHeader(IPV6_HEADER_PACKET_INFO *info, UCHAR next_header, UCHAR *buf, UINT size);\r
643 bool ParseICMPv6Options(ICMPV6_OPTION_LIST *o, UCHAR *buf, UINT size);\r
644 void CloneICMPv6Options(ICMPV6_OPTION_LIST *dst, ICMPV6_OPTION_LIST *src);\r
645 void FreeCloneICMPv6Options(ICMPV6_OPTION_LIST *o);\r
646 USHORT CalcChecksumForIPv6(IPV6_ADDR *src_ip, IPV6_ADDR *dest_ip, UCHAR protocol, void *data, UINT size);\r
647 BUF *BuildICMPv6Options(ICMPV6_OPTION_LIST *o);\r
648 void BuildICMPv6OptionValue(BUF *b, UCHAR type, void *header_pointer, UINT total_size);\r
649 BUF *BuildIPv6(IPV6_ADDR *dest_ip, IPV6_ADDR *src_ip, UINT id, UCHAR protocol, UCHAR hop_limit, void *data,\r
650                            UINT size);\r
651 BUF *BuildIPv6PacketHeader(IPV6_HEADER_PACKET_INFO *info, UINT *bytes_before_payload);\r
652 UCHAR IPv6GetNextHeaderFromQueue(QUEUE *q);\r
653 void BuildAndAddIPv6PacketOptionHeader(BUF *b, IPV6_OPTION_HEADER *opt, UCHAR next_header, UINT size);\r
654 BUF *BuildICMPv6NeighborSoliciation(IPV6_ADDR *src_ip, IPV6_ADDR *target_ip, UCHAR *my_mac_address, UINT id);\r
655 BUF *BuildICMPv6(IPV6_ADDR *src_ip, IPV6_ADDR *dest_ip, UCHAR hop_limit, UCHAR type, UCHAR code, void *data, UINT size, UINT id);\r
656 \r
657 bool VLanRemoveTag(void **packet_data, UINT *packet_size, UINT vlan_id);\r
658 void VLanInsertTag(void **packet_data, UINT *packet_size, UINT vlan_id);\r
659 \r
660 #ifdef  OS_WIN32\r
661 #pragma pack(pop)\r
662 #endif  // OS_WIN32\r
663 \r
664 #endif  // TCPIP_H\r
665 \r
666 \r