diff --git a/src/cimrsprotocol.cpp b/src/cimrsprotocol.cpp index 4ad5fe3..7d7fa2b 100644 --- a/src/cimrsprotocol.cpp +++ b/src/cimrsprotocol.cpp @@ -55,6 +55,11 @@ bool CImrsProtocol::Init(void) // update time m_LastKeepaliveTime.Now(); + // random number generator + std::random_device rd; + std::mt19937 mt(rd()); + m_Random = mt; + // done return ok; } @@ -76,9 +81,10 @@ void CImrsProtocol::Task(void) //CYSFFICH Fich; CDvHeaderPacket *Header; CDvFramePacket *Frames[5]; + int sno; // handle incoming packets - if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) + if ( m_Socket.Receive(&Buffer, &Ip, 20, &sno) != -1 ) { // force port Ip.SetPort(IMRS_PORT); @@ -123,7 +129,7 @@ void CImrsProtocol::Task(void) //std::cout << "IMRS ping packet from " << Ip << std::endl; // acknowledge request - EncodePongPacket(&Buffer); + EncodePongPacket(&Buffer, sno); m_Socket.Send(Buffer, Ip, IMRS_PORT); // and our turn @@ -404,7 +410,7 @@ bool CImrsProtocol::IsValidDvHeaderPacket(const CIp &Ip, const CBuffer &Buffer, if ( (Buffer.size() == 91) && (Buffer.at(1) == 0x4B) ) { // get stream id - uint32 uiStreamId = IpToStreamId(Ip); + uint32 uiStreamId = CreateStreamId(); // and payload CBuffer payload; @@ -483,7 +489,7 @@ bool CImrsProtocol::IsValidDvFramePacket(const CIp &Ip, const CBuffer &Buffer, C if ( (Buffer.size() == 181) && (Buffer.at(1) == 0xA5) ) { // get stream id - uint32 uiStreamId = IpToStreamId(Ip); + uint32 uiStreamId = CreateStreamId(); // and payload CBuffer payload; @@ -576,7 +582,7 @@ bool CImrsProtocol::IsValidDvLastFramePacket(const CIp &Ip, const CBuffer &Buffe if ( (Buffer.size() == 31) && (Buffer.at(1) == 0x0F) ) { // get stream id - uint32 uiStreamId = IpToStreamId(Ip); + uint32 uiStreamId = CreateStreamId(); // and payload CBuffer payload; @@ -639,7 +645,7 @@ void CImrsProtocol::EncodePingPacket(CBuffer *Buffer) const Buffer->Set(tag, sizeof(tag)); } -void CImrsProtocol::EncodePongPacket(CBuffer *Buffer) const +void CImrsProtocol::EncodePongPacket(CBuffer *Buffer, int sno) const { uint8 tag1[] = { 0x00,0x2C,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x00 }; uint8 radioid[] = { 'G','0','g','B','J' }; @@ -648,7 +654,7 @@ void CImrsProtocol::EncodePongPacket(CBuffer *Buffer) const // tag Buffer->Set(tag1, sizeof(tag1)); // mac address - Buffer->Append(g_Reflector.GetListenMac(), 6); + Buffer->Append(g_Reflector.GetListenMac(sno), 6); // callsign ::memset(sz, ' ', sizeof(sz)); g_Reflector.GetCallsign().GetCallsignString(sz); @@ -894,9 +900,9 @@ bool CImrsProtocol::EncodeDvLastPacket(const CDvHeaderPacket &Header, const CDvL //////////////////////////////////////////////////////////////////////////////////////// // uiStreamId helpers -uint32 CImrsProtocol::IpToStreamId(const CIp &ip) const +uint32 CImrsProtocol::CreateStreamId(void) const { - return ip.GetAddr() ^ (uint32)(MAKEDWORD(ip.GetPort(), ip.GetPort())); + return m_Random(); } //////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/cimrsprotocol.h b/src/cimrsprotocol.h index 62e024d..eb02e1f 100644 --- a/src/cimrsprotocol.h +++ b/src/cimrsprotocol.h @@ -93,13 +93,13 @@ protected: // DV packet encoding helpers void EncodePingPacket(CBuffer *) const; - void EncodePongPacket(CBuffer *) const; + void EncodePongPacket(CBuffer *, int) const; bool EncodeDvHeaderPacket(const CDvHeaderPacket &, CBuffer *) const; bool EncodeDvPacket(const CDvHeaderPacket &, const CDvFramePacket *, CBuffer *) const; bool EncodeDvLastPacket(const CDvHeaderPacket &, const CDvLastFramePacket &, CBuffer *) const; // uiStreamId helpers - uint32 IpToStreamId(const CIp &) const; + uint32 CreateStreamId(void) const; // DG-ID helper char DgidToModule(uint8 uiDgid) const; @@ -111,6 +111,9 @@ protected: // for queue header caches std::array m_StreamsCache; + + // random number generator + mutable std::mt19937 m_Random; }; //////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/creflector.h b/src/creflector.h index 354ec3d..ea2967e 100644 --- a/src/creflector.h +++ b/src/creflector.h @@ -61,7 +61,7 @@ public: void SetListenIp(int i, const CIp &ip) { m_Ip[i] = ip; UpdateListenMac(i); } void SetTranscoderIp(const CIp &ip) { m_AmbedIp = ip; } const CIp &GetListenIp(int i = 0) const { return m_Ip[i]; } - const uint8 *GetListenMac(int i = 0) const { return (const uint8 *)m_Mac[i]; } + const uint8 *GetListenMac(int i) const { return (const uint8 *)m_Mac[i]; } const CIp &GetTranscoderIp(void) const { return m_AmbedIp; } // operation diff --git a/src/cudpsocket.cpp b/src/cudpsocket.cpp index 4499c86..f1b6e03 100644 --- a/src/cudpsocket.cpp +++ b/src/cudpsocket.cpp @@ -123,12 +123,13 @@ int CUdpSocket::GetSocket(const CIp &Ip) //////////////////////////////////////////////////////////////////////////////////////// // read -int CUdpSocket::Receive(CBuffer *Buffer, CIp *Ip, int timeout) +int CUdpSocket::Receive(CBuffer *Buffer, CIp *Ip, int timeout, int *sno) { struct sockaddr_storage Sin; struct pollfd pfd[UDP_SOCKET_MAX]; socklen_t uiFromLen = sizeof(Sin); int i, socks, index, iRecvLen = -1; + int index2sno[UDP_SOCKET_MAX]; // socket valid ? for ( i = socks = 0; i < UDP_SOCKET_MAX; i++ ) @@ -137,6 +138,7 @@ int CUdpSocket::Receive(CBuffer *Buffer, CIp *Ip, int timeout) { pfd[socks].fd = m_Socket[i]; pfd[socks].events = POLLIN; + index2sno[socks] = i; socks++; } } @@ -170,6 +172,12 @@ int CUdpSocket::Receive(CBuffer *Buffer, CIp *Ip, int timeout) // get IP Ip->SetSockAddr(&Sin, uiFromLen); + // record the number of incoming socket + if ( sno != NULL ) + { + *sno = index2sno[index]; + } + m_Counter++; break; } diff --git a/src/cudpsocket.h b/src/cudpsocket.h index ae8418c..7d5b40f 100644 --- a/src/cudpsocket.h +++ b/src/cudpsocket.h @@ -62,7 +62,7 @@ public: int GetSocket(const CIp &); // read - int Receive(CBuffer *, CIp *, int); + int Receive(CBuffer *, CIp *, int, int * = NULL); // write int Send(const CBuffer &, const CIp &);