mux: add mux custom attributes

Signed-off-by: Wataru Ishida <ishida@nel-america.com>
This commit is contained in:
Wataru Ishida
2020-01-09 17:23:27 +00:00
committed by Wataru Ishida
parent 31658b2d44
commit 2f2590ee66
10 changed files with 227 additions and 25 deletions

View File

@@ -34,13 +34,17 @@ HEADERS := $(wildcard *.hpp $(TAI_LIB_DIR)/*.hpp $(TAI_FRAMEWORK_DIR)/*.hpp)
OBJECTS := $(addprefix $(BUILDDIR)/,$(SOURCES:%.cpp=%.o)) OBJECTS := $(addprefix $(BUILDDIR)/,$(SOURCES:%.cpp=%.o))
DEPS := $(addprefix $(BUILDDIR)/,$(SOURCES:%.cpp=%.d)) DEPS := $(addprefix $(BUILDDIR)/,$(SOURCES:%.cpp=%.d))
.PHONY = all meta test cmd docker docker-image bash clean clean-all
all: $(PROG) all: $(PROG)
$(PROG): $(TAI_META_LIBRARY) $(OBJECTS) $(HEADERS) $(PROG): $(TAI_META_LIBRARY) $(OBJECTS) $(HEADERS)
$(CXX) $(CFLAGS) $(INCLUDES) -shared $(OBJECTS) -o $@ -ldl -lpthread -L $(dir $(TAI_META_LIBRARY)) -lmetatai $(CXX) $(CFLAGS) $(INCLUDES) -shared $(OBJECTS) -o $@ -ldl -lpthread -L $(dir $(TAI_META_LIBRARY)) -lmetatai
$(TAI_META_LIBRARY): $(TAI_META_LIBRARY): $(wildcard custom_attrs/*)
$(MAKE) -C $(@D) TAI_META_CUSTOM_FILES="$(abspath $(wildcard custom_attrs/*))" $(MAKE) -C $(@D)
meta: $(TAI_META_LIBRARY)
$(BUILDDIR)/%.o: %.cpp Makefile $(BUILDDIR)/%.o: %.cpp Makefile
mkdir -p $(@D) mkdir -p $(@D)

View File

@@ -0,0 +1,18 @@
#ifndef __TAI_MUX_HOSTIF__
#define __TAI_MUX_HOSTIF__
#include <tai.h>
typedef enum _mux_host_interface_attr_t
{
/**
* @brief The real OID
*
* @type #tai_object_id_t
* @flags READ_ONLY
*/
TAI_HOST_INTERFACE_ATTR_MUX_REAL_OID = TAI_HOST_INTERFACE_ATTR_CUSTOM_MUX_START,
} mux_host_interface_attr_t;
#endif

View File

@@ -0,0 +1,41 @@
#ifndef __TAI_MUX_MODULE__
#define __TAI_MUX_MODULE__
#include <tai.h>
typedef enum _tai_mux_platform_adapter_type_t
{
TAI_MUX_PLATFORM_ADAPTER_TYPE_UNKNOWN,
TAI_MUX_PLATFORM_ADAPTER_TYPE_STATIC,
TAI_MUX_PLATFORM_ADAPTER_TYPE_MAX,
} tai_mux_platform_adapter_type_t;
typedef enum _mux_module_attr_t
{
/**
* @brief The platform adapter type
*
* @type #tai_mux_platform_adapter_type_t
* @flags READ_ONLY
*/
TAI_MODULE_ATTR_MUX_PLATFORM_ADAPTER_TYPE = TAI_MODULE_ATTR_CUSTOM_MUX_START,
/**
* @brief The loaded TAI library
*
* @type #tai_char_list_t
* @flags READ_ONLY
*/
TAI_MODULE_ATTR_MUX_CURRENT_LOADED_TAI_LIBRARY,
/**
* @brief The real OID
*
* @type #tai_object_id_t
* @flags READ_ONLY
*/
TAI_MODULE_ATTR_MUX_REAL_OID,
} mux_module_attr_t;
#endif

View File

@@ -0,0 +1,18 @@
#ifndef __TAI_MUX_NETWORKIF__
#define __TAI_MUX_NETWORKIF__
#include <tai.h>
typedef enum _mux_network_interface_attr_t
{
/**
* @brief The real OID
*
* @type #tai_object_id_t
* @flags READ_ONLY
*/
TAI_NETWORK_INTERFACE_ATTR_MUX_REAL_OID = TAI_NETWORK_INTERFACE_ATTR_CUSTOM_MUX_START,
} mux_network_interface_attr_t;
#endif

