util.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. // SPDX-License-Identifier: LGPL-2.1-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2017, 2019 Intel Corporation. All rights reserved.
  7. *
  8. *
  9. */
  10. #ifdef HAVE_CONFIG_H
  11. #include <config.h>
  12. #endif
  13. #include <stdio.h>
  14. #include <ell/ell.h>
  15. #include "src/shared/shell.h"
  16. #include "src/shared/util.h"
  17. #include "mesh/mesh-defs.h"
  18. #include "tools/mesh/util.h"
  19. void set_menu_prompt(const char *name, const char *id)
  20. {
  21. char *prompt;
  22. prompt = l_strdup_printf(COLOR_BLUE "[%s%s%s]" COLOR_OFF "# ", name,
  23. id ? ": Target = " : "", id ? id : "");
  24. bt_shell_set_prompt(prompt);
  25. l_free(prompt);
  26. }
  27. uint16_t mesh_opcode_set(uint32_t opcode, uint8_t *buf)
  28. {
  29. if (opcode <= 0x7e) {
  30. buf[0] = opcode;
  31. return 1;
  32. } else if (opcode >= 0x8000 && opcode <= 0xbfff) {
  33. put_be16(opcode, buf);
  34. return 2;
  35. } else if (opcode >= 0xc00000 && opcode <= 0xffffff) {
  36. buf[0] = (opcode >> 16) & 0xff;
  37. put_be16(opcode, buf + 1);
  38. return 3;
  39. }
  40. bt_shell_printf("Illegal Opcode %x", opcode);
  41. return 0;
  42. }
  43. bool mesh_opcode_get(const uint8_t *buf, uint16_t sz, uint32_t *opcode, int *n)
  44. {
  45. if (!n || !opcode || sz < 1)
  46. return false;
  47. switch (buf[0] & 0xc0) {
  48. case 0x00:
  49. case 0x40:
  50. /* RFU */
  51. if (buf[0] == 0x7f)
  52. return false;
  53. *n = 1;
  54. *opcode = buf[0];
  55. break;
  56. case 0x80:
  57. if (sz < 2)
  58. return false;
  59. *n = 2;
  60. *opcode = get_be16(buf);
  61. break;
  62. case 0xc0:
  63. if (sz < 3)
  64. return false;
  65. *n = 3;
  66. *opcode = get_be16(buf + 1);
  67. *opcode |= buf[0] << 16;
  68. break;
  69. default:
  70. bt_shell_printf("Bad opcode");
  71. return false;
  72. }
  73. return true;
  74. }
  75. const char *mesh_status_str(uint8_t status)
  76. {
  77. switch (status) {
  78. case MESH_STATUS_SUCCESS: return "Success";
  79. case MESH_STATUS_INVALID_ADDRESS: return "Invalid Address";
  80. case MESH_STATUS_INVALID_MODEL: return "Invalid Model";
  81. case MESH_STATUS_INVALID_APPKEY: return "Invalid AppKey";
  82. case MESH_STATUS_INVALID_NETKEY: return "Invalid NetKey";
  83. case MESH_STATUS_INSUFF_RESOURCES: return "Insufficient Resources";
  84. case MESH_STATUS_IDX_ALREADY_STORED: return "Key Idx Already Stored";
  85. case MESH_STATUS_INVALID_PUB_PARAM: return "Invalid Publish Parameters";
  86. case MESH_STATUS_NOT_SUB_MOD: return "Not a Subscribe Model";
  87. case MESH_STATUS_STORAGE_FAIL: return "Storage Failure";
  88. case MESH_STATUS_FEATURE_NO_SUPPORT: return "Feature Not Supported";
  89. case MESH_STATUS_CANNOT_UPDATE: return "Cannot Update";
  90. case MESH_STATUS_CANNOT_REMOVE: return "Cannot Remove";
  91. case MESH_STATUS_CANNOT_BIND: return "Cannot bind";
  92. case MESH_STATUS_UNABLE_CHANGE_STATE: return "Unable to change state";
  93. case MESH_STATUS_CANNOT_SET: return "Cannot set";
  94. case MESH_STATUS_UNSPECIFIED_ERROR: return "Unspecified error";
  95. case MESH_STATUS_INVALID_BINDING: return "Invalid Binding";
  96. default: return "Unknown";
  97. }
  98. }
  99. void swap_u256_bytes(uint8_t *u256)
  100. {
  101. int i;
  102. /* End-to-End byte reflection of 32 octet buffer */
  103. for (i = 0; i < 16; i++) {
  104. u256[i] ^= u256[31 - i];
  105. u256[31 - i] ^= u256[i];
  106. u256[i] ^= u256[31 - i];
  107. }
  108. }
  109. const char *sig_model_string(uint16_t sig_model_id)
  110. {
  111. switch (sig_model_id) {
  112. case 0x0000: return "Configuration Server";
  113. case 0x0001: return "Configuration Client";
  114. case 0x0002: return "Health Server";
  115. case 0x0003: return "Health Client";
  116. case 0x1000: return "Generic OnOff Server";
  117. case 0x1001: return "Generic OnOff Client";
  118. case 0x1002: return "Generic Level Server";
  119. case 0x1003: return "Generic Level Client";
  120. case 0x1004: return "Generic Default Transition Time Server";
  121. case 0x1005: return "Generic Default Transition Time Client";
  122. case 0x1006: return "Generic Power OnOff Server";
  123. case 0x1007: return "Generic Power OnOff Setup Server";
  124. case 0x1008: return "Generic Power OnOff Client";
  125. case 0x1009: return "Generic Power Level Server";
  126. case 0x100A: return "Generic Power Level Setup Server";
  127. case 0x100B: return "Generic Power Level Client";
  128. case 0x100C: return "Generic Battery Server";
  129. case 0x100D: return "Generic Battery Client";
  130. case 0x100E: return "Generic Location Server";
  131. case 0x100F: return "Generic Location Setup Server";
  132. case 0x1010: return "Generic Location Client";
  133. case 0x1011: return "Generic Admin Property Server";
  134. case 0x1012: return "Generic Manufacturer Property Server";
  135. case 0x1013: return "Generic User Property Server";
  136. case 0x1014: return "Generic Client Property Server";
  137. case 0x1015: return "Generic Property Client";
  138. case 0x1100: return "Sensor Server";
  139. case 0x1101: return "Sensor Setup Server";
  140. case 0x1102: return "Sensor Client";
  141. case 0x1200: return "Time Server";
  142. case 0x1201: return "Time Setup Server";
  143. case 0x1202: return "Time Client";
  144. case 0x1203: return "Scene Server";
  145. case 0x1204: return "Scene Setup Server";
  146. case 0x1205: return "Scene Client";
  147. case 0x1206: return "Scheduler Server";
  148. case 0x1207: return "Scheduler Setup Server";
  149. case 0x1208: return "Scheduler Client";
  150. case 0x1300: return "Light Lightness Server";
  151. case 0x1301: return "Light Lightness Setup Server";
  152. case 0x1302: return "Light Lightness Client";
  153. case 0x1303: return "Light CTL Server";
  154. case 0x1304: return "Light CTL Setup Server";
  155. case 0x1305: return "Light CTL Client";
  156. case 0x1306: return "Light CTL Temperature Server";
  157. case 0x1307: return "Light HSL Server";
  158. case 0x1308: return "Light HSL Setup Server";
  159. case 0x1309: return "Light HSL Client";
  160. case 0x130A: return "Light HSL Hue Server";
  161. case 0x130B: return "Light HSL Saturation Server";
  162. case 0x130C: return "Light xyL Server";
  163. case 0x130D: return "Light xyL Setup Server";
  164. case 0x130E: return "Light xyL Client";
  165. case 0x130F: return "Light LC Server";
  166. case 0x1310: return "Light LC Setup Server";
  167. case 0x1311: return "Light LC Client";
  168. default: return "Unknown";
  169. }
  170. }