Перейти к содержанию
    

Zynq - ошибка при передаче пакета Ethernet

Есть массив в который я пишу данные для передачи, добавляю в его начало TCP, IP заголовки, Ethernet фреймы. Затем ссылку на этот массив указываю в дескрипторе и включаю данный дескриптор на передачу. И пакет нормально уходит в сеть. Но изредка (с периодом от 1 секунды до 3-х минут) в сеть уходит пакет, содержащий первые 68 байт предыдущего пакета, а остальную часть пакета текущую. А так как в этих первых 68 байтах содержатся все заголовки TCP, IP, то TCP сессия нарушается. Не понимаю почему так происходит. Специально проверяю содержимое массива перед командой запуска на передачу. Все данные в массиве правильные! И почему все время портятся именно первые и именно 68 байт?

Может кто сталкивался? Может у кого есть безошибочный код приема/передачи по ethernet для zynq?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавлю функцию, которой отправляю данные

TxFrame - тот самый массив char на 1500 байт. К слову - пакетов длиной более 300 байт у меня не бывает

FramesTx - увеличивается на 1 в момент прерывания по завершению отправки пакета

FrameSize - размер данных в массиве TxFrame

EmacPsInstancePtr - указатель на MAC контроллер

 

Сообщения об ошибках не воозникают, но тем не менее первые 68 байт в TxFrame почему-то остаются от предыдущего пакета и уходят в сеть.

 

EthernetFrame TxFrame;        /* Transmit buffer */
volatile int FramesTx;        /* Frames have been sent */

int Ethernet_FrameSend(XEmacPs *EmacPsInstancePtr, u16 FrameSize)
{
    int Status;
    XEmacPs_Bd *Bd1Ptr;

    Xil_DCacheFlushRange((u32)&TxFrame, FrameSize);        

    Status = XEmacPs_BdRingAlloc(&(XEmacPs_GetTxRing(EmacPsInstancePtr)),1, &Bd1Ptr);    
                if (Status != XST_SUCCESS) {
        EmacPsUtilErrorTrap("Error allocating TxBD");
        return XST_FAILURE;}

    XEmacPs_BdSetAddressTx(Bd1Ptr, &TxFrame);    
    XEmacPs_BdSetLength(Bd1Ptr, FrameSize);             
        XEmacPs_BdClearTxUsed(Bd1Ptr);                     
        XEmacPs_BdSetLast(Bd1Ptr);                    

    Status = XEmacPs_BdRingToHw(&(XEmacPs_GetTxRing(EmacPsInstancePtr)),1, Bd1Ptr);                
                if (Status != XST_SUCCESS) {
        EmacPsUtilErrorTrap("Error committing TxBD to HW");
        return XST_FAILURE;}

    FramesTx = 0;        

    XEmacPs_Transmit(EmacPsInstancePtr);

    while (FramesTx == 0);                    

    if (XEmacPs_BdRingFromHwTx(&(XEmacPs_GetTxRing(EmacPsInstancePtr)),1, &Bd1Ptr) == 0)
           {
        EmacPsUtilErrorTrap ("TxBDs were not ready for post processing");
        return XST_FAILURE;}


    Status = XEmacPs_BdRingFree(&(XEmacPs_GetTxRing(EmacPsInstancePtr)), 1, Bd1Ptr);            
                if (Status != XST_SUCCESS) {
        EmacPsUtilErrorTrap("Error freeing up TxBDs");
        return XST_FAILURE;}

    return XST_SUCCESS;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема решилась путём запрета прерывания при приеме ethernet пакета во время формирования пакета для передачи. Не представляю как прерывание при приеме пакета, которое просто увеличивает счетчик событий, может влиять на содержимое передающего буфера, тем более на его первые 68 байт. Но факт на лицо. Всем спасибо за помощь и участие.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...