(57)【特許請求の範囲】
【請求項１】
コンピュータを、
データ送信元のＩＰアドレスを取得し、当該ＩＰアドレスのバージョンに対応する識別情報を発信するソケットと、
ネットワークプロトコルに関するＩＰアドレスの処理を行うための関数を含む複数の関数を保持する関数構造体と、
前記関数構造体の保持する関数のうち、第１のインターネットプロトコルに関するアドレスの処理を行うための第１の関数群を示す第１のポインタと、第２のインターネットプロトコルに関するアドレスの処理を行うための第２の関数群を示す第２のポインタとを有するテーブルと、
前記ソケットにより発信された識別情報に対応するインターネットプロトコルについて、前記テーブルの有する前記第１又は第２のポインタの示す関数によってＴＣＰまたはＵＤＰに沿った接続制御を行う制御手段として機能させることを特徴とするプログラム。
【請求項２】
前記識別情報に応じて異なる長さのヘッダをデータに付加する付加手段と、
前記ヘッダと前記データとについてチェックサムを算出する算出手段として更に機能させるための請求項１に記載のプログラム。
【請求項３】
前記付加手段は前記データに前記識別情報を付加することを特徴とする請求項２に記載のプログラム。
【請求項４】
前記第１のインターネットプロトコルはインターネットプロトコルバージョン４であり、前記第２のインターネットプロトコルはインターネットプロトコルバージョン６であり、前記ソケットは、前記ソケットの取得するタイプフィールドの値がインターネットプロトコルバージョン４を示せばインターネットプロトコルバージョン４を示す識別情報を発信し、前記ソケットの取得するタイプフィールドの値がインターネットプロトコルバージョン６を示せばインターネットプロトコルバージョン６を示す識別情報を発信することを特徴とする請求項１乃至３のいずれか１項に記載のプログラム。
【請求項５】
前記関数構造体は、
宛先となるＩＰアドレスとこのＩＰアドレスまでの経路が記載されたルーティングテーブル中のＩＰアドレスとを比較する関数、
宛先となるＩＰアドレスとこのＩＰアドレスまでの経路が記載されたルーティングテーブル中のネットワークアドレスとを比較する関数、
宛先となるＩＰアドレスとデフォルトアドレスとを比較する関数、
ＩＰアドレスを特定するか否かを判別する関数、
自ホストのアドレスか否かを判別する関数、
送受信されたパケットがこわれていないかを保障するチェックサムの計算をする関数、ＩＰアドレスが構造体としてまとめられたアドレス情報構造体にＩＰアドレスとポート番号をセットする関数、
ＩＰアドレスの長さを取得する関数、
ＩＰアドレスが構造体としてまとめられたアドレス情報構造体からＩＰアドレスとポート番号を取得する関数、及び
パケットのヘッダの長さを取得する関数
のうち少なくともひとつを含むことを特徴とする請求項１乃至４のいずれか１項に記載のプログラム。
【請求項６】
送信元のＩＰアドレスを取得し、当該ＩＰアドレスのバージョンに対応する識別情報を発信する取得手段と、
ネットワークプロトコルに関するアドレスの処理を行うための複数の関数を保持する関数構造体を格納する第１の保持手段と、
前記関数構造体の保持する関数のうち、第１のネットワークプロトコルに関するアドレスの処理を行うための第１の関数群を示す第１のポインタと、第２のネットワークプロトコルに関するアドレスの処理を行うための第２の関数群を示す第２のポインタとを有するテーブルを格納する第２の保持手段と、
前記取得手段により発信された識別情報に対応するインターネットプロトコルについて、前記テーブルの有する第１又は第２のポインタの示す関数によってＴＣＰまたはＵＤＰに沿った接続制御を行う制御手段と
を有することを特徴とする情報処理装置。
【請求項７】
ネットワークプロトコルに関するアドレスの処理を行うための複数の関数を保持する関数構造体を格納する第１の保持手段と、前記関数構造体の保持する関数のうち、第１のネットワークプロトコルに関するアドレスの処理を行うための第１の関数群を示す第１のポインタと、第２のネットワークプロトコルに関するアドレスの処理を行うための第２の関数群を示す第２のポインタとを有するテーブルを格納する第２の保持手段と、を備える情報処理装置の制御方法であって、
送信元のＩＰアドレスを取得し、当該ＩＰアドレスのバージョンに対応する識別情報を発信する取得工程と、
前記取得工程により発信された識別情報に対応するインターネットプロトコルについて、前記テーブルの有する第１又は第２のポインタの示す関数によってＴＣＰまたはＵＤＰに沿った接続制御を行う制御工程と
を有することを特徴とする情報処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は異なる２つのＩＰ（インターネットプロトコル）を同時に使用可能なプログラム、情報処理装置およびその制御方法に関する。
【背景技術】
【０００２】
これまでＬＡＮやインターネットにおいて通信の基礎となるプロトコルとして、インターネットプロトコル、通称ＴＣＰ／ＩＰが使用されてきた。このプロトコルのネットワーク層はＩＰ（インターネットプロトコル）であり、現在はＩＰｖ４（インターネットプロトコルバージョン４）が広く使用されている。近年アドレスの枯渇の懸念や経路情報の増大から、ＩＰｖ６（インターネットプロトコルバージョン６）が注目されている。
【０００３】
ＩＰｖ４とＩＰｖ６の最も大きな違いはそのＩＰアドレスの大きさで、ＩＰｖ４では３２ｂｉｔ、ＩＰｖ６では１２８ｂｉｔである。なお、ＩＰｖ６の規格としてRFC-2460を挙げることができる。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
図１０，１１はこれまで多く使用されてきたＩＰｖ４のみを使用するネットワークスタックの構成図である。図１０は送信時、図１１は受信時の動作である。ＴＣＰ／ＩＰプロトコル（ＵＤＰも含む）は、ソケット（ｓｏｃｋｅｔ）として知られるプログラミングインタフェースによりプログラムされる。
【０００５】
送信時（図１０）、ＴＣＰを使用するかＵＤＰを使用するかはｓｏｃｋｅｔ  ＡＰＩ（Ａ
ｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ）の第２引数で決定される。第２引数がＳＯＣＫ＿ＳＴＲＥＡＭであれば送信データはＴＣＰに渡され、ＳＯＣＫ＿ＤＧＲＡＭであればＵＤＰに渡される。ｓｏｃｋｅｔ  ＡＰＩの第１引数がＡＦ＿ＩＮＥＴであることでＩＰｖ４を使用されることが指示され、送信パケットはＩＰｖ４に渡される。
【０００６】
受信時（図１１）、イーサネット（登録商標）が受信したパケットのイーサネット（登録商標）タイプフィールドがＥＴＨＥＲＴＹＰＥ＿ＩＰであることによりＩＰｖ４に渡される。ＩＰｖ４ではパケットのプロトコルフィールドがＩＰＰＲＯＴＯ＿ＴＣＰであればＴＣＰに、ＩＰＰＲＯＴＯ＿ＵＤＰであればＵＤＰにパケットを渡す。
【０００７】
図１２，図１３はＩＰｖ４／ＩＰｖ６を両方使用するネットワークスタックの構成図である。図１２は送信時、図１３は受信時である。ネットワークプロトコル階層では、ＩＰｖ４，ＩＰｖ６はネットワーク層、ＴＣＰ／ＵＤＰはトランスポート層と階層が異なっている。しかし、ＴＣＰ／ＵＤＰでもＩＰアドレスの比較やコピー、ＩＰｖ４／ＩＰｖ６アドレスによるコネクションの管理等を行うため、ＩＰｖ４用のＴＣＰ４／ＵＤＰ４、ＩＰｖ６用のＴＣＰ６／ＵＤＰ６が必要になっている。
【０００８】
しかしこのような構成にすると、ＴＣＰ／ＵＤＰが行う処理は基本的にはＩＰｖ４でもＩＰｖ６でも同じようなものになるため、少しだけ異なる同じようなコードが散在することになり、コードの増加や保守が繁雑になる等の問題がある。
【課題を解決するための手段】
【０００９】
上記課題を解決するために本発明は、コンピュータを、データ送信元のＩＰアドレスを取得し、当該ＩＰアドレスのバージョンに対応する識別情報を発信するソケットと、ネットワークプロトコルに関するＩＰアドレスの処理を行うための関数を含む複数の関数を保持する関数構造体と、前記関数構造体の保持する関数のうち、第１のインターネットプロトコルに関するアドレスの処理を行うための第１の関数群を示す第１のポインタと、第２のインターネットプロトコルに関するアドレスの処理を行うための第２の関数群を示す第２のポインタとを有するテーブルと、前記ソケットにより発信された識別情報に対応するインターネットプロトコルについて、前記テーブルの有する前記第１又は第２のポインタの示す関数によってＴＣＰまたはＵＤＰに沿った接続制御を行う制御手段として機能させることを特徴とする。
【発明の効果】
【００１０】
本発明によれば、第１のインターネットプロトコルでも第２のインターネットプロトコルでも同じ関数インタフェースでアドレスの操作を行うことができる。また、ＴＣＰ／ＵＤＰを第１のインターネットプロトコルと第２のインターネットプロトコルで共有したすっきりとした構成にできるので、コードの縮小化や保守性の向上を図ることができる。
【発明を実施するための最良の形態】
【００１１】
本発明は図１に示す通り、ＩＰｖ４アドレス操作関数、ＩＰｖ６アドレス操作関数をそれぞれ、Ｃ言語でいうところの構造体としてまとめてアドレス操作関数構造体とする。それぞれの構造体へのポインタをアドレスファミリをキーにするテーブルに格納し、アドレス操作関数テーブルとする。アドレス操作を行う関数を呼び出すときには、アドレス操作関数テーブルからアドレス関数構造体をひき、この構造体を通すようにするものである。
まず、構造体のポインタ宣言の例を以下に示す。
struct address_functions *address_family_table[AF_MAX];
次に、ＩＰｖ４、ＩＰｖ６のアドレス操作関数の構造体の宣言の例を以下に示す。
struct address_functions ipv4_functions = { IPv4アドレス操作関数群 };
struct address_functions ipv6_functions = { IPv6アドレス操作関数群 };
さらに、ポインタにアドレスファミリをキーとして格納する例を以下に示す。
address_family_table[AF_INET]  = &ipv4_functions;
address_family_table[AF_INET6] = &ipv6_functions;
【００１２】
本発明のＩＰアドレス操作関数群は以下のようになっている。
struct address_functions {
hostcomp();      /* ホストアドレスの比較 */
netcomp();       /* ネットワークアドレスの比較 */
isdefault();     /* デフォルトアドレスか? */
isany();         /* any アドレスか? */
ismine();        /* 自ホストのアドレスか? */
checksum();      /* TCP/UDPパケットのチェックサムの計算 */ 
sockaddr_set();  /* sokaddr構造体にIPv4/IPv6 addressとport番号をセット */
addrlen;         /* IPv4/IPv6アドレスの長さ */
addroffset;      /* sockaddr構造体におけるIPv4/IPv6 addressの位置*/
portoffset;      /* sockaddr構造体におけるport番号の位置 */
hdrlen;          /* IPv4/IPv6パケットのヘッダの長さ */
};
【００１３】
例えば、ＩＰｖ４アドレス使用時、ホストアドレスの比較のための関数を抜き出すためには、（１）のようにして関数を呼び出す。また例えば同様にＩＰｖ６アドレス使用時、ネットワークアドレスの比較のための関数にアクセスするためには、（２）のようにして関数を呼び出す。ＡＦ＿ＩＮＥＴはＩＰｖ４であることを表し、ＡＦ＿ＩＮＥＴ６はＩＰｖ６であることを表す。ＡＦ＿ＩＮＥＴとＡＦ＿ＩＮＥＴ６の定数はｓｏｃｋｅｔ  ＡＰＩの第一引数として渡されるので、これを用いて呼び出すアドレス関数の切り替えを行うことができる。
address_family_table[AF_INET]->hostcomp()  ……………………………………  (1)
address_family_table[AF_INET6]->netcomp()  ……………………………………  (2)
【００１４】
次に、上記関数がどのような状況で使用されるかについて、図２〜７を使用して説明する。図２はｓｏｃｋｅｔプログラムとして知られているネットワークプログラムの例のフローチャートである。図２はＵＤＰを使用した場合の送信プログラムの手順の例である。
【００１５】
まず、ｓｏｃｋｅｔによりｓｏｃｋｅｔを生成する（ｓｔｅｐ２０１）。ｂｉｎｄで自ホストのポート番号を決定する（ｓｔｅｐ２０２）。ｃｏｎｎｅｃｔで相手先のＩＰアドレスとポート番号を設定する（ｓｔｅｐ２０４）。送信データがあるかどうか調べ（ｓｔｅｐ２０５）、あれば送信する（ｓｔｅｐ２０６）。無ければｓｏｃｋｅｔをｃｌｏｓｅして終了する。以上がｓｏｃｋｅｔプログラムにおける大きな流れである。
【００１６】
次に、この流れの中でＴＣＰ／ＩＰプロトコルスタックがどのような作業を行うのかについて説明する。まず、図３を用いて、図２のｓｔｅｐ２０２のｂｉｎｄについて説明する。ｂｉｎｄでは、ＩＰｖ４／ｖ６アドレスやポート番号が構造体としてまとめられたｓｏｃｋａｄｄｒ構造体（アドレス情報構造体）から送信元のＩＰｖ４／ｖ６アドレスとポート番号が渡される。ｓｏｃｋａｄｄｒ構造体に格納されたＩＰアドレスのポインタを得るために、アドレス操作関数構造体のａｄｄｒｏｆｆｓｅｔを使用する。このときの使用例を（３）に示す。同様に、ｓｏｃｋａｄｄｒ構造体に格納されたポート番号を抜き出すために、アドレス操作関数構造体のｐｏｒｔｏｆｆｓｅｔを使用する。このときの使用例を（４）に示す。このようにしてｂｉｎｄの引数のｓｏｃｋａｄｄｒ構造体からＩＰｖ４／ＩＰｖ６アドレスを得（ｓｔｅｐ３０２）、ポート番号を得る（ｓｔｅｐ３０３）。
【００１７】
ＡＦ＿ＸＸＸはＡＦ＿ＩＮＥＴかＡＦ＿ＩＮＥＴ６、ａｄｄｒ＿ｐはアドレスへのポインタ、ｐｏｒｔはポート番号、ｓｏｃｋａｄｄｒ＿ｐはｓｏｃｋａｄｄｒ構造体へのポインタである。
*addr_p = (char *)sockaddr_p + address_family_table[AF_XXX]->addroffset ……  (3)
port = *((in_port_t *)((char *)sockaddr_p + address_family_table[AF_XXX]->portoffset))                             ……  (4)
【００１８】
そして先ほど取り出したポート番号が０以外でかつ既に使用されているかどうか調べ、ポート番号が０以外でかつ既に使用されている場合はエラーとなる（ｓｔｅｐ３０９）。次に先ほど取り出したアドレスが、アドレスを特定しないことを示すＩＮＡＤＤＲ＿ＡＮＹ以外でかつ自ホストの持つアドレスかどうか調べる（ｓｔｅｐ３０５）。アドレスがＩＮＡＤＤＲ＿ＡＮＹ以外でかつ自ホストの持つアドレスでない場合はエラーとなる（ｓｔｅｐ３０９）。ＩＮＡＤＤＲ＿ＡＮＹ以外かどうかを調べるためにアドレス操作関数構造体のｉｓａｎｙを（５）のように使用する。
また自ホストのアドレスかどうかを調べるため、つまりアドレスを特定するか否かを判別するためにアドレス操作関数構造体のｉｓｍｉｎｅを（６）のように使用する。
if (address_family_table[AF_XXX]->isany(addr_p)) { };   …………………………  (5)
if (address_family_table[AF_XXX]->ismine(addr_p)) { };  …………………………  (6)
【００１９】
ポート番号が０ならば（ｓｔｅｐ３０６）ポート番号を割り当て（ｓｔｅｐ３０７）、アドレス／ポート管理機構にアドレスとポート番号を格納する（ｓｔｅｐ３０８）。アドレスがＩＮＡＤＤＲ＿ＡＮＹでなかったら（ｓｔｅｐ３１１）アドレス／ポート管理機構にアドレスを格納する（ｓｔｅｐ３１２）。このとき、ＩＰアドレスの長さはＩＰｖ４とＩＰｖ６とで異なるので、アドレス操作関数構造体のａｄｄｒｌｅｎを使用して、ＩＰアドレスの長さを得る。その例を（７）に示す。ａｐｍ＿ｐはアドレス／ポート管理機構のエントリのポインタである。
memcpy(apm_p->local_address, addr_p, address_family_table[AF_XXX]->addrlen);‥(7)
【００２０】
次に図４を用いて、図２のｓｔｅｐ２０４のｃｏｎｎｅｃｔについて説明する。
引数のｓｏｃｋａｄｄｒ構造体から宛先のＩＰアドレスとポート番号を得る（ｓｔｅｐ４０２）。この操作は（３）、（４）と同様に、アドレス操作関数構造体のａｄｄｒｏｆｆｓｅｔとｐｏｒｔｏｆｆｓｅｔを使用する。アドレス／ポート管理機構に格納してあるｐｏｒｔ番号を調べ、０ならば図２のｂｉｎｄを実行する。今回の場合は先にｂｉｎｄを行っているので０ではない。動的にポート番号を割り当てる場合は、ｂｉｎｄを行わずにｃｏｎｎｅｃｔを行うことができる仕様であるので、このような処理が入る。
【００２１】
次に、宛先までの経路が記載されたルーティングテーブルを検索し、あて先に応じた自ホストのアドレスを得る（ｓｔｅｐ４０６）。このときの宛先アドレスとルーティングテーブルのＩＰアドレスとの比較であるが、宛先アドレスとルーティングテーブル中のホストアドレスエントリとの比較（ＩＰアドレス全ビットの比較）を行う。また宛先アドレスとルーティングテーブル中のネットワークアドレスエントリとの比較（ＩＰアドレスをＩＰネットワークマスクアドレスの論理和を取った値との比較）を行う。また、宛先アドレスとデフォルトアドレスエントリとの比較を行い、ホスト、ネットワークアドレス、デフォルトの順の優先順位で採用する。ホストアドレスとの比較の例を（８）、ネットワークアドレスの例を（９）、デフォルトアドレスとの比較の例を（１０）に示す。
【００２２】
ａｄｄｒ＿ｐはｃｏｎｎｅｃｔの引数であるあて先アドレス、ｒｔ＿ｐはルーティングテーブルのエントリである。ｒｔ＿ｐ−＞ｄｓｔはルーティングテーブルのエントリのあて先ホスト／ネットワーク／デフォルトアドレス、ｒｔ＿ｐ−＞ｍａｓｋはネットワークマスクアドレスである。
address_family_table[AF_XXX]->hostcomp(addr_p, &rt_p->dst);  …………………  (8)
address_family_table[AF_XXX]->netcomp(addr_p, &rt_p->dst, &rt_p->mask);  …  (9)
address_family_table[AF_XXX]->isdefault(addr_p);   ……………………………… (10)
【００２３】
宛先アドレス／宛先ポート番号、送信元アドレス／送信元ポート番号をキーに、アドレスポート管理機構を調べ（ｓｔｅｐ４０８）、既に使用されているコネクションかどうか調べる（ｓｔｅｐ４０８）。既に使用されたコネクションでなければアドレス／ポート管理機構に自ホストのアドレスをコピーする（ｓｔｅｐ４０７）。アドレスのコピーに際してＩＰアドレスの長さはＩＰｖ４とＩＰｖ６と異なるので、アドレス操作管理構造体のａｄｄｒｌｅｎを使用する。その例は（７）と同様である。そしてアドレス／ポート管理機構に宛先のアドレスとポート、ルーティングテーブルのエントリをコピーする（ｓｔｅｐ４１０）。
このときのアドレスのコピーの例を（１１）に示す。
memcpy(apm_p->dest_address, addr_p, address_family_table[AF_XXX]->addrlen); (11)
【００２４】
次に図５を用いて、図２のｓｔｅｐ２０６について説明する。アドレス／ポート管理機構から自ホストのポート番号を得（ｓｔｅｐ５０２）、自ホストのポート番号が０であれば（ｓｔｅｐ５０３）図２のｂｉｎｄを実行する（ｓｔｅｐ５０４）。ＵＤＰの場合、動的にポート番号を割り当てる時はｂｉｎｄを行わずにｓｅｎｄｔｏを行うことができる仕様であるので、このような処理が入る。もしｃｏｎｎｅｃｔを行っていないかｃｏｎｎｅｃｔを行っていてもあて先アドレスが異なる場合はルーティングテーブルを検索し、あて先に応じたネットワークインタフェースを得る（ｓｔｅｐ５０５）。
【００２５】
ルーティングテーブルの検索は図４のｓｔｅｐ４０６と同様である。アドレス／ポート管理機構に格納されている自ホストのアドレスがＩＮＡＤＤＲ＿ＡＮＹであれば、先に検索したルーティングテーブルのエントリから自ホストのネットワークインタフェースのアドレスを得る（ｓｔｅｐ５０７）。この時の例は（５）と同様である。
【００２６】
あて先アドレスと宛先ポート番号、送信元アドレスと送信元ポート番号とＵＤＰヘッダを生成し、データに付加し、ヘッダとデータがこわれていないかを保障するチェックサムの計算をする（ｓｔｅｐ５０９）。この時のアドレス操作関数構造体のチェックサムを呼び出す例を（１３）に示す。
address_family_table[AF_XXX]->checksum(&header, &local_address, &dest_address,
IPPROTO_UDP,
address_family_table[AF_XXX]->hdrlen,
data_length);  …………………………  (13)
ｈｅａｄｅｒはパケットのヘッダの先頭、ｌｏｃａｌ＿ａｄｄｒｅｓｓは自ホストのアドレス、ｄｅｓｔ＿ａｄｄｒｅｓｓはあて先アドレスである。ＩＰＰＲＯＴＯ＿ＵＤＰは、この例はＵＤＰであるのでＵＤＰのプロトコル番号、ヘッダの長さはＩＰｖ４とＩＰｖ６とで長さが異なるので、アドレス操作関数構造体のｈｄｒｌｅｎを使用して、パケットのヘッダの長さを得る。ｄａｔａ＿ｌｅｎｇｔｈは送信パケットのデータの長さである。
【００２７】
図６はｓｏｃｋｅｔプログラムとして知られるネットワークプログラムで、ＵＤＰの受信の場合の例のフローチャートである。まず、ｓｏｃｋｅｔによりｓｏｃｋｅｔを生成する（ｓｔｅｐ６０１）。ｂｉｎｄで自ホストのポート番号を決定する（ｓｔｅｐ６０２）。受信パケットを待ち、受信パケットがあると（ｓｔｅｐ６０６）、そのパケットが最後のデータかどうか調べ（ｓｔｅｐ６０７）、そうでなければまた次のパケットを待つ（ｓｔｅｐ６０６）。ｂｉｎｄの動作は送信の場合に述べた図３と同様である。
【００２８】
図７を用いて受信の場合について説明する。ｓｔｅｐ７０２で受信データがあるかどうか調べる（ｓｔｅｐ７０２）。受信データはＩＰｖ４から、もしくはＩＰｖ６から渡される。ＩＰｖ４／ＩＰｖ６の処理部は受信パケットをＴＣＰ／ＵＤＰ処理部に渡す際に、ＩＰｖ４かＩＰｖ６かの情報も同時に渡す。ＵＤＰやＴＣＰがアドレス操作関数構造体にアクセスする場合は、ＩＰｖ４であればＡＦ＿ＩＮＥＴを、ＩＰｖ６であればＡＦ＿ＩＮＥＴ６をキーにする。
【００２９】
次に、受信データがあればチェックサムの計算を行う（ｓｔｅｐ７０３）。この時のアドレス操作関数構造体のチェックサムを呼び出す例は（１３）と同様である。次に受信したパケットからあて先アドレスとあて先ポート番号、送信元アドレスと送信元ポート番号を抜き出す（ｓｔｅｐ７０４）。アドレス／ポート管理機構を検索して、コネクションエントリを抜き出す（ｓｔｅｐ７０５）。コネクションエントリが見つからなければ、次のパケットを受信しにいく。エントリがあれば受信処理を行い、受信パケットがあることを上位のｓｏｃｋｅｔ層に通知する。
【００３０】
受信時の動作に関してもう少し詳しく説明する。図１５はタスク構成図である。１４０１はユーザタスク、１４０２は受信用ネットワークタスク、１４０３は受信キューである。受信したパケットの処理を行う図７の処理はネットワークタスク１４０１が行い、図６の受信の操作はユーザタスクが行っている。
【００３１】
図１４は図６のｓｔｅｐ６０６のｒｅｃｖｆｒｏｍの動作を表すフローチャートである。受信パケットの通知が来たかどうかチェックする（ｓｔｅｐ１３０２）。この受信パケットの通知は、図７のｓｔｅｐ７０７でのソケットに対する受信通知である。受信通知が来ると受信キュー１４０３からデータを読み出し（ｓｔｅｐ１３０３）、送信アドレスをコピーする（ｓｔｅｐ１３０４）。この時、ｓｏｃｋａｄｄｒ構造体にＩＰｖ４／ＩＰｖ６アドレスとポート番号をコピー（セット）するためにアドレス操作関数構造体のｓｏｃｋａｄｄｒ＿ｓｅｔが使用される。この例を（１４）に示す。
address_family_table[AF_XXX]->sockaddr_set(sockaddr_p, addr_p, port);  …… (14)
ｓｏｃｋａｄｄｒ＿ｐは関数ｒｅｃｖｆｒｏｍで渡されたｓｏｃｋａｄｄｒ構造体へのポインタ、ａｄｄｒ＿ｐは受信したパケットのＩＰｖ４／ＩＰｖ６アドレス、ｐｏｒｔはポート番号である。
【００３２】
次に、ＩＰアドレス操作関数構造体テーブルをひくキーがＡＦ＿ＩＮＥＴでＩＰｖ４、ＡＦ＿ＩＮＥＴ６でＩＰｖ６をひくようにしているが、このキーの選択方法について説明する。ネットワークプログラムはｓｏｃｋｅｔ  ＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ）を呼び出すことで開始される。ｓｏｃｋｅｔ  ＡＰＩの第一引数がＰＦ＿ＩＮＥＴであればＩＰｖ４を使用することが分かり、ＰＦ＿ＩＮＥＴ６であればＩＰｖ６を使用することが分かる。ｓｏｃｋｅｔ番号と関連づけられたアドレスポート管理機構に、ＩＰｖ４を使用する場合はＡＦ＿ＩＮＥＴを、ＩＰｖ６を使用する場合はＡＦ＿ＩＮＥＴ６を格納しておく。送信時にはアドレス／ポート管理機構に格納されているこの値を参照することで、アドレス操作関数構造体テーブルのキーとすることができる。
【００３３】
受信時はイーサネット（登録商標）パケットのタイプフィールドの値がＥＴＨＥＲＴＹＰＥ＿ＩＰ（０ｘ０８００）であることでＩＰｖ４パケットであることが分かり、ＥＴＨＥＲＴＹＰＥ＿ＩＰＶ６（０ｘ８６ｄｄ）であることでＩＰｖ６であることが分かる。ＩＰｖ４／ＩＰｖ６処理部がＵＤＰ／ＴＣＰ処理部にパケットを渡す際にＩＰｖ４であるかＩＰｖ６であるかの情報を一緒に渡す。ＵＤＰ／ＴＣＰ処理部ではＩＰｖ４であればＡＦ＿ＩＮＥＴをキーに、ＩＰｖ６であればＡＦ＿ＩＮＥＴ６をキーにしてアドレス操作関数構造体テーブルをひく。
【００３４】
本発明のプログラムにおける各手順は、コンピュータシステムのＲＡＭやＲＯＭなどに記憶されたプログラムをＣＰＵが実行することによって実現できる。ここで、本発明のプログラムを実行するコンピュータシステムの内部構造について図１６を参照して説明する。図１６において、１２００はコンピュータシステムである。上記コンピュータシステム１２００は、ＣＰＵ１２０１と、ＲＯＭ１２０２と、ＲＡＭ１２０３と、キーボード（ＫＢ）１２０９のキーボードコントローラ（ＫＢＣ）１２０５を有している。また、表示部としてのＣＲＴディスプレイ（ＣＲＴ）１２１０のＣＲＴコントローラ（ＣＲＴＣ）１２０６を有している。さらに、ハードディスク（ＨＤ）１２１１及びフレキシブルディスク（ＦＤ）１２１２のディスクコントローラ（ＤＫＣ）１２０７と、ネットワーとの接続のためのネットワークインターフェースコントローラ（ＮＩＣ）１２０８とを有している。そして、それらがシステムバス１２０４を介して互いに通信可能に接続された構成とされている。
【００３５】
ＣＰＵ１２０１は、ＲＯＭ１２０２或いはＨＤ１２１１に記憶されたプログラム、或いはＦＤ６６２より供給されるプログラムを実行することで、システムバス１２０４に接続された各構成部を総括的に制御する。すなわち、ＣＰＵ１２０１は、所定の処理シーケンスに従ったプログラムを、ＲＯＭ１２０２、或いはＨＤ１２１１、或いはＦＤ１２１２から読み出して実行することで、プログラムにおける各手順を実行することができる。
【００３６】
ＲＡＭ１２０３は、ＣＰＵ１２０１の主メモリ或いはワークエリア等として機能する。  ＫＢＣ１２０５は、ＫＢ１２０９や図示していないポインティングデバイス等からの指示入力を制御する。ＣＲＴＣ１２０６は、ＣＲＴ１２１０の表示を制御する。ＤＫＣ１２０７は、ブートプログラム、種々のアプリケーション、編集ファイル、ユーザファイル、ネットワーク管理プログラム、及び本実施の形態における所定の処理プログラム等を記憶するＨＤ１２１１及びＦＤ１２１２とのアクセスを制御する。ネットワークインタフエースカード（ＮＩＣ）１２０８は、ＬＡＮ１２２０、図示しないルータを介して、他のＰＣと送信及び受信のやり取りを行う。
【００３７】
そして、具体的にＣＰＵ１２０１は、第１のインターネットプロトコル及び第２のインターネットプロトコルのＩＰアドレス操作を行う関数をそれぞれまとめたＩＰ操作関数構造体をＲＡＭ１２０３などの記憶部に記録する。次に、ＣＰＵ１２０１は、記録されたＩＰ操作関数構造体を第１のインターネットプロトコル及び第２のインターネットプロトコルをキーとしてＩＰアドレス操作関数テーブルに格納する。さらに、ＣＰＵ１２０１は、ＩＰアドレス操作を行う場合に、格納したＩＰアドレス操作関数テーブルからＩＰ操作関数構造体をひいて、ＩＰアドレス操作を行う関数を呼びだすのである。
【００３８】
上述した本実施形態では、ＩＰｖ４とＩＰｖ６をともに使用するＴＣＰ／ＩＰネットワークスタックプログラムについてのみ説明したが、これに限ることはなく、異なるバージョンや異なるＩＰであってもよい。また、本実施形態では説明のしやすさのためＵＤＰをモデルに記述したが、アドレス／ポート管理構造体やルーティングテーブル、また基本的な処理はＴＣＰと共通であり、ＴＣＰの処理においても同様の効果がある。
【００３９】
以上のように、ＩＰｖ４とＩＰｖ６のアドレス操作関数を構造体としてまとめ、そのポインタをテーブル化し、ＩＰｖ４かＩＰｖ６かで切り替える構成することで、ＴＣＰやＵＤＰのＩＰｖ４／ＩＰｖ６依存部を吸収することができる。したがって、ＩＰｖ４用ＴＣＰ／ＵＤＰやＩＰｖ６用ＴＣＰ／ＵＤＰを作らずにまとめ、すっきりした構成にでき、コードの縮小化や保守性の向上が図れる。
すなわち、本実施形態によれば、ネットワークスタックプログラムにおいて、第１のインターネットプロトコルと第２のインターネットプロトコルのアドレスを扱う部分をアドレス操作関数構造体としてまとめた。さらに、そのポインタをテーブル化してアドレス操作関数構造体テーブルとし、アドレス操作はこのアドレス操作関数構造体テーブルを通して行うようにした。そうすることで、第１のインターネットプロトコルでも第２のインターネットプロトコルでも同じ関数インタフェースでアドレスの操作を行うことができる。例えば、図１２（送信時）、図１３（受信時）のような構成であったプロトコルスタックが、図８（送信時）、図９（受信時）のように、ＴＣＰ／ＵＤＰをＩＰｖ４／ＩＰｖ６で共有したすっきりとした構成にできる。したがって、コードの縮小化や保守性の向上を図ることができる。
【図面の簡単な説明】
【００４０】
【図１】アドレス操作関数構造体とアドレス操作関数構造体テーブルの構造と、アドレス操作関数群の内容について示した図である。
【図２】ｓｏｃｋｅｔを使用した送信プログラム動作のフローチャートである。
【図３】ｂｉｎｄ  ＡＰＩの動作を示すフローチャートである。
【図４】ｃｏｎｎｅｃｔ  ＡＰＩの動作を示すフローチャートである。
【図５】ｓｅｎｄｔｏ  ＡＰＩの動作を示すフローチャートである。
【図６】ｓｏｃｋｅｔを使用した受信プログラム動作のフローチャートである。
【図７】ＩＰパケット受信時の動作を示すフローチャートである。
【図８】本発明を適用したネットワークスタックの送信時の構成を示す図である。
【図９】本発明を適用したネットワークスタックの受信時の構成を示す図である。
【図１０】従来のＩＰｖ４のみを搭載したネットワークスタックの送信時の構成を示す図である。
【図１１】従来のＩＰｖ４のみを搭載したネットワークスタックの受信時の構成を示す図である。
【図１２】従来のＩＰｖ４／ＩＰｖ６を搭載したネットワークスタックの送信時の構成を示す図である。
【図１３】従来のＩＰｖ４／ＩＰｖ６を搭載したネットワークスタックの受信時の構成を示す図である。
【図１４】ｒｅｃｖｆｒｏｍ  ＡＰＩの動作を示すフローチャートである。
【図１５】受信時のネットワークスタックのタスクの構成を示す図である。
【図１６】本発明のプログラムを実行するコンピュータの内部構成例を示すブロック図である。
【符号の説明】
【００４１】
１４０１  ユーザタスク、
１４０２  受信用ネットワークタスク
１２００  ＰＣ
１２０１  ＣＰＵ
１２０２  ＲＯＭ
１２０３  ＲＡＭ
１２０４  システムバス
１２０５  ＫＢＣ
１２０６  ＣＲＴＣ
１２０７  ＤＫＣ
１２０８  ＮＩＣ
１２０９  ＫＢ
１２１０  ＣＲＴ
１２１１  ＨＤ
１２１２  ＦＤ
１２２０  ＬＡＮ
【図１】
0005388407.tif 000002
【図２】
0005388407.tif 000003
【図３】
0005388407.tif 000004
【図４】
0005388407.tif 000005
【図５】
0005388407.tif 000006
【図６】
0005388407.tif 000007
【図７】
0005388407.tif 000008
【図８】
0005388407.tif 000009
【図９】
0005388407.tif 000010
【図１０】
0005388407.tif 000011
【図１１】
0005388407.tif 000012
【図１２】
0005388407.tif 000013
【図１３】
0005388407.tif 000014
【図１４】
0005388407.tif 000015
【図１５】
0005388407.tif 000016
【図１６】
0005388407.tif 000017