fix(UML-1780): Добавлена проверка индексов пакетов

This commit is contained in:
algin 2023-09-27 15:37:10 +03:00
parent 66ae172d07
commit 83a4c71af0
4 changed files with 42 additions and 30 deletions

View File

@ -7,6 +7,7 @@
#include "free_rtos/ethernet/eth_rx_flow.hpp" #include "free_rtos/ethernet/eth_rx_flow.hpp"
#include <networking/enet/core/include/core/enet_soc.h> #include <networking/enet/core/include/core/enet_soc.h>
#include <networking/enet/core/src/dma/udma/enet_udma_priv.h> // Yes, it is forbidden !
#include <networking/enet/utils/include/enet_board.h> #include <networking/enet/utils/include/enet_board.h>
#include <networking/enet/utils/include/enet_appmemutils.h> #include <networking/enet/utils/include/enet_appmemutils.h>
#include <networking/enet/utils/include/enet_appmemutils_cfg.h> #include <networking/enet/utils/include/enet_appmemutils_cfg.h>
@ -37,15 +38,16 @@ void free_rtos::rxIsrHandler(void *appData)
return; return;
} }
status = EnetDma_retrieveRxPktQ(rx_flow->dma_handle_, &rxReadyQ); //status = EnetDma_retrieveRxPktQ(rx_flow->dma_handle_, &rxReadyQ);
EnetAppUtils_assert(status == ENET_SOK); //EnetAppUtils_assert(status == ENET_SOK);
// Shortcut. Requires access to private header enet_udma_priv.h
EnetQueue_initQ(&rxReadyQ);
EnetQueue_append(&rxReadyQ, &rx_flow->dma_handle_->cqIsrQ);
EnetQueue_initQ(&rx_flow->dma_handle_->cqIsrQ);
readyQCount = EnetQueue_getQCount(&rxReadyQ); readyQCount = EnetQueue_getQCount(&rxReadyQ);
if(readyQCount == 0) {
return;
}
// Reload DMA with a new rx free queue as fast as possible // Reload DMA with a new rx free queue as fast as possible
rx_flow->submitFreeRxPkts(readyQCount); rx_flow->submitFreeRxPkts(readyQCount);

View File

