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 <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_appmemutils.h>
#include <networking/enet/utils/include/enet_appmemutils_cfg.h>
@ -37,15 +38,16 @@ void free_rtos::rxIsrHandler(void *appData)
return;
}
status = EnetDma_retrieveRxPktQ(rx_flow->dma_handle_, &rxReadyQ);
EnetAppUtils_assert(status == ENET_SOK);
//status = EnetDma_retrieveRxPktQ(rx_flow->dma_handle_, &rxReadyQ);
//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);
if(readyQCount == 0) {
return;
}
// Reload DMA with a new rx free queue as fast as possible
rx_flow->submitFreeRxPkts(readyQCount);

View File

@ -43,11 +43,11 @@ public:
return queue::Queue<IEcatDatagram>{*this, next};
}
virtual uint8_t* pack(uint8_t *raw) = 0;
virtual uint8_t* unpack(uint8_t *raw) = 0;
virtual uint8_t* pack(uint8_t *raw, uint8_t idx) = 0;
virtual uint8_t* unpack(uint8_t *raw, uint8_t idx) = 0;
virtual uint8_t* pack_all(uint8_t *raw) = 0;
virtual uint8_t* unpack_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, uint8_t idx) = 0;
TEcatDgHeader& get_header() {
return header_;
@ -127,27 +127,27 @@ public:
~EcatDatagram() { }
virtual uint8_t* pack(uint8_t *raw) override {
virtual uint8_t* pack(uint8_t *raw, uint8_t idx) override {
if(as_expected() == true) {
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) {
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;
do {
raw = next->pack(raw);
raw = next->pack(raw, idx);
next = static_cast<IEcatDatagram*>(next->get_next());
} while(next != nullptr);
@ -155,11 +155,15 @@ public:
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;
do {
raw = next->unpack(raw);
raw = next->unpack(raw, idx);
if(raw == nullptr) {
break;
}
next = static_cast<IEcatDatagram*>(next->get_next());
} while(next != nullptr);
@ -187,14 +191,14 @@ private:
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 *wkc_raw = pack_data(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;
TEcatDgHeader *header_ = new(raw) TEcatDgHeader{
command_.get_cmd(),
0x00,
idx,
command_.get_address(),
{.bits = {
.len = len,
@ -223,9 +227,13 @@ private:
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);
if(header->idx != idx) {
return nullptr;
}
header_ = *header;
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) {
// 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");
@ -67,12 +71,10 @@ uint8_t* EcatTelegram::pack(uint8_t *raw) {
(void)p_eth_hdr;
(void)p_hdr;
if(first == nullptr) {
return p_datagram_last;
if(first != nullptr) {
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;
return p_datagram_last;
@ -85,12 +87,10 @@ uint8_t* EcatTelegram::unpack(uint8_t *raw) {
uint8_t *p_datagram_last = p_datagram_first;
auto first = datagram_queue_.get_first();
if(first == nullptr) {
return p_datagram_last;
if(first != nullptr) {
p_datagram_last = first->unpack_all(p_datagram_first, idx_);
}
p_datagram_last = first->unpack_all(p_datagram_first);
return p_datagram_last;
}
@ -166,6 +166,7 @@ bool EcatTelegram::transfer() {
}
datagram_queue_.clear();
++idx_;
return status;
}

View File

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