diff --git a/agent/src/beerocks/slave/son_slave_thread.cpp b/agent/src/beerocks/slave/son_slave_thread.cpp index 5992607499..4e3c99b60c 100644 --- a/agent/src/beerocks/slave/son_slave_thread.cpp +++ b/agent/src/beerocks/slave/son_slave_thread.cpp @@ -1126,6 +1126,10 @@ bool slave_thread::handle_cmdu_control_message(Socket *sd, message_com::send_cmdu(monitor_socket, cmdu_tx); break; } + case beerocks_message::ACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST: { + LOG(WARNING) << "received ACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST"; + break; + } default: { LOG(ERROR) << "Unknown CONTROL message, action_op: " << int(beerocks_header->action_op()); return false; 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 228c5512fa..f4fb507722 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 @@ -110,7 +110,9 @@ enum eActionOp_CONTROL: uint8_t { ACTION_CONTROL_CHANNEL_SCAN_RESULTS_NOTIFICATION = 0x91, ACTION_CONTROL_CHANNEL_SCAN_ABORT_NOTIFICATION = 0x92, ACTION_CONTROL_CHANNEL_SCAN_FINISHED_NOTIFICATION = 0x93, - ACTION_CONTROL_ENUM_END = 0x94, + ACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST = 0x94, + ACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE = 0x95, + ACTION_CONTROL_ENUM_END = 0x96, }; enum eActionOp_BACKHAUL: uint8_t { @@ -414,6 +416,8 @@ enum eActionOp_BML: uint8_t { ACTION_BML_CLIENT_SET_CLIENT_RESPONSE = 0xda, ACTION_BML_CLIENT_GET_CLIENT_REQUEST = 0xdb, ACTION_BML_CLIENT_GET_CLIENT_RESPONSE = 0xdc, + ACTION_BML_MESSAGE_TO_RADIO_REQUEST = 0xde, + ACTION_BML_MESSAGE_TO_RADIO_RESPONSE = 0xdf, ACTION_BML_ENUM_END = 0xe1, }; 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 588fb4b6fb..788bf45b35 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 @@ -2354,6 +2354,46 @@ class cACTION_BML_CLIENT_GET_CLIENT_RESPONSE : public BaseClass sClient* m_client = nullptr; }; +class cACTION_BML_MESSAGE_TO_RADIO_REQUEST : public BaseClass +{ + public: + cACTION_BML_MESSAGE_TO_RADIO_REQUEST(uint8_t* buff, size_t buff_len, bool parse = false); + explicit cACTION_BML_MESSAGE_TO_RADIO_REQUEST(std::shared_ptr base, bool parse = false); + ~cACTION_BML_MESSAGE_TO_RADIO_REQUEST(); + + static eActionOp_BML get_action_op(){ + return (eActionOp_BML)(ACTION_BML_MESSAGE_TO_RADIO_REQUEST); + } + sMessageToRadio& params(); + void class_swap() override; + bool finalize() override; + static size_t get_initial_size(); + + private: + bool init(); + eActionOp_BML* m_action_op = nullptr; + sMessageToRadio* m_params = nullptr; +}; + +class cACTION_BML_MESSAGE_TO_RADIO_RESPONSE : public BaseClass +{ + public: + cACTION_BML_MESSAGE_TO_RADIO_RESPONSE(uint8_t* buff, size_t buff_len, bool parse = false); + explicit cACTION_BML_MESSAGE_TO_RADIO_RESPONSE(std::shared_ptr base, bool parse = false); + ~cACTION_BML_MESSAGE_TO_RADIO_RESPONSE(); + + static eActionOp_BML get_action_op(){ + return (eActionOp_BML)(ACTION_BML_MESSAGE_TO_RADIO_RESPONSE); + } + void class_swap() override; + bool finalize() override; + static size_t get_initial_size(); + + private: + bool init(); + eActionOp_BML* m_action_op = nullptr; +}; + }; // close namespace: beerocks_message #endif //_BEEROCKS/TLVF_BEEROCKS_MESSAGE_BML_H_ diff --git a/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_common.h b/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_common.h index f5df12a63f..394d0b4ebb 100644 --- a/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_common.h +++ b/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_common.h @@ -1409,6 +1409,16 @@ typedef struct sClient { } } __attribute__((packed)) sClient; +typedef struct sMessageToRadio { + sMacAddr radio_mac; + void struct_swap(){ + radio_mac.struct_swap(); + } + void struct_init(){ + radio_mac.struct_init(); + } +} __attribute__((packed)) sMessageToRadio; + }; // close namespace: beerocks_message diff --git a/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_control.h b/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_control.h index 61905a1604..68b504e2ae 100644 --- a/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_control.h +++ b/common/beerocks/tlvf/AutoGenerated/include/beerocks/tlvf/beerocks_message_control.h @@ -434,6 +434,46 @@ class cACTION_CONTROL_CHANGE_MODULE_LOGGING_LEVEL : public BaseClass sLoggingLevelChange* m_params = nullptr; }; +class cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST : public BaseClass +{ + public: + cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST(uint8_t* buff, size_t buff_len, bool parse = false); + explicit cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST(std::shared_ptr base, bool parse = false); + ~cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST(); + + static eActionOp_CONTROL get_action_op(){ + return (eActionOp_CONTROL)(ACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST); + } + sMessageToRadio& params(); + void class_swap() override; + bool finalize() override; + static size_t get_initial_size(); + + private: + bool init(); + eActionOp_CONTROL* m_action_op = nullptr; + sMessageToRadio* m_params = nullptr; +}; + +class cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE : public BaseClass +{ + public: + cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE(uint8_t* buff, size_t buff_len, bool parse = false); + explicit cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE(std::shared_ptr base, bool parse = false); + ~cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE(); + + static eActionOp_CONTROL get_action_op(){ + return (eActionOp_CONTROL)(ACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE); + } + void class_swap() override; + bool finalize() override; + static size_t get_initial_size(); + + private: + bool init(); + eActionOp_CONTROL* m_action_op = nullptr; +}; + class cACTION_CONTROL_HOSTAP_CSA_ERROR_NOTIFICATION : 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 9f8d17c275..4e1a4a49f2 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 @@ -8021,4 +8021,132 @@ bool cACTION_BML_CLIENT_GET_CLIENT_RESPONSE::init() return true; } +cACTION_BML_MESSAGE_TO_RADIO_REQUEST::cACTION_BML_MESSAGE_TO_RADIO_REQUEST(uint8_t* buff, size_t buff_len, bool parse) : + BaseClass(buff, buff_len, parse) { + m_init_succeeded = init(); +} +cACTION_BML_MESSAGE_TO_RADIO_REQUEST::cACTION_BML_MESSAGE_TO_RADIO_REQUEST(std::shared_ptr base, bool parse) : +BaseClass(base->getBuffPtr(), base->getBuffRemainingBytes(), parse){ + m_init_succeeded = init(); +} +cACTION_BML_MESSAGE_TO_RADIO_REQUEST::~cACTION_BML_MESSAGE_TO_RADIO_REQUEST() { +} +sMessageToRadio& cACTION_BML_MESSAGE_TO_RADIO_REQUEST::params() { + return (sMessageToRadio&)(*m_params); +} + +void cACTION_BML_MESSAGE_TO_RADIO_REQUEST::class_swap() +{ + tlvf_swap(8*sizeof(eActionOp_BML), reinterpret_cast(m_action_op)); + m_params->struct_swap(); +} + +bool cACTION_BML_MESSAGE_TO_RADIO_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_MESSAGE_TO_RADIO_REQUEST::get_initial_size() +{ + size_t class_size = 0; + class_size += sizeof(sMessageToRadio); // params + return class_size; +} + +bool cACTION_BML_MESSAGE_TO_RADIO_REQUEST::init() +{ + if (getBuffRemainingBytes() < get_initial_size()) { + TLVF_LOG(ERROR) << "Not enough available space on buffer. Class init failed"; + return false; + } + m_params = reinterpret_cast(m_buff_ptr__); + if (!buffPtrIncrementSafe(sizeof(sMessageToRadio))) { + LOG(ERROR) << "buffPtrIncrementSafe(" << std::dec << sizeof(sMessageToRadio) << ") Failed!"; + return false; + } + if (!m_parse__) { m_params->struct_init(); } + if (m_parse__) { class_swap(); } + return true; +} + +cACTION_BML_MESSAGE_TO_RADIO_RESPONSE::cACTION_BML_MESSAGE_TO_RADIO_RESPONSE(uint8_t* buff, size_t buff_len, bool parse) : + BaseClass(buff, buff_len, parse) { + m_init_succeeded = init(); +} +cACTION_BML_MESSAGE_TO_RADIO_RESPONSE::cACTION_BML_MESSAGE_TO_RADIO_RESPONSE(std::shared_ptr base, bool parse) : +BaseClass(base->getBuffPtr(), base->getBuffRemainingBytes(), parse){ + m_init_succeeded = init(); +} +cACTION_BML_MESSAGE_TO_RADIO_RESPONSE::~cACTION_BML_MESSAGE_TO_RADIO_RESPONSE() { +} +void cACTION_BML_MESSAGE_TO_RADIO_RESPONSE::class_swap() +{ + tlvf_swap(8*sizeof(eActionOp_BML), reinterpret_cast(m_action_op)); +} + +bool cACTION_BML_MESSAGE_TO_RADIO_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_MESSAGE_TO_RADIO_RESPONSE::get_initial_size() +{ + size_t class_size = 0; + return class_size; +} + +bool cACTION_BML_MESSAGE_TO_RADIO_RESPONSE::init() +{ + if (getBuffRemainingBytes() < get_initial_size()) { + TLVF_LOG(ERROR) << "Not enough available space on buffer. Class init failed"; + return false; + } + if (m_parse__) { class_swap(); } + return true; +} + diff --git a/common/beerocks/tlvf/AutoGenerated/src/beerocks/tlvf/beerocks_message_control.cpp b/common/beerocks/tlvf/AutoGenerated/src/beerocks/tlvf/beerocks_message_control.cpp index bdc1df9b65..c7920dc1eb 100644 --- a/common/beerocks/tlvf/AutoGenerated/src/beerocks/tlvf/beerocks_message_control.cpp +++ b/common/beerocks/tlvf/AutoGenerated/src/beerocks/tlvf/beerocks_message_control.cpp @@ -1537,6 +1537,134 @@ bool cACTION_CONTROL_CHANGE_MODULE_LOGGING_LEVEL::init() return true; } +cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST::cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST(uint8_t* buff, size_t buff_len, bool parse) : + BaseClass(buff, buff_len, parse) { + m_init_succeeded = init(); +} +cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST::cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST(std::shared_ptr base, bool parse) : +BaseClass(base->getBuffPtr(), base->getBuffRemainingBytes(), parse){ + m_init_succeeded = init(); +} +cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST::~cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST() { +} +sMessageToRadio& cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST::params() { + return (sMessageToRadio&)(*m_params); +} + +void cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST::class_swap() +{ + tlvf_swap(8*sizeof(eActionOp_CONTROL), reinterpret_cast(m_action_op)); + m_params->struct_swap(); +} + +bool cACTION_CONTROL_MESSAGE_TO_RADIO_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_CONTROL_MESSAGE_TO_RADIO_REQUEST::get_initial_size() +{ + size_t class_size = 0; + class_size += sizeof(sMessageToRadio); // params + return class_size; +} + +bool cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST::init() +{ + if (getBuffRemainingBytes() < get_initial_size()) { + TLVF_LOG(ERROR) << "Not enough available space on buffer. Class init failed"; + return false; + } + m_params = reinterpret_cast(m_buff_ptr__); + if (!buffPtrIncrementSafe(sizeof(sMessageToRadio))) { + LOG(ERROR) << "buffPtrIncrementSafe(" << std::dec << sizeof(sMessageToRadio) << ") Failed!"; + return false; + } + if (!m_parse__) { m_params->struct_init(); } + if (m_parse__) { class_swap(); } + return true; +} + +cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE::cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE(uint8_t* buff, size_t buff_len, bool parse) : + BaseClass(buff, buff_len, parse) { + m_init_succeeded = init(); +} +cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE::cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE(std::shared_ptr base, bool parse) : +BaseClass(base->getBuffPtr(), base->getBuffRemainingBytes(), parse){ + m_init_succeeded = init(); +} +cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE::~cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE() { +} +void cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE::class_swap() +{ + tlvf_swap(8*sizeof(eActionOp_CONTROL), reinterpret_cast(m_action_op)); +} + +bool cACTION_CONTROL_MESSAGE_TO_RADIO_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_CONTROL_MESSAGE_TO_RADIO_RESPONSE::get_initial_size() +{ + size_t class_size = 0; + return class_size; +} + +bool cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE::init() +{ + if (getBuffRemainingBytes() < get_initial_size()) { + TLVF_LOG(ERROR) << "Not enough available space on buffer. Class init failed"; + return false; + } + if (m_parse__) { class_swap(); } + return true; +} + cACTION_CONTROL_HOSTAP_CSA_ERROR_NOTIFICATION::cACTION_CONTROL_HOSTAP_CSA_ERROR_NOTIFICATION(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 d0e5882bba..627a13d84c 100755 --- a/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_action.yaml +++ b/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_action.yaml @@ -109,7 +109,10 @@ eActionOp_CONTROL: ACTION_CONTROL_CHANNEL_SCAN_ABORT_NOTIFICATION: 146 ACTION_CONTROL_CHANNEL_SCAN_FINISHED_NOTIFICATION: 147 - ACTION_CONTROL_ENUM_END: 148 + ACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST: 148 + ACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE: 149 + + ACTION_CONTROL_ENUM_END: 150 #################################################### #################################################### @@ -480,4 +483,7 @@ eActionOp_BML: ACTION_BML_CLIENT_GET_CLIENT_REQUEST: 219 ACTION_BML_CLIENT_GET_CLIENT_RESPONSE: 220 + ACTION_BML_MESSAGE_TO_RADIO_REQUEST: 222 + ACTION_BML_MESSAGE_TO_RADIO_RESPONSE: 223 + ACTION_BML_ENUM_END: 225 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 85b6c05152..3e54df5434 100755 --- a/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_bml.yaml +++ b/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_bml.yaml @@ -529,3 +529,10 @@ cACTION_BML_CLIENT_GET_CLIENT_RESPONSE: _type: uint8_t _comment: # 0 - Failure, 1 - Success client: sClient + +cACTION_BML_MESSAGE_TO_RADIO_REQUEST: + _type: class + params: sMessageToRadio + +cACTION_BML_MESSAGE_TO_RADIO_RESPONSE: + _type: class diff --git a/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_common.yaml b/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_common.yaml index 31435860fe..57e1001f6b 100755 --- a/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_common.yaml +++ b/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_common.yaml @@ -1033,3 +1033,7 @@ sClient: Determines the period of time after which the client configuration should be cleared, 0 - Never age. -1 - Not Configured. + +sMessageToRadio: + _type: struct + radio_mac: sMacAddr diff --git a/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_control.yaml b/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_control.yaml index 7e20d7ca59..afe70212af 100755 --- a/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_control.yaml +++ b/common/beerocks/tlvf/yaml/beerocks/tlvf/beerocks_message_control.yaml @@ -113,6 +113,13 @@ cACTION_CONTROL_CHANGE_MODULE_LOGGING_LEVEL: _type: class params: sLoggingLevelChange +cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST: + _type: class + params: sMessageToRadio + +cACTION_CONTROL_MESSAGE_TO_RADIO_RESPONSE: + _type: class + ################################################# # HOSTAP ################################################# diff --git a/controller/src/beerocks/bml/bml.cpp b/controller/src/beerocks/bml/bml.cpp index 59b5755df8..b6dc8de5fd 100644 --- a/controller/src/beerocks/bml/bml.cpp +++ b/controller/src/beerocks/bml/bml.cpp @@ -584,6 +584,24 @@ int bml_trigger_topology_discovery(BML_CTX ctx, const char *al_mac) return (pBML->trigger_topology_discovery_query(al_mac)); } +int bml_message_to_radio(BML_CTX ctx, const char *radio_mac) +{ + LOG(WARNING) << "bml_message_to_radio"; + + sMacAddr radio_mac_addr; + + // Validate input parameter + if (!ctx || !radio_mac) { + return (-BML_RET_INVALID_ARGS); + } + + radio_mac_addr = tlvf::mac_from_string(std::string(radio_mac)); + + bml_internal *pBML = (bml_internal *)ctx; + + return (pBML->message_to_radio(radio_mac_addr)); +} + int bml_channel_selection(BML_CTX ctx, const char *al_mac, const char *ruid) { // Validate input parameters diff --git a/controller/src/beerocks/bml/bml.h b/controller/src/beerocks/bml/bml.h index c17056b790..2d1ba60fcf 100644 --- a/controller/src/beerocks/bml/bml.h +++ b/controller/src/beerocks/bml/bml.h @@ -68,6 +68,14 @@ void *bml_get_user_data(BML_CTX ctx); */ int bml_ping(BML_CTX ctx); +/** + * Insert log information for a specific radio component + * + * @param [in] + * @return BML_RET_OK on success. + */ +int bml_message_to_radio(BML_CTX ctx, const char *radio_mac); + /** * Registers a callback functions for the network map query operation. * When calling the bml_nw_map_query() function, a request to send the entire diff --git a/controller/src/beerocks/bml/internal/bml_internal.cpp b/controller/src/beerocks/bml/internal/bml_internal.cpp index 43f5e6e84f..f54c170117 100644 --- a/controller/src/beerocks/bml/internal/bml_internal.cpp +++ b/controller/src/beerocks/bml/internal/bml_internal.cpp @@ -1235,6 +1235,13 @@ int bml_internal::process_cmdu_header(std::shared_ptr beerocks_ << "but no one is waiting..."; } } break; + case beerocks_message::ACTION_BML_MESSAGE_TO_RADIO_RESPONSE: { + //Signal any waiting threads + if (!wake_up(beerocks_message::ACTION_BML_MESSAGE_TO_RADIO_REQUEST, 0)) { + LOG(WARNING) << "Received ACTION_BML_CHANGE_MODULE_LOGGING_LEVEL_RESPONSE " + "response, but no one is waiting..."; + } + } break; default: { LOG(WARNING) << "unhandled header BML action type 0x" << std::hex << int(beerocks_header->action_op()); @@ -3480,6 +3487,32 @@ int bml_internal::channel_selection(const char *al_mac, const char *ruid) return BML_RET_OK; } +int bml_internal::message_to_radio(const sMacAddr &radio_mac) +{ + LOG(DEBUG) << "ACTION_BML_MESSAGE_TO_RADIO_REQUEST at bml_internal.cpp"; + + auto request = + message_com::create_vs_message( + cmdu_tx); + + if (!request) { + LOG(ERROR) << "Failed building ACTION_BML_MESSAGE_TO_RADIO_REQUEST message!"; + return (-BML_RET_OP_FAILED); + } + + request->params().radio_mac = radio_mac; + + int iRet = BML_RET_OK; + + int result = 0; + if (send_bml_cmdu(result, request->get_action_op()) != BML_RET_OK) { + LOG(ERROR) << "Send ACTION_BML_MESSAGE_TO_RADIO_REQUEST failed"; + return (-BML_RET_OP_FAILED); + } + + return (iRet); +} + bool bml_internal::wake_up(uint8_t action_opcode, int value) { std::unique_lock lock(m_mtxLock); diff --git a/controller/src/beerocks/bml/internal/bml_internal.h b/controller/src/beerocks/bml/internal/bml_internal.h index 16945c81c4..f2395e7e94 100644 --- a/controller/src/beerocks/bml/internal/bml_internal.h +++ b/controller/src/beerocks/bml/internal/bml_internal.h @@ -288,6 +288,14 @@ class bml_internal : public beerocks::socket_thread { */ int client_get_client(const sMacAddr &sta_mac, BML_CLIENT *client); + /** + * Send message to a radio. + * + * @param [in] radio_mac MAC address of a radio. + * @return BML_RET_OK on success. + */ + int message_to_radio(const sMacAddr &radio_mac); + /* * Public static methods: */ diff --git a/controller/src/beerocks/cli/beerocks_cli_bml.cpp b/controller/src/beerocks/cli/beerocks_cli_bml.cpp index 7883fe482b..3c3459e3c1 100644 --- a/controller/src/beerocks/cli/beerocks_cli_bml.cpp +++ b/controller/src/beerocks/cli/beerocks_cli_bml.cpp @@ -568,6 +568,9 @@ void cli_bml::setFunctionsMapAndArray() insertCommandToMap("bml_client_get_client", "", "Get client with the given STA MAC.", static_cast(&cli_bml::client_get_client_caller), 1, 1, STRING_ARG); + insertCommandToMap("bml_message_to_radio", "", "Append to radio's log.", + static_cast(&cli_bml::bml_message_to_radio_caller), 1, 1, + STRING_ARG); //bool insertCommandToMap(std::string command, std::string help_args, std::string help, pFunction funcPtr, uint8_t minNumOfArgs, uint8_t maxNumOfArgs, } @@ -1168,6 +1171,13 @@ int cli_bml::bml_channel_selection_caller(int numOfArgs) } return -1; } +int cli_bml::bml_message_to_radio_caller(int numOfArgs) +{ + if (numOfArgs == 1) { + return message_to_radio(args.stringArgs[0]); + } + return -1; +} #ifdef BEEROCKS_RDKB int cli_bml::bml_rdkb_steering_set_group_caller(int numOfArgs) { @@ -1873,6 +1883,15 @@ int cli_bml::channel_selection(const std::string &al_mac, const std::string &rui return 0; } +int cli_bml::message_to_radio(const std::string &radio_mac) +{ + LOG(WARNING) << "message_to_radio at cli_bml.cpp"; + + int ret = bml_message_to_radio(ctx, radio_mac.c_str()); + printBmlReturnVals("message_to_radio", ret); + return 0; +} + #ifdef BEEROCKS_RDKB int cli_bml::steering_set_group(uint32_t steeringGroupIndex, const std::string &str_cfg_2, const std::string &str_cfg_5) @@ -2275,8 +2294,6 @@ int cli_bml::client_get_client(const std::string &sta_mac) ret += "5 Ghz,"; if (val & BML_CLIENT_SELECTED_BANDS_6G) ret += "6 Ghz,"; - if (val & BML_CLIENT_SELECTED_BANDS_60G) - ret += "60 Ghz,"; // remove ending comma if (!ret.empty() && (ret.back() == ',')) { diff --git a/controller/src/beerocks/cli/beerocks_cli_bml.h b/controller/src/beerocks/cli/beerocks_cli_bml.h index a368d1c382..31b7c52a5a 100644 --- a/controller/src/beerocks/cli/beerocks_cli_bml.h +++ b/controller/src/beerocks/cli/beerocks_cli_bml.h @@ -151,6 +151,7 @@ class cli_bml : public cli { int client_get_client_list_caller(int numOfArgs); int client_set_client_caller(int numOfArgs); int client_get_client_caller(int numOfArgs); + int bml_message_to_radio_caller(int numOfArgs); // Functions int onboard_status(); int ping(); @@ -218,6 +219,7 @@ class cli_bml : public cli { int client_set_client(const std::string &sta_mac, int8_t selected_bands, int8_t stay_on_initial_radio, int8_t stay_on_selected_device); int client_get_client(const std::string &sta_mac); + int message_to_radio(const std::string &radio_mac); template const std::string string_from_int_array(T *arr, size_t arr_max_size); // Variable std::string beerocks_conf_path; diff --git a/controller/src/beerocks/master/son_management.cpp b/controller/src/beerocks/master/son_management.cpp index 25a724db58..d197e6af14 100644 --- a/controller/src/beerocks/master/son_management.cpp +++ b/controller/src/beerocks/master/son_management.cpp @@ -1714,6 +1714,46 @@ void son_management::handle_bml_message(Socket *sd, } break; } + case beerocks_message::ACTION_BML_MESSAGE_TO_RADIO_REQUEST: { + LOG(WARNING) << "ACTION_BML_MESSAGE_TO_RADIO_REQUEST at son_management"; + + auto bml_request = + beerocks_header->addClass(); + if (bml_request == nullptr) { + LOG(ERROR) << "addClass ACTION_BML_CHANGE_MODULE_LOGGING_LEVEL_REQUEST failed"; + break; + } + + auto request = message_com::create_vs_message< + beerocks_message::cACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST>(cmdu_tx); + + if (request == nullptr) { + LOG(ERROR) << "Failed building CACTION_BML_MESSAGE_TO_RADIO_REQUEST message!"; + break; + } + + request->params().radio_mac = bml_request->params().radio_mac; + + std::string dst_mac = tlvf::mac_to_string(request->params().radio_mac); + auto agent_mac = database.get_node_parent_ire(dst_mac); + + bool try_me = son_actions::send_cmdu_to_agent(agent_mac, cmdu_tx, database, dst_mac); + if (!try_me) + printf("bad"); + printf("good"); + // send response + auto response = + message_com::create_vs_message( + cmdu_tx); + if (response == nullptr) { + LOG(ERROR) << "Failed building message!"; + return; + } + + LOG(DEBUG) << "request radio_mac:" << dst_mac; + message_com::send_cmdu(sd, cmdu_tx); + break; + } #ifdef BEEROCKS_RDKB case beerocks_message::ACTION_BML_STEERING_SET_GROUP_REQUEST: { LOG(TRACE) << "ACTION_BML_STEERING_SET_GROUP_REQUEST"; diff --git a/controller/src/beerocks/master/son_master_thread.cpp b/controller/src/beerocks/master/son_master_thread.cpp index e9851f0197..63f76e84af 100644 --- a/controller/src/beerocks/master/son_master_thread.cpp +++ b/controller/src/beerocks/master/son_master_thread.cpp @@ -430,10 +430,6 @@ bool master_thread::handle_cmdu_1905_autoconfiguration_search(const std::string tlvSupportedFreqBand->value() = ieee1905_1::tlvSupportedFreqBand::BAND_5G; break; } - case ieee1905_1::tlvAutoconfigFreqBand::IEEE_802_11_60_GHZ: { - tlvSupportedFreqBand->value() = ieee1905_1::tlvSupportedFreqBand::BAND_60G; - break; - } default: { LOG(ERROR) << "unknown autoconfig freq band, value=" << int(auto_config_freq_band); return false; diff --git a/framework/tlvf/AutoGenerated/include/tlvf/WSC/eWscRfBands.h b/framework/tlvf/AutoGenerated/include/tlvf/WSC/eWscRfBands.h index 6d9a1831e2..27aeab50c0 100644 --- a/framework/tlvf/AutoGenerated/include/tlvf/WSC/eWscRfBands.h +++ b/framework/tlvf/AutoGenerated/include/tlvf/WSC/eWscRfBands.h @@ -19,13 +19,11 @@ namespace WSC { -enum eWscRfBands: uint8_t { +enum eWscRfBands : uint8_t { WSC_RF_BAND_2GHZ = 0x1, WSC_RF_BAND_5GHZ = 0x2, - WSC_RF_BAND_60GHZ = 0x4, }; - -}; // close namespace: WSC +}; // namespace WSC #endif //_TLVF/WSC_EWSCRFBANDS_H_ diff --git a/framework/tlvf/yaml/tlvf/WSC/eWscRfBands.yaml b/framework/tlvf/yaml/tlvf/WSC/eWscRfBands.yaml index 75a1cf8346..0d87786f1c 100644 --- a/framework/tlvf/yaml/tlvf/WSC/eWscRfBands.yaml +++ b/framework/tlvf/yaml/tlvf/WSC/eWscRfBands.yaml @@ -7,5 +7,3 @@ eWscRfBands: _enum_storage: uint8_t WSC_RF_BAND_2GHZ: 0x01 WSC_RF_BAND_5GHZ: 0x02 - WSC_RF_BAND_60GHZ: 0x04 - \ No newline at end of file diff --git a/framework/tlvf/yaml/tlvf/ieee_1905_1/tlvSupportedFreqBand.yaml b/framework/tlvf/yaml/tlvf/ieee_1905_1/tlvSupportedFreqBand.yaml index 6e7c74cb03..eb0259869e 100755 --- a/framework/tlvf/yaml/tlvf/ieee_1905_1/tlvSupportedFreqBand.yaml +++ b/framework/tlvf/yaml/tlvf/ieee_1905_1/tlvSupportedFreqBand.yaml @@ -16,4 +16,3 @@ eValue: _enum_storage: uint8_t BAND_2_4G: 0x00 BAND_5G: 0x01 - BAND_60G: 0x02 diff --git a/tests/test_flows.py b/tests/test_flows.py index 35ad3c01cb..3d44910120 100755 --- a/tests/test_flows.py +++ b/tests/test_flows.py @@ -454,6 +454,18 @@ def test_ap_config_bss_tear_down(self): if vap.ssid != b'N/A': self.fail('Wrong SSID: {vap.ssid} instead torn down'.format(vap=vap)) + def test_message_to_radio_cli(self): + debug("BML_MESSAGE_TO_RADIO test at point") + + for i in range(0, 2): + env.beerocks_cli_command("bml_message_to_radio {}".format(env.controller.radios[i].mac)) + # Wait a bit for the message + time.sleep(3) + # Check controller + self.check_log(env.controller, "ACTION_BML_MESSAGE_TO_RADIO_REQUEST") + # Check agent + self.check_log(env.controller.radios[i], "ACTION_CONTROL_MESSAGE_TO_RADIO_REQUEST") + def test_ap_config_bss_tear_down_cli(self): # Same test as the previous one but using CLI instead of dev_send_1905