(toppers-users 2684) Re: Tinet でバスエラーが発生 (解決)
高橋祥士
staka @ scx.co.jp
2007年 10月 11日 (木) 15:20:06 JST
苫小牧高専 情報工学科
阿部 様
--------------------
システムクリエイト高橋です。
> 現在 TINET リリース 1.4 の準備をしています。
お疲れ様です。
>>SH7616 のイーサネットコントローラは送受信バッファの先頭は16Byteアライメントで
>>ないといけないがドライバはそうなっていない。そのため、大量のデータを短時間に
>>
この問題はその後調べてみたところ、確か先頭のアライメントの問題ではなく、
パケットの終わりが問題で、バッファオーバフローのためバスエラーが発生していたと記憶しています。
パケット長に関わらず、バッファは16Byte単位で更新されるのではなかったかと...
ちょっと時間が経ってしまっているので記憶が不確かですが、マニュアルにその記述があったと思います。
ご確認をお願いいたします。
----- Original Message -----
From: "ABE Tsukasa" <abe @ jo.tomakomai-ct.ac.jp>
To: <users @ toppers.jp>
Sent: Wednesday, October 10, 2007 6:59 PM
Subject: (toppers-users 2683) Re: Tinet でバスエラーが発生 (解決)
> システムクリエイト 高橋様
>
> 苫小牧高専、情報工学科の阿部です。
> ずいぶん時間が経ってしまいました。申し訳ありません。
> 現在 TINET リリース 1.4 の準備をしています。
>
> さて、
>
>>【現象】
>>SH7616 のイーサネットコントローラは送受信バッファの先頭は16Byteアライメントで
>>ないといけないがドライバはそうなっていない。そのため、大量のデータを短時間に
>>
>>送受信すると固定長メモリ管理が破綻しバスエラーが発生する。
>>また、TINETも現状では対応できない状態である。
>
> の件です。
> 時間が経っているため、認識不足があればお許しください。
>
>>【対策】
>>TINETが管理するバッファとは別にコントローラが送受信する16Byteアライメントの
>>
>>バッファを用意するのが本筋だと考えられるが、そうすると TINET の『速度を犠牲に
>>してもメモリを節約する』という趣旨に反するため、TINETが用意するバッファを16Byte
>>アライメント調節にできるように若干増やし、送信時はTINETで生成した送信データを
>>コントローラが使用する位置へコピー、受信時はコントローラが受信したデータをTINET
>>が扱う位置へコピーすることで解決することとする。
>>なお、この際 IPヘッダのアドレスが 4Byteアライメントになるように注意する。
>>
>>実際の変更内容は下記の通り。
>>
>>1.TINET
>> 1)新たに送受信バッファアライメントを指定する
>> IF_ETHER_NIC_BUF_16BYTE_ALIGNMENT
>> という定義を設ける。この定義を tinet_nic_defs.h に下記のように追加する。
>>
>>
>> #define IF_ETHER_NIC_BUF_16BYTE_ALIGNMENT /* 送受信バッファは16Byteアライメント */
>>
>> 2)TINET は送受信バッファのアライメントに関して考慮していない。
>> 送受信バッファは T_NET_BUF_IF_PDU などで下記のように定義されている。
>> typedef struct t_net_buf_if_pdu {
>> UB idix; /* mpfid のインデックス */
>> UB unit; /* インタフェース番号 */
>> UH len; /* データの長さ */
>> #if CPU_NET_ALIGN == 4 && IF_HDR_ALIGN != 4
>> UB align[4 - IF_HDR_ALIGN]; <--- ★これを増やす。
>> #endif
>> UB buf[IF_PDU_SIZE]; /* バッファ本体 */ <--- ★TINETが取り扱う送受信データ
>>
>> } T_NET_BUF_IF_PDU;
>
> この部分については、
>
> #if CPU_NET_ALIGN == 4 && IF_HDR_ALIGN != 4
> UB align[IF_HDR_ALIGN];
> #endif
>
> と変更すると、
>
>> アライメントについては IF_HDR_ALIGN を指定することで IPアドレスを4Byte
>> アライメント調節にできるようになっているが、送受信バッファについては考慮
>> されていない。そこで、align を少し多めに取り、16Byteアライメントでかつ必要
>>
>> な大きさのバッファを確保できるようにする。
>>
>> 実際には、若干トリッキーだが 下記のようにして align の大きさを 14 とする。
>>
>> 14という値は、16Byteアライメントの領域が確保でき、かつIPヘッダのIPアドレス
>>
>> が4Byteアライメントなるようにした値である。
>>
>> #if 0 /* 147行目 変更前 */
>> #define IF_HDR_ALIGN 2 /* ヘッダのアライン単位 */
>> #else /* 変更後 */
>> #ifdef IF_ETHER_NIC_BUF_16BYTE_ALIGNMENT
>> #define IF_HDR_ALIGN (-10)
>> #else
>> #define IF_HDR_ALIGN 2 /* ヘッダのアライン単位 */
>> #endif
>> #endif
>
> この部分については、トリッキーなことをせずに、
>
> #ifdef IF_ETHER_NIC_BUF_16BYTE_ALIGNMENT
> #define IF_HDR_ALIGN 14
> #else
> #define IF_HDR_ALIGN 2 /* ヘッダのアライン単位 */
> #endif
>
> と出来ると思います。
> なお、上記の部分は、tinet/net/ethernet.h と考えています。
>
> 対応が遅れ、大変申し訳ありませんが、
> 確認をお願いいたします。
>
> --
> .\" 苫小牧工業高等専門学校 情報工学科 教授 阿部 司
> .\" E-mail: abe @ jo.tomakomai-ct.ac.jp TEL/FAX: 0144-67-8937
>
>