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