source: lab.git/Dev/utvpn/utvpn-unix-v101-7101-public/src/Cedar/TcpIp.h @ a1bae3e

trunk
Last change on this file since a1bae3e was a1bae3e, checked in by mitty <mitty@…>, 12 years ago
  • copy vendor drop to trunk

git-svn-id: https://lab.mitty.jp/svn/lab/trunk@147 7d2118f6-f56c-43e7-95a2-4bb3031d96e7

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