mystab_pcap.h

最終更新:2010/1/12

mystab_pcap.h

001: /*
002:  * mystab_pcap.h
003:  * libpcap を用いた TCP パケット解析用スタブ
004:  */
005: 
006: #ifndef _MYSTAB_PCAP_H_
007: #define _MYSTAB_PCAP_H_
008: 
009: #include <stdio.h>
010: #include <stdlib.h>
011: #include <string.h>
012: 
013: #ifndef lib_pcap_pcap_h
014: #include <pcap.h>
015: #endif
016: 
017: #ifndef _MYSTAB_H_
018: #include "mystab.h"
019: #endif
020: 
021: #ifndef APR_STRINGS_H
022: #include "apr_strings.h"
023: #endif
024: 
025: #define ERR_BUF_SIZE    1024
026: 
027: #if defined(WIN32) || defined(WINDOWS) || defined(MSVC)
028: #define snprintf sprintf_s
029: 
030: /*
031:  * ネットワークデバイスのリストの出力
032:  * (Windows のみ)
033:  * 返り値:
034:  *   成功:1
035:  *   失敗:0 (errbuf にエラーメッセージが保存される)
036:  */
037: 
038: int disp_devices(
039:   apr_file_t *out   /* 出力ファイルハンドラ */
040:   , char *errbuf    /* エラーメッセージの保存される領域 */
041:   , int errbuf_size /* errbuf の領域のサイズ */
042: );
043: #endif /* defined(WIN32) || defined(WINDOWS) || defined(MSVC) */
044: 
045: /* libpcap API で使用するパラメータ構造体 */
046: 
047: typedef struct _my_pcap_parms_st {
048:   /* 監視対象のネットワークデバイス */
049:   const char *device;
050:   /* キャプチャするパケットのサイズ */
051:   int snaplen;
052:   /* promiscuous modeのフラグ。ON:1 OFF:0 */
053:   int pflag;
054:   /* パケット読み出しのタイムアウト秒 */
055:   int to_ms;
056:   /* フィルタ文字列 */
057:   char *filter;
058:   /* フィルタ文字列の最適化フラグ。最適化あり:1 なし:0 */
059:   int Oflag;
060:   /* パケットを取得する回数。負の時にはエラーになるまで。 */
061:   int cnt;
062: } my_pcap_params;
063: 
064: typedef struct my_tcp_pkt_st {
065:   /* IP パケットの先頭 */
066:   apr_byte_t *ip_header_pos;
067:   /* IP ヘッダのサイズ */
068:   apr_byte_t ip_header_size;
069:   /* 送信元IPアドレス XXX.XXX.XXX.XXX */
070:   char ip_src_addr[16];
071:   /* 送信先IPアドレス XXX.XXX.XXX.XXX */
072:   char ip_dst_addr[16];
073:   /* IP データグラムのサイズ(IPヘッダ含む) */
074:   apr_uint16_t ip_datagram_size;
075: 
076:   /* TCP パケットの先頭 */
077:   apr_byte_t *tcp_header_pos;
078:   /* TCP ヘッダのサイズ */
079:   apr_byte_t tcp_header_size;
080:   /* 送信元ポート */
081:   apr_uint16_t tcp_src_port;
082:   /* 送信先ポート */
083:   apr_uint16_t tcp_dst_port;
084:   /* TCP シーケンス番号 */
085:   apr_uint32_t tcp_seq_no;
086:   /* TCP ACK 番号 */
087:   apr_uint32_t tcp_ack_no;
088: 
089:    /* コードビットフラグ */
090:   apr_byte_t tcp_urg_bit;
091:   apr_byte_t tcp_ack_bit;
092:   apr_byte_t tcp_psh_bit;
093:   apr_byte_t tcp_rst_bit;
094:   apr_byte_t tcp_syn_bit;
095:   apr_byte_t tcp_fin_bit;
096: 
097:   /* TCP ペイロードのサイズ */
098:   apr_uint16_t tcp_payload_size;
099:   
100:   /* TCP ペイロードの先頭 */
101:   apr_byte_t *tcp_payload_pos;
102: 
103: } my_tcp_pkt;
104: 
105: 
106: /*
107:  * PCAP 用パラメータの設定と独自データを初期化する関数
108:  * 返り値:
109:  *   成功:1
110:  *   失敗:0
111:  * メモ:
112:  *   コマンドライン引数を解析して libpcap API 用パラメータを設定する
113:  *   処理を実装する。必要に応じて、独自データの初期化も行う。
114:  *   独自データの解放などの終期化処理は my_pcap_finally の中で実装する。
115:  */
116: 
117: int my_pcap_init (
118:   int ac                   /* コマンドライン引数の個数 */
119:   , char **av              /* コマンドライン引数の配列 */
120:   , my_pcap_params *params /* libpcap API 用パラメータ構造体 */
121:   , apr_file_t *astderr    /* エラー出力ファイルポインタ */
122:   , apr_pool_t *pool       /* メモリプール */
123: );
124: 
125: /*
126:  * TCP パケットを処理する関数
127:  * ・TCP パケットをキャプチャする度に呼ばれる関数
128:  */
129: 
130: void my_pcap_main(
131:   apr_pool_t *pool  /* メモリプール */
132:   , apr_file_t *out /* 出力ファイルポインタ */
133:   , my_tcp_pkt *d   /* TCP パケット */
134: );
135: 
136: /*
137:  * 終期化関数
138:  * メモ:
139:  *   my_pcap_init で作成した独自データの解放などの処理を実装する。
140:  */
141: 
142: void my_pcap_finally (
143:   apr_file_t *out
144: );
145: 
146: #endif
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)