@@ -34,6 +34,12 @@ FramedTransport::FramedTransport(void)
3434
3535FramedTransport::~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+
3743void FramedTransport::setCrc16 (Crc16 *crcImpl)
3844{
3945 erpc_assert (crcImpl);
@@ -47,36 +53,51 @@ Crc16 *FramedTransport::getCrc16(void)
4753
4854erpc_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->get (), sizeof (h));
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 }
@@ -85,17 +106,17 @@ erpc_status_t FramedTransport::receive(MessageBuffer *message)
85106 if (retVal == kErpcStatus_Success )
86107 {
87108 // Receive rest of the message now we know its size.
88- retVal = underlyingReceive (message->get (), h.m_messageSize );
109+ retVal = underlyingReceive (& message->get ()[offset] , h.m_messageSize );
89110 }
90111 }
91112
92113 if (retVal == kErpcStatus_Success )
93114 {
94115 // Verify CRC.
95- computedCrc = m_crcImpl->computeCRC16 (message->get (), h.m_messageSize );
96- if (computedCrc == h.m_crc )
116+ computedCrc = m_crcImpl->computeCRC16 (& message->get ()[offset] , h.m_messageSize );
117+ if (computedCrc == h.m_crcBody )
97118 {
98- message->setUsed (h.m_messageSize );
119+ message->setUsed (h.m_messageSize + reserveHeaderSize () );
99120 }
100121 else
101122 {
@@ -111,27 +132,32 @@ 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 (), 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 );
128150 ERPC_WRITE_AGNOSTIC_16 (h.m_crc );
129151
130- ret = underlyingSend ((uint8_t *)&h, sizeof (h));
131- if (ret == kErpcStatus_Success )
132- {
133- ret = underlyingSend (message->get (), messageLength);
134- }
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 )));
159+
160+ ret = underlyingSend (message->get (), message->getUsed ());
135161
136162 return ret;
137163}
0 commit comments