etherealもwiresharkと名前を変えてしまいましたが、(6年ぶりに)続報です。
この機能を使えば、QualNet 5.1のSIPのシーケンス図をwiresharkのFlowGraph機能を使ってみることができるのではないかと思い、試してみたのですが、どうもうまくいきませんでした。
(TCPヘッダまでは見えるのに、データ領域は0バイトと認識されてしまい、アプリケーション領域のデータを見ることができませんでした。)
そこでこのtcptrace.dmpファイルを出力している箇所をソースコード上で確認してみたところ、どうやらわざとそのようにしているということが分かりました。
(TCP-TRACEを使ってTCPのシーケンスを見るためだけならTCPヘッダさえ見れれば良いということになるので、この機能は恐らくそのことだけに目的を絞った機能ということなのでしょう。)
で、いろいろと触ってみたところ、とりあえずSIPのシーケンスをwiresharkで見れるようにできたので、改造箇所を参考までに紹介します。
(VirtualPayload等を使わずに真面目にメモリをアロケートしてパケットを生成しているプロトコルであれば、他のTCP上で動作するプロトコルでも同じように見ることができるはずです。※ただQualNet標準のHTTPやFTPはあくまでトラフィックパターンをモデル化したものなのでそのようにはなってません。)
添付画像は、QUALNET_HOME/scenarios/multimedia_enterprise/voip/sip/singledomain-proxy-routed-normalシナリオを実行し、その結果できたtcptrace.dmpをwiresharkで表示した際の画面キャプチャです。
他の方の参考になれば幸いです。
なお試した環境は、WIndows 7 / QualNet 5.1です。
transport_tcp_output.cpp
340 void tcp_output(
341 Node *node,
342 struct tcpcb *tp,
343 UInt32 tcp_now,
344 struct tcpstat *tcp_stat)
345 {
... 中略 ...
1015 anEcnCapablePacket = TransportTcpSetEcnCapablePacket(node, tp, ti);
1016 TransportTcpSetEcnEchoAndCWR(node, tp, ti);
1017
ti->msg = MESSAGE_Duplicate(node, msg); // !!!この行を追加!!!
1018 TransportTcpTrace(node, tp, ti, "output");
1019 if (anEcnCapablePacket) {
1020 TransportTcpTrace(node, 0, 0, "ECT");
1021 }
1022 TransportTcpTrace(node, tp, ti, "variables");
MESSAGE_Free(node, ti->msg); // !!!この行を追加!!!
ti->msg = NULL; // !!!この行を追加!!!
1023
1024 MESSAGE_RemoveHeader(node, msg, sizeof(struct ipovly), TRACE_TCP);
1025
... 中略 ...
1163 }
transport_tcp.cpp
2355 static
2356 struct tcpiphdr TransportTcpConvertHdrToNetworkOrder(struct tcpiphdr *ti)
2357 {
2358 struct tcpiphdr aHdr;
2359
2360 memcpy(&aHdr, ti, sizeof(struct tcpiphdr));
2361
... 中略 ...
2382 aHdr.ti_sport = qn_htons(aHdr.ti_sport);
2383 aHdr.ti_dport = qn_htons(aHdr.ti_dport);
2384 aHdr.ti_seq = qn_htonl(aHdr.ti_seq);
2385 aHdr.ti_ack = qn_htonl(aHdr.ti_ack);
2386 aHdr.ti_win = qn_htons((unsigned short)(aHdr.ti_win));
2387 aHdr.ti_sum = qn_htons(aHdr.ti_sum);
aHdr.ti_urp = qn_htons(aHdr.ti_urp);
aHdr.ti_t.tcpHdr_x_off = ((aHdr.ti_t.tcpHdr_x_off & 0x0f) << 4) | // !!!この行を追加!!!
((aHdr.ti_t.tcpHdr_x_off & 0xf0) >> 4); // !!!この行を追加!!!
... 中略 ...
2398 return (aHdr);
2399 }
2562 static
2563 BOOL TransportTcpTraceDumpBinaryData(
2564 Node *node,
2565 struct tcpcb *tp,
2566 struct tcpiphdr *ti,
2567 const char *theMsg,
2568 FILE *fp,
2569 UInt32 aCount)
2570 {
... 中略 ...
2602 if (aTcpIpHdr.ti_src.networkType == NETWORK_IPV4) {
2603 aPacketLength = MAC_HEADER_LEN + IPv4_HEADER_LEN + ti->ti_len;
2604 anInt = aPacketLength; // capture length
2605
2606 //if (anInt > IPv4_TCPDUMP_LENGTH_MAX) { // !!!この行をコメントアウト!!!
2607 // anInt = IPv4_TCPDUMP_LENGTH_MAX; // !!!この行をコメントアウト!!!
2608 // aDataLength = IPv4_TCPDUMP_LENGTH_MAX - MAC_HEADER_LEN // !!!この行をコメントアウト!!!
2609 // - IPv4_HEADER_LEN - sizeof(struct tcphdr) - anOptionLength; // !!!この行をコメントアウト!!!
2610 //} // !!!この行をコメントアウト!!!
2611 } else {
2612 aPacketLength = MAC_HEADER_LEN + IPv6_HEADER_LEN + ti->ti_len;
2613 anInt = aPacketLength; // capture length
2614
2615 //if (anInt > IPv6_TCPDUMP_LENGTH_MAX) { // !!!この行をコメントアウト!!!
2616 // anInt = IPv6_TCPDUMP_LENGTH_MAX; // !!!この行をコメントアウト!!!
2617 // aDataLength = IPv6_TCPDUMP_LENGTH_MAX - MAC_HEADER_LEN // !!!この行をコメントアウト!!!
2618 // - IPv6_HEADER_LEN - sizeof(struct tcphdr) - anOptionLength; // !!!この行をコメントアウト!!!
2619 //} // !!!この行をコメントアウト!!!
2620 }
... 中略 ...
2806 if (aDataLength) {
2807 //aDataPtr = (unsigned char *)ti + anOptionLength // !!!この行をコメントアウト!!!
2808 // + sizeof(struct tcpiphdr); // !!!この行をコメントアウト!!!
if (!strcmp(theMsg, "output")) // !!!この行を追加!!!
{ // !!!この行を追加!!!
aDataPtr = (unsigned char *)MESSAGE_ReturnPacket(ti->msg) // !!!この行を追加!!!
+ anOptionLength + sizeof(struct tcphdr) + sizeof(struct ipovly); // !!!この行を追加!!!
} else { // !!!この行を追加!!!
aDataPtr = (unsigned char *)ti + anOptionLength // !!!この行を追加!!!
+ sizeof(struct tcpiphdr); // !!!この行を追加!!!
} // !!!この行を追加!!!
2809 //memset(aString, 0xf0, aDataLength); // !!!この行をコメントアウト!!!
2810 //if(fwrite(&aString, sizeof(unsigned char), aDataLength, fp) // !!!この行をコメントアウト!!!
2811 // != aDataLength) // !!!この行をコメントアウト!!!
2812 //{ // !!!この行をコメントアウト!!!
2813 // return(FALSE); // !!!この行をコメントアウト!!!
2814 //} // !!!この行をコメントアウト!!!
2815 fwrite(aDataPtr, sizeof(unsigned char), aDataLength, fp); // !!!この行をコメント解除!!!
2816 }
2817
2818 return(TRUE);
2819 }
wireshark_sip_flowgraph.PNG