29#ifndef PROTOCORE_THREAD_H
30#define PROTOCORE_THREAD_H
42 static constexpr uint8_t HDLC_FLAG = 0x7E;
43 static constexpr uint8_t HDLC_ESCAPE = 0x7D;
49 static constexpr uint8_t SPINEL_CMD_NOOP = 0;
50 static constexpr uint8_t SPINEL_CMD_RESET = 1;
51 static constexpr uint8_t SPINEL_CMD_PROP_VALUE_GET = 2;
52 static constexpr uint8_t SPINEL_CMD_PROP_VALUE_SET = 3;
53 static constexpr uint8_t SPINEL_CMD_PROP_VALUE_INSERT = 4;
54 static constexpr uint8_t SPINEL_CMD_PROP_VALUE_REMOVE = 5;
55 static constexpr uint8_t SPINEL_CMD_PROP_VALUE_IS = 6;
56 static constexpr uint8_t SPINEL_CMD_PROP_VALUE_INSERTED = 7;
57 static constexpr uint8_t SPINEL_CMD_PROP_VALUE_REMOVED = 8;
67 static constexpr uint32_t SPINEL_PROP_LAST_STATUS = 0;
68 static constexpr uint32_t SPINEL_PROP_PROTOCOL_VERSION = 1;
69 static constexpr uint32_t SPINEL_PROP_NCP_VERSION = 2;
70 static constexpr uint32_t SPINEL_PROP_INTERFACE_TYPE = 3;
71 static constexpr uint32_t SPINEL_PROP_VENDOR_ID = 4;
72 static constexpr uint32_t SPINEL_PROP_CAPS = 5;
73 static constexpr uint32_t SPINEL_PROP_INTERFACE_COUNT = 6;
74 static constexpr uint32_t SPINEL_PROP_HWADDR = 8;
75 static constexpr uint32_t SPINEL_PROP_LOCK = 9;
77 static constexpr uint32_t SPINEL_PROP_PHY_ENABLED = 0x20;
78 static constexpr uint32_t SPINEL_PROP_PHY_CHAN = 0x21;
79 static constexpr uint32_t SPINEL_PROP_PHY_CHAN_SUPPORTED = 0x22;
80 static constexpr uint32_t SPINEL_PROP_PHY_FREQ = 0x23;
81 static constexpr uint32_t SPINEL_PROP_PHY_TX_POWER = 0x25;
82 static constexpr uint32_t SPINEL_PROP_PHY_RSSI = 0x26;
84 static constexpr uint32_t SPINEL_PROP_MAC_SCAN_STATE = 0x30;
85 static constexpr uint32_t SPINEL_PROP_MAC_SCAN_MASK = 0x31;
86 static constexpr uint32_t SPINEL_PROP_MAC_SCAN_PERIOD = 0x32;
87 static constexpr uint32_t SPINEL_PROP_MAC_15_4_LADDR = 0x34;
88 static constexpr uint32_t SPINEL_PROP_MAC_15_4_SADDR = 0x35;
89 static constexpr uint32_t SPINEL_PROP_MAC_15_4_PANID = 0x36;
91 static constexpr uint32_t SPINEL_PROP_NET_SAVED = 0x40;
92 static constexpr uint32_t SPINEL_PROP_NET_IF_UP = 0x41;
93 static constexpr uint32_t SPINEL_PROP_NET_STACK_UP = 0x42;
94 static constexpr uint32_t SPINEL_PROP_NET_ROLE = 0x43;
95 static constexpr uint32_t SPINEL_PROP_NET_NETWORK_NAME = 0x44;
96 static constexpr uint32_t SPINEL_PROP_NET_XPANID = 0x45;
97 static constexpr uint32_t SPINEL_PROP_NET_NETWORK_KEY = 0x46;
99 static constexpr uint32_t SPINEL_PROP_IPV6_LL_ADDR = 0x60;
100 static constexpr uint32_t SPINEL_PROP_IPV6_ML_ADDR = 0x61;
102 static constexpr uint32_t SPINEL_PROP_STREAM_DEBUG = 0x70;
103 static constexpr uint32_t SPINEL_PROP_STREAM_RAW = 0x71;
104 static constexpr uint32_t SPINEL_PROP_STREAM_NET = 0x72;
110 static constexpr uint32_t SPINEL_STATUS_OK = 0;
111 static constexpr uint32_t SPINEL_STATUS_FAILURE = 1;
112 static constexpr uint32_t SPINEL_STATUS_UNIMPLEMENTED = 2;
113 static constexpr uint32_t SPINEL_STATUS_INVALID_ARGUMENT = 3;
114 static constexpr uint32_t SPINEL_STATUS_INVALID_STATE = 4;
115 static constexpr uint32_t SPINEL_STATUS_INVALID_COMMAND = 5;
116 static constexpr uint32_t SPINEL_STATUS_INVALID_INTERFACE = 6;
117 static constexpr uint32_t SPINEL_STATUS_INTERNAL_ERROR = 7;
118 static constexpr uint32_t SPINEL_STATUS_SECURITY_ERROR = 8;
119 static constexpr uint32_t SPINEL_STATUS_PARSE_ERROR = 9;
120 static constexpr uint32_t SPINEL_STATUS_IN_PROGRESS = 10;
121 static constexpr uint32_t SPINEL_STATUS_NOMEM = 11;
122 static constexpr uint32_t SPINEL_STATUS_BUSY = 12;
123 static constexpr uint32_t SPINEL_STATUS_PROP_NOT_FOUND = 13;
124 static constexpr uint32_t SPINEL_STATUS_DROPPED = 14;
125 static constexpr uint32_t SPINEL_STATUS_EMPTY = 15;
126 static constexpr uint32_t SPINEL_STATUS_RESET_POWER_ON = 112;
132inline uint8_t pc_spinel_header(uint8_t iid, uint8_t tid)
134 return (uint8_t)(0x80 | ((iid & 0x03) << 4) | (tid & 0x0F));
137inline uint8_t pc_spinel_header_tid(uint8_t h)
139 return (uint8_t)(h & 0x0F);
142inline uint8_t pc_spinel_header_iid(uint8_t h)
144 return (uint8_t)((h >> 4) & 0x03);
148uint16_t pc_spinel_fcs(
const uint8_t *buf, uint16_t len);
157uint8_t pc_spinel_pack_uint(uint32_t value, uint8_t *out, uint8_t cap);
164int pc_spinel_unpack_uint(
const uint8_t *raw, uint8_t len, uint32_t *value);
171uint16_t pc_spinel_command_build(uint8_t header, uint32_t cmd, uint32_t prop,
const uint8_t *value, uint16_t value_len,
172 uint8_t *out, uint16_t cap);
183int pc_spinel_command_parse(
const uint8_t *payload, uint16_t len, uint8_t *header, uint32_t *cmd, uint32_t *prop,
184 const uint8_t **value, uint16_t *value_len);
213void pc_spinel_reader_init(SpinelReader *r,
const uint8_t *value, uint16_t len);
214bool pc_spinel_get_bool(SpinelReader *r,
bool *out);
215bool pc_spinel_get_u8(SpinelReader *r, uint8_t *out);
216bool pc_spinel_get_i8(SpinelReader *r, int8_t *out);
217bool pc_spinel_get_u16(SpinelReader *r, uint16_t *out);
218bool pc_spinel_get_i16(SpinelReader *r, int16_t *out);
219bool pc_spinel_get_u32(SpinelReader *r, uint32_t *out);
220bool pc_spinel_get_i32(SpinelReader *r, int32_t *out);
221bool pc_spinel_get_uint(SpinelReader *r, uint32_t *out);
222bool pc_spinel_get_eui64(SpinelReader *r,
const uint8_t **out8);
223bool pc_spinel_get_ipv6(SpinelReader *r,
const uint8_t **out16);
225bool pc_spinel_get_utf8(SpinelReader *r,
const char **out, uint16_t *out_len);
227bool pc_spinel_get_data(SpinelReader *r,
const uint8_t **out, uint16_t *out_len);
229bool pc_spinel_get_data_wlen(SpinelReader *r,
const uint8_t **out, uint16_t *out_len);
231bool pc_spinel_reader_ok(
const SpinelReader *r);
233void pc_spinel_writer_init(SpinelWriter *w, uint8_t *out, uint16_t cap);
234bool pc_spinel_put_bool(SpinelWriter *w,
bool v);
235bool pc_spinel_put_u8(SpinelWriter *w, uint8_t v);
236bool pc_spinel_put_i8(SpinelWriter *w, int8_t v);
237bool pc_spinel_put_u16(SpinelWriter *w, uint16_t v);
238bool pc_spinel_put_i16(SpinelWriter *w, int16_t v);
239bool pc_spinel_put_u32(SpinelWriter *w, uint32_t v);
240bool pc_spinel_put_i32(SpinelWriter *w, int32_t v);
241bool pc_spinel_put_uint(SpinelWriter *w, uint32_t v);
242bool pc_spinel_put_eui64(SpinelWriter *w,
const uint8_t *v8);
243bool pc_spinel_put_ipv6(SpinelWriter *w,
const uint8_t *v16);
244bool pc_spinel_put_utf8(SpinelWriter *w,
const char *s);
245bool pc_spinel_put_data(SpinelWriter *w,
const uint8_t *d, uint16_t n);
246bool pc_spinel_put_data_wlen(SpinelWriter *w,
const uint8_t *d, uint16_t n);
248uint16_t pc_spinel_writer_len(
const SpinelWriter *w);
261const SpinelPropInfo *pc_spinel_prop_lookup(uint32_t
id);
263const char *pc_spinel_prop_name(uint32_t
id);
265const char *pc_spinel_status_name(uint32_t status);
272uint16_t pc_spinel_frame_encode(
const uint8_t *payload, uint16_t len, uint8_t *out, uint16_t cap);
282int pc_spinel_frame_decode(
const uint8_t *raw, uint16_t len, uint8_t *payload, uint16_t pay_cap, uint16_t *pay_len);
User-facing configuration for ProtoCore.