mirror of
https://github.com/LX3JL/xlxd.git
synced 2025-12-06 07:42:01 +01:00
IMRS: add proper MAC address handling, random-number based streamID
This commit is contained in:
parent
3b3820f90a
commit
2fe38a8744
|
|
@ -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();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -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<CImrsStreamCacheItem, NB_OF_MODULES> m_StreamsCache;
|
||||
|
||||
// random number generator
|
||||
mutable std::mt19937 m_Random;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 &);
|
||||
|
|
|
|||
Loading…
Reference in a new issue