LWIP: SSI 出力の長さが原因で TCP/IP チェックサム エラーが発生する場合がある
ARM LPC4357 (LPCOpen 2.1.12、2014 年 5 月 15 日) で実行されている LWIP 1.4.1 を使用しています。私は httpserver_raw を使用しており、いくつかの SSI ハンドラーを追加しました。
システムは、タグを含む行のサイズと SSI ハンドラが出力するバイト数の両方に敏感であることがわかりました。タグは出力に含まれます。タグを展開する場合:
\r\n
spacespace<!--#s_add-->\r\n
(2 つのスペースがタグの前にあり、フォーラムの書式設定です!) タグが 1、3、5、7 などの文字で展開されると、ブラウザは出力を受信できず、Wireshark はチェックサム エラーを報告します。タグが 2、4、6、8 などの文字で展開されると、ブラウザーは出力を受け取り、Wireshark は OK を報告します。
タグの前からスペースを削除すると、状況が逆転します。さらに、タグが 129 文字を超える場合 (122 の可能性あり)、出力は常に問題ありません (まだ障害は確認されていません)。
SSI 出力が >=129 バイトの場合、http_write() 関数は長さ 122 (ヘッダーとタグ)、122 (SSI の最初の部分)、および 7 (SSI の残りの部分) で呼び出されます。2 番目の tcp_write() を 122 にすると、チェックサムの問題が解決するようです。(SSI 出力をセグメントに分割すること自体が奇妙です。最大 122 のチャンクでの送信は、タグまでのリソース ファイルのサイズによって駆動されるようです)。
UART printf() と Wireshark を使用して SSI 出力を検査しましたが、すべて正しいように見え、出力に破損はありません。http_write() の長さは、出力と同様に正しいです。
私は tcp_write() まで追跡しましたが、その時点で自分自身を疑い始めました。確かに tcp_write() を壊すことはできませんか? 組み込みターゲットまたは実際に tcp_write() で LWIP SSI を使用した人はいますか?