(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
>
>