【TCP/IPライブラリの構成】
TCP/IPライブラリVer.2は前述のようにいくつかのモジュールで構成されています
これらの各モジュール内部で対応するプロトコルの処理が実行されますが、
これを実行する関数は概略下図のような構成となっています。
つまり、それぞれのモジュールに代表の関数であるXX_Process()という関数があり、
そこでプロトコルのシーケンスが制御されます。
その他に、それぞれのプロトコル毎の処理に必要な関数が含まれています。
特に緑色の関数は、外部から呼び出して使う「API関数」となっています。
MACハンドラモジュールは特別で、LANのコントローラLSIの物理的な制御を行う
関数群をまとめたものです。
【Stackメインモジュールの詳細】
TCP/IPライブラリのメインモジュールの構成は、全体の初期化関数と全体の
シーケンス制御関数とから成っていて、プロトコル通信の全体を制御します。
このメイン処理部はコンフィギュレーション指定により、下記のような指定が
出来るようになっていて、必要の無いモジュールはリンクされないようになって
います。従って、その分ライブラリのサイズを小さくすることが出来ます。
(1) DHCPプロトコルの使用設定
IPアドレスを固定にするか、DHCPプロトコルで自動割付にするかを指定で
きます。DHCPを指定すると、DHCPプロトコルモジュールがリンクされ、
リセットスタートの際にDHCPプロトコルを開始して、IPアドレスの割り付けを
してもらうように動作します。
固定IPアドレスの場合の、IPアドレスも設定することが出来ます。
DHCPを使う設定にすると、次のUDPプロトコルも自動的に使う設定となり
ます。これは、DHCPプロトコルがUDPプロトコルの中で運ばれるためです。
(2) UDPプロトコルの使用設定
UDPプロトコルを使って通信を行う設定にすると、UDPプロトコルモジュール
がリンクされ、UDPプロトコルが使用可能な状態になります。
このUDPプロトコルモジュールには、受信したデータをバッファに保存して、
受信データがあることを通知する関数や、デバイス側から送信するための
関数も含まれています。
DHCPプロトコルを使うときには、このUDPプロトコルも使う指定に自動的に
設定されリンクされます。
(3) TCPプロトコルの使用設定
TCPプロトコルを使って通信を行う場合に指定すると、TCPプロトコルモジュール
がリンクされ、TCPプロトコルが使用可能な状態になります。
このTCPプロトコルモジュールでは、ホスト側からの要求に従ってセッションを
確立するシーケンスのあと、受信データをバッファに保存してから、受信データ
があることを通知する関数や、デバイス側からデータを送信するための関数を
含んでいます。
TCPプロトコルモジュールは非常に大きなサイズなので、使う場合にはメモリの
使用状況に注意する必要があります。
【Stackメインモジュール内の動作概要】
メインモジュールのStcak_Process()関数での動作は、下図のフローのようになって
います。
Stcak_Proces()内では、常にバッファを見て受信があったかどうかをチェックしますので、
TCP/IPライブラリを使うユーザーは、このStack_Process()関数を常に繰り返し呼び出し
て実行するようにすれば、後は自動的に受信が行われ、プロトコルに従った処理が
実行されます。
プロトコルのシーケンスの状態遷移を「smSTATE」という変数に格納しており、
このステートに従ってシーケンスを進めています。
【ARPプロトコルモジュール内の動作概要】
ARPプロトコルの処理は簡単で、単純に自分宛かどうかをIPアドレスで
確認して、自分宛の時にだけ、ARP応答を返送します。
【DHCPプロトコルモジュール内の動作概要】
メインモジュールで最初にDHCPのDISCOVERパケットが送信されるので
その後のDHCPシーケンスに沿った処理を実行しています。
DHCPのシーケンスの状態遷移を「smDHCP」という変数に設定しています。
このステートに従って下図のようにフローが流れて行きます。
(1) OFFERパケット受信待ち
Stack_Process()でDISCOVERパケットが送信されているので、ステートは
DHCP_SELECTとなって、サーバーからのOFFERパケット受信待ちとなって
います。
そこに正常なOFFERパケットが届いたら、オファーされたIPアドレスを格納
し、REQUESTパケットを返送して、ステートをDHCP_REQUESTとします。
そして次のPACKパケットの受信を待ちます。
(2) PACKパケット待ち
ここでPACKパケットが届いたら、IPアドレスがオファーされたものと同じ
ことを確認し、同じであれば、そのIPアドレスを自分のIPアドレスとして
登録します。
もし、PACKパケットでは無く、PNAKパケットを受信したときは、DHCP
ステートをDHCP_INITに戻して再度DHCPをやり直します。
【IPプロトコルモジュール内の動作概要】
IPプロトコルモジュールは、IPフレーム受信の場合の処理を実行します。
ここの内部の動作は簡単で、下図のようになっています。
単純に受信したパケットの内容を取り出し、自分宛かをチェックして、自分宛の
ときだけ次の処理を開始します。
次の処理はIPフレームで運ばれて来たIPパケットのプロトコルの区別を判定
し、それぞれの処理へ分岐します。
分岐した先でそれぞれのプロトコルに従ったシーケンスを継続します。
特にICMPプロトコルのエコー要求については、このIPプロトコルモジュール内に
応答関数を内蔵していて、エコー応答をICMP_Reply()関数で返すようにして
います。
UDPとTCPのプロトコルについては独立のモジュールとなっていて、それぞれの
プロトコルのシーケンスに従った処理を行います。詳しくはそれぞれのページ
で説明します。