added CSEProtocol class for better EncodeDvPacket desigh

unstable
Tom Early 4 years ago
parent 065be9bf90
commit 707486f47e

@ -572,6 +572,21 @@ void CBMProtocol::EncodeConnectNackPacket(CBuffer *Buffer)
Buffer->Append((uint8_t)0);
}
bool CBMProtocol::EncodeDvHeaderPacket(const CDvHeaderPacket &Packet, CBuffer *Buffer) const
{
uint8_t tag[] = { 'D','S','V','T',0x10,0x00,0x00,0x00,0x20,0x00,0x01,0x02 };
struct dstar_header DstarHeader;
Packet.ConvertToDstarStruct(&DstarHeader);
Buffer->Set(tag, sizeof(tag));
Buffer->Append(Packet.GetStreamId());
Buffer->Append((uint8_t)0x80);
Buffer->Append((uint8_t *)&DstarHeader, sizeof(struct dstar_header));
return true;
}
bool CBMProtocol::EncodeDvFramePacket(const CDvFramePacket &Packet, CBuffer *Buffer) const
{
uint8_t tag[] = { 'D','S','V','T',0x20,0x00,0x00,0x00,0x20,0x00,0x01,0x02 };

@ -20,7 +20,7 @@
#include "Version.h"
#include "Timer.h"
#include "Protocol.h"
#include "SEProtocol.h"
#include "Clients.h"
////////////////////////////////////////////////////////////////////////////////////////
@ -30,7 +30,7 @@ class CPeer;
////////////////////////////////////////////////////////////////////////////////////////
// class
class CBMProtocol : public CProtocol
class CBMProtocol : public CSEProtocol
{
public:
// initialization
@ -66,6 +66,7 @@ protected:
void EncodeDisconnectPacket(CBuffer *);
void EncodeConnectAckPacket(CBuffer *, const char *);
void EncodeConnectNackPacket(CBuffer *);
bool EncodeDvHeaderPacket(const CDvHeaderPacket &, CBuffer *) const;
bool EncodeDvFramePacket(const CDvFramePacket &, CBuffer *) const;
bool EncodeDvLastFramePacket(const CDvFramePacket &, CBuffer *) const;

@ -242,19 +242,11 @@ void CDcsProtocol::HandleQueue(void)
CBuffer buffer;
if ( packet->IsLastPacket() )
{
EncodeDvLastPacket(
m_StreamsCache[module].m_dvHeader,
(const CDvFramePacket &)*packet.get(),
m_StreamsCache[module].m_iSeqCounter++,
&buffer);
EncodeLastDCSPacket(m_StreamsCache[module].m_dvHeader, (const CDvFramePacket &)*packet.get(), m_StreamsCache[module].m_iSeqCounter++, &buffer);
}
else if ( packet->IsDvFrame() )
{
EncodeDvPacket(
m_StreamsCache[module].m_dvHeader,
(const CDvFramePacket &)*packet.get(),
m_StreamsCache[module].m_iSeqCounter++,
&buffer);
EncodeDCSPacket(m_StreamsCache[module].m_dvHeader, (const CDvFramePacket &)*packet.get(), m_StreamsCache[module].m_iSeqCounter++, &buffer);
}
// send it
@ -461,7 +453,7 @@ void CDcsProtocol::EncodeDisconnectPacket(CBuffer *Buffer, std::shared_ptr<CClie
Buffer->Append((uint8_t)0x00);
}
void CDcsProtocol::EncodeDvPacket(const CDvHeaderPacket &Header, const CDvFramePacket &DvFrame, uint32_t iSeq, CBuffer *Buffer) const
void CDcsProtocol::EncodeDCSPacket(const CDvHeaderPacket &Header, const CDvFramePacket &DvFrame, uint32_t iSeq, CBuffer *Buffer) const
{
uint8_t tag[] = { '0','0','0','1' };
struct dstar_header DstarHeader;
@ -481,8 +473,8 @@ void CDcsProtocol::EncodeDvPacket(const CDvHeaderPacket &Header, const CDvFrameP
Buffer->Append((uint8_t)0x00, 38);
}
void CDcsProtocol::EncodeDvLastPacket(const CDvHeaderPacket &Header, const CDvFramePacket &DvFrame, uint32_t iSeq, CBuffer *Buffer) const
void CDcsProtocol::EncodeLastDCSPacket(const CDvHeaderPacket &Header, const CDvFramePacket &DvFrame, uint32_t iSeq, CBuffer *Buffer) const
{
EncodeDvPacket(Header, DvFrame, iSeq, Buffer);
EncodeDCSPacket(Header, DvFrame, iSeq, Buffer);
(Buffer->data())[45] |= 0x40;
}

@ -70,8 +70,8 @@ protected:
void EncodeConnectAckPacket(const CCallsign &, char, CBuffer *);
void EncodeConnectNackPacket(const CCallsign &, char, CBuffer *);
void EncodeDisconnectPacket(CBuffer *, std::shared_ptr<CClient>);
void EncodeDvPacket(const CDvHeaderPacket &, const CDvFramePacket &, uint32_t, CBuffer *) const;
void EncodeDvLastPacket(const CDvHeaderPacket &, const CDvFramePacket &, uint32_t, CBuffer *) const;
void EncodeDCSPacket(const CDvHeaderPacket &, const CDvFramePacket &, uint32_t, CBuffer *) const;
void EncodeLastDCSPacket(const CDvHeaderPacket &, const CDvFramePacket &, uint32_t, CBuffer *) const;
protected:
// for keep alive

@ -19,7 +19,7 @@
#pragma once
#include "Timer.h"
#include "Protocol.h"
#include "SEProtocol.h"
#include "DVHeaderPacket.h"
#include "DVFramePacket.h"
@ -47,7 +47,7 @@
////////////////////////////////////////////////////////////////////////////////////////
// class
class CDextraProtocol : public CProtocol
class CDextraProtocol : public CSEProtocol
{
public:
// initialization

@ -368,14 +368,14 @@ void CDmrmmdvmProtocol::HandleQueue(void)
m_StreamsCache[mod].m_uiSeqId = 0;
// encode it
EncodeDvHeaderPacket((CDvHeaderPacket &)*packet.get(), m_StreamsCache[mod].m_uiSeqId, &buffer);
EncodeMMDVMHeaderPacket((CDvHeaderPacket &)*packet.get(), m_StreamsCache[mod].m_uiSeqId, &buffer);
m_StreamsCache[mod].m_uiSeqId = 1;
}
// check if it's a last frame
else if ( packet->IsLastPacket() )
{
// encode it
EncodeDvLastPacket(m_StreamsCache[mod].m_dvHeader, m_StreamsCache[mod].m_uiSeqId, &buffer);
EncodeLastMMDVMPacket(m_StreamsCache[mod].m_dvHeader, m_StreamsCache[mod].m_uiSeqId, &buffer);
m_StreamsCache[mod].m_uiSeqId = (m_StreamsCache[mod].m_uiSeqId + 1) & 0xFF;
}
// otherwise, just a regular DV frame
@ -391,13 +391,7 @@ void CDmrmmdvmProtocol::HandleQueue(void)
m_StreamsCache[mod].m_dvFrame1 = CDvFramePacket((const CDvFramePacket &)*packet.get());
break;
case 3:
EncodeDvPacket(
m_StreamsCache[mod].m_dvHeader,
m_StreamsCache[mod].m_dvFrame0,
m_StreamsCache[mod].m_dvFrame1,
(const CDvFramePacket &)*packet.get(),
m_StreamsCache[mod].m_uiSeqId,
&buffer);
EncodeMMDVMPacket(m_StreamsCache[mod].m_dvHeader, m_StreamsCache[mod].m_dvFrame0, m_StreamsCache[mod].m_dvFrame1, (const CDvFramePacket &)*packet.get(), m_StreamsCache[mod].m_uiSeqId, &buffer);
m_StreamsCache[mod].m_uiSeqId = (m_StreamsCache[mod].m_uiSeqId + 1) & 0xFF;
break;
default:
@ -820,7 +814,7 @@ void CDmrmmdvmProtocol::EncodeClosePacket(CBuffer *Buffer, std::shared_ptr<CClie
}
bool CDmrmmdvmProtocol::EncodeDvHeaderPacket(const CDvHeaderPacket &Packet, uint8_t seqid, CBuffer *Buffer) const
bool CDmrmmdvmProtocol::EncodeMMDVMHeaderPacket(const CDvHeaderPacket &Packet, uint8_t seqid, CBuffer *Buffer) const
{
uint8_t tag[] = { 'D','M','R','D' };
@ -861,10 +855,7 @@ bool CDmrmmdvmProtocol::EncodeDvHeaderPacket(const CDvHeaderPacket &Packet, uint
return true;
}
void CDmrmmdvmProtocol::EncodeDvPacket(
const CDvHeaderPacket &Header,
const CDvFramePacket &DvFrame0, const CDvFramePacket &DvFrame1, const CDvFramePacket &DvFrame2,
uint8_t seqid, CBuffer *Buffer) const
void CDmrmmdvmProtocol::EncodeMMDVMPacket(const CDvHeaderPacket &Header, const CDvFramePacket &DvFrame0, const CDvFramePacket &DvFrame1, const CDvFramePacket &DvFrame2, uint8_t seqid, CBuffer *Buffer) const
{
uint8_t tag[] = { 'D','M','R','D' };
Buffer->Set(tag, sizeof(tag));
@ -927,7 +918,7 @@ void CDmrmmdvmProtocol::EncodeDvPacket(
}
void CDmrmmdvmProtocol::EncodeDvLastPacket(const CDvHeaderPacket &Packet, uint8_t seqid, CBuffer *Buffer) const
void CDmrmmdvmProtocol::EncodeLastMMDVMPacket(const CDvHeaderPacket &Packet, uint8_t seqid, CBuffer *Buffer) const
{
uint8_t tag[] = { 'D','M','R','D' };

@ -89,9 +89,9 @@ protected:
void EncodeConnectAckPacket(CBuffer *, const CCallsign &, uint32_t);
void EncodeNackPacket(CBuffer *, const CCallsign &);
void EncodeClosePacket(CBuffer *, std::shared_ptr<CClient>);
bool EncodeDvHeaderPacket(const CDvHeaderPacket &, uint8_t, CBuffer *) const;
void EncodeDvPacket(const CDvHeaderPacket &, const CDvFramePacket &, const CDvFramePacket &, const CDvFramePacket &, uint8_t, CBuffer *) const;
void EncodeDvLastPacket(const CDvHeaderPacket &, uint8_t, CBuffer *) const;
bool EncodeMMDVMHeaderPacket(const CDvHeaderPacket &, uint8_t, CBuffer *) const;
void EncodeMMDVMPacket(const CDvHeaderPacket &, const CDvFramePacket &, const CDvFramePacket &, const CDvFramePacket &, uint8_t, CBuffer *) const;
void EncodeLastMMDVMPacket(const CDvHeaderPacket &, uint8_t, CBuffer *) const;
// dmr DstId to Module helper
char DmrDstIdToModule(uint32_t) const;

@ -241,7 +241,7 @@ void CDmrplusProtocol::HandleQueue(void)
m_StreamsCache[mod].m_uiSeqId = 4;
// encode it
EncodeDvHeaderPacket((const CDvHeaderPacket &)*packet.get(), &buffer);
EncodeDMRPlusHeaderPacket((const CDvHeaderPacket &)*packet.get(), &buffer);
}
else
{
@ -255,13 +255,7 @@ void CDmrplusProtocol::HandleQueue(void)
m_StreamsCache[mod].m_dvFrame1 = CDvFramePacket((const CDvFramePacket &)*packet.get());
break;
case 3:
EncodeDvPacket(
m_StreamsCache[mod].m_dvHeader,
m_StreamsCache[mod].m_dvFrame0,
m_StreamsCache[mod].m_dvFrame1,
(const CDvFramePacket &)*packet.get(),
m_StreamsCache[mod].m_uiSeqId,
&buffer);
EncodeDMRPlusPacket(m_StreamsCache[mod].m_dvHeader, m_StreamsCache[mod].m_dvFrame0, m_StreamsCache[mod].m_dvFrame1, (const CDvFramePacket &)*packet.get(), m_StreamsCache[mod].m_uiSeqId, &buffer);
m_StreamsCache[mod].m_uiSeqId = GetNextSeqId(m_StreamsCache[mod].m_uiSeqId);
break;
default:
@ -516,11 +510,9 @@ void CDmrplusProtocol::EncodeConnectNackPacket(CBuffer *Buffer)
Buffer->Set(tag, sizeof(tag));
}
bool CDmrplusProtocol::EncodeDvHeaderPacket(const CDvHeaderPacket &Packet, CBuffer *Buffer) const
bool CDmrplusProtocol::EncodeDMRPlusHeaderPacket(const CDvHeaderPacket &Packet, CBuffer *Buffer) const
{
uint8_t tag[] = { 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,
0x00,0x05,0x01,0x02,0x00,0x00,0x00
} ;
uint8_t tag[] = { 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x05,0x01,0x02,0x00,0x00,0x00 };
Buffer->Set(tag, sizeof(tag));
// uiSeqId
@ -563,10 +555,7 @@ bool CDmrplusProtocol::EncodeDvHeaderPacket(const CDvHeaderPacket &Packet, CBuff
return true;
}
void CDmrplusProtocol::EncodeDvPacket
(const CDvHeaderPacket &Header,
const CDvFramePacket &DvFrame0, const CDvFramePacket &DvFrame1, const CDvFramePacket &DvFrame2,
uint8_t seqid, CBuffer *Buffer) const
void CDmrplusProtocol::EncodeDMRPlusPacket(const CDvHeaderPacket &Header, const CDvFramePacket &DvFrame0, const CDvFramePacket &DvFrame1, const CDvFramePacket &DvFrame2, uint8_t seqid, CBuffer *Buffer) const
{
uint8_t tag[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,

@ -74,8 +74,8 @@ protected:
// packet encoding helpers
void EncodeConnectAckPacket(CBuffer *);
void EncodeConnectNackPacket(CBuffer *);
bool EncodeDvHeaderPacket(const CDvHeaderPacket &, CBuffer *) const;
void EncodeDvPacket(const CDvHeaderPacket &, const CDvFramePacket &, const CDvFramePacket &, const CDvFramePacket &, uint8_t, CBuffer *) const;
bool EncodeDMRPlusHeaderPacket(const CDvHeaderPacket &, CBuffer *) const;
void EncodeDMRPlusPacket(const CDvHeaderPacket &, const CDvFramePacket &, const CDvFramePacket &, const CDvFramePacket &, uint8_t, CBuffer *) const;
void SwapEndianess(uint8_t *, int) const;
// dmr SeqId helper

@ -19,7 +19,7 @@
#pragma once
#include "Timer.h"
#include "Protocol.h"
#include "SEProtocol.h"
#include "DVHeaderPacket.h"
#include "DVFramePacket.h"
@ -34,7 +34,7 @@ public:
uint8_t m_iSeqCounter;
};
class CDplusProtocol : public CProtocol
class CDplusProtocol : public CSEProtocol
{
public:
// initialization

@ -20,7 +20,7 @@
#include <string>
#include "Timer.h"
#include "Protocol.h"
#include "SEProtocol.h"
#include "DVHeaderPacket.h"
#include "DVFramePacket.h"
#include "RawSocket.h"
@ -52,7 +52,7 @@
////////////////////////////////////////////////////////////////////////////////////////
// class
class CG3Protocol : public CProtocol
class CG3Protocol : public CSEProtocol
{
public:
// constructor

@ -240,11 +240,11 @@ void CM17Protocol::HandleQueue(void)
memcpy(frame.magic, "M17 ", 4);
if ( packet->IsLastPacket() )
{
EncodeDvLastPacket(frame, m_StreamsCache[module].m_dvHeader, (const CDvFramePacket &)*packet.get(), m_StreamsCache[module].m_iSeqCounter++);
EncodeLastM17Packet(frame, m_StreamsCache[module].m_dvHeader, (const CDvFramePacket &)*packet.get(), m_StreamsCache[module].m_iSeqCounter++);
}
else if ( packet->IsDvFrame() )
{
EncodeDvPacket(frame, m_StreamsCache[module].m_dvHeader, (const CDvFramePacket &)*packet.get(), m_StreamsCache[module].m_iSeqCounter++);
EncodeM17Packet(frame, m_StreamsCache[module].m_dvHeader, (const CDvFramePacket &)*packet.get(), m_StreamsCache[module].m_iSeqCounter++);
}
// push it to all our clients linked to the module and who are not streaming in
@ -385,7 +385,7 @@ void CM17Protocol::EncodeKeepAlivePacket(CBuffer &Buffer)
g_Reflector.GetCallsign().CodeOut(Buffer.data() + 4);
}
void CM17Protocol::EncodeDvPacket(SM17Frame &frame, const CDvHeaderPacket &Header, const CDvFramePacket &DvFrame, uint32_t iSeq) const
void CM17Protocol::EncodeM17Packet(SM17Frame &frame, const CDvHeaderPacket &Header, const CDvFramePacket &DvFrame, uint32_t iSeq) const
{
ECodecType codec_in = Header.GetCodecIn(); // We'll need this
@ -410,8 +410,8 @@ void CM17Protocol::EncodeDvPacket(SM17Frame &frame, const CDvHeaderPacket &Heade
frame.crc = htons(m17crc.CalcCRC(frame.magic, sizeof(SM17Frame)-2));
}
void CM17Protocol::EncodeDvLastPacket(SM17Frame &frame, const CDvHeaderPacket &Header, const CDvFramePacket &DvFrame, uint32_t iSeq) const
void CM17Protocol::EncodeLastM17Packet(SM17Frame &frame, const CDvHeaderPacket &Header, const CDvFramePacket &DvFrame, uint32_t iSeq) const
{
EncodeDvPacket(frame, Header, DvFrame, iSeq);
EncodeM17Packet(frame, Header, DvFrame, iSeq);
frame.framenumber |= 0x8000U;
}

@ -66,8 +66,8 @@ protected:
// packet encoding helpers
void EncodeKeepAlivePacket(CBuffer &);
void EncodeDvPacket(SM17Frame &, const CDvHeaderPacket &, const CDvFramePacket &, uint32_t) const;
void EncodeDvLastPacket(SM17Frame &, const CDvHeaderPacket &, const CDvFramePacket &, uint32_t) const;
void EncodeM17Packet(SM17Frame &, const CDvHeaderPacket &, const CDvFramePacket &, uint32_t) const;
void EncodeLastM17Packet(SM17Frame &, const CDvHeaderPacket &, const CDvFramePacket &, uint32_t) const;
protected:
// for keep alive

@ -36,8 +36,8 @@ endif
LDFLAGS=-pthread
XRFSRCS = Buffer.cpp Callsign.cpp CallsignList.cpp CallsignListItem.cpp Client.cpp Clients.cpp DCSClient.cpp DCSProtocol.cpp DExtraClient.cpp DExtraPeer.cpp DExtraProtocol.cpp DPlusClient.cpp DPlusProtocol.cpp DVFramePacket.cpp DVHeaderPacket.cpp GateKeeper.cpp IP.cpp M17Client.cpp M17CRC.cpp M17Packet.cpp M17Client.cpp Notification.cpp Packet.cpp PacketStream.cpp PeerCallsignList.cpp Peer.cpp Peers.cpp Protocol.cpp Protocols.cpp Reflector.cpp UDPSocket.cpp User.cpp Users.cpp Version.cpp Main.cpp
XLXSRCS = BMClient.cpp BMPeer.cpp BPTC19696.cpp CRC.cpp DMRIdDir.cpp DMRIdDirFile.cpp DMRIdDirHttp.cpp DMRMMDVMClient.cpp DMRMMDVMProtocol.cpp DMRPlusClient.cpp DMRPlusProtocol.cpp Golay2087.cpp Golay24128.cpp Hamming.cpp QR1676.cpp RS129.cpp Semaphore.cpp Utils.cpp WiresXCmd.cpp WiresXCmdHandler.cpp WiresXInfo.cpp URFClient.cpp URFProtocol.cpp URFPeer.cpp YSFClient.cpp YSFConvolution.cpp YSFFich.cpp YSFNode.cpp YSFNodeDir.cpp YSFNodeDirFile.cpp YSFNodeDirHttp.cpp YSFPayload.cpp YSFProtocol.cpp YSFUtils.cpp
XRFSRCS = Buffer.cpp Callsign.cpp CallsignList.cpp CallsignListItem.cpp Client.cpp Clients.cpp DCSClient.cpp DCSProtocol.cpp DExtraClient.cpp DExtraPeer.cpp DExtraProtocol.cpp DPlusClient.cpp DPlusProtocol.cpp DVFramePacket.cpp DVHeaderPacket.cpp GateKeeper.cpp IP.cpp Notification.cpp Packet.cpp PacketStream.cpp PeerCallsignList.cpp Peer.cpp Peers.cpp Protocol.cpp Protocols.cpp Reflector.cpp SEProtocol.cpp UDPSocket.cpp User.cpp Users.cpp Version.cpp Main.cpp
XLXSRCS = BMClient.cpp BMPeer.cpp BMProtocol.cpp BPTC19696.cpp CRC.cpp DMRIdDir.cpp DMRIdDirFile.cpp DMRIdDirHttp.cpp DMRMMDVMClient.cpp DMRMMDVMProtocol.cpp DMRPlusClient.cpp DMRPlusProtocol.cpp Golay2087.cpp Golay24128.cpp Hamming.cpp M17Client.cpp M17CRC.cpp M17Packet.cpp M17Client.cpp M17Protocol.cpp QR1676.cpp RS129.cpp Semaphore.cpp Utils.cpp WiresXCmd.cpp WiresXCmdHandler.cpp WiresXInfo.cpp URFClient.cpp URFProtocol.cpp URFPeer.cpp YSFClient.cpp YSFConvolution.cpp YSFFich.cpp YSFNode.cpp YSFNodeDir.cpp YSFNodeDirFile.cpp YSFNodeDirHttp.cpp YSFPayload.cpp YSFProtocol.cpp YSFUtils.cpp
G3SRCS = G3Client.cpp G3Protocol.cpp RawSocket.cpp UDPMsgSocket.cpp
SRCS = $(XRFSRCS) $(XLXSRCS)

@ -35,7 +35,7 @@ CPacket::CPacket()
m_uiYsfPacketFrameId = 0;
m_uiM17FrameNumber = 0;
m_cModule = ' ';
m_uiOriginId = ORIGIN_LOCAL;
m_eOrigin = EOrigin::local;
m_eCodecIn = ECodecType::none;
m_bLastPacket = false;
};
@ -53,7 +53,7 @@ CPacket::CPacket(uint16_t sid, uint8_t dstarpid)
m_uiYsfPacketFrameId = 0xFF;
m_uiM17FrameNumber = 0x8000U;
m_cModule = ' ';
m_uiOriginId = ORIGIN_LOCAL;
m_eOrigin = EOrigin::local;
m_eCodecIn = ECodecType::dstar;
m_bLastPacket = (0x40U == (dstarpid & 0x40U));
};
@ -71,7 +71,7 @@ CPacket::CPacket(uint16_t sid, uint8_t dmrpid, uint8_t dmrspid, bool lastpacket)
m_uiYsfPacketFrameId = 0xFF;
m_uiM17FrameNumber = 0x8000U;
m_cModule = ' ';
m_uiOriginId = ORIGIN_LOCAL;
m_eOrigin = EOrigin::local;
m_eCodecIn = ECodecType::dmr;
m_bLastPacket = lastpacket;
};
@ -89,7 +89,7 @@ CPacket::CPacket(uint16_t sid, uint8_t ysfpid, uint8_t ysfsubpid, uint8_t ysffri
m_uiDmrPacketSubid = 0xFF;
m_uiM17FrameNumber = 0x8000U;
m_cModule = ' ';
m_uiOriginId = ORIGIN_LOCAL;
m_eOrigin = EOrigin::local;
m_eCodecIn = ECodecType::dmr;
m_bLastPacket = lastpacket;
}
@ -107,7 +107,7 @@ CPacket::CPacket(uint16_t sid, uint8_t dstarpid, uint8_t dmrpid, uint8_t dmrsubp
m_uiYsfPacketFrameId = ysffrid;
m_uiM17FrameNumber = 0x8000U;
m_cModule = ' ';
m_uiOriginId = ORIGIN_LOCAL;
m_eOrigin = EOrigin::local;
m_eCodecIn = codecIn;
m_bLastPacket = lastpacket;
}

@ -20,12 +20,11 @@
// Origin Id
#define ORIGIN_LOCAL 0
#define ORIGIN_PEER 1
#include "Defines.h"
#include "M17Packet.h"
enum class EOrigin { local, peer };
class CPacket
{
public:
@ -61,19 +60,20 @@ public:
uint8_t GetYsfPacketSubId(void) const { return m_uiYsfPacketSubId; }
uint8_t GetYsfPacketFrameId(void) const { return m_uiYsfPacketFrameId; }
char GetModule(void) const { return m_cModule; }
bool IsLocalOrigin(void) const { return (m_uiOriginId == ORIGIN_LOCAL); }
bool IsLocalOrigin(void) const { return (m_eOrigin == EOrigin::local); }
bool IsSecond(void) const { return m_bIsSecond; }
ECodecType GetCodecIn(void) const { return m_eCodecIn; }
// set
void UpdatePids(const uint32_t);
void SetModule(char cMod) { m_cModule = cMod; }
void SetLocalOrigin(void) { m_uiOriginId = ORIGIN_LOCAL; }
void SetRemotePeerOrigin(void) { m_uiOriginId = ORIGIN_PEER; }
void SetLocalOrigin(void) { m_eOrigin = EOrigin::local; }
void SetRemotePeerOrigin(void) { m_eOrigin = EOrigin::peer; }
protected:
// data
ECodecType m_eCodecIn;
EOrigin m_eOrigin;
bool m_bLastPacket;
bool m_bIsSecond;
char m_cModule;
@ -85,5 +85,4 @@ protected:
uint8_t m_uiYsfPacketId;
uint8_t m_uiYsfPacketSubId;
uint8_t m_uiYsfPacketFrameId;
uint8_t m_uiOriginId;
};

@ -124,21 +124,6 @@ void CProtocol::Close(void)
m_Socket6.Close();
}
////////////////////////////////////////////////////////////////////////////////////////
// packet encoding helpers
bool CProtocol::EncodeDvPacket(const CPacket &packet, CBuffer *buffer) const
{
if ( packet.IsDvFrame() )
return EncodeDvFramePacket((CDvFramePacket &)packet, buffer);
if ( packet.IsDvHeader() )
return EncodeDvHeaderPacket((CDvHeaderPacket &)packet, buffer);
std::cerr << "Can't encode an unknown packet type!" << std::endl;
return false;
}
////////////////////////////////////////////////////////////////////////////////////////
// streams helpers

@ -1,3 +1,5 @@
#pragma once
// Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved.
// urfd -- The universal reflector
@ -16,8 +18,6 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
#pragma once
#include "UDPSocket.h"
#include "PacketStream.h"
#include "DVHeaderPacket.h"
@ -83,13 +83,7 @@ public:
virtual void Task(void) = 0;
protected:
// packet encoding helpers
virtual bool EncodeDvPacket(const CPacket &, CBuffer *) const;
virtual bool EncodeDvHeaderPacket(const CDvHeaderPacket &, CBuffer *) const { return false; }
virtual bool EncodeDvFramePacket(const CDvFramePacket &, CBuffer *) const { return false; }
// stream helpers
virtual void OnDvHeaderPacketIn(std::unique_ptr<CDvHeaderPacket> &, const CIp &) {}
virtual void OnDvFramePacketIn(std::unique_ptr<CDvFramePacket> &, const CIp * = nullptr);
// stream handle helpers

@ -0,0 +1,29 @@
// urfd -- The universal reflector
// Copyright © 2021 Thomas A. Early N7TAE
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
#include "SEProtocol.h"
bool CSEProtocol::EncodeDvPacket(const CPacket &packet, CBuffer *buffer) const
{
if ( packet.IsDvFrame() )
return EncodeDvFramePacket((CDvFramePacket &)packet, buffer);
if ( packet.IsDvHeader() )
return EncodeDvHeaderPacket((CDvHeaderPacket &)packet, buffer);
std::cerr << "Can't encode an unknown packet type!" << std::endl;
return false;
}

@ -0,0 +1,29 @@
#pragma once
// urfd -- The universal reflector
// Copyright © 2021 Thomas A. Early N7TAE
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
#include "Protocol.h"
// "SE" means "Standard Encoding"
class CSEProtocol : public CProtocol
{
protected:
// packet encoding helpers
virtual bool EncodeDvPacket(const CPacket &, CBuffer *) const;
virtual bool EncodeDvHeaderPacket(const CDvHeaderPacket &, CBuffer *) const = 0;
virtual bool EncodeDvFramePacket(const CDvFramePacket &, CBuffer *) const = 0;
};

@ -395,7 +395,7 @@ void CURFProtocol::OnDvFramePacketIn(std::unique_ptr<CDvFramePacket> &DvFrame, c
DvFrame->SetRemotePeerOrigin();
// and call base class
OnDvFramePacketIn(DvFrame, Ip);
CProtocol::OnDvFramePacketIn(DvFrame, Ip);
}
////////////////////////////////////////////////////////////////////////////////////////

@ -20,12 +20,12 @@
#include "Version.h"
#include "Timer.h"
#include "Protocol.h"
#include "SEProtocol.h"
#include "Clients.h"
class CPeer;
class CURFProtocol : public CProtocol
class CURFProtocol : public CSEProtocol
{
public:
// initialization

@ -295,13 +295,13 @@ void CYsfProtocol::HandleQueue(void)
m_StreamsCache[mod].m_dvHeader = CDvHeaderPacket((CDvHeaderPacket &)*packet.get());
// encode it
EncodeDvHeaderPacket((CDvHeaderPacket &)*packet.get(), &buffer);
EncodeYSFHeaderPacket((CDvHeaderPacket &)*packet.get(), &buffer);
}
// check if it's a last frame
else if ( packet->IsLastPacket() )
{
// encode it
EncodeDvLastPacket(m_StreamsCache[mod].m_dvHeader, &buffer);
EncodeLastYSFPacket(m_StreamsCache[mod].m_dvHeader, &buffer);
}
// otherwise, just a regular DV frame
else
@ -315,7 +315,7 @@ void CYsfProtocol::HandleQueue(void)
if ( sid == 4 )
{
EncodeDvPacket(m_StreamsCache[mod].m_dvHeader, m_StreamsCache[mod].m_dvFrames, &buffer);
EncodeYSFPacket(m_StreamsCache[mod].m_dvHeader, m_StreamsCache[mod].m_dvFrames, &buffer);
}
}
}
@ -522,7 +522,7 @@ void CYsfProtocol::EncodeConnectAckPacket(CBuffer *Buffer) const
Buffer->Set(tag, sizeof(tag));
}
bool CYsfProtocol::EncodeDvHeaderPacket(const CDvHeaderPacket &Header, CBuffer *Buffer) const
bool CYsfProtocol::EncodeYSFHeaderPacket(const CDvHeaderPacket &Header, CBuffer *Buffer) const
{
uint8_t tag[] = { 'Y','S','F','D' };
uint8_t dest[] = { 'A','L','L',' ',' ',' ',' ',' ',' ',' ' };
@ -577,7 +577,7 @@ bool CYsfProtocol::EncodeDvHeaderPacket(const CDvHeaderPacket &Header, CBuffer *
return true;
}
bool CYsfProtocol::EncodeDvPacket(const CDvHeaderPacket &Header, const CDvFramePacket *DvFrames, CBuffer *Buffer) const
bool CYsfProtocol::EncodeYSFPacket(const CDvHeaderPacket &Header, const CDvFramePacket *DvFrames, CBuffer *Buffer) const
{
uint8_t tag[] = { 'Y','S','F','D' };
uint8_t dest[] = { 'A','L','L',' ',' ',' ',' ',' ',' ',' ' };
@ -669,7 +669,7 @@ bool CYsfProtocol::EncodeDvPacket(const CDvHeaderPacket &Header, const CDvFrameP
return true;
}
bool CYsfProtocol::EncodeDvLastPacket(const CDvHeaderPacket &Header, CBuffer *Buffer) const
bool CYsfProtocol::EncodeLastYSFPacket(const CDvHeaderPacket &Header, CBuffer *Buffer) const
{
uint8_t tag[] = { 'Y','S','F','D' };
uint8_t dest[] = { 'A','L','L',' ',' ',' ',' ',' ',' ',' ' };

@ -92,9 +92,9 @@ protected:
void EncodeConnectAckPacket(CBuffer *) const;
//void EncodeConnectNackPacket(const CCallsign &, char, CBuffer *);
//void EncodeDisconnectPacket(CBuffer *, std::shared_ptr<CClient>);
bool EncodeDvHeaderPacket(const CDvHeaderPacket &, CBuffer *) const;
bool EncodeDvPacket(const CDvHeaderPacket &, const CDvFramePacket *, CBuffer *) const;
bool EncodeDvLastPacket(const CDvHeaderPacket &, CBuffer *) const;
bool EncodeYSFHeaderPacket(const CDvHeaderPacket &, CBuffer *) const;
bool EncodeYSFPacket(const CDvHeaderPacket &, const CDvFramePacket *, CBuffer *) const;
bool EncodeLastYSFPacket(const CDvHeaderPacket &, CBuffer *) const;
// Wires-X packet decoding helpers
bool IsValidwirexPacket(const CBuffer &, CYSFFICH *, CCallsign *, int *, int*);

Loading…
Cancel
Save

Powered by TurnKey Linux.