@@ -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,57 +53,72 @@ 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, 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}
0 commit comments