Further changes for IAX based on tracing by Lenny.

This commit is contained in:
Jonathan Naylor
2024-07-16 16:17:40 +01:00
parent a701536839
commit d290fcd632
6 changed files with 144 additions and 114 deletions

View File

@@ -290,9 +290,10 @@ m_pocsagNetworkModeHang(3U),
m_pocsagNetworkDebug(false), m_pocsagNetworkDebug(false),
m_fmNetworkEnabled(false), m_fmNetworkEnabled(false),
m_fmNetworkProtocol("USRP"), m_fmNetworkProtocol("USRP"),
m_fmNetworkUsername("Dave"), m_fmNetworkDomain("register.allstarlink.org"),
m_fmNetworkPassword("PASSWORD"), m_fmNetworkPassword(),
m_fmNetworkNode("Node1"), m_fmNetworkSource(),
m_fmNetworkDestination(),
m_fmNetworkSampleRate(48000U), m_fmNetworkSampleRate(48000U),
m_fmNetworkSquelchFile(), m_fmNetworkSquelchFile(),
m_fmGatewayAddress(), m_fmGatewayAddress(),
@@ -1041,12 +1042,14 @@ bool CConf::read()
m_fmNetworkEnabled = ::atoi(value) == 1; m_fmNetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Protocol") == 0) else if (::strcmp(key, "Protocol") == 0)
m_fmNetworkProtocol = value; m_fmNetworkProtocol = value;
else if (::strcmp(key, "Username") == 0) else if (::strcmp(key, "Domain") == 0)
m_fmNetworkUsername = value; m_fmNetworkDomain = value;
else if (::strcmp(key, "Password") == 0) else if (::strcmp(key, "Password") == 0)
m_fmNetworkPassword = value; m_fmNetworkPassword = value;
else if (::strcmp(key, "Node") == 0) else if (::strcmp(key, "Source") == 0)
m_fmNetworkNode = value; m_fmNetworkSource = value;
else if (::strcmp(key, "Destination") == 0)
m_fmNetworkDestination = value;
else if (::strcmp(key, "SampleRate") == 0) else if (::strcmp(key, "SampleRate") == 0)
m_fmNetworkSampleRate = (unsigned int)::atoi(value); m_fmNetworkSampleRate = (unsigned int)::atoi(value);
else if (::strcmp(key, "SquelchFile") == 0) else if (::strcmp(key, "SquelchFile") == 0)
@@ -2297,9 +2300,9 @@ std::string CConf::getFMNetworkProtocol() const
return m_fmNetworkProtocol; return m_fmNetworkProtocol;
} }
std::string CConf::getFMNetworkUsername() const std::string CConf::getFMNetworkDomain() const
{ {
return m_fmNetworkUsername; return m_fmNetworkDomain;
} }
std::string CConf::getFMNetworkPassword() const std::string CConf::getFMNetworkPassword() const
@@ -2307,9 +2310,14 @@ std::string CConf::getFMNetworkPassword() const
return m_fmNetworkPassword; return m_fmNetworkPassword;
} }
std::string CConf::getFMNetworkNode() const std::string CConf::getFMNetworkSource() const
{ {
return m_fmNetworkNode; return m_fmNetworkSource;
}
std::string CConf::getFMNetworkDestination() const
{
return m_fmNetworkDestination;
} }
unsigned int CConf::getFMNetworkSampleRate() const unsigned int CConf::getFMNetworkSampleRate() const

10
Conf.h
View File

@@ -303,9 +303,10 @@ public:
// The FM Network section // The FM Network section
bool getFMNetworkEnabled() const; bool getFMNetworkEnabled() const;
std::string getFMNetworkProtocol() const; std::string getFMNetworkProtocol() const;
std::string getFMNetworkUsername() const; std::string getFMNetworkDomain() const;
std::string getFMNetworkPassword() const; std::string getFMNetworkPassword() const;
std::string getFMNetworkNode() const; std::string getFMNetworkSource() const;
std::string getFMNetworkDestination() const;
unsigned int getFMNetworkSampleRate() const; unsigned int getFMNetworkSampleRate() const;
std::string getFMNetworkSquelchFile() const; std::string getFMNetworkSquelchFile() const;
std::string getFMGatewayAddress() const; std::string getFMGatewayAddress() const;
@@ -628,9 +629,10 @@ private:
bool m_fmNetworkEnabled; bool m_fmNetworkEnabled;
std::string m_fmNetworkProtocol; std::string m_fmNetworkProtocol;
std::string m_fmNetworkUsername; std::string m_fmNetworkDomain;
std::string m_fmNetworkPassword; std::string m_fmNetworkPassword;
std::string m_fmNetworkNode; std::string m_fmNetworkSource;
std::string m_fmNetworkDestination;
unsigned int m_fmNetworkSampleRate; unsigned int m_fmNetworkSampleRate;
std::string m_fmNetworkSquelchFile; std::string m_fmNetworkSquelchFile;
std::string m_fmGatewayAddress; std::string m_fmGatewayAddress;

View File

@@ -126,20 +126,21 @@ const unsigned int BUFFER_LENGTH = 1500U;
#define MD5_DIGEST_STRING_LENGTH 16 #define MD5_DIGEST_STRING_LENGTH 16
#endif #endif
CFMIAXNetwork::CFMIAXNetwork(const std::string& callsign, const std::string& username, const std::string& password, const std::string& node, const std::string& localAddress, unsigned short localPort, const std::string& gatewayAddress, unsigned short gatewayPort, bool debug) : CFMIAXNetwork::CFMIAXNetwork(const std::string& domain, const std::string& password, const std::string& source, const std::string& destination, const std::string& localAddress, unsigned short localPort, const std::string& gatewayAddress, unsigned short gatewayPort, bool debug) :
m_callsign(callsign),
m_username(username),
m_password(password), m_password(password),
m_node(node), m_source(source),
m_destination(destination),
m_socket(localAddress, localPort), m_socket(localAddress, localPort),
m_addr(), m_domainAddr(),
m_addrLen(0U), m_domainAddrLen(0U),
m_serverAddr(),
m_serverAddrLen(0U),
m_debug(debug), m_debug(debug),
m_enabled(false), m_enabled(false),
m_buffer(2000U, "FM Network"), m_buffer(2000U, "FM Network"),
m_status(IAXS_DISCONNECTED), m_status(IAXS_DISCONNECTED),
m_retryTimer(1000U, 0U, 500U), m_retryTimer(1000U, 0U, 500U),
m_pingTimer(1000U, 20U), m_pingTimer(1000U, 2U),
m_seed(), m_seed(),
m_timestamp(), m_timestamp(),
m_sCallNo(0U), m_sCallNo(0U),
@@ -159,20 +160,18 @@ m_random()
, m_provider(0UL) , m_provider(0UL)
#endif #endif
{ {
assert(!callsign.empty()); assert(!domain.empty());
assert(!username.empty());
assert(!password.empty()); assert(!password.empty());
assert(!node.empty()); assert(!source.empty());
assert(!destination.empty());
assert(gatewayPort > 0U); assert(gatewayPort > 0U);
assert(!gatewayAddress.empty()); assert(!gatewayAddress.empty());
if (CUDPSocket::lookup(gatewayAddress, gatewayPort, m_addr, m_addrLen) != 0) if (CUDPSocket::lookup(domain, gatewayPort, m_domainAddr, m_domainAddrLen) != 0)
m_addrLen = 0U; m_domainAddrLen = 0U;
// Remove any trailing letters in the callsign if (CUDPSocket::lookup(gatewayAddress, gatewayPort, m_serverAddr, m_serverAddrLen) != 0)
size_t pos = callsign.find_first_of(' '); m_serverAddrLen = 0U;
if (pos != std::string::npos)
m_callsign = callsign.substr(0U, pos);
std::random_device rd; std::random_device rd;
std::mt19937 mt(rd()); std::mt19937 mt(rd());
@@ -185,8 +184,13 @@ CFMIAXNetwork::~CFMIAXNetwork()
bool CFMIAXNetwork::open() bool CFMIAXNetwork::open()
{ {
if (m_addrLen == 0U) { if (m_domainAddrLen == 0U) {
LogError("Unable to resolve the address of the FM Gateway"); LogError("Unable to resolve the address of the ASL Registration Server");
return false;
}
if (m_serverAddrLen == 0U) {
LogError("Unable to resolve the address of the IAX Gateway");
return false; return false;
} }
@@ -199,7 +203,7 @@ bool CFMIAXNetwork::open()
} }
#endif #endif
bool ret = m_socket.open(m_addr); bool ret = m_socket.open(m_domainAddr);
if (!ret) if (!ret)
return false; return false;
@@ -291,20 +295,21 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_pingTimer.clock(ms); m_pingTimer.clock(ms);
if (m_pingTimer.isRunning() && m_pingTimer.hasExpired()) { if (m_pingTimer.isRunning() && m_pingTimer.hasExpired()) {
writePing(); writePing(m_serverAddr, m_serverAddrLen);
m_pingTimer.start(); m_pingTimer.start();
} }
unsigned char buffer[BUFFER_LENGTH]; unsigned char buffer[BUFFER_LENGTH];
sockaddr_storage addr; sockaddr_storage addr;
unsigned int addrlen; unsigned int addrLen;
int length = m_socket.read(buffer, BUFFER_LENGTH, addr, addrlen); int length = m_socket.read(buffer, BUFFER_LENGTH, addr, addrLen);
if (length <= 0) if (length <= 0)
return; return;
// Check if the data is for us // Check if the data is for us
if (!CUDPSocket::match(addr, m_addr, IMT_ADDRESS_AND_PORT)) { if (!CUDPSocket::match(addr, m_domainAddr, IMT_ADDRESS_AND_PORT) &&
!CUDPSocket::match(addr, m_serverAddr, IMT_ADDRESS_AND_PORT)) {
LogMessage("FM IAX packet received from an invalid source"); LogMessage("FM IAX packet received from an invalid source");
return; return;
} }
@@ -334,8 +339,8 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
writePong(ts); writePong(addr, addrLen, ts);
} else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_PONG)) { } else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_PONG)) {
#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);
@@ -344,7 +349,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
} else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_CALLTOKEN)) { } else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_CALLTOKEN)) {
#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);
@@ -363,7 +368,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
LogMessage("IAX ACCEPT received"); LogMessage("IAX ACCEPT received");
writeAck(ts); writeAck(addr, addrLen, ts);
m_status = IAXS_CONNECTED; m_status = IAXS_CONNECTED;
m_retryTimer.stop(); m_retryTimer.stop();
@@ -377,7 +382,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
m_status = IAXS_DISCONNECTED; m_status = IAXS_DISCONNECTED;
m_keyed = false; m_keyed = false;
@@ -392,7 +397,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
m_status = IAXS_DISCONNECTED; m_status = IAXS_DISCONNECTED;
m_keyed = false; m_keyed = false;
@@ -407,7 +412,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
uint16_t method = getIEUInt16(buffer, length, IAX_IE_AUTHMETHODS); uint16_t method = getIEUInt16(buffer, length, IAX_IE_AUTHMETHODS);
if ((method & IAX_AUTH_MD5) == 0x00U) { if ((method & IAX_AUTH_MD5) == 0x00U) {
@@ -435,17 +440,15 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
m_status = IAXS_REGISTERED; m_status = IAXS_REGISTERED;
m_retryTimer.stop();
m_pingTimer.start();
writeNew(); writeNew();
m_status = IAXS_CONNECTING; m_status = IAXS_CONNECTING;
m_retryTimer.stop(); m_retryTimer.start();
m_pingTimer.start(); m_pingTimer.stop();
} else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_HANGUP)) { } else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_HANGUP)) {
#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);
@@ -453,7 +456,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
LogError("Hangup from the IAX gateway"); LogError("Hangup from the IAX gateway");
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
m_status = IAXS_DISCONNECTED; m_status = IAXS_DISCONNECTED;
m_keyed = false; m_keyed = false;
@@ -469,7 +472,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
LogMessage("IAX ANSWER received"); LogMessage("IAX ANSWER received");
writeAck(ts); writeAck(addr, addrLen, ts);
} else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_VNAK)) { } else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_VNAK)) {
#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);
@@ -479,7 +482,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
} else if (compareFrame(buffer, AST_FRAME_TEXT, 0U)) { } else if (compareFrame(buffer, AST_FRAME_TEXT, 0U)) {
#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);
@@ -488,7 +491,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
LogMessage("IAX TEXT received - %.*s", length - 12U, buffer + 12U); LogMessage("IAX TEXT received - %.*s", length - 12U, buffer + 12U);
writeAck(ts); writeAck(addr, addrLen, ts);
} else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_LAGRQ)) { } else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_LAGRQ)) {
#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);
@@ -497,8 +500,8 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeLagRq(); writeLagRq(addr, addrLen);
writeLagRp(ts); writeLagRp(addr, addrLen, ts);
} else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_LAGRP)) { } else if (compareFrame(buffer, AST_FRAME_IAX, IAX_COMMAND_LAGRP)) {
#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);
@@ -507,7 +510,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
} else if (compareFrame(buffer, AST_FRAME_CONTROL, AST_CONTROL_KEY)) { } else if (compareFrame(buffer, AST_FRAME_CONTROL, AST_CONTROL_KEY)) {
#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);
@@ -516,7 +519,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
m_keyed = true; m_keyed = true;
} else if (compareFrame(buffer, AST_FRAME_CONTROL, AST_CONTROL_UNKEY)) { } else if (compareFrame(buffer, AST_FRAME_CONTROL, AST_CONTROL_UNKEY)) {
@@ -527,7 +530,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
m_keyed = false; m_keyed = false;
} else if (compareFrame(buffer, AST_FRAME_VOICE, AST_FORMAT_ULAW)) { } else if (compareFrame(buffer, AST_FRAME_VOICE, AST_FORMAT_ULAW)) {
@@ -538,7 +541,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
if (!m_enabled) if (!m_enabled)
return; return;
@@ -564,7 +567,7 @@ void CFMIAXNetwork::clock(unsigned int ms)
m_rxFrames++; m_rxFrames++;
m_iSeqNo = iSeqNo + 1U; m_iSeqNo = iSeqNo + 1U;
writeAck(ts); writeAck(addr, addrLen, ts);
} }
} }
@@ -665,9 +668,9 @@ bool CFMIAXNetwork::writeNew()
unsigned int pos = 0U; unsigned int pos = 0U;
setIEUInt16(buffer, pos, IAX_IE_VERSION, IAX_PROTO_VERSION); setIEUInt16(buffer, pos, IAX_IE_VERSION, IAX_PROTO_VERSION);
setIEString(buffer, pos, IAX_IE_CALLED_NUMBER, m_node); setIEString(buffer, pos, IAX_IE_CALLED_NUMBER, m_destination);
setIEString(buffer, pos, IAX_IE_CODEC_PREFS, "DMLC"); setIEString(buffer, pos, IAX_IE_CODEC_PREFS, "DMLC");
setIEString(buffer, pos, IAX_IE_CALLING_NUMBER, m_username); setIEString(buffer, pos, IAX_IE_CALLING_NUMBER, m_source);
setIEUInt8(buffer, pos, IAX_IE_CALLINGPRES, 0U); setIEUInt8(buffer, pos, IAX_IE_CALLINGPRES, 0U);
setIEUInt8(buffer, pos, IAX_IE_CALLINGTON, 0U); setIEUInt8(buffer, pos, IAX_IE_CALLINGTON, 0U);
setIEUInt16(buffer, pos, IAX_IE_CALLINGTNS, 0U); setIEUInt16(buffer, pos, IAX_IE_CALLINGTNS, 0U);
@@ -688,7 +691,7 @@ 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);
return m_socket.write(buffer, length, m_addr, m_addrLen); return m_socket.write(buffer, length, m_serverAddr, m_serverAddrLen);
} }
bool CFMIAXNetwork::writeKey(bool key) bool CFMIAXNetwork::writeKey(bool key)
@@ -727,11 +730,13 @@ 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);
return m_socket.write(buffer, 12U, m_addr, m_addrLen); return m_socket.write(buffer, 12U, m_serverAddr, m_serverAddrLen);
} }
bool CFMIAXNetwork::writePing() bool CFMIAXNetwork::writePing(const sockaddr_storage& addr, unsigned int addrLen)
{ {
assert(addrLen > 0U);
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX PING sent"); LogDebug("IAX PING sent");
#endif #endif
@@ -766,11 +771,13 @@ bool CFMIAXNetwork::writePing()
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U);
return m_socket.write(buffer, 12U, m_addr, m_addrLen); return m_socket.write(buffer, 12U, addr, addrLen);
} }
bool CFMIAXNetwork::writePong(unsigned int ts) bool CFMIAXNetwork::writePong(const sockaddr_storage& addr, unsigned int addrLen, unsigned int ts)
{ {
assert(addrLen > 0U);
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX PONG sent"); LogDebug("IAX PONG sent");
#endif #endif
@@ -817,11 +824,13 @@ bool CFMIAXNetwork::writePong(unsigned int ts)
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 46U); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 46U);
return m_socket.write(buffer, 46U, m_addr, m_addrLen); return m_socket.write(buffer, 46U, addr, addrLen);
} }
bool CFMIAXNetwork::writeAck(unsigned int ts) bool CFMIAXNetwork::writeAck(const sockaddr_storage& addr, unsigned int addrLen, unsigned int ts)
{ {
assert(addrLen > 0U);
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX ACK sent"); LogDebug("IAX ACK sent");
#endif #endif
@@ -853,11 +862,13 @@ bool CFMIAXNetwork::writeAck(unsigned int ts)
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U);
return m_socket.write(buffer, 12U, m_addr, m_addrLen); return m_socket.write(buffer, 12U, addr, addrLen);
} }
bool CFMIAXNetwork::writeLagRp(unsigned int ts) bool CFMIAXNetwork::writeLagRp(const sockaddr_storage& addr, unsigned int addrLen, unsigned int ts)
{ {
assert(addrLen > 0U);
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX LAGRP sent"); LogDebug("IAX LAGRP sent");
#endif #endif
@@ -891,11 +902,13 @@ bool CFMIAXNetwork::writeLagRp(unsigned int ts)
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U);
return m_socket.write(buffer, 12U, m_addr, m_addrLen); return m_socket.write(buffer, 12U, addr, addrLen);
} }
bool CFMIAXNetwork::writeLagRq() bool CFMIAXNetwork::writeLagRq(const sockaddr_storage& addr, unsigned int addrLen)
{ {
assert(addrLen > 0U);
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX LAGRQ sent"); LogDebug("IAX LAGRQ sent");
#endif #endif
@@ -930,7 +943,7 @@ bool CFMIAXNetwork::writeLagRq()
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 12U);
return m_socket.write(buffer, 12U, m_addr, m_addrLen); return m_socket.write(buffer, 12U, addr, addrLen);
} }
bool CFMIAXNetwork::writeHangup() bool CFMIAXNetwork::writeHangup()
@@ -967,7 +980,7 @@ bool CFMIAXNetwork::writeHangup()
buffer[11U] = IAX_COMMAND_HANGUP; buffer[11U] = IAX_COMMAND_HANGUP;
unsigned int pos = 0U; unsigned int pos = 0U;
unsigned int length = setIEString(buffer, pos, IAX_IE_CAUSE, REASON); unsigned int length = setIEUInt8(buffer, pos, IAX_IE_CAUSE, 0x00U);
#if !defined(DEBUG_IAX) #if !defined(DEBUG_IAX)
if (m_debug) if (m_debug)
@@ -975,7 +988,7 @@ bool CFMIAXNetwork::writeHangup()
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, length); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, length);
return m_socket.write(buffer, length, m_addr, (unsigned int)m_addrLen); return m_socket.write(buffer, length, m_serverAddr, m_serverAddrLen);
} }
void CFMIAXNetwork::uLawEncode(const short* audio, unsigned char* buffer, unsigned int length) const void CFMIAXNetwork::uLawEncode(const short* audio, unsigned char* buffer, unsigned int length) const
@@ -1071,7 +1084,7 @@ bool CFMIAXNetwork::writeRegReq()
buffer[11U] = IAX_COMMAND_REGREQ; buffer[11U] = IAX_COMMAND_REGREQ;
unsigned int pos = 0U; unsigned int pos = 0U;
setIEString(buffer, pos, IAX_IE_USERNAME, m_username); setIEString(buffer, pos, IAX_IE_USERNAME, m_source);
setIEUInt16(buffer, pos, IAX_IE_REFRESH, REFRESH_TIME); setIEUInt16(buffer, pos, IAX_IE_REFRESH, REFRESH_TIME);
@@ -1120,11 +1133,14 @@ 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);
return m_socket.write(buffer, length, m_addr, m_addrLen); return m_socket.write(buffer, length, m_domainAddr, m_domainAddrLen);
} }
bool CFMIAXNetwork::writeAudio(const short* audio, unsigned int length) bool CFMIAXNetwork::writeAudio(const short* audio, unsigned int length)
{ {
assert(audio != NULL);
assert(length > 0U);
#if defined(DEBUG_IAX) #if defined(DEBUG_IAX)
LogDebug("IAX ULAW sent"); LogDebug("IAX ULAW sent");
#endif #endif
@@ -1161,7 +1177,7 @@ 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);
return m_socket.write(buffer, 12U + length, m_addr, m_addrLen); return m_socket.write(buffer, 12U + length, m_serverAddr, m_serverAddrLen);
} }
bool CFMIAXNetwork::writeMiniFrame(const short* audio, unsigned int length) bool CFMIAXNetwork::writeMiniFrame(const short* audio, unsigned int length)
@@ -1189,7 +1205,7 @@ bool CFMIAXNetwork::writeMiniFrame(const short* audio, unsigned int length)
#endif #endif
CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 4U + length); CUtils::dump(1U, "FM IAX Network Data Sent", buffer, 4U + length);
return m_socket.write(buffer, 4U + length, m_addr, m_addrLen); return m_socket.write(buffer, 4U + length, m_serverAddr, m_serverAddrLen);
} }
bool CFMIAXNetwork::compareFrame(const unsigned char* buffer, unsigned char type1, unsigned char type2) const bool CFMIAXNetwork::compareFrame(const unsigned char* buffer, unsigned char type1, unsigned char type2) const

View File

@@ -45,7 +45,7 @@ enum IAX_STATUS {
class CFMIAXNetwork : public IFMNetwork { class CFMIAXNetwork : public IFMNetwork {
public: public:
CFMIAXNetwork(const std::string& callsign, const std::string& username, const std::string& password, const std::string& node, const std::string& localAddress, unsigned short localPort, const std::string& gatewayAddress, unsigned short gatewayPort, bool debug); CFMIAXNetwork(const std::string& domain, const std::string& password, const std::string& source, const std::string& destination, const std::string& localAddress, unsigned short localPort, const std::string& gatewayAddress, unsigned short gatewayPort, bool debug);
virtual ~CFMIAXNetwork(); virtual ~CFMIAXNetwork();
virtual bool open(); virtual bool open();
@@ -67,13 +67,14 @@ public:
virtual void clock(unsigned int ms); virtual void clock(unsigned int ms);
private: private:
std::string m_callsign;
std::string m_username;
std::string m_password; std::string m_password;
std::string m_node; std::string m_source;
std::string m_destination;
CUDPSocket m_socket; CUDPSocket m_socket;
sockaddr_storage m_addr; sockaddr_storage m_domainAddr;
unsigned int m_addrLen; unsigned int m_domainAddrLen;
sockaddr_storage m_serverAddr;
unsigned int m_serverAddrLen;
bool m_debug; bool m_debug;
bool m_enabled; bool m_enabled;
CRingBuffer<unsigned char> m_buffer; CRingBuffer<unsigned char> m_buffer;
@@ -101,11 +102,11 @@ private:
bool writeNew(); bool writeNew();
bool writeKey(bool key); bool writeKey(bool key);
bool writePing(); bool writePing(const sockaddr_storage& addr, unsigned int addrLen);
bool writePong(unsigned int ts); bool writePong(const sockaddr_storage& addr, unsigned int addrLen, unsigned int ts);
bool writeAck(unsigned int ts); bool writeAck(const sockaddr_storage& addr, unsigned int addrLen, unsigned int ts);
bool writeLagRq(); bool writeLagRq(const sockaddr_storage& addr, unsigned int addrLen);
bool writeLagRp(unsigned int ts); bool writeLagRp(const sockaddr_storage& addr, unsigned int addrLen, unsigned int ts);
bool writeHangup(); bool writeHangup();
bool writeRegReq(); bool writeRegReq();
bool writeAudio(const short* audio, unsigned int length); bool writeAudio(const short* audio, unsigned int length);

View File

@@ -44,7 +44,7 @@ Time=24
[Modem] [Modem]
# Valid values are "null", "uart", "udp", and (on Linux) "i2c" # Valid values are "null", "uart", "udp", and (on Linux) "i2c"
Protocol=uart Protocol=null
# The port and speed used for a UART connection # The port and speed used for a UART connection
# UARTPort=\\.\COM4 # UARTPort=\\.\COM4
# UARTPort=/dev/ttyACM0 # UARTPort=/dev/ttyACM0
@@ -94,7 +94,7 @@ LocalPort=40095
# SendFrameType=0 # SendFrameType=0
[D-Star] [D-Star]
Enable=1 Enable=0
Module=C Module=C
SelfOnly=0 SelfOnly=0
AckReply=1 AckReply=1
@@ -106,7 +106,7 @@ RemoteGateway=0
WhiteList= WhiteList=
[DMR] [DMR]
Enable=1 Enable=0
Beacons=0 Beacons=0
BeaconInterval=60 BeaconInterval=60
BeaconDuration=3 BeaconDuration=3
@@ -124,7 +124,7 @@ TXHang=4
# OVCM=0 # OVCM=0
[System Fusion] [System Fusion]
Enable=1 Enable=0
LowDeviation=0 LowDeviation=0
SelfOnly=0 SelfOnly=0
TXHang=4 TXHang=4
@@ -132,7 +132,7 @@ RemoteGateway=0
# ModeHang=10 # ModeHang=10
[P25] [P25]
Enable=1 Enable=0
NAC=293 NAC=293
SelfOnly=0 SelfOnly=0
OverrideUIDCheck=0 OverrideUIDCheck=0
@@ -141,7 +141,7 @@ TXHang=5
# ModeHang=10 # ModeHang=10
[NXDN] [NXDN]
Enable=1 Enable=0
RAN=1 RAN=1
SelfOnly=0 SelfOnly=0
RemoteGateway=0 RemoteGateway=0
@@ -149,14 +149,14 @@ TXHang=5
# ModeHang=10 # ModeHang=10
[M17] [M17]
Enable=1 Enable=0
CAN=0 CAN=0
SelfOnly=0 SelfOnly=0
TXHang=5 TXHang=5
# ModeHang=10 # ModeHang=10
[POCSAG] [POCSAG]
Enable=1 Enable=0
Frequency=439987500 Frequency=439987500
[FM] [FM]
@@ -206,7 +206,7 @@ ExtAudioBoost=1
# ModeHang=10 # ModeHang=10
[AX.25] [AX.25]
Enable=1 Enable=0
TXDelay=300 TXDelay=300
RXTwist=6 RXTwist=6
SlotTime=30 SlotTime=30
@@ -288,11 +288,11 @@ Debug=0
[FM Network] [FM Network]
Enable=1 Enable=1
# Protocol may be USRP, RAW, or IAX # Protocol may be USRP, RAW, or IAX
Protocol=USRP Protocol=IAX
LocalAddress=127.0.0.1 # LocalAddress=127.0.0.1
LocalPort=3810 LocalPort=4569
GatewayAddress=127.0.0.1 GatewayAddress=209.112.244.27
GatewayPort=4810 GatewayPort=4569
PreEmphasis=1 PreEmphasis=1
DeEmphasis=1 DeEmphasis=1
TXAudioGain=1.0 TXAudioGain=1.0
@@ -303,10 +303,11 @@ Debug=0
SampleRate=48000 SampleRate=48000
# The squelch file is optional # The squelch file is optional
SquelchFile=/tmp/sql SquelchFile=/tmp/sql
# Username, Password, and Node are IAX only options # Domain, Password, Source, and Destination are IAX only options
Username=Dave Domain=register.allstarlink.org
Password=PASSWORD Password=PASSWORD
Node=Node1 Source=12345
Destination=54321
[AX.25 Network] [AX.25 Network]
Enable=1 Enable=1

View File

@@ -1888,9 +1888,10 @@ bool CMMDVMHost::createPOCSAGNetwork()
bool CMMDVMHost::createFMNetwork() bool CMMDVMHost::createFMNetwork()
{ {
std::string callsign = m_conf.getFMCallsign(); std::string callsign = m_conf.getFMCallsign();
std::string username = m_conf.getFMNetworkUsername(); std::string domain = m_conf.getFMNetworkDomain();
std::string password = m_conf.getFMNetworkPassword(); std::string password = m_conf.getFMNetworkPassword();
std::string node = m_conf.getFMNetworkNode(); std::string source = m_conf.getFMNetworkSource();
std::string destination = m_conf.getFMNetworkDestination();
std::string protocol = m_conf.getFMNetworkProtocol(); std::string protocol = m_conf.getFMNetworkProtocol();
unsigned int sampleRate = m_conf.getFMNetworkSampleRate(); unsigned int sampleRate = m_conf.getFMNetworkSampleRate();
std::string squelchFile = m_conf.getFMNetworkSquelchFile(); std::string squelchFile = m_conf.getFMNetworkSquelchFile();
@@ -1923,8 +1924,9 @@ bool CMMDVMHost::createFMNetwork()
} }
if (protocol == "IAX") { if (protocol == "IAX") {
LogInfo(" Username: %s", username.c_str()); LogInfo(" Domain: %s", domain.c_str());
LogInfo(" Node: %s", node.c_str()); LogInfo(" Source: %s", source.c_str());
LogInfo(" Destiation: %s", destination.c_str());
} }
if (protocol == "USRP") { if (protocol == "USRP") {
@@ -1932,7 +1934,7 @@ bool CMMDVMHost::createFMNetwork()
} else if (protocol == "RAW") { } else if (protocol == "RAW") {
m_fmNetwork = new CFMRAWNetwork(localAddress, localPort, gatewayAddress, gatewayPort, sampleRate, squelchFile, debug); m_fmNetwork = new CFMRAWNetwork(localAddress, localPort, gatewayAddress, gatewayPort, sampleRate, squelchFile, debug);
} else if (protocol == "IAX") { } else if (protocol == "IAX") {
m_fmNetwork = new CFMIAXNetwork(callsign, username, password, node, localAddress, localPort, gatewayAddress, gatewayPort, debug); m_fmNetwork = new CFMIAXNetwork(domain, password, source, destination, localAddress, localPort, gatewayAddress, gatewayPort, debug);
} else { } else {
LogError("Invalid FM network protocol specified - %s", protocol.c_str()); LogError("Invalid FM network protocol specified - %s", protocol.c_str());
return false; return false;