correct bad implementation of RTP SSRC, SSRC should be the *sending* peer ID;

pull/32/head
Bryan Biedenkapp 3 years ago
parent 412d6cfc7c
commit 0374ed2f54

@ -913,7 +913,7 @@ bool FNENetwork::writePeer(uint32_t peerId, FrameQueue::OpcodePair opcode, const
sockaddr_storage addr = m_peers[peerId].socketStorage();
uint32_t addrLen = m_peers[peerId].sockStorageLen();
m_frameQueue->enqueueMessage(data, length, streamId, peerId, opcode, pktSeq, addr, addrLen);
m_frameQueue->enqueueMessage(data, length, streamId, peerId, m_peerId, opcode, pktSeq, addr, addrLen);
if (queueOnly)
return true;
return m_frameQueue->flushQueue();
@ -1041,7 +1041,7 @@ bool FNENetwork::writePeerNAK(uint32_t peerId, const char* tag, sockaddr_storage
LogWarning(LOG_NET, "%s from unauth PEER %u", tag, peerId);
m_frameQueue->enqueueMessage(buffer, 10U, createStreamId(), peerId,
m_frameQueue->enqueueMessage(buffer, 10U, createStreamId(), peerId, m_peerId,
{ NET_FUNC_NAK, NET_SUBFUNC_NOP }, 0U, addr, addrLen);
return m_frameQueue->flushQueue();
}
@ -1060,7 +1060,7 @@ void FNENetwork::writePeers(FrameQueue::OpcodePair opcode, const uint8_t* data,
uint32_t addrLen = peer.second.sockStorageLen();
uint16_t pktSeq = peer.second.pktLastSeq();
m_frameQueue->enqueueMessage(data, length, streamId, peerId, opcode, pktSeq, addr, addrLen);
m_frameQueue->enqueueMessage(data, length, streamId, peerId, m_peerId, opcode, pktSeq, addr, addrLen);
}
m_frameQueue->flushQueue();
@ -1080,7 +1080,7 @@ void FNENetwork::writePeers(FrameQueue::OpcodePair opcode, const uint8_t* data,
sockaddr_storage addr = peer.second.socketStorage();
uint32_t addrLen = peer.second.sockStorageLen();
m_frameQueue->enqueueMessage(data, length, streamId, peerId, opcode, pktSeq, addr, addrLen);
m_frameQueue->enqueueMessage(data, length, streamId, peerId, m_peerId, opcode, pktSeq, addr, addrLen);
}
m_frameQueue->flushQueue();

@ -133,11 +133,6 @@ UInt8Array FrameQueue::read(int& messageLength, sockaddr_storage& address, uint3
*fneHeader = _fneHeader;
}
// ensure the RTP synchronization source ID matches the FNE stream ID
if (_rtpHeader.getSSRC() != _fneHeader.getStreamId()) {
LogWarning(LOG_NET, "FrameQueue::read(), RTP header and FNE header do not agree on stream ID? %u != %u", _rtpHeader.getSSRC(), _fneHeader.getStreamId());
}
// copy message
messageLength = _fneHeader.getMessageLength();
__UNIQUE_UINT8_ARRAY(message, messageLength);
@ -171,6 +166,25 @@ UInt8Array FrameQueue::read(int& messageLength, sockaddr_storage& address, uint3
/// <returns></returns>
void FrameQueue::enqueueMessage(const uint8_t* message, uint32_t length, uint32_t streamId, uint32_t peerId,
OpcodePair opcode, uint16_t rtpSeq, sockaddr_storage& addr, uint32_t addrLen)
{
enqueueMessage(message, length, streamId, peerId, peerId, opcode, rtpSeq, addr, addrLen);
}
/// <summary>
/// Cache "message" to frame queue.
/// </summary>
/// <param name="message">Message buffer to frame and queue.</param>
/// <param name="length">Length of message.</param>
/// <param name="streamId">Message stream ID.</param>
/// <param name="peerId">Peer ID.</param>
/// <param name="ssrc">RTP SSRC ID.</param>
/// <param name="opcode">Opcode.</param>
/// <param name="rtpSeq">RTP Sequence.</param>
/// <param name="addr">IP address to write data to.</param>
/// <param name="addrLen"></param>
/// <returns></returns>
void FrameQueue::enqueueMessage(const uint8_t* message, uint32_t length, uint32_t streamId, uint32_t peerId,
uint32_t ssrc, OpcodePair opcode, uint16_t rtpSeq, sockaddr_storage& addr, uint32_t addrLen)
{
assert(message != nullptr);
assert(length > 0U);
@ -184,13 +198,12 @@ void FrameQueue::enqueueMessage(const uint8_t* message, uint32_t length, uint32_
header.setPayloadType(DVM_RTP_PAYLOAD_TYPE);
header.setSequence(rtpSeq);
header.setSSRC(streamId);
header.setSSRC(ssrc);
// properly flag control opcodes
if ((opcode.first == NET_FUNC_TRANSFER) || (opcode.first == NET_FUNC_GRANT)) {
header.setPayloadType(DVM_CTRL_RTP_PAYLOAD_TYPE);
header.setSequence(0U);
header.setSSRC(0U);
}
header.encode(buffer);

@ -63,6 +63,9 @@ namespace network
/// <summary>Cache "message" to frame queue.</summary>
void enqueueMessage(const uint8_t* message, uint32_t length, uint32_t streamId, uint32_t peerId,
OpcodePair opcode, uint16_t rtpSeq, sockaddr_storage& addr, uint32_t addrLen);
/// <summary>Cache "message" to frame queue.</summary>
void enqueueMessage(const uint8_t* message, uint32_t length, uint32_t streamId, uint32_t peerId,
uint32_t ssrc, OpcodePair opcode, uint16_t rtpSeq, sockaddr_storage& addr, uint32_t addrLen);
/// <summary>Flush the message queue.</summary>
bool flushQueue();

@ -98,7 +98,8 @@ Network::Network(const std::string& address, uint16_t port, uint16_t localPort,
m_height(0),
m_location(),
m_restApiPassword(),
m_restApiPort(0)
m_restApiPort(0),
m_remotePeerId(0U)
{
assert(!address.empty());
assert(port > 0U);
@ -267,6 +268,12 @@ void Network::clock(uint32_t ms)
fneHeader.getStreamId(), fneHeader.getFunction(), fneHeader.getSubFunction());
}
// ensure the RTP synchronization source ID matches the FNE peer ID
if (m_remotePeerId != 0U && rtpHeader.getSSRC() != m_remotePeerId) {
LogWarning(LOG_NET, "RTP header and traffic session do not agree on remote peer ID? %u != %u", rtpHeader.getSSRC(), m_remotePeerId);
// should this be a fatal error?
}
// is this RTP packet destined for us?
uint32_t peerId = fneHeader.getPeerId();
if (m_peerId != peerId) {
@ -507,6 +514,7 @@ void Network::clock(uint32_t ms)
case NET_STAT_WAITING_CONFIG:
LogMessage(LOG_NET, "Logged into the master successfully");
m_loginStreamId = 0U;
m_remotePeerId = rtpHeader.getSSRC();
pktSeq(true);
m_status = NET_STAT_RUNNING;
m_timeoutTimer.start();
@ -641,6 +649,7 @@ bool Network::writeLogin()
Utils::dump(1U, "Network Message, Login", buffer, 8U);
m_loginStreamId = createStreamId();
m_remotePeerId = 0U;
m_frameQueue->enqueueMessage(buffer, 8U, m_loginStreamId, m_peerId,
{ NET_FUNC_RPTL, NET_SUBFUNC_NOP }, pktSeq(true), m_addr, m_addrLen);
return m_frameQueue->flushQueue();

@ -133,6 +133,8 @@ namespace network
std::string m_restApiPassword;
uint16_t m_restApiPort;
uint32_t m_remotePeerId;
/// <summary>Writes login request to the network.</summary>
bool writeLogin();
/// <summary>Writes network authentication challenge.</summary>

Loading…
Cancel
Save

Powered by TurnKey Linux.