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

View file

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

View file

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

View file

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

View file

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