buffer = rxFrame->rxBuffArray[i].buffer; // corrupted
bufferLength = rxFrame->rxBuffArray[i].length; // corrupted
len += bufferLength;
/* Find pbuf wrapper for the actually read byte buffer */
idx = ((rx_buffer_t *)(((uint8_t *)buffer) - ETH_PAD_SIZE)) - ethernetif->RxDataBuff;
LWIP_ASSERT("Buffer returned by ENET_GetRxFrame() doesn't match any RX buffer descriptor",
((idx >= 0) && (idx < ENET_RXBUFF_NUM)));- idx = 1953659110- bufferLenght = 65535 (または -1)
/* Get the valid frame */
index = 0;
do
{
rxDesc = &rxBdRing->rxBdBase[rxBdRing->rxGenIdx];
/* Calculate the buffer and frame length. */
if ((rxDesc->rdes3 & ENET_RXDESCRIP_WR_LD_MASK) != 0U)
{
isLastBuff = true;
rxFrame->totLen = (uint16_t)(rxDesc->rdes3 & ENET_RXDESCRIP_WR_PACKETLEN_MASK);
if (rxFrame->totLen - offset > (uint16_t)rxBdRing->rxBuffSizeAlign)
{
buff1Len = (uint16_t)rxBdRing->rxBuffSizeAlign;
if (handle->doubleBuffEnable)
{
buff2Len = rxFrame->totLen - offset - (uint16_t)rxBdRing->rxBuffSizeAlign - ENET_FCS_LEN;
}
}
else
{
buff1Len = rxFrame->totLen - offset - ENET_FCS_LEN;
}
rxFrame->totLen -= ENET_FCS_LEN;
}
else
{
if (!handle->doubleBuffEnable)
{
buff1Len = (uint16_t)rxBdRing->rxBuffSizeAlign;
offset += buff1Len;
}
else
{
buff1Len = (uint16_t)rxBdRing->rxBuffSizeAlign;
buff2Len = (uint16_t)rxBdRing->rxBuffSizeAlign;
offset += buff1Len + buff2Len;
}
}
// <-- Check data here (assert on invalid buff1Len)
/* Allocate new buffer to replace the buffer taken by application */
if (!isDrop)
{
/* Get the frame data information into Rx frame structure. */
/* Give new buffer from application to BD */
}
else
{
/* Drop frame if there's no new buffer memory */
}
} while (!isLastBuff);- buff1Len = 65534 (または -2)- rxDesc->rdes3 & ENET_RXDESCRIP_WR_LD_MASK = 1522- rxFrame->totLen = 1518-オフセット = 1520
こんにちは@lucas3
「 enet/ ドライバでコンパイルできませんでした。iMX プラットフォームでのみ利用可能な定義がいくつか不足しているからです。このドライバを LPC546 で使用できる可能性はありますか? 」
ドライバ/ネット/(i.MXシリーズユニバーサルドライバー)に直接切り替えることはできません
このドライバは LPC ではなく i.MX 用に設計されており、すぐには使用できません。
あなたの説明に基づきます。
フリーズは、別の VLAN から送信される VLAN タグ付きフレーム (回線上で約 1522 バイト) によってのみトリガーされます。現在の lpc_enet RX パスは 1518 バイトのフレームを想定しています。
1522 バイトのフレームが到着すると、RX の長さ/オフセットの計算がアンダーフローし (例: buff1Len = -2)、RX フレーム構造が破損し、LWIP_ASSERT がトリップします。
SO i think you CAN try to change the ENET_RXBUFF_SIZE to 1522.
BR
ハリー