HDLC-Daemon
FrameGenerator.cpp
Go to the documentation of this file.
1 
37 #include "FrameGenerator.h"
38 #include <assert.h>
39 #include "FCS16.h"
40 
41 const std::vector<unsigned char> FrameGenerator::SerializeFrame(const HdlcFrame& a_HdlcFrame) {
42  unsigned char l_ControlField = 0;
43  bool l_bAppendPayload = false;
44  switch (a_HdlcFrame.GetHDLCFrameType()) {
46  l_ControlField = (((a_HdlcFrame.GetSSeq() & 0x07) << 1) | ((a_HdlcFrame.GetRSeq() & 0x07) << 5)); // I-Frame, PF=0
47  l_bAppendPayload = true;
48  break;
49  }
51  l_ControlField = (0x01 | ((a_HdlcFrame.GetRSeq() & 0x07) << 5));
52  break;
53  }
55  l_ControlField = (0x05 | ((a_HdlcFrame.GetRSeq() & 0x07) << 5));
56  break;
57  }
59  l_ControlField = (0x09 | ((a_HdlcFrame.GetRSeq() & 0x07) << 5));
60  break;
61  }
63  l_ControlField = (0x0d | ((a_HdlcFrame.GetRSeq() & 0x07) << 5));
64  break;
65  }
67  l_ControlField = 0x03;
68  l_bAppendPayload = true;
69  break;
70  }
72  l_ControlField = 0x2F;
73  break;
74  }
76  l_ControlField = 0x43;
77  break;
78  }
80  l_ControlField = 0x63;
81  break;
82  }
84  l_ControlField = 0x83;
85  break;
86  }
88  l_ControlField = 0xE3;
89  break;
90  }
96  // Unknown structure, not implemented yet
97  assert(false);
98  break;
99  }
100  default:
101  assert(false);
102  } // switch
103 
104  // Assemble Frame
105  std::vector<unsigned char> l_HDLCFrame;
106  l_HDLCFrame.reserve(a_HdlcFrame.GetPayload().size() + 6); // 6 = FD, ADDR, TYPE, FCS, FCS, FD
107  l_HDLCFrame.emplace_back(0x7E);
108  l_HDLCFrame.emplace_back(a_HdlcFrame.GetAddress());
109  if (a_HdlcFrame.IsPF()) {
110  l_ControlField |= 0x10;
111  } // if
112 
113  l_HDLCFrame.emplace_back(l_ControlField);
114  if (l_bAppendPayload) {
115  l_HDLCFrame.insert(l_HDLCFrame.end(), &(a_HdlcFrame.GetPayload())[0], &(a_HdlcFrame.GetPayload())[0] + a_HdlcFrame.GetPayload().size());
116  } // if
117 
118  // Calculate FCS, perform escaping, and deliver
119  ApplyFCS(l_HDLCFrame); // Plus 2 bytes
120  l_HDLCFrame.emplace_back(0x7E);
121  return l_HDLCFrame;
122 }
123 
124 void FrameGenerator::ApplyFCS(std::vector<unsigned char> &a_HDLCFrame) {
125  uint16_t trialfcs = pppfcs16(PPPINITFCS16, &a_HDLCFrame[1], (a_HDLCFrame.size() - 1));
126  trialfcs ^= 0xffff;
127  a_HDLCFrame.emplace_back(trialfcs & 0x00ff);
128  a_HDLCFrame.emplace_back((trialfcs >> 8) & 0x00ff);
129 }
130 
131 std::vector<unsigned char> FrameGenerator::EscapeFrame(const std::vector<unsigned char> &a_HDLCFrame) {
132  // Obtain required amount of memory for the fully escaped HDLC frame
133  size_t l_NbrOfBytesToEscapeMax = 0;
134  for (size_t l_Index = 1; l_Index < (a_HDLCFrame.size() - 1); ++l_Index) {
135  if ((a_HDLCFrame[l_Index] == 0x7D) || (a_HDLCFrame[l_Index] == 0x7E)) {
136  ++l_NbrOfBytesToEscapeMax;
137  } // if
138  } // for
139 
140  // Prepare return buffer
141  std::vector<unsigned char> l_EscapedHDLCFrame;
142  l_EscapedHDLCFrame.reserve(a_HDLCFrame.size() + l_NbrOfBytesToEscapeMax);
143  l_EscapedHDLCFrame.emplace_back(0x7E);
144  for (std::vector<unsigned char>::const_iterator it = (a_HDLCFrame.begin() + 1); it < (a_HDLCFrame.end() - 1); ++it) {
145  if (*it == 0x7D) {
146  l_EscapedHDLCFrame.emplace_back(0x7D);
147  l_EscapedHDLCFrame.emplace_back(0x5D);
148  } else if (*it == 0x7E) {
149  l_EscapedHDLCFrame.emplace_back(0x7D);
150  l_EscapedHDLCFrame.emplace_back(0x5E);
151  } else {
152  l_EscapedHDLCFrame.emplace_back(*it);
153  } // else
154  } // for
155 
156  l_EscapedHDLCFrame.emplace_back(0x7E);
157  return l_EscapedHDLCFrame;
158 }
static std::vector< unsigned char > EscapeFrame(const std::vector< unsigned char > &a_HDLCFrame)
static const std::vector< unsigned char > SerializeFrame(const HdlcFrame &a_HdlcFrame)
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.
E_HDLC_FRAMETYPE GetHDLCFrameType() const
Definition: HdlcFrame.h:70
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.
unsigned char GetSSeq() const
Definition: HdlcFrame.h:83
unsigned char GetRSeq() const
Definition: HdlcFrame.h:80
uint16_t pppfcs16(uint16_t fcs, unsigned char *cp, size_t len)
Definition: FCS16.cpp:74
unsigned char GetAddress() const
Definition: HdlcFrame.h:48
bool IsPF() const
Definition: HdlcFrame.h:77
const std::vector< unsigned char > & GetPayload() const
Definition: HdlcFrame.h:86
#define PPPINITFCS16
Definition: FCS16.h:43