diff --git a/src/cli/README.md b/src/cli/README.md index 83e8fd833..6e6b7de20 100644 --- a/src/cli/README.md +++ b/src/cli/README.md @@ -1737,6 +1737,39 @@ Perform an IEEE 802.15.4 Energy Scan. Done ``` +### service + +Module for controlling service registration in Network Data. Each change in service registration must be sent to leader by `netdata register` command before taking effect. + +### service add \ \ \ + +Add service to the Network Data. + +- enterpriseNumber: IANA enterprise number +- serviceData: hex-encoded binary service data +- serverData: hex-encoded binary server data + +```bash +> service add 44970 112233 aabbcc +Done +> netdata register +Done +``` + +### service remove \ \ + +Remove service from Network Data. + +- enterpriseNumber: IANA enterprise number +- serviceData: hext-encoded binary service data + +```bash +> service remove 44970 112233 +Done +> netdata register +Done +``` + ### singleton Return true when there are no other nodes in the network, otherwise return false. @@ -2079,43 +2112,4 @@ Done Factory Diagnostics module is enabled only when building OpenThread with `OPENTHREAD_CONFIG_DIAG_ENABLE=1` option. Go [diagnostics module][diag] for more information. -### service - -Module for controlling service registration in Network Data. Each change in service registration must be sent to leader by `netdata register` command before taking effect. - -### service add \ \ \ - -Add service to the Network Data. - -```bash -> service add 44970 foo bar -Done -> netdata register -Done -> ipaddr -fdde:ad00:beef:0:0:ff:fe00:fc10 -fdde:ad00:beef:0:0:ff:fe00:fc00 -fdde:ad00:beef:0:0:ff:fe00:7c00 -fe80:0:0:0:1486:2f57:3c:6e10 -fdde:ad00:beef:0:8ca4:19ed:217a:eff9 -Done -``` - -### service remove \ \ - -Remove service from Network Data. - -```bash -> service remove 44970 foo -Done -> netdata register -Done -> ipaddr -fdde:ad00:beef:0:0:ff:fe00:fc00 -fdde:ad00:beef:0:0:ff:fe00:7c00 -fe80:0:0:0:1486:2f57:3c:6e10 -fdde:ad00:beef:0:8ca4:19ed:217a:eff9 -Done -``` - [diag]: ../../src/core/diags/README.md diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index 4184dd336..090e69258 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -2257,52 +2257,43 @@ otError Interpreter::ProcessServiceList(void) otError Interpreter::ProcessService(uint8_t aArgsLength, char *aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_INVALID_COMMAND; + otServiceConfig cfg; if (aArgsLength == 0) { - SuccessOrExit(error = ProcessServiceList()); + error = ProcessServiceList(); } - else if (strcmp(aArgs[0], "add") == 0) + else { - otServiceConfig cfg; - long enterpriseNumber; - size_t length; - - VerifyOrExit(aArgsLength > 3, error = OT_ERROR_INVALID_ARGS); - - SuccessOrExit(error = ParseLong(aArgs[1], enterpriseNumber)); - cfg.mEnterpriseNumber = static_cast(enterpriseNumber); - - length = strlen(aArgs[2]); - VerifyOrExit(length <= sizeof(cfg.mServiceData), error = OT_ERROR_NO_BUFS); - cfg.mServiceDataLength = static_cast(length); - memcpy(cfg.mServiceData, aArgs[2], cfg.mServiceDataLength); - - length = strlen(aArgs[3]); - VerifyOrExit(length <= sizeof(cfg.mServerConfig.mServerData), error = OT_ERROR_NO_BUFS); - cfg.mServerConfig.mServerDataLength = static_cast(length); - memcpy(cfg.mServerConfig.mServerData, aArgs[3], cfg.mServerConfig.mServerDataLength); - - cfg.mServerConfig.mStable = true; - - SuccessOrExit(error = otServerAddService(mInstance, &cfg)); - } - else if (strcmp(aArgs[0], "remove") == 0) - { - long enterpriseNumber = 0; + long enterpriseNumber; + int length; VerifyOrExit(aArgsLength > 2, error = OT_ERROR_INVALID_ARGS); SuccessOrExit(error = ParseLong(aArgs[1], enterpriseNumber)); + cfg.mEnterpriseNumber = static_cast(enterpriseNumber); - SuccessOrExit(error = otServerRemoveService(mInstance, static_cast(enterpriseNumber), - reinterpret_cast(aArgs[2]), - static_cast(strlen(aArgs[2])))); - } - else - { - ExitNow(error = OT_ERROR_INVALID_COMMAND); + length = Hex2Bin(aArgs[2], cfg.mServiceData, sizeof(cfg.mServiceData)); + VerifyOrExit(length > 0, error = OT_ERROR_INVALID_ARGS); + cfg.mServiceDataLength = static_cast(length); + + if (strcmp(aArgs[0], "add") == 0) + { + VerifyOrExit(aArgsLength > 3, error = OT_ERROR_INVALID_ARGS); + + length = Hex2Bin(aArgs[3], cfg.mServerConfig.mServerData, sizeof(cfg.mServerConfig.mServerData)); + VerifyOrExit(length > 0, error = OT_ERROR_INVALID_ARGS); + cfg.mServerConfig.mServerDataLength = static_cast(length); + + cfg.mServerConfig.mStable = true; + + error = otServerAddService(mInstance, &cfg); + } + else if (strcmp(aArgs[0], "remove") == 0) + { + error = otServerRemoveService(mInstance, cfg.mEnterpriseNumber, cfg.mServiceData, cfg.mServiceDataLength); + } } exit: diff --git a/tests/scripts/thread-cert/test_reed_address_solicit_rejected.py b/tests/scripts/thread-cert/test_reed_address_solicit_rejected.py index 59de6b160..f3bc9d4c6 100755 --- a/tests/scripts/thread-cert/test_reed_address_solicit_rejected.py +++ b/tests/scripts/thread-cert/test_reed_address_solicit_rejected.py @@ -38,8 +38,8 @@ REED = 2 SRV_0_ID = 0 SRV_0_ENT_NUMBER = '123' -SRV_0_SERVICE_DATA = 'foo' -SRV_0_SERVER_DATA = 'bar' +SRV_0_SERVICE_DATA = '123' +SRV_0_SERVER_DATA = 'abc' # Topology: # LEADER -- REED diff --git a/tests/scripts/thread-cert/test_service.py b/tests/scripts/thread-cert/test_service.py index 4be81cc61..5f8b77ea5 100755 --- a/tests/scripts/thread-cert/test_service.py +++ b/tests/scripts/thread-cert/test_service.py @@ -39,13 +39,13 @@ ROUTER2 = 3 SRV_0_ID = 0 SRV_0_ENT_NUMBER = '123' -SRV_0_SERVICE_DATA = 'foo' -SRV_0_SERVER_DATA = 'bar' +SRV_0_SERVICE_DATA = '123' +SRV_0_SERVER_DATA = 'abc' SRV_1_ID = 1 SRV_1_ENT_NUMBER = '234' -SRV_1_SERVICE_DATA = 'baz' -SRV_1_SERVER_DATA = 'qux' +SRV_1_SERVICE_DATA = '456' +SRV_1_SERVER_DATA = 'def' class Test_Service(thread_cert.TestCase):