View File

@@ -21,6 +21,10 @@ namespace tai::mux {
~ModuleAdapter(); ~ModuleAdapter();
static uint64_t dl_address(const std::string& name); static uint64_t dl_address(const std::string& name);
std::string name() const {
return m_name;
}
tai_status_t tai_api_initialize(uint64_t flags, const tai_service_method_table_t* services) { tai_status_t tai_api_initialize(uint64_t flags, const tai_service_method_table_t* services) {
return m_tai_api_initialize(flags, services); return m_tai_api_initialize(flags, services);
} }
@@ -192,7 +196,7 @@ namespace tai::mux {
private: private:
void* m_dl; void* m_dl;
const std::string& m_name; const std::string m_name;
tai_api_initialize_fn m_tai_api_initialize; tai_api_initialize_fn m_tai_api_initialize;
tai_api_uninitialize_fn m_tai_api_uninitialize; tai_api_uninitialize_fn m_tai_api_uninitialize;
tai_api_query_fn m_tai_api_query; tai_api_query_fn m_tai_api_query;

View File

@@ -32,12 +32,12 @@ namespace tai::mux {
} else { } else {
pa_name = std::string(pa); pa_name = std::string(pa);
} }
platform_adapter_t pa_kind; tai_mux_platform_adapter_type_t pa_type;
if ( pa_name == "static" ) { if ( pa_name == "static" ) {
pa_kind = PLATFORM_ADAPTER_STATIC; pa_type = TAI_MUX_PLATFORM_ADAPTER_TYPE_STATIC;
} }
switch ( pa_kind ) { switch ( pa_type ) {
case PLATFORM_ADAPTER_STATIC: case TAI_MUX_PLATFORM_ADAPTER_TYPE_STATIC:
m_pa = std::make_shared<StaticPlatformAdapter>(0, services); m_pa = std::make_shared<StaticPlatformAdapter>(0, services);
break; break;
default: default:
@@ -172,7 +172,30 @@ namespace tai::mux {
return TAI_STATUS_SUCCESS; return TAI_STATUS_SUCCESS;
} }
template <> const AttributeInfoMap<TAI_OBJECT_TYPE_MODULE> Config<TAI_OBJECT_TYPE_MODULE>::m_info {}; tai_status_t attribute_getter(tai_attribute_t* const attribute, void* user) {
auto ctx = reinterpret_cast<context*>(user);
auto pa = ctx->pa;
return pa->get_mux_attribute(ctx->type, ctx->oid, attribute);
}
tai_status_t attribute_setter(const tai_attribute_t* const attribute, FSMState* state, void* user) {
auto ctx = reinterpret_cast<context*>(user);
auto pa = ctx->pa;
return pa->set_mux_attribute(ctx->type, ctx->oid, attribute, state);
}
using M = AttributeInfo<TAI_OBJECT_TYPE_MODULE>;
using N = AttributeInfo<TAI_OBJECT_TYPE_NETWORKIF>;
using H = AttributeInfo<TAI_OBJECT_TYPE_HOSTIF>;
template <> const AttributeInfoMap<TAI_OBJECT_TYPE_MODULE> Config<TAI_OBJECT_TYPE_MODULE>::m_info {
mux::M(TAI_MODULE_ATTR_MUX_PLATFORM_ADAPTER_TYPE)
.set_getter(&mux::attribute_getter),
mux::M(TAI_MODULE_ATTR_MUX_CURRENT_LOADED_TAI_LIBRARY)
.set_getter(&mux::attribute_getter),
mux::M(TAI_MODULE_ATTR_MUX_REAL_OID)
.set_getter(&mux::attribute_getter),
};
Module::Module(uint32_t count, const tai_attribute_t *list, S_PlatformAdapter platform) : Object(platform) { Module::Module(uint32_t count, const tai_attribute_t *list, S_PlatformAdapter platform) : Object(platform) {
auto mod_addr = find_attribute_in_list(TAI_MODULE_ATTR_LOCATION, count, list); auto mod_addr = find_attribute_in_list(TAI_MODULE_ATTR_LOCATION, count, list);
@@ -180,7 +203,7 @@ namespace tai::mux {
throw Exception(TAI_STATUS_MANDATORY_ATTRIBUTE_MISSING); throw Exception(TAI_STATUS_MANDATORY_ATTRIBUTE_MISSING);
} }
const std::string location(mod_addr->charlist.list, mod_addr->charlist.count); const std::string location(mod_addr->charlist.list, mod_addr->charlist.count);
auto adapter = m_pa->get_module_adapter(location); auto adapter = m_context.pa->get_module_adapter(location);
if ( adapter == nullptr ) { if ( adapter == nullptr ) {
throw Exception(TAI_STATUS_FAILURE); throw Exception(TAI_STATUS_FAILURE);
} }
@@ -189,12 +212,16 @@ namespace tai::mux {
if ( ret != TAI_STATUS_SUCCESS ) { if ( ret != TAI_STATUS_SUCCESS ) {
throw Exception(ret); throw Exception(ret);
} }
if ( platform->create_mapping(&m_id, m_adapter, m_real_id) != 0 ) { if ( platform->create_mapping(&m_context.oid, m_adapter, m_real_id) != 0 ) {
throw Exception(TAI_STATUS_FAILURE); throw Exception(TAI_STATUS_FAILURE);
} }
m_context.type = TAI_OBJECT_TYPE_MODULE;
} }
template <> const AttributeInfoMap<TAI_OBJECT_TYPE_NETWORKIF> Config<TAI_OBJECT_TYPE_NETWORKIF>::m_info {}; template <> const AttributeInfoMap<TAI_OBJECT_TYPE_NETWORKIF> Config<TAI_OBJECT_TYPE_NETWORKIF>::m_info {
mux::N(TAI_NETWORK_INTERFACE_ATTR_MUX_REAL_OID)
.set_getter(&mux::attribute_getter),
};
NetIf::NetIf(S_Module module, uint32_t count, const tai_attribute_t *list, S_PlatformAdapter platform) : m_module(module), Object(platform) { NetIf::NetIf(S_Module module, uint32_t count, const tai_attribute_t *list, S_PlatformAdapter platform) : m_module(module), Object(platform) {
m_adapter = module->adapter(); m_adapter = module->adapter();
@@ -205,12 +232,16 @@ namespace tai::mux {
if ( ret != TAI_STATUS_SUCCESS ) { if ( ret != TAI_STATUS_SUCCESS ) {
throw Exception(ret); throw Exception(ret);
} }
if ( platform->create_mapping(&m_id, m_adapter, m_real_id) != 0 ) { if ( platform->create_mapping(&m_context.oid, m_adapter, m_real_id) != 0 ) {
throw Exception(TAI_STATUS_FAILURE); throw Exception(TAI_STATUS_FAILURE);
} }
m_context.type = TAI_OBJECT_TYPE_NETWORKIF;
} }
template <> const AttributeInfoMap<TAI_OBJECT_TYPE_HOSTIF> Config<TAI_OBJECT_TYPE_HOSTIF>::m_info {}; template <> const AttributeInfoMap<TAI_OBJECT_TYPE_HOSTIF> Config<TAI_OBJECT_TYPE_HOSTIF>::m_info {
mux::H(TAI_HOST_INTERFACE_ATTR_MUX_REAL_OID)
.set_getter(&mux::attribute_getter),
};
HostIf::HostIf(S_Module module, uint32_t count, const tai_attribute_t *list, S_PlatformAdapter platform) : m_module(module), Object(platform) { HostIf::HostIf(S_Module module, uint32_t count, const tai_attribute_t *list, S_PlatformAdapter platform) : m_module(module), Object(platform) {
m_adapter = module->adapter(); m_adapter = module->adapter();
@@ -221,8 +252,9 @@ namespace tai::mux {
if ( ret != TAI_STATUS_SUCCESS ) { if ( ret != TAI_STATUS_SUCCESS ) {
throw Exception(ret); throw Exception(ret);
} }
if ( platform->create_mapping(&m_id, m_adapter, m_real_id) != 0 ) { if ( platform->create_mapping(&m_context.oid, m_adapter, m_real_id) != 0 ) {
throw Exception(TAI_STATUS_FAILURE); throw Exception(TAI_STATUS_FAILURE);
} }
m_context.type = TAI_OBJECT_TYPE_HOSTIF;
} }
}; };

View File

@@ -38,15 +38,25 @@ namespace tai::mux {
using S_ConstNetIf = std::shared_ptr<const NetIf>; using S_ConstNetIf = std::shared_ptr<const NetIf>;
using S_ConstHostIf = std::shared_ptr<const HostIf>; using S_ConstHostIf = std::shared_ptr<const HostIf>;
struct context {
S_PlatformAdapter pa;
tai_object_id_t oid;
tai_object_type_t type;
};
tai_status_t attribute_getter(tai_attribute_t* const attribute, void* user);
tai_status_t attribute_setter(const tai_attribute_t* const attribute, FSMState* state, void* user);
template<tai_object_type_t T> template<tai_object_type_t T>
class Object : public tai::framework::Object<T> { class Object : public tai::framework::Object<T> {
public: public:
Object(S_PlatformAdapter pa) : m_pa(pa), tai::framework::Object<T>(0, nullptr, std::make_shared<tai::framework::FSM>(), nullptr, Object(S_PlatformAdapter pa) : m_context{pa}, tai::framework::Object<T>(0, nullptr, std::make_shared<tai::framework::FSM>(),
reinterpret_cast<void*>(&m_context),
std::bind(&Object::default_setter, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5), std::bind(&Object::default_setter, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5),
std::bind(&Object::default_getter, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)) {} std::bind(&Object::default_getter, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)) {}
tai_object_id_t id() const { tai_object_id_t id() const {
return m_id; return m_context.oid;
} }
tai_object_id_t real_id() const { tai_object_id_t real_id() const {
@@ -54,15 +64,18 @@ namespace tai::mux {
} }
protected: protected:
tai_object_id_t m_id, m_real_id; tai_object_id_t m_real_id;
S_PlatformAdapter m_pa; context m_context;
S_ModuleAdapter m_adapter; S_ModuleAdapter m_adapter;
private: private:
tai_status_t default_setter(uint32_t count, const tai_attribute_t* const attribute, FSMState* fsm, void* const user, const tai::framework::error_info* const info) { tai_status_t default_setter(uint32_t count, const tai_attribute_t* const attribute, FSMState* fsm, void* const user, const tai::framework::error_info* const info) {
return m_pa->set(T, id(), count, attribute); return m_context.pa->set(T, id(), count, attribute);
} }
tai_status_t default_getter(uint32_t count, tai_attribute_t* const attribute, void* const user, const tai::framework::error_info* const info) { tai_status_t default_getter(uint32_t count, tai_attribute_t* const attribute, void* const user, const tai::framework::error_info* const info) {
return m_pa->get(T, id(), count, attribute); auto ret = m_context.pa->get(T, id(), count, attribute);
if ( ret != TAI_STATUS_SUCCESS ) {
}
return ret;
} }
}; };

View File

@@ -1,6 +1,7 @@
#include "platform_adapter.hpp" #include "platform_adapter.hpp"
#include "module_adapter.hpp" #include "module_adapter.hpp"
#include <algorithm> #include <algorithm>
#include <cstring>
namespace tai::mux { namespace tai::mux {
@@ -181,4 +182,69 @@ namespace tai::mux {
} }
return TAI_STATUS_SUCCESS; return TAI_STATUS_SUCCESS;
} }
tai_status_t PlatformAdapter::get_mux_attribute(const tai_object_type_t& type, const tai_object_id_t& id, tai_attribute_t* const attr) {
S_ModuleAdapter adapter;
tai_object_id_t real_id;
if ( get_mapping(id, &adapter, &real_id) != 0 ) {
return TAI_STATUS_FAILURE;
}
switch (type) {
case TAI_OBJECT_TYPE_MODULE:
switch (attr->id) {
case TAI_MODULE_ATTR_MUX_PLATFORM_ADAPTER_TYPE:
attr->value.u32 = this->type();
break;
case TAI_MODULE_ATTR_MUX_CURRENT_LOADED_TAI_LIBRARY:
{
auto n = adapter->name();
auto v = attr->value.charlist.count;
attr->value.charlist.count = n.size() + 1;
if ( v < (n.size() + 1) ) {
return TAI_STATUS_BUFFER_OVERFLOW;
}
std::strncpy(attr->value.charlist.list, n.c_str(), v);
break;
}
case TAI_MODULE_ATTR_MUX_REAL_OID:
attr->value.oid = real_id;
break;
default:
return TAI_STATUS_ATTR_NOT_SUPPORTED_0;
}
break;
case TAI_OBJECT_TYPE_NETWORKIF:
switch (attr->id) {
case TAI_NETWORK_INTERFACE_ATTR_MUX_REAL_OID:
attr->value.oid = real_id;
break;
default:
return TAI_STATUS_ATTR_NOT_SUPPORTED_0;
}
break;
case TAI_OBJECT_TYPE_HOSTIF:
switch (attr->id) {
case TAI_HOST_INTERFACE_ATTR_MUX_REAL_OID:
attr->value.oid = real_id;
break;
default:
return TAI_STATUS_ATTR_NOT_SUPPORTED_0;
}
break;
default:
return TAI_STATUS_NOT_SUPPORTED;
}
return TAI_STATUS_SUCCESS;
}
tai_status_t PlatformAdapter::set_mux_attribute(const tai_object_type_t& type, const tai_object_id_t& id, const tai_attribute_t* const attribute, tai::framework::FSMState* state) {
S_ModuleAdapter adapter;
tai_object_id_t real_id;
if ( get_mapping(id, &adapter, &real_id) != 0 ) {
return TAI_STATUS_FAILURE;
}
return TAI_STATUS_NOT_SUPPORTED;
}
} }

View File

@@ -12,6 +12,8 @@
#include "attribute.hpp" #include "attribute.hpp"
#include "logger.hpp" #include "logger.hpp"
#include "fsm.hpp"
namespace tai::mux { namespace tai::mux {
class ModuleAdapter; class ModuleAdapter;
@@ -32,11 +34,6 @@ namespace tai::mux {
using S_NotificationContext = std::shared_ptr<NotificationContext>; using S_NotificationContext = std::shared_ptr<NotificationContext>;
enum platform_adapter_t {
PLATFORM_ADAPTER_UNKNOWN,
PLATFORM_ADAPTER_STATIC,
};
static const int TAI_MUX_NUM_MAX_OBJECT = 256; static const int TAI_MUX_NUM_MAX_OBJECT = 256;
class OIDAllocator { class OIDAllocator {
@@ -67,6 +64,8 @@ namespace tai::mux {
PlatformAdapter(){} PlatformAdapter(){}
virtual ~PlatformAdapter(){} virtual ~PlatformAdapter(){}
virtual tai_mux_platform_adapter_type_t type() const = 0;
int get_mapping(const tai_object_id_t& id, S_ModuleAdapter *adapter, tai_object_id_t *real_id) { int get_mapping(const tai_object_id_t& id, S_ModuleAdapter *adapter, tai_object_id_t *real_id) {
if ( m_map.find(id) == m_map.end() ) { if ( m_map.find(id) == m_map.end() ) {
return -1; return -1;
@@ -114,6 +113,9 @@ namespace tai::mux {
tai_status_t get(const tai_object_type_t& type, const tai_object_id_t& id, uint32_t count, tai_attribute_t* const attrs); tai_status_t get(const tai_object_type_t& type, const tai_object_id_t& id, uint32_t count, tai_attribute_t* const attrs);
tai_status_t set(const tai_object_type_t& type, const tai_object_id_t& id, uint32_t count, const tai_attribute_t* const attrs); tai_status_t set(const tai_object_type_t& type, const tai_object_id_t& id, uint32_t count, const tai_attribute_t* const attrs);
virtual tai_status_t get_mux_attribute(const tai_object_type_t& type, const tai_object_id_t& oid, tai_attribute_t* const attribute);
virtual tai_status_t set_mux_attribute(const tai_object_type_t& type, const tai_object_id_t& oid, const tai_attribute_t* const attribute, tai::framework::FSMState* state);
private: private:
PlatformAdapter(const PlatformAdapter&){} PlatformAdapter(const PlatformAdapter&){}
void operator = (const PlatformAdapter&){} void operator = (const PlatformAdapter&){}

View File

@@ -33,6 +33,10 @@ namespace tai::mux {
} }
return set; return set;
}; };
virtual tai_mux_platform_adapter_type_t type() const {
return TAI_MUX_PLATFORM_ADAPTER_TYPE_STATIC;
}
private: private:
std::map<std::string, S_ModuleAdapter> m_ma_map; std::map<std::string, S_ModuleAdapter> m_ma_map;
std::thread m_th; std::thread m_th;