Commit 43a22ffc authored by aligungr's avatar aligungr

Performance improvements

parent b642f476
......@@ -11,7 +11,6 @@
#include <ue/app/task.hpp>
#include <ue/l3/task.hpp>
#include <ue/rls/task.hpp>
#include <ue/tun/task.hpp>
#include <utils/common.hpp>
#include <utils/printer.hpp>
......
......@@ -11,7 +11,7 @@
#include <memory>
#include <thread>
#include <ue/nts.hpp>
#include <ue/tun/task.hpp>
#include <ue/tun/layer.hpp>
#include <ue/types.hpp>
#include <unordered_map>
#include <utils/logger.hpp>
......@@ -26,8 +26,6 @@ class UeAppTask : public NtsTask
private:
TaskBase *m_base;
std::unique_ptr<Logger> m_logger;
std::array<TunTask *, 16> m_tunTasks{};
ECmState m_cmState{};
friend class UeCmdHandler;
......
......@@ -24,22 +24,6 @@
namespace nr::ue
{
struct NmAppToTun : NtsMessage
{
enum PR
{
DATA_PDU_DELIVERY
} present;
// DATA_PDU_DELIVERY
int psi{};
OctetString data{};
explicit NmAppToTun(PR present) : NtsMessage(NtsMessageType::UE_APP_TO_TUN), present(present)
{
}
};
struct NmUeTunToApp : NtsMessage
{
enum PR
......
//
// This file is a part of UERANSIM open source project.
// Copyright (c) 2021 ALİ GÜNGÖR.
//
// The software and all associated files are licensed under GPL-3.0
// and subject to the terms and conditions defined in LICENSE file.
//
#include "task.hpp"
#include <cstring>
#include <unistd.h>
#include <ue/l3/task.hpp>
#include <ue/nts.hpp>
#include <utils/libc_error.hpp>
#include <utils/scoped_thread.hpp>
// TODO: May be reduced to MTU 1500
#define RECEIVER_BUFFER_SIZE 8000
struct ReceiverArgs
{
int fd{};
int psi{};
NtsTask *targetTask{};
};
static std::string GetErrorMessage(const std::string &cause)
{
std::string what = cause;
int errNo = errno;
if (errNo != 0)
what += " (" + std::string{strerror(errNo)} + ")";
return what;
}
static void ReceiverThread(ReceiverArgs *args)
{
int fd = args->fd;
int psi = args->psi;
NtsTask *targetTask = args->targetTask;
delete args;
uint8_t buffer[RECEIVER_BUFFER_SIZE];
while (true)
{
ssize_t n = ::read(fd, buffer, RECEIVER_BUFFER_SIZE);
if (n < 0)
throw std::runtime_error(GetErrorMessage("TUN device could not read"));
if (n > 0)
{
auto m = std::make_unique<nr::ue::NmUeTunToApp>(nr::ue::NmUeTunToApp::DATA_PDU_DELIVERY);
m->psi = psi;
m->data = OctetString::FromArray(buffer, static_cast<size_t>(n));
targetTask->push(std::move(m));
}
}
}
namespace nr::ue
{
ue::TunTask::TunTask(TaskBase *base, int psi, int fd) : m_base{base}, m_psi{psi}, m_fd{fd}, m_receiver{}
{
}
void TunTask::onStart()
{
auto *receiverArgs = new ReceiverArgs();
receiverArgs->fd = m_fd;
receiverArgs->targetTask = m_base->l3Task;
receiverArgs->psi = m_psi;
m_receiver =
new ScopedThread([](void *args) { ReceiverThread(reinterpret_cast<ReceiverArgs *>(args)); }, receiverArgs);
}
void TunTask::onQuit()
{
delete m_receiver;
::close(m_fd);
}
void TunTask::onLoop()
{
auto msg = take();
if (!msg)
return;
switch (msg->msgType)
{
case NtsMessageType::UE_APP_TO_TUN: {
auto &w = dynamic_cast<NmAppToTun &>(*msg);
ssize_t res = ::write(m_fd, w.data.data(), w.data.length());
if (res < 0)
throw std::runtime_error(GetErrorMessage("TUN device could not write"));
if (res != w.data.length())
throw std::runtime_error(GetErrorMessage("TUN device partially written"));
break;
}
default:
break;
}
}
} // namespace nr::ue
\ No newline at end of file
//
// This file is a part of UERANSIM open source project.
// Copyright (c) 2021 ALİ GÜNGÖR.
//
// The software and all associated files are licensed under GPL-3.0
// and subject to the terms and conditions defined in LICENSE file.
//
#pragma once
#include <memory>
#include <thread>
#include <ue/nts.hpp>
#include <ue/types.hpp>
#include <unordered_map>
#include <utils/logger.hpp>
#include <utils/nts.hpp>
#include <vector>
namespace nr::ue
{
class TunTask : public NtsTask
{
private:
TaskBase *m_base;
int m_psi;
int m_fd;
ScopedThread *m_receiver;
friend class UeCmdHandler;
public:
explicit TunTask(TaskBase *taskBase, int psi, int fd);
~TunTask() override = default;
protected:
void onStart() override;
void onLoop() override;
void onQuit() override;
};
} // namespace nr::ue
......@@ -35,6 +35,7 @@ class UeAppTask;
class UeL3Task;
class UeRlsTask;
class UserEquipment;
class TunLayer;
struct UeCellDesc
{
......@@ -201,6 +202,7 @@ struct TaskBase
UeAppTask *appTask{};
UeL3Task *l3Task{};
UeRlsTask *rlsTask{};
TunLayer* tunLayer{};
};
struct RrcTimers
......
......@@ -29,6 +29,7 @@ UserEquipment::UserEquipment(UeConfig *config, app::IUeController *ueController,
base->l3Task = new UeL3Task(base);
base->appTask = new UeAppTask(base);
base->rlsTask = new UeRlsTask(base);
base->tunLayer = new TunLayer(base);
taskBase = base;
}
......
......@@ -46,7 +46,6 @@ enum class NtsMessageType
GNB_NGAP_TO_GTP,
GNB_SCTP,
UE_APP_TO_TUN,
UE_TUN_TO_APP,
UE_RRC_TO_RLS,
UE_RLS_TO_RRC,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment