48 m_Buffer.reserve(max_length);
49 m_Buffer.emplace_back(0x7E);
50 m_bStartTokenSeen =
false;
55 size_t l_ConsumedBytes = AddChunk(a_Buffer, a_Bytes);
56 a_Buffer += l_ConsumedBytes;
57 a_Bytes -= l_ConsumedBytes;
61 size_t FrameParser::AddChunk(
const unsigned char* a_Buffer,
size_t a_Bytes) {
62 if (m_bStartTokenSeen ==
false) {
64 const void* l_pStartTokenPtr = memchr((
const void*)a_Buffer, 0x7E, a_Bytes);
65 if (l_pStartTokenPtr) {
67 m_bStartTokenSeen =
true;
68 if (l_pStartTokenPtr == a_Buffer) {
73 return ((
const unsigned char*)l_pStartTokenPtr - a_Buffer + 1);
81 const void* l_pEndTokenPtr = memchr((
const void*)a_Buffer, 0x7E, a_Bytes);
84 size_t l_NbrOfBytes = ((
const unsigned char*)l_pEndTokenPtr - a_Buffer + 1);
85 if ((m_Buffer.size() + l_NbrOfBytes) <= (2 * max_length)) {
87 m_Buffer.insert(m_Buffer.end(), a_Buffer, a_Buffer + l_NbrOfBytes);
88 if (RemoveEscapeCharacters()) {
90 m_bStartTokenSeen =
false;
95 return (l_NbrOfBytes);
98 if ((m_Buffer.size() + a_Bytes) > (2 * max_length)) {
100 m_bStartTokenSeen =
false;
104 m_Buffer.insert(m_Buffer.end(), a_Buffer, a_Buffer + a_Bytes);
112 bool FrameParser::RemoveEscapeCharacters() {
114 assert(m_Buffer.front() == 0x7E);
115 assert(m_Buffer.back() == 0x7E);
116 assert(m_Buffer.size() >= 2);
117 assert(m_bStartTokenSeen ==
true);
119 if (m_Buffer.size() == 2) {
125 bool l_bMessageInvalid =
false;
126 if (m_Buffer[m_Buffer.size() - 2] == 0x7D) {
127 l_bMessageInvalid =
true;
130 std::vector<unsigned char> l_UnescapedBuffer;
131 l_UnescapedBuffer.reserve(m_Buffer.size());
132 for (
auto it = m_Buffer.begin(); it != m_Buffer.end(); ++it) {
137 l_UnescapedBuffer.emplace_back(0x7E);
138 }
else if (*it == 0x5D) {
139 l_UnescapedBuffer.emplace_back(0x7D);
142 l_bMessageInvalid =
true;
143 l_UnescapedBuffer.emplace_back(*it);
147 l_UnescapedBuffer.emplace_back(*it);
152 m_Buffer = std::move(l_UnescapedBuffer);
156 if ((m_Buffer.size() < 6) || (m_Buffer.size() > max_length)) {
161 if (l_bMessageInvalid ==
false) {
167 return (l_bMessageInvalid ==
false);
170 HdlcFrame FrameParser::DeserializeFrame(
const std::vector<unsigned char> &a_UnescapedBuffer)
const {
174 unsigned char l_ucCtrl = a_UnescapedBuffer[2];
175 l_HdlcFrame.
SetPF((l_ucCtrl & 0x10) >> 4);
176 bool l_bAppendPayload =
false;
177 if ((l_ucCtrl & 0x01) == 0) {
180 l_HdlcFrame.
SetSSeq((l_ucCtrl & 0x0E) >> 1);
181 l_HdlcFrame.
SetRSeq((l_ucCtrl & 0xE0) >> 5);
182 l_bAppendPayload =
true;
185 if ((l_ucCtrl & 0x02) == 0x00) {
187 l_HdlcFrame.
SetRSeq((l_ucCtrl & 0xE0) >> 5);
188 unsigned char l_ucType = ((l_ucCtrl & 0x0c) >> 2);
189 if (l_ucType == 0x00) {
192 }
else if (l_ucType == 0x01) {
195 }
else if (l_ucType == 0x02) {
204 unsigned char l_ucType = (((l_ucCtrl & 0x0c) >> 2) | ((l_ucCtrl & 0xe0) >> 3));
209 l_bAppendPayload =
true;
250 l_bAppendPayload =
true;
256 l_bAppendPayload =
true;
262 l_bAppendPayload =
true;
273 if (l_bAppendPayload) {
275 std::vector<unsigned char> l_Payload;
276 l_Payload.assign(&a_UnescapedBuffer[3], (&a_UnescapedBuffer[3] + (a_UnescapedBuffer.size() - 6)));
void SetRSeq(unsigned char a_RSeq)
void SetHDLCFrameType(E_HDLC_FRAMETYPE a_eHDLCFrameType)
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.
void SetPayload(const std::vector< unsigned char > &a_Payload)
uint16_t pppfcs16(uint16_t fcs, unsigned char *cp, size_t len)
FrameParser(ProtocolState &a_ProtocolState)
void AddReceivedRawBytes(const unsigned char *a_Buffer, size_t a_Bytes)
void SetAddress(unsigned char a_Address)
void InterpretDeserializedFrame(const std::vector< unsigned char > &a_Payload, const HdlcFrame &a_HdlcFrame, bool a_bMessageInvalid)
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.
void SetSSeq(unsigned char a_SSeq)
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.