Skip to content

Commit 913e9d7

Browse files
committed
Framed transport header data stored in MessageBuffer
Signed-off-by: Cervenka Dusan <[email protected]>
1 parent 9fb5763 commit 913e9d7

23 files changed

+471
-407
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_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: 16 additions & 11 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

@@ -428,8 +434,7 @@ class Codec
428434
virtual void readCallback(funPtr callbacks1, funPtr *callback2) = 0;
429435

430436
protected:
431-
MessageBuffer m_buffer; /*!< Message buffer object */
432-
MessageBuffer::Cursor m_cursor; /*!< Copy data to message buffers. */
437+
Cursor m_cursor; /*!< Copy data to message buffers. */
433438
erpc_status_t m_status; /*!< Status of serialized data. */
434439
};
435440

erpc_c/infra/erpc_framed_transport.cpp

Lines changed: 71 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,72 @@ 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+
if (message->getLength() < reserveHeaderSize())
64+
{
65+
retVal = kErpcStatus_MemoryError;
66+
}
67+
else
5668
{
5769
#if !ERPC_THREADS_IS(NONE)
5870
Mutex::Guard lock(m_receiveLock);
5971
#endif
6072

6173
// Receive header first.
62-
retVal = underlyingReceive((uint8_t *)&h, sizeof(h));
74+
retVal = underlyingReceive(message, reserveHeaderSize(), 0);
75+
static_cast<void>(memcpy(&h.m_crcHeader, message->get(), sizeof(h.m_crcHeader)));
76+
offset = sizeof(h.m_crcHeader);
77+
static_cast<void>(memcpy(&h.m_messageSize, &message->get()[offset], sizeof(h.m_messageSize)));
78+
offset += sizeof(h.m_messageSize);
79+
static_cast<void>(memcpy(&h.m_crcBody, &message->get()[offset], sizeof(h.m_crcBody)));
80+
offset += sizeof(h.m_crcBody);
6381

6482
if (retVal == kErpcStatus_Success)
6583
{
84+
ERPC_READ_AGNOSTIC_16(h.m_crcHeader);
6685
ERPC_READ_AGNOSTIC_16(h.m_messageSize);
67-
ERPC_READ_AGNOSTIC_16(h.m_crc);
86+
ERPC_READ_AGNOSTIC_16(h.m_crcBody);
6887

69-
// received size can't be zero.
70-
if (h.m_messageSize == 0U)
88+
computedCrc =
89+
m_crcImpl->computeCRC16(reinterpret_cast<const uint8_t *>(&h.m_messageSize), sizeof(h.m_messageSize)) +
90+
m_crcImpl->computeCRC16(reinterpret_cast<const uint8_t *>(&h.m_crcBody), sizeof(h.m_crcBody));
91+
if (computedCrc != h.m_crcHeader)
7192
{
72-
retVal = kErpcStatus_ReceiveFailed;
93+
retVal = kErpcStatus_CrcCheckFailed;
7394
}
7495
}
7596

7697
if (retVal == kErpcStatus_Success)
7798
{
7899
// received size can't be larger then buffer length.
79-
if (h.m_messageSize > message->getLength())
100+
if ((h.m_messageSize + reserveHeaderSize()) > message->getLength())
80101
{
81102
retVal = kErpcStatus_ReceiveFailed;
82103
}
83104
}
84105

85106
if (retVal == kErpcStatus_Success)
86107
{
87-
// Receive rest of the message now we know its size.
88-
retVal = underlyingReceive(message->get(), h.m_messageSize);
108+
// rpmsg tty can receive all data in one buffer, others need second call.
109+
if (message->getUsed() < (h.m_messageSize + reserveHeaderSize()))
110+
{
111+
// Receive rest of the message now we know its size.
112+
retVal = underlyingReceive(message, h.m_messageSize, offset);
113+
}
89114
}
90115
}
91116

