fix(UML-1780): Добавлена проверка индексов пакетов
This commit is contained in:
parent
66ae172d07
commit
83a4c71af0
@ -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);
|
||||
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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};
|
||||
|
||||
Loading…
Reference in New Issue
Block a user