* 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
diff --git a/utvpn/utvpn-unix-v101-7101-public/src/Cedar/TcpIp.h b/utvpn/utvpn-unix-v101-7101-public/src/Cedar/TcpIp.h
new file mode 100644 (file)
index 0000000..5288814
--- /dev/null
@@ -0,0 +1,666 @@
+// SoftEther UT-VPN SourceCode\r
+// \r
+// Copyright (C) 2004-2010 SoftEther Corporation.\r
+// Copyright (C) 2004-2010 University of Tsukuba, Japan.\r
+// Copyright (C) 2003-2010 Daiyuu Nobori.\r
+// All Rights Reserved.\r
+// \r
+// http://utvpn.tsukuba.ac.jp/\r
+// \r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// version 2 as published by the Free Software Foundation.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License version 2\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+// \r
+// このファイルは GPL バージョン 2 ライセンスで公開されています。\r
+// 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布\r
+// することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示\r
+// を除去することはできません。改変した著作物を配布する場合は、改変実施者の\r
+// 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。\r
+// \r
+// この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の\r
+// ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )\r
+// および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって\r
+// ホストされています。\r
+// 本プログラムの配布者は、本プログラムを、業としての利用以外のため、\r
+// および、試験または研究のために利用が行われることを想定して配布\r
+// しています。\r
+// SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に\r
+// あります。\r
+// 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード\r
+// の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して\r
+// いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して\r
+// ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース\r
+// に組み込みさせていただきます。\r
+// \r
+// GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
+// 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
+// \r
+// 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
+// (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
+// ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの\r
+// 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
+// ください。\r
+// \r
+// お願い: どのような通信ソフトウェアにも通常は必ず未発見の\r
+// セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、\r
+// UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの\r
+// 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社\r
+// および脆弱性情報の届出を受け付ける公的機関まで通報いただき、\r
+// 公益保護にご協力いただきますようお願い申し上げます。\r
+// \r
+// ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を\r
+// 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客\r
+// を保護するための努力を行います。\r
+// \r
+// ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/\r
+// 日本国内の脆弱性情報届出受付公的機関:\r
+//         独立行政法人 情報処理推進機構\r
+//         http://www.ipa.go.jp/security/vuln/report/\r
+// \r
+// 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。\r
+// 連絡先: http://www.softether.co.jp/jp/contact/\r
+\r
+// -----------------------------------------------\r
+// [ChangeLog]\r
+// 2010.05.20\r
+//  新規リリース by SoftEther\r
+// -----------------------------------------------\r
+\r
+// TcpIp.h\r
+// TcpIp.c のヘッダ\r
+\r
+#ifndef        TCPIP_H\r
+#define        TCPIP_H\r
+\r
+#ifdef OS_WIN32\r
+#pragma pack(push, 1)\r
+#endif // OS_WIN32\r
+\r
+// MAC ヘッダ\r
+struct MAC_HEADER\r
+{\r
+       UCHAR   DestAddress[6];                 // 送信元 MAC アドレス\r
+       UCHAR   SrcAddress[6];                  // 宛先 MAC アドレス\r
+       USHORT  Protocol;                               // プロトコル\r
+} GCC_PACKED;\r
+\r
+// MAC プロトコル\r
+#define        MAC_PROTO_ARPV4         0x0806  // ARPv4 パケット\r
+#define        MAC_PROTO_IPV4          0x0800  // IPv4 パケット\r
+#define        MAC_PROTO_IPV6          0x86dd  // IPv6 パケット\r
+#define        MAC_PROTO_TAGVLAN       0x8100  // タグ付き VLAN パケット\r
+\r
+// LLC ヘッダ\r
+struct LLC_HEADER\r
+{\r
+       UCHAR   Dsap;\r
+       UCHAR   Ssap;\r
+       UCHAR   Ctl;\r
+} GCC_PACKED;\r
+\r
+// LLC ヘッダの DSAP, SSAP の値\r
+#define        LLC_DSAP_BPDU           0x42\r
+#define        LLC_SSAP_BPDU           0x42\r
+\r
+// BPDU ヘッダ\r
+struct BPDU_HEADER\r
+{\r
+       USHORT  ProtocolId;                             // プロトコル ID (STP == 0x0000)\r
+       UCHAR   Version;                                // バージョン\r
+       UCHAR   Type;                                   // 種類\r
+       UCHAR   Flags;                                  // フラグ\r
+       USHORT  RootPriority;                   // ルートブリッジのプライオリティ\r
+       UCHAR   RootMacAddress[6];              // ルートブリッジの MAC アドレス\r
+       UINT    RootPathCost;                   // ルートブリッジまでのパスコスト\r
+       USHORT  BridgePriority;                 // 発信ブリッジのプライオリティ\r
+       UCHAR   BridgeMacAddress[6];    // 発信ブリッジの MAC アドレス\r
+       USHORT  BridgePortId;                   // 発信ブリッジのポート ID\r
+       USHORT  MessageAge;                             // 有効期限\r
+       USHORT  MaxAge;                                 // 最大有効期限\r
+       USHORT  HelloTime;                              // Hello Time\r
+       USHORT  ForwardDelay;                   // Forward Delay\r
+} GCC_PACKED;\r
+\r
+// ARPv4 ヘッダ\r
+struct ARPV4_HEADER\r
+{\r
+       USHORT  HardwareType;                   // ハードウェアタイプ\r
+       USHORT  ProtocolType;                   // プロトコルタイプ\r
+       UCHAR   HardwareSize;                   // ハードウェアサイズ\r
+       UCHAR   ProtocolSize;                   // プロトコルサイズ\r
+       USHORT  Operation;                              // オペレーション\r
+       UCHAR   SrcAddress[6];                  // 送信元 MAC アドレス\r
+       UINT    SrcIP;                                  // 送信元 IP アドレス\r
+       UCHAR   TargetAddress[6];               // ターゲット MAC アドレス\r
+       UINT    TargetIP;                               // ターゲット IP アドレス\r
+} GCC_PACKED;\r
+\r
+// ARP ハードウェア種類\r
+#define        ARP_HARDWARE_TYPE_ETHERNET              0x0001\r
+\r
+// ARP オペレーション種類\r
+#define        ARP_OPERATION_REQUEST                   1\r
+#define        ARP_OPERATION_RESPONSE                  2\r
+\r
+// タグ付き VLAN ヘッダ\r
+struct TAGVLAN_HEADER\r
+{\r
+       UCHAR Data[2];                                  // データ\r
+} GCC_PACKED;\r
+\r
+// IPv4 ヘッダ\r
+struct IPV4_HEADER\r
+{\r
+       UCHAR   VersionAndHeaderLength;         // バージョンとヘッダサイズ\r
+       UCHAR   TypeOfService;                          // サービスタイプ\r
+       USHORT  TotalLength;                            // 合計サイズ\r
+       USHORT  Identification;                         // 識別子\r
+       UCHAR   FlagsAndFlagmentOffset[2];      // フラグとフラグメントオフセット\r
+       UCHAR   TimeToLive;                                     // TTL\r
+       UCHAR   Protocol;                                       // プロトコル\r
+       USHORT  Checksum;                                       // チェックサム\r
+       UINT    SrcIP;                                          // 送信元 IP アドレス\r
+       UINT    DstIP;                                          // 宛先 IP アドレス\r
+} GCC_PACKED;\r
+\r
+// IPv4 ヘッダ操作用マクロ\r
+#define        IPV4_GET_VERSION(h)                     (((h)->VersionAndHeaderLength >> 4 & 0x0f))\r
+#define        IPV4_SET_VERSION(h, v)          ((h)->VersionAndHeaderLength |= (((v) & 0x0f) << 4))\r
+#define        IPV4_GET_HEADER_LEN(h)          ((h)->VersionAndHeaderLength & 0x0f)\r
+#define        IPV4_SET_HEADER_LEN(h, v)       ((h)->VersionAndHeaderLength |= ((v) & 0x0f))\r
+\r
+// IPv4 フラグメント関係操作用マクロ\r
+#define        IPV4_GET_FLAGS(h)                       (((h)->FlagsAndFlagmentOffset[0] >> 5) & 0x07)\r
+#define        IPV4_SET_FLAGS(h, v)            ((h)->FlagsAndFlagmentOffset[0] |= (((v) & 0x07) << 5))\r
+#define        IPV4_GET_OFFSET(h)                      (((h)->FlagsAndFlagmentOffset[0] & 0x1f) * 256 + ((h)->FlagsAndFlagmentOffset[1]))\r
+#define        IPV4_SET_OFFSET(h, v)           {(h)->FlagsAndFlagmentOffset[0] |= (UCHAR)((v) / 256); (h)->FlagsAndFlagmentOffset[1] = (UCHAR)((v) % 256);}\r
+\r
+// IPv4 プロトコル\r
+#define        IP_PROTO_ICMPV4         0x01    // ICMPv4 プロトコル\r
+\r
+// IPv6 プロトコル\r
+#define        IP_PROTO_ICMPV6         0x3a    // ICMPv6 プロトコル\r
+\r
+// IPv4 / IPv6 共通プロトコル\r
+#define        IP_PROTO_TCP            0x06    // TCP プロトコル\r
+#define        IP_PROTO_UDP            0x11    // UDP プロトコル\r
+\r
+\r
+// UDP ヘッダ\r
+struct UDP_HEADER\r
+{\r
+       USHORT  SrcPort;                                        // 送信元ポート番号\r
+       USHORT  DstPort;                                        // 宛先ポート番号\r
+       USHORT  PacketLength;                   // データ長\r
+       USHORT  Checksum;                               // チェックサム\r
+} GCC_PACKED;\r
+\r
+// UDPv4 擬似ヘッダ\r
+struct UDPV4_PSEUDO_HEADER\r
+{\r
+       UINT    SrcIP;                                  // 送信元 IP アドレス\r
+       UINT    DstIP;                                  // 宛先 IP アドレス\r
+       UCHAR   Reserved;                               // 未使用\r
+       UCHAR   Protocol;                               // プロトコル番号\r
+       USHORT  PacketLength1;                  // UDP データ長 1\r
+       USHORT  SrcPort;                                        // 送信元ポート番号\r
+       USHORT  DstPort;                                        // 宛先ポート番号\r
+       USHORT  PacketLength2;                  // UDP データ長 2\r
+       USHORT  Checksum;                               // チェックサム\r
+} GCC_PACKED;\r
+\r
+// TCPv4 擬似ヘッダ\r
+struct TCPV4_PSEUDO_HEADER\r
+{\r
+       UINT    SrcIP;                                  // 送信元 IP アドレス\r
+       UINT    DstIP;                                  // 宛先 IP アドレス\r
+       UCHAR   Reserved;                               // 未使用\r
+       UCHAR   Protocol;                               // プロトコル番号\r
+       USHORT  PacketLength;                   // UDP データ長 1\r
+} GCC_PACKED;\r
+\r
+// TCP ヘッダ\r
+struct TCP_HEADER\r
+{\r
+       USHORT  SrcPort;                                        // 送信元ポート番号\r
+       USHORT  DstPort;                                        // 宛先ポート番号\r
+       UINT    SeqNumber;                              // シーケンス番号\r
+       UINT    AckNumber;                              // 確認応答番号\r
+       UCHAR   HeaderSizeAndReserved;  // ヘッダサイズと予約領域\r
+       UCHAR   Flag;                                   // フラグ\r
+       USHORT  WindowSize;                             // ウインドウサイズ\r
+       USHORT  Checksum;                               // チェックサム\r
+       USHORT  UrgentPointer;                  // 緊急ポインタ\r
+} GCC_PACKED;\r
+\r
+// TCP マクロ\r
+#define        TCP_GET_HEADER_SIZE(h)  (((h)->HeaderSizeAndReserved >> 4) & 0x0f)\r
+#define        TCP_SET_HEADER_SIZE(h, v)       ((h)->HeaderSizeAndReserved = (((v) & 0x0f) << 4))\r
+\r
+// TCP フラグ\r
+#define        TCP_FIN                                         1\r
+#define        TCP_SYN                                         2\r
+#define        TCP_RST                                         4\r
+#define        TCP_PSH                                         8\r
+#define        TCP_ACK                                         16\r
+#define        TCP_URG                                         32\r
+\r
+// ICMP ヘッダ\r
+struct ICMP_HEADER\r
+{\r
+       UCHAR   Type;                                   // タイプ\r
+       UCHAR   Code;                                   // コード\r
+       USHORT  Checksum;                               // チェックサム\r
+} GCC_PACKED;\r
+\r
+#define        ICMP_TYPE_ECHO_REQUEST          8               // ICMP Echo 要求\r
+#define        ICMP_TYPE_ECHO_RESPONSE         0               // ICMP Echo 応答\r
+\r
+// ICMP Echo\r
+struct ICMP_ECHO\r
+{\r
+       USHORT  Identifier;                                             // ID\r
+       USHORT  SeqNo;                                                  // シーケンス番号\r
+} GCC_PACKED;\r
+\r
+// DHCPv4 ヘッダ\r
+struct DHCPV4_HEADER\r
+{\r
+       UCHAR   OpCode;                         // オペコード\r
+       UCHAR   HardwareType;           // ハードウェア種類\r
+       UCHAR   HardwareAddressSize;    // ハードウェアアドレスサイズ\r
+       UCHAR   Hops;                           // ホップ数\r
+       UINT    TransactionId;          // トランザクション ID\r
+       USHORT  Seconds;                                // 秒数\r
+       USHORT  Flags;                          // フラグ\r
+       UINT    ClientIP;                       // クライアント IP アドレス\r
+       UINT    YourIP;                         // 割り当て IP アドレス\r
+       UINT    ServerIP;                       // サーバー IP アドレス\r
+       UINT    RelayIP;                                // リレー IP アドレス\r
+       UCHAR   ClientMacAddress[6];    // クライアント MAC アドレス\r
+       UCHAR   Padding[10];                    // Ethernet 以外のためにパディング\r
+} GCC_PACKED;\r
+\r
+// DNSv4 ヘッダ\r
+struct DNSV4_HEADER\r
+{\r
+       USHORT  TransactionId;                  // トランザクション ID\r
+       UCHAR   Flag1;                                  // フラグ 1\r
+       UCHAR   Flag2;                                  // フラグ 2\r
+       USHORT  NumQuery;                               // クエリ数\r
+       USHORT  AnswerRRs;                              // 回答 RR 数\r
+       USHORT  AuthorityRRs;                   // 権威 RR 数\r
+       USHORT  AdditionalRRs;                  // 追加 RR 数\r
+} GCC_PACKED;\r
+\r
+#define        DHCP_MAGIC_COOKIE       0x63825363      // Magic Cookie (固定)\r
+\r
+// IPv6 ヘッダパケット情報\r
+struct IPV6_HEADER_PACKET_INFO\r
+{\r
+       IPV6_HEADER *IPv6Header;                                        // IPv6 ヘッダ\r
+       IPV6_OPTION_HEADER *HopHeader;                          // ホップバイホップオプションヘッダ\r
+       UINT HopHeaderSize;                                                     // ホップバイホップオプションヘッダサイズ\r
+       IPV6_OPTION_HEADER *EndPointHeader;                     // 終点オプションヘッダ\r
+       UINT EndPointHeaderSize;                                        // 終点オプションヘッダサイズ\r
+       IPV6_OPTION_HEADER *RoutingHeader;                      // ルーティングヘッダ\r
+       UINT RoutingHeaderSize;                                         // ルーティングヘッダサイズ\r
+       IPV6_FRAGMENT_HEADER *FragmentHeader;           // フラグメントヘッダ\r
+       void *Payload;                                                          // ペイロード\r
+       UINT PayloadSize;                                                       // ペイロードサイズ\r
+       UCHAR Protocol;                                                         // ペイロードプロトコル\r
+       bool IsFragment;                                                        // フラグメントパケットかどうか\r
+};\r
+\r
+// IPv6 ヘッダ\r
+struct IPV6_HEADER\r
+{\r
+       UCHAR VersionAndTrafficClass1;          // バージョン番号 (4 bit) とトラフィッククラス 1 (4 bit)\r
+       UCHAR TrafficClass2AndFlowLabel1;       // トラフィッククラス 2 (4 bit) とフローラベル 1 (4 bit)\r
+       UCHAR FlowLabel2;                                       // フローラベル 2 (8 bit)\r
+       UCHAR FlowLabel3;                                       // フローラベル 3 (8 bit)\r
+       USHORT PayloadLength;                           // ペイロードの長さ (拡張ヘッダを含む)\r
+       UCHAR NextHeader;                                       // 次のヘッダ\r
+       UCHAR HopLimit;                                         // ホップリミット\r
+       IPV6_ADDR SrcAddress;                           // ソースアドレス\r
+       IPV6_ADDR DestAddress;                          // 宛先アドレス\r
+} GCC_PACKED;\r
+\r
+\r
+// IPv6 ヘッダ操作用マクロ\r
+#define IPV6_GET_VERSION(h)                    (((h)->VersionAndTrafficClass1 >> 4) & 0x0f)\r
+#define IPV6_SET_VERSION(h, v)         ((h)->VersionAndTrafficClass1 = ((h)->VersionAndTrafficClass1 & 0x0f) | ((v) << 4) & 0xf0)\r
+#define IPV6_GET_TRAFFIC_CLASS(h)      ((((h)->VersionAndTrafficClass1 << 4) & 0xf0) | ((h)->TrafficClass2AndFlowLabel1 >> 4) & 0x0f)\r
+#define        IPV6_SET_TRAFFIC_CLASS(h, v)    ((h)->VersionAndTrafficClass1 = ((h)->VersionAndTrafficClass1 & 0xf0) | (((v) >> 4) & 0x0f),\\r
+       (h)->TrafficClass2AndFlowLabel1 = (h)->TrafficClass2AndFlowLabel1 & 0x0f | ((v) << 4) & 0xf0)\r
+#define        IPV6_GET_FLOW_LABEL(h)          ((((h)->TrafficClass2AndFlowLabel1 << 16) & 0xf0000) | (((h)->FlowLabel2 << 8) & 0xff00) |\\r
+       (((h)->FlowLabel3) & 0xff))\r
+#define IPV6_SET_FLOW_LABEL(h, v)      ((h)->TrafficClass2AndFlowLabel1 = ((h)->TrafficClass2AndFlowLabel1 & 0xf0 | ((v) >> 16) & 0x0f),\\r
+       (h)->FlowLabel2 = ((v) >> 8) & 0xff,\\r
+       (h)->FlowLabel3 = (v) & 0xff)\r
+\r
+\r
+// IPv6 ホップ最大値 (ルーティングしない)\r
+#define IPV6_HOP_MAX                                   255\r
+\r
+// IPv6 ホップ標準数\r
+#define IPV6_HOP_DEFAULT                               127\r
+\r
+// IPv6 ヘッダ番号\r
+#define IPV6_HEADER_HOP                                        0       // ホップバイホップオプションヘッダ\r
+#define IPV6_HEADER_ENDPOINT                   60      // 終点オプションヘッダ\r
+#define IPV6_HEADER_ROUTING                            43      // ルーティングヘッダ\r
+#define IPV6_HEADER_FRAGMENT                   44      // フラグメントヘッダ\r
+#define IPV6_HEADER_NONE                               59      // 次ヘッダ無し\r
+\r
+// IPv6 オプションヘッダ\r
+// (ホップオプションヘッダ、終点オプションヘッダ、ルーティングヘッダで使用される)\r
+struct IPV6_OPTION_HEADER\r
+{\r
+       UCHAR NextHeader;                                       // 次のヘッダ\r
+       UCHAR Size;                                                     // ヘッダサイズ (/8)\r
+} GCC_PACKED;\r
+\r
+// IPv6 フラグメントヘッダ\r
+// (フラグメント不可能部分は、ルーティングヘッダがある場合はその直前まで、\r
+//  ホップバイホップオプションヘッダがある場合はその直前まで、\r
+//  それ以外の場合は最初の拡張ヘッダもしくはペイロードの直前まで)\r
+struct IPV6_FRAGMENT_HEADER\r
+{\r
+       UCHAR NextHeader;                                       // 次のヘッダ\r
+       UCHAR Reserved;                                         // 予約\r
+       UCHAR FlagmentOffset1;                          // フラグメントオフセット 1 (/8, 8 bit)\r
+       UCHAR FlagmentOffset2AndFlags;          // フラグメントオフセット 2 (/8, 5 bit) + 予約 (2 bit) + More フラグ (1 bit)\r
+       UINT Identification;                            // ID\r
+} GCC_PACKED;\r
+\r
+// IPv6 フラグメントヘッダ操作用マクロ\r
+#define IPV6_GET_FRAGMENT_OFFSET(h)            (((((h)->FlagmentOffset1) << 5) & 0x1fe0) | (((h)->FlagmentOffset2AndFlags >> 3) & 0x1f))\r
+#define IPV6_SET_FRAGMENT_OFFSET(h, v) ((h)->FlagmentOffset1 = (v / 32) & 0xff,        \\r
+       ((h)->FlagmentOffset2AndFlags = ((v % 256) << 3) & 0xf8) | ((h)->FlagmentOffset2AndFlags & 0x07))\r
+#define IPV6_GET_FLAGS(h)                              ((h)->FlagmentOffset2AndFlags & 0x0f)\r
+#define IPV6_SET_FLAGS(h, v)                           ((h)->FlagmentOffset2AndFlags = (((h)->FlagmentOffset2AndFlags & 0xf8) | (v & 0x07)))\r
+\r
+// フラグ\r
+#define IPV6_FRAGMENT_HEADER_FLAG_MORE_FRAGMENTS               0x01    // 次のフラグメントがある\r
+\r
+// IPv6 仮想ヘッダ\r
+struct IPV6_PSEUDO_HEADER\r
+{\r
+       IPV6_ADDR SrcAddress;                           // ソースアドレス\r
+       IPV6_ADDR DestAddress;                          // 宛先アドレス\r
+       UINT UpperLayerPacketSize;                      // 上位レイヤのパケットサイズ\r
+       UCHAR Padding[3];                                       // パディング\r
+       UCHAR NextHeader;                                       // 次ヘッダ (TCP / UDP)\r
+} GCC_PACKED;\r
+\r
+// ICMPv6 ルータ要請ヘッダ\r
+struct ICMPV6_ROUTER_SOLICIATION_HEADER\r
+{\r
+       UINT Reserved;                                                  // 予約\r
+       // + オプション (ソースリンクレイヤアドレス[任意])\r
+} GCC_PACKED;\r
+\r
+// ICMPv6 ルータ広告ヘッダ\r
+struct ICMPV6_ROUTER_ADVERTISEMENT_HEADER\r
+{\r
+       UCHAR CurHopLimit;                                              // デフォルトのホップリミット数\r
+       UCHAR Flags;                                                    // フラグ (0)\r
+       USHORT Lifetime;                                                // 寿命\r
+       UINT ReachableTime;                                             // 0\r
+       UINT RetransTimer;                                              // 0\r
+       // + オプション (プレフィックス情報[必須], MTU[任意])\r
+} GCC_PACKED;\r
+\r
+// ICMPv6 近隣要請ヘッダ\r
+struct ICMPV6_NEIGHBOR_SOLICIATION_HEADER\r
+{\r
+       UINT Reserved;                                                  // 予約\r
+       IPV6_ADDR TargetAddress;                                // ターゲットアドレス\r
+       // + オプション (ソースリンクレイヤアドレス[必須])\r
+} GCC_PACKED;\r
+\r
+// ICMPv6 近隣広告ヘッダ\r
+struct ICMPV6_NEIGHBOR_ADVERTISEMENT_HEADER\r
+{\r
+       UCHAR Flags;                                                    // フラグ\r
+       UCHAR Reserved[3];                                              // 予約\r
+       IPV6_ADDR TargetAddress;                                // ターゲットアドレス\r
+       // + オプション (ターゲットリンクレイヤアドレス)\r
+} GCC_PACKED;\r
+\r
+#define ICMPV6_NEIGHBOR_ADVERTISEMENT_FLAG_ROUTER              0x80    // ルータ\r
+#define ICMPV6_NEIGHBOR_ADVERTISEMENT_FLAG_SOLICITED   0x40    // 要請フラグ\r
+#define ICMPV6_NEIGHBOR_ADVERTISEMENT_FLAG_OVERWRITE   0x20    // 上書きフラグ\r
+\r
+// ICMPv6 オプションリスト\r
+struct ICMPV6_OPTION_LIST\r
+{\r
+       ICMPV6_OPTION_LINK_LAYER *SourceLinkLayer;              // ソースリンクレイヤアドレス\r
+       ICMPV6_OPTION_LINK_LAYER *TargetLinkLayer;              // ターゲットリンクレイヤアドレス\r
+       ICMPV6_OPTION_PREFIX *Prefix;                                   // プレフィックス情報\r
+       ICMPV6_OPTION_MTU *Mtu;                                                 // MTU\r
+} GCC_PACKED;\r
+\r
+// ICMPv6 オプション\r
+struct ICMPV6_OPTION\r
+{\r
+       UCHAR Type;                                                             // タイプ\r
+       UCHAR Length;                                                   // 長さ (/8, タイプと長さを含める)\r
+} GCC_PACKED;\r
+\r
+#define        ICMPV6_OPTION_TYPE_SOURCE_LINK_LAYER    1               // ソースリンクレイヤアドレス\r
+#define ICMPV6_OPTION_TYPE_TARGET_LINK_LAYER   2               // ターゲットリンクレイヤアドレス\r
+#define ICMPV6_OPTION_TYPE_PREFIX                              3               // プレフィックス情報\r
+#define ICMPV6_OPTION_TYPE_MTU                                 5               // MTU\r
+\r
+// ICMPv6 リンクレイヤオプション\r
+struct ICMPV6_OPTION_LINK_LAYER\r
+{\r
+       ICMPV6_OPTION IcmpOptionHeader;                 // オプションヘッダ\r
+       UCHAR Address[6];                                               // MAC アドレス\r
+} GCC_PACKED;\r
+\r
+// ICMPv6 プレフィックス情報オプション\r
+struct ICMPV6_OPTION_PREFIX\r
+{\r
+       ICMPV6_OPTION IcmpOptionHeader;                 // オプションヘッダ\r
+       UCHAR SubnetLength;                                             // サブネット長\r
+       UCHAR Flags;                                                    // フラグ\r
+       UINT ValidLifetime;                                             // 正式な寿命\r
+       UINT PreferredLifetime;                                 // 望ましい寿命\r
+       UINT Reserved;                                                  // 予約\r
+       IPV6_ADDR Prefix;                                               // プレフィックスアドレス\r
+} GCC_PACKED;\r
+\r
+#define ICMPV6_OPTION_PREFIX_FLAG_ONLINK               0x80    // リンク上\r
+#define ICMPV6_OPTION_PREFIX_FLAG_AUTO                 0x40    // 自動\r
+\r
+// ICMPv6 MTU オプション\r
+struct ICMPV6_OPTION_MTU\r
+{\r
+       ICMPV6_OPTION IcmpOptionHeader;                 // オプションヘッダ\r
+       USHORT Reserved;                                                // 予約\r
+       UINT Mtu;                                                               // MTU 値\r
+} GCC_PACKED;\r
+\r
+\r
+// IPv6 ヘッダ情報\r
+struct IPV6_HEADER_INFO\r
+{\r
+       bool IsRawIpPacket;\r
+       USHORT Size;\r
+       UINT Id;\r
+       UCHAR Protocol;\r
+       UCHAR HopLimit;\r
+       IPV6_ADDR SrcIpAddress;\r
+       IPV6_ADDR DestIpAddress;\r
+       bool UnicastForMe;\r
+       bool UnicastForRouting;\r
+       bool UnicastForRoutingWithProxyNdp;\r
+       bool IsBroadcast;\r
+       UINT TypeL4;\r
+};\r
+\r
+// ICMPv6 ヘッダ情報\r
+struct ICMPV6_HEADER_INFO\r
+{\r
+       UCHAR Type;\r
+       UCHAR Code;\r
+       USHORT DataSize;\r
+       void *Data;\r
+       ICMP_ECHO EchoHeader;\r
+       void *EchoData;\r
+       UINT EchoDataSize;\r
+\r
+       union\r
+       {\r
+               // Type の値によって意味が決まる\r
+               ICMPV6_ROUTER_SOLICIATION_HEADER *RouterSoliciationHeader;\r
+               ICMPV6_ROUTER_ADVERTISEMENT_HEADER *RouterAdvertisementHeader;\r
+               ICMPV6_NEIGHBOR_SOLICIATION_HEADER *NeighborSoliciationHeader;\r
+               ICMPV6_NEIGHBOR_ADVERTISEMENT_HEADER *NeighborAdvertisementHeader;\r
+               void *HeaderPointer;\r
+       } Headers;\r
+\r
+       ICMPV6_OPTION_LIST OptionList;\r
+};\r
+\r
+// ICMPv6 の Type の値\r
+#define ICMPV6_TYPE_ECHO_REQUEST                               128             // ICMPv6 Echo 要求\r
+#define ICMPV6_TYPE_ECHO_RESPONSE                              129             // ICMPv6 Echo 応答\r
+#define ICMPV6_TYPE_ROUTER_SOLICIATION                 133             // ルータ要請\r
+#define ICMPV6_TYPE_ROUTER_ADVERTISEMENT               134             // ルータ広告\r
+#define ICMPV6_TYPE_NEIGHBOR_SOLICIATION               135             // 近隣要請\r
+#define ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT             136             // 近隣広告\r
+\r
+// パケット\r
+struct PKT\r
+{\r
+       // このあたりは急いで実装したのでコードがあまり美しくない。\r
+       UCHAR                   *PacketData;    // パケットデータ本体\r
+       UINT                    PacketSize;             // パケットサイズ\r
+       MAC_HEADER              *MacHeader;             // MAC ヘッダ\r
+       UCHAR                   *MacAddressSrc; // 送信元 MAC アドレス\r
+       UCHAR                   *MacAddressDest;        // 宛先 MAC アドレス\r
+       bool                    BroadcastPacket;                // ブロードキャストパケット\r
+       bool                    InvalidSourcePacket;    // ソースアドレスが不正なパケット\r
+       bool                    AccessChecked;  // アクセスリストで通過が確認されたパケット\r
+       UINT                    VlanTypeID;             // タグ付き VLAN の TypeID (通常は 0x8100)\r
+       UINT                    VlanId;                 // VLAN ID\r
+       UINT                    Delay;                  // 遅延\r
+       UINT                    Jitter;                 // ジッタ\r
+       UINT                    Loss;                   // パケットロス\r
+       UINT64                  DelayedForwardTick;     // 遅延した場合における送信時刻\r
+       SESSION                 *DelayedSrcSession;     // 送信元のセッション\r
+       UINT                    TypeL3;                 // Layer-3 パケット分類\r
+       IPV6_HEADER_PACKET_INFO IPv6HeaderPacketInfo;   // IPv6 ヘッダパケット情報 (TypeL3 == L3_IPV6 の場合のみ)\r
+       ICMPV6_HEADER_INFO ICMPv6HeaderPacketInfo;              // ICMPv6 ヘッダ情報 (TypeL4 == L4_ICMPV6 の場合のみ)\r
+       union\r
+       {\r
+               IPV4_HEADER             *IPv4Header;    // IPv4 ヘッダ\r
+               ARPV4_HEADER    *ARPv4Header;   // ARPv4 ヘッダ\r
+               IPV6_HEADER             *IPv6Header;    // IPv6 ヘッダ\r
+               TAGVLAN_HEADER  *TagVlanHeader; // タグヘッダ\r
+               BPDU_HEADER             *BpduHeader;    // BPDU ヘッダ\r
+               void                    *PointerL3;\r
+       } L3;\r
+       UINT                    TypeL4;                         // Layer-4 パケット分類\r
+       union\r
+       {\r
+               UDP_HEADER      *UDPHeader;                     // UDP ヘッダ\r
+               TCP_HEADER      *TCPHeader;                     // TCP ヘッダ\r
+               ICMP_HEADER     *ICMPHeader;            // ICMP ヘッダ\r
+               void            *PointerL4;\r
+       } L4;\r
+       UINT                    TypeL7;                 // Layer-7 パケット分類\r
+       union\r
+       {\r
+               DHCPV4_HEADER   *DHCPv4Header;  // DHCPv4 ヘッダ\r
+               void                    *PointerL7;\r
+       } L7;\r
+} GCC_PACKED;\r
+\r
+// Layer-3 パケット分類\r
+#define        L3_UNKNOWN                      0               // 不明\r
+#define        L3_ARPV4                        1               // ARPv4 パケット\r
+#define        L3_IPV4                         2               // IPv4 パケット\r
+#define        L3_TAGVLAN                      3               // タグ付き VLAN パケット\r
+#define        L3_BPDU                         4               // BPDU パケット\r
+#define L3_IPV6                                5               // IPv6 パケット\r
+\r
+// Layer-4 パケット分類\r
+#define        L4_UNKNOWN                      0               // 不明\r
+#define        L4_UDP                          1               // UDPv4 パケット\r
+#define        L4_TCP                          2               // TCPv4 パケット\r
+#define        L4_ICMPV4                       3               // ICMPv4 パケット\r
+#define        L4_ICMPV6                       4               // ICMPv6 パケット\r
+#define        L4_FRAGMENT                     5               // フラグメントパケット\r
+\r
+// Layer-7 パケット分類\r
+#define        L7_UNKNOWN                      0               // 不明\r
+#define        L7_DHCPV4                       1               // DHCPv4 パケット\r
+\r
+\r
+PKT *ParsePacket(UCHAR *buf, UINT size);\r
+PKT *ParsePacketEx(UCHAR *buf, UINT size, bool no_l3);\r
+PKT *ParsePacketEx2(UCHAR *buf, UINT size, bool no_l3, UINT vlan_type_id);\r
+PKT *ParsePacketEx3(UCHAR *buf, UINT size, bool no_l3, UINT vlan_type_id, bool bridge_id_as_mac_address);\r
+void FreePacket(PKT *p);\r
+void FreePacketIPv4(PKT *p);\r
+void FreePacketTagVlan(PKT *p);\r
+void FreePacketARPv4(PKT *p);\r
+void FreePacketUDPv4(PKT *p);\r
+void FreePacketTCPv4(PKT *p);\r
+void FreePacketICMPv4(PKT *p);\r
+void FreePacketDHCPv4(PKT *p);\r
+bool ParsePacketL2(PKT *p, UCHAR *buf, UINT size);\r
+bool ParsePacketL2Ex(PKT *p, UCHAR *buf, UINT size, bool no_l3);\r
+bool ParsePacketARPv4(PKT *p, UCHAR *buf, UINT size);\r
+bool ParsePacketIPv4(PKT *p, UCHAR *buf, UINT size);\r
+bool ParsePacketBPDU(PKT *p, UCHAR *buf, UINT size);\r
+bool ParsePacketTAGVLAN(PKT *p, UCHAR *buf, UINT size);\r
+bool ParseICMPv4(PKT *p, UCHAR *buf, UINT size);\r
+bool ParseICMPv6(PKT *p, UCHAR *buf, UINT size);\r
+bool ParseTCP(PKT *p, UCHAR *buf, UINT size);\r
+bool ParseUDP(PKT *p, UCHAR *buf, UINT size);\r
+void ParseDHCPv4(PKT *p, UCHAR *buf, UINT size);\r
+PKT *ClonePacket(PKT *p, bool copy_data);\r
+void FreeClonePacket(PKT *p);\r
+\r
+bool ParsePacketIPv6(PKT *p, UCHAR *buf, UINT size);\r
+bool ParsePacketIPv6Header(IPV6_HEADER_PACKET_INFO *info, UCHAR *buf, UINT size);\r
+bool ParseIPv6ExtHeader(IPV6_HEADER_PACKET_INFO *info, UCHAR next_header, UCHAR *buf, UINT size);\r
+bool ParseICMPv6Options(ICMPV6_OPTION_LIST *o, UCHAR *buf, UINT size);\r
+void CloneICMPv6Options(ICMPV6_OPTION_LIST *dst, ICMPV6_OPTION_LIST *src);\r
+void FreeCloneICMPv6Options(ICMPV6_OPTION_LIST *o);\r
+USHORT CalcChecksumForIPv6(IPV6_ADDR *src_ip, IPV6_ADDR *dest_ip, UCHAR protocol, void *data, UINT size);\r
+BUF *BuildICMPv6Options(ICMPV6_OPTION_LIST *o);\r
+void BuildICMPv6OptionValue(BUF *b, UCHAR type, void *header_pointer, UINT total_size);\r
+BUF *BuildIPv6(IPV6_ADDR *dest_ip, IPV6_ADDR *src_ip, UINT id, UCHAR protocol, UCHAR hop_limit, void *data,\r
+                          UINT size);\r
+BUF *BuildIPv6PacketHeader(IPV6_HEADER_PACKET_INFO *info, UINT *bytes_before_payload);\r
+UCHAR IPv6GetNextHeaderFromQueue(QUEUE *q);\r
+void BuildAndAddIPv6PacketOptionHeader(BUF *b, IPV6_OPTION_HEADER *opt, UCHAR next_header, UINT size);\r
+BUF *BuildICMPv6NeighborSoliciation(IPV6_ADDR *src_ip, IPV6_ADDR *target_ip, UCHAR *my_mac_address, UINT id);\r
+BUF *BuildICMPv6(IPV6_ADDR *src_ip, IPV6_ADDR *dest_ip, UCHAR hop_limit, UCHAR type, UCHAR code, void *data, UINT size, UINT id);\r
+\r
+bool VLanRemoveTag(void **packet_data, UINT *packet_size, UINT vlan_id);\r
+void VLanInsertTag(void **packet_data, UINT *packet_size, UINT vlan_id);\r
+\r
+#ifdef OS_WIN32\r
+#pragma pack(pop)\r
+#endif // OS_WIN32\r
+\r
+#endif // TCPIP_H\r
+\r
+\r