SSブログ

Navajo ver.1の機能アップ [NETWORK]

密かに、継続的に、Navajoはいじっているのですが、プロトコルスタック的な安定度は置いておいて(おいっ!)、機能上のアップグレードを行っています。
もっとも、認知している現存ユーザーさんは約1名なので、事実上その方の為の解説ですけれどね。

取りあえずTCP/IPの取得先アドレスは以下です。
http://hamayan.ddo.jp/~hamayan/so-net/archive/nava_v14_tcpip.zip

機能上の追加事項は、コールバック機能を付けた事です。
この機能を利用すると、例えばメディアコンバータの様に二つのインタフェースの仲立ちをする様なアプリケーションで、その構築が容易になります。

もう少し具体的に説明しますと、片方がRS232Cインタフェースだとして、もう片方がTCPだとします。
仲立ちをするので、動作の切欠のイベントの発生は両方からの受信で起こる訳です。

この様な場合従来のNavajoでは、受信の検出にはソケットからの受信をポーリング(TMO_POL)で行うしか無かったのです。

RS232Cの場合は、そのシステムを構築するプログラマー自身がドライバーを書いたりするので、受信イベントの検出をアプリケーション側に伝える手段は、自身で用意できますが、Navajoの場合はこちらで書いたプロトコルスタックなので、何処を改造すれば良いのかソースコードを読んでいじらねばならない訳です。
しかし、私自身メディアコンバーターを作成する必要が有りましたので、もっとも良いイベント検出方法を構築する必要性が有りました。折角なので、このバージョンを公開して、皆さん(現在1名さん)にも使ってみてもらおうと思っている訳です。

まずTCP情報を保存している構造体に以下のメンバーを追加しています。

  ID  callback_id;  /*コールバック用ID*/
  void (* callback)( IP *ip, TCP *tcp, ID id ); /*コールバック関数の先頭アドレス*/


メンバーcallback_idは、タスク間通信オブジェクトのID番号を代入します。タスク間通信オブジェクトのタイプは、イベントフラグでもメールボックスでも何でも構いません。自分の最も使い易いオブジェクトを利用します。
メンバーcallbackは、ユーザーが用意したコールバック関数の先頭アドレスを代入します。引数のタイプに注意して下さい。

この機能が追加されたのは、"tcp.c"のTCPRcv関数の中です。
ソケットペアの確認作業が終了し、チェックサムの検証が済みましたら、コールバック関数が登録されている場合のみ、コールされます。

  /*コールバック関数の呼び出し*/
  if( (void *)spt->callBack != (void *)NADR )
    spt->callBack( ip, tcp, spt->callback_id );	/*コールバック関数が登録されている時*/

ユーザーが用意するコールバック関数は、例えば以下の様に記述します。

#define TCP_RCV_EVENT 0x0001
#define RS232C_RCV_EVENT 0x0002
void TCPCallBackForDataReceive( IP *ip, TCP *tcp, ID callback_id )
{
  /*受信データが存在するか調べる。もし存在する時は、イベントフラグにてコールバックを行う。*/
  if( (ip->head.length
    - ((ip->head.top.length + tcp->head.control.length) * 4)) >  0 )
  {
    set_flg( callback_id, TCP_RCV_EVENT );
  }
}


注意が必要なのは、上記のコールバックが実行されるのはプロトコルスタック側であると言う事です。
つまり、関数LinkLayerReceiveを先頭アドレスに持つタスク内で実行される為、このプロトコルスタックで必要となるスタックサイズは、ユーザー関数の分も追加しておく必要が有ります。

ユーザーアプリケーションの記述方法ですが、コールバックIDとコールバック関数の登録は、ソケットOPENの直後に行って下さい。

void UserApli( VP_INT abcd )
{
  TcpAddressAndPortInformation info;  /*TCP接続情報*/

  TCPsocket( &info );  /*ソケットOPEN*/
  info.callback_id = FLG_ID_USER_APLI;	/*事前に取得したイベントフラグID*/
  info.callback = TCPCallBackForDataReceive;	/*コールバック関数の登録*/
      以下省略
}

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。