【发布时间】:2014-12-03 10:39:32
【问题描述】:
LWIP:SSI 输出长度可能导致 TCP/IP 校验和错误
我正在使用在 ARM LPC4357 上运行的 LWIP 1.4.1(LPCOpen 2.1.12,日期 5/15/2014)。 我正在使用 httpserver_raw 并添加了一些 SSI 处理程序。
我发现系统对包含标签的行的大小和 SSI 处理程序输出的字节数都很敏感。 标签包含在输出中。 展开标签时:
\r\n
spacespace<!--#s_add-->\r\n
(标签前两个空格,论坛格式!) 当标签扩展为 1、3、5、7 等字符时,浏览器无法接收输出和 Wireshark 报告校验和错误。 当标签扩展为 2、4、6、8 等字符时,浏览器收到输出和 Wireshark 报告 OK。
如果我从标签之前删除一个空格,那么情况就会逆转。 此外,如果标签大于 129 个字符(怀疑为 122),则输出始终正常(尚未发现故障)。
当 SSI 输出 >=129 字节时,将调用长度为 122(标题和标签)、122(SSI 的初始部分)和 7(SSI 的剩余部分)的 http_write() 函数。 拥有 122 的第二个 tcp_write() 似乎可以解决校验和问题。 (将 SSI 输出分割成段本身就是一件奇怪的事情。以最多 122 个块的形式发送似乎是由资源文件的大小驱动到标签的)。
我已经使用 UART printf() 和 Wireshark 检查了 SSI 输出,一切似乎都是正确的,输出中没有损坏。 http_write() 长度与输出一样正确。
我已经跟踪到 tcp_write(),此时我开始怀疑自己; tcp_write() 肯定不能被破坏吗? 有没有人在嵌入式目标上使用过 LWIP SSI 或确实使用过 tcp_write()?
【问题讨论】: