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 "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);
|
||||||
|
|
||||||
|
|||||||
@ -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));
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user