Cente TCP/IPv4

Cente TCP/IPv4

・SFTPdに対応
SSHファイル転送プロトコルに対応しました。

・FTPdで、LISTコマンドが正常動作しない場合があったのを修正した
FTPdで、ファイルの日付が不正な時(ファイルシステムが壊れている場合)、LISTコマンドが正常動作しない場合があったのを修正した。

・その他改善
環境によってはwarningが発生するコードがあったので修正した。

Cente TCP/IPv4

・Cente SSHdを同梱
Cente SSHdを同梱した(使用にはCente Compact Crypto Plus(別パッケージ)が必要)。

・DNScのsource port randomization実装
DNScのクエリ送信時、ソースポート番号を乱数化した。

・リトルエンディアンCPU環境ではIGMPv3でマルチキャストグループに参加できない場合がある
(Cente障害情報: 001-0070)

リトルエンディアンCPU環境で、IGMPv3でマルチキャストグループに参加できない場合があった。これを修正した。

・その他改善
環境によってはwarningが発生するコードがあったので修正した。

Cente TCP/IPv4

・TCP Initial Sequence Number (ISN) RFC6528準拠
TCP Initial Sequence NumberをRFC6528準拠とした。

・ボードサポートパッケージの追加
ボードサポートパッケージにSTマイクロエレクトロニクス社 STM32756G-EVALを追加した。

・不正なDNS応答によって誤動作する可能性がある(Cente障害情報: 001-0068)
ホスト名をDNS解決する際、不正なDNS応答で、誤ったIPアドレスを返したり不正メモリアクセスする可能性があった。これを修正した。

・NULL終端のないリクエストでTFTPdが不正メモリアクセスする可能性がある(Cente障害情報: 001-0069)
ファイル名あるいはモード指定文字列にNUL終端のないTFTPリクエストで、TFTPdが不正メモリアクセスする可能性があった。これを修正した。

Cente TCP/IPv4

・Gratuitous ARP対応

リンクアップや任意のタイミングでGratuitous ARPを送信する機能を追加した。

・ボードサポートパッケージの変更

ボードサポートパッケージを以下の3機種とした。
‐ コンピューテックス社 CKB-RZ/A1H
‐ ルネサスエレクトロニクス社 RSK+RX65N
‐ ルネサスエレクトロニクス社 RSK+RX71M

・ctbind()がエラーを返した後、条件を変えずに再度実行すると正常終了する(Cente障害情報:001-0055)

ポート番号の重複でctbind()がエラーを返した後、そのまま再度ctbind()を実行すると正常終了していた。これを修正した。

・IPアドレス割り当て完了までの時間が長いことがある(Cente障害情報:001-0056)

使用するDHCPdによっては、受信するOfferを無視してしまいIPアドレス割り当て完了までの時間が長く見えることがあった。これを修正した。

・FTPdで、カレントディレクトリのパス文字列が長い場合、1つ上のディレクトリに移動できないことがある(Cente障害情報:001-0057)

パス文字列長が最大値のときに、相対パス”..”を正しく処理できずディレクトリ移動できない場合があった。これを修正した。

・FTPdで、制御ポート受信タイムアウト時間が定義と異なる場合がある(Cente障害情報:001-0058)

NLST, LIST, STOR, RETRコマンドで、データポートで通信した場合に、制御ポートの受信タイムアウトが正しくない場合があった。これを修正した。

・TCP切断API実行後、一定時間内にデータ受信があった場合に意図しないメモリ書き込みが発生する(Cente障害情報:001-0059)

TCP切断APIを実行した直後に通信相手からデータを受信すると、それまで受信バッファとして指定されていたメモリ領域にデータを書き込んでいた。これを修正した。

・まれに送信元が「0.0.0.0」のIPパケットを送信する(Cente障害情報:001-0060)

「自IPアドレス確定」、「送信IPパケットの構築」、「IPパケットの送信処理」のタイミングによって、「自IPアドレスが未確定なので送信パケットは送信せず破棄する」という処理が動作しないケースがあった。これを修正した。

・DHCPで割り当てられたIPアドレスが不適切でもそれを使用してしまう(Cente障害情報:001-0061)

DHCPサーバから割り当てられたIPアドレスが不適切(マルチキャストアドレスやブロードキャストアドレスなど)でも、そのまま使用していた。これを修正した。

・リンクダウン状態でTCP接続APIを実行し、その後リンクアップしても接続できない(Cente障害情報:001-0062)

リンクダウン状態でTCP接続APIを呼び出し、その後リンクアップすると、TCPSYNを再送するが、このときの送信元IPアドレスが0.0.0.0となってしまい、接続が完了しない症状となっていた。これを修正した。

・DNS解決に失敗することがある(Cente障害情報:001-0063)

ホスト名をDNS解決する際、DNSサーバからIPアドレスではなくCNAMEを受信した場合、CNAMEが圧縮されているケースで正しく処理できない場合があった。これを修正した。また、受信DNSパケットの長さチェックを強化した。

・不正なICMPリダイレクトパケットで、ルータ(デフォルトゲートウェイ)の設定が不正となることがある(Cente障害情報:001-0064)

ICMPリダイレクトパケット受信時のパケット長のチェックが不足しており、不正なパケットでも、破棄せずに処理していた。これを修正した。

・通信品質が悪い環境で繰り返しtcp_con_cep()を呼び出すと、tcp_con_cep()から戻らないことがある(Cente障害情報:001-0065)

通信品質が悪い環境などで繰り返しTCP発信を行うと、RSTの受信とSYNの再送がほぼ同時に発生すると、まれにtcp_con_cep()から返らないことがあった。これを修正した。

・TFTPdのエラーを不適切なLAN I/Fへ送信することがある(Cente障害情報:001-0066)

TFTPdは存在しないファイルを要求した場合などにTFTPcにエラーを返すが、マルチIP環境で複数のI/FでTFTPdを使用している場合にエラーをデフォルトI/Fに送信していた。これを修正した。

・TFTPcでアスキーモードが使用できない(Cente障害情報:001-0067)

PUT、GETのAPIでアスキーモードを指定してもバイナリモードで動作していた。これを修正した。

Cente TCP/IPv4

・FTPcのFTPS対応
FTPcをFTPS対応にした。Implicitモード、Explicitモードが使用可能。
・DHCPのOfferを受信できないことがある(Cente障害情報:001-0045)
同一LAN上の複数のDHCPクライアントが同じタイミングでDHCPのリクエストを送信する環境で、一部のCenteミドルウエア搭載機器でDHCPによるIPアドレス取得が失敗することがあった。これを修正した。
・不正な内容のTCPパケット受信によってメモリ破壊が発生する(Cente障害情報:001-0046)
ある特定のパターンを持った不正なTCPパケットを受信した場合、機器のハングアップが発生するなどして一切通信できない状態となる可能性があった。これを修正した。
・FTPdで、パッシブモードへの変更に失敗することがある(Cente障害情報:001-0048)
FTPdが送信する応答メッセージ文字列にスペルミスがあり、使用するFTPcによってはそのメッセージを受け入れることができず、パッシブモードへの変更に失敗することがあった。これを修正した。
・TCPのSelectiveAck(SACK)機能有効時に、通信が停止してしまう(Cente障害情報:001-0049)
SACK機能使用時に、通信相手からの再送を無視するなどにより通信が停止してしまうことがあった。これを修正した。
・TCPで、切断直前に受信したデータを受信APIで取り出せない(Cente障害情報:001-0050)
通信相手がデータを送信後直ちに切断する場合、TCP受信APIがエラーを返し、切断直前に受信したデータを受信APIで取り出せないことがあった。これを修正した。
・FTPcで、高負荷環境だとファイル送信に失敗することがある(Cente障害情報:001-0051)
長時間(数秒間)プロトコルスタックに処理が回らない環境において、ファイルのPUTがエラーすることがあった。これを修正した。
・TCPの送信APIと切断APIを続けて呼んだ場合、切断APIがE_TMOUTエラーを返す事がある(Cente障害情報:001-0052)
TCP送信APIとTCP切断APIを続けて呼んだ場合、データを含むパケットとFINパケットが連続して送信されるが、それらに対するACKが経路上で欠落した場合に正しくFINを再送できていなかった。これを修正した。
・tcp_del_rep()実行中にTCP着信すると、tcp_del_rep()から返らなくなる(Cente障害情報:001-0053)
TCP着信待ち状態のときにtcp_del_rep()を呼ぶとTCP着信待ちがキャンセルされるが、tcp_del_rep()の処理を実行中に相手先からTCP着信を受けるとtcp_del_rep()から返らなくなることがあった。これを修正した。
・FTPdで、短時間に着信・切断を繰り返すと、それ以降着信できなくなることがある(Cente障害情報:001-0054)
FTPdで、FTPcから短時間(500ms未満)に繰り返し着信・切断を繰り返すと、FTPd内部で無限ループが発生し、以後着信できない状態になることがあった。これを修正した。
・受信パケット長のチェックを強化
不正な長さのパケットを受信したとき、不正と判断できた時点で直ちに破棄するようにした。
・その他改善
環境によってはワーニングが発生するコードがあったので修正した。

