From a6d32ede2ebe131fc3334c68c1e71bf9de200cc5 Mon Sep 17 00:00:00 2001 From: Oren Vormaser Date: Tue, 21 Jul 2020 18:33:05 +0300 Subject: [PATCH 1/2] tlvf: Add new cli Signed-off-by: Oren Vormaser --- .../src/beerocks/cli/beerocks_cli_bml.cpp | 32 +++++++++++++++++++ .../src/beerocks/cli/beerocks_cli_bml.h | 12 +++++++ 2 files changed, 44 insertions(+) diff --git a/controller/src/beerocks/cli/beerocks_cli_bml.cpp b/controller/src/beerocks/cli/beerocks_cli_bml.cpp index 2ae4084a5b..f3dd73038d 100644 --- a/controller/src/beerocks/cli/beerocks_cli_bml.cpp +++ b/controller/src/beerocks/cli/beerocks_cli_bml.cpp @@ -379,6 +379,14 @@ void cli_bml::setFunctionsMapAndArray() "returns operational status of all radios on the device", static_cast(&cli_bml::bml_get_device_operational_radios_caller), 0, 1, STRING_ARG); + + //================================================ + //Registration of the new BML message API - caller function have one argument of type string + insertCommandToMap("bml_oren_print", "", "print a string back to stdout", + static_cast(&cli_bml::bml_oren_print_caller), 0, 1, STRING_ARG); + + //================================================ + insertCommandToMap("bml_stat_register_cb", "[]", "Registers a callback function to periodic statistics update from the " "beerocks platform, call with 'x' to unregister the callback ", @@ -932,6 +940,18 @@ int cli_bml::bml_get_device_operational_radios_caller(int numOfArgs) return get_device_operational_radios(args.stringArgs[0]); } +//================================================ +//BML API caller function - input validation +int cli_bml::bml_oren_print_caller(int numOfArgs) +{ + if (numOfArgs != 1) { + return -1; + } + return oren_print(args.stringArgs[0]); +} + +//================================================ + int cli_bml::stat_register_cb_caller(int numOfArgs) { if (numOfArgs < 0) @@ -1472,6 +1492,18 @@ int cli_bml::get_device_operational_radios(const std::string &al_mac) return 0; } +//================================================ +//New function to handle the new BML message +int cli_bml::oren_print(const std::string &str) +{ + LOG(TRACE) << "=========> cli_bml::oren_print(): " << str << std::endl; + std::cout << "oren_print(): " << str << std::endl; + printBmlReturnVals("oren_print", BML_RET_OK); + return BML_RET_OK; +} + +//================================================ + int cli_bml::stat_register_cb(const std::string &optional) { int ret; diff --git a/controller/src/beerocks/cli/beerocks_cli_bml.h b/controller/src/beerocks/cli/beerocks_cli_bml.h index 26d3684617..6f9caae1e2 100644 --- a/controller/src/beerocks/cli/beerocks_cli_bml.h +++ b/controller/src/beerocks/cli/beerocks_cli_bml.h @@ -107,6 +107,12 @@ class cli_bml : public cli { int nw_map_query_caller(int numOfArgs); int bml_connection_map_caller(int numOfArgs); int bml_get_device_operational_radios_caller(int numOfArgs); + + //================================================ + //BML API caller function + int bml_oren_print_caller(int numOfArgs); + //================================================ + int stat_register_cb_caller(int numOfArgs); int events_register_cb_caller(int numOfArgs); int set_wifi_credentials_caller(int numOfArgs); @@ -160,6 +166,12 @@ class cli_bml : public cli { int nw_map_query(); int connection_map(); int get_device_operational_radios(const std::string &al_mac); + + //================================================ + //New function to handle the new BML message + int oren_print(const std::string &str); + //================================================ + int stat_register_cb(const std::string &optional = std::string()); int events_register_cb(const std::string &optional = std::string()); int set_wifi_credentials(const std::string &al_mac, const std::string &ssid, From 4339113a0e801e189b87ebb2aa01bcb589dcb147 Mon Sep 17 00:00:00 2001 From: Oren Vormaser Date: Tue, 21 Jul 2020 18:46:03 +0300 Subject: [PATCH 2/2] tlvf: Add new bml request-response message Signed-off-by: Oren Vormaser --- .../beerocks/tlvf/beerocks_message_action.h | 2 + .../beerocks/tlvf/beerocks_message_bml.h | 58 ++++ .../beerocks/tlvf/beerocks_message_bml.cpp | 256 ++++++++++++++++++ .../tlvf/beerocks_message_action.yaml | 4 + .../beerocks/tlvf/beerocks_message_bml.yaml | 22 ++ controller/src/beerocks/bml/bml.cpp | 19 ++ controller/src/beerocks/bml/bml.h | 12 + .../beerocks/bml/internal/bml_internal.cpp | 95 +++++++ .../src/beerocks/bml/internal/bml_internal.h | 17 ++ .../src/beerocks/cli/beerocks_cli_bml.cpp | 33 +++ .../src/beerocks/cli/beerocks_cli_bml.h | 2 + .../src/beerocks/master/son_management.cpp | 45 +++ 12 files changed, 565 insertions(+) diff --git a/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_action.h b/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_action.h index ac72c99da9..c284b28e7d 100644 --- a/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_action.h +++ b/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_action.h @@ -325,6 +325,8 @@ enum eActionOp_BML: uint8_t { ACTION_BML_NW_MAP_UPDATE = 0x1e, ACTION_BML_STATS_UPDATE = 0x1f, ACTION_BML_EVENTS_UPDATE = 0x20, + ACTION_BML_OREN_REVERSE_STR_REQUEST = 0x29, + ACTION_BML_OREN_REVERSE_STR_RESPONSE = 0x2a, ACTION_BML_SET_LEGACY_CLIENT_ROAMING_REQUEST = 0x38, ACTION_BML_SET_LEGACY_CLIENT_ROAMING_RESPONSE = 0x39, ACTION_BML_GET_LEGACY_CLIENT_ROAMING_REQUEST = 0x3a, diff --git a/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_bml.h b/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_bml.h index 03b1658add..869bfccff5 100644 --- a/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_bml.h +++ b/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_bml.h @@ -1798,6 +1798,64 @@ class cACTION_BML_UNREGISTER_TOPOLOGY_QUERY : public BaseClass eActionOp_BML* m_action_op = nullptr; }; +class cACTION_BML_OREN_REVERSE_STR_REQUEST : public BaseClass +{ + public: + cACTION_BML_OREN_REVERSE_STR_REQUEST(uint8_t* buff, size_t buff_len, bool parse = false); + explicit cACTION_BML_OREN_REVERSE_STR_REQUEST(std::shared_ptr base, bool parse = false); + ~cACTION_BML_OREN_REVERSE_STR_REQUEST(); + + static eActionOp_BML get_action_op(){ + return (eActionOp_BML)(ACTION_BML_OREN_REVERSE_STR_REQUEST); + } + uint32_t& buffer_size(); + std::string buffer_str(); + char* buffer(size_t length = 0); + bool set_buffer(const std::string& str); + bool set_buffer(const char buffer[], size_t size); + bool alloc_buffer(size_t count = 1); + void class_swap() override; + bool finalize() override; + static size_t get_initial_size(); + + private: + bool init(); + eActionOp_BML* m_action_op = nullptr; + uint32_t* m_buffer_size = nullptr; + char* m_buffer = nullptr; + size_t m_buffer_idx__ = 0; + int m_lock_order_counter__ = 0; +}; + +class cACTION_BML_OREN_REVERSE_STR_RESPONSE : public BaseClass +{ + public: + cACTION_BML_OREN_REVERSE_STR_RESPONSE(uint8_t* buff, size_t buff_len, bool parse = false); + explicit cACTION_BML_OREN_REVERSE_STR_RESPONSE(std::shared_ptr base, bool parse = false); + ~cACTION_BML_OREN_REVERSE_STR_RESPONSE(); + + static eActionOp_BML get_action_op(){ + return (eActionOp_BML)(ACTION_BML_OREN_REVERSE_STR_RESPONSE); + } + uint32_t& buffer_size(); + std::string buffer_str(); + char* buffer(size_t length = 0); + bool set_buffer(const std::string& str); + bool set_buffer(const char buffer[], size_t size); + bool alloc_buffer(size_t count = 1); + void class_swap() override; + bool finalize() override; + static size_t get_initial_size(); + + private: + bool init(); + eActionOp_BML* m_action_op = nullptr; + uint32_t* m_buffer_size = nullptr; + char* m_buffer = nullptr; + size_t m_buffer_idx__ = 0; + int m_lock_order_counter__ = 0; +}; + class cACTION_BML_TRIGGER_CHANNEL_SELECTION_REQUEST : public BaseClass { public: diff --git a/common/beerocks/tlvf/AutoGenerated/src/beerocks/tlvf/beerocks_message_bml.cpp b/common/beerocks/tlvf/AutoGenerated/src/beerocks/tlvf/beerocks_message_bml.cpp index 83c640541c..e6aaf7dd94 100644 --- a/common/beerocks/tlvf/AutoGenerated/src/beerocks/tlvf/beerocks_message_bml.cpp +++ b/common/beerocks/tlvf/AutoGenerated/src/beerocks/tlvf/beerocks_message_bml.cpp @@ -6117,6 +6117,262 @@ bool cACTION_BML_UNREGISTER_TOPOLOGY_QUERY::init() return true; } +cACTION_BML_OREN_REVERSE_STR_REQUEST::cACTION_BML_OREN_REVERSE_STR_REQUEST(uint8_t* buff, size_t buff_len, bool parse) : + BaseClass(buff, buff_len, parse) { + m_init_succeeded = init(); +} +cACTION_BML_OREN_REVERSE_STR_REQUEST::cACTION_BML_OREN_REVERSE_STR_REQUEST(std::shared_ptr base, bool parse) : +BaseClass(base->getBuffPtr(), base->getBuffRemainingBytes(), parse){ + m_init_succeeded = init(); +} +cACTION_BML_OREN_REVERSE_STR_REQUEST::~cACTION_BML_OREN_REVERSE_STR_REQUEST() { +} +uint32_t& cACTION_BML_OREN_REVERSE_STR_REQUEST::buffer_size() { + return (uint32_t&)(*m_buffer_size); +} + +std::string cACTION_BML_OREN_REVERSE_STR_REQUEST::buffer_str() { + char *buffer_ = buffer(); + if (!buffer_) { return std::string(); } + return std::string(buffer_, m_buffer_idx__); +} + +char* cACTION_BML_OREN_REVERSE_STR_REQUEST::buffer(size_t length) { + if( (m_buffer_idx__ == 0) || (m_buffer_idx__ < length) ) { + TLVF_LOG(ERROR) << "buffer length is smaller than requested length"; + return nullptr; + } + return ((char*)m_buffer); +} + +bool cACTION_BML_OREN_REVERSE_STR_REQUEST::set_buffer(const std::string& str) { return set_buffer(str.c_str(), str.size()); } +bool cACTION_BML_OREN_REVERSE_STR_REQUEST::set_buffer(const char str[], size_t size) { + if (str == nullptr) { + TLVF_LOG(WARNING) << "set_buffer received a null pointer."; + return false; + } + if (!alloc_buffer(size)) { return false; } + std::copy(str, str + size, m_buffer); + return true; +} +bool cACTION_BML_OREN_REVERSE_STR_REQUEST::alloc_buffer(size_t count) { + if (m_lock_order_counter__ > 0) {; + TLVF_LOG(ERROR) << "Out of order allocation for variable length list buffer, abort!"; + return false; + } + size_t len = sizeof(char) * count; + if(getBuffRemainingBytes() < len ) { + TLVF_LOG(ERROR) << "Not enough available space on buffer - can't allocate"; + return false; + } + m_lock_order_counter__ = 0; + uint8_t *src = (uint8_t *)&m_buffer[*m_buffer_size]; + uint8_t *dst = src + len; + if (!m_parse__) { + size_t move_length = getBuffRemainingBytes(src) - len; + std::copy_n(src, move_length, dst); + } + m_buffer_idx__ += count; + *m_buffer_size += count; + if (!buffPtrIncrementSafe(len)) { + LOG(ERROR) << "buffPtrIncrementSafe(" << std::dec << len << ") Failed!"; + return false; + } + return true; +} + +void cACTION_BML_OREN_REVERSE_STR_REQUEST::class_swap() +{ + tlvf_swap(8*sizeof(eActionOp_BML), reinterpret_cast(m_action_op)); + tlvf_swap(32, reinterpret_cast(m_buffer_size)); +} + +bool cACTION_BML_OREN_REVERSE_STR_REQUEST::finalize() +{ + if (m_parse__) { + TLVF_LOG(DEBUG) << "finalize() called but m_parse__ is set"; + return true; + } + if (m_finalized__) { + TLVF_LOG(DEBUG) << "finalize() called for already finalized class"; + return true; + } + if (!isPostInitSucceeded()) { + TLVF_LOG(ERROR) << "post init check failed"; + return false; + } + if (m_inner__) { + if (!m_inner__->finalize()) { + TLVF_LOG(ERROR) << "m_inner__->finalize() failed"; + return false; + } + auto tailroom = m_inner__->getMessageBuffLength() - m_inner__->getMessageLength(); + m_buff_ptr__ -= tailroom; + } + class_swap(); + m_finalized__ = true; + return true; +} + +size_t cACTION_BML_OREN_REVERSE_STR_REQUEST::get_initial_size() +{ + size_t class_size = 0; + class_size += sizeof(uint32_t); // buffer_size + return class_size; +} + +bool cACTION_BML_OREN_REVERSE_STR_REQUEST::init() +{ + if (getBuffRemainingBytes() < get_initial_size()) { + TLVF_LOG(ERROR) << "Not enough available space on buffer. Class init failed"; + return false; + } + m_buffer_size = reinterpret_cast(m_buff_ptr__); + if (!m_parse__) *m_buffer_size = 0; + if (!buffPtrIncrementSafe(sizeof(uint32_t))) { + LOG(ERROR) << "buffPtrIncrementSafe(" << std::dec << sizeof(uint32_t) << ") Failed!"; + return false; + } + m_buffer = (char*)m_buff_ptr__; + uint32_t buffer_size = *m_buffer_size; + if (m_parse__) { tlvf_swap(32, reinterpret_cast(&buffer_size)); } + m_buffer_idx__ = buffer_size; + if (!buffPtrIncrementSafe(sizeof(char) * (buffer_size))) { + LOG(ERROR) << "buffPtrIncrementSafe(" << std::dec << sizeof(char) * (buffer_size) << ") Failed!"; + return false; + } + if (m_parse__) { class_swap(); } + return true; +} + +cACTION_BML_OREN_REVERSE_STR_RESPONSE::cACTION_BML_OREN_REVERSE_STR_RESPONSE(uint8_t* buff, size_t buff_len, bool parse) : + BaseClass(buff, buff_len, parse) { + m_init_succeeded = init(); +} +cACTION_BML_OREN_REVERSE_STR_RESPONSE::cACTION_BML_OREN_REVERSE_STR_RESPONSE(std::shared_ptr base, bool parse) : +BaseClass(base->getBuffPtr(), base->getBuffRemainingBytes(), parse){ + m_init_succeeded = init(); +} +cACTION_BML_OREN_REVERSE_STR_RESPONSE::~cACTION_BML_OREN_REVERSE_STR_RESPONSE() { +} +uint32_t& cACTION_BML_OREN_REVERSE_STR_RESPONSE::buffer_size() { + return (uint32_t&)(*m_buffer_size); +} + +std::string cACTION_BML_OREN_REVERSE_STR_RESPONSE::buffer_str() { + char *buffer_ = buffer(); + if (!buffer_) { return std::string(); } + return std::string(buffer_, m_buffer_idx__); +} + +char* cACTION_BML_OREN_REVERSE_STR_RESPONSE::buffer(size_t length) { + if( (m_buffer_idx__ == 0) || (m_buffer_idx__ < length) ) { + TLVF_LOG(ERROR) << "buffer length is smaller than requested length"; + return nullptr; + } + return ((char*)m_buffer); +} + +bool cACTION_BML_OREN_REVERSE_STR_RESPONSE::set_buffer(const std::string& str) { return set_buffer(str.c_str(), str.size()); } +bool cACTION_BML_OREN_REVERSE_STR_RESPONSE::set_buffer(const char str[], size_t size) { + if (str == nullptr) { + TLVF_LOG(WARNING) << "set_buffer received a null pointer."; + return false; + } + if (!alloc_buffer(size)) { return false; } + std::copy(str, str + size, m_buffer); + return true; +} +bool cACTION_BML_OREN_REVERSE_STR_RESPONSE::alloc_buffer(size_t count) { + if (m_lock_order_counter__ > 0) {; + TLVF_LOG(ERROR) << "Out of order allocation for variable length list buffer, abort!"; + return false; + } + size_t len = sizeof(char) * count; + if(getBuffRemainingBytes() < len ) { + TLVF_LOG(ERROR) << "Not enough available space on buffer - can't allocate"; + return false; + } + m_lock_order_counter__ = 0; + uint8_t *src = (uint8_t *)&m_buffer[*m_buffer_size]; + uint8_t *dst = src + len; + if (!m_parse__) { + size_t move_length = getBuffRemainingBytes(src) - len; + std::copy_n(src, move_length, dst); + } + m_buffer_idx__ += count; + *m_buffer_size += count; + if (!buffPtrIncrementSafe(len)) { + LOG(ERROR) << "buffPtrIncrementSafe(" << std::dec << len << ") Failed!"; + return false; + } + return true; +} + +void cACTION_BML_OREN_REVERSE_STR_RESPONSE::class_swap() +{ + tlvf_swap(8*sizeof(eActionOp_BML), reinterpret_cast(m_action_op)); + tlvf_swap(32, reinterpret_cast(m_buffer_size)); +} + +bool cACTION_BML_OREN_REVERSE_STR_RESPONSE::finalize() +{ + if (m_parse__) { + TLVF_LOG(DEBUG) << "finalize() called but m_parse__ is set"; + return true; + } + if (m_finalized__) { + TLVF_LOG(DEBUG) << "finalize() called for already finalized class"; + return true; + } + if (!isPostInitSucceeded()) { + TLVF_LOG(ERROR) << "post init check failed"; + return false; + } + if (m_inner__) { + if (!m_inner__->finalize()) { + TLVF_LOG(ERROR) << "m_inner__->finalize() failed"; + return false; + } + auto tailroom = m_inner__->getMessageBuffLength() - m_inner__->getMessageLength(); + m_buff_ptr__ -= tailroom; + } + class_swap(); + m_finalized__ = true; + return true; +} + +size_t cACTION_BML_OREN_REVERSE_STR_RESPONSE::get_initial_size() +{ + size_t class_size = 0; + class_size += sizeof(uint32_t); // buffer_size + return class_size; +} + +bool cACTION_BML_OREN_REVERSE_STR_RESPONSE::init() +{ + if (getBuffRemainingBytes() < get_initial_size()) { + TLVF_LOG(ERROR) << "Not enough available space on buffer. Class init failed"; + return false; + } + m_buffer_size = reinterpret_cast(m_buff_ptr__); + if (!m_parse__) *m_buffer_size = 0; + if (!buffPtrIncrementSafe(sizeof(uint32_t))) { + LOG(ERROR) << "buffPtrIncrementSafe(" << std::dec << sizeof(uint32_t) << ") Failed!"; + return false; + } + m_buffer = (char*)m_buff_ptr__; + uint32_t buffer_size = *m_buffer_size; + if (m_parse__) { tlvf_swap(32, reinterpret_cast(&buffer_size)); } + m_buffer_idx__ = buffer_size; + if (!buffPtrIncrementSafe(sizeof(char) * (buffer_size))) { + LOG(ERROR) << "buffPtrIncrementSafe(" << std::dec << sizeof(char) * (buffer_size) << ") Failed!"; + return false; + } + if (m_parse__) { class_swap(); } + return true; +} + cACTION_BML_TRIGGER_CHANNEL_SELECTION_REQUEST::cACTION_BML_TRIGGER_CHANNEL_SELECTION_REQUEST(uint8_t* buff, size_t buff_len, bool parse) : BaseClass(buff, buff_len, parse) { m_init_succeeded = init(); diff --git a/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_action.yaml b/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_action.yaml index be0cdeb7d3..7001eab353 100755 --- a/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_action.yaml +++ b/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_action.yaml @@ -375,6 +375,10 @@ eActionOp_BML: ACTION_BML_NW_MAP_UPDATE: 30 ACTION_BML_STATS_UPDATE: 31 ACTION_BML_EVENTS_UPDATE: 32 +#================================================ + ACTION_BML_OREN_REVERSE_STR_REQUEST: 41 + ACTION_BML_OREN_REVERSE_STR_RESPONSE: 42 +#================================================ ACTION_BML_SET_LEGACY_CLIENT_ROAMING_REQUEST: 56 ACTION_BML_SET_LEGACY_CLIENT_ROAMING_RESPONSE: 57 diff --git a/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_bml.yaml b/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_bml.yaml index fe395e82c9..64e9081e8b 100755 --- a/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_bml.yaml +++ b/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_bml.yaml @@ -393,6 +393,28 @@ cACTION_BML_REGISTER_TOPOLOGY_QUERY: cACTION_BML_UNREGISTER_TOPOLOGY_QUERY: _type: class +#================================================ +cACTION_BML_OREN_REVERSE_STR_REQUEST: + _type: class + buffer_size: + _type: uint32_t + _length_var: True + buffer: + _type: char + _length: [buffer_size] +#================================================ + +#================================================ +cACTION_BML_OREN_REVERSE_STR_RESPONSE: + _type: class + buffer_size: + _type: uint32_t + _length_var: True + buffer: + _type: char + _length: [buffer_size] +#================================================ + cACTION_BML_TRIGGER_CHANNEL_SELECTION_REQUEST: _type: class al_mac: sMacAddr diff --git a/controller/src/beerocks/bml/bml.cpp b/controller/src/beerocks/bml/bml.cpp index d0094e8859..2e1df14f3a 100644 --- a/controller/src/beerocks/bml/bml.cpp +++ b/controller/src/beerocks/bml/bml.cpp @@ -754,3 +754,22 @@ int bml_client_get_client(BML_CTX ctx, const char *sta_mac, struct BML_CLIENT *c auto pBML = static_cast(ctx); return pBML->client_get_client(tlvf::mac_from_string(std::string(sta_mac)), client); } + +//================================================ +int bml_oren_reverse_string(BML_CTX ctx, const char *str_in, char *str_out) +{ + LOG(TRACE) << "=========> cli_bml::bml_oren_reverse_string(): " << str_in << std::endl; + + if (!ctx || !str_in || !str_out) { + return (-BML_RET_INVALID_ARGS); + } + bml_internal *pBML = (bml_internal *)ctx; + std::string tmp_str_out; + + int ret = (pBML->oren_reverse_string(str_in, tmp_str_out)); + if (ret == BML_RET_OK) { + beerocks::string_utils::copy_string(str_out, tmp_str_out.c_str(), tmp_str_out.length() + 1); + } + return ret; +} +//================================================ \ No newline at end of file diff --git a/controller/src/beerocks/bml/bml.h b/controller/src/beerocks/bml/bml.h index fa62ad23be..4e70679c1f 100644 --- a/controller/src/beerocks/bml/bml.h +++ b/controller/src/beerocks/bml/bml.h @@ -679,6 +679,18 @@ int bml_client_set_client(BML_CTX ctx, const char *sta_mac, */ int bml_client_get_client(BML_CTX ctx, const char *sta_mac, struct BML_CLIENT *client); +//================================================ +/** + * Reverses the the string order from back to front. + * + * @param [in] ctx BML Context. + * @param [in] string for reversing. + * @param [out] str_out the reversed string. + * @return BML_RET_OK on success. + */ +int bml_oren_reverse_string(BML_CTX ctx, const char *str_in, char *str_out); +//================================================ + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/controller/src/beerocks/bml/internal/bml_internal.cpp b/controller/src/beerocks/bml/internal/bml_internal.cpp index bcb2e3c052..4435e85503 100644 --- a/controller/src/beerocks/bml/internal/bml_internal.cpp +++ b/controller/src/beerocks/bml/internal/bml_internal.cpp @@ -1154,6 +1154,34 @@ int bml_internal::process_cmdu_header(std::shared_ptr beerocks_ << "but no one is waiting..."; } } break; + + //================================================ + case beerocks_message::ACTION_BML_OREN_REVERSE_STR_RESPONSE: { + LOG(DEBUG) << "ACTION_BML_OREN_REVERSE_STR_RESPONSE received"; + + auto response = + beerocks_header + ->addClass(); + if (!response) { + LOG(ERROR) << "addClass cACTION_BML_OREN_REVERSE_STR_RESPONSE failed"; + return BML_RET_OP_FAILED; + } + + //Signal any waiting threads + if (m_prmOrenReverseString) { + //mark response as success + m_prmOrenReverseString->set_value(true); + *m_orenReverseStringOut = response->buffer(); + LOG(DEBUG) << "===> response = " << response->buffer(); + + } else { + LOG(WARNING) << "Received cACTION_BML_OREN_REVERSE_STR_RESPONSE response, " + << "but no one is waiting..."; + *m_orenReverseStringOut = std::string(); + } + } break; + //================================================ + case beerocks_message::ACTION_BML_CLIENT_SET_CLIENT_RESPONSE: { LOG(DEBUG) << "ACTION_BML_CLIENT_SET_CLIENT_RESPONSE received"; auto response = @@ -1903,6 +1931,73 @@ int bml_internal::client_get_client_list(std::string &client_list, unsigned int return BML_RET_OK; } +//================================================ +int bml_internal::oren_reverse_string(const char *str_in, std::string &str_out) +{ + LOG(TRACE) << "=========> bml_internal::oren_reverse_string()" << std::endl; + + if (!str_in) { + LOG(ERROR) << "str_in must be initialized"; + return (-BML_RET_INVALID_DATA); + } + + // If the socket is not valid, attempt to re-establish the connection + if (!m_sockMaster) { + int iRet = connect_to_master(); + if (iRet != BML_RET_OK) { + LOG(ERROR) << " Unable to create context, connect_to_master failed!"; + return iRet; + } + } + + // Initialize the promise for receiving the response + beerocks::promise prmOrenReverseString; + m_prmOrenReverseString = &prmOrenReverseString; + int iOpTimeout = RESPONSE_TIMEOUT; // Default timeout + m_orenReverseStringOut = &str_out; + + auto request = + message_com::create_vs_message( + cmdu_tx); + + if (!request) { + LOG(ERROR) << "Failed building cACTION_BML_OREN_REVERSE_STR_REQUEST message!"; + return (-BML_RET_OP_FAILED); + } + + // Set parameters inside the message + request->set_buffer(str_in); + + // Build and send the message + if (!message_com::send_cmdu(m_sockMaster, cmdu_tx)) { + LOG(ERROR) << "Failed sending param get message!"; + m_prmOrenReverseString = nullptr; + *m_orenReverseStringOut = std::string(); + return (-BML_RET_OP_FAILED); + } + LOG(DEBUG) << "cACTION_BML_OREN_REVERSE_STR_REQUEST sent"; + + int iRet = BML_RET_OK; + + if (!m_prmOrenReverseString->wait_for(iOpTimeout)) { + LOG(WARNING) << "Timeout while waiting for oren reverse string to response..."; + iRet = -BML_RET_TIMEOUT; + *m_orenReverseStringOut = std::string(); + } + + // Clear the oren reverse string members + m_orenReverseStringOut = nullptr; + + // Clear the promise holder + m_prmOrenReverseString = nullptr; + + LOG_IF(iRet != BML_RET_OK, ERROR) + << "Oren reverse string request returned with error code:" << iRet; + + return BML_RET_OK; +} +//================================================ + int bml_internal::client_set_client(const sMacAddr &sta_mac, const BML_CLIENT_CONFIG &client_config) { LOG(DEBUG) << "client_set_client"; diff --git a/controller/src/beerocks/bml/internal/bml_internal.h b/controller/src/beerocks/bml/internal/bml_internal.h index 06124416c9..5eeedf15aa 100644 --- a/controller/src/beerocks/bml/internal/bml_internal.h +++ b/controller/src/beerocks/bml/internal/bml_internal.h @@ -273,6 +273,16 @@ class bml_internal : public beerocks::socket_thread { */ int client_get_client_list(std::string &client_list, unsigned int *client_list_size); + //================================================ + /* + * Reverses the the string order from back to front. + * + * @param [in] string for reversing. + * @param [out] str_out the reversed string. + */ + int oren_reverse_string(const char *str_in, std::string &str_out); + //================================================ + /** * Set client configuration. * @@ -363,6 +373,9 @@ class bml_internal : public beerocks::socket_thread { //Promise used to indicate the GetResults response was received beerocks::promise *m_prmChannelScanResultsGet = nullptr; beerocks::promise *m_prmClientListGet = nullptr; + //================================================ + beerocks::promise *m_prmOrenReverseString = nullptr; + //================================================ beerocks::promise *m_prmClientGet = nullptr; std::map *> m_prmCliResponses; @@ -385,6 +398,10 @@ class bml_internal : public beerocks::socket_thread { std::list *m_scan_results = nullptr; //m_scan_results_status is used to store the results' latest status uint8_t *m_scan_results_status = nullptr; + //================================================ + //m_OrenReverseString_out is used when receiving oren string reverse response + std::string *m_orenReverseStringOut = nullptr; + //================================================ //m_scan_results_maxsize is used to indicate the maximum capacity of the requested results uint32_t *m_scan_results_maxsize = nullptr; std::string *m_client_list = nullptr; diff --git a/controller/src/beerocks/cli/beerocks_cli_bml.cpp b/controller/src/beerocks/cli/beerocks_cli_bml.cpp index f3dd73038d..d32ae49f3d 100644 --- a/controller/src/beerocks/cli/beerocks_cli_bml.cpp +++ b/controller/src/beerocks/cli/beerocks_cli_bml.cpp @@ -385,6 +385,10 @@ void cli_bml::setFunctionsMapAndArray() insertCommandToMap("bml_oren_print", "", "print a string back to stdout", static_cast(&cli_bml::bml_oren_print_caller), 0, 1, STRING_ARG); + //Registration of the new BML message API - caller function have one argument of type string + insertCommandToMap( + "bml_oren_reverse_string", "", "print the string in reverse char order (last to first)", + static_cast(&cli_bml::bml_oren_reverse_string_caller), 0, 1, STRING_ARG); //================================================ insertCommandToMap("bml_stat_register_cb", "[]", @@ -950,6 +954,15 @@ int cli_bml::bml_oren_print_caller(int numOfArgs) return oren_print(args.stringArgs[0]); } +int cli_bml::bml_oren_reverse_string_caller(int numOfArgs) +{ + LOG(TRACE) << "=========> cli_bml::bml_oren_reverse_string_caller()" << std::endl; + + if (numOfArgs != 1) { + return -1; + } + return oren_reverse_string(args.stringArgs[0]); +} //================================================ int cli_bml::stat_register_cb_caller(int numOfArgs) @@ -1502,6 +1515,26 @@ int cli_bml::oren_print(const std::string &str) return BML_RET_OK; } +//Function the call the new BML handler warpper (in bml.cpp) +int cli_bml::oren_reverse_string(const std::string &str) +{ + LOG(TRACE) << "=========> cli_bml::oren_reverse_string(): " << str << std::endl; + + auto str_in = str.c_str(); + auto str_out = (char *)malloc(sizeof(char) * str.length()); + + int ret = bml_oren_reverse_string(ctx, str_in, str_out); + + if (ret != BML_RET_OK) { + std::cout << "FAIL oren_reverse_string()" << std::endl; + } else { + std::cout << str_out << std::endl; + } + + free(str_out); + printBmlReturnVals("oren_reverse_string", ret); + return 0; +} //================================================ int cli_bml::stat_register_cb(const std::string &optional) diff --git a/controller/src/beerocks/cli/beerocks_cli_bml.h b/controller/src/beerocks/cli/beerocks_cli_bml.h index 6f9caae1e2..84cda95c8f 100644 --- a/controller/src/beerocks/cli/beerocks_cli_bml.h +++ b/controller/src/beerocks/cli/beerocks_cli_bml.h @@ -111,6 +111,7 @@ class cli_bml : public cli { //================================================ //BML API caller function int bml_oren_print_caller(int numOfArgs); + int bml_oren_reverse_string_caller(int numOfArgs); //================================================ int stat_register_cb_caller(int numOfArgs); @@ -170,6 +171,7 @@ class cli_bml : public cli { //================================================ //New function to handle the new BML message int oren_print(const std::string &str); + int oren_reverse_string(const std::string &str); //================================================ int stat_register_cb(const std::string &optional = std::string()); diff --git a/controller/src/beerocks/master/son_management.cpp b/controller/src/beerocks/master/son_management.cpp index a6aee2a626..98ebab490a 100644 --- a/controller/src/beerocks/master/son_management.cpp +++ b/controller/src/beerocks/master/son_management.cpp @@ -814,6 +814,17 @@ void son_management::handle_cli_message(Socket *sd, message_com::send_cmdu(sd, cmdu_tx); break; } +<<<<<<< HEAD +======= + + //======================= + case beerocks_message::ACTION_CLI_OREN_PRINT: { + LOG(TRACE) << "========> controller received beerocks_message::ACTION_CLI_OREN_PRINT"; + break; + } + //======================= + +>>>>>>> 9f4ace55... tlvf: Add new bml request-response message case beerocks_message::ACTION_CLI_OPTIMAL_PATH_TASK: { auto request = beerocks_header->addClass(); if (request == nullptr) { @@ -1120,6 +1131,40 @@ void son_management::handle_bml_message(Socket *sd, message_com::send_cmdu(sd, cmdu_tx); } break; + //================================================ + case beerocks_message::ACTION_BML_OREN_REVERSE_STR_REQUEST: { + //build request + auto request = + beerocks_header->addClass(); + if (request == nullptr) { + LOG(ERROR) << "addClass cACTION_BML_OREN_REVERSE_STR_REQUEST failed"; + break; + } + + LOG(INFO) << "BML ACTION_BML_OREN_REVERSE_STR_REQUEST received"; + LOG(INFO) << "str_in = " << request->buffer(); + + //build response + auto response = + message_com::create_vs_message( + cmdu_tx); + + if (response == nullptr) { + LOG(ERROR) << "Failed building ACTION_BML_OREN_REVERSE_STR_RESPONSE message!"; + break; + } + + //Reverse the string in request + std::string str_in(request->buffer()); + std::reverse(str_in.begin(), str_in.end()); + + response->set_buffer(str_in); + + LOG(INFO) << "===>beerocks_message::ACTION_BML_OREN_REVERSE_STR_REQUEST - send_cmdu"; + message_com::send_cmdu(sd, cmdu_tx); + } break; + //================================================ + case beerocks_message::ACTION_BML_GET_CLIENT_ROAMING_REQUEST: { auto response = message_com::create_vs_message< beerocks_message::cACTION_BML_GET_CLIENT_ROAMING_RESPONSE>(cmdu_tx);