Skip to content

Commit 958569b

Browse files
authored
Feature/buffer head (#378)
* Framed transport header data stored in MessageBuffer Signed-off-by: Cervenka Dusan <[email protected]> * RPMSG compile issues. !!! removed one mbf file and one file renamed. Signed-off-by: Cervenka Dusan <[email protected]> * Fixed rpmsg tty Signed-off-by: Cervenka Dusan <[email protected]> * swapping rpmsg inheritance Signed-off-by: Cervenka Dusan <[email protected]> * Added missing override keyword Signed-off-by: Cervenka Dusan <[email protected]> * Use using keyword to fix warnings Signed-off-by: Cervenka Dusan <[email protected]> * Fix crcHeader for python Signed-off-by: Cervenka Dusan <[email protected]> --------- Signed-off-by: Cervenka Dusan <[email protected]>
1 parent 8616dbe commit 958569b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+873
-779
lines changed

erpc_c/infra/erpc_arbitrated_client_manager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void ArbitratedClientManager::performClientRequest(RequestContext &request)
7373
// Send the request.
7474
if (request.getCodec()->isStatusOk() == true)
7575
{
76-
err = m_arbitrator->send(request.getCodec()->getBuffer());
76+
err = m_arbitrator->send(&request.getCodec()->getBufferRef());
7777
request.getCodec()->updateStatus(err);
7878
}
7979

erpc_c/infra/erpc_basic_codec.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ using namespace erpc;
2727

2828
const uint32_t BasicCodec::kBasicCodecVersion = 1UL;
2929

30+
BasicCodec::BasicCodec(void)
31+
: Codec()
32+
{
33+
}
34+
35+
BasicCodec::~BasicCodec(void) {}
36+
3037
void BasicCodec::startWriteMessage(message_type_t type, uint32_t service, uint32_t request, uint32_t sequence)
3138
{
3239
uint32_t header =
@@ -367,6 +374,13 @@ void BasicCodec::readNullFlag(bool &isNull)
367374

368375
ERPC_MANUALLY_CONSTRUCTED_ARRAY_STATIC(BasicCodec, s_basicCodecManual, ERPC_CODEC_COUNT);
369376

377+
BasicCodecFactory::BasicCodecFactory(void)
378+
: CodecFactory()
379+
{
380+
}
381+
382+
BasicCodecFactory::~BasicCodecFactory(void) {}
383+
370384
Codec *BasicCodecFactory::create(void)
371385
{
372386
ERPC_CREATE_NEW_OBJECT(BasicCodec, s_basicCodecManual, ERPC_CODEC_COUNT)

erpc_c/infra/erpc_basic_codec.hpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,15 @@ class BasicCodec : public Codec
4343
public:
4444
static const uint32_t kBasicCodecVersion; /*!< Codec version. */
4545

46-
BasicCodec(void)
47-
: Codec()
48-
{
49-
}
46+
/*!
47+
* @brief Constructor.
48+
*/
49+
BasicCodec(void);
50+
51+
/*!
52+
* @brief CodecFactory destructor
53+
*/
54+
virtual ~BasicCodec(void);
5055

5156
//! @name Encoding
5257
//@{
@@ -344,6 +349,16 @@ class BasicCodec : public Codec
344349
class BasicCodecFactory : public CodecFactory
345350
{
346351
public:
352+
/*!
353+
* @brief Constructor.
354+
*/
355+
BasicCodecFactory(void);
356+
357+
/*!
358+
* @brief CodecFactory destructor
359+
*/
360+
virtual ~BasicCodecFactory(void);
361+
347362
/*!
348363
* @brief Return created codec.
349364
*

erpc_c/infra/erpc_client_manager.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void ClientManager::performClientRequest(RequestContext &request)
7878
// Send invocation request to server.
7979
if (request.getCodec()->isStatusOk() == true)
8080
{
81-
err = m_transport->send(request.getCodec()->getBuffer());
81+
err = m_transport->send(&request.getCodec()->getBufferRef());
8282
request.getCodec()->updateStatus(err);
8383
}
8484

@@ -88,7 +88,7 @@ void ClientManager::performClientRequest(RequestContext &request)
8888
if (request.getCodec()->isStatusOk() == true)
8989
{
9090
// Receive reply.
91-
err = m_transport->receive(request.getCodec()->getBuffer());
91+
err = m_transport->receive(&request.getCodec()->getBufferRef());
9292
request.getCodec()->updateStatus(err);
9393
}
9494

@@ -126,7 +126,7 @@ void ClientManager::performNestedClientRequest(RequestContext &request)
126126
// Send invocation request to server.
127127
if (request.getCodec()->isStatusOk() == true)
128128
{
129-
err = m_transport->send(request.getCodec()->getBuffer());
129+
err = m_transport->send(&request.getCodec()->getBufferRef());
130130
request.getCodec()->updateStatus(err);
131131
}
132132

@@ -167,7 +167,7 @@ void ClientManager::verifyReply(RequestContext &request)
167167

168168
// Some transport layers change the request's message buffer pointer (for things like zero
169169
// copy support), so inCodec must be reset to work with correct buffer.
170-
request.getCodec()->reset();
170+
request.getCodec()->reset(m_transport->reserveHeaderSize());
171171

172172
// Extract the reply header.
173173
request.getCodec()->startReadMessage(msgType, service, requestNumber, sequence);
@@ -186,13 +186,14 @@ Codec *ClientManager::createBufferAndCodec(void)
186186
{
187187
Codec *codec = m_codecFactory->create();
188188
MessageBuffer message;
189+
uint8_t reservedMessageSpace = m_transport->reserveHeaderSize();
189190

190191
if (codec != NULL)
191192
{
192-
message = m_messageFactory->create();
193+
message = m_messageFactory->create(reservedMessageSpace);
193194
if (NULL != message.get())
194195
{
195-
codec->setBuffer(message);
196+
codec->setBuffer(message, reservedMessageSpace);
196197
}
197198
else
198199
{
@@ -209,7 +210,7 @@ void ClientManager::releaseRequest(RequestContext &request)
209210
{
210211
if (request.getCodec() != NULL)
211212
{
212-
m_messageFactory->dispose(request.getCodec()->getBuffer());
213+
m_messageFactory->dispose(&request.getCodec()->getBufferRef());
213214
m_codecFactory->dispose(request.getCodec());
214215
}
215216
}

erpc_c/infra/erpc_codec.hpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,7 @@ class Codec
5959
* This function initializes object attributes.
6060
*/
6161
Codec(void)
62-
: m_buffer()
63-
, m_cursor()
62+
: m_cursor()
6463
, m_status(kErpcStatus_Success)
6564
{
6665
}
@@ -75,24 +74,31 @@ class Codec
7574
*
7675
* @return Pointer to used message buffer.
7776
*/
78-
MessageBuffer *getBuffer(void) { return &m_buffer; }
77+
MessageBuffer getBuffer(void) { return m_cursor.getBuffer(); }
78+
79+
MessageBuffer &getBufferRef(void) { return m_cursor.getBufferRef(); }
7980

8081
/*!
8182
* @brief Prototype for set message buffer used for read and write data.
8283
*
8384
* @param[in] buf Message buffer to set.
85+
* @param[in] skip How many bytes to skip from reading.
8486
*/
85-
virtual void setBuffer(MessageBuffer &buf)
87+
virtual void setBuffer(MessageBuffer &buf, uint8_t skip = 0)
8688
{
87-
m_buffer = buf;
88-
m_cursor.set(&m_buffer);
89+
m_cursor.setBuffer(buf, skip);
8990
m_status = kErpcStatus_Success;
9091
}
9192

92-
/*! @brief Reset the codec to initial state. */
93-
virtual void reset(void)
93+
/*!
94+
* @brief Reset the codec to initial state.
95+
*
96+
* @param[in] skip How many bytes to skip from reading.
97+
*/
98+
virtual void reset(uint8_t skip = 0)
9499
{
95-
m_cursor.set(&m_buffer);
100+
MessageBuffer buffer = m_cursor.getBuffer();
101+
m_cursor.setBuffer(buffer, skip);
96102
m_status = kErpcStatus_Success;
97103
}
98104

@@ -394,9 +400,8 @@ class Codec
394400
virtual void readNullFlag(bool &isNull) = 0;
395401

396402
protected:
397-
MessageBuffer m_buffer; /*!< Message buffer object */
398-
MessageBuffer::Cursor m_cursor; /*!< Copy data to message buffers. */
399-
erpc_status_t m_status; /*!< Status of serialized data. */
403+
Cursor m_cursor; /*!< Copy data to message buffers. */
404+
erpc_status_t m_status; /*!< Status of serialized data. */
400405
};
401406

402407
/*!

erpc_c/infra/erpc_framed_transport.cpp

Lines changed: 77 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ FramedTransport::FramedTransport(void)
3434

3535
FramedTransport::~FramedTransport(void) {}
3636

37+
uint8_t FramedTransport::reserveHeaderSize(void)
38+
{
39+
return sizeof(FramedTransport::Header::m_crcHeader) + sizeof(FramedTransport::Header::m_messageSize) +
40+
sizeof(FramedTransport::Header::m_crcBody);
41+
}
42+
3743
void FramedTransport::setCrc16(Crc16 *crcImpl)
3844
{
3945
erpc_assert(crcImpl);
@@ -47,57 +53,78 @@ Crc16 *FramedTransport::getCrc16(void)
4753

4854
erpc_status_t FramedTransport::receive(MessageBuffer *message)
4955
{
50-
Header h;
56+
Header h = { 0, 0, 0 };
5157
erpc_status_t retVal;
5258
uint16_t computedCrc;
59+
uint8_t offset = 0;
5360

5461
erpc_assert((m_crcImpl != NULL) && ("Uninitialized Crc16 object." != NULL));
5562

63+
// e.g. rpmsg tty may have nullptr and buffer is assigned in receive function.
64+
if ((message->get() != nullptr) && (message->getLength() < reserveHeaderSize()))
65+
{
66+
retVal = kErpcStatus_MemoryError;
67+
}
68+
else
5669
{
5770
#if !ERPC_THREADS_IS(NONE)
5871
Mutex::Guard lock(m_receiveLock);
5972
#endif
6073

6174
// Receive header first.
62-
retVal = underlyingReceive((uint8_t *)&h, sizeof(h));
75+
retVal = underlyingReceive(message, reserveHeaderSize(), 0);
76+
if ((retVal == kErpcStatus_Success) && (message->getLength() < reserveHeaderSize()))
77+
{
78+
retVal = kErpcStatus_MemoryError;
79+
}
6380

6481
if (retVal == kErpcStatus_Success)
6582
{
83+
static_cast<void>(memcpy(&h.m_crcHeader, message->get(), sizeof(h.m_crcHeader)));
84+
offset = sizeof(h.m_crcHeader);
85+
static_cast<void>(memcpy(&h.m_messageSize, &message->get()[offset], sizeof(h.m_messageSize)));
86+
offset += sizeof(h.m_messageSize);
87+
static_cast<void>(memcpy(&h.m_crcBody, &message->get()[offset], sizeof(h.m_crcBody)));
88+
offset += sizeof(h.m_crcBody);
89+
90+
ERPC_READ_AGNOSTIC_16(h.m_crcHeader);
6691
ERPC_READ_AGNOSTIC_16(h.m_messageSize);
67-
ERPC_READ_AGNOSTIC_16(h.m_crc);
92+
ERPC_READ_AGNOSTIC_16(h.m_crcBody);
6893

69-
// received size can't be zero.
70-
if (h.m_messageSize == 0U)
94+
computedCrc =
95+
m_crcImpl->computeCRC16(reinterpret_cast<const uint8_t *>(&h.m_messageSize), sizeof(h.m_messageSize)) +
96+
m_crcImpl->computeCRC16(reinterpret_cast<const uint8_t *>(&h.m_crcBody), sizeof(h.m_crcBody));
97+
if (computedCrc != h.m_crcHeader)
7198
{
72-
retVal = kErpcStatus_ReceiveFailed;
99+
retVal = kErpcStatus_CrcCheckFailed;
73100
}
74101
}
75102

76103
if (retVal == kErpcStatus_Success)
77104
{
78105
// received size can't be larger then buffer length.
79-
if (h.m_messageSize > message->getLength())
106+
if ((h.m_messageSize + reserveHeaderSize()) > message->getLength())
80107
{
81108
retVal = kErpcStatus_ReceiveFailed;
82109
}
83110
}
84111

85112
if (retVal == kErpcStatus_Success)
86113
{
87-
// Receive rest of the message now we know its size.
88-
retVal = underlyingReceive(message->get(), h.m_messageSize);
114+
// rpmsg tty can receive all data in one buffer, others need second call.
115+
if (message->getUsed() < (h.m_messageSize + reserveHeaderSize()))
116+
{
117+
// Receive rest of the message now we know its size.
118+
retVal = underlyingReceive(message, h.m_messageSize, offset);
119+
}
89120
}
90121
}
91122

92123
if (retVal == kErpcStatus_Success)
93124
{
94125
// Verify CRC.
95-
computedCrc = m_crcImpl->computeCRC16(message->get(), h.m_messageSize);
96-
if (computedCrc == h.m_crc)
97-
{
98-
message->setUsed(h.m_messageSize);
99-
}
100-
else
126+
computedCrc = m_crcImpl->computeCRC16(&message->get()[offset], h.m_messageSize);
127+
if (computedCrc != h.m_crcBody)
101128
{
102129
retVal = kErpcStatus_CrcCheckFailed;
103130
}
@@ -111,27 +138,51 @@ erpc_status_t FramedTransport::send(MessageBuffer *message)
111138
erpc_status_t ret;
112139
uint16_t messageLength;
113140
Header h;
141+
uint8_t offset;
114142

115143
erpc_assert((m_crcImpl != NULL) && ("Uninitialized Crc16 object." != NULL));
116144

117-
#if !ERPC_THREADS_IS(NONE)
118-
Mutex::Guard lock(m_sendLock);
119-
#endif
120-
121-
messageLength = message->getUsed();
145+
messageLength = message->getUsed() - reserveHeaderSize();
122146

123147
// Send header first.
124148
h.m_messageSize = messageLength;
125-
h.m_crc = m_crcImpl->computeCRC16(message->get(), messageLength);
149+
h.m_crcBody = m_crcImpl->computeCRC16(&message->get()[reserveHeaderSize()], messageLength);
150+
h.m_crcHeader =
151+
m_crcImpl->computeCRC16(reinterpret_cast<const uint8_t *>(&h.m_messageSize), sizeof(h.m_messageSize)) +
152+
m_crcImpl->computeCRC16(reinterpret_cast<const uint8_t *>(&h.m_crcBody), sizeof(h.m_crcBody));
126153

154+
ERPC_WRITE_AGNOSTIC_16(h.m_crcHeader);
127155
ERPC_WRITE_AGNOSTIC_16(h.m_messageSize);
128-
ERPC_WRITE_AGNOSTIC_16(h.m_crc);
156+
ERPC_WRITE_AGNOSTIC_16(h.m_crcBody);
129157

130-
ret = underlyingSend((uint8_t *)&h, sizeof(h));
131-
if (ret == kErpcStatus_Success)
158+
static_cast<void>(memcpy(message->get(), reinterpret_cast<const uint8_t *>(&h.m_crcHeader), sizeof(h.m_crcHeader)));
159+
offset = sizeof(h.m_crcHeader);
160+
static_cast<void>(
161+
memcpy(&message->get()[offset], reinterpret_cast<const uint8_t *>(&h.m_messageSize), sizeof(h.m_messageSize)));
162+
offset += sizeof(h.m_messageSize);
163+
static_cast<void>(
164+
memcpy(&message->get()[offset], reinterpret_cast<const uint8_t *>(&h.m_crcBody), sizeof(h.m_crcBody)));
165+
166+
ret = underlyingSend(message, message->getUsed(), 0);
167+
168+
return ret;
169+
}
170+
171+
erpc_status_t FramedTransport::underlyingSend(MessageBuffer *message, uint32_t size, uint32_t offset)
172+
{
173+
erpc_status_t retVal = underlyingSend(&message->get()[offset], size);
174+
175+
return retVal;
176+
}
177+
178+
erpc_status_t FramedTransport::underlyingReceive(MessageBuffer *message, uint32_t size, uint32_t offset)
179+
{
180+
erpc_status_t retVal = underlyingReceive(&message->get()[offset], size);
181+
182+
if (retVal == kErpcStatus_Success)
132183
{
133-
ret = underlyingSend(message->get(), messageLength);
184+
message->setUsed(size + offset);
134185
}
135186

136-
return ret;
187+
return retVal;
137188
}

0 commit comments

Comments
 (0)