(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-01-26
(45)【発行日】2024-02-05
(54)【発明の名称】通信装置、通信方法およびプログラム
(51)【国際特許分類】
H04L 69/00 20220101AFI20240129BHJP
【FI】
H04L69/00
(21)【出願番号】P 2020022229
(22)【出願日】2020-02-13
【審査請求日】2023-01-16
(73)【特許権者】
【識別番号】000001007
【氏名又は名称】キヤノン株式会社
(74)【代理人】
【識別番号】100109380
【氏名又は名称】小西 恵
(74)【代理人】
【識別番号】100109036
【氏名又は名称】永岡 重幸
(72)【発明者】
【氏名】木下 暁央
【審査官】和平 悠希
(56)【参考文献】
【文献】特開2019-165380(JP,A)
【文献】特開2019-165423(JP,A)
【文献】特開平07-030611(JP,A)
【文献】特開2003-304248(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
H04L 12/00-12/66
H04L 41/00-101/695
(57)【特許請求の範囲】
【請求項1】
送信データを含むパケットをバッファに格納する格納手段と、
前記格納手段に格納された前記パケットを送信する送信手段と、
前記送信手段によって前記パケットが送信された場合に、前記パケットの格納に用いられた前記バッファを解放する解放手段と、
前記バッファの解放を通知させるか否かを設定する設定手段と、
前記解放手段によって前記バッファが解放された場合に、
前記設定手段で通知させる設定がされている場合に前記バッファの解放を通知
し、通知させない設定がされている場合に前記バッファの開放を通知しない通知手段と、
を備えることを特徴とする通信装置。
【請求項2】
前記送信データから前記パケットを生成する生成手段をさらに備えることを特徴とする請求項1に記載の通信装置。
【請求項3】
前記生成手段は、オフローダを用いて前記パケットを生成することを特徴とする請求項2に記載の通信装置。
【請求項4】
前記オフローダは、TSO(TCP Segmentation Offload)機能を用いることで、前記パケットを生成することを特徴とする請求項3に記載の通信装置。
【請求項5】
前記通知手段は、前記送信データの送信を要求したアプリケーションに対して前記バッファの解放を通知することを特徴とする請求項1から4のいずれか1項に記載の通信装置。
【請求項6】
前記アプリケーションは、前記通知手段から前記バッファの解放が通知されると、前記送信データの送信の要求を再開することを特徴とする請求項5に記載の通信装置。
【請求項7】
前記設定手段は、ソケットAPI(Application Programming Interface)の返り値に基づいて、前記バッファの解放を通知させるか否かを設定することを特徴とする請求項
1から6のいずれか1項に記載の通信装置。
【請求項8】
前記設定手段は、前記送信手段が前記パケットを送信する通信プロトコルの種類に基づいて、前記バッファの解放を通知させるか否かを設定することを特徴とする請求項
1から7のいずれか1項に記載の通信装置。
【請求項9】
前記設定手段は、前記パケットを送信する通信インタフェースの種類に基づいて、前記バッファの解放を通知させるか否かを設定することを特徴とする請求項
1から
8のいずれか1項に記載の通信装置。
【請求項10】
前記通信インタフェースの種類は、有線LAN(Local Area Network)および無線LANを含むことを特徴とする請求項
9に記載の通信装置。
【請求項11】
送信データを含むパケットをバッファに格納するステップと、
前記格納された前記パケットを送信するステップと、
前記パケットが送信された場合に、前記パケットの格納に用いられた前記バッファを解放するステップと、
前記バッファの解放を通知させるか否かを設定するステップと、
前記バッファが解放された場合に、
前記設定するステップで通知させる設定がされている場合に前記バッファの解放を通知
し、通知させない設定がされている場合に前記バッファの開放を通知しないステップと、
を備えることを特徴とする通信方法。
【請求項12】
コンピュータを請求項1から
10のいずれか1項に記載の通信装置として動作させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、通信装置、通信方法およびプログラムに関する。
【背景技術】
【0002】
TCP/IP(Transmission Control Protocol/Internet Protocol)のプロトコル処理では、CPU(Central Processing Unit)の処理軽減および通信の高速化が求められている。このような要求に対応するため、ハードウェアであるパケット生成オフローダを用いてパケットを生成する技術が採用されることがある。この技術では、パケット生成オフローダは、指定されたユーザデータをソケットAPI(Application Programming Interface)のコール毎にネットワークバッファへ転送する処理とチェックサム計算を同時に行う。そして、事前に計算したチェックサム値を用いてMSS(Maximum Segment Size)以下のデータサイズを1つずつCPU処理でパケット化する。
【0003】
また、送信データのセグメントをチャンク化する処理と、チャンク化したセグメントをIPパケット化する処理をパケット生成オフローダが実行する技術が用いられている。この技術は、TSO(TCP Segmentation Offload)機能により実現されている。TSO機能は、NIC(Network Interface Card)などのパケット生成オフローダで実施されることが一般的である。TSO機能を用いることで、アプリケーションデータをMSS単位の送信ではなく、MSSよりも大きいデータ単位でパケット生成オフローダに送信要求を行い、MSS単位でチャンク化させてネットワークに連続送信することが可能となる。
【0004】
CPUの高スペック化またはパケット生成オフローダの使用により、通信インタフェース(以下、ネットワークI/Fと言う)の送信処理よりもパケット生成処理が高速になることがある。この場合、ソケットAPIにおいて送信されたデータが全て送信できない現象または送信エラーが発生し、アプリケーションは、ソケットAPIを定期的にコールし、送信可能かどうかを確認する必要がある。
【0005】
特許文献1には、送信バッファおよびバス制御部を有する通信アダプタが開示されている。バス制御部は、バッファ管理部から送信バッファが引き渡されたことを確認した後、ATMからデータの送信が要求されると、送信バッファを使用してこれに送信データを格納する。
【先行技術文献】
【特許文献】
【0006】
【発明の概要】
【発明が解決しようとする課題】
【0007】
しかしながら、ソケットAPIを定期的にコールし、送信可能かどうかを確認する場合、プロトコルスタックおよびネットワークI/Fが送信可能な状態になっても、確認の時間間隔が経過しないと、送信可能な状態を検知できない。このため、パケットの送信効率が低下するおそれがある。
【0008】
また、特許文献1に開示された技術では、バス制御部は、送信バッファが引き渡されたことを確認した後、ATMからデータ送信が要求されると、送信データを送信バッファに格納し、送信データがネットワークに送出される。このため、特許文献1に開示された技術では、送信バッファが引き渡された場合においても、ATMからデータ送信が要求されないと、送信データがネットワークに送出されない。従って、ATMからのデータ送信の要求タイミングによっては、送信効率が低下するおそれがある。
【0009】
本発明は、上述の課題を鑑み、パケットの送信効率を向上させることを目的とする。
【課題を解決するための手段】
【0010】
本発明の1つの態様による通信装置は、送信データを含むパケットをバッファに格納する格納手段と、前記格納手段に格納された前記パケットを送信する送信手段と、前記送信手段によって前記パケットが送信された場合に、前記パケットの格納に用いられた前記バッファを解放する解放手段と、前記解放手段によって前記バッファが解放された場合に、前記バッファの解放を通知する通知手段と、を備える。
【発明の効果】
【0011】
本発明によれば、パケットの送信効率を向上させることができる。
【図面の簡単な説明】
【0012】
【
図1】実施形態1に係る通信装置のハードウェア構成例を示すブロック図。
【
図2】実施形態1に係る通信装置の機能的な構成例を示すブロック図。
【
図3】実施形態1に係る通信装置のデータ送信処理を示すフローチャート。
【
図4】実施形態1に係る通信装置のデータ送信完了処理を示すフローチャート。
【
図5】実施形態2に係る通信装置のデータ送信処理を示すフローチャート。
【発明を実施するための形態】
【0013】
以下、添付図面を参照して本発明の実施形態を詳細に説明する。なお、以下の実施形態は本発明を限定するものではなく、また、実施形態で説明されている特徴の組み合わせの全てが本発明の解決手段に必須のものとは限らない。実施形態の構成は、本発明が適用される装置の仕様や各種条件(使用条件、使用環境等)によって適宜修正または変更され得る。本発明の技術的範囲は、特許請求の範囲によって確定されるのであって、以下の個別の実施形態によって限定されない。
【0014】
<実施形態1>
図1は、実施形態1に係る通信装置のハードウェア構成例を示すブロック図である。
図1に示す通信装置1の各機能モジュールのうち、ソフトウェアにより実現される機能については、各機能モジュールの機能を提供するためのプログラムがROM(Read Only Memory)等のメモリに記憶される。そして、そのプログラムをRAM(Random Access Memory)に読み出してCPUが実行することにより実現される。ハードウェアにより実現される機能については、例えば、所定のコンパイラを用いることで、各機能モジュールの機能を実現するためのプログラムからFPGA上に自動的に専用回路を生成すればよい。FPGAとは、Field Programmable Gate Arrayの略である。また、FPGAと同様にしてGate Array回路を形成し、ハードウェアとして実現するようにしてもよい。また、ASIC(Application Specific Integrated Circuit)により実現するようにしてもよい。なお、
図1に示した機能ブロックの構成は一例であり、複数の機能ブロックが1つの機能ブロックを構成するようにしてもよいし、いずれかの機能ブロックが複数の機能を行うブロックに分かれてもよい。
【0015】
図1において、通信装置1は、ネットワーク2を介して通信相手装置3に接続されている。通信装置1は、ネットワーク2を介して通信相手装置3と通信可能である。通信装置1は、例えば、通信機能を備えるパーソナルコンピュータ、タブレット端末、スマートフォン、カメラ、プリンタまたはプロジェクタープロジェクトなどであってもよいが、これらに限定されない。
【0016】
本実施形態では、通信装置1は、通信プロトコルとしてTCP/IPを使用する例を説明する。TCP/IPのプロトコル処理では、通信装置1は、送信データのパケット化および再送処理のために、ネットワークバッファ(送信バッファ)を用いる。通信装置1は、TCP/IPパケットの送信処理において、ソケットAPI send()によって指定された送信データ(ユーザデータ)を送信バッファに転送し、最大伝送単位MTUでチャンク化する。MTUは、Maximum Transmission Unitの略である。そして、通信装置1は、チャンク化されたデータと擬似ヘッダのチェックサムを計算し、TCPヘッダとIPヘッダが追加されたTCP/IPパケットを生成する。伝送経路がイーサネット(登録商標)の場合、通信装置1は、これらヘッダに加えて、イーサネットヘッダが付加されたイーサネットフレームを生成し、ネットワーク2を介して通信相手装置3に送信する。
【0017】
また、パケット通信において、通信の信頼性を保証するため、送信側から送信されたパケットを受信した受信側がACK(Acknowledgement)と呼ばれる確認応答を用いる通信方式が利用されている。例えば、TCP/IPでは、送信側は、送信データをセグメントにチャンク化してパケット化して送信し、受信側は、セグメントをオクテット単位にシーケンス番号で管理し、受け取ったセグメントのシーケンス番号をACKとして応答する。
【0018】
このとき、TCP/IPのプロトコル処理では、送信側のパケット送信の度に受信側がACKを送信することによる通信速度の低下を回避するために、所定のウィンドウサイズを利用するウィンドウ制御が行われる。TCP/IPのウィンドウ制御では、受信側は、受信バッファの残りサイズをウィンドウサイズに設定したACKを送信し、送信側は、ウィンドウサイズになるまでACKを待つことなく送信データを送信することができる。さらに、TCP/IPのウィンドウ制御では、通信速度をより向上させるために、スライディングウィンドウが用いられる。スライディングウィンドウでは、受信側は、パケットを受信する度にACKを送信し、送信側は、最初のACKを受信するとウィンドウをスライドさせて、ACKを待つことなくウィンドウサイズ分のデータを連続的に送信することが可能となる。
【0019】
通信装置1は、RAM(Random Access Memory)101、CPU102、ROM(Read Only Memory)103、記録媒体105および通信部113を備える。また、通信装置1は、バッファ管理部106、データ転送部107、フレーム生成部108、パケット生成部109、チェックサム計算部110、タイマ管理部104、バッファ解放通知部111および通知設定部112を備える。
【0020】
RAM101は、各種データを保存したり、ワークメモリ(ワークエリア)として使用される。RAM101は、送受信データを格納して管理するためのメモリ領域101aを有する。メモリ領域101aには、送信データを含むパケットを格納するパケット格納用バッファ101bが割り当てられる。
CPU102は、RAM101をワークメモリとして、ROM103または記録媒体105に格納された各種プログラムを実行することにより、通信装置1の各機能を動作させる。CPU102は、シングルコアプロセッサであってもよいし、マルチコアプロセッサであってもよい。
ROM103は、CPU102により実行される各種プログラム等を記憶する。
記録媒体105は、ハードディスクまたはSSD(Solid State Drive)などのプログラム格納部である。
【0021】
通信部113は、MAC(Media Access Control)モジュール113aとPHY(Physical Layer)モジュール113bを備え、イーサネット(商標登録)などのネットワーク2を介して通信相手装置3との通信を行う。通信装置1のデータの送受信では、CPU102によりネットワークドライバが実行され、この実行に応じてMACモジュール113aが制御される。なお、本実施形態では、通信部113は、イーサネット(登録商標)を介して通信を行う場合を例にとるが、Wi-Fiなどの無線LAN(Local Area Network)などのIP通信可能な媒体を介して通信を行うことも可能である。
【0022】
バッファ管理部106は、ヘッダまたはパケットを格納するバッファと関連付けた管理情報の取得を行う。
データ転送部107は、RAM101に記憶されているデータを、DMA(Direct Memory Access)にてフレーム生成部108およびパケット生成部109に転送する。データ転送部107は、例えば、DMAを行うDMAコントローラである。なお、データ転送部107は、必ずしもDMA転送でデータを転送する必要はなく、データを転送する際にCPU102により制御されてもよい。
【0023】
フレーム生成部108は、送信する送信データのサイズを決定し、決定したサイズの送信データと、送信データに対するヘッダ情報を生成するためのヘッダ情報生成処理を行う。
パケット生成部109は、フレーム生成部108により決定されたサイズの送信データと、ヘッダ情報に基づいて、送信データのセグメント化およびヘッダの生成を行い、当該セグメントとヘッダからパケットを生成する。
チェックサム計算部110は、RAM101に記憶されているデータに対してチェックサムを計算する。
【0024】
バッファ解放通知部111は、通信部113によるパケットの送信が完了した後、パケットの格納に用いられたパケット格納用バッファ101bの解放を通知する。例えば、ネットワークドライバの制御によって通信部113がネットワーク2へパケットの送信を完了した後、ネットワークドライバが、そのパケットの格納に用いられたパケット格納用バッファ101bを解放したものとする。このとき、バッファ解放通知部111は、ネットワークドライバによるパケット格納用バッファ101bの解放をCPU102に通知する。
【0025】
タイマ管理部104は、パケット送信に関して必要な所定時間を管理する。
通知設定部112は、バッッファ解放通知部120にパケット格納用バッファ101bの解放を通知させるか否かを設定する。通知設定部112は、送信アプリケーションで通知の有効と無効を切り替えることができる。例えば、ソケットAPIが正常に返り値を返している場合には、通知設定部112は、通知を無効に設定し、バッファ解放を通知しない。一方、ソケットAPIが全ての送信データを送信できていないかまたは送信エラーが発生している場合には、通知設定部112は、通知を有効に設定し、バッファ解放を通知する。また、ソケットAPIが全ての送信データが送信できる状態に復帰した場合には、通知設定部112は、通知を無効に設定し、バッファ解放を通知しない。
通知設定部112は、プロトコルに基づいて通知の有効と無効を切り替えるようにしてもよい。例えば、TCP/IPのプロトコル処理において、再送のためのパケットを送信バッファに格納できた場合には、送信バッファからパケットを再送できるため通知を無効に設定し、バッファ解放を通知しない。
なお、以下に説明するパケットは、IP通信上で送受信されるデータの単位である。パケットの組み立て方法については、任意の方法を用いることができ、説明を省略する。
【0026】
図2は、実施形態1に係る通信装置の機能的な構成例を示すブロック図である。
図2において、通信装置1は、アプリケーション21、プロトコルスタック22、パケット生成部23、通信I/F制御部24、通信I/F25および通知部26を備える。プロトコルスタック22は、ネットワークバッファ管理部221、セグメント処理部225、通信プロトコル処理部226、コネクション管理部222、ウィンドウ制御部223および輻輳制御部224を備える。パケット生成部23は、パケット生成完了通知部231、データ転送部232、ヘッダ生成部233およびパケット生成部234を備える。通知部26は、バッファ解放通知部261および通知設定部262を備える。
【0027】
アプリケーション21は、ユーザアプリケーションである。アプリケーション21により、任意のサイズの送信対象のアプリケーションデータが送信データとしてプロトコルスタック22に入力される。
【0028】
プロトコルスタック22は、アプリケーション21から入力された送信データ(RAM101のメモリ領域101aに割り当てられている送信バッファ(不図示))を、ネットワークバッファ管理部221により管理する。ネットワークバッファ管理部221は、
図1のバッファ管理部106に対応している。ネットワークバッファ管理部221は、RAM101のメモリ領域101aに割り当てられるバッファにヘッダまたはパケットを格納する。また、ネットワークバッファ管理部221は、メモリ領域101aに格納されている送信データのサイズを管理する。
【0029】
コネクション管理部222は、通信装置1の通信コネクションを管理する。例えば、コネクション管理部222は、アプリケーション21に対する通信コネクションにおけるMSS等のコネクション情報を管理する。
ウィンドウ制御部223は、通信I/F制御部24を介して受信した確認応答から、TCPコネクションの送信ウィンドウサイズを取得し、管理する。
【0030】
輻輳制御部224は、TCPコネクションにおける輻輳制御を管理する。例えば、輻輳制御部224は、アプリケーション21に対する通信コネクションにおける輻輳ウィンドウ(輻輳ウィンドウサイズ)を管理する。
セグメント処理部225は、ネットワークバッファ管理部221により管理される。セグメント処理部225は、送信データのサイズ、MSS、送信ウィンドウサイズ、輻輳ウィンドウサイズ等に基づいて、送信データのサイズを決定する。このとき、送信データのサイズは、送信バッファに格納され、MSSは、コネクション管理部222で管理され、送信ウィンドウサイズは、ウィンドウ制御部223で管理され、輻輳ウィンドウサイズは、輻輳制御部224で管理される。
通信プロトコル処理部226は、TCPセグメントのTCPヘッダ、UDPヘッダおよびIPヘッダの生成と、それに伴うチェックサム計算等の処理を行い、パケットを生成する。
【0031】
パケット生成部23は、オフロード処理部(ハードウェア)である。オフロード処理部として、パケット処理に特化したパケット生成オフローダを用いることができる。パケット生成オフローダは、TSO機能を用いることで、MSSよりも大きいデータ単位で送信要求されたアプリケーションデータをMSS単位でチャンク化し、ネットワークへの連続送信を可能とする。パケット生成完了通知部231は、データ転送部232とヘッダ生成部233とパケット生成部234によるパケット化処理の完了通知を、割り込みで行うかポーリングで行うかの選択をする。
データ転送部232は、
図1のデータ転送部107に対応し、データのチャンク機能、チェックサム計算機能および転送機能を持つ。チャンク機能は、送信データをデータ転送する際、所定の単位(例えばMSS単位)にチャンク化する。チェックサム計算機能は、
図1のチェックサム計算部110に対応する。チェックサム計算機能は、所定の単位にチャンク化した各データに対するチェックサム計算を行う。
【0032】
ヘッダ生成部233は、所定のヘッダ情報に基づいて、ネットワークバッファ管理部221が管理している送信バッファを用いて、TCP/IPヘッダ、UDP/IPヘッダおよびイーサネットヘッダを生成する。
パケット生成部234は、データ転送部232とヘッダ生成部233から出力されたデータを用いて、パケット化処理を行う。
【0033】
本実施形態では、セグメント処理部225により決定された送信データのサイズに応じて、通信プロトコル処理部226またはパケット生成部23が、ネットワークバッファ管理部221が管理する送信バッファを用いてパケットを生成する。パケットの生成手法については、
図3を用いて後述する。
【0034】
通信プロトコル処理部226またはパケット生成部23により生成されたパケットは、通信I/F制御部24に入力される。通信I/F制御部24は、プロトコルスタック22と通信I/F25との間でデータおよび情報のやり取りを行う。通信I/F25は、
図1のMACモジュール113aおよびPHYモジュール113bに対応し、ネットワーク2を介した通信を行う。パケットの送信は、タイマ管理部104により一定時間以上経過したことが通知された場合に行われてもよい。
【0035】
バッファ解放通知部261は、パケットが格納されているバッファをネットワークバッファ管理部221が解放する際に、そのバッファの解放をアプリケーション21に通知する。このとき、バッファ解放通知部261は、通信I/F制御部24によって通信I/F25からネットワーク2へパケットが送信された後に、パケットが格納されているバッファの解放をアプリケーション21に通知する。バッファ解放通知部261は、
図1のバッファ解放通知部111に対応する。
【0036】
通知設定部262は、バッファ解放通知部261による通知を無効か有効かに設定する。通知設定部262の処理をコールバック関数で実現し、アプリケーション21により通知が有効に登録された場合にバッファ解放を通知し、通知が有効に登録されてない場合にバッファ解放を通知しないようにしてもよい。通知設定部262は、
図1の通知設定部112に対応する。
【0037】
次に、
図3および
図4を参照し、
図1の通信装置1により行われるデータ送信処理を説明する。
図3では、ソケットAPI send()によるデータ送信処理を例にとる。なお、sendto()、sendmsg()、sendmmsg()によるデータ送信処理の場合も、
図3と同様の処理を用いることができる。
図4では、ソケットAPI send()によるデータ送信処理が完了後、パケット格納用バッファの解放通知処理を説明する。
本実施形態では、ウィンドウサイズを使用するプロトコルのデータ送信処理において、ネットワーク2へパケットの送信完了後、アプリケーション21へパケット格納用バッファ101bの解放通知を行う。
【0038】
なお、
図3および
図4の各ステップは、通信装置1の記憶部に記憶されたプログラムをCPU102読み出し、実行することで実現される。また、
図3および
図4に示すフローチャートの少なくとも一部をハードウェアにより実現してもよい。ハードウェアにより実現する場合、例えば、所定のコンパイラを用いることで、各ステップを実現するためのプログラムからFPGA上に自動的に専用回路を生成すればよい。また、FPGAと同様にしてGate Array回路を形成し、ハードウェアとして実現するようにしてもよい。また、ASICにより実現するようにしてもよい。
【0039】
この場合、
図3および
図4に示すフローチャートにおける各ブロックは、ハードウェアブロックとみなすことができる。なお、複数のブロックをまとめて1つのハードウェアブロックとして構成してもよく、1つのブロックを複数のハードウェアブロックとして構成してもよい。
【0040】
図3のS1において、
図1のCPU102は、ソケットAPIの呼び出しを行う。より詳しくは、CPU102は、ROM103に格納されている所定のプログラムを実行することに応じて、
図2のアプリケーション21は、send()を呼び出す。
CPU102は、send()を呼び出すと、S2において、send()に指定された値が正しいかどうかを判定する。S2の判定結果がNoの場合、S3に処理を進める。S2の判定結果がYesの場合、S4に処理を進める。
【0041】
S3において、CPU102は、指定された値によりエラー番号へEALREADYまたはENOTCONNまたはEFAULTを設定し、-1を返り値にして、処理を終了する。
S4において、データ転送部107は、不図示のユーザバッファからのデータ転送先であるRAM101内の送信バッファへ送信データを転送し、送信データのチャンク化と、送信バッファへの送信データの格納のため、送信データ用バッファを取得する。データ転送部107は、ゼロコピーが指定された場合は、送信データ管理バッファを指定し、ゼロコピーが指定されない場合は、送信データ用バッファを指定し、S5に処理を進める。
【0042】
S5において、データ転送部107は、指定したバッファが1つでも確保できたかどうかを判定する。S5の判定結果がNoの場合、S6に処理を進める。S5の判定結果がYesの場合、S7に処理を進める。
S6において、データ転送部107は、指定したバッファが1つも確保できていない場合、エラー番号へENOMEMを設定し、-1を返り値にし、S19に処理を進める。
【0043】
S7において、データ転送部107は、不図示のユーザバッファからのデータ転送先であるRAM101内の送信バッファへ送信データを転送し、チャンク化を行い、送信バッファに格納する。なお、データ転送部107は、送信データの格納場所を送信バッファへ格納してもよい。ゼロコピーでsend()が呼び出された場合は、データ転送部107は、ユーザバッファの格納場所の情報を送信バッファへ転送する。
セグメント処理部225は、送信バッファに格納されている送信データのサイズが、ウィンドウ制御部223により管理されている送信ウィンドウサイズを超えるか確認する。セグメント処理部225は、超えている場合は送信バッファに格納されている送信データのサイズを、送信データのサイズとして決定し、超えていない場合は送信ウィンドウサイズを送信データのサイズとして決定し、S8に処理を進める。
【0044】
S8において、フレーム生成部108は、TCP/IPヘッダとイーサネットヘッダを生成するための情報としてヘッダ情報を生成し、S9に処理を進める。
S9において、パケット生成部109は、パケットを格納するため、パケット格納用バッファを1つでも確保できたかどうかを判定する。S9の判定結果がNoの場合、S10に処理を進める。S9の判定結果がYesの場合、S11に処理を進める。
S10において、パケット生成部109は、指定したバッファが1つも確保できていない場合は、エラー番号へENOMEMを設定し、-1を返り値にして、S19に処理を進める。
【0045】
S11において、パケット生成にパケット生成オフローダを使用する場合、プロトコルスタック22は、パケット生成部23にパケット生成のデータを設定し実行を行う。このとき、S11において、データ転送部232は、送信データがチャンク化されていない場合にはチャンク化とチェックサム計算を行い、チャンク化されている場合にはチェックサム計算を行う。次に、S11において、ヘッダ生成部233は、S8で生成されたヘッダ情報を使用し、送信データがMSS単位にチャンク化されて得られる各セグメントに対してTCP/IPヘッダとイーサネットヘッダを(自動)生成する。send()が呼び出された際に送信データがRAM101内の送信バッファに転送された場合には、パケット生成によりイーサネットフレーム化される。次に、S11において、パケット生成部234は、データ転送部232とヘッダ生成部233から出力されたデータを用いて、パケット化処理を行う。
【0046】
S12において、パケット生成完了通知部231は、S11で実行されたパケット生成オフローダの処理が完了したかどうかを判定する。S12の判定結果がNoの場合、S12に処理を繰り返し、処理が終了するのを待つ。S12の判定結果がYesの場合、S13に処理を進める。
【0047】
S13において、CPU101は、パケット生成によりイーサネットフレーム化されたパケットをネットワークドライバが送信可能かどうかを判定する。S13の判定結果がNoの場合、S14に処理を進める。S13の判定結果がYesの場合、S17に処理を進める。
S14において、CPU101は、ネットワークドライバが送信可能になるまで、送信キューにパケットの追加が可能かどうかを判定する。S14の判定結果がNoの場合、S15に処理を進める。S14の判定結果がYesの場合、S16に処理を進める。
【0048】
S15において、CPU101は、送信キューにパケットの追加が不可の場合はエラー番号へENOSPCまたはENOBUFSを設定し、-1を返り値にして、S19に処理を進める。
S16において、CPU101は、送信キューにパケットの追加が可能の場合は送信キューにパケットを追加し、S19に処理を進める。
S17において、通信プロトコル処理部226は、ネットワークドライバによりイーサネットフレームを通信I/F制御部24に送信し、S18に処理を進める。
【0049】
S18において、CPU101は、送信すべき全てのパケットについてパケット生成処理が完了しているか否かを判定する。送信すべき全てのパケットのパケット生成処理が全て完了していない場合は(S18:Yes)、S13に戻る。送信すべき全てのパケットのパケット生成処理が全て完了した場合は(S18:No)、S19に処理を進める。
【0050】
S19において、CPU101は、送信すべき全てのパケット(S16の送信キューにキューイングされたパケット)が送信されたか、かつ送信エラー(S6、S10およびS15の送信エラーが該当)が発生していないかどうかを判定する。送信すべき全てのパケットが送信され、かつ送信エラーが発生していない場合は(S19:Yes)、S20に処理を進める。送信すべき全てのパケットが送信されていないまたは送信エラーが発生している場合は(S19:No)、S21に処理を進める。
S20において、アプリケーション21は、送信データがあるか判定する。送信データがある場合は(S20:Yes)、
図3のデータ送信処理の開始へ戻る。送信データがない場合は(S20:No)、データ送信処理を終了する。
【0051】
S21において、通知設定部262は、バッファ解放の通知を有効(ON)に設定するか否かを判定する。通知を有効にしない設定は、アプリケーション21により、バッファ解放通知部261に対して、バッファ解放の通知を設定するコールバック関数が未登録とされることで実現する。通知を有効にしない設定は、アプリケーション21により、コールバック関数で通知を無効にする処理で実現してもよい。通知を有効にしない設定では(S21:No)、データ送信処理の開始へ戻る。通知を有効にする設定では(S21:Yes)、S22に処理を進める。
S22において、バッファ解放通知部261は、パケットを格納しているバッファ解放の通知待ちを行う。
【0052】
ネットワークドライバがイーサネットフレームを通信I/F制御部24に送信した後、通信部113は、
図4の送信完了割り込み処理を開始する。
図4において、S231では、ネットワークドライバは、パケットを格納していたバッファを全て解放し、S232に処理を進める。
【0053】
S232において、パケットを格納していたバッファが全て解放されると、バッファ解放通知部261は、バッファ解放通知機能がONの場合、アプリケーション21へバッファ解放を通知し、S233に処理を進める。なお、バッファ解放通知部261は、バッファ解放通知機能がOFFのときは、アプリケーション21へバッファ解放を通知しない。
S233において、プロトコルスタック22は、送信キューにキューイングされたパケットがあるか否かを判定する。送信キューに送信するパケットが存在する場合は(S233:Yes)、S234に処理を進める。送信キューに送信するパケットが存在しない場合は(S233:No)、S235に処理を進める。
【0054】
S234において、通信I/F制御部24は、バッファ解放通知機能がONの場合、
図3のS24の送信完了通知待ちに対して通信プロトコル処理部226へ送信完了を通知し、S235に処理を進める。
S235において、バッファ解放通知部261は、バッファ解放通知機能がONの場合、
図3のS22のバッファ解放通知待ちに対してアプリケーション21へバッファ解放を通知し、送信完了割り込み処理を終了する。
【0055】
図3のS24の送信完了通知待ちでは、
図4のS234からの送信完了の通知を受けると、通信プロトコル処理部226は、送信処理を開始し、S13に処理を進める。
図3のS22のバッファ解放通知待ちでは、
図4のS235からのバッファ解放の通知を受けると、アプリケーション21は、処理を開始し、S23に処理を進める。
S23において、通知設定部262は、バッファ解放の通知を無効(OFF)に設定し、データ送信処理の開始へ戻る。
【0056】
以上説明したように、本実施形態によれば、送信データのセグメント化とTCP/IPヘッダの生成とイーサネットフレーム化を実施するパケット生成処理を行い、ネットワークドライバがイーサネットフレームを通信I/F制御部24に送信する。このとき、バッファ解放通知部は、アプリケーションへバッファ解放を通知することで、プロトコルスタックおよびネットワークドライバが送信可能な状態になり次第、アプリケーションが送信データの送信の要求を再開できる。このため、アプリケーションは、ソケットAPIにて送信されたデータが全て送信できない現象または送信エラーが発生した場合においても、ソケットAPIを定期的にコールし、送信可能かどうかを確認する必要がなくなる。この結果、アプリケーションは、送信可能かどうかの確認の時間間隔が経過する前に、送信データの送信処理を開始でき、通信装置1のパケットの送信効率を向上させることができる。
また、上述した実施形態によれば、バッファ解放の完了通知を状況に応じて有効または無効を設定し、有効の場合にアプリケーションがバッファ解放の完了通知を受けることができる。このため、パケットの正常に送信されている場合には、バッファ解放の完了通知をやり取りするためにかかる負荷を軽減することができ、送信処理の効率を改善することができる。
なお、パケット生成部23のハードウェアによる処理をソフトウェアで実行した場合においても、本実施形態を適用することができる。
【0057】
なお、本実施形態では、通信I/F25が1つの場合を例にとったが、通信I/Fが複数ある場合にも本実施形態を適用することができる。
また、上述した実施形態では、通知部26のバッファ解放通知部261と通知設定部262の通知処理はコールバック関数を使用したが、オペレーティングシステム(OS)のシステムコール等の他の方法を使用することも可能である。
【0058】
<実施形態2>
以下、
図1、
図2、
図4および
図5を用いて、実施形態2の通信装置による通信処理を説明する。なお、実施形態2において、実施形態1と同様の構成および機能については、同一符号を付して、その詳細な説明は省略し、異なる点についてのみ説明する。実施形態1との相違は、実施形態2では、通信プロトコルとしてUDP(User Datagram Protocol)を使用する。このとき、
図2の通信プロトコル処理部226は、UDP/IPヘッダおよびUDP/IPパケットを生成する。
【0059】
UDPは、TCP/IPと異なり、ハンドシェイクを省いたコネクションレスのプロトコルである。UDPのデータ転送は、送受信されるデータの順序性の保証がなく、送信先からの確認応答がないため信頼性を保証されない。
しかし、UDPは、通信の処理にかかるコストが少ないため、データが途中で抜け落ちても問題が少ないストリーミングおよび通信処理のオーバーヘッドの軽減が求められるリアルタイムシステム通信で使われることがある。このとき、
図2の通知設定部262は、パケットを送信する通信インタフェースの種類により、バッファ解放の通知を無効か有効かに設定することができる。
【0060】
図5は、実施形態2に係る通信装置のデータ送信処理を示すフローチャートである。
図5の処理では、ソケットAPIによる複数データのデータ送信処理を想定している。複数データのデータ送信処理は、例えば、sendmmmsg()によるデータ送信である。
図5の処理では、複数の送信データを一度にソケットAPIで指定するデータ送信処理において、データ送信処理が完了後、パケット格納用バッファの解放通知処理を行う場合を例にとる。
【0061】
図5の処理では、
図3の処理のS21およびS23の代わりにS51およびS53を実行し、それ以外の処理は、
図3の処理と同様である。
S51において、
図2の通知設定部262は、通信インタフェースが有線LANの場合、通知を有効に設定するか否かを判定する。通知を有効にしない設定は、アプリケーション21により、バッファ解放通知部261に対して、バッファ解放の通知を設定するコールバック関数が未登録とされることで実現する。通知を有効にしない設定は、コールバック関数で送信に使用する通信インタフェースが有線LANではない場合に通知を無効にする処理で実現してもよい。通知を有効にしない設定では(S51:No)、データ送信処理の開始へ戻る。通知を有効にする設定では(S51:Yes)、S22に処理を進める。
S53において、通知設定部262は、通信インタフェースが有線LANの場合、通知を無効に設定し、データ送信処理の開始へ戻る。
【0062】
以上説明したように、本実施形態によれば、送信データのセグメント化とUDP/IPヘッダ生成とイーサネットフレーム化を実施するパケット生成処理を行い、ネットワークドライバがイーサネットフレームを通信I/F制御部24に送信する。このとき、バッファ解放通知部は、アプリケーションへバッファ解放を通知することで、プロトコルスタックおよびネットワークドライバが送信可能な状態になり次第、アプリケーションが送信データの送信の要求を再開できる。このため、通信プロトコルとしてUDPを使用した場合においても、通信装置1のパケットの送信効率を向上させることができる。
また、本実施形態によれば、バッファ解放の完了通知を状況に応じて有効または無効を設定し、有効の場合にアプリケーションが完了通知を受けることで、送信処理の効率を改善することができる。
なお、パケット生成部23のハードウェアによる処理をソフトウェアで実行した場合においても、本実施形態を適用することができる。
【0063】
なお、本実施形態では、通信I/F25が1つの場合を例にとったが、通信I/Fが複数ある場合にも本実施形態を適用することができる。
また、上述した実施形態では、通知部26のバッファ解放通知部261と通知設定部262の通知処理はコールバック関数を使用したが、オペレーティングシステムのシステムコール等の他の方法を使用することも可能である。
【0064】
また、上述した実施形態では、S51およびS53の処理において、通信インタフェースが有線LANの場合を例にとったが、通信インタフェースが無線LANの場合であってもよい。
また、通信インタフェースが有線LANまたは無線LANに限らず、それ以外の通信インタフェースの種類に基づいて、バッファの解放を通知させるか否かを設定するようにしてもよい。さらに、TCPおよびUDPなどのプロトコルの種類に基づいて、バッファの解放を通知させるか否かを設定するようにしてもよい。
また、上述した実施形態では、S51の判定条件において、「通信インタフェースが有線LAN」の場合を例にとった。これ以外にも、「任意のプロトコル」、「任意のポート番号」、「任意のコネクション」、「任意の宛先IPアドレス」または「任意の送信元IPアドレス」の場合であってもよい。
【0065】
<その他の実施形態>
【0066】
本発明は、上述の実施形態の1以上の機能を実現するプログラムを、ネットワークまたは記憶媒体を介してシステムまたは装置に供給してもよい。そして、上述の実施形態の1以上の機能は、そのシステムまたは装置のコンピュータにおける1つ以上のプロセッサがプログラムを読出し実行する処理でも実現可能である。
【符号の説明】
【0067】
1:通信装置、3:通信相手装、102:CPU、107:データ転送部、108:フレーム生成部、23、109、234:パケット生成部、113a:MACモジュール置、22:プロトコルスタック、231:パケット生成完了通知部、232:データ転送部、260:通知部、261:バッファ解放通知部、262:通知設定部