92117
if (retVal == kErpcStatus_Success)
93118
{
94119
// 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
120+
computedCrc = m_crcImpl->computeCRC16(&message->get()[offset], h.m_messageSize);
121+
if (computedCrc != h.m_crcBody)
101122
{
102123
retVal = kErpcStatus_CrcCheckFailed;
103124
}
@@ -111,27 +132,51 @@ erpc_status_t FramedTransport::send(MessageBuffer *message)
111132
erpc_status_t ret;
112133
uint16_t messageLength;
113134
Header h;
135+
uint8_t offset;
114136

115137
erpc_assert((m_crcImpl != NULL) && ("Uninitialized Crc16 object." != NULL));
116138

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

123141
// Send header first.
124142
h.m_messageSize = messageLength;
125-
h.m_crc = m_crcImpl->computeCRC16(message->get(), messageLength);
143+
h.m_crcBody = m_crcImpl->computeCRC16(&message->get()[reserveHeaderSize()], messageLength);
144+
h.m_crcHeader =
145+
m_crcImpl->computeCRC16(reinterpret_cast<const uint8_t *>(&h.m_messageSize), sizeof(h.m_messageSize)) +
146+
m_crcImpl->computeCRC16(reinterpret_cast<const uint8_t *>(&h.m_crcBody), sizeof(h.m_crcBody));
126147

148+
ERPC_WRITE_AGNOSTIC_16(h.m_crcHeader);
127149
ERPC_WRITE_AGNOSTIC_16(h.m_messageSize);
128-
ERPC_WRITE_AGNOSTIC_16(h.m_crc);
150+
ERPC_WRITE_AGNOSTIC_16(h.m_crcBody);
151+
152+
static_cast<void>(memcpy(message->get(), reinterpret_cast<const uint8_t *>(&h.m_crcHeader), sizeof(h.m_crcHeader)));
153+
offset = sizeof(h.m_crcHeader);
154+
static_cast<void>(
155+
memcpy(&message->get()[offset], reinterpret_cast<const uint8_t *>(&h.m_messageSize), sizeof(h.m_messageSize)));
156+
offset += sizeof(h.m_messageSize);
157+
static_cast<void>(
158+
memcpy(&message->get()[offset], reinterpret_cast<const uint8_t *>(&h.m_crcBody), sizeof(h.m_crcBody)));
129159

130-
ret = underlyingSend((uint8_t *)&h, sizeof(h));
131-
if (ret == kErpcStatus_Success)
160+
ret = underlyingSend(message, message->getUsed(), 0);
161+
162+
return ret;
163+
}
164+
165+
erpc_status_t FramedTransport::underlyingSend(MessageBuffer *message, uint32_t size, uint32_t offset)
166+
{
167+
erpc_status_t retVal = underlyingSend(&message->get()[offset], size);
168+
169+
return retVal;
170+
}
171+
172+
erpc_status_t FramedTransport::underlyingReceive(MessageBuffer *message, uint32_t size, uint32_t offset)
173+
{
174+
erpc_status_t retVal = underlyingReceive(&message->get()[offset], size);
175+
176+
if (retVal == kErpcStatus_Success)
132177
{
133-
ret = underlyingSend(message->get(), messageLength);
178+
message->setUsed(size + offset);
134179
}
135180

136-
return ret;
181+
return retVal;
137182
}

erpc_c/infra/erpc_framed_transport.hpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ namespace erpc {
5656
class FramedTransport : public Transport
5757
{
5858
public:
59+
/*! @brief Contents of the header that prefixes each message. */
60+
struct Header
61+
{
62+
uint16_t m_crcHeader; //!< CRC-16 over this header structure data
63+
uint16_t m_messageSize; //!< Size in bytes of the message, excluding the header.
64+
uint16_t m_crcBody; //!< CRC-16 over the message data.
65+
};
66+
5967
/*!
6068
* @brief Constructor.
6169
*/
@@ -66,6 +74,13 @@ class FramedTransport : public Transport
6674
*/
6775
virtual ~FramedTransport(void);
6876

77+
/**
78+
* @brief Size of data placed in MessageBuffer before serializing eRPC data.
79+
*
80+
* @return uint8_t Amount of bytes, reserved before serialized data.
81+
*/
82+
virtual uint8_t reserveHeaderSize(void) override;
83+
6984
/*!
7085
* @brief Receives an entire message.
7186
*
@@ -95,13 +110,6 @@ class FramedTransport : public Transport
95110
*/
96111
virtual erpc_status_t send(MessageBuffer *message) override;
97112

98-
/*! @brief Contents of the header that prefixes each message. */
99-
struct Header
100-
{
101-
uint16_t m_messageSize; //!< Size in bytes of the message, excluding the header.
102-
uint16_t m_crc; //!< CRC-16 over the message data.
103-
};
104-
105113
/*!
106114
* @brief This functions sets the CRC-16 implementation.
107115
*
@@ -124,6 +132,10 @@ class FramedTransport : public Transport
124132
Mutex m_receiveLock; //!< Mutex protecting receive.
125133
#endif
126134

135+
virtual erpc_status_t underlyingSend(MessageBuffer *message, uint32_t size, uint32_t offset);
136+
137+
virtual erpc_status_t underlyingReceive(MessageBuffer *message, uint32_t size, uint32_t offset);
138+
127139
/*!
128140
* @brief Subclasses must implement this function to send data.
129141
*

0 commit comments

Comments
 (0)