Cente TCP/IPv4

・I/F IDを取得する機能を追加
tcp_get_opt()、udp_get_opt()にて、TCP/UDPの通信端点に設定されているI/F IDを取得する機能を追加した。
・FTPdで、データポート接続に失敗すると以後該当ファイルへのアクセスができなくなる
FTPdから発信するデータポートのTCP接続がなんらかの理由で失敗した場合、以後アクセスしようとしていたファイルの上書き・削除ができない状態になっていた。これを修正した。(Cente障害情報:001-0038)
・FTPcでsystemコマンドの実行結果に不要な文字列が付加されてしまう
FTPcで、システムの種別を取得するsystemコマンドを実行した際、ユーザバッファに格納される実行結果(文字列)の後ろに不要な文字列が付加されていた。これを修正した。(Cente障害情報:001-0039)
・Cente Shellでftpcコマンドが終了しなくなる場合がある
シェルでftpcコマンドを実行中にFTPdとの経路が絶たれるなど通信できなくなった場合、ftpcコマンドがいつまでも終了しない状態になっていた。これを修正した。(Cente障害情報:001-0040)
・TCPの着信待ちと着信待ち解除を繰り返すと、それ以降新たなTCP接続ができなくなることがある現象について
相手先からのTCP着信のタイミングと、TCP着信待ちAPIのタイムアウトまたは着信待ち解除のタイミングが一致したとき、通信端点が不正な状態になることがあった。これによって、以後新たなTCP接続ができなくなる状態が発生していた。これを修正した。(Cente障害情報:001-0041)
・DHCPモードにした状態で短時間にリンクアップ/リンクダウンを繰り返すと、IP通信できない状態になる
リンクアップとリンクダウンを短時間に繰り返すと、DHCPの停止を実行している最中に別タスクによるDHCPの開始処理が割り込まれるケースがあった。この部分の排他制御が不足しており、割り込まれたDHCP停止処理が終了しない状態になっていた。これを修正した。(Cente障害情報:001-0042)
・TCPのSelective Ack(SACK)機能を使用しているときに、正しく再送パケットを扱えずに通信できなくなる
SACK機能使用時に、再送が必要な範囲を示すSACKブロック処理部に不具合があり、正しくSACKパケットを送信できない状態だった。これを修正した。(Cente障害情報:001-0043)
・複数のI/Fで同一の自IPアドレスを使用した環境で、FTPd/cのデータポート接続に失敗する
マルチIP環境下において、FTPd/cではデータポートで使用するI/Fを自IPアドレスによって選択していた。そのため、複数のI/Fで同一IPアドレスを自IPアドレスとした場合、本来のI/Fとは異なるI/Fが選択されて、接続に失敗していた。これを修正した。(Cente障害情報:001-0044)
・複数I/Fのうち、あるI/Fをリンクダウンさせると他のI/FもIP通信できなくなる
パッケージのBSPに含まれるEthernetドライバで、送信デスクリプタフル状態になったときにリンクダウンさせると他のI/FのIP通信もできない状態になっていた。これを修正した。(Cente障害情報:099-0002)
・OSのサービスコールを直接呼び出している
del_dtqなどOSのサービスコールを直接呼び出している部分が残っていたので、全てctkernel経由に変更した。
・その他改善
コード上の軽微な改善を行った。

Cente TCP/IPv4

不具合修正

