Skip to content

Commit

Permalink
Supporting pseudo forwarding encapsulated session in client apps.
Browse files Browse the repository at this point in the history
  • Loading branch information
arobenko committed Sep 1, 2024
1 parent f08770c commit eb0af0f
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 4 deletions.
56 changes: 54 additions & 2 deletions client/app/common/AppClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,16 @@ namespace cc_mqttsn_client_app
namespace
{

const std::uint8_t FwdEncMsgType = 0xfe;

enum FwdEncOffset : unsigned
{
FwdEncOffset_Length = 0,
FwdEncOffset_MsgType = 1U,
FwdEncOffset_Ctrl = 2U,
FwdEncOffset_NodeId = 3U,
};

AppClient* asThis(void* data)
{
return reinterpret_cast<AppClient*>(data);
Expand Down Expand Up @@ -92,6 +102,16 @@ bool AppClient::start(int argc, const char* argv[])
return true;
}

auto fwdEncNodeId = parseBinaryData(m_opts.fwdEncNodeId());
if (!fwdEncNodeId.empty()) {
auto prefixLen = FwdEncOffset_NodeId + fwdEncNodeId.size();
m_fwdEncPrefix.resize(prefixLen);
m_fwdEncPrefix[FwdEncOffset_Length] = static_cast<std::uint8_t>(prefixLen);
m_fwdEncPrefix[FwdEncOffset_MsgType] = FwdEncMsgType;
m_fwdEncPrefix[FwdEncOffset_Ctrl] = 0U;
std::copy(fwdEncNodeId.begin(), fwdEncNodeId.end(), &m_fwdEncPrefix[FwdEncOffset_NodeId]);
}

if (!createSession()) {
return false;
}
Expand Down Expand Up @@ -445,7 +465,16 @@ unsigned AppClient::cancelNextTickWaitInternal()
void AppClient::sendDataInternal(const unsigned char* buf, unsigned bufLen, unsigned broadcastRadius)
{
assert(m_session);
m_session->sendData(buf, bufLen, broadcastRadius);
if (m_fwdEncPrefix.empty()) {
m_session->sendData(buf, bufLen, broadcastRadius);
return;
}

std::vector<std::uint8_t> encData;
encData.reserve(m_fwdEncPrefix.size() + bufLen);
encData.insert(encData.end(), m_fwdEncPrefix.begin(), m_fwdEncPrefix.end());
encData.insert(encData.end(), buf, buf + bufLen);
m_session->sendData(encData.data(), encData.size(), broadcastRadius);
}

bool AppClient::createSession()
Expand All @@ -461,7 +490,30 @@ bool AppClient::createSession()
{
assert(m_client);
m_lastAddr = addr;
::cc_mqttsn_client_process_data(m_client.get(), buf, static_cast<unsigned>(bufLen), origin);

if (m_fwdEncPrefix.empty()) {
::cc_mqttsn_client_process_data(m_client.get(), buf, static_cast<unsigned>(bufLen), origin);
return;
}

do {
if (bufLen <= m_fwdEncPrefix.size()) {
break;
}

if (!std::equal(m_fwdEncPrefix.begin(), m_fwdEncPrefix.begin() + FwdEncOffset_Ctrl, buf)) {
break;
}

if (!std::equal(m_fwdEncPrefix.begin() + FwdEncOffset_NodeId, m_fwdEncPrefix.end(), &buf[FwdEncOffset_NodeId])) {
break;
}

::cc_mqttsn_client_process_data(m_client.get(), buf + m_fwdEncPrefix.size(), static_cast<unsigned>(bufLen - m_fwdEncPrefix.size()), origin);
return;
} while (false);

logError() << "Recieved data doesn't have appropriate forwarding encapsulation prefix, ignoring..." << std::endl;
});

m_session->setNetworkErrorReportCb(
Expand Down
1 change: 1 addition & 0 deletions client/app/common/AppClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ class AppClient
ProgramOptions m_opts;
ClientPtr m_client;
SessionPtr m_session;
std::vector<std::uint8_t> m_fwdEncPrefix;
Addr m_lastAddr;
};

Expand Down
15 changes: 15 additions & 0 deletions client/app/common/ProgramOptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,16 @@ void ProgramOptions::addWill()
m_desc.add(opts);
}

void ProgramOptions::addEncapsulate()
{
po::options_description opts("Forwarder Encapsulation");
opts.add_options()
("fwd-enc-node-id", po::value<std::string>()->default_value(std::string()), "Emulate forwarder encapsulation with specified node ID (passed as binary data). Use \"\\x\" prefix before hex value of each byte")
;

m_desc.add(opts);
}

void ProgramOptions::addPublish()
{
po::options_description opts("Publish Options");
Expand Down Expand Up @@ -202,6 +212,11 @@ unsigned ProgramOptions::willQos() const
return m_vm["will-qos"].as<unsigned>();
}

std::string ProgramOptions::fwdEncNodeId() const
{
return m_vm["fwd-enc-node-id"].as<std::string>();
}

std::string ProgramOptions::pubTopic() const
{
return m_vm["pub-topic"].as<std::string>();
Expand Down
6 changes: 5 additions & 1 deletion client/app/common/ProgramOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class ProgramOptions
void addDiscover();
void addConnect();
void addWill();
void addEncapsulate();
void addPublish();
void addSubscribe();

Expand Down Expand Up @@ -62,7 +63,10 @@ class ProgramOptions
// Will Options
std::string willTopic() const;
std::string willMessage() const;
unsigned willQos() const;
unsigned willQos() const;

// Forwarder Encapsulation options
std::string fwdEncNodeId() const;

// Publish Options
std::string pubTopic() const;
Expand Down
1 change: 1 addition & 0 deletions client/app/pub/Pub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ Pub::Pub(boost::asio::io_context& io, int& result) :
opts().addNetwork();
opts().addConnect();
opts().addWill();
opts().addEncapsulate();
opts().addPublish();
}

Expand Down
1 change: 1 addition & 0 deletions client/app/sub/Sub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ Sub::Sub(boost::asio::io_context& io, int& result) :
opts().addNetwork();
opts().addConnect();
opts().addWill();
opts().addEncapsulate();
opts().addSubscribe();
}

Expand Down
2 changes: 1 addition & 1 deletion gateway/lib/src/session_op/Encapsulate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ void Encapsulate::sendDataClientReqFromSession(
unsigned broadcastRadius)
{
FwdMsg_SN fwdMsg;
fwdMsg.field_ctrl().field_radius().setValue(3); // TODO: make it configurable
//fwdMsg.field_ctrl().field_radius().setValue(3); // TODO: make it configurable
comms::util::assign(fwdMsg.field_nodeId().value(), nodeId.begin(), nodeId.end());

MqttsnFrame frame;
Expand Down

0 comments on commit eb0af0f

Please sign in to comment.