IMRS: add proper MAC address handling, random-number based streamID

This commit is contained in:
SASANO Takayoshi 2021-11-04 22:47:42 +09:00
parent 3b3820f90a
commit 2fe38a8744
5 changed files with 31 additions and 14 deletions

View file

@ -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();
}
////////////////////////////////////////////////////////////////////////////////////////

View file

@ -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;
};
////////////////////////////////////////////////////////////////////////////////////////

View file

@ -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

View file

@ -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;
}

View file

@ -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 &);