・IGMPパケット受信時に0除算が発生することがある

IGMPルータから、応答を送信するまでの最大待ち時間として0を指定された場合に0除算が発生していた。これを修正した。(Cente障害情報:001-0031)
 
・UDPのチェックサムを正しく評価できないことがある
受信UDPパケットのチェックを行う際、まれにチェックサム不正を検出できない場合があったので修正した。(Cente障害情報:001-0032)
 
・TCP着信を受けられなくなることがある
FTPdなど、TCPの着信を受けるアプリケーションで運用している場合、まれにTCP着信を受け付けなくなる状態に陥ってしまう場合があったので修正した。(Cente障害情報:001-0033)
 
・UDP受信をctrecv()で実行中にctshutdown()でキャンセルできない
ctrecv()、ctrecvfrom()でUDPの受信待ちをしている状態で、ctshutdown()を呼んでもctrecv()、ctrecvfrom()の待ち解除ができなかったので修正した。(Cente障害情報:001-0034)
 
・ARPキャッシュの保持時間が定義より10%長い
ARPキャッシュを保持する時間が、定義されている時間より10%長い状態だった(デフォルトでは5分なので、5分半ほど保持される状態)。これを修正した。(Cente障害情報:001-0035)
 
・長さが不正なオプションのTCPパケットを受信すると無限ループが発生する
長さが0のオプションを含んだTCPパケットを受信すると、無限ループが発生していたため、修正した。(Cente障害情報:001-0036)
 
・ctselect()で、受信データがないのに受信イベントありと判断される
ctselect()を使用して、受信可能ソケットデスクリプタreadfd、送信可能ソケットデスクリプタwritefdの両方を指定した場合、受信データがないにもかかわらず受信イベントが発生したように見えていた。これを修正した。(Cente障害情報:001-0037)

Cente TCP/IPv4

DHCPでIP取得に時間がかかることがある
プロトコルスタックのタスク優先度より高いタスクがelap_start()、elap_stop()を呼ぶ環境の場合、DHCPサーバが存在しない環境に接続し、その後DHCPサーバが存在する環境に接続しなおしたとき、IP取得に時間がかかっていた。これを修正した。
 

ARP Requestの送信元IPアドレスが0.0.0.0になる
ARPキープアライブ機能が送信するARP Requestの送信元IPアドレスが0.0.0.0になる場合があったので修正した。
 

マルチキャストPINGに対する応答が不正
マルチキャスト宛に対するPINGを受けたとき、その応答の送信元アドレスがマルチキャストアドレスになっていたので修正した。
 

長さが不正なTCPパケットを受信すると不正なメモリアクセスが発生する
IPヘッダの長さフィールドの値が実際の長さより短い値となっていたとき、TCPデータ長を正しく認識できず不正なメモリアクセスが発生していた。これを修正した。
 

TCPACKを大量に送信することがある
TCP受信バッファの空きが少ないとき、TCP受信APIで短いデータを繰り返し読み出すと、そのたびにTCPACKが送信されることがあったので修正した。
 

tcp_(v)cre_rep()がエラーすることがある
TCP切断後、tcp_del_cep()、tcp_del_rep()で端点を削除し、すぐにtcp_(v)cre_rep()で着信端点を作成するとE_OBJエラーが返ることがあったので修正した。
 

TCPデータをすべて送信しないうちに切断してしまうことがある
一度TCPFINが付加されたパケットを送信した後、その前のパケットの再送が発生した場合、その再送パケットにTCPFINが付加されていた。これによって、通信相手はデータがそこまでであると判断して全て受信しないうちに切断してしまう。これを修正した。
 

DNScで名前解決に失敗することがあるのを修正
ホスト名の先頭文字が数字の場合に名前解決に失敗していたのを修正しました。
 

FTPdにSIZEコマンドを追加
FTPdにファイルサイズを取得するコマンドであるSIZEコマンドを追加しました。
 

FTPdをワイルドカードに対応
FTPdをワイルドカードに対応させました。これにより、ファイル一覧でワイルドカードが使用可能となります。
 

FTPdでのファイル一覧表示内容の修正
FTPdでファイル一覧を表示する時に、表示されない項目があるのを修正しました。
 

FTPdでデータポート接続完了待ちのタイミングを修正
FTPdでデータポート接続完了待ちのタイミングを修正しました。これにより、クライアントによってはデータポート接続に時折失敗する現象が修正されました。
 

FTPdでデータポートクローズのエラーを検出するように修正
FTPdでデータポートクローズ時のエラーを検出していなかったため、データポートクローズ失敗を検出できず、エラーにもかかわらず正常終了応答を 返していました。データポートクローズのエラーを検出するように修正し、エラー時にはエラー応答をクライアントに返すように修正しました。
 

FTPcの冗長な接続処理を修正
FTPcでTCP接続に失敗した場合リトライをしていましたが、本来はTCPレイヤーでリトライをするべきなので、FTPcでは接続のリトライをしないように修正しました。
 

TFTPdで重複したリクエストパケットを受け取ったときの処理を修正
TFTPdでクライアントからのリクエストパケットが重複した場合、エラーを返していました。重複パケットの場合はエラーを返さず、データ通信が中断されないように修正しました。

Cente TCP/IPv4

TCP Selective ACKオプション対応

RFC2018のTCP Selective ACK(SACK)オプションに対応した。

TCP Window Scaleオプション対応

RFC1323のTCP Window Scaleオプションに対応した。

TCP Large Initial Window対応

RFC2414のLarge Initial Window機能に対応した。

IGMP受信フィルタが宛先IPアドレスに対してかかってしまう

本来IGMP受信フィルタは受信したパケットの送信元IPアドレスに対してかかるものだが、宛先マルチキャストアドレスに対してかかっていた。これを修正した。

ctselect()がいつまでも送信可能を返さない

ctselect(_)、ctsend()を繰り返し呼んだ場合、送信バッファが一杯になった時点でctselect()で待ち状態になるが、その後送信が進んで再び送信バッファに空きができてもctselect()から返らなかった。これを修正した。

ctaccept()で着信と切断を繰り返すと着信できなくなる

システムが持つセマフォの最大数が少なく、新しいTCPセッション作成のためのセマフォ確保に失敗した場合、セッション情報をクリアしておらず、新たな着信ができない状態になっていた。セッション情報をクリアし、新たな着信が行なえるよう修正した。

TCPキープアライブパケットに応答を返さない

TCPキープアライブにはダミーデータがあるものとないものがあるが、後者に対応できていなかった。これを修正した。

TCP通信中、別タスクでtcp_cls_cep()を呼ぶと、その後着信できなくなる

tcp_acp_cep()、tcp_rcv_dat()を呼んでいるタスクより優先度が低いタスクでtcp_cls_cep()を呼ぶと、 tcp_cls_cep()の処理の途中で次のtcp_acp_cep()が実行されてしまい、着信待ち状態にもかかわらずセッションがクローズ状態となり着信できなくなっていた。これを修正した。

ctselect()が指定された時間でタイムアウトしない

ctselect()で指定されたソケット以外のソケットでイベントが発生したときもタイマを再起動させてしまっていたので、他ソケットでイベントが起き続ける限りctselect()が指定された時間でタイムアウトしない、という状態になっていた。これを修正した。

送信実行中にEthernetケーブルを抜くと無限ループが発生する

連続送信中にEthernetケーブルを抜くと、Ethernetドライバのwai_snd()がエラーを返すことがあるが、その際、そのまま繰り返しwai_snd()を呼び続けて無限ループが発生していた。送信をエラー終了させるよう修正した。

udp_set_opt()でI/F IDを変更してもそのI/Fで受信できない

udp_cre_cep()で通信端点を作成した後、udp_set_opt()でI/F IDを変更しても、変更先のI/Fからパケットを受信すると破棄していた。これを修正した。

マルチIP環境で、不正なパケットを受信すると、その後受信できなくなる

複数のEthernet I/Fを使用している際、一方からLLC/SNAPヘッダの内容が不正だった場合、以後他方の受信ができなくなることがあった。これを修正した。

複数のタスクから同時にソケットを確保するとポート番号が不正になる

自ポート番号を取得する関数が排他制御されておらず、複数のタスクから同時にソケットを確保するなどした場合、正しく動作しない可能性があった。これを修正した。

マルチIP環境でDHCPcを使うと、後からリンクアップしたI/FでDHCP取得できない

複数のI/Fで同時にDHCPによるIPアドレス割り当てを実行すると、後からリンクアップを検出したI/FでDHCPが動作しない状態になっていた。これを修正した

ipapr_to_ascii()の返り値が0

本関数の返り値はIPアドレスの文字列長を返す仕様だが、誤って常に0を返していた。これを修正した。

telnetcで通信異常時に通信端点が解放されない事がある

telnetcで、通信異常時にtcp_del_cep()が呼ばれず、通信端点が解放されない事があるのを修正。

FTPcで通信に使用する自ポート番号が不正

FTPcで、変数の初期化不足のため、自ポート番号が不正な値になる点を修正。

Cente TCP/IPv4

自ポート番号の自動割当ルール変更

TCPまたはUDPにて通信端点の作成と解放を繰り返すと、自ポート番号が続けて同じ番号になってしまうことがあった。これを修正した。

tcp_acp_cep()後のtcp_con_cep()でリソースが減る

tcp_acp_cep()が失敗またはキャンセルした後、同じ通信端点でtcp_con_cep()を呼ぶとセッション情報を保持するリソースが解放されなかった。これを修正した。

省コピーAPI(tcp_rcv_buf)で受信するとスループットが低くなることがある

受信バッファが一旦一杯になり、その後tcp_rel_buf()を呼んで空きが出来たとき、ウインドウ更新のACKを送信していなかった。そのため、極端に受信スループットが落ちることがあった。これを修正した。

TCPゼロウインドウACK受信後の送信が最適でない

TCPゼロウインドウACKを受信するとPERSIST状態に移行し、定期的に次のデータを送信するが、ウインドウ更新ACKを受信したとき、定期的に送信しているデータの次のデータから送信していた。まだACKを受信していないパケットから送信を再開するよう変更した。

FTPdで、連続して複数のファイルを送受信すると失敗することがある

それぞれのTCP通信でポート番号20番を繰り返し使うことになるが、直前のTCPセッションがまだ残っていて通信端点を作成できず失敗していた。相手先ポート番号が違うなら自ポート番号が同じでも通信端点を作成できるよう修正した。

IGMPグループ以外のマルチキャストアドレスは受信しないように変更

IGMPでグループ登録した場合も、それ以外のマルチキャストアドレスのパケットを受信していた。グループ登録したもの以外は受信しないように修正した。

パケットバッファ枯渇でTCPパケット送信が無限ループに陥ることがある

送信パケットバッファが枯渇するような運用の環境でTCP送信を行うと無限ループに陥ることがあった。これを修正した。

UDPヘッダの長さフィールドが不正なパケットを受信すると誤動作する

UDPヘッダの長さフィールドが不正なパケットを受信したとき、正しく処理できないことがあった。これを修正した。

環境によってはctbsdapi.cがコンパイルエラーとなる

環境によってはBSDAPIのためのソースctbsdapi.cにてコンパイルエラーとなることがあった。これを修正した。

DHCPリレーエージェント経由でDHCPアドレス割り当てが行えない

Windows2003 ServerのDHCPリレーエージェントを使用すると、Cente TCP/IPv4のDHCP Discoverが破棄されていた。DHCPパケットの「システム起動からの時間」を正しく設定するようにして回避した。

送信中にリンクダウンさせると、その後リンクアップできなくなる

高トラフィックで送信実行中にLANケーブルを抜くなどリンクダウンさせると、その後リンクアップしても通信できなくなることがあった。これを修正した。

OSリソース生成失敗が検出できない

初期化関数を呼んだとき、OSリソース生成が失敗しても正常終了していた。エラーを返すよう変更した。

FTPdバグ修正

・データポートセッションの開始に失敗したときにエラーを検出できなかったのを修正

・ ファイルクローズのタイミングを修正

FTPcバグ修正

・ログイン中にセッションが切断された場合関数から戻らなくなる不具合を修正

・FTPサーバーからPWDに対し不正な応答が返った場合アドレスエラーが生じる可能性があるのを修正

TFTPバグ修正

最後のファイルブロックの転送の際にエラーが生じてもそれを検出できなかった不具合を修正

Page 1 of 2