@ -43,11 +43,11 @@ public:
return queue::Queue<IEcatDatagram>{*this, next}; return queue::Queue<IEcatDatagram>{*this, next};
} }
virtual uint8_t* pack(uint8_t *raw) = 0; virtual uint8_t* pack(uint8_t *raw, uint8_t idx) = 0;
virtual uint8_t* unpack(uint8_t *raw) = 0; virtual uint8_t* unpack(uint8_t *raw, uint8_t idx) = 0;
virtual uint8_t* pack_all(uint8_t *raw) = 0; virtual uint8_t* pack_all(uint8_t *raw, uint8_t idx) = 0;
virtual uint8_t* unpack_all(uint8_t *raw) = 0; virtual uint8_t* unpack_all(uint8_t *raw, uint8_t idx) = 0;
TEcatDgHeader& get_header() { TEcatDgHeader& get_header() {
return header_; return header_;
@ -127,27 +127,27 @@ public:
~EcatDatagram() { } ~EcatDatagram() { }
virtual uint8_t* pack(uint8_t *raw) override { virtual uint8_t* pack(uint8_t *raw, uint8_t idx) override {
if(as_expected() == true) { if(as_expected() == true) {
return raw; return raw;
} }
return pack_header(raw); return pack_header(raw, idx);
} }
virtual uint8_t* unpack(uint8_t *raw) override { virtual uint8_t* unpack(uint8_t *raw, uint8_t idx) override {
if(as_expected() == true) { if(as_expected() == true) {
return raw; return raw;
} }
return unpack_header(raw); return unpack_header(raw, idx);
} }
virtual uint8_t* pack_all(uint8_t *raw) override { virtual uint8_t* pack_all(uint8_t *raw, uint8_t idx) override {
IEcatDatagram* next = this; IEcatDatagram* next = this;
do { do {
raw = next->pack(raw); raw = next->pack(raw, idx);
next = static_cast<IEcatDatagram*>(next->get_next()); next = static_cast<IEcatDatagram*>(next->get_next());
} while(next != nullptr); } while(next != nullptr);
@ -155,11 +155,15 @@ public:
return raw; return raw;
} }
virtual uint8_t* unpack_all(uint8_t *raw) override { virtual uint8_t* unpack_all(uint8_t *raw, uint8_t idx) override {
IEcatDatagram* next = this; IEcatDatagram* next = this;
do { do {
raw = next->unpack(raw); raw = next->unpack(raw, idx);
if(raw == nullptr) {
break;
}
next = static_cast<IEcatDatagram*>(next->get_next()); next = static_cast<IEcatDatagram*>(next->get_next());
} while(next != nullptr); } while(next != nullptr);
@ -187,14 +191,14 @@ private:
return functor.raw; return functor.raw;
} }
uint8_t* pack_header(uint8_t *raw) { uint8_t* pack_header(uint8_t *raw, uint8_t idx) {
uint8_t *data_raw = raw + sizeof(TEcatDgHeader); uint8_t *data_raw = raw + sizeof(TEcatDgHeader);
uint8_t *wkc_raw = pack_data(data_raw); // сначала упаковываем все данные для вычисления их размера uint8_t *wkc_raw = pack_data(data_raw); // сначала упаковываем все данные для вычисления их размера
uint16_t len = wkc_raw - data_raw; // вычисляем размер данных uint16_t len = wkc_raw - data_raw; // вычисляем размер данных
ec_moredatagrams more = (get_next() != nullptr) ? ec_moredatagrams::EC_MOREDATAGRAMS_MORE : ec_moredatagrams::EC_MOREDATAGRAMS_LAST; ec_moredatagrams more = (get_next() != nullptr) ? ec_moredatagrams::EC_MOREDATAGRAMS_MORE : ec_moredatagrams::EC_MOREDATAGRAMS_LAST;
TEcatDgHeader *header_ = new(raw) TEcatDgHeader{ TEcatDgHeader *header_ = new(raw) TEcatDgHeader{
command_.get_cmd(), command_.get_cmd(),
0x00, idx,
command_.get_address(), command_.get_address(),
{.bits = { {.bits = {
.len = len, .len = len,
@ -223,9 +227,13 @@ private:
return unpack_wkc(functor.raw); return unpack_wkc(functor.raw);
} }
uint8_t* unpack_header(uint8_t *raw) { uint8_t* unpack_header(uint8_t *raw, uint8_t idx) {
TEcatDgHeader *header = reinterpret_cast<TEcatDgHeader*>(raw); TEcatDgHeader *header = reinterpret_cast<TEcatDgHeader*>(raw);
if(header->idx != idx) {
return nullptr;
}
header_ = *header; header_ = *header;
return unpack_data(raw + sizeof(TEcatDgHeader)); return unpack_data(raw + sizeof(TEcatDgHeader));

View File

@ -29,7 +29,11 @@ const EcatDescription EcatTelegramStatus::descriptions[] = {
int32_t EcatTelegram::Process(uint8_t *p_data, uint32_t len) { int32_t EcatTelegram::Process(uint8_t *p_data, uint32_t len) {
// TODO: Don't forget to subtract sizeof(TEthFrameHeader) ! // TODO: Don't forget to subtract sizeof(TEthFrameHeader) !
unpack(p_data - sizeof(TEthFrameHeader)); uint8_t *p_datagram_last = unpack(p_data - sizeof(TEthFrameHeader));
if(p_datagram_last == nullptr) {
return 0;
}
/* /*
DebugP_log((char*)"Process started\r\n"); DebugP_log((char*)"Process started\r\n");
@ -67,12 +71,10 @@ uint8_t* EcatTelegram::pack(uint8_t *raw) {
(void)p_eth_hdr; (void)p_eth_hdr;
(void)p_hdr; (void)p_hdr;
if(first == nullptr) { if(first != nullptr) {
return p_datagram_last; p_datagram_last = first->pack_all(p_datagram_first, idx_);
} }
p_datagram_last = first->pack_all(p_datagram_first);
p_hdr->bits.length = p_datagram_last - p_datagram_first; p_hdr->bits.length = p_datagram_last - p_datagram_first;
return p_datagram_last; return p_datagram_last;
@ -85,12 +87,10 @@ uint8_t* EcatTelegram::unpack(uint8_t *raw) {
uint8_t *p_datagram_last = p_datagram_first; uint8_t *p_datagram_last = p_datagram_first;
auto first = datagram_queue_.get_first(); auto first = datagram_queue_.get_first();
if(first == nullptr) { if(first != nullptr) {
return p_datagram_last; p_datagram_last = first->unpack_all(p_datagram_first, idx_);
} }
p_datagram_last = first->unpack_all(p_datagram_first);
return p_datagram_last; return p_datagram_last;
} }
@ -166,6 +166,7 @@ bool EcatTelegram::transfer() {
} }
datagram_queue_.clear(); datagram_queue_.clear();
++idx_;
return status; return status;
} }

View File

@ -86,6 +86,7 @@ private:
TEthMacPorts port_id_; TEthMacPorts port_id_;
free_rtos::Semaphore rx_sem_; free_rtos::Semaphore rx_sem_;
uint8_t idx_{0x00};
queue::Queue<datagram::IEcatDatagram> datagram_queue_; queue::Queue<datagram::IEcatDatagram> datagram_queue_;
//datagram::IEcatDatagram *datagram_queue_{nullptr}; //datagram::IEcatDatagram *datagram_queue_{nullptr};