2 * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
31 extern zigbee_h handle;
33 extern nwk_addr dest_addr16;
34 extern ieee_addr dest_addr64;
36 static char data_duration[MENU_DATA_SIZE + 1] = "5";
37 static char data_count[MENU_DATA_SIZE + 1] = "4";
38 static char data_start_idx[MENU_DATA_SIZE + 1] = "0";
39 static char data_nwk_update_id[MENU_DATA_SIZE + 1] = "0";
40 static char data_remove_children[MENU_DATA_SIZE + 1] = "1";
41 static char data_rejoin[MENU_DATA_SIZE + 1] = "1";
42 static char data_permit_duration[MENU_DATA_SIZE + 1] = "1";
43 static char data_tc[MENU_DATA_SIZE + 1] = "1";
45 static void zigbee_zdo_mgmt_nwk_disc_rsp(unsigned char status,
46 unsigned char network_count, unsigned char start_idx, unsigned char network_list_count,
47 const zb_zdo_network_list_record_h *records, void *user_data)
50 ieee_addr extended_pan_id;
51 unsigned char logical_channel;
52 unsigned char stack_profile;
53 unsigned char zigbee_version;
54 unsigned char beacon_order;
55 unsigned char superframe_order;
56 unsigned char permit_joining;
59 msgp("zb_zdo_mgmt_nwk_disc_rsp() status = 0x%02X", status);
62 msg(" network_count 0x%02X", network_count);
63 msg(" start_idx 0x%02X", start_idx);
64 msg(" network_list_count 0x%02X", network_list_count);
65 for (i = 0; i < network_list_count; i++) {
66 zb_network_list_record_get_extended_pan_id(records[i], extended_pan_id);
67 msg(" Extended PanId %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
68 extended_pan_id[7], extended_pan_id[6],
69 extended_pan_id[5], extended_pan_id[4],
70 extended_pan_id[3], extended_pan_id[2],
71 extended_pan_id[1], extended_pan_id[0]);
72 zb_network_list_record_get_logical_channel(records[i], &logical_channel);
73 msg(" Logical Channel 0x%02X", logical_channel);
74 zb_network_list_record_get_stack_profile(records[i], &stack_profile);
75 msg(" stack_profile 0x%02X", stack_profile);
76 zb_network_list_record_get_zigbee_version(records[i], &zigbee_version);
77 msg(" zigbee_version 0x%02X", zigbee_version);
78 zb_network_list_record_get_beacon_order(records[i], &beacon_order);
79 msg(" Beacon_order 0x%02X", beacon_order);
80 zb_network_list_record_get_superframe_order(records[i], &superframe_order);
81 msg(" Superframe_order 0x%02X", superframe_order);
82 zb_network_list_record_get_permit_joining(records[i], &permit_joining);
83 msg(" Permit joining 0x%02X", permit_joining);
86 msg(" Unsuccessful Nwk discovery");
90 static void zigbee_zdo_mgmt_lqi_rsp(unsigned char status,
91 unsigned char neighbor_table_entries, unsigned char start_idx,
92 unsigned char neighbor_table_list_count,
93 const zb_zdo_neighbor_table_desc_h *neighbor_table_list, void *user_data)
96 ieee_addr extended_pan_id;
99 unsigned char device_type;
100 unsigned char rx_on_when_idle;
101 unsigned char releationship;
102 unsigned char permit_joining;
107 msgp("zb_zdo_mgmt_lqi_rsp()");
108 msgp(" status = 0x%02X start_idx=%d count=%d", status, start_idx, neighbor_table_list_count);
109 for (i = start_idx; i < neighbor_table_list_count; i++) {
110 zb_neighbor_table_desc_get_extended_pan_id(neighbor_table_list[i], extended_pan_id);
111 msg(" ext PAN ID = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
112 extended_pan_id[0], extended_pan_id[1], extended_pan_id[2], extended_pan_id[3],
113 extended_pan_id[4], extended_pan_id[5], extended_pan_id[6], extended_pan_id[7]);
114 zb_neighbor_table_desc_get_ieee_addr(neighbor_table_list[i], addr64);
115 msg(" IEEE address = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
116 addr64[0], addr64[1], addr64[2], addr64[3], addr64[4], addr64[5], addr64[6], addr64[7]);
117 zb_neighbor_table_desc_get_nwk_addr(neighbor_table_list[i], &addr16);
118 msg(" Network address = 0x%04X", addr16);
119 zb_neighbor_table_desc_get_device_type(neighbor_table_list[i], &device_type);
120 msg(" Device Type = 0x%02X", device_type);
121 zb_neighbor_table_desc_get_rx_on_when_idle(neighbor_table_list[i], &rx_on_when_idle);
122 msg(" Rx on idle = 0x%02X", rx_on_when_idle);
123 zb_neighbor_table_desc_get_relationship(neighbor_table_list[i], &releationship);
124 msg(" Relationship = 0x%02X", releationship);
125 zb_neighbor_table_desc_get_permit_joining(neighbor_table_list[i], &permit_joining);
126 msg(" Permit Joining = 0x%02X", permit_joining);
127 zb_neighbor_table_desc_get_depth(neighbor_table_list[i], &depth);
128 msg(" Depth = 0x%02X", depth);
129 zb_neighbor_table_desc_get_lqi(neighbor_table_list[i], &lqi);
130 msg(" LQI = 0x%02X", lqi);
134 static void zigbee_zdo_mgmt_rtg_rsp(unsigned char status,
135 unsigned char routing_table_entries, unsigned char start_idx,
136 unsigned char routing_table_list_count,
137 const zb_zdo_routing_table_h *routing_table_list, void *user_data)
142 unsigned char memory_constrained;
143 unsigned char many_to_one;
144 unsigned char route_record_required;
145 nwk_addr next_hop_addr;
148 msgp("zb_zdo_mgmt_rtg_rsp()");
149 msgp(" status = 0x%02X routing_table_entries=%d start_idx=%d count=%d",
150 status, routing_table_entries, start_idx, routing_table_list_count);
151 for (i = start_idx; i < routing_table_list_count; i++) {
152 zb_routing_table_get_dst_addr(routing_table_list[i], &dst_addr);
153 msg(" [%d] Destination address = 0x%04X", i, dst_addr);
154 zb_routing_table_get_dst_status(routing_table_list[i], &mode);
155 msg(" [%d] Status = 0x%02X", i, mode);
156 zb_routing_table_get_memory_constrained(routing_table_list[i], &memory_constrained);
157 msg(" [%d] memory_constrained = 0x%02X", i, memory_constrained);
158 zb_routing_table_get_many_to_one(routing_table_list[i], &many_to_one);
159 msg(" [%d] many_to_one = 0x%02X", i, many_to_one);
160 zb_routing_table_get_route_record_required(routing_table_list[i], &route_record_required);
161 msg(" [%d] route_record_required = 0x%02X", i, route_record_required);
162 zb_routing_table_get_next_hop_addr(routing_table_list[i], &next_hop_addr);
163 msg(" [%d] next_hop_addr = 0x%04X", i, next_hop_addr);
168 static void zigbee_zdo_mgmt_bind_rsp(unsigned char status, unsigned char entries,
169 unsigned char start_idx, unsigned char binding_table_list_count, const zb_zdo_binding_table_h *list,
175 unsigned short cluster_id;
176 unsigned char src_ep, dst_ep, dst_addr_mode;
179 msgp("zb_zdo_mgmt_bind_rsp()");
180 msgp(" status = 0x%02X start_idx = %d number of records = %d",
181 status, start_idx, binding_table_list_count);
183 for (i = 0; i < binding_table_list_count; i++) {
184 zb_binding_table_get_src_addr(list[i], addr64);
185 msg(" Src IEEE address = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
186 addr64[0], addr64[1], addr64[2], addr64[3], addr64[4], addr64[5], addr64[6], addr64[7]);
187 zb_binding_table_get_src_ep(list[i], &src_ep);
188 msg(" Src End-Point = 0x%02X", src_ep);
189 zb_binding_table_get_cluster_id(list[i], &cluster_id);
190 msg(" Cluster ID = 0x%04X", cluster_id);
191 zb_binding_table_get_dst_addr_mode(list[i], &dst_addr_mode);
192 msg(" Dst Address Mode = 0x%02X", dst_addr_mode);
193 zb_binding_table_get_dst_addr16(list[i], &addr16);
194 msg(" Dst Network address = 0x%04X", addr16);
195 memset(addr64, 0, sizeof(ieee_addr));
196 zb_binding_table_get_dst_addr64(list[i], addr64);
197 msg(" Dst IEEE address = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
198 addr64[0], addr64[1], addr64[2], addr64[3], addr64[4], addr64[5], addr64[6], addr64[7]);
199 zb_binding_table_get_dst_ep(list[i], &dst_ep);
200 msg(" Dst End-Point = 0x%02X", src_ep);
205 static void zigbee_zdo_mgmt_leave_rsp(unsigned char status, void *user_data)
208 msgp("zb_zdo_mgmt_leave_rsp() status = 0x%02X", status);
211 static void zigbee_zdo_mgmt_permit_joining_rsp(unsigned char status, void *user_data)
214 msgp("zb_zdo_mgmt_permit_joining_rsp() status = 0x%02X", status);
217 static int run_mgmt_nwk_disc_req(MManager *mm, struct menu_data *menu)
219 int ret = ZIGBEE_ERROR_NONE;
220 unsigned int scan_channels = ZB_802_15_4_CHANNELS_MASK;
221 unsigned char scan_duration = 5;
222 unsigned char scan_count = 4;
223 unsigned char start_idx = 0;
225 if (strlen(data_duration))
226 scan_duration = (unsigned char)strtol(data_duration, NULL, 10);
227 if (strlen(data_count))
228 scan_count = (unsigned char)strtol(data_count, NULL, 10);
229 if (strlen(data_start_idx))
230 start_idx = (unsigned char)strtol(data_start_idx, NULL, 10);
232 ret = zb_zdo_mgmt_nwk_disc_req(handle, dest_addr16, scan_channels,
233 scan_duration, scan_count, start_idx,
234 zigbee_zdo_mgmt_nwk_disc_rsp, NULL);
235 if (ZIGBEE_ERROR_NONE != ret) {
236 msg("zb_zdo_mgmt_nwk_disc_req(0x%X) - FAILED!!!", ret);
240 msg(" - zb_zdo_mgmt_nwk_disc_req() ret: [0x%X]", ret);
246 static int run_mgmt_nwk_update_req(MManager *mm, struct menu_data *menu)
248 int ret = ZIGBEE_ERROR_NONE;
249 unsigned int scan_channels = ZB_802_15_4_CHANNELS_MASK;
250 unsigned char nwk_update_id = 0x00;
251 unsigned char scan_duration = 5;
252 unsigned char scan_count = 4;
254 if (strlen(data_duration))
255 scan_duration = (unsigned char)strtol(data_duration, NULL, 10);
256 if (strlen(data_count))
257 scan_count = (unsigned char)strtol(data_count, NULL, 10);
258 if (strlen(data_nwk_update_id))
259 nwk_update_id = (unsigned char)strtol(data_nwk_update_id, NULL, 10);
261 ret = zb_zdo_mgmt_nwk_update_req(handle, scan_channels, scan_duration,
262 scan_count, nwk_update_id, dest_addr16);
263 if (ZIGBEE_ERROR_NONE != ret) {
264 msg("zb_zdo_mgmt_nwk_update_req(0x%X) - FAILED!!!", ret);
268 msg(" - zb_zdo_mgmt_nwk_update_req() ret: [0x%X]", ret);
274 static int run_mgmt_lqi_req(MManager *mm, struct menu_data *menu)
276 int ret = ZIGBEE_ERROR_NONE;
277 unsigned char start_idx = 0;
279 if (strlen(data_start_idx))
280 start_idx = (unsigned char)strtol(data_start_idx, NULL, 10);
282 ret = zb_zdo_mgmt_lqi_req(handle, dest_addr16, start_idx,
283 zigbee_zdo_mgmt_lqi_rsp, NULL);
284 if (ZIGBEE_ERROR_NONE != ret) {
285 msg("zb_zdo_mgmt_lqi_req(0x%X) - FAILED!!!", ret);
289 msg(" - zb_zdo_mgmt_lqi_req() ret: [0x%X]", ret);
295 static int run_mgmt_rtg_req(MManager *mm, struct menu_data *menu)
297 int ret = ZIGBEE_ERROR_NONE;
298 unsigned char start_idx = 0;
300 if (strlen(data_start_idx))
301 start_idx = (unsigned char)strtol(data_start_idx, NULL, 10);
303 ret = zb_zdo_mgmt_rtg_req(handle, dest_addr16, start_idx,
304 zigbee_zdo_mgmt_rtg_rsp, NULL);
305 if (ZIGBEE_ERROR_NONE != ret) {
306 msg("zb_zdo_mgmt_rtg_req(0x%X) - FAILED!!!", ret);
310 msg(" - zb_zdo_mgmt_rtg_req() ret: [0x%X]", ret);
316 static int run_mgmt_bind_req(MManager *mm, struct menu_data *menu)
318 int ret = ZIGBEE_ERROR_NONE;
319 unsigned char start_idx = 0;
321 if (strlen(data_start_idx))
322 start_idx = (unsigned char)strtol(data_start_idx, NULL, 10);
324 ret = zb_zdo_mgmt_bind_req(handle, dest_addr16, start_idx,
325 zigbee_zdo_mgmt_bind_rsp, NULL);
326 if (ZIGBEE_ERROR_NONE != ret) {
327 msg("zb_zdo_mgmt_bind_req(0x%X) - FAILED!!!", ret);
331 msg(" - zb_zdo_mgmt_bind_req() ret: [0x%X]", ret);
337 static int run_mgmt_leave_req(MManager *mm, struct menu_data *menu)
339 int ret = ZIGBEE_ERROR_NONE;
340 unsigned char var = 0;
341 bool remove_children = true;
344 if (strlen(data_remove_children)) {
345 var = (unsigned char)strtol(data_remove_children, NULL, 10);
346 remove_children = (var == 0) ? false : true;
348 if (strlen(data_rejoin)) {
349 var = (unsigned char)strtol(data_rejoin, NULL, 10);
350 rejoin = (var == 0) ? false : true;
353 ret = zb_zdo_mgmt_leave_req(handle, dest_addr64, remove_children, rejoin,
354 zigbee_zdo_mgmt_leave_rsp, NULL);
355 if (ZIGBEE_ERROR_NONE != ret) {
356 msg("zb_zdo_mgmt_leave_req(0x%X) - FAILED!!!", ret);
360 msg(" - zb_zdo_mgmt_leave_req() ret: [0x%X]", ret);
366 static int run_mgmt_permit_joining_req(MManager *mm, struct menu_data *menu)
368 int ret = ZIGBEE_ERROR_NONE;
369 unsigned char permit_duration = 1;
370 unsigned char tc_significance = 1;
372 if (strlen(data_permit_duration))
373 permit_duration = (unsigned char)strtol(data_permit_duration, NULL, 10);
375 tc_significance = (unsigned char)strtol(data_tc, NULL, 10);
377 ret = zb_zdo_mgmt_permit_joining_req(handle, dest_addr16,
378 permit_duration, tc_significance,
379 zigbee_zdo_mgmt_permit_joining_rsp, NULL);
380 if (ZIGBEE_ERROR_NONE != ret) {
381 msg("zb_zdo_mgmt_permit_joining_req(0x%X) - FAILED!!!", ret);
385 msg(" - zb_zdo_mgmt_permit_joining_req() ret: [0x%X]", ret);
391 static struct menu_data _menu_nwk_disc[] = {
392 { "1", "Scan duration", NULL, NULL, data_duration },
393 { "2", "Scan count", NULL, NULL, data_count },
394 { "3", "Start index", NULL, NULL, data_start_idx },
395 { "4", "Run", NULL, run_mgmt_nwk_disc_req, NULL },
399 static struct menu_data _menu_nwk_update[] = {
400 { "1", "Scan duration", NULL, NULL, data_duration },
401 { "2", "Scan count", NULL, NULL, data_count },
402 { "3", "Start index", NULL, NULL, data_start_idx },
403 { "4", "Run", NULL, run_mgmt_nwk_update_req, NULL },
407 static struct menu_data _menu_lqi[] = {
408 { "1", "Start index", NULL, NULL, data_start_idx },
409 { "2", "Run", NULL, run_mgmt_lqi_req, NULL },
413 static struct menu_data _menu_rtg[] = {
414 { "1", "Start index", NULL, NULL, data_start_idx },
415 { "2", "Run", NULL, run_mgmt_rtg_req, NULL },
419 static struct menu_data _menu_bind[] = {
420 { "1", "Start index", NULL, NULL, data_start_idx },
421 { "2", "Run", NULL, run_mgmt_bind_req, NULL },
425 static struct menu_data _menu_leave[] = {
426 { "1", "Remove children", NULL, NULL, data_remove_children },
427 { "2", "Rejoin", NULL, NULL, data_rejoin },
428 { "3", "Run", NULL, run_mgmt_leave_req, NULL },
432 static struct menu_data _menu_permit[] = {
433 { "1", "Permit duration", NULL, NULL, data_permit_duration },
434 { "2", "TC significance", NULL, NULL, data_tc },
435 { "3", "Run", NULL, run_mgmt_permit_joining_req, NULL },
439 struct menu_data menu_zdo_network[] = {
440 { "1", "zb_zdo_mgmt_nwk_disc_req", _menu_nwk_disc, NULL, NULL },
441 { "2", "zb_zdo_mgmt_nwk_update_req", _menu_nwk_update, NULL, NULL },
442 { "3", "zb_zdo_mgmt_lqi_req", _menu_lqi, NULL, NULL },
443 { "4", "zb_zdo_mgmt_rtg_req", _menu_rtg, NULL, NULL },
444 { "5", "zb_zdo_mgmt_bind_req", _menu_bind, NULL, NULL },
445 { "6", "zb_zdo_mgmt_leave_req", _menu_leave, NULL, NULL },
446 { "7", "zb_zdo_mgmt_permit_joining_req", _menu_permit, NULL, NULL },