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
|
// update time
|
||||||
m_LastKeepaliveTime.Now();
|
m_LastKeepaliveTime.Now();
|
||||||
|
|
||||||
|
// random number generator
|
||||||
|
std::random_device rd;
|
||||||
|
std::mt19937 mt(rd());
|
||||||
|
m_Random = mt;
|
||||||
|
|
||||||
// done
|
// done
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
@ -76,9 +81,10 @@ void CImrsProtocol::Task(void)
|
||||||
//CYSFFICH Fich;
|
//CYSFFICH Fich;
|
||||||
CDvHeaderPacket *Header;
|
CDvHeaderPacket *Header;
|
||||||
CDvFramePacket *Frames[5];
|
CDvFramePacket *Frames[5];
|
||||||
|
int sno;
|
||||||
|
|
||||||
// handle incoming packets
|
// handle incoming packets
|
||||||
if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 )
|
if ( m_Socket.Receive(&Buffer, &Ip, 20, &sno) != -1 )
|
||||||
{
|
{
|
||||||
// force port
|
// force port
|
||||||
Ip.SetPort(IMRS_PORT);
|
Ip.SetPort(IMRS_PORT);
|
||||||
|
|
@ -123,7 +129,7 @@ void CImrsProtocol::Task(void)
|
||||||
//std::cout << "IMRS ping packet from " << Ip << std::endl;
|
//std::cout << "IMRS ping packet from " << Ip << std::endl;
|
||||||
|
|
||||||
// acknowledge request
|
// acknowledge request
|
||||||
EncodePongPacket(&Buffer);
|
EncodePongPacket(&Buffer, sno);
|
||||||
m_Socket.Send(Buffer, Ip, IMRS_PORT);
|
m_Socket.Send(Buffer, Ip, IMRS_PORT);
|
||||||
|
|
||||||
// and our turn
|
// and our turn
|
||||||
|
|
@ -404,7 +410,7 @@ bool CImrsProtocol::IsValidDvHeaderPacket(const CIp &Ip, const CBuffer &Buffer,
|
||||||
if ( (Buffer.size() == 91) && (Buffer.at(1) == 0x4B) )
|
if ( (Buffer.size() == 91) && (Buffer.at(1) == 0x4B) )
|
||||||
{
|
{
|
||||||
// get stream id
|
// get stream id
|
||||||
uint32 uiStreamId = IpToStreamId(Ip);
|
uint32 uiStreamId = CreateStreamId();
|
||||||
|
|
||||||
// and payload
|
// and payload
|
||||||
CBuffer 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) )
|
if ( (Buffer.size() == 181) && (Buffer.at(1) == 0xA5) )
|
||||||
{
|
{
|
||||||
// get stream id
|
// get stream id
|
||||||
uint32 uiStreamId = IpToStreamId(Ip);
|
uint32 uiStreamId = CreateStreamId();
|
||||||
|
|
||||||
// and payload
|
// and payload
|
||||||
CBuffer payload;
|
CBuffer payload;
|
||||||
|
|
@ -576,7 +582,7 @@ bool CImrsProtocol::IsValidDvLastFramePacket(const CIp &Ip, const CBuffer &Buffe
|
||||||
if ( (Buffer.size() == 31) && (Buffer.at(1) == 0x0F) )
|
if ( (Buffer.size() == 31) && (Buffer.at(1) == 0x0F) )
|
||||||
{
|
{
|
||||||
// get stream id
|
// get stream id
|
||||||
uint32 uiStreamId = IpToStreamId(Ip);
|
uint32 uiStreamId = CreateStreamId();
|
||||||
|
|
||||||
// and payload
|
// and payload
|
||||||
CBuffer payload;
|
CBuffer payload;
|
||||||
|
|
@ -639,7 +645,7 @@ void CImrsProtocol::EncodePingPacket(CBuffer *Buffer) const
|
||||||
Buffer->Set(tag, sizeof(tag));
|
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 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' };
|
uint8 radioid[] = { 'G','0','g','B','J' };
|
||||||
|
|
@ -648,7 +654,7 @@ void CImrsProtocol::EncodePongPacket(CBuffer *Buffer) const
|
||||||
// tag
|
// tag
|
||||||
Buffer->Set(tag1, sizeof(tag1));
|
Buffer->Set(tag1, sizeof(tag1));
|
||||||
// mac address
|
// mac address
|
||||||
Buffer->Append(g_Reflector.GetListenMac(), 6);
|
Buffer->Append(g_Reflector.GetListenMac(sno), 6);
|
||||||
// callsign
|
// callsign
|
||||||
::memset(sz, ' ', sizeof(sz));
|
::memset(sz, ' ', sizeof(sz));
|
||||||
g_Reflector.GetCallsign().GetCallsignString(sz);
|
g_Reflector.GetCallsign().GetCallsignString(sz);
|
||||||
|
|
@ -894,9 +900,9 @@ bool CImrsProtocol::EncodeDvLastPacket(const CDvHeaderPacket &Header, const CDvL
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// uiStreamId helpers
|
// 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
|
// DV packet encoding helpers
|
||||||
void EncodePingPacket(CBuffer *) const;
|
void EncodePingPacket(CBuffer *) const;
|
||||||
void EncodePongPacket(CBuffer *) const;
|
void EncodePongPacket(CBuffer *, int) const;
|
||||||
bool EncodeDvHeaderPacket(const CDvHeaderPacket &, CBuffer *) const;
|
bool EncodeDvHeaderPacket(const CDvHeaderPacket &, CBuffer *) const;
|
||||||
bool EncodeDvPacket(const CDvHeaderPacket &, const CDvFramePacket *, CBuffer *) const;
|
bool EncodeDvPacket(const CDvHeaderPacket &, const CDvFramePacket *, CBuffer *) const;
|
||||||
bool EncodeDvLastPacket(const CDvHeaderPacket &, const CDvLastFramePacket &, CBuffer *) const;
|
bool EncodeDvLastPacket(const CDvHeaderPacket &, const CDvLastFramePacket &, CBuffer *) const;
|
||||||
|
|
||||||
// uiStreamId helpers
|
// uiStreamId helpers
|
||||||
uint32 IpToStreamId(const CIp &) const;
|
uint32 CreateStreamId(void) const;
|
||||||
|
|
||||||
// DG-ID helper
|
// DG-ID helper
|
||||||
char DgidToModule(uint8 uiDgid) const;
|
char DgidToModule(uint8 uiDgid) const;
|
||||||
|
|
@ -111,6 +111,9 @@ protected:
|
||||||
|
|
||||||
// for queue header caches
|
// for queue header caches
|
||||||
std::array<CImrsStreamCacheItem, NB_OF_MODULES> m_StreamsCache;
|
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 SetListenIp(int i, const CIp &ip) { m_Ip[i] = ip; UpdateListenMac(i); }
|
||||||
void SetTranscoderIp(const CIp &ip) { m_AmbedIp = ip; }
|
void SetTranscoderIp(const CIp &ip) { m_AmbedIp = ip; }
|
||||||
const CIp &GetListenIp(int i = 0) const { return m_Ip[i]; }
|
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; }
|
const CIp &GetTranscoderIp(void) const { return m_AmbedIp; }
|
||||||
|
|
||||||
// operation
|
// operation
|
||||||
|
|
|
||||||
|
|
@ -123,12 +123,13 @@ int CUdpSocket::GetSocket(const CIp &Ip)
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// read
|
// 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 sockaddr_storage Sin;
|
||||||
struct pollfd pfd[UDP_SOCKET_MAX];
|
struct pollfd pfd[UDP_SOCKET_MAX];
|
||||||
socklen_t uiFromLen = sizeof(Sin);
|
socklen_t uiFromLen = sizeof(Sin);
|
||||||
int i, socks, index, iRecvLen = -1;
|
int i, socks, index, iRecvLen = -1;
|
||||||
|
int index2sno[UDP_SOCKET_MAX];
|
||||||
|
|
||||||
// socket valid ?
|
// socket valid ?
|
||||||
for ( i = socks = 0; i < UDP_SOCKET_MAX; i++ )
|
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].fd = m_Socket[i];
|
||||||
pfd[socks].events = POLLIN;
|
pfd[socks].events = POLLIN;
|
||||||
|
index2sno[socks] = i;
|
||||||
socks++;
|
socks++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -170,6 +172,12 @@ int CUdpSocket::Receive(CBuffer *Buffer, CIp *Ip, int timeout)
|
||||||
// get IP
|
// get IP
|
||||||
Ip->SetSockAddr(&Sin, uiFromLen);
|
Ip->SetSockAddr(&Sin, uiFromLen);
|
||||||
|
|
||||||
|
// record the number of incoming socket
|
||||||
|
if ( sno != NULL )
|
||||||
|
{
|
||||||
|
*sno = index2sno[index];
|
||||||
|
}
|
||||||
|
|
||||||
m_Counter++;
|
m_Counter++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ public:
|
||||||
int GetSocket(const CIp &);
|
int GetSocket(const CIp &);
|
||||||
|
|
||||||
// read
|
// read
|
||||||
int Receive(CBuffer *, CIp *, int);
|
int Receive(CBuffer *, CIp *, int, int * = NULL);
|
||||||
|
|
||||||
// write
|
// write
|
||||||
int Send(const CBuffer &, const CIp &);
|
int Send(const CBuffer &, const CIp &);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue