Change the handling of the sequence numbers in iAX.

This commit is contained in:
Jonathan Naylor
2024-08-08 15:12:24 +01:00
parent c00c2a461c
commit ee886f030d
3 changed files with 79 additions and 56 deletions

View File

@@ -140,8 +140,10 @@ m_retryTimer(1000U, 0U, 500U),
m_pingTimer(1000U, 2U), m_pingTimer(1000U, 2U),
m_seed(), m_seed(),
m_timestamp(), m_timestamp(),
m_sCallNo(0U), m_sAuthCallNo(0U),
m_dCallNo(0U), m_dAuthCallNo(0U),
m_sLinkCallNo(0U),
m_dLinkCallNo(0U),
m_iSeqNo(0U), m_iSeqNo(0U),
m_oSeqNo(0U), m_oSeqNo(0U),
m_callToken(), m_callToken(),
@@ -204,14 +206,14 @@ bool CFMIAXNetwork::open()
if (!ret) if (!ret)
return false; return false;
m_dCallNo = 0U; m_dAuthCallNo = 0U;
m_rxFrames = 0U; m_dLinkCallNo = 0U;
m_keyed = false; m_rxFrames = 0U;
m_keyed = false;
std::uniform_int_distribution<uint16_t> dist(0x0001U, 0x7FFFU); std::uniform_int_distribution<uint16_t> dist(0x0001U, 0x7FFFU);
m_sCallNo = dist(m_random); m_sAuthCallNo = dist(m_random);
m_sLinkCallNo = dist(m_random);
LogMessage("Source call number set to %u", m_sCallNo);
ret = writeRegReq(); ret = writeRegReq();
if (!ret) { if (!ret) {
@@ -317,12 +319,6 @@ void CFMIAXNetwork::clock(unsigned int ms)
unsigned int ts = (buffer[4U] << 24) | (buffer[5U] << 16) | (buffer[6U] << 8) | (buffer[7U] << 0); unsigned int ts = (buffer[4U] << 24) | (buffer[5U] << 16) | (buffer[6U] << 8) | (buffer[7U] << 0);
unsigned char iSeqNo = buffer[8U]; unsigned char iSeqNo = buffer[8U];
// Grab the destination call number if we don't have it already
if (m_dCallNo == 0U) {
m_dCallNo = ((buffer[0U] << 8) | (buffer[1U] << 0)) & 0x7FFFU;
LogMessage("Destination call number set to %u", m_dCallNo);
}
if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_ACK)) { if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_ACK)) {
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
CUtils::dump(1U, "FM IAX Network Data Received", buffer, length); CUtils::dump(1U, "FM IAX Network Data Received", buffer, length);
@@ -351,6 +347,8 @@ void CFMIAXNetwork::clock(unsigned int ms)
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
CUtils::dump(1U, "FM IAX Network Data Received", buffer, length); CUtils::dump(1U, "FM IAX Network Data Received", buffer, length);
#endif #endif
m_dLinkCallNo = ((buffer[0U] << 8) | (buffer[1U] << 0)) & 0x7FFFU;
m_callToken = getIEString(buffer, length, IAX_IE_CALLTOKEN); m_callToken = getIEString(buffer, length, IAX_IE_CALLTOKEN);
LogMessage("IAX CALLTOKEN received: \"%s\"", m_callToken.c_str()); LogMessage("IAX CALLTOKEN received: \"%s\"", m_callToken.c_str());
@@ -406,6 +404,8 @@ void CFMIAXNetwork::clock(unsigned int ms)
CUtils::dump(1U, "FM IAX Network Data Received", buffer, length); CUtils::dump(1U, "FM IAX Network Data Received", buffer, length);
LogDebug("IAX REGAUTH received"); LogDebug("IAX REGAUTH received");
#endif #endif
m_dAuthCallNo = ((buffer[0U] << 8) | (buffer[1U] << 0)) & 0x7FFFU;
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
@@ -632,7 +632,7 @@ bool CFMIAXNetwork::writeNew()
LogDebug("IAX NEW sent"); LogDebug("IAX NEW sent");
#endif #endif
unsigned short sCall = m_sCallNo | 0x8000U; unsigned short sCall = m_sLinkCallNo | 0x8000U;
m_timestamp.start(); m_timestamp.start();
@@ -686,6 +686,8 @@ bool CFMIAXNetwork::writeNew()
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, length); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, length);
m_oSeqNo++;
return m_socket.write(buffer, length, m_serverAddr, m_serverAddrLen); return m_socket.write(buffer, length, m_serverAddr, m_serverAddrLen);
} }
@@ -694,9 +696,8 @@ bool CFMIAXNetwork::writeKey(bool key)
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX KEY/UNKEY sent"); LogDebug("IAX KEY/UNKEY sent");
#endif #endif
m_oSeqNo++;
unsigned short sCall = m_sCallNo | 0x8000U; unsigned short sCall = m_sLinkCallNo | 0x8000U;
unsigned int ts = m_timestamp.elapsed(); unsigned int ts = m_timestamp.elapsed();
unsigned char buffer[15U]; unsigned char buffer[15U];
@@ -704,8 +705,8 @@ bool CFMIAXNetwork::writeKey(bool key)
buffer[0U] = (sCall >> 8) & 0xFFU; buffer[0U] = (sCall >> 8) & 0xFFU;
buffer[1U] = (sCall >> 0) & 0xFFU; buffer[1U] = (sCall >> 0) & 0xFFU;
buffer[2U] = (m_dCallNo >> 8) & 0xFFU; buffer[2U] = (m_dLinkCallNo >> 8) & 0xFFU;
buffer[3U] = (m_dCallNo >> 0) & 0xFFU; buffer[3U] = (m_dLinkCallNo >> 0) & 0xFFU;
buffer[4U] = (ts >> 24) & 0xFFU; buffer[4U] = (ts >> 24) & 0xFFU;
buffer[5U] = (ts >> 16) & 0xFFU; buffer[5U] = (ts >> 16) & 0xFFU;
@@ -725,6 +726,8 @@ bool CFMIAXNetwork::writeKey(bool key)
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U);
m_oSeqNo++;
return m_socket.write(buffer, 12U, m_serverAddr, m_serverAddrLen); return m_socket.write(buffer, 12U, m_serverAddr, m_serverAddrLen);
} }
@@ -735,9 +738,8 @@ bool CFMIAXNetwork::writePing(const sockaddr_storage& addr, unsigned int addrLen
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX PING sent"); LogDebug("IAX PING sent");
#endif #endif
m_oSeqNo++;
unsigned short sCall = m_sCallNo | 0x8000U; unsigned short sCall = m_sLinkCallNo | 0x8000U;
unsigned int ts = m_timestamp.elapsed(); unsigned int ts = m_timestamp.elapsed();
unsigned char buffer[15U]; unsigned char buffer[15U];
@@ -745,8 +747,8 @@ bool CFMIAXNetwork::writePing(const sockaddr_storage& addr, unsigned int addrLen
buffer[0U] = (sCall >> 8) & 0xFFU; buffer[0U] = (sCall >> 8) & 0xFFU;
buffer[1U] = (sCall >> 0) & 0xFFU; buffer[1U] = (sCall >> 0) & 0xFFU;
buffer[2U] = (m_dCallNo >> 8) & 0xFFU; buffer[2U] = (m_dLinkCallNo >> 8) & 0xFFU;
buffer[3U] = (m_dCallNo >> 0) & 0xFFU; buffer[3U] = (m_dLinkCallNo >> 0) & 0xFFU;
buffer[4U] = (ts >> 24) & 0xFFU; buffer[4U] = (ts >> 24) & 0xFFU;
buffer[5U] = (ts >> 16) & 0xFFU; buffer[5U] = (ts >> 16) & 0xFFU;
@@ -766,6 +768,8 @@ bool CFMIAXNetwork::writePing(const sockaddr_storage& addr, unsigned int addrLen
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U);
m_oSeqNo++;
return m_socket.write(buffer, 12U, addr, addrLen); return m_socket.write(buffer, 12U, addr, addrLen);
} }
@@ -776,17 +780,16 @@ bool CFMIAXNetwork::writePong(const sockaddr_storage& addr, unsigned int addrLen
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX PONG sent"); LogDebug("IAX PONG sent");
#endif #endif
m_oSeqNo++;
unsigned short sCall = m_sCallNo | 0x8000U; unsigned short sCall = m_sLinkCallNo | 0x8000U;
unsigned char buffer[50U]; unsigned char buffer[50U];
buffer[0U] = (sCall >> 8) & 0xFFU; buffer[0U] = (sCall >> 8) & 0xFFU;
buffer[1U] = (sCall >> 0) & 0xFFU; buffer[1U] = (sCall >> 0) & 0xFFU;
buffer[2U] = (m_dCallNo >> 8) & 0xFFU; buffer[2U] = (m_dLinkCallNo >> 8) & 0xFFU;
buffer[3U] = (m_dCallNo >> 0) & 0xFFU; buffer[3U] = (m_dLinkCallNo >> 0) & 0xFFU;
buffer[4U] = (ts >> 24) & 0xFFU; buffer[4U] = (ts >> 24) & 0xFFU;
buffer[5U] = (ts >> 16) & 0xFFU; buffer[5U] = (ts >> 16) & 0xFFU;
@@ -819,6 +822,8 @@ bool CFMIAXNetwork::writePong(const sockaddr_storage& addr, unsigned int addrLen
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 46U); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 46U);
m_oSeqNo++;
return m_socket.write(buffer, 46U, addr, addrLen); return m_socket.write(buffer, 46U, addr, addrLen);
} }
@@ -829,15 +834,25 @@ bool CFMIAXNetwork::writeAck(const sockaddr_storage& addr, unsigned int addrLen,
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX ACK sent"); LogDebug("IAX ACK sent");
#endif #endif
unsigned short sCall = m_sCallNo | 0x8000U;
unsigned short sCallNo = 0U;
unsigned short dCallNo = 0U;
if (m_status == IAXS_REGISTERING) {
sCallNo = m_sAuthCallNo | 0x8000U;
dCallNo = m_dAuthCallNo;
} else {
sCallNo = m_sLinkCallNo | 0x8000U;
dCallNo = m_dLinkCallNo;
}
unsigned char buffer[15U]; unsigned char buffer[15U];
buffer[0U] = (sCall >> 8) & 0xFFU; buffer[0U] = (sCallNo >> 8) & 0xFFU;
buffer[1U] = (sCall >> 0) & 0xFFU; buffer[1U] = (sCallNo >> 0) & 0xFFU;
buffer[2U] = (m_dCallNo >> 8) & 0xFFU; buffer[2U] = (dCallNo >> 8) & 0xFFU;
buffer[3U] = (m_dCallNo >> 0) & 0xFFU; buffer[3U] = (dCallNo >> 0) & 0xFFU;
buffer[4U] = (ts >> 24) & 0xFFU; buffer[4U] = (ts >> 24) & 0xFFU;
buffer[5U] = (ts >> 16) & 0xFFU; buffer[5U] = (ts >> 16) & 0xFFU;
@@ -867,17 +882,16 @@ bool CFMIAXNetwork::writeLagRp(const sockaddr_storage& addr, unsigned int addrLe
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX LAGRP sent"); LogDebug("IAX LAGRP sent");
#endif #endif
m_oSeqNo++;
unsigned short sCall = m_sCallNo | 0x8000U; unsigned short sCall = m_sLinkCallNo | 0x8000U;
unsigned char buffer[15U]; unsigned char buffer[15U];
buffer[0U] = (sCall >> 8) & 0xFFU; buffer[0U] = (sCall >> 8) & 0xFFU;
buffer[1U] = (sCall >> 0) & 0xFFU; buffer[1U] = (sCall >> 0) & 0xFFU;
buffer[2U] = (m_dCallNo >> 8) & 0xFFU; buffer[2U] = (m_dLinkCallNo >> 8) & 0xFFU;
buffer[3U] = (m_dCallNo >> 0) & 0xFFU; buffer[3U] = (m_dLinkCallNo >> 0) & 0xFFU;
buffer[4U] = (ts >> 24) & 0xFFU; buffer[4U] = (ts >> 24) & 0xFFU;
buffer[5U] = (ts >> 16) & 0xFFU; buffer[5U] = (ts >> 16) & 0xFFU;
@@ -897,6 +911,8 @@ bool CFMIAXNetwork::writeLagRp(const sockaddr_storage& addr, unsigned int addrLe
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U);
m_oSeqNo++;
return m_socket.write(buffer, 12U, addr, addrLen); return m_socket.write(buffer, 12U, addr, addrLen);
} }
@@ -907,9 +923,8 @@ bool CFMIAXNetwork::writeLagRq(const sockaddr_storage& addr, unsigned int addrLe
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX LAGRQ sent"); LogDebug("IAX LAGRQ sent");
#endif #endif
m_oSeqNo++;
unsigned short sCall = m_sCallNo | 0x8000U; unsigned short sCall = m_sLinkCallNo | 0x8000U;
unsigned int ts = m_timestamp.elapsed(); unsigned int ts = m_timestamp.elapsed();
unsigned char buffer[15U]; unsigned char buffer[15U];
@@ -917,8 +932,8 @@ bool CFMIAXNetwork::writeLagRq(const sockaddr_storage& addr, unsigned int addrLe
buffer[0U] = (sCall >> 8) & 0xFFU; buffer[0U] = (sCall >> 8) & 0xFFU;
buffer[1U] = (sCall >> 0) & 0xFFU; buffer[1U] = (sCall >> 0) & 0xFFU;
buffer[2U] = (m_dCallNo >> 8) & 0xFFU; buffer[2U] = (m_dLinkCallNo >> 8) & 0xFFU;
buffer[3U] = (m_dCallNo >> 0) & 0xFFU; buffer[3U] = (m_dLinkCallNo >> 0) & 0xFFU;
buffer[4U] = (ts >> 24) & 0xFFU; buffer[4U] = (ts >> 24) & 0xFFU;
buffer[5U] = (ts >> 16) & 0xFFU; buffer[5U] = (ts >> 16) & 0xFFU;
@@ -938,6 +953,8 @@ bool CFMIAXNetwork::writeLagRq(const sockaddr_storage& addr, unsigned int addrLe
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U);
m_oSeqNo++;
return m_socket.write(buffer, 12U, addr, addrLen); return m_socket.write(buffer, 12U, addr, addrLen);
} }
@@ -946,9 +963,8 @@ bool CFMIAXNetwork::writeHangup()
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX HANGUP sent"); LogDebug("IAX HANGUP sent");
#endif #endif
m_oSeqNo++;
unsigned short sCall = m_sCallNo | 0x8000U; unsigned short sCall = m_sLinkCallNo | 0x8000U;
unsigned int ts = m_timestamp.elapsed(); unsigned int ts = m_timestamp.elapsed();
unsigned char buffer[50U]; unsigned char buffer[50U];
@@ -956,8 +972,8 @@ bool CFMIAXNetwork::writeHangup()
buffer[0U] = (sCall >> 8) & 0xFFU; buffer[0U] = (sCall >> 8) & 0xFFU;
buffer[1U] = (sCall >> 0) & 0xFFU; buffer[1U] = (sCall >> 0) & 0xFFU;
buffer[2U] = (m_dCallNo >> 8) & 0xFFU; buffer[2U] = (m_dLinkCallNo >> 8) & 0xFFU;
buffer[3U] = (m_dCallNo >> 0) & 0xFFU; buffer[3U] = (m_dLinkCallNo >> 0) & 0xFFU;
buffer[4U] = (ts >> 24) & 0xFFU; buffer[4U] = (ts >> 24) & 0xFFU;
buffer[5U] = (ts >> 16) & 0xFFU; buffer[5U] = (ts >> 16) & 0xFFU;
@@ -981,6 +997,8 @@ bool CFMIAXNetwork::writeHangup()
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, length); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, length);
m_oSeqNo++;
return m_socket.write(buffer, length, m_serverAddr, m_serverAddrLen); return m_socket.write(buffer, length, m_serverAddr, m_serverAddrLen);
} }
@@ -1050,8 +1068,8 @@ bool CFMIAXNetwork::writeRegReq()
LogDebug("IAX REGREQ sent"); LogDebug("IAX REGREQ sent");
#endif #endif
unsigned short sCall = m_sCallNo | 0x8000U; unsigned short sCall = m_sAuthCallNo | 0x8000U;
unsigned short dCall = m_dCallNo; unsigned short dCall = m_dAuthCallNo;
unsigned int ts = m_timestamp.elapsed(); unsigned int ts = m_timestamp.elapsed();
@@ -1081,7 +1099,7 @@ bool CFMIAXNetwork::writeRegReq()
setIEUInt16(buffer, pos, IAX_IE_REFRESH, REFRESH_TIME); setIEUInt16(buffer, pos, IAX_IE_REFRESH, REFRESH_TIME);
if (m_dCallNo > 0U) { if (m_dAuthCallNo > 0U) {
std::string password = m_seed + m_password; std::string password = m_seed + m_password;
#if defined(_WIN32) || defined(_WIN64) #if defined(_WIN32) || defined(_WIN64)
@@ -1134,6 +1152,8 @@ bool CFMIAXNetwork::writeRegReq()
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, length); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, length);
m_oSeqNo++;
return m_socket.write(buffer, length, m_domainAddr, m_domainAddrLen); return m_socket.write(buffer, length, m_domainAddr, m_domainAddrLen);
} }
@@ -1145,9 +1165,8 @@ bool CFMIAXNetwork::writeAudio(const short* audio, unsigned int length)
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX ULAW sent"); LogDebug("IAX ULAW sent");
#endif #endif
m_oSeqNo++;
unsigned short sCall = m_sCallNo | 0x8000U; unsigned short sCall = m_sLinkCallNo | 0x8000U;
unsigned int ts = m_timestamp.elapsed(); unsigned int ts = m_timestamp.elapsed();
unsigned char buffer[300U]; unsigned char buffer[300U];
@@ -1155,8 +1174,8 @@ bool CFMIAXNetwork::writeAudio(const short* audio, unsigned int length)
buffer[0U] = (sCall >> 8) & 0xFFU; buffer[0U] = (sCall >> 8) & 0xFFU;
buffer[1U] = (sCall >> 0) & 0xFFU; buffer[1U] = (sCall >> 0) & 0xFFU;
buffer[2U] = (m_dCallNo >> 8) & 0xFFU; buffer[2U] = (m_dLinkCallNo >> 8) & 0xFFU;
buffer[3U] = (m_dCallNo >> 0) & 0xFFU; buffer[3U] = (m_dLinkCallNo >> 0) & 0xFFU;
buffer[4U] = (ts >> 24) & 0xFFU; buffer[4U] = (ts >> 24) & 0xFFU;
buffer[5U] = (ts >> 16) & 0xFFU; buffer[5U] = (ts >> 16) & 0xFFU;
@@ -1178,6 +1197,8 @@ bool CFMIAXNetwork::writeAudio(const short* audio, unsigned int length)
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U + length); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U + length);
m_oSeqNo++;
return m_socket.write(buffer, 12U + length, m_serverAddr, m_serverAddrLen); return m_socket.write(buffer, 12U + length, m_serverAddr, m_serverAddrLen);
} }
@@ -1193,8 +1214,8 @@ bool CFMIAXNetwork::writeMiniFrame(const short* audio, unsigned int length)
unsigned char buffer[300U]; unsigned char buffer[300U];
buffer[0U] = (m_sCallNo >> 8) & 0xFFU; buffer[0U] = (m_sLinkCallNo >> 8) & 0xFFU;
buffer[1U] = (m_sCallNo >> 0) & 0xFFU; buffer[1U] = (m_sLinkCallNo >> 0) & 0xFFU;
buffer[2U] = (ts >> 8) & 0xFFU; buffer[2U] = (ts >> 8) & 0xFFU;
buffer[3U] = (ts >> 0) & 0xFFU; buffer[3U] = (ts >> 0) & 0xFFU;

View File

@@ -83,8 +83,10 @@ private:
CTimer m_pingTimer; CTimer m_pingTimer;
std::string m_seed; std::string m_seed;
CStopWatch m_timestamp; CStopWatch m_timestamp;
unsigned short m_sCallNo; unsigned short m_sAuthCallNo;
unsigned short m_dCallNo; unsigned short m_dAuthCallNo;
unsigned short m_sLinkCallNo;
unsigned short m_dLinkCallNo;
unsigned char m_iSeqNo; unsigned char m_iSeqNo;
unsigned char m_oSeqNo; unsigned char m_oSeqNo;
std::string m_callToken; std::string m_callToken;

View File

@@ -19,6 +19,6 @@
#if !defined(VERSION_H) #if !defined(VERSION_H)
#define VERSION_H #define VERSION_H
const char* VERSION = "20240807"; const char* VERSION = "20240808";
#endif #endif