Skip to content

Commit e966d35

Browse files
committed
Change the internal network protocol.
1 parent 8e34cab commit e966d35

File tree

4 files changed

+84
-40
lines changed

4 files changed

+84
-40
lines changed

M17Control.cpp

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,9 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
189189
m_rssiCount = 1U;
190190
m_rfLSFn = 0U;
191191

192+
if (m_network != NULL)
193+
m_network->writeHeader(m_rfLSF.getSource(), m_rfLSF.getDest(), frame);
194+
192195
#if defined(DUMP_M17)
193196
openFile();
194197
#endif
@@ -237,6 +240,12 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
237240
m_aveRSSI = m_rssi;
238241
m_rssiCount = 1U;
239242

243+
if (m_network != NULL) {
244+
unsigned char lsf[M17_LSF_LENGTH_BYTES];
245+
m_rfLSF.getNetwork(lsf);
246+
m_network->writeHeader(m_rfLSF.getSource(), m_rfLSF.getDest(), lsf);
247+
}
248+
240249
#if defined(DUMP_M17)
241250
openFile();
242251
#endif
@@ -300,18 +309,8 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
300309
writeQueueRF(rfData);
301310
}
302311

303-
if (m_network != NULL && m_rfTimeoutTimer.isRunning() && !m_rfTimeoutTimer.hasExpired()) {
304-
unsigned char netData[M17_LSF_LENGTH_BYTES + M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES + M17_CRC_LENGTH_BYTES];
305-
306-
m_rfLSF.getNetwork(netData + 0U);
307-
308-
// Copy the FN and payload from the frame
309-
::memcpy(netData + M17_LSF_LENGTH_BYTES - M17_CRC_LENGTH_BYTES, frame, M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES);
310-
311-
// The CRC is added in the networking code
312-
313-
m_network->write(netData);
314-
}
312+
if (m_network != NULL && m_rfTimeoutTimer.isRunning() && !m_rfTimeoutTimer.hasExpired())
313+
m_network->writeData(m_rfLSF.getSource(), m_rfLSF.getDest(), frame);
315314

316315
m_rfFrames++;
317316

@@ -404,16 +403,18 @@ void CM17Control::writeNetwork()
404403

405404
m_networkWatchdog.start();
406405

407-
m_netLSF.setNetwork(netData);
408-
m_netLSF.setCAN(m_can);
406+
if (netData[0U] == TAG_HEADER) {
407+
m_netLSF.setNetwork(netData + 25U);
408+
m_netLSF.setCAN(m_can);
409409

410-
if (!m_allowEncryption) {
411-
unsigned char type = m_netLSF.getEncryptionType();
412-
if (type != M17_ENCRYPTION_TYPE_NONE)
413-
return;
414-
}
410+
if (!m_allowEncryption) {
411+
unsigned char type = m_netLSF.getEncryptionType();
412+
if (type != M17_ENCRYPTION_TYPE_NONE) {
413+
m_network->reset();
414+
return;
415+
}
416+
}
415417

416-
if (m_netState == RS_NET_IDLE) {
417418
std::string source = m_netLSF.getSource();
418419
std::string dest = m_netLSF.getDest();
419420

@@ -432,8 +433,7 @@ void CM17Control::writeNetwork()
432433
m_netState = RS_NET_DATA_AUDIO;
433434
break;
434435
default:
435-
LogMessage("M17, received network unknown transmission from %s to %s", source.c_str(), dest.c_str());
436-
m_netState = RS_NET_DATA;
436+
m_network->reset();
437437
break;
438438
}
439439

@@ -467,7 +467,7 @@ void CM17Control::writeNetwork()
467467
writeQueueNet(start);
468468
}
469469

470-
if (m_netState == RS_NET_AUDIO || m_netState == RS_NET_DATA_AUDIO) {
470+
if (netData[0U] == TAG_DATA) {
471471
unsigned char data[M17_FRAME_LENGTH_BYTES + 2U];
472472

473473
data[0U] = TAG_DATA;
@@ -498,7 +498,7 @@ void CM17Control::writeNetwork()
498498

499499
// Add the FN and the data/audio
500500
unsigned char payload[M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES];
501-
::memcpy(payload, netData + 28U, M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES);
501+
::memcpy(payload, netData + 24U, M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES);
502502

503503
// Add the Convolution FEC
504504
CM17Convolution conv;
@@ -515,7 +515,7 @@ void CM17Control::writeNetwork()
515515
m_netLSFn = 0U;
516516

517517
// EOT handling
518-
uint16_t fn = (netData[28U] << 8) + (netData[29U] << 0);
518+
uint16_t fn = (netData[24U] << 8) + (netData[25U] << 0);
519519
if ((fn & 0x8000U) == 0x8000U) {
520520
std::string source = m_netLSF.getSource();
521521
std::string dest = m_netLSF.getDest();

M17Network.cpp

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,19 @@ bool CM17Network::open()
7474
}
7575
}
7676

77-
bool CM17Network::write(const unsigned char* data)
77+
bool CM17Network::writeHeader(const std::string& source, const std::string& dest, const unsigned char* data)
7878
{
7979
if (m_addrLen == 0U)
8080
return false;
8181

8282
assert(data != NULL);
8383

84-
unsigned char buffer[100U];
84+
unsigned char buffer[60U];
8585

8686
buffer[0U] = 'M';
8787
buffer[1U] = '1';
8888
buffer[2U] = '7';
89-
buffer[3U] = ' ';
89+
buffer[3U] = 'H';
9090

9191
// Create a random id for this transmission if needed
9292
if (m_outId == 0U) {
@@ -97,16 +97,49 @@ bool CM17Network::write(const unsigned char* data)
9797
buffer[4U] = m_outId / 256U; // Unique session id
9898
buffer[5U] = m_outId % 256U;
9999

100-
::memcpy(buffer + 6U, data, 46U);
100+
::memset(buffer + 6U, ' ', 9U);
101+
::memcpy(buffer + 6U, source.c_str(), source.size());
101102

102-
// Dummy CRC
103-
buffer[52U] = 0x00U;
104-
buffer[53U] = 0x00U;
103+
::memset(buffer + 15U, ' ', 9U);
104+
::memcpy(buffer + 15U, dest.c_str(), dest.size());
105+
106+
::memcpy(buffer + 24U, data, 28U);
105107

106108
if (m_debug)
107-
CUtils::dump(1U, "M17 data transmitted", buffer, 54U);
109+
CUtils::dump(1U, "M17 header transmitted", buffer, 52U);
108110

109-
return m_socket.write(buffer, 54U, m_addr, m_addrLen);
111+
return m_socket.write(buffer, 52U, m_addr, m_addrLen);
112+
}
113+
114+
bool CM17Network::writeData(const std::string& source, const std::string& dest, const unsigned char* data)
115+
{
116+
if (m_addrLen == 0U)
117+
return false;
118+
119+
assert(data != NULL);
120+
121+
unsigned char buffer[50U];
122+
123+
buffer[0U] = 'M';
124+
buffer[1U] = '1';
125+
buffer[2U] = '7';
126+
buffer[3U] = 'D';
127+
128+
buffer[4U] = m_outId / 256U; // Unique session id
129+
buffer[5U] = m_outId % 256U;
130+
131+
::memset(buffer + 6U, ' ', 9U);
132+
::memcpy(buffer + 6U, source.c_str(), source.size());
133+
134+
::memset(buffer + 15U, ' ', 9U);
135+
::memcpy(buffer + 15U, dest.c_str(), dest.size());
136+
137+
::memcpy(buffer + 24U, data, 18U);
138+
139+
if (m_debug)
140+
CUtils::dump(1U, "M17 data transmitted", buffer, 42U);
141+
142+
return m_socket.write(buffer, 42U, m_addr, m_addrLen);
110143
}
111144

112145
void CM17Network::clock(unsigned int ms)
@@ -139,7 +172,7 @@ void CM17Network::clock(unsigned int ms)
139172
if (::memcmp(buffer + 0U, "PING", 4U) == 0)
140173
return;
141174

142-
if (::memcmp(buffer + 0U, "M17 ", 4U) != 0) {
175+
if (::memcmp(buffer + 0U, "M17H", 4U) != 0 && ::memcmp(buffer + 0U, "M17D", 4U) != 0) {
143176
CUtils::dump(2U, "M17, received unknown packet", buffer, length);
144177
return;
145178
}
@@ -152,10 +185,19 @@ void CM17Network::clock(unsigned int ms)
152185
return;
153186
}
154187

155-
unsigned char c = length - 6U;
156-
m_buffer.addData(&c, 1U);
188+
if (::memcmp(buffer + 0U, "M17H", 4U) == 0) {
189+
unsigned char c = length - 5U;
190+
m_buffer.addData(&c, 1U);
157191

158-
m_buffer.addData(buffer + 6U, length - 6U);
192+
m_buffer.addData(&TAG_HEADER, 1U);
193+
m_buffer.addData(buffer + 6U, length - 6U);
194+
} else {
195+
unsigned char c = length - 5U;
196+
m_buffer.addData(&c, 1U);
197+
198+
m_buffer.addData(&TAG_DATA, 1U);
199+
m_buffer.addData(buffer + 6U, length - 6U);
200+
}
159201
}
160202

161203
bool CM17Network::read(unsigned char* data)

M17Network.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ class CM17Network {
3636

3737
void enable(bool enabled);
3838

39-
bool write(const unsigned char* data);
39+
bool writeHeader(const std::string& source, const std::string& dest, const unsigned char* data);
40+
41+
bool writeData(const std::string& source, const std::string& dest, const unsigned char* data);
4042

4143
bool read(unsigned char* data);
4244

Version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@
1919
#if !defined(VERSION_H)
2020
#define VERSION_H
2121

22-
const char* VERSION = "20210818";
22+
const char* VERSION = "20210822";
2323

2424
#endif

0 commit comments

Comments
 (0)