Japan QualNet Community Forums Japan QualNet Community Forums
Welcome Guest 
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
検索
メインメニュー
アクセスカウンター
2024/05/04:15/16
2024/05/03:22/24

2024/03/05より324/1375
人気モジュール
No.1: フォーラム 118
No.2: ニュース 3
No.3: QualNet概要 1
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット99
No.2:Windows NT1

No.1:どっかの巡回ロボット96
No.2:Majestic-12巡回ロボット2
No.3:Safari1

日曜日からの合計
メイン
   Network Layer Settings: IP, QoS, Queuing & Scheduling
     IPv6におけるLink Layer Notification
投稿するにはまず登録を

題名 投稿者 日時
   IPv6におけるLink Layer Notification kyama 2006/2/10 16:12
     Re: IPv6におけるLink Layer Notification puruta 2006/2/14 10:24
       Re: IPv6におけるLink Layer Notification kyama 2006/2/20 12:07
         Re: IPv6におけるLink Layer Notification forum_support 2006/2/20 22:13
           Re: IPv6におけるLink Layer Notification kyama 2006/2/22 16:26
           » Re: IPv6におけるLink Layer Notification forum_support 2006/2/24 21:39
               Re: IPv6におけるLink Layer Notification kyama 2006/2/27 17:23
フラット表示 前のトピック | 次のトピック
投稿者 スレッド
forum_support
投稿日時: 2006/2/24 21:39
モデレータ
登録日: 2005/5/17
居住地: 東京都中野区中央4-5-3 ?構造計画研究所
投稿: 322
Re: IPv6におけるLink Layer Notification
引用:

関数名は、NetworkIpSetMacLayerStatusEventHandlerFunction関数です。
よろしくお願いします。


お返事がおそくなりました。

ソースコードを調べてみましたが、QualNetのIPv6のコードには
NetworkIpSetMacLayerStatusEventHandlerFunction()に相当する関数は見当たりません。
つまり、IPv6ではLink Layer Notificationはサポートされていません。ただ、ソースに手を
入れて実装できないことはないと思います。必ず目的が達成できるという保証はありませんが、
ソースコードに手を入れられる際の参考までに、私どもで解析した情報を載せておきたいと思
います。

ipv6.cppのソースを見ると、以下のようにMAC層からのコールバック関数はNULLに設定されて
います。


00716     // MAC Layer information.
00717     ip->interfaceInfo[interfaceIndex]
00718         ->macLayerStatusEventHandlerFunction = NULL;


NetworkIpSetMacLayerStatusEventHandlerFunction()はip.cppの中に定義されている関数で、
MAC層からのパケットドロップ通知時にコールバックされる関数をインタフェース構造体に
登録する関数です。このIPv4用の関数を使えば、一旦NULLに設定されたIPv6用コールバック
関数のポインタを設定できるはずです。


03736 void
03737 NetworkIpSetMacLayerStatusEventHandlerFunction(
03738     Node *node,
03739     MacLayerStatusEventHandlerFunctionType StatusEventHandlerPtr,
03740     int interfaceIndex)
03741 {
03742     NetworkDataIp *ip = (NetworkDataIp *) node->networkData.networkVar;
03743 
03744     ERROR_Assert(ip->interfaceInfo[interfaceIndex]->
03745                      macLayerStatusEventHandlerFunction == NULL,
03746                  "MAC-layer event handler function already set");
03747 
03748     ip->interfaceInfo[interfaceIndex]->macLayerStatusEventHandlerFunction =
03749                                                          StatusEventHandlerPtr;
03750 }


これと対になっているのが、NetworkIpGetMacLayerStatusEventHandlerFunction()で、
こちらの関数は既にインタフェース構造体に登録されたコールバック関数を読み出すの
に使われます。(コードは省略)

以上の2つの関数ですが、どちらもip.cppに定義されているものの、IPv4に特化した関数
にはなっていません。また、MAC層は直接にはNetworkIpNotificationOfPacketDrop()を
呼び出します。こちらもまたip.cppに定義されていて、
NetworkIpSetMacLayerStatusEventHandlerFunction()で設定された関数ポインタを、
NetworkIpGetMacLayerStatusEventHandlerFunction()を呼び出して取得し、その関数を
呼び出しているだけです。

MAC層では以下の関数でコールバックを行っています。コードを読むと、IPv6ではコール
バックは行われていません。IPv6でもコールバックされるようにするには、この部分を
改造してあげる必要があります。


04696 // --------------------------------------------------------------------------
04697 // FUNCTION: MAC_NotificationOfPacketDrop
04698 // PURPOSE:  Notify network layer of packet drop.
04699 // --------------------------------------------------------------------------
04700 void
04701 MAC_NotificationOfPacketDrop(
04702     Node *node,
04703     NodeAddress nextHopAddress,
04704     int interfaceIndex,
04705     Message *msg)
04706 {
04707     if (MAPPING_GetNetworkTypeForInterface(node, interfaceIndex)
04708         == NETWORK_IPV4)
04709     {
04710         MplsData *mpls = (MplsData *)node->macData[interfaceIndex]->mplsVar;
04711 
04712         if (mpls)
04713         {
04714             MplsNotificationOfPacketDrop(node, msg, nextHopAddress, interfaceIndex);
04715         }
04716         else
04717         {
04718             NetworkIpNotificationOfPacketDrop(node,
04719                                               msg,
04720                                               nextHopAddress,
04721                                               interfaceIndex);
04722         }
04723     }
04724     else
04725     {
04726         // packet drop from MAC layer
04727         MESSAGE_Free(node, msg);
04728 
04729         // TBD: Notification about packet drop to upper layer
04730         // is not available for IPv6
04731     }
04732 }


以上のことから、ルーティングプロトコル等でNetworkIpSetMacLayerStatusEventHandlerFunction()
を呼び出してプロトコル固有のコールバック関数を登録すれば、IPv4であろうがIPv6で
あろうが関係なくコールバックしてくれるはずです。

IPv4とIPv6のデユアルIPにする場合には更に改造が必要になると思いますが、ここでは
割愛します。

以上、回答になりましたでしょうか。
フラット表示 前のトピック | 次のトピック
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT