(57)【要約】      （修正有）【課題】送信するデータとして指定された複数のデータについて、効率的なパケットの生成を実行する通信装置、制御方法及びプログラムを提供する。【解決手段】第１のデータと第２のデータと第３のデータとを他の通信装置に送信する場合に、第１のデータと第２のデータと第３のデータとがメモリ上で連続した領域に存在する場合、第１のデータと第２のデータと第３のデータとを含むデータについてひな形となる通信ヘッダを生成することでパケットの生成処理を行い、第１のデータと第２のデータとがメモリ上の連続した領域に存在する場合は、第１のデータと第２のデータとを含み第３のデータを含まないデータについてひな形となる通信ヘッダを生成することでパケットの生成処理を行うように制御する。【選択図】図３
2020174322.tif 000002
【特許請求の範囲】
【請求項１】
複数のデータが格納されたメモリを有する通信装置であって、
前記複数のデータの少なくとも２以上のデータを含むデータについてひな形となる通信ヘッダの生成処理を行うことで、前記少なくとも２以上のデータの夫々についてのパケットを生成する第１の生成手段と、
前記複数のデータに含まれる、第１のデータと第２のデータと第３のデータとが他の通信装置に送信されるデータとして指定されている場合に、前記複数のデータの内、前記第１のデータと前記第２のデータと前記第３のデータとが前記メモリ上で連続した領域に存在する場合、前記第１のデータと前記第２のデータと前記第３のデータとを含むデータについて前記第１の生成手段による生成を行うように制御する第１の制御手段と、
前記複数のデータに含まれる、前記第１のデータと前記第２のデータと前記第３のデータとが前記他の通信装置に送信されるデータとして指定されている場合に、前記複数のデータの内、前記第１のデータと前記第２のデータとが前記メモリ上で連続した領域に存在し、かつ前記第３のデータが前記第２のデータと前記メモリ上で連続した領域に存在しない場合、前記第１のデータと前記第２のデータとを含み、かつ前記第３のデータを含まないデータについて前記第１の生成手段による生成を行うように制御する第２の制御手段と、
を有することを特徴とする通信装置。
【請求項２】
前記第１の制御手段は、前記第１のデータと前記第２のデータと前記第３のデータとが前記メモリ上で連続した領域に存在し、かつ前記メモリ上で前記１のデータと前記第２のデータより後の領域に存在する前記第３のデータのサイズが前記第２のデータのサイズより小さい場合、前記第１のデータと前記第２のデータと前記第３のデータとを含むデータについて前記第１の生成手段による生成を行うように制御し、
前記第１のデータと前記第２のデータと前記第３のデータとが前記メモリ上で連続した領域に存在し、かつ前記メモリ上で前記第１のデータと前記第２のデータより後の領域に存在する前記第３のデータのサイズが前記第２のデータのサイズより大きい場合、前記第１のデータと前記第２のデータとを含み前記第３のデータを含まないデータについて前記第１の生成手段による生成を行うように制御することを特徴とする請求項１に記載の通信装置。
【請求項３】
前記複数のデータの１つのデータについて通信ヘッダの生成処理を行い、前記１つのデータについてパケットを生成する第２の生成手段と、
前記複数のデータに含まれる、前記第１のデータと前記第２のデータと前記第３のデータとが前記他の通信装置に送信されるデータとして指定されている場合に、前記第１のデータに対して前記第２のデータおよび前記第３のデータのいずれも前記メモリ上で連続した領域に存在しない場合、前記第１のデータについて前記第２の生成手段による生成を行うように制御する第３の制御手段と、を更に有することを特徴とする請求項１または２に記載の通信装置。
【請求項４】
前記第１のデータと前記第２のデータと前記第３のデータとが前記他の通信装置に送信されるデータとして指定されている場合に、前記第１のデータと前記第２のデータと前記第３のデータとの少なくともいずれか２つのデータが前記メモリ上で連続した領域に存在するかを判定する判定手段を更に有し、
前記第１の制御手段、前記第２の制御手段、および前記第３の制御手段は、前記判定手段による判定に基づいて制御することを特徴とする請求項３に記載の通信装置。
【請求項５】
前記第１の生成手段および前記第２の生成手段によって生成したパケットを前記他の通信装置に送信する送信手段を更に有することを特徴とする請求項３または４に記載の通信装置。
【請求項６】
前記複数のデータに含まれる、前記第１のデータと前記第２のデータと前記第３のデータとが前記他の通信装置に送信されるデータとして指定されている場合に、サイズが同一の２以上のデータに関する情報を第１のテーブルに記憶し、同一のサイズのデータが存在しないデータに関する情報を第２のテーブルに記憶する記憶手段と、
前記記憶手段によって、前記第１のテーブルに記憶された前記２以上のデータに関する情報に基づいて、前記２以上のデータを前記メモリ上で連続した領域に配置する配置手段と、を更に有し、
前記第１の制御手段は、前記配置手段によって前記メモリ上に前記第１のデータと前記第２のデータと前記第３のデータとが連続した領域に配置された場合は、前記第１のデータと前記第２のデータと前記第３のデータとを含むデータについて前記第１の生成手段による生成を行うように制御し、
前記第２の制御手段は、前記配置手段によって前記メモリ上に前記第１のデータと前記第２のデータとが連続した領域に配置された場合は、前記第１のデータと前記第２のデータとを含み、かつ前記第３のデータを含まないデータについて前記第１の生成手段による生成を行うように制御することを特徴とする請求項１に記載の通信装置。
【請求項７】
前記複数のデータの１つのデータについて通信ヘッダの生成処理を行い、前記１つのデータについてパケットを生成する第２の生成手段と、
前記第２のテーブルに記憶されている前記同一のサイズのデータが存在しないデータに関する情報に基づいて、前記同一のサイズのデータが存在しないデータについて前記第２の生成手段による生成を行うように制御する第３の制御手段を更に有することを特徴とする請求項６に記載の通信装置。
【請求項８】
前記第１の生成手段および前記第２の生成手段によって生成したパケットを前記他の通信装置に送信する送信手段を更に有することを特徴とする請求項７に記載の通信装置。
【請求項９】
前記記憶手段は、前記第１のテーブルに記憶する情報として、前記サイズが同一の２以上のデータについて、それぞれの先頭アドレスを記憶し、前記第２のテーブルに記憶する情報として、前記同一のサイズのデータが存在しないデータの先頭アドレスを記憶することを特徴とする請求項６から８のいずれか１項に記載の通信装置。
【請求項１０】
複数のデータが格納されたメモリを有する通信装置であって、
前記複数のデータの少なくとも２以上のデータを含むデータについてひな形となる通信ヘッダの生成処理を行うことで、前記少なくとも２以上のデータの夫々についてのパケットを生成する第１の生成手段と、
前記複数のデータに含まれ、他の通信装置に送信されるデータとして指定された第１のデータと第２のデータと第３のデータとが前記メモリ上の連続した領域に存在する場合に、前記第１のデータと前記第２のデータとのサイズが同じ、かつ前記第３のデータのサイズが前記第２のデータのサイズより小さい場合、前記第１のデータと前記第２のデータと前記第３のデータとを含むデータについて前記第１の生成手段による生成を行うように制御する第１の制御手段と、
前記複数のデータに含まれ、前記他の通信装置に送信されるデータとして指定された前記第１のデータと前記第２のデータと前記第３のデータとが前記メモリ上の連続した領域に存在する場合に、前記第１のデータと前記第２のデータとのサイズが同じ、かつ前記第３のデータのサイズが前記第２のデータのサイズより大きい場合、前記第１のデータと前記第２のデータとを含み、かつ前記第３のデータを含まないデータについて前記第１の生成手段による生成を行うように制御する第２の制御手段と、
を有することを特徴とする通信装置。
【請求項１１】
前記複数のデータに含まれる、前記第１のデータと前記第２のデータと前記第３のデータとが前記他の通信装置に送信されるデータとして指定されている場合に、前記第１のデータと前記第２のデータと前記第３のデータとを、前記メモリ上の連続した領域に配置する配置手段を更に有し、
前記第１の制御手段および前記第２の制御手段は、前記配置手段によって前記メモリ上に前記第１のデータと前記第２のデータと前記第３のデータとが連続した領域に配置された場合に制御することを特徴とする請求項１０に記載の通信装置。
【請求項１２】
前記複数のデータの１つのデータについて通信ヘッダの生成処理を行い、前記１つのデータについてパケットを生成する第２の生成手段と、
前記複数のデータに含まれる、前記第１のデータと前記第２のデータと前記第３のデータとが他の通信装置に送信されるデータとして指定されている場合に、前記第１のデータのサイズより前記第２のデータのサイズが大きい場合、前記第１のデータについて前記第２の生成手段による生成を行うように制御する第３の制御手段と、
を更に有することを特徴とする請求項１０または１１に記載の通信装置。
【請求項１３】
前記第１の生成手段および前記第２の生成手段によって生成したパケットを前記他の通信装置に送信する送信手段を更に有することを特徴とする請求項１２に記載の通信装置。
【請求項１４】
前記通信ヘッダは、ＴＣＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ）ヘッダおよびＩＰ（Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ）ヘッダであることを特徴とする請求項１から１３のいずれか１項に記載の通信装置。
【請求項１５】
前記通信ヘッダは、ＵＤＰ（Ｕｓｅｒ  Ｄａｔａｇｒａｍ  Ｐｒｏｔｏｃｏｌ）ヘッダおよびＩＰヘッダであることを特徴とする請求項１から１３のいずれか１項に記載の通信装置。
【請求項１６】
複数のデータが格納されたメモリを有する通信装置の制御方法であって、
前記複数のデータに含まれる、第１のデータと第２のデータと第３のデータとが他の通信装置に送信されるデータとして指定されている場合に、前記複数のデータの内、前記第１のデータと前記第２のデータと前記第３のデータとが前記メモリ上で連続した領域に存在する場合、前記第１のデータと前記第２のデータと前記第３のデータとを含むデータについてひな形となる通信ヘッダの生成処理を行うことで、前記第１のデータと前記第２のデータと前記第３のデータとの夫々についてのパケットを生成するように制御する第１の制御工程と、
前記複数のデータに含まれる、前記第１のデータと前記第２のデータと前記第３のデータとが前記他の通信装置に送信されるデータとして指定されている場合に、前記複数のデータの内、前記第１のデータと前記第２のデータとが前記メモリ上で連続した領域に存在し、かつ前記第３のデータが前記第２のデータと前記メモリ上で連続した領域に存在しない場合、前記第１のデータと前記第２のデータとを含み、かつ前記第３のデータを含まないデータについてひな形となる通信ヘッダの生成処理を行うことで、前記第１のデータと前記第２のデータとの夫々についてのパケットを生成するように制御する第２の制御工程と、
を有することを特徴とする制御方法。
【請求項１７】
複数のデータが格納されたメモリを有する通信装置の制御方法であって、
前記複数のデータに含まれ、他の通信装置に送信されるデータとして指定された第１のデータと第２のデータと第３のデータとが前記メモリ上の連続した領域に存在する場合に、前記第１のデータと前記第２のデータとのサイズが同じ、かつ前記第３のデータのサイズが前記第２のデータのサイズより小さい場合、前記第１のデータと前記第２のデータと前記第３のデータとを含むデータについてひな形となる通信ヘッダの生成処理を行うことで、前記第１のデータと前記第２のデータと前記第３のデータとの夫々についてのパケットを生成するように制御する第１の制御工程と、
前記複数のデータに含まれ、前記他の通信装置に送信されるデータとして指定された前記第１のデータと前記第２のデータと前記第３のデータとが前記メモリ上の連続した領域に存在する場合に、前記第１のデータと前記第２のデータとのサイズが同じ、かつ前記第３のデータのサイズが前記第２のデータのサイズより大きい場合、前記第１のデータと前記第２のデータとを含み、かつ前記第３のデータを含まないデータについてひな形となる通信ヘッダの生成処理を行うことで、前記第１のデータと前記第２のデータとの夫々についてのパケットを生成するように制御する第２の制御工程と、
を有することを特徴とする制御方法。
【請求項１８】
請求項１から１５のいずれか１項に記載の通信装置としてコンピュータを動作させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のデータについてパケットを生成する装置に関する。
【背景技術】
【０００２】
ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）としてＬｉｎｕｘ（登録商標）を用いる通信装置がデータ通信を行う際に、送信処理では、まずアプリケーションがソケットＡＰＩのｓｅｎｄｍｓｇ（）のシステムコールを呼ぶことで、送信するメッセージ（データ）を指定する。これらのシステムコールが呼ばれることでユーザ空間からカーネル空間へ動作が切り替わるタスクスイッチが発生し、プロトコルスタックが動作する。プロトコルスタックは指定されたデータにＴＣＰヘッダ、およびＩＰ（Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ）ヘッダを付加してパケットを形成する。なお、ＴＣＰはＴｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌの略である。ｓｅｎｄｍｓｇ（）では、メッセージ単位でＴＣＰヘッダおよびＩＰヘッダを付加し、パケットを生成する。さらにシステムコールには、ｓｅｎｄｍｓｇ（）を拡張した、一度に複数のメッセージを指定することができるｓｅｎｄｍｍｓｇ（）がある。
【０００３】
また、一般的にＴＣＰ／ＩＰは処理負荷が大きいため、ＣＰＵの処理能力が低い組込み製品では、通信速度が低下してしまう可能性がある。そのため、特許文献１に開示されているようなオフロード処理が、ＣＰＵの処理軽減および処理高速化の手法の一つとして考案されている。オフロード処理では、ＭＳＳより大きいサイズのラージデータに対し、ＴＣＰヘッダ、およびＩＰヘッダの生成を行った後に、ＭＳＳ以下の単位に分割した各分割データに生成したヘッダのコピーを付加することで、一括でパケットを生成することができる。なお、ＭＳＳとはＭａｘｉｍｕｍ  Ｓｅｇｍｅｎｔ  Ｓｉｚｅの略である。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】国際公開第２０１０／０７３６７１号
【発明の概要】
【発明が解決しようとする課題】
【０００５】
オフロード処理では、ラージデータの先頭のアドレスと、分割データのサイズを指定することで、ラージデータを先頭から同じデータサイズで分割することができる。しかし、指定された複数のデータに連続した領域に配置されていないデータが含まれている場合、データ間の領域に配置されている他のデータを意図せず送信してしまう虞があるため、一括でオフロード処理を実行することはできなかった。また、複数のデータから成るラージデータをオフロード処理で分割する際には、分割サイズとして先頭のデータのサイズを用いる。そのため、ラージデータ内に、先頭のデータよりサイズが大きいデータが存在する場合、該サイズが大きいデータが先頭データのサイズに分割されてしまう虞があるため、一括でオフロード処理を実行することができなかった。そのため、指定された複数のデータの一部のデータに対してオフロード処理を実行できる場合であっても、全てのデータについて個別にヘッダの生成と付加、およびパケットの生成を行うため、効率的なパケット生成を実行できない虞がある。
【０００６】
上記を鑑み、本発明は、送信するデータとして指定された複数のデータについて、効率的なパケットの生成を実行することを目的とする。
【課題を解決するための手段】
【０００７】
上記の課題を解決するため、本発明の通信装置は、複数のデータが格納されたメモリを有する通信装置であって、前記複数のデータの少なくとも２以上のデータを含むデータについてひな形となる通信ヘッダの生成処理を行うことで、前記少なくとも２以上のデータの夫々についてのパケットを生成する第１の生成手段と、前記複数のデータに含まれる、第１のデータと第２のデータと第３のデータとが他の通信装置に送信されるデータとして指定されている場合に、前記複数のデータの内、前記第１のデータと前記第２のデータと前記第３のデータとが前記メモリ上で連続した領域に存在する場合、前記第１のデータと前記第２のデータと前記第３のデータとを含むデータについて前記第１の生成手段による生成を行うように制御する第１の制御手段と、前記複数のデータに含まれる、前記第１のデータと前記第２のデータと前記第３のデータとが前記他の通信装置に送信されるデータとして指定されている場合に、前記複数のデータの内、前記第１のデータと前記第２のデータとが前記メモリ上で連続した領域に存在し、かつ前記第３のデータが前記第２のデータと前記メモリ上で連続した領域に存在しない場合、前記第１のデータと前記第２のデータとを含み、かつ前記第３のデータを含まないデータについて前記第１の生成手段による生成を行うように制御する第２の制御手段と、を有する。
【０００８】
また、本発明の別の側面の通信装置は、複数のデータが格納されたメモリを有する通信装置であって、前記複数のデータの少なくとも２以上のデータを含むデータについてひな形となる通信ヘッダの生成処理を行うことで、前記少なくとも２以上のデータの夫々についてのパケットを生成する第１の生成手段と、前記複数のデータに含まれ、他の通信装置に送信されるデータとして指定された第１のデータと第２のデータと第３のデータとが前記メモリ上の連続した領域に存在する場合に、前記第１のデータと前記第２のデータとのサイズが同じ、かつ前記第３のデータのサイズが前記第２のデータのサイズより小さい場合、前記第１のデータと前記第２のデータと前記第３のデータとを含むデータについて前記第１の生成手段による生成を行うように制御する第１の制御手段と、前記複数のデータに含まれ、前記他の通信装置に送信されるデータとして指定された前記第１のデータと前記第２のデータと前記第３のデータとが前記メモリ上の連続した領域に存在する場合に、前記第１のデータと前記第２のデータとのサイズが同じ、かつ前記第３のデータのサイズが前記第２のデータのサイズより大きい場合、前記第１のデータと前記第２のデータとを含み、かつ前記第３のデータを含まないデータについて前記第１の生成手段による生成を行うように制御する第２の制御手段と、を有する。
【発明の効果】
【０００９】
本発明によれば、送信するデータとして指定された複数のデータについて、効率的なパケットの生成を実行することができるようになる。
【図面の簡単な説明】
【００１０】
【図１】通信装置１００のハードウェア構成および機能構成を示す図である。
【図２】実施形態１におけるｓｅｎｄｍｍｓｇ（）で指定されるメッセージのメモリ内での配置の一例を示す図である。
【図３】実施形態１における通信装置１００がパケットを生成する際に実行する処理を示すフローチャートである。
【図４】実施形態１におけるｓｅｎｄｍｍｓｇ（）で指定されたメッセージについてのパケットの生成処理の組み合わせの一例を示す図である。
【図５】実施形態１における通信装置１００がパケットを生成する際に実行する処理の処理を示すシーケンス図である。
【図６】実施形態２におけるｓｅｎｄｍｍｓｇ（）で指定されるメッセージのメモリ内での配置の一例を示す図である。
【図７】実施形態２における通信装置１００がパケットを生成する際に実行する処理を示すフローチャートである。
【図８】実施形態２におけるｓｅｎｄｍｍｓｇ（）で指定されたメッセージについてのパケットの生成処理の組み合わせの一例を示す図である。
【図９】実施形態３における通信装置１００がパケットを生成する際に実行する処理を示すフローチャートである。
【図１０】実施形態３におけるパケットの生成に係るテーブルの一例を示す図である。
【図１１】実施形態３におけるｓｅｎｄｍｍｓｇ（）で指定されたメッセージについてのパケットの生成処理の組み合わせの一例を示す図である。
【発明を実施するための形態】
【００１１】
以下、添付の図面を参照して実施形態を詳細に説明する。なお、以下の実施形態において示す構成は一例に過ぎず、本発明は図示された構成に限定されるものではない。
【００１２】
［実施形態１］
図１に、通信装置１００のハードウェア構成および機能構成を示す。通信装置１００は、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）としてＬｉｎｕｘを利用する装置である。通信装置１００は、データ通信を行う際に、システムコールとしてｓｅｎｄｍｍｓｇ（）を用いることで、一度で複数のメッセージ（データ）を指定することができる。
【００１３】
また、通信装置１００は、ＭＳＳ（Ｍａｘｉｍｕｍ  Ｓｅｇｍｅｎｔ  Ｓｉｚｅ）より大きいサイズのラージデータに対してオフロード処理を実行するためのハードウェアのオフローダを保持する。オフロード処理では、まずＭＳＳより大きいサイズのラージデータについて、ひな形となるＴＣＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ）ヘッダおよびＩＰヘッダを生成する。次に、ラージデータをＭＳＳ以下の単位で分割し、分割データを生成する。そして、ひな形のＴＣＰヘッダおよびＩＰヘッダを用いて、各分割データ用のＴＣＰヘッダおよびＩＰヘッダを生成し、分割データに付加することで、送信パケットを生成する。このように、複数の送信パケット分のデータに対して一括でひな形となるＴＣＰヘッダおよびＩＰヘッダを生成することで、ラージデータに含まれていたデータの夫々に対して個別に各ヘッダを生成するよりも効率的に送信パケットを生成することができる。
【００１４】
なお、通信装置１００は、オフロード処理によってＴＣＰヘッダおよびＩＰヘッダを生成するとしたが、ＵＤＰ（Ｕｓｅｒ  Ｄａｔａｇｒａｍ  Ｐｒｏｔｏｃｏｌ）通信によってデータ通信を行う場合、ＵＤＰヘッダおよびＩＰヘッダを生成するようにしてもよい。
【００１５】
通信装置１００は、例えば、システムコールとしてｓｅｎｄｍｍｓｇ（）を利用し、ＴＣＰ／ＩＰ通信におけるプロトコル処理をハードウェアのオフローダを利用して高速に動画像の通信を行うカメラや医療機器である。これに限らず、通信装置１００は、システムコールとしてｓｅｎｄｍｍｓｇ（）を利用し、ＴＣＰ／ＩＰ通信におけるプロトコル処理をハードウェアのオフローダを利用して高速にデータを通信することができる装置であればよい。
【００１６】
通信装置１００は、画像形成部１０１、ＣＰＵ１０２、メインメモリ１０３、システムバス１０４、オンチップメモリ１０５、オフローダ１０６、ＬＡＮ制御部１０９、およびＷＬＡＮ制御部１１０を備える。なお、ＣＰＵはＣｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔの略である。また、ＬＡＮはＬｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋの、ＷＬＡＮはＷｉｒｅｌｅｓｓ  Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋの略である。
【００１７】
ＣＰＵ１０２は、１以上のＣＰＵやＭＰＵ（Ｍｉｃｒｏ−Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）などのプロセッサにより構成され、メインメモリ１０３に記憶されたコンピュータプログラムを実行することにより通信装置１００全体を制御する。ＣＰＵ１０２は、ＯＳおよび、各種ソフトウェアとしてアプリケーションやＴＣＰ／ＩＰ通信のプロトコル処理を行うプロトコルスタック、各ハードウェアブロックを制御するためのドライバを実行する。
【００１８】
ここでアプリケーションとは、通信装置１００が画像形成部１０１において取得した動画像をＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）などの他の装置や、サーバに送信する際に動作するソフトウェアである。また、プロトコルスタックは、ＴＣＰ／ＩＰ通信のためのプロトコル処理および、ｓｅｎｄｍｍｓｇ（）により指定されたメッセージに対してＴＣＰヘッダ、およびＩＰヘッダを生成し、メッセージに付加することで送信パケットの生成を行う。
【００１９】
また、ＣＰＵ１０２はメモリ上のメッセージ（データ）が連続した領域に存在するかを判定する連続性判定部１２０を機能として有している。ＣＰＵ１０２は、連続性判定部１２０によって、前後のデータがメモリ上の連続した領域に存在するかを判定することができる。具体的には、前のデータの先頭アドレスに、前のデータのサイズをインクリメントしたものが、後のデータの先頭アドレスに一致した場合は、前後のデータが連続していると判定し、一致しなかった場合は、連続していないと判定する。
【００２０】
さらに、ＣＰＵ１０２はメモリ上のメッセージ（データ）のサイズを比較するサイズ判定部１２１を機能として有している。具体的にはサイズ判定部１２１は２つのデータについて、一方のデータのサイズが他方のデータのサイズより大きいかを判定することができる。あるいは、サイズ判定部１２１は、一方のデータのサイズが他方のデータのサイズより小さいかを判定してもよい。また、サイズ判定部１２１は、２つのデータのサイズが同一かを判定することもできる。ＣＰＵ１０２は、サイズ判定部１２１によって、メモリ上のメッセージ（データ）同士のサイズの大小やサイズが同一かを判定することができる。
【００２１】
通信装置１００は、連続性判定部１２０とサイズ判定部１２１との少なくとも一方の判定の結果に基づいて、後述のパケット生成部１０７によるパケットの生成処理の方法を決定する。
【００２２】
メインメモリ１０３は、ＲＯＭやＲＡＭ等の１以上のメモリにより構成され、後述する各種動作を行うためのコンピュータプログラムや、無線通信のための通信パラメータ等の各種情報を記憶する。なお、ＲＯＭはＲｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙの、ＲＡＭはＲａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙの略である。また、メインメモリ１０３は、アプリケーションが利用するメモリ領域でありメッセージとして指定される動画像等のデータが格納される。
【００２３】
オンチップメモリ１０５は、ＲＯＭやＲＡＭ等の１以上のメモリにより構成される。オンチップメモリ１０５は、主にプロトコルスタックが利用するメモリ領域であり、パケットを生成するためのデータバッファや通信ヘッダを生成する領域として使用される。
【００２４】
ＣＰＵ１０２で実行されるアプリケーションがメインメモリ１０３に格納された動画像データをリードおよびライトする際は、システムバス１０４を介してアクセスが行われる。同様に、プロトコルスタックがオンチップメモリ１０５をリードおよびライトする際もシステムバス１０４を介してアクセスが行われる。また、各ハードウェアブロック間のデータのやり取りも、システムバス１０４を介して行われるものとする。ここで、メインメモリ１０３およびオンチップメモリ１０５へのリードおよびライトは、ＣＰＵ１０２によるデータコピーや、オフローダ１０６のデータ転送部１０８を利用したＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）転送により実行される。
【００２５】
オフローダ１０６は、アプリケーションのメッセージ（データ）からパケットを生成するパケット生成部１０７と、ＤＭＡ転送を実行するデータ転送部１０８との機能を有するハードウェアである。
【００２６】
データ転送部１０８は、ＤＭＡ転送中にインターネットチェックサムを計算するチェックサム計算機能を有しており、パケット生成部１０７と共にプロトコルスタックの処理を高速化するオフローダ１０６として機能する。なお、データ転送部１０８は、チェックサム計算機能をＯＦＦして通常のＤＭＡ転送を実行可能である。インターネットチェックサムとは、ＩＥＴＦで規定されるＲＦＣ（Ｒｅｑｕｅｓｔ  ｆｏｒ  Ｃｏｍｍｅｎｔｓ）７９１、ＲＦＣ７９３、ＲＦＣ２４６０及び、ＲＦＣ１０７１における１６ビットワードごとの１の補数和の１の補数であるものとする。なおＩＥＴＦとはＩｎｔｅｒｎｅｔ  Ｅｎｇｉｎｅｅｒｉｎｇ  Ｔａｓｋ  Ｆｏｒｃｅの略である。
【００２７】
パケット生成部１０７は、レジスタ設定に従って、ｓｅｎｄｍｍｓｇ（）によって指定された複数（２以上）のメッセージについて、パケットの生成処理を行い、送信パケットをオンチップメモリ１０５または、メインメモリ１０３上に生成する機能である。
【００２８】
ＣＰＵ１０２で実行されるプロトコルスタックは、ｓｅｎｄｍｍｓｇ（）で指定される複数のメッセージに応じて、パケット生成部１０７の内部レジスタにドライバを介してアクセスし、パケットの生成処理を実行する。
【００２９】
ＬＡＮ制御部１０９、およびＷＬＡＮ制御部１１０は、通信に必要なＭＡＣ（Ｍｅｄｉａ  Ａｃｃｅｓｓ  Ｃｏｎｔｒｏｌ）、およびＰＨＹ（ｐｈｙｓｉｃａｌ  ｌａｙｅｒ）の処理を行う。なお、ＬＡＮ制御部は、有線ＬＡＮ等の有線通信の制御を行う制御部である。また、ＷＬＡＮ制御部１１０は、ＩＥＥＥ８０２．１１シリーズ規格に準拠した無線通信の制御を行う制御部である。パケット生成部１０７により生成された送信パケットは、オンチップメモリ１０５またはメインメモリ１０３から、ＬＡＮ制御部１０９およびＷＬＡＮ制御部１１０を介してＰＣやサーバ等の外部機器へ送信される。
【００３０】
なお、ＷＬＡＮ制御部１１０は、ＩＥＥＥ８０２．１１シリーズ規格に加えて、あるいは代えて、Ｂｌｕｅｔｏｏｔｈ（登録商標）、ＮＦＣ、ＵＷＢ、ＺｉｇＢｅｅ、ＭＢＯＡなどの他の無線通信方式に準拠した無線通信の制御を行ってもよい。なお、ＮＦＣはＮｅａｒ  Ｆｉｅｌｄ  Ｃｏｍｍｕｎｉｃａｔｉｏｎの、ＵＷＢはＵｌｔｒａ  Ｗｉｄｅ  Ｂａｎｄの略である。また、ＭＢＯＡはＭｕｌｔｉ  Ｂａｎｄ  ＯＦＤＭ（Ｏｒｔｈｏｇｏｎａｌ  Ｆｒｅｑｕｅｎｃｙ  Ｄｉｖｉｓｉｏｎ  Ｍｕｌｔｉｐｌｅｘｉｎｇ）  Ａｌｌｉａｎｃｅの略である。
【００３１】
また、通信装置１００はＬＡＮ制御部１０９とＷＬＡＮ制御部１１０のいずれか一方のみを有する通信装置であってもよい。
【００３２】
上述したパケット生成部１０７へのレジスタ設定は、一括設定および個別設定の２種類あり、ｓｅｎｄｍｍｓｇ（）により指定されるメッセージのメモリ内での配置やサイズなどの条件に基づいてプロトコルスタックによって設定される。
【００３３】
パケット生成部１０７は、これらの設定種別に応じたレジスタとして一括設定レジスタ１３０、および個別設定レジスタ１３１を備えており、各々のレジスタ設定に応じたパケット生成を行う。
【００３４】
一括設定では、ｓｅｎｄｍｍｓｇ（）で指定された複数のメッセージ（データ）に対して少なくとも下記のレジスタ設定項目が設定される。
・先頭となるデータの先頭アドレス
・複数メッセージのデータサイズの合計
・分割サイズ
一括設定において、パケット生成部１０７は、まず指定された複数のデータについて、ひな形となるＴＣＰヘッダおよびＩＰヘッダを作成する。そして、パケット生成部１０７は、先頭となるデータの先頭アドレスを参照し、先頭となるデータから全てのデータを分割サイズで指定されるサイズ毎に分割する。なお、分割サイズはＭＳＳ以下のサイズとなる。そして、ひな形となるＴＣＰヘッダおよびＩＰヘッダを用いて、各分割データに対応するＴＣＰヘッダおよびＩＰヘッダを生成し、付加することで、送信パケットを生成する。このように、一括設定において、パケット生成部１０７は、一度のレジスタ設定で複数のパケットを生成することができる。
【００３５】
一方、個別設定では、ｓｅｎｄｍｍｓｇ（）で指定された複数のメッセージ（データ）の夫々について少なくとも下記レジスタ設定項目が設定される。
・１個分のデータのデータサイズ
・該データの先頭アドレス
個別設定において、パケット生成部１０７は、指定された各データについて、夫々にＴＣＰヘッダおよびＩＰヘッダの生成を行い、付加することで、送信パケットの生成を行う。つまり、個別設定において、パケット生成部１０７は、一度のレジスタ設定で１つのパケットを生成する。そのため、複数のメッセージについてパケット生成処理を行う場合、個別設定より一括設定で送信パケットを生成するほうが、より少ない回数のレジスタ設定によって送信パケットを生成でき、オーバーヘッドが小さくなるため、効率的である。
【００３６】
ここで、一括設定が適用可能なメッセージのメモリ上での配置、およびデータサイズには以下の条件がある。
・メモリ上で連続領域に配置されたデータ
・一括設定を実行するデータのサイズが全て同じ、または一括設定を実行する最後尾のデータのサイズのみが前のデータのサイズよりも小さい
メモリ上でデータが連続領域に配置されてない場合とは、例えばほかのアプリケーションとメモリを共有している場合である。このように、メモリ上で連続領域に配置されていないデータに対して一括設定を行ってしまうと、データ間の領域に存在する関係のないデータまで送信してしまう虞がある。そのため、本実施形態では、メモリ上で連続した領域に配置されていないデータについては除外して、一括設定を実行する。なお、除外されたデータについては、個別設定を実行するか、あるいはオフローダを利用せず、プロトコルスタックによってパケット化まで実行するようにしてもよい。
【００３７】
また、一括設定を実行する最後尾のデータのサイズのみが前のデータのサイズよりも大きい場合に一括設定を実行すると、最後尾のデータは分割されて送信されてしまう虞がある。そのため、最後尾のデータのサイズのみが前のデータのサイズより大きい場合は、最後尾のデータは除外して一括設定を実行するほうがよい。
【００３８】
なお、個別設定では、各メッセージにレジスタ設定項目（データサイズとデータの先頭アドレス）を設定するため、メモリ上でのデータの配置やデータのサイズによる制約は生じない。
【００３９】
本実施形態では、通信装置１００は、送信するメッセージとしてｓｅｎｄｍｍｓｇ（）を用いて指定された複数のメッセージについて、効率的なパケットの生成が可能な一括設定を可能な限り適用できるように、レジスタ設定を決定する。具体的には、指定された複数のメッセージに一括設定の条件を満たさないメッセージが含まれている場合であっても、一括設定が可能なメッセージについては一括設定を行い、一括設定ができないメッセージについては個別設定を行うようにする。これにより、指定された複数のメッセージに一括設定の条件を満たさないメッセージが含まれている場合に、全てのメッセージについて個別設定を行う場合よりも、効率的にパケットを生成することができる。
【００４０】
また、指定された複数のメッセージに、連続領域に配置されていないメッセージが含まれている場合に、一括設定ができるメッセージについては一括設定を行うことで、メモリを占有せずにパケットの生成の効率化を図ることができる。
【００４１】
図２に、実施形態１におけるｓｅｎｄｍｍｓｇ（）で指定されるメッセージのメモリ内での配置の一例を示す。ここでは、アプリケーションによりコールされたｓｅｎｄｍｍｓｇ（）に含まれる複数のメッセージのメモリ上での配置について説明する。なお、メッセージはメインメモリ１０３上に配置されるものとして説明を行うが、オンチップメモリ１０５に配置されていても良いものとする。
【００４２】
図２に示した配置の例は、ｓｅｎｄｍｍｓｇ（）により指定される６つのメッセージの配置の例を示しており、メッセージ０〜メッセージ３（２００〜２０５）および、メッセージ５（２０５）は連続なメモリ領域に配置される。メッセージ４（２０４）は他のメッセージとは非連続なメモリ領域に配置される。また、メッセージ０〜メッセージ２（２００〜２０２）は同じサイズであり、他のメッセージ３（２０３）、メッセージ４（２０４）、メッセージ５（２０５）はサイズが異なる。また、メッセージ０〜２（２００〜２０２）はメッセージ３（２０３）よりもサイズが大きいものとする。ここで、各メッセージの添え字０〜５の番号はｓｅｎｄｍｍｓｇ（）により指定される順序を示している。
【００４３】
本実施形態では、図２に示したメッセージについてパケットの生成処理を行う場合を例として説明する。
【００４４】
図３は、実施形態１における通信装置１００がパケットを生成する際に、メインメモリ１０３に記憶されたコンピュータプログラムをＣＰＵ１０２に読み出し、実行することで実現される処理を示すフローチャートである。通信装置１００のアプリケーションは、まずデータをソケットＡＰＩで指定した宛先の通信装置へ送信するため、ｓｅｎｄｍｍｓｇ（）をコールする。通信装置１００では、ｓｅｎｄｍｍｓｇ（）がコールされることによりユーザ空間からカーネル空間へ動作が切り替わるタスクスイッチが発生し、プロトコルスタックへ処理が切り替わり、図３のフローチャートが開始される。なお、アプリケーションはｋ個（本実施形態では６個）のメッセージの各々のデータサイズおよび先頭アドレスをｓｅｎｄｍｍｓｇ（）の引数として指定する。
【００４５】
通信装置１００では、まずアプリケーションによってｓｅｎｄｍｍｓｇ（）に対してｋ個のメッセージが送信されるメッセージとして指定される（ステップＳ３００）。このとき、各メッセージについて、データサイズおよび先頭アドレスが指定される。続いて、通信装置１００は、指定されたｋ個のメッセージを、指定されたアドレスの小さい順にソートする（ステップＳ３０１）。
【００４６】
通信装置１００は、メッセージの順序を指定するための変数ｎおよびｍを初期化する。また、以降の処理のループ回数をカウントするための変数ｉを初期化する（ステップＳ３０２）。
【００４７】
通信装置１００は、ｎ番目のメッセージに対して、次のｎ＋１番目のメッセージが存在するかどうかを調べるためにｎ＋１がｋに達していないことを判定する（ステップＳ３０３）。図３のフローが開始されてから最初に本ステップの判定を行う場合は、ｎ＝０に初期化されているので、ｓｅｎｄｍｍｓｇ（）により指定されたメッセージの数が１個よりも多いことを判定することになる。通信装置１００は、ｎ＋１番目のメッセージが存在する場合、あるいはｓｅｎｄｍｍｓｇ（）により指定されたメッセージの数が１個よりも多い場合、本ステップでｎｏと判定し、ステップＳ３０４の処理を行う。一方、通信装置１００は、ｎ＋１番目のメッセージが存在しない場合、あるいはｓｅｎｄｍｍｓｇ（）により指定されたメッセージの数が１個の場合、本ステップでｙｅｓと判定し、ステップＳ３０９の処理を行う。
【００４８】
ステップＳ３０３でｎｏと判定された場合、通信装置１００は、ｎ番目のメッセージ（メッセージｎ）とｎ＋１番目のメッセージ（メッセージｎ＋１）とがメインメモリ１０３上で連続した領域に配置されているかを判定する（ステップＳ３０４）。ここで、フローチャートではｎ番目のメッセージをｍｓｇ（ｎ）、ｎ＋１番目のメッセージをｍｓｇ（ｎ＋１）と表記し、ｍｓｇ（ｎ）およびｍｓｇ（ｎ＋１）のサイズをｍｓｇ＿ｓｉｚｅ（ｎ）、ｍｓｇ＿ｓｉｚｅ（ｎ＋１）と表記する。Ｓ３０４において、通信装置１００は、メッセージｎのアドレスにメッセージｎのサイズを加算し、メッセージｎ＋１のアドレスと一致するか否かによって、本ステップの判定を行う。メッセージｎのアドレスにメッセージｎのサイズを加算し、メッセージｎ＋１のアドレスと一致した場合、通信装置１００は本ステップでｙｅｓと判定する。一方、メッセージｎのアドレスにメッセージｎのサイズを加算し、メッセージｎ＋１のアドレスと一致しなかった場合、通信装置１００は本ステップでｎｏと判定する。
【００４９】
通信装置１００は、ｎ番目のメッセージとｎ＋１番目のメッセージとが連続した領域に配置されている場合、本ステップでｙｅｓと判定し、ステップＳ３０５の処理を行う。一方、通信装置１００は、ｎ番目のメッセージとｎ＋１番目のメッセージとが連続した領域に配置されていない場合、本ステップでｎｏと判定し、ステップＳ３０９の処理を行う。例えば図２に示したようにメッセージが配置されている場合、０番目のメッセージのように、次のメッセージ（１番目のメッセージ）と連続した領域に配置されているメッセージについては、通信装置１００は本ステップでｙｅｓと判定する。一方、３番目のメッセージのように、次のメッセージ（４番目のメッセージ）が連続した領域に配置されていないメッセージについては、通信装置１００は本ステップでｎｏと判定する。
【００５０】
ステップＳ３０４でｙｅｓと判定された場合、通信装置１００は、メッセージｎとメッセージｎ＋１のサイズが異なるかどうかを判定する（ステップＳ３０５）。通信装置１００は、メッセージｎとメッセージｎ＋１とのサイズが同じ場合（ステップＳ３０５のｙｅｓ）、ｎとｉをカウントアップし（ステップＳ３０６、Ｓ３０７）、次のメッセージについてステップＳ３０３の判定を行う。
【００５１】
一方、メッセージｎとメッセージｎ＋１のサイズが異なる場合（ステップＳ３０５のｎｏ）、通信装置１００はメッセージｎのサイズがメッセージｎ＋１のサイズより大きいかを判定する（ステップＳ３０８）。通信装置１００は、メッセージｎのサイズがメッセージｎ＋１のサイズより大きい場合（ステップＳ３０８のｙｅｓ）、ｎをカウントアップし（ステップＳ３１２）、ステップＳ３１３の処理を行う。ステップＳ３１２の処理を行うことで、ステップＳ３０８でメッセージｎよりサイズが小さいと判定されたメッセージｎ＋１まで含めて、後述のステップＳ３１３およびＳ３１４において一括でパケットの生成処理を行うことができる。一方、通信装置１００は、メッセージｎのサイズがメッセージｎ＋１より大きくない場合（ステップＳ３０８のｎｏ）、ステップＳ３０９の処理を行う。
【００５２】
通信装置１００は、ステップＳ３０９において、ループカウントｉが０よりも大きいかを判定する（ステップＳ３０９）。本ステップでｙｅｓと判定される場合とは、メモリ上で連続領域にあり、最後尾のメッセージを除いてデータのサイズが同じメッセージが複数ある場合である。なお、最後尾のメッセージのサイズは他のメッセージのサイズより小さい。ループカウントｉがより大きい場合（ステップＳ３０９のｙｅｓ）、通信装置１００はステップＳ３１３の処理を行う。一方、ループカウントｉが０より大きくない場合（ステップＳ３０９のｎｏ）、通信装置１００はステップＳ３１０の処理を行う。
【００５３】
通信装置１００は、ステップＳ３１０において、メッセージｎのデータサイズと先頭アドレスをパケット生成部１０７の個別設定レジスタ１３１に設定する。続いて、ステップＳ３１１において、通信装置１００のプロトコルスタックがドライバを介してパケット生成部１０７によるパケットの生成処理を実行する。パケット生成部１０７は、個別設定レジスタ１３１に設定されたメッセージｎのデータサイズと先頭アドレスを用いて、メッセージｎから送信パケットを生成する。これによって、連続した領域にデータが存在しない一個のデータについては、個別設定によって送信パケットを生成することができる。通信装置１００はステップＳ３１１の処理を行うと、ステップＳ３１５の処理を行う。なお、通信装置１００はステップＳ３１１の処理と並行してステップＳ３１５の処理を行ってもよい。
【００５４】
通信装置１００は、ステップＳ３１３において、メッセージｍの先頭アドレスとメッセージｍ〜ｎまでのデータサイズの合計、および分割サイズとしてメッセージｍのサイズをパケット生成部１０７の一括設定レジスタ１３０に設定する。なお、各メッセージのサイズはＭＳＳ以下である。続いて、ステップＳ３１４において、通信装置１００のプロトコルスタックがドライバを介してパケット生成部１０７によるパケットの生成処理を実行する。パケット生成部１０７は、まずメッセージｍ〜ｎのラージデータに対してひな形となるＴＣＰヘッダおよびＩＰヘッダを生成する。そして、パケット生成部１０７は、メッセージｍの先頭アドレスから順に、設定された分割サイズに基づいてラージデータを分割し、各分割データにひな形となるヘッダから生成したＴＣＰヘッダおよびＩＰヘッダを付加することで、送信パケットを生成する。なお、各分割データにＴＣＰヘッダおよびＩＰヘッダを作る場合、パケット生成部１０７はひな形となるヘッダのコピーを生成し、ヘッダ内のフィールドで変更が必要なフィールドのみを変更することで効率的に各分割データのヘッダを生成することができる。ＴＣＰヘッダやＩＰヘッダ内で分割データごとに変更が必要なフィールドとは、例えばチェックサムのフィールドである。一方、ＴＣＰヘッダ内で分割データごとの変更が不要なフィールドとは、例えば送信元ポート番号や宛先ポート番号である。また、ＩＰヘッダ内で分割データごとの変更が不要なフィールドとは、例えば宛先ＩＰアドレスや送信元ＩＰアドレスのフィールドである。通信装置１００は、ステップＳ３１４の処理を行うと、ステップＳ３１５の処理を行う。なお、通信装置１００はステップＳ３１４の処理と並行してステップＳ３１５の処理を行ってもよい。
【００５５】
通信装置１００は、全てのメッセージにパケットの生成処理を行ったかを判定するために、ｎ＋１がｋ以上となるかを判定する（ステップＳ３１５）。ステップＳ３００で指定されたすべてのメッセージについてパケットの生成処理が完了している場合、通信装置１００は本ステップでｙｅｓと判定する。一方、まだパケットの生成処理が行われていないメッセージがある場合、通信装置１００は本ステップでｎｏと判定する。通信装置１００は、ステップＳ３１５でｙｅｓと判定した場合、本フローの処理を終了する。
【００５６】
一方、通信装置１００は、ステップＳ３１５でｎｏと判定された場合、通信装置１００はｉを初期化する（ステップＳ３１６）。また、通信装置１００は、ｎをカウントアップし（ステップＳ３１７）、ｎにｍを代入し（ステップＳ３１８）、ステップＳ３０３の処理を実行する。これにより、通信装置１００はすでにパケットの生成処理を終了したメッセージの次のメッセージからまたパケットの生成処理を開始することができる。
【００５７】
以上の処理により、通信装置１００は、ｓｅｎｄｍｍｓｇ（）によって指定されたメッセージに、一括でのパケットの生成を行えないメッセージが含まれている場合であっても、効率的にパケットを生成することができるようになる。具体的には、通信装置１００は、メモリ上で連続した領域に存在する同一のサイズの複数のデータおよびこれらのデータよりサイズが小さい最後尾のデータについては一括でパケットの生成処理を行う。また、次のデータが連続した領域にない１個のデータや、次のデータのサイズが自身のサイズより大きい１個のデータについては、個別にパケットの生成処理を行う。このように、図３の処理を行うことで、ｓｅｎｄｍｍｓｇ（）で指定された複数のメッセージについて、一括でのパケットの生成処理と、個別でのパケットの生成処理とを使い分けることができるようになる。
【００５８】
なお、図３のステップＳ３１１、およびステップＳ３１４では、パケット生成部１０７から通信装置１００のプロトコルスタックに、パケット生成の完了通知が割り込みで通知される。通信装置１００のプロトコルスタックは、完了通知の割り込みを受けると、生成された送信パケットの送信処理を開始する。具体的には、プロトコルスタックは、まずＬＡＮ制御部１０９のドライバに、生成された送信パケットの先頭アドレスをセットする。ＬＡＮ制御部１０９は、オンチップメモリ１０５に格納されている送信パケットをリードし、該送信パケットの宛先である他の装置に該送信パケットを送信する。ここで、プロトコルスタックは、完了通知の割り込みを受けたことではなく、パケット生成部１０７のレジスタをポーリングすることで、これらの送信パケットの送信処理の開始を判断してもよい。また、通信装置１００はＬＡＮ制御部１０９ではなく、ＷＬＡＮ制御部１１０によって送信パケットを送信してもよい。
【００５９】
図４に、実施形態１におけるｓｅｎｄｍｍｓｇ（）で指定されたメッセージについてのパケットの生成処理の組み合わせの一例を示す。ここでは、図２に示したようにメモリ上に配置されているメッセージについて、図３に示すフローの処理を実行した場合に、各メッセージがパケットの生成処理として、一括での生成処理が行われたのか、あるいは個別での生成処理が行われたのかを示す。
【００６０】
まず、図３のステップＳ３０１の処理が行われ、各メッセージがアドレスの小さい順にソートされる。そのため、ｓｅｎｄｍｍｓｇ（）で指定された順序から、メッセージ５（２０５）とメッセージ４（４０４）との順序が変更となる。これにより、図２でメッセージ５（２０５）であったメッセージが、ステップＳ３０１の処理後はメッセージ４（４０４）となり、図２でメッセージ４（２０４）であったメッセージは、ステップＳ３０１の処理後はメッセージ５（４０５）となる。
【００６１】
その後、メッセージ０からステップＳ３０３以降の処理が行われる。メッセージ０は次のメッセージであるメッセージ１と連続した領域に配置されており、サイズも同一であることから、ステップＳ３０５でｙｅｓと判定される。続いて、メッセージ１も次のメッセージであるメッセージ２と連続した領域に配置されており、サイズも同一であることから同様に処理される。
【００６２】
メッセージ２は次のメッセージであるメッセージ３と連続した領域に配置されているが、サイズは同一ではないため、ステップＳ３０５でｎｏと判定される。続いて、通信装置１００は、ステップＳ３０８で、メッセージ２のサイズがメッセージ３のサイズより大きいかを判定する。メッセージ３はメッセージ２よりサイズが小さいため、本ステップはｙｅｓと判定される。通信装置１００は、ステップＳ３１２〜ステップＳ３１４の処理を行うことで、メッセージ０〜メッセージ３について、一括でのパケットの生成処理を行う。
【００６３】
続いて、通信装置１００は、ステップＳ３１５ですべてのメッセージについてパケットの生成処理を行ったかを判定する。この場合、メッセージ３の次のメッセージであるメッセージ４についてパケットの生成処理が行われていないため、通信装置１００は本ステップでｎｏと判定する。通信装置１００はステップＳ３１６からステップＳ３１８の処理を行い、次にメッセージ４のパケットの生成処理の方法について判定する。メッセージ４の次のメッセージであるメッセージ５は連続した領域に配置されていないことから、通信装置１００はステップＳ３０４でｎｏと判定する。この場合、通信装置１００は、ステップＳ３０３〜ステップＳ３０５のループを複数回回していないことから、ｉ＝０であるため、ステップＳ３０９でｎｏと判定される。通信装置１００は、ステップＳ３１０およびステップＳ３１１の処理を行うことで、メッセージ４について個別でのパケットの生成処理を行う。
【００６４】
続いて、通信装置１００はメッセージ５のパケットの生成処理について判定を行う。この場合、メッセージ５の次のメッセージは存在しないことから、通信装置１００はステップＳ３０３でｙｅｓと判定する。その後、メッセージ４と同様にステップＳ３０９〜ステップＳ３１１の処理を行うことで、メッセージ５について個別でのパケットの生成処理を行う。メッセージ５についてパケットの生成処理を行うと、全てのメッセージについてパケットの生成処理が完了することから、通信装置１００はステップＳ３１５でｙｅｓと判定し、図３のフローを終了する。通信装置１００は生成した送信パケットについて、宛先となる他の通信装置に送信する。
【００６５】
図２に示したようにメモリ上に配置されているメッセージについて、図３に示すフローの処理を実行した場合、通信装置１００は、実線で示したメッセージ０〜３（４００）については一括でパケットの生成処理を行う。一方、通信装置１００は、破線で示したメッセージ４（４０１）およびメッセージ５（４０２）については、個別でのパケットの生成処理を行う。
【００６６】
図５は、実施形態１における通信装置１００がパケットを生成する際に実行する処理の処理を示すシーケンス図である。ここでは、アプリケーションがｓｅｎｄｍｍｓｇ（）をコールし、ＣＰＵ１０２のプロトコルスタックがパケットの生成処理を一括での生成処理に決定した後、パケットが送信されるまでのシーケンスを説明する。なお、図５では図２のメッセージ０〜メッセージ３に対するパケットの生成処理および生成されたパケットの送信のシーケンスを主に説明する。
【００６７】
まず、ＣＰＵ１０２において、アプリケーションがｓｅｎｄｍｍｓｇ（）をコールする（ステップＳ５００）。続いて、ｓｅｎｄｍｍｓｇ（）で指定されたメッセージに対して、ＣＰＵ１０２で動作するプロトコルスタックがパケット生成部１０７による生成処理を決定する（ステップＳ５０１）。ここでは、メッセージ０〜メッセージ３について、一括でのパケットの生成処理を行うと決定される。
【００６８】
プロトコルスタックがステップＳ５０１で決定された生成処理に応じて、ドライバを介して一括設定レジスタ１３０に一括設定を行う（ステップＳ５０２）。ここでは、メッセージ０〜３について、メッセージ０の先頭アドレスと、メッセージ０〜３のデータサイズの合計と、分割サイズとしてメッセージ０のサイズとが設定される。
【００６９】
パケット生成部１０７は、一括設定レジスタ１３０のライトを検出する（ステップＳ５０３）。パケット生成部１０７は、ステップＳ５０３で一括設定レジスタへのライトを検出した場合、まずひな形となるＴＣＰヘッダおよびＩＰヘッダを生成する。そして、通信装置１００は、ひな形となるＴＣＰヘッダおよびＩＰヘッダから各メッセージのヘッダを生成し、パケット生成部１０７が備える内部メモリに格納する（ステップＳ５０４）。
【００７０】
パケット生成部１０７は、メッセージ０〜３の夫々のデータサイズに相当する転送サイズが設定されたデスクリプタを生成し、パケット生成部１０７の内部メモリにセットする（ステップＳ５０５）。各デスクリプタに設定されるデータの参照アドレスは、メッセージ０については一括設定レジスタ１３０に設定された先頭アドレスを用い、メッセージ１については先頭アドレスに分割サイズを加えたアドレスとなる。メッセージ２についても、メッセージ１のアドレスに分割サイズ分インクリメントしたアドレスが設定される。
【００７１】
パケット生成部１０７は、データ転送部１０８に対して、デスクリプタを利用したＤＭＡ転送命令を発行する（ステップＳ５０６）。データ転送部１０８は、パケット生成部１０７の内部メモリからデスクリプタをリードし（ステップＳ５０７）、デスクリプタに従い、パケットを生成するためのＤＭＡ転送を行う（ステップＳ５０９）。
【００７２】
データ転送部１０８は、パケット生成部１０７の内部メモリに格納されているヘッダをリードし（ステップＳ５０８）、データをリードする（ステップＳ５１１）。この場合に、データ転送部１０８はリードしたヘッダおよびデータに対応するインターネットチェックサム（チェックサム）の計算を実行する。
【００７３】
データ転送部１０８によってＤＭＡ転送が行われることで、オンチップメモリ１０５上にヘッダおよびデータがライトされる（ステップＳ５１２）。また、データ転送部１０８はＤＭＡ転送を行う過程で算出したインターネットチェックサムをＴＣＰヘッダやＩＰヘッダの所定のフィールドにライトすることで、オンチップメモリ１０５上に送信パケットが生成される。
【００７４】
メッセージ０〜３についてパケットの生成が完了すると、データ転送部１０８からパケット生成部１０７にデータの転送完了が通知される（ステップＳ５１３）。データの転送完了が通知されたことに応じて、パケット生成部１０７からＣＰＵ１０２で動作するプロトコルスタックに対してパケットの生成完了が通知される（ステップＳ５１４）。
【００７５】
プロトコルスタックは、パケットの生成完了が通知されたことに応じて、ＣＰＵ１０２で動作するドライバを介してパケットの送信命令をＬＡＮ制御部１０９にセットする（ステップＳ５１５、Ｓ５１６）。
【００７６】
ＬＡＮ制御部１０９は、パケットの送信命令をセットされると、オンチップメモリ１０５から生成されたパケットをリードし（ステップＳ５１７）、メッセージ０〜３に対応するパケットを送信する（ステップＳ５１８）。
【００７７】
Ｓ５１９、Ｓ５２０ではＳ５０１〜Ｓ５１８と同様の処理がメッセージ４、およびメッセージ５に対して実行される。なお、パケットの生成処理として、一括での生成ではなく、個別での生成が行われるため、ステップＳ５１８では単一のパケットが送信される。
【００７８】
本実施形態では、送信メッセージとして指定された複数のメッセージに、一括でのパケットの生成処理を行えないメッセージが含まれている場合であっても、一部のメッセージについて一括での生成処理を行うことで、効率的にパケットの生成を行うことができる。このように、連続した領域に配置されていないメッセージが含まれている場合であっても、一部のメッセージに対して一括でのパケット生成を行えるため、他のアプリケーションによるメモリの利用を妨げることなく効率的なパケット生成を実現できる。
【００７９】
［実施形態２］
本実施形態では、パケットを生成するデータについて、ユーザ空間からカーネル空間の連続領域に一度コピー（ＤＭＡ転送）することで、データを連続領域に配置してからパケットの生成処理を行う。なお、ＤＭＡ転送はユーザ空間からユーザ空間の別領域であっても良い。以下、実施形態１と異なる点について説明する。
【００８０】
図６に、実施形態２におけるｓｅｎｄｍｍｓｇ（）で指定されるメッセージのメモリ内での配置の一例を示す。ここでは、アプリケーションによりコールされたｓｅｎｄｍｍｓｇ（）に含まれる複数のメッセージのメモリ上での配置について説明する。なお、メッセージはメインメモリ１０３上に配置されるものとして説明を行うが、オンチップメモリ１０５に配置されていても良いものとする。
【００８１】
図６に示した配置の例は、ｓｅｎｄｍｍｓｇ（）により指定される６つのメッセージの配置の例を示しており、メッセージ０〜メッセージ５（６００〜６０５）は非連続なメモリ領域に配置される。メッセージ０（６００）、メッセージ１（６０１）、メッセージ３（６０３）は同じサイズである。また、メッセージ２（６０２）とメッセージ５（６０５）も同じサイズである。なお、メッセージ０（６００）はメッセージ４（６０４）より大きく、メッセージ４（６０４）はメッセージ２（６０２）よりも大きいものとする。
【００８２】
本実施形態では、図６に示したメッセージについてパケットの生成処理を行う場合を例として説明する。
【００８３】
図７は、実施形態２における通信装置１００がパケットを生成する際に、メインメモリ１０３に記憶されたコンピュータプログラムをＣＰＵ１０２に読み出し、実行することで実現される処理を示すフローチャートである。図７のフローの開始のトリガーは図３と同様である。
【００８４】
通信装置１００では、まずアプリケーションによってｓｅｎｄｍｍｓｇ（）に対してｋ個のメッセージが送信されるメッセージとして指定される（ステップＳ７００）。
【００８５】
続いて、通信装置１００は、ステップＳ７００で指定されたメッセージのデータを、メモリ上の連続した領域に配置されるようにＤＭＡ転送する（ステップＳ７０１）。この場合に、ＤＭＡ転送はメインメモリ１０３からオンチップメモリ１０５に対して行われてもよいし、メインメモリ１０３からメインメモリ１０３上の別の領域に対して行われてもよい。
【００８６】
通信装置１００は、ステップＳ７０２およびステップＳ７０３について、図３のステップＳ３０２およびステップＳ３０３と同様の処理を行う。ステップＳ７０３でｙｅｓと判定した場合、通信装置１００はステップＳ７０７の処理を行う。一方、ステップＳ７０３でｎｏと判定した場合、通信装置１００はステップＳ７０４の処理を行う。
【００８７】
通信装置１００はステップＳ７０４について、図３のステップＳ３０５の処理を行う。ステップＳ７０４でｙｅｓと判定された場合、通信装置１００は図３のステップＳ３０６およびステップＳ３０７と同様に、ステップＳ７０５およびステップＳ７０６の処理を行い、再びステップＳ７０３の処理を行う。一方、ステップＳ７０４でｎｏと判定した場合、通信装置１００はステップＳ７０８の処理を行う。
【００８８】
通信装置１００はステップＳ７０８の処理として、図３のステップＳ３０８の処理を行う、本ステップにおいてｎｏと判定された場合、通信装置１００はステップＳ７０７の処理を行う。一方、本ステップにおいてｙｅｓと判定された場合、通信装置１００はステップＳ７０９の処理を行い、ステップＳ７１０の処理を行う。なお、ステップＳ７０９の処理は図３のステップＳ３１２の処理と同様である。
【００８９】
通信装置１００は、ステップＳ７０７の処理として、図３のステップＳ３０９と同様の処理を行う。通信装置１００は、ステップＳ７０７でｎｏと判定された場合、ステップＳ７１２およびステップＳ７１３の処理を行う。ステップＳ７１２およびステップＳ７１３の処理は、図３のステップＳ３１０およびステップＳ３１１と同様である。一方、ステップＳ７０７でｙｅｓと判定された場合、通信装置１００はステップＳ７１０の処理を行う。
【００９０】
通信装置１００は、ステップＳ７１０およびステップＳ７１１の処理として、図３のステップＳ３１３およびステップＳ３１４と同様の処理を行う。また、ステップＳ７１１の処理の後に、ステップＳ７１４の処理を行う。
【００９１】
通信装置１００はステップＳ７１４の処理として、図３のステップＳ３１５と同様の処理を行う。本ステップにおいてｙｅｓと判定された場合、通信装置１００は本フローを終了する。一方、本ステップにおいてｎｏと判定された場合、通信装置１００はステップＳ７１５〜Ｓ７１７の処理を行う。なお、これらの処理は図３のステップＳ３１６〜ステップＳ３１８の処理と同様である。
【００９２】
図７に示したように、ｓｅｎｄｍｍｓｇ（）によって指定された複数のメッセージについて、パケットの生成処理を行う前に、メモリ上で連続した領域に配置されるようにＤＭＡ転送を行うことで、データが連続領域にあるかの判定をスキップすることができる。そのため、通信装置１００は、データの大小の判定のみで、パケットの生成処理を一括にするか、個別にするかを決定することができる。この場合に、ＣＰＵ１０２はデータがメモリ上の連続した領域にあるかを判定するための連続性判定部１２０を有していなくてもよい。
【００９３】
図８に、実施形態２におけるｓｅｎｄｍｍｓｇ（）で指定されたメッセージについてのパケットの生成処理の組み合わせの一例を示す。ここでは、図６に示したようにメモリ上に配置されているメッセージについて、図７に示すフローの処理を実行した場合に、各メッセージがパケットの生成処理として、一括での生成処理が行われたのか、あるいは個別での生成処理が行われたのかを示す。
【００９４】
まず図７のステップＳ７０１の処理が行われ、各メッセージがメモリ上の連続した領域に配置されるようにＤＭＡ転送が行われる。そのため、メッセージ０〜５は、メモリ上で連続した領域に配置される。
【００９５】
その後、メッセージ０からステップＳ７０３以降の処理が行われる。メッセージ０は次のメッセージであるメッセージ１とサイズが同一であることから、ステップＳ７０４でｙｅｓと判定される。メッセージ１の次のメッセージであるメッセージ２は、サイズは同一ではないため、ステップＳ７０４でｎｏと判定される。続いて、通信装置１００は、ステップＳ７０８で、メッセージ１のサイズがメッセージ２のサイズより大きいかを判定する。メッセージ２はメッセージ１よりサイズが小さいため、本ステップはｙｅｓと判定される。通信装置１００は、ステップＳ７０９〜ステップＳ７１１の処理を行うことで、メッセージ０〜メッセージ２について、一括でのパケットの生成処理を行う。
【００９６】
続いて、通信装置１００は、ステップＳ７１４ですべてのメッセージについてパケットの生成処理を行ったかを判定する。この場合、メッセージ２の次のメッセージであるメッセージ３についてパケットの生成処理が行われていないため、通信装置１００は本ステップでｎｏと判定する。通信装置１００はステップＳ７１５からステップＳ７１７の処理を行い、次にメッセージ３のパケットの生成処理の方法について判定する。メッセージ３は次のメッセージであるメッセージ４とサイズが同一ではないため、ステップＳ７０４でｎｏと判定される。続いて通信装置１００は、ステップＳ７０８でメッセージ３のサイズがメッセージ４のサイズより大きいかを判定する。この場合、メッセージ３のほうがメッセージ４よりサイズが大きいため、通信装置１００はステップＳ７０８でｙｅｓと判定し、ステップＳ７０９〜ステップＳ７１１の処理を行うことで、メッセージ３とメッセージ４について、一括でのパケットの生成処理を行う。
【００９７】
通信装置１００は、ステップＳ７１４ですべてのメッセージについてパケットの生成処理を行ったかを判定する。この場合、メッセージ４の次のメッセージであるメッセージ５についてパケットの生成処理が行われていないため、通信装置１００は本ステップでｎｏと判定する。通信装置１００はステップＳ７１５からステップＳ７１７の処理を行い、次にメッセージ５のパケットの生成処理の方法について判定する。メッセージ５は次に続くメッセージが存在しないため、通信装置１００はステップＳ７０３でｙｅｓと判定する。また、通信装置１００はステップＳ７０３およびステップＳ７０４の処理を複数回行っていないことから、ステップＳ７０７でｎｏと判定する。通信装置１００は、ステップＳ７１２およびステップＳ７１３の処理を行うことで、メッセージ５について個別でのパケットの生成処理を行う。メッセージ５についてパケットの生成処理を行うと、全てのメッセージについてパケットの生成処理が完了することから、通信装置１００はステップＳ７１４でｙｅｓと判定し、図７のフローを終了する。通信装置１００は生成した送信パケットについて、宛先となる他の通信装置に送信する。
【００９８】
図６に示したようにメモリ上に配置されているメッセージについて、図７に示すフローの処理を実行した場合、通信装置１００は、実線で示したメッセージ０〜２（８００）およびメッセージ３〜４（８０１）については一括でパケットの生成処理を行う。一方、通信装置１００は、破線で示したメッセージ５（８０２）については、個別でのパケットの生成処理を行う。
【００９９】
本実施形態において、通信装置１００はｓｅｎｄｍｍｓｇ（）によって指定されたメッセージについて、メモリ上で連続した領域に配置されるようにＤＭＡ転送を行うことで、各メッセージのサイズのみを判定することで、パケットの生成処理の方法を決定できる。また、メッセージの配置によっては、一括によるパケットの生成が可能となるメッセージを増やすことができる。また、実施形態１ではアドレスの小さい順にメッセージをソートする処理を行ったが、本実施形態ではＤＭＡ転送を実行することでソートが不要となるため、ソフト負荷が低減できる。
【０１００】
なお、本実施形態では、図７のステップＳ７０１でＤＭＡ転送によってデータを転送するとしたが、この転送をＣＰＵによるデータコピーによって実現してもよい。
【０１０１】
また、本実施形態では、図７のステップＳ７０１で、データをメモリ上の連続した領域に配置されるように転送を行うとしたが、これに限らない。アプリケーションがデータをメモリに書き込む際に、メモリ上の連続した領域に配置されるように書き込むようにしてもよい。この処理は、図７のステップＳ７００より前に行われる。また、この場合、図７のステップＳ７０１は省略されてもよい。
【０１０２】
［実施形態３］
本実施形態では、ｓｅｎｄｍｍｓｇ（）によって指定されたメッセージについて、パケットの生成処理を行う前に、一括したパケットの生成を行うことができるメッセージを組み合わせたテーブルをあらかじめ作成する。これにより、より多くのメッセージについて、一括したパケットの生成を実行できるようになる。以下、実施形態１および２と異なる点について説明する。
【０１０３】
図９は、実施形態２における通信装置１００がパケットを生成する際に、メインメモリ１０３に記憶されたコンピュータプログラムをＣＰＵ１０２に読み出し、実行することで実現される処理を示すフローチャートである。図９のフローの開始のトリガーは図３と同様である。
【０１０４】
通信装置１００では、まずアプリケーションによってｓｅｎｄｍｍｓｇ（）に対してｋ個のメッセージが送信されるメッセージとして指定される（ステップＳ９００）。続いて、通信装置１００はステップＳ９０１において、指定されたメッセージ（データ）をサイズが小さい順にソートする。通信装置１００は、ステップＳ９０１の処理を行うと、ステップＳ９０２の処理を行う。ステップＳ９０１の処理は、図３のステップＳ３０２と同様である。
【０１０５】
次に通信装置１００は、ステップＳ９０３の処理を行うが、本ステップの処理は図３のステップＳ３０３と同様である。通信装置１００は本ステップでｙｅｓと判定すると、ステップＳ９０７の処理を行う。一方、通信装置１００は本ステップでｎｏと判定すると、ステップＳ９０４の処理を行う。
【０１０６】
通信装置１００は、ステップＳ９０４の処理を行うが、本ステップの処理は図３のステップＳ３０５と同様である。通信装置１００は、本ステップでｙｅｓと判定されると、ステップＳ９０５およびＳ９０６の処理を行う。ここで、ステップＳ９０５およびＳ９０６の処理は、図３のステップＳ３０６およびＳ３０７の各々の処理と同様である。一方、本ステップでｎｏと判定されると、通信装置１００はステップＳ９０７の処理を行う。この処理は、図３のステップＳ３０９の処理と同様である。
【０１０７】
通信装置１００は、ステップＳ９０７でｙｅｓと判定されると、同じサイズのメッセージｍ〜ｎに関する情報を一括テーブルに記憶する（ステップＳ９０８）。なお、メッセージｍ〜ｎに関する情報とは、各メッセージの先頭アドレスである。あるいは通信装置１００は、メッセージに関する情報として、メッセージの先頭アドレスに加えて、メッセージのサイズなどの情報を記憶してもよい。一方、ステップＳ９０７でｎｏと判定された場合、通信装置１００は、メッセージｎに関する情報を個別テーブルに記憶する（ステップＳ９１０）。なお、通信装置１００は、ステップＳ９０８およびステップＳ９１０でテーブルへの記憶を行う場合、記憶単位毎にデリミタを挿入する。これにより一括テーブルのほうでは、同じサイズのメッセージの組を識別可能となる。なお、個別テーブルでは、記憶単位ごとにデリミタを入れてもよいし、入れなくてもよい。
【０１０８】
通信装置１００は、ステップＳ９０８あるいはステップＳ９１０の処理を行うと、ステップＳ９０９の処理を行う。本ステップの処理は、図３のステップＳ３１５と同様である。本ステップでｎｏと判定された場合、通信装置１００はステップＳ９１１からＳ９１３の処理を行うが、これらの処理は図３のステップＳ３１６〜Ｓ３１８の各々の処理と同様である。一方、本ステップでｙｅｓと判定された場合、通信装置１００はステップＳ９１４の処理を行う。
【０１０９】
通信装置１００は、一括テーブル内に未処理のメッセージがあるかどうかを判定する（ステップＳ９１４）。通信装置１００は、一括テーブルに未処理のメッセージがない場合は（ステップＳ９１４のｎｏ）、ステップＳ９１９の処理を実行する。一方、一括テーブルに未処理のメッセージがある場合は（ステップＳ９１４のｙｅｓ）、通信装置１００はステップＳ９１５の処理を実行する。
【０１１０】
通信装置１００は、一括テーブルを参照し、一組分のメッセージをＤＭＡ転送する（ステップＳ９１５）。この場合、通信装置１００は、メッセージが保持されているメインメモリ１０３から、オンチップメモリ１０５に転送してもよいし、メインメモリ１０３に転送してもよい。また、本ステップで転送されるメッセージは、オンチップメモリ１０５またはメインメモリ１０３上で連続した領域に配置されるように転送される。ここで、一組分のメッセージとはテーブル先頭からデリミタ、もしくはデリミタ間のメッセージに関する情報で示されるメッセージである。
【０１１１】
通信装置１００は、個別テーブルに記憶された情報によって示されるメッセージの中に、ステップＳ９１５でＤＭＡ転送したメッセージよりデータサイズが小さいメッセージがあるかを判定する（ステップＳ９１６）。個別テーブルにステップＳ９１５でＤＭＡ転送したメッセージよりデータサイズが小さいメッセージがある場合（ステップＳ９１６のｙｅｓ）、通信装置１００はステップＳ９１７の処理を行う。一方、個別テーブルにステップＳ９１５でＤＭＡ転送したメッセージよりデータサイズが小さいメッセージがない場合（ステップＳ９１６のｎｏ）、通信装置１００はステップＳ９１８の処理を行う。
【０１１２】
通信装置１００は、ステップＳ９１７において個別テーブルに記憶された情報によって示されるメッセージの中から、該当する１個のメッセージをＳ９１５でＤＭＡ転送したメッセージと連続する領域に配置されるようにＤＭＡ転送する。通信装置１００は、ステップＳ９１７の処理を行うと、ステップＳ９１８の処理を行う。
【０１１３】
通信装置１００は、ステップＳ９１６およびステップＳ９１７でＤＭＡ転送を行ったメッセージについて、ステップＳ９１８の処理を行い、一括でのパケットの生成処理を実行し、ステップＳ９１４の処理を再度実行する。ステップＳ９１８の処理は、図３のステップＳ３１３およびＳ３１４と同様の処理である。
【０１１４】
通信装置１００はステップＳ９１４でｎｏと判定された場合、ステップＳ９１９の処理を実行する。通信装置１００はステップＳ９１９で、個別テーブルに記憶されているメッセージを全てＤＭＡ転送する。そして、通信装置１００は、ステップＳ９１９でＤＭＡ転送したすべてのメッセージについて、ステップＳ９２０の処理を行い、個別でのパケットの生成処理を実行する。ステップＳ９２０の処理は、図３のステップＳ３１０およびＳ３１１と同様の処理である。なお、ステップＳ９１４でｎｏと判定した場合に、個別テーブルにすでに未処理のメッセージがない場合、ステップＳ９１９およびステップＳ９２０の処理をスキップしてもよい。
【０１１５】
通信装置１００は、一括テーブルおよび個別テーブルをクリアし（ステップＳ９２１）、本フローの処理を終了する。
【０１１６】
以上、図９の処理を行うことで、通信装置１００は、パケットの生成処理を行う前に、一括での生成処理を実行可能なメッセージについてあらかじめテーブルを作成する。また、一括処理を実行可能なメッセージの組に対して、サイズが小さいデータを組み合わせてパケットの一括での生成処理を行うことで、より多くのデータについて一括での生成処理を実行することができる。
【０１１７】
図１０に、実施形態３におけるパケットの生成に係るテーブルの一例を示す。本実施形態では、図６に示したメッセージに対して図９の処理を実行した場合に生成される一括テーブル１０００、および個別テーブル１００１を例として示す。
【０１１８】
まず、図９のステップＳ９０１でメッセージ０〜５はサイズの小さい順にソートされる。この場合、サイズが小さい順に、メッセージ２、５、４、０、１、３の順にソートされる。この場合に、メッセージ２、５のサイズは同一である。また、メッセージ０、１、３のサイズは同一である。
【０１１９】
図９のステップＳ９０３〜９１３の処理を実行すると、図１０に示したようにテーブルに記憶される。すなわち、一括テーブル１０００には、まずメッセージ２に関する情報と５に関する情報とが一つの組として記憶される。また、そのあとにデリミタを挟んで、メッセージ０、１、３の夫々に関する情報が一つの組として記憶される。一方、個別テーブル１００１には、メッセージ４に関する情報が記憶される。なお、デリミタとしては、判定可能な文字コードや文字列であれば何を用いてもよいものとする。デリミタを挿入することで、通信装置１００は、一括でのパケット生成処理が可能なメッセージの組を判別することが可能である。
【０１２０】
図１１に、実施形態３におけるｓｅｎｄｍｍｓｇ（）で指定されたメッセージについてのパケットの生成処理の組み合わせの一例を示す。ここでは、図６に示したようにメモリ上に配置されているメッセージについて、図９に示すフローの処理を実行した場合に、各メッセージがパケットの生成処理として、一括での生成処理が行われたのか、あるいは個別での生成処理が行われたのかを示す。
【０１２１】
図９のステップＳ９１５において、まず一括テーブルに記憶された情報に基づいて、メッセージ２および５がＤＭＡ転送される。個別テーブルに記憶された情報に示されるメッセージの中には、メッセージ２および５より小さいメッセージは存在しないことから、図９のステップＳ９１６ではｎｏと判定される。通信装置１００は、図９のステップＳ９１８の処理を行うことで、メッセージ２および５について、パケットの一括での生成処理を行う。
【０１２２】
次に通信装置１００は、図９のステップＳ９１５において、一括テーブルに記憶された情報に基づいて、メッセージ０、１、および３をＤＭＡ転送する。この場合に、個別テーブルに記憶された情報が示すメッセージの中に、メッセージ０、１、および３よりサイズが小さいメッセージ４が存在することから（ステップＳ９１６のｙｅｓ）、通信装置１００はメッセージ４のＤＭＡ転送を実行する（ステップＳ９１７）。そして、通信装置１００は、図９のステップＳ９１８の処理を行うことで、メッセージ０、１、３、および４について、パケットの一括での生成処理を行う。
【０１２３】
図６に示したようにメモリ上に配置されているメッセージについて、図９に示すフローの処理を実行した場合、通信装置１００は、実線で示したメッセージ２および５（１１００）について一括でパケットの生成処理を行う。同様に、通信装置１００は、実線で示したメッセージ０、１、３、および４（１１０１）についても、一括でパケットの生成処理を行う。
【０１２４】
本実施形態において、通信装置１００はｓｅｎｄｍｍｓｇ（）によって指定されたメッセージについて、パケットの生成処理を行う前に、一括での生成処理を実行可能なメッセージについてあらかじめテーブルを作成する。また、一括処理を実行可能なメッセージの組に対して、サイズが小さいデータを組み合わせてパケットの一括での生成処理を行うことで、より多くのデータについて一括での生成処理を実行することができる。
【０１２５】
また、実施形態１、２、および３において、通信装置１００は、ＯＳとしてＬｉｎｕｘを用いるとしたが、これに限らない。通信装置１００は、ｓｅｎｄｍｍｓｇ（）のように、パケットを生成するメッセージとして、一度に複数のメッセージを指定することができる関数を用いることができればよい。この場合、通信装置１００は、送信するメッセージとして指定された複数のメッセージがメモリ内で連続した領域に存在しない場合、実施形態１、２、または３の処理を実行することができる。これに加えて、あるいは代えて、送信するメッセージとして指定された複数のメッセージの内、先頭のメッセージよりサイズが大きいメッセージが存在する場合も、同様に実施形態１、２、または３の処理を実行することができる。
【０１２６】
上記の各実施形態は、適宜組み合わせて実施することが可能である。また、通信装置がどの実施形態の通信装置として動作するかを、動作モードとしてユーザが選択できるようにしてもよい。
【０１２７】
なお、図３、図７および図９に示した通信装置１００のフローチャートの少なくとも一部または全部をハードウェアにより実現してもよい。ハードウェアにより実現する場合、例えば、所定のコンパイラを用いることで、各ステップを実現するためのコンピュータプログラムからＦＰＧＡ上に専用回路を生成し、これを利用すればよい。ＦＰＧＡとは、Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙの略である。また、ＦＰＧＡと同様にしてＧａｔｅ  Ａｒｒａｙ回路を形成し、ハードウェアとして実現するようにしてもよい。また、ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）により実現するようにしてもよい。
【０１２８】
同様に、図４に示した通信装置１００のシーケンス図の少なくとも一部または全部をハードウェアにより実現してもよい。ハードウェアにより実現する場合、例えば、所定のコンパイラを用いることで、各ステップを実現するためのコンピュータプログラムからＦＰＧＡ上に専用回路を生成し、これを利用すればよい。ＦＰＧＡとは、Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙの略である。また、ＦＰＧＡと同様にしてＧａｔｅ  Ａｒｒａｙ回路を形成し、ハードウェアとして実現するようにしてもよい。また、ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）により実現するようにしてもよい。
【０１２９】
以上、実施形態を詳述したが、本発明は例えば、システム、装置、方法、プログラム若しくは記録媒体（記憶媒体）などとしての実施態様をとることが可能である。具体的には、複数の機器（例えば、ホストコンピュータ、インターフェース機器、撮像装置、ｗｅｂアプリケーションなど）から構成されるシステムに適用してもよいし、また、一つの機器からなる装置に適用してもよい。
【０１３０】
本発明は、上述の実施形態の１以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける１つ以上のプロセッサがプログラムを読出し実行する処理でも実現可能である。また、１以上の機能を実現する回路（例えば、ＡＳＩＣ）によっても実現可能である。
【符号の説明】
【０１３１】
１００  通信装置
１０１  画像形成部
１０２  ＣＰＵ
１０３  メインメモリ
１０４  システムバス
１０５  オンチップメモリ
１０６  オフローダ
１０９  ＬＡＮ制御部
１１０  ＷＬＡＮ制御部
【図１】
2020174322.tif 000003
【図２】
2020174322.tif 000004
【図３】
2020174322.tif 000005
【図４】
2020174322.tif 000006
【図５】
2020174322.tif 000007
【図６】
2020174322.tif 000008
【図７】
2020174322.tif 000009
【図８】
2020174322.tif 000010
【図９】
2020174322.tif 000011
【図１０】
2020174322.tif 000012
【図１１】
2020174322.tif 000013