1 // SoftEther UT-VPN SourceCode
\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
8 // http://utvpn.tsukuba.ac.jp/
\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
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
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
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。
\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布
\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示
\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の
\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。
\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
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、
\r
34 // および、試験または研究のために利用が行われることを想定して配布
\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に
\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード
\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して
\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して
\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース
\r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する
\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。
\r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社
\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。
\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの
\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意
\r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の
\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、
\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの
\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社
\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、
\r
58 // 公益保護にご協力いただきますようお願い申し上げます。
\r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を
\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客
\r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/
\r
65 // 日本国内の脆弱性情報届出受付公的機関:
\r
67 // http://www.ipa.go.jp/security/vuln/report/
\r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。
\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/
\r
72 // -----------------------------------------------
\r
75 // 新規リリース by SoftEther
\r
76 // -----------------------------------------------
\r
85 #pragma pack(push, 1)
\r
91 UCHAR DestAddress[6]; // 送信元 MAC アドレス
\r
92 UCHAR SrcAddress[6]; // 宛先 MAC アドレス
\r
93 USHORT Protocol; // プロトコル
\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
110 // LLC ヘッダの DSAP, SSAP の値
\r
111 #define LLC_DSAP_BPDU 0x42
\r
112 #define LLC_SSAP_BPDU 0x42
\r
117 USHORT ProtocolId; // プロトコル ID (STP == 0x0000)
\r
118 UCHAR Version; // バージョン
\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
134 struct ARPV4_HEADER
\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
148 #define ARP_HARDWARE_TYPE_ETHERNET 0x0001
\r
151 #define ARP_OPERATION_REQUEST 1
\r
152 #define ARP_OPERATION_RESPONSE 2
\r
155 struct TAGVLAN_HEADER
\r
157 UCHAR Data[2]; // データ
\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
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
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
188 #define IP_PROTO_ICMPV4 0x01 // ICMPv4 プロトコル
\r
191 #define IP_PROTO_ICMPV6 0x3a // ICMPv6 プロトコル
\r
193 // IPv4 / IPv6 共通プロトコル
\r
194 #define IP_PROTO_TCP 0x06 // TCP プロトコル
\r
195 #define IP_PROTO_UDP 0x11 // UDP プロトコル
\r
201 USHORT SrcPort; // 送信元ポート番号
\r
202 USHORT DstPort; // 宛先ポート番号
\r
203 USHORT PacketLength; // データ長
\r
204 USHORT Checksum; // チェックサム
\r
208 struct UDPV4_PSEUDO_HEADER
\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
222 struct TCPV4_PSEUDO_HEADER
\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
234 USHORT SrcPort; // 送信元ポート番号
\r
235 USHORT DstPort; // 宛先ポート番号
\r
236 UINT SeqNumber; // シーケンス番号
\r
237 UINT AckNumber; // 確認応答番号
\r
238 UCHAR HeaderSizeAndReserved; // ヘッダサイズと予約領域
\r
240 USHORT WindowSize; // ウインドウサイズ
\r
241 USHORT Checksum; // チェックサム
\r
242 USHORT UrgentPointer; // 緊急ポインタ
\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
262 USHORT Checksum; // チェックサム
\r
265 #define ICMP_TYPE_ECHO_REQUEST 8 // ICMP Echo 要求
\r
266 #define ICMP_TYPE_ECHO_RESPONSE 0 // ICMP Echo 応答
\r
271 USHORT Identifier; // ID
\r
272 USHORT SeqNo; // シーケンス番号
\r
276 struct DHCPV4_HEADER
\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
294 struct DNSV4_HEADER
\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
305 #define DHCP_MAGIC_COOKIE 0x63825363 // Magic Cookie (固定)
\r
308 struct IPV6_HEADER_PACKET_INFO
\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
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
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
352 // IPv6 ホップ最大値 (ルーティングしない)
\r
353 #define IPV6_HOP_MAX 255
\r
356 #define IPV6_HOP_DEFAULT 127
\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
366 // (ホップオプションヘッダ、終点オプションヘッダ、ルーティングヘッダで使用される)
\r
367 struct IPV6_OPTION_HEADER
\r
369 UCHAR NextHeader; // 次のヘッダ
\r
370 UCHAR Size; // ヘッダサイズ (/8)
\r
374 // (フラグメント不可能部分は、ルーティングヘッダがある場合はその直前まで、
\r
375 // ホップバイホップオプションヘッダがある場合はその直前まで、
\r
376 // それ以外の場合は最初の拡張ヘッダもしくはペイロードの直前まで)
\r
377 struct IPV6_FRAGMENT_HEADER
\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
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
394 #define IPV6_FRAGMENT_HEADER_FLAG_MORE_FRAGMENTS 0x01 // 次のフラグメントがある
\r
397 struct IPV6_PSEUDO_HEADER
\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
407 struct ICMPV6_ROUTER_SOLICIATION_HEADER
\r
409 UINT Reserved; // 予約
\r
410 // + オプション (ソースリンクレイヤアドレス[任意])
\r
414 struct ICMPV6_ROUTER_ADVERTISEMENT_HEADER
\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
425 struct ICMPV6_NEIGHBOR_SOLICIATION_HEADER
\r
427 UINT Reserved; // 予約
\r
428 IPV6_ADDR TargetAddress; // ターゲットアドレス
\r
429 // + オプション (ソースリンクレイヤアドレス[必須])
\r
433 struct ICMPV6_NEIGHBOR_ADVERTISEMENT_HEADER
\r
435 UCHAR Flags; // フラグ
\r
436 UCHAR Reserved[3]; // 予約
\r
437 IPV6_ADDR TargetAddress; // ターゲットアドレス
\r
438 // + オプション (ターゲットリンクレイヤアドレス)
\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
446 struct ICMPV6_OPTION_LIST
\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
455 struct ICMPV6_OPTION
\r
458 UCHAR Length; // 長さ (/8, タイプと長さを含める)
\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
466 // ICMPv6 リンクレイヤオプション
\r
467 struct ICMPV6_OPTION_LINK_LAYER
\r
469 ICMPV6_OPTION IcmpOptionHeader; // オプションヘッダ
\r
470 UCHAR Address[6]; // MAC アドレス
\r
473 // ICMPv6 プレフィックス情報オプション
\r
474 struct ICMPV6_OPTION_PREFIX
\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
485 #define ICMPV6_OPTION_PREFIX_FLAG_ONLINK 0x80 // リンク上
\r
486 #define ICMPV6_OPTION_PREFIX_FLAG_AUTO 0x40 // 自動
\r
488 // ICMPv6 MTU オプション
\r
489 struct ICMPV6_OPTION_MTU
\r
491 ICMPV6_OPTION IcmpOptionHeader; // オプションヘッダ
\r
492 USHORT Reserved; // 予約
\r
498 struct IPV6_HEADER_INFO
\r
500 bool IsRawIpPacket;
\r
505 IPV6_ADDR SrcIpAddress;
\r
506 IPV6_ADDR DestIpAddress;
\r
508 bool UnicastForRouting;
\r
509 bool UnicastForRoutingWithProxyNdp;
\r
515 struct ICMPV6_HEADER_INFO
\r
521 ICMP_ECHO EchoHeader;
\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
535 ICMPV6_OPTION_LIST OptionList;
\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
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
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
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
577 UINT TypeL4; // Layer-4 パケット分類
\r
580 UDP_HEADER *UDPHeader; // UDP ヘッダ
\r
581 TCP_HEADER *TCPHeader; // TCP ヘッダ
\r
582 ICMP_HEADER *ICMPHeader; // ICMP ヘッダ
\r
585 UINT TypeL7; // Layer-7 パケット分類
\r
588 DHCPV4_HEADER *DHCPv4Header; // DHCPv4 ヘッダ
\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
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
610 #define L7_UNKNOWN 0 // 不明
\r
611 #define L7_DHCPV4 1 // DHCPv4 パケット
\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
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
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
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