1 #include <stdio.h> 2 3 #include "CppUTest/TestHarness.h" 4 #include "CppUTest/CommandLineTestRunner.h" 5 6 #include "btstack_debug.h" 7 #include "btstack_memory.h" 8 #include "btstack_util.h" 9 #include "mesh/adv_bearer.h" 10 #include "mesh/gatt_bearer.h" 11 #include "mesh/mesh_access.h" 12 #include "mesh/mesh_crypto.h" 13 #include "mesh/mesh_foundation.h" 14 #include "mesh/mesh_iv_index_seq_number.h" 15 #include "mesh/mesh_lower_transport.h" 16 #include "mesh/mesh_network.h" 17 #include "mesh/mesh_upper_transport.h" 18 #include "mesh/provisioning.h" 19 #include "mesh/mesh_peer.h" 20 #include "mock.h" 21 22 23 static mesh_network_pdu_t * received_network_pdu; 24 static mesh_network_pdu_t * received_proxy_pdu; 25 26 static uint8_t outgoing_gatt_network_pdu_data[29]; 27 static uint8_t outgoing_gatt_network_pdu_len; 28 29 static uint8_t outgoing_adv_network_pdu_data[29]; 30 static uint8_t outgoing_adv_network_pdu_len; 31 32 static uint8_t recv_upper_transport_pdu_data[100]; 33 static uint16_t recv_upper_transport_pdu_len; 34 35 #ifdef ENABLE_MESH_ADV_BEARER 36 static btstack_packet_handler_t adv_packet_handler; 37 void adv_bearer_register_for_network_pdu(btstack_packet_handler_t packet_handler){ 38 adv_packet_handler = packet_handler; 39 } 40 void adv_bearer_request_can_send_now_for_network_pdu(void){ 41 // simulate can send now 42 uint8_t event[3]; 43 event[0] = HCI_EVENT_MESH_META; 44 event[1] = 1; 45 event[2] = MESH_SUBEVENT_CAN_SEND_NOW; 46 (*adv_packet_handler)(HCI_EVENT_PACKET, 0, &event[0], sizeof(event)); 47 } 48 void adv_bearer_send_network_pdu(const uint8_t * network_pdu, uint16_t size, uint8_t count, uint16_t interval){ 49 (void) count; 50 (void) interval; 51 // printf("ADV Network PDU: "); 52 // printf_hexdump(network_pdu, size); 53 memcpy(outgoing_adv_network_pdu_data, network_pdu, size); 54 outgoing_adv_network_pdu_len = size; 55 } 56 static void adv_bearer_emit_sent(void){ 57 uint8_t event[3]; 58 event[0] = HCI_EVENT_MESH_META; 59 event[1] = 1; 60 event[2] = MESH_SUBEVENT_MESSAGE_SENT; 61 (*adv_packet_handler)(HCI_EVENT_PACKET, 0, &event[0], sizeof(event)); 62 } 63 #endif 64 65 #ifdef ENABLE_MESH_GATT_BEARER 66 static btstack_packet_handler_t gatt_packet_handler; 67 void gatt_bearer_register_for_network_pdu(btstack_packet_handler_t packet_handler){ 68 gatt_packet_handler = packet_handler; 69 } 70 void gatt_bearer_register_for_mesh_proxy_configuration(btstack_packet_handler_t packet_handler){ 71 UNUSED(packet_handler); 72 } 73 void gatt_bearer_request_can_send_now_for_network_pdu(void){ 74 // simulate can send now 75 uint8_t event[3]; 76 event[0] = HCI_EVENT_MESH_META; 77 event[1] = 1; 78 event[2] = MESH_SUBEVENT_CAN_SEND_NOW; 79 (*gatt_packet_handler)(HCI_EVENT_PACKET, 0, &event[0], sizeof(event)); 80 } 81 void gatt_bearer_send_network_pdu(const uint8_t * network_pdu, uint16_t size){ 82 // printf("ADV Network PDU: "); 83 // printf_hexdump(network_pdu, size); 84 memcpy(outgoing_gatt_network_pdu_data, network_pdu, size); 85 outgoing_gatt_network_pdu_len = size; 86 } 87 static void gatt_bearer_emit_sent(void){ 88 uint8_t event[3]; 89 event[0] = HCI_EVENT_MESH_META; 90 event[1] = 1; 91 event[2] = MESH_SUBEVENT_MESSAGE_SENT; 92 (*gatt_packet_handler)(HCI_EVENT_PACKET, 0, &event[0], sizeof(event)); 93 } 94 static void gatt_bearer_emit_connected(void){ 95 uint8_t event[5]; 96 event[0] = HCI_EVENT_MESH_META; 97 event[1] = 1; 98 event[2] = MESH_SUBEVENT_PROXY_CONNECTED; 99 little_endian_store_16(event, 3, 0x1234); 100 (*gatt_packet_handler)(HCI_EVENT_PACKET, 0, &event[0], sizeof(event)); 101 } 102 #endif 103 104 // copy from mesh_message.c for now 105 uint16_t mesh_pdu_dst(mesh_pdu_t * pdu){ 106 switch (pdu->pdu_type){ 107 case MESH_PDU_TYPE_UNSEGMENTED: 108 case MESH_PDU_TYPE_NETWORK: 109 case MESH_PDU_TYPE_UPPER_UNSEGMENTED_CONTROL: 110 return mesh_network_dst((mesh_network_pdu_t *) pdu); 111 case MESH_PDU_TYPE_ACCESS: { 112 return ((mesh_access_pdu_t *) pdu)->dst; 113 } 114 case MESH_PDU_TYPE_UPPER_SEGMENTED_ACCESS: 115 case MESH_PDU_TYPE_UPPER_UNSEGMENTED_ACCESS: 116 return ((mesh_upper_transport_pdu_t *) pdu)->dst; 117 default: 118 btstack_assert(false); 119 return MESH_ADDRESS_UNSASSIGNED; 120 } 121 } 122 uint16_t mesh_pdu_ctl(mesh_pdu_t * pdu){ 123 switch (pdu->pdu_type){ 124 case MESH_PDU_TYPE_NETWORK: 125 case MESH_PDU_TYPE_UPPER_UNSEGMENTED_CONTROL: 126 return mesh_network_control((mesh_network_pdu_t *) pdu); 127 case MESH_PDU_TYPE_ACCESS: { 128 return ((mesh_access_pdu_t *) pdu)->ctl_ttl >> 7; 129 } 130 default: 131 btstack_assert(false); 132 return 0; 133 } 134 } 135 136 static void CHECK_EQUAL_ARRAY(uint8_t * expected, uint8_t * actual, int size){ 137 int i; 138 for (i=0; i<size; i++){ 139 if (expected[i] != actual[i]) { 140 printf("offset %u wrong\n", i); 141 printf("expected: "); printf_hexdump(expected, size); 142 printf("actual: "); printf_hexdump(actual, size); 143 } 144 BYTES_EQUAL(expected[i], actual[i]); 145 } 146 } 147 148 static int scan_hex_byte(const char * byte_string){ 149 uint8_t upper_nibble = nibble_for_char(*byte_string++); 150 if (upper_nibble < 0) return -1; 151 uint8_t lower_nibble = nibble_for_char(*byte_string); 152 if (lower_nibble < 0) return -1; 153 return (upper_nibble << 4) | lower_nibble; 154 } 155 156 static int btstack_parse_hex(const char * string, uint16_t len, uint8_t * buffer){ 157 int i; 158 for (i = 0; i < len; i++) { 159 int single_byte = scan_hex_byte(string); 160 if (single_byte < 0) return 0; 161 string += 2; 162 buffer[i] = (uint8_t)single_byte; 163 // don't check separator after last byte 164 if (i == len - 1) { 165 return 1; 166 } 167 // optional seperator 168 char separator = *string; 169 if (separator == ':' || separator == '-' || separator == ' ') { 170 string++; 171 } 172 } 173 return 1; 174 } 175 176 #if 0 177 static void btstack_print_hex(const uint8_t * data, uint16_t len, char separator){ 178 int i; 179 for (i=0;i<len;i++){ 180 printf("%02x", data[i]); 181 if (separator){ 182 printf("%c", separator); 183 } 184 } 185 printf("\n"); 186 } 187 #endif 188 189 static mesh_transport_key_t test_application_key; 190 static void mesh_application_key_set(uint16_t netkey_index, uint16_t appkey_index, uint8_t aid, const uint8_t *application_key) { 191 test_application_key.netkey_index = netkey_index; 192 test_application_key.appkey_index = appkey_index; 193 test_application_key.aid = aid; 194 test_application_key.akf = 1; 195 memcpy(test_application_key.key, application_key, 16); 196 mesh_transport_key_add(&test_application_key); 197 } 198 199 static void load_network_key_nid_68(void){ 200 mesh_network_key_t * network_key = btstack_memory_mesh_network_key_get(); 201 network_key->nid = 0x68; 202 btstack_parse_hex("0953fa93e7caac9638f58820220a398e", 16, network_key->encryption_key); 203 btstack_parse_hex("8b84eedec100067d670971dd2aa700cf", 16, network_key->privacy_key); 204 mesh_network_key_add(network_key); 205 mesh_subnet_setup_for_netkey_index(network_key->netkey_index); 206 } 207 208 static void load_network_key_nid_5e(void){ 209 mesh_network_key_t * network_key = btstack_memory_mesh_network_key_get(); 210 network_key->nid = 0x5e; 211 btstack_parse_hex("be635105434859f484fc798e043ce40e", 16, network_key->encryption_key); 212 btstack_parse_hex("5d396d4b54d3cbafe943e051fe9a4eb8", 16, network_key->privacy_key); 213 mesh_network_key_add(network_key); 214 mesh_subnet_setup_for_netkey_index(network_key->netkey_index); 215 } 216 217 static void load_network_key_nid_10(void){ 218 mesh_network_key_t * network_key = btstack_memory_mesh_network_key_get(); 219 network_key->nid = 0x10; 220 btstack_parse_hex("3a4fe84a6cc2c6a766ea93f1084d4039", 16, network_key->encryption_key); 221 btstack_parse_hex("f695fcce709ccface4d8b7a1e6e39d25", 16, network_key->privacy_key); 222 mesh_network_key_add(network_key); 223 mesh_subnet_setup_for_netkey_index(network_key->netkey_index); 224 } 225 226 static void load_provisioning_data_test_message(void){ 227 uint8_t application_key[16]; 228 btstack_parse_hex("63964771734fbd76e3b40519d1d94a48", 16, application_key); 229 mesh_application_key_set( 0, 0, 0x26, application_key); 230 231 uint8_t device_key[16]; 232 btstack_parse_hex("9d6dd0e96eb25dc19a40ed9914f8f03f", 16, device_key); 233 mesh_transport_set_device_key(device_key); 234 } 235 236 static void test_lower_transport_callback_handler(mesh_network_callback_type_t callback_type, mesh_network_pdu_t * network_pdu){ 237 switch (callback_type){ 238 case MESH_NETWORK_PDU_RECEIVED: 239 printf("test MESH_NETWORK_PDU_RECEIVED\n"); 240 received_network_pdu = network_pdu; 241 break; 242 case MESH_NETWORK_PDU_SENT: 243 printf("test MESH_NETWORK_PDU_SENT\n"); 244 mesh_lower_transport_received_message(MESH_NETWORK_PDU_SENT, network_pdu); 245 break; 246 default: 247 break; 248 } 249 } 250 251 static void test_proxy_server_callback_handler(mesh_network_callback_type_t callback_type, mesh_network_pdu_t * network_pdu){ 252 switch (callback_type){ 253 case MESH_NETWORK_PDU_RECEIVED: 254 printf("test MESH_PROXY_PDU_RECEIVED\n"); 255 received_proxy_pdu = network_pdu; 256 break; 257 case MESH_NETWORK_PDU_SENT: 258 // printf("test MESH_PROXY_PDU_SENT\n"); 259 // mesh_lower_transport_received_mesage(MESH_NETWORK_PDU_SENT, network_pdu); 260 break; 261 case MESH_NETWORK_PDU_ENCRYPTED: 262 printf("test MESH_NETWORK_PDU_ENCRYPTED\n"); 263 received_proxy_pdu = network_pdu; 264 break; 265 default: 266 break; 267 } 268 } 269 270 static void test_upper_transport_access_message_handler(mesh_transport_callback_type_t callback_type, mesh_transport_status_t status, mesh_pdu_t * pdu){ 271 UNUSED(status); 272 273 // ignore pdu sent 274 if (callback_type == MESH_TRANSPORT_PDU_SENT) return; 275 276 // process pdu received 277 mesh_access_pdu_t * access_pdu; 278 mesh_network_pdu_t * network_pdu; 279 mesh_segmented_pdu_t * message_pdu; 280 281 switch(pdu->pdu_type){ 282 case MESH_PDU_TYPE_ACCESS: 283 access_pdu = (mesh_access_pdu_t *) pdu; 284 printf("test access handler MESH_PDU_TYPE_ACCESS received\n"); 285 recv_upper_transport_pdu_len = access_pdu->len; 286 memcpy(recv_upper_transport_pdu_data, access_pdu->data, recv_upper_transport_pdu_len); 287 mesh_upper_transport_message_processed_by_higher_layer(pdu); 288 break; 289 case MESH_PDU_TYPE_SEGMENTED: 290 message_pdu = (mesh_segmented_pdu_t *) pdu; 291 printf("test access handler MESH_PDU_TYPE_SEGMENTED received\n"); 292 network_pdu = (mesh_network_pdu_t *) btstack_linked_list_get_first_item(&message_pdu->segments); 293 recv_upper_transport_pdu_len = mesh_network_pdu_len(network_pdu) - 1; 294 memcpy(recv_upper_transport_pdu_data, mesh_network_pdu_data(network_pdu) + 1, recv_upper_transport_pdu_len); 295 mesh_upper_transport_message_processed_by_higher_layer(pdu); 296 break; 297 default: 298 btstack_assert(0); 299 break; 300 } 301 } 302 303 static void test_upper_transport_control_message_handler(mesh_transport_callback_type_t callback_type, mesh_transport_status_t status, mesh_pdu_t * pdu){ 304 UNUSED(status); 305 306 // ignore pdu sent 307 if (callback_type == MESH_TRANSPORT_PDU_SENT) return; 308 309 // process pdu received 310 mesh_control_pdu_t * control_pdu; 311 switch(pdu->pdu_type){ 312 case MESH_PDU_TYPE_CONTROL: 313 control_pdu = (mesh_control_pdu_t *) pdu; 314 printf("test MESH_PDU_TYPE_CONTROL\n"); 315 recv_upper_transport_pdu_len = control_pdu->len + 1; 316 recv_upper_transport_pdu_data[0] = control_pdu->akf_aid_control; 317 memcpy(&recv_upper_transport_pdu_data[1], control_pdu->data, control_pdu->len); 318 mesh_upper_transport_message_processed_by_higher_layer(pdu); 319 break; 320 default: 321 btstack_assert(0); 322 break; 323 } 324 } 325 326 TEST_GROUP(MessageTest){ 327 void setup(void){ 328 btstack_memory_init(); 329 btstack_crypto_init(); 330 load_provisioning_data_test_message(); 331 mesh_network_init(); 332 mesh_lower_transport_init(); 333 mesh_upper_transport_init(); 334 mesh_network_key_init(); 335 // intercept messages between network and lower layer 336 mesh_network_set_higher_layer_handler(&test_lower_transport_callback_handler); 337 mesh_network_set_proxy_message_handler(&test_proxy_server_callback_handler); 338 // register to receive upper transport messages 339 mesh_upper_transport_register_access_message_handler(&test_upper_transport_access_message_handler); 340 mesh_upper_transport_register_control_message_handler(&test_upper_transport_control_message_handler); 341 mesh_seq_auth_reset(); 342 #ifdef ENABLE_MESH_GATT_BEARER 343 mesh_foundation_gatt_proxy_set(1); 344 gatt_bearer_emit_connected(); 345 #endif 346 outgoing_gatt_network_pdu_len = 0; 347 outgoing_adv_network_pdu_len = 0; 348 received_network_pdu = NULL; 349 recv_upper_transport_pdu_len =0; 350 } 351 void teardown(void){ 352 // printf("-- teardown start --\n\n"); 353 btstack_crypto_reset(); 354 mesh_network_reset(); 355 mesh_lower_transport_reset(); 356 mesh_upper_transport_dump(); 357 mesh_upper_transport_reset(); 358 // mesh_network_dump(); 359 // mesh_transport_dump(); 360 printf("-- teardown complete --\n\n"); 361 } 362 }; 363 364 static uint8_t transport_pdu_data[64]; 365 static uint16_t transport_pdu_len; 366 367 static uint8_t test_network_pdu_len; 368 static uint8_t test_network_pdu_data[29]; 369 370 static void test_receive_network_pdus(int count, char ** network_pdus, char ** lower_transport_pdus, char * access_pdu){ 371 int i; 372 for (i=0;i<count;i++){ 373 test_network_pdu_len = strlen(network_pdus[i]) / 2; 374 btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data); 375 376 mesh_network_received_message(test_network_pdu_data, test_network_pdu_len, 0); 377 378 while (received_network_pdu == NULL) { 379 mock_process_hci_cmd(); 380 } 381 382 transport_pdu_len = strlen(lower_transport_pdus[i]) / 2; 383 btstack_parse_hex(lower_transport_pdus[i], transport_pdu_len, transport_pdu_data); 384 385 uint8_t * lower_transport_pdu = mesh_network_pdu_data(received_network_pdu); 386 uint8_t lower_transport_pdu_len = mesh_network_pdu_len(received_network_pdu); 387 388 // printf_hexdump(lower_transport_pdu, lower_transport_pdu_len); 389 390 CHECK_EQUAL( transport_pdu_len, lower_transport_pdu_len); 391 CHECK_EQUAL_ARRAY(transport_pdu_data, lower_transport_pdu, transport_pdu_len); 392 393 // forward to mesh_transport 394 mesh_lower_transport_received_message(MESH_NETWORK_PDU_RECEIVED, received_network_pdu); 395 396 // done 397 received_network_pdu = NULL; 398 } 399 400 // wait for tranport pdu 401 while (recv_upper_transport_pdu_len == 0) { 402 mock_process_hci_cmd(); 403 } 404 405 transport_pdu_len = strlen(access_pdu) / 2; 406 btstack_parse_hex(access_pdu, transport_pdu_len, transport_pdu_data); 407 408 printf("UpperTransportPDU: "); 409 printf_hexdump(recv_upper_transport_pdu_data, recv_upper_transport_pdu_len); 410 CHECK_EQUAL( transport_pdu_len, recv_upper_transport_pdu_len); 411 CHECK_EQUAL_ARRAY(transport_pdu_data, recv_upper_transport_pdu_data, transport_pdu_len); 412 } 413 414 static void expect_gatt_network_pdu(void){ 415 416 while (outgoing_gatt_network_pdu_len == 0) { 417 mock_process_hci_cmd(); 418 } 419 420 if (outgoing_gatt_network_pdu_len != test_network_pdu_len){ 421 printf("Test Network PDU (%u): ", outgoing_gatt_network_pdu_len); printf_hexdump(outgoing_gatt_network_pdu_data, outgoing_gatt_network_pdu_len); 422 printf("Expected PDU (%u): ", test_network_pdu_len); printf_hexdump(test_network_pdu_data, test_network_pdu_len); 423 } 424 CHECK_EQUAL( outgoing_gatt_network_pdu_len, test_network_pdu_len); 425 CHECK_EQUAL_ARRAY(test_network_pdu_data, outgoing_gatt_network_pdu_data, test_network_pdu_len); 426 427 outgoing_gatt_network_pdu_len = 0; 428 gatt_bearer_emit_sent(); 429 } 430 431 static void expect_adv_network_pdu(void){ 432 while (outgoing_adv_network_pdu_len == 0) { 433 mock_process_hci_cmd(); 434 } 435 436 if (outgoing_adv_network_pdu_len != test_network_pdu_len){ 437 printf("Test Network PDU (%u): ", outgoing_adv_network_pdu_len); printf_hexdump(outgoing_adv_network_pdu_data, outgoing_adv_network_pdu_len); 438 printf("Expected PDU (%u): ", test_network_pdu_len); printf_hexdump(test_network_pdu_data, test_network_pdu_len); 439 } 440 CHECK_EQUAL( outgoing_adv_network_pdu_len, test_network_pdu_len); 441 CHECK_EQUAL_ARRAY(test_network_pdu_data, outgoing_adv_network_pdu_data, test_network_pdu_len); 442 443 outgoing_adv_network_pdu_len = 0; 444 adv_bearer_emit_sent(); 445 } 446 447 static void test_send_access_message(uint16_t netkey_index, uint16_t appkey_index, uint8_t ttl, uint16_t src, uint16_t dest, uint8_t szmic, char * control_pdu, int count, char ** lower_transport_pdus, char ** network_pdus){ 448 449 UNUSED(lower_transport_pdus); 450 451 transport_pdu_len = strlen(control_pdu) / 2; 452 btstack_parse_hex(control_pdu, transport_pdu_len, transport_pdu_data); 453 454 mesh_pdu_type_t pdu_type; 455 if (count == 1 ){ 456 // send as unsegmented access pdu 457 pdu_type = MESH_PDU_TYPE_UPPER_UNSEGMENTED_ACCESS; 458 } else { 459 // send as segmented access pdu 460 pdu_type = MESH_PDU_TYPE_UPPER_SEGMENTED_ACCESS; 461 } 462 #if 0 463 // 464 upper_pdu.lower_pdu = NULL; 465 upper_pdu.flags = 0; 466 upper_pdu.pdu_type = pdu_type; 467 mesh_pdu_t * pdu = (mesh_pdu_t *) &upper_pdu; 468 mesh_upper_transport_setup_access_pdu(pdu, netkey_index, appkey_index, ttl, src, dest, szmic, transport_pdu_data, transport_pdu_len); 469 #else 470 mesh_upper_transport_builder_t builder; 471 mesh_upper_transport_message_init(&builder, pdu_type); 472 mesh_upper_transport_message_add_data(&builder, transport_pdu_data, transport_pdu_len); 473 mesh_pdu_t * pdu = (mesh_pdu_t *) mesh_upper_transport_message_finalize(&builder); 474 mesh_upper_transport_setup_access_pdu_header(pdu, netkey_index, appkey_index, ttl, src, dest, szmic); 475 #endif 476 mesh_upper_transport_send_access_pdu(pdu); 477 478 // check for all network pdus 479 int i; 480 for (i=0;i<count;i++){ 481 // parse expected network pdu 482 test_network_pdu_len = strlen(network_pdus[i]) / 2; 483 btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data); 484 485 #ifdef ENABLE_MESH_GATT_BEARER 486 expect_gatt_network_pdu(); 487 #endif 488 489 #ifdef ENABLE_MESH_ADV_BEARER 490 expect_adv_network_pdu(); 491 #endif 492 } 493 } 494 495 static void test_send_control_message(uint16_t netkey_index, uint8_t ttl, uint16_t src, uint16_t dest, char * control_pdu, int count, char ** lower_transport_pdus, char ** network_pdus){ 496 497 UNUSED(lower_transport_pdus); 498 499 transport_pdu_len = strlen(control_pdu) / 2; 500 btstack_parse_hex(control_pdu, transport_pdu_len, transport_pdu_data); 501 502 uint8_t opcode = transport_pdu_data[0]; 503 504 mesh_pdu_t * pdu; 505 if (transport_pdu_len < 12){ 506 // send as unsegmented control pdu 507 mesh_network_pdu_t * network_pdu = mesh_network_pdu_get(); 508 mesh_upper_transport_setup_unsegmented_control_pdu(network_pdu, netkey_index, ttl, src, dest, opcode, transport_pdu_data+1, transport_pdu_len-1); 509 pdu = (mesh_pdu_t *) network_pdu; 510 } else { 511 mesh_upper_transport_builder_t builder; 512 mesh_upper_transport_message_init(&builder, MESH_PDU_TYPE_UPPER_SEGMENTED_CONTROL); 513 mesh_upper_transport_message_add_data(&builder, transport_pdu_data+1, transport_pdu_len-1); 514 mesh_upper_transport_pdu_t * final_upper_pdu = (mesh_upper_transport_pdu_t *) mesh_upper_transport_message_finalize(&builder); 515 mesh_upper_transport_setup_segmented_control_pdu_header(final_upper_pdu, netkey_index, ttl, src, dest, opcode); 516 pdu = (mesh_pdu_t *) final_upper_pdu; 517 } 518 mesh_upper_transport_send_control_pdu(pdu); 519 520 // check for all network pdus 521 int i; 522 for (i=0;i<count;i++){ 523 // expected network pdu 524 test_network_pdu_len = strlen(network_pdus[i]) / 2; 525 btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data); 526 527 #ifdef ENABLE_MESH_GATT_BEARER 528 expect_gatt_network_pdu(); 529 #endif 530 531 #ifdef ENABLE_MESH_ADV_BEARER 532 expect_adv_network_pdu(); 533 #endif 534 535 } 536 } 537 #if 1 538 // Message 1 539 char * message1_network_pdus[] = { 540 (char *) "68eca487516765b5e5bfdacbaf6cb7fb6bff871f035444ce83a670df" 541 }; 542 char * message1_lower_transport_pdus[] = { 543 (char *) "034b50057e400000010000", 544 }; 545 char * message1_upper_transport_pdu = (char *) "034b50057e400000010000"; 546 TEST(MessageTest, Message1Receive){ 547 load_network_key_nid_68(); 548 mesh_set_iv_index(0x12345678); 549 test_receive_network_pdus(1, message1_network_pdus, message1_lower_transport_pdus, message1_upper_transport_pdu); 550 } 551 TEST(MessageTest, Message1Send){ 552 uint16_t netkey_index = 0; 553 uint8_t ttl = 0; 554 uint16_t src = 0x1201; 555 uint16_t dest = 0xfffd; 556 uint32_t seq = 1; 557 load_network_key_nid_68(); 558 mesh_set_iv_index(0x12345678); 559 mesh_sequence_number_set(seq); 560 test_send_control_message(netkey_index, ttl, src, dest, message1_upper_transport_pdu, 1, message1_lower_transport_pdus, message1_network_pdus); 561 } 562 563 // Message 2 564 char * message2_network_pdus[] = { 565 (char *) "68d4c826296d7979d7dbc0c9b4d43eebec129d20a620d01e" 566 }; 567 char * message2_lower_transport_pdus[] = { 568 (char *) "04320308ba072f", 569 }; 570 char * message2_upper_transport_pdu = (char *) "04320308ba072f"; 571 TEST(MessageTest, Message2Receive){ 572 load_network_key_nid_68(); 573 mesh_set_iv_index(0x12345678); 574 test_receive_network_pdus(1, message2_network_pdus, message2_lower_transport_pdus, message2_upper_transport_pdu); 575 } 576 TEST(MessageTest, Message2Send){ 577 uint16_t netkey_index = 0; 578 uint8_t ttl = 0; 579 uint16_t src = 0x2345; 580 uint16_t dest = 0x1201; 581 uint32_t seq = 0x014820; 582 load_network_key_nid_68(); 583 mesh_set_iv_index(0x12345678); 584 mesh_sequence_number_set(seq); 585 test_send_control_message(netkey_index, ttl, src, dest, message2_upper_transport_pdu, 1, message2_lower_transport_pdus, message2_network_pdus); 586 } 587 588 // Message 3 589 char * message3_network_pdus[] = { 590 (char *) "68da062bc96df253273086b8c5ee00bdd9cfcc62a2ddf572" 591 }; 592 char * message3_lower_transport_pdus[] = { 593 (char *) "04fa0205a6000a", 594 }; 595 char * message3_upper_transport_pdu = (char *) "04fa0205a6000a"; 596 TEST(MessageTest, Message3Receive){ 597 load_network_key_nid_68(); 598 mesh_set_iv_index(0x12345678); 599 test_receive_network_pdus(1, message3_network_pdus, message3_lower_transport_pdus, message3_upper_transport_pdu); 600 } 601 TEST(MessageTest, Message3Send){ 602 uint16_t netkey_index = 0; 603 uint8_t ttl = 0; 604 uint16_t src = 0x2fe3; 605 uint16_t dest = 0x1201; 606 uint32_t seq = 0x2b3832; 607 load_network_key_nid_68(); 608 mesh_set_iv_index(0x12345678); 609 mesh_sequence_number_set(seq); 610 test_send_control_message(netkey_index, ttl, src, dest, message3_upper_transport_pdu, 1, message3_lower_transport_pdus, message3_network_pdus); 611 } 612 613 // Message 4 614 char * message4_network_pdus[] = { 615 (char *) "5e84eba092380fb0e5d0ad970d579a4e88051c" 616 }; 617 char * message4_lower_transport_pdus[] = { 618 (char *) "0100", 619 }; 620 char * message4_upper_transport_pdu = (char *) "0100"; 621 TEST(MessageTest, Message4Receive){ 622 load_network_key_nid_5e(); 623 mesh_set_iv_index(0x12345678); 624 test_receive_network_pdus(1, message4_network_pdus, message4_lower_transport_pdus, message4_upper_transport_pdu); 625 } 626 TEST(MessageTest, Message4Send){ 627 uint16_t netkey_index = 0; 628 uint8_t ttl = 0; 629 uint16_t src = 0x1201; 630 uint16_t dest = 0x2345; 631 uint32_t seq = 0x000002; 632 load_network_key_nid_5e(); 633 mesh_set_iv_index(0x12345678); 634 mesh_sequence_number_set(seq); 635 test_send_control_message(netkey_index, ttl, src, dest, message4_upper_transport_pdu, 1, message4_lower_transport_pdus, message4_network_pdus); 636 } 637 638 // Message 5 639 char * message5_network_pdus[] = { 640 (char *) "5eafd6f53c43db5c39da1792b1fee9ec74b786c56d3a9dee", 641 }; 642 char * message5_lower_transport_pdus[] = { 643 (char *) "02001234567800", 644 }; 645 char * message5_upper_transport_pdu = (char *) "02001234567800"; 646 TEST(MessageTest, Message5Receive){ 647 load_network_key_nid_5e(); 648 mesh_set_iv_index(0x12345678); 649 test_receive_network_pdus(1, message5_network_pdus, message5_lower_transport_pdus, message5_upper_transport_pdu); 650 } 651 TEST(MessageTest, Message5Send){ 652 uint16_t netkey_index = 0; 653 uint8_t ttl = 0; 654 uint16_t src = 0x2345; 655 uint16_t dest = 0x1201; 656 uint32_t seq = 0x014834; 657 load_network_key_nid_5e(); 658 mesh_set_iv_index(0x12345678); 659 mesh_sequence_number_set(seq); 660 test_send_control_message(netkey_index, ttl, src, dest, message5_upper_transport_pdu, 1, message5_lower_transport_pdus, message5_network_pdus); 661 } 662 663 // Message 6 664 char * message6_network_pdus[] = { 665 (char *) "68cab5c5348a230afba8c63d4e686364979deaf4fd40961145939cda0e", 666 (char *) "681615b5dd4a846cae0c032bf0746f44f1b8cc8ce5edc57e55beed49c0", 667 }; 668 char * message6_lower_transport_pdus[] = { 669 (char *) "8026ac01ee9dddfd2169326d23f3afdf", 670 (char *) "8026ac21cfdc18c52fdef772e0e17308", 671 }; 672 char * message6_upper_transport_pdu = (char *) "0056341263964771734fbd76e3b40519d1d94a48"; 673 TEST(MessageTest, Message6Receive){ 674 load_network_key_nid_68(); 675 mesh_set_iv_index(0x12345678); 676 test_receive_network_pdus(2, message6_network_pdus, message6_lower_transport_pdus, message6_upper_transport_pdu); 677 } 678 TEST(MessageTest, Message6Send){ 679 uint16_t netkey_index = 0; 680 uint16_t appkey_index = MESH_DEVICE_KEY_INDEX; 681 uint8_t ttl = 4; 682 uint16_t src = 0x0003; 683 uint16_t dest = 0x1201; 684 uint32_t seq = 0x3129ab; 685 uint8_t szmic = 0; 686 687 load_network_key_nid_68(); 688 mesh_set_iv_index(0x12345678); 689 mesh_sequence_number_set(seq); 690 test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message6_upper_transport_pdu, 2, message6_lower_transport_pdus, message6_network_pdus); 691 } 692 693 // Message 7 - ACK 694 char * message7_network_pdus[] = { 695 (char *) "68e476b5579c980d0d730f94d7f3509df987bb417eb7c05f", 696 }; 697 char * message7_lower_transport_pdus[] = { 698 (char *) "00a6ac00000002", 699 }; 700 char * message7_upper_transport_pdu = (char *) "00a6ac00000002"; 701 TEST(MessageTest, Message7Send){ 702 uint16_t netkey_index = 0; 703 uint8_t ttl = 0x0b; 704 uint16_t src = 0x2345; 705 uint16_t dest = 0x0003; 706 uint32_t seq = 0x014835; 707 708 load_network_key_nid_68(); 709 mesh_set_iv_index(0x12345678); 710 mesh_sequence_number_set(seq); 711 test_send_control_message(netkey_index, ttl, src, dest, message7_upper_transport_pdu, 1, message7_lower_transport_pdus, message7_network_pdus); 712 } 713 // ACK message, handled in mesh_transport - can be checked with test_control_receive_network_pdu 714 // TEST(MessageTest, Message7Receive){ 715 // mesh_set_iv_index(0x12345678); 716 // test_receive_network_pdus(1, message7_network_pdus, message7_lower_transport_pdus, message7_upper_transport_pdu); 717 // } 718 719 // Message 8 - ACK 720 char * message8_network_pdus[] = { 721 (char *) "684daa6267c2cf0e2f91add6f06e66006844cec97f973105ae2534f958", 722 }; 723 char * message8_lower_transport_pdus[] = { 724 (char *) "8026ac01ee9dddfd2169326d23f3afdf", 725 }; 726 char * message8_upper_transport_pdu = (char *) "8026ac01ee9dddfd2169326d23f3afdf"; 727 // ACK message, handled in mesh_transport - can be checked with test_control_receive_network_pdu 728 // TEST(MessageTest, Message8Receive){ 729 // mesh_set_iv_index(0x12345678); 730 // test_receive_network_pdus(1, message8_network_pdus, message8_lower_transport_pdus, message8_upper_transport_pdu); 731 // } 732 733 // Message 9 - ACK 734 735 // Message 10 736 char * message10_network_pdus[] = { 737 (char *) "5e7b786568759f7777ed355afaf66d899c1e3d", 738 }; 739 char * message10_lower_transport_pdus[] = { 740 (char *) "0101", 741 }; 742 char * message10_upper_transport_pdu = (char *) "0101"; 743 TEST(MessageTest, Message10Receive){ 744 load_network_key_nid_5e(); 745 mesh_set_iv_index(0x12345678); 746 test_receive_network_pdus(1, message10_network_pdus, message10_lower_transport_pdus, message10_upper_transport_pdu); 747 } 748 TEST(MessageTest, Message10Send){ 749 uint16_t netkey_index = 0; 750 uint8_t ttl = 0; 751 uint16_t src = 0x1201; 752 uint16_t dest = 0x2345; 753 uint32_t seq = 0x000003; 754 755 load_network_key_nid_5e(); 756 mesh_set_iv_index(0x12345678); 757 mesh_sequence_number_set(seq); 758 test_send_control_message(netkey_index, ttl, src, dest, message10_upper_transport_pdu, 1, message10_lower_transport_pdus, message10_network_pdus); 759 } 760 761 // Message 11 762 // The Friend node responds to this poll with the first segment of the stored message. It also indicates that it has more data. 763 764 // Message 12 765 char * message12_network_pdus[] = { 766 (char *) "5e8a18fc6e4d05ae21466087599c2426ce9a35", 767 }; 768 char * message12_lower_transport_pdus[] = { 769 (char *) "0101", 770 }; 771 char * message12_upper_transport_pdu = (char *) "0101"; 772 TEST(MessageTest, Message12Receive){ 773 load_network_key_nid_5e(); 774 mesh_set_iv_index(0x12345678); 775 test_receive_network_pdus(1, message12_network_pdus, message12_lower_transport_pdus, message12_upper_transport_pdu); 776 } 777 TEST(MessageTest, Message12Send){ 778 uint16_t netkey_index = 0; 779 uint8_t ttl = 0; 780 uint16_t src = 0x1201; 781 uint16_t dest = 0x2345; 782 uint32_t seq = 0x000004; 783 784 load_network_key_nid_5e(); 785 mesh_set_iv_index(0x12345678); 786 mesh_sequence_number_set(seq); 787 test_send_control_message(netkey_index, ttl, src, dest, message12_upper_transport_pdu, 1, message12_lower_transport_pdus, message12_network_pdus); 788 } 789 790 // Message 13 791 // The Friend node responds with the same message as last time. 792 // Message 14 793 // The Low Power node received the retransmitted stored message. As that message has the MD bit set 794 // it sends another Friend Poll to obtain the next message. 795 char * message14_network_pdus[] = { 796 (char *) "5e0bbaf92b5c8f7d3ae62a3c75dff683dce24e", 797 }; 798 char * message14_lower_transport_pdus[] = { 799 (char *) "0100", 800 }; 801 char * message14_upper_transport_pdu = (char *) "0100"; 802 TEST(MessageTest, Message14Receive){ 803 load_network_key_nid_5e(); 804 mesh_set_iv_index(0x12345678); 805 test_receive_network_pdus(1, message14_network_pdus, message14_lower_transport_pdus, message14_upper_transport_pdu); 806 } 807 TEST(MessageTest, Message14Send){ 808 uint16_t netkey_index = 0; 809 uint8_t ttl = 0; 810 uint16_t src = 0x1201; 811 uint16_t dest = 0x2345; 812 uint32_t seq = 0x000005; 813 814 load_network_key_nid_5e(); 815 mesh_set_iv_index(0x12345678); 816 mesh_sequence_number_set(seq); 817 test_send_control_message(netkey_index, ttl, src, dest, message14_upper_transport_pdu, 1, message14_lower_transport_pdus, message14_network_pdus); 818 } 819 820 // Message 15 821 // The Friend node responds, with the next message in the friend queue. The Friend node has no more data, so it sets the MD to 0. 822 char * message15_network_pdus[] = { 823 (char *) "5ea8dab50e7ee7f1d29805664d235eacd707217dedfe78497fefec7391", 824 }; 825 char * message15_lower_transport_pdus[] = { 826 (char *) "8026ac21cfdc18c52fdef772e0e17308", 827 }; 828 char * message15_upper_transport_pdu = (char *) "0100"; 829 // ACK message, handled in mesh_transport - can be checked with test_control_receive_network_pdu 830 // not sure - no upper access message 831 // TEST(MessageTest, Message15Receive){ 832 // load_network_key_nid_5e(); 833 // mesh_set_iv_index(0x12345678); 834 // test_receive_network_pdus(1, message15_network_pdus, message15_lower_transport_pdus, message15_upper_transport_pdu); 835 // } 836 837 // Message 16 838 char * message16_network_pdus[] = { 839 (char *) "68e80e5da5af0e6b9be7f5a642f2f98680e61c3a8b47f228", 840 }; 841 char * message16_lower_transport_pdus[] = { 842 (char *) "0089511bf1d1a81c11dcef", 843 }; 844 char * message16_upper_transport_pdu = (char *) "800300563412"; 845 TEST(MessageTest, Message16Receive){ 846 load_network_key_nid_68(); 847 mesh_set_iv_index(0x12345678); 848 test_receive_network_pdus(1, message16_network_pdus, message16_lower_transport_pdus, message16_upper_transport_pdu); 849 } 850 TEST(MessageTest, Message16Send){ 851 uint16_t netkey_index = 0; 852 uint16_t appkey_index = MESH_DEVICE_KEY_INDEX; 853 uint8_t ttl = 0x0b; 854 uint16_t src = 0x1201; 855 uint16_t dest = 0x0003; 856 uint32_t seq = 0x000006; 857 uint8_t szmic = 0; 858 859 load_network_key_nid_68(); 860 mesh_set_iv_index(0x12345678); 861 mesh_sequence_number_set(seq); 862 test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message16_upper_transport_pdu, 1, message16_lower_transport_pdus, message16_network_pdus); 863 } 864 865 // Message 17 866 // A Relay node receives the message from the Low Power node and relays it, decrementing the TTL value. 867 // Message 18 868 char * message18_network_pdus[] = { 869 (char *) "6848cba437860e5673728a627fb938535508e21a6baf57", 870 }; 871 char * message18_lower_transport_pdus[] = { 872 (char *) "665a8bde6d9106ea078a", 873 }; 874 char * message18_upper_transport_pdu = (char *) "0400000000"; 875 TEST(MessageTest, Message18Receive){ 876 load_network_key_nid_68(); 877 mesh_set_iv_index(0x12345678); 878 test_receive_network_pdus(1, message18_network_pdus, message18_lower_transport_pdus, message18_upper_transport_pdu); 879 } 880 TEST(MessageTest, Message18Send){ 881 uint16_t netkey_index = 0; 882 uint16_t appkey_index = 0; 883 uint8_t ttl = 3; 884 uint16_t src = 0x1201; 885 uint16_t dest = 0xffff; 886 uint32_t seq = 0x00007; 887 uint8_t szmic = 0; 888 889 load_network_key_nid_68(); 890 mesh_set_iv_index(0x12345678); 891 mesh_sequence_number_set(seq); 892 test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message18_upper_transport_pdu, 1, message18_lower_transport_pdus, message18_network_pdus); 893 } 894 895 896 // Message 19 897 // The Low Power node sends another Health Current Status message indicating that there are three faults: 898 // Battery Low Warning, Power Supply Interrupted Warning, and Supply Voltage Too Low Warning. 899 char * message19_network_pdus[] = { 900 (char *) "68110edeecd83c3010a05e1b23a926023da75d25ba91793736", 901 }; 902 char * message19_lower_transport_pdus[] = { 903 (char *) "66ca6cd88e698d1265f43fc5", 904 }; 905 char * message19_upper_transport_pdu = (char *) "04000000010703"; 906 TEST(MessageTest, Message19Receive){ 907 load_network_key_nid_68(); 908 mesh_set_iv_index(0x12345678); 909 test_receive_network_pdus(1, message19_network_pdus, message19_lower_transport_pdus, message19_upper_transport_pdu); 910 } 911 TEST(MessageTest, Message19Send){ 912 uint16_t netkey_index = 0; 913 uint16_t appkey_index = 0; 914 uint8_t ttl = 3; 915 uint16_t src = 0x1201; 916 uint16_t dest = 0xffff; 917 uint32_t seq = 0x00009; 918 uint8_t szmic = 0; 919 920 load_network_key_nid_68(); 921 mesh_set_iv_index(0x12345678); 922 mesh_sequence_number_set(seq); 923 test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message19_upper_transport_pdu, 1, message19_lower_transport_pdus, message19_network_pdus); 924 } 925 926 // Message 20 927 char * message20_network_pdus[] = { 928 (char *) "e85cca51e2e8998c3dc87344a16c787f6b08cc897c941a5368", 929 }; 930 char * message20_lower_transport_pdus[] = { 931 (char *) "669c9803e110fea929e9542d", 932 }; 933 char * message20_upper_transport_pdu = (char *) "04000000010703"; 934 TEST(MessageTest, Message20Receive){ 935 load_network_key_nid_68(); 936 mesh_set_iv_index(0x12345677); 937 test_receive_network_pdus(1, message20_network_pdus, message20_lower_transport_pdus, message20_upper_transport_pdu); 938 } 939 TEST(MessageTest, Message20Send){ 940 uint16_t netkey_index = 0; 941 uint16_t appkey_index = 0; 942 uint8_t ttl = 3; 943 uint16_t src = 0x1234; 944 uint16_t dest = 0xffff; 945 uint32_t seq = 0x070809; 946 uint8_t szmic = 0; 947 948 load_network_key_nid_68(); 949 mesh_set_iv_index(0x12345677); 950 mesh_sequence_number_set(seq); 951 test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message20_upper_transport_pdu, 1, message20_lower_transport_pdus, message20_network_pdus); 952 } 953 954 // Message 21 955 // The Low Power node sends a vendor command to a group address. 956 char * message21_network_pdus[] = { 957 (char *) "e84e8fbe003f58a4d61157bb76352ea6307eebfe0f30b83500e9", 958 }; 959 char * message21_lower_transport_pdus[] = { 960 (char *) "664d92e9dfcf3ab85b6e8fcf03", 961 }; 962 char * message21_upper_transport_pdu = (char *) "d50a0048656c6c6f"; 963 TEST(MessageTest, Message21Receive){ 964 load_network_key_nid_68(); 965 mesh_set_iv_index(0x12345677); 966 test_receive_network_pdus(1, message21_network_pdus, message21_lower_transport_pdus, message21_upper_transport_pdu); 967 } 968 TEST(MessageTest, Message21Send){ 969 uint16_t netkey_index = 0; 970 uint16_t appkey_index = 0; 971 uint8_t ttl = 3; 972 uint16_t src = 0x1234; 973 uint16_t dest = 0xc105; 974 uint32_t seq = 0x07080a; 975 uint8_t szmic = 0; 976 977 load_network_key_nid_68(); 978 mesh_set_iv_index(0x12345677); 979 mesh_sequence_number_set(seq); 980 test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message21_upper_transport_pdu, 1, message21_lower_transport_pdus, message21_network_pdus); 981 } 982 983 // Message 22 984 char * message22_network_pdus[] = { 985 (char *) "e8d85caecef1e3ed31f3fdcf88a411135fea55df730b6b28e255", 986 }; 987 char * message22_lower_transport_pdus[] = { 988 (char *) "663871b904d431526316ca48a0", 989 }; 990 char * message22_upper_transport_pdu = (char *) "d50a0048656c6c6f"; 991 char * message22_label_string = (char *) "0073e7e4d8b9440faf8415df4c56c0e1"; 992 993 TEST(MessageTest, Message22Receive){ 994 load_network_key_nid_68(); 995 mesh_set_iv_index(0x12345677); 996 uint8_t label_uuid[16]; 997 btstack_parse_hex(message22_label_string, 16, label_uuid); 998 mesh_virtual_address_register(label_uuid, 0xb529); 999 test_receive_network_pdus(1, message22_network_pdus, message22_lower_transport_pdus, message22_upper_transport_pdu); 1000 } 1001 1002 TEST(MessageTest, Message22Send){ 1003 uint16_t netkey_index = 0; 1004 uint16_t appkey_index = 0; 1005 uint8_t ttl = 3; 1006 uint16_t src = 0x1234; 1007 uint32_t seq = 0x07080b; 1008 uint8_t szmic = 0; 1009 1010 load_network_key_nid_68(); 1011 mesh_set_iv_index(0x12345677); 1012 mesh_sequence_number_set(seq); 1013 uint8_t label_uuid[16]; 1014 btstack_parse_hex(message22_label_string, 16, label_uuid); 1015 mesh_virtual_address_t * virtual_address = mesh_virtual_address_register(label_uuid, 0xb529); 1016 uint16_t pseudo_dst = virtual_address->pseudo_dst; 1017 test_send_access_message(netkey_index, appkey_index, ttl, src, pseudo_dst, szmic, message22_upper_transport_pdu, 1, message22_lower_transport_pdus, message22_network_pdus); 1018 } 1019 1020 // Message 23 1021 char * message23_network_pdus[] = { 1022 (char *) "e877a48dd5fe2d7a9d696d3dd16a75489696f0b70c711b881385", 1023 }; 1024 char * message23_lower_transport_pdus[] = { 1025 (char *) "662456db5e3100eef65daa7a38", 1026 }; 1027 char * message23_upper_transport_pdu = (char *) "d50a0048656c6c6f"; 1028 char * message23_label_string = (char *) "f4a002c7fb1e4ca0a469a021de0db875"; 1029 1030 TEST(MessageTest, Message23Receive){ 1031 load_network_key_nid_68(); 1032 mesh_set_iv_index(0x12345677); 1033 uint8_t label_uuid[16]; 1034 btstack_parse_hex(message23_label_string, 16, label_uuid); 1035 mesh_virtual_address_register(label_uuid, 0x9736); 1036 test_receive_network_pdus(1, message23_network_pdus, message23_lower_transport_pdus, message23_upper_transport_pdu); 1037 } 1038 TEST(MessageTest, Message23Send){ 1039 uint16_t netkey_index = 0; 1040 uint16_t appkey_index = 0; 1041 uint8_t ttl = 3; 1042 uint16_t src = 0x1234; 1043 uint32_t seq = 0x07080c; 1044 uint8_t szmic = 0; 1045 1046 load_network_key_nid_68(); 1047 mesh_set_iv_index(0x12345677); 1048 mesh_sequence_number_set(seq); 1049 uint8_t label_uuid[16]; 1050 btstack_parse_hex(message23_label_string, 16, label_uuid); 1051 mesh_virtual_address_t * virtual_address = mesh_virtual_address_register(label_uuid, 0x9736); 1052 uint16_t pseudo_dst = virtual_address->pseudo_dst; 1053 test_send_access_message(netkey_index, appkey_index, ttl, src, pseudo_dst, szmic, message23_upper_transport_pdu, 1, message23_lower_transport_pdus, message23_network_pdus); 1054 } 1055 #endif 1056 1057 // Message 24 1058 char * message24_network_pdus[] = { 1059 (char *) "e8624e65bb8c1794e998b4081f47a35251fdd3896d99e4db489b918599", 1060 (char *) "e8a7d0f0a2ea42dc2f4dd6fb4db33a6c088d023b47", 1061 }; 1062 char * message24_lower_transport_pdus[] = { 1063 (char *) "e6a03401c3c51d8e476b28e3aa5001f3", 1064 (char *) "e6a034211c01cea6", 1065 }; 1066 char * message24_upper_transport_pdu = (char *) "ea0a00576f726c64"; 1067 char * message24_label_string = (char *) "f4a002c7fb1e4ca0a469a021de0db875"; 1068 TEST(MessageTest, Message24Receive){ 1069 load_network_key_nid_68(); 1070 mesh_set_iv_index(0x12345677); 1071 uint8_t label_uuid[16]; 1072 btstack_parse_hex(message24_label_string, 16, label_uuid); 1073 mesh_virtual_address_register(label_uuid, 0x9736); 1074 test_receive_network_pdus(2, message24_network_pdus, message24_lower_transport_pdus, message24_upper_transport_pdu); 1075 } 1076 TEST(MessageTest, Message24Send){ 1077 uint16_t netkey_index = 0; 1078 uint16_t appkey_index = 0; 1079 uint8_t ttl = 3; 1080 uint16_t src = 0x1234; 1081 uint32_t seq = 0x07080d; 1082 uint8_t szmic = 1; 1083 1084 load_network_key_nid_68(); 1085 mesh_set_iv_index(0x12345677); 1086 mesh_sequence_number_set(seq); 1087 uint8_t label_uuid[16]; 1088 btstack_parse_hex(message24_label_string, 16, label_uuid); 1089 mesh_virtual_address_t * virtual_address = mesh_virtual_address_register(label_uuid, 0x9736); 1090 uint16_t pseudo_dst = virtual_address->pseudo_dst; 1091 test_send_access_message(netkey_index, appkey_index, ttl, src, pseudo_dst, szmic, message24_upper_transport_pdu, 2, message24_lower_transport_pdus, message24_network_pdus); 1092 } 1093 1094 // Proxy Configuration Test 1095 char * proxy_config_pdus[] = { 1096 (char *) "0210386bd60efbbb8b8c28512e792d3711f4b526", 1097 }; 1098 char * proxy_config_lower_transport_pdus[] = { 1099 (char *) "0000", 1100 }; 1101 char * proxy_config_upper_transport_pdu = (char *) "ea0a00576f726c64"; 1102 TEST(MessageTest, ProxyConfigReceive){ 1103 mesh_set_iv_index(0x12345678); 1104 load_network_key_nid_10(); 1105 int i = 0; 1106 char ** network_pdus = proxy_config_pdus; 1107 test_network_pdu_len = strlen(network_pdus[i]) / 2; 1108 btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data); 1109 mesh_network_process_proxy_configuration_message(&test_network_pdu_data[1], test_network_pdu_len-1); 1110 while (received_proxy_pdu == NULL) { 1111 mock_process_hci_cmd(); 1112 } 1113 char ** lower_transport_pdus = proxy_config_lower_transport_pdus; 1114 transport_pdu_len = strlen(lower_transport_pdus[i]) / 2; 1115 btstack_parse_hex(lower_transport_pdus[i], transport_pdu_len, transport_pdu_data); 1116 1117 uint8_t * lower_transport_pdu = mesh_network_pdu_data(received_proxy_pdu); 1118 uint8_t lower_transport_pdu_len = mesh_network_pdu_len(received_proxy_pdu); 1119 1120 // printf_hexdump(lower_transport_pdu, lower_transport_pdu_len); 1121 1122 CHECK_EQUAL( transport_pdu_len, lower_transport_pdu_len); 1123 CHECK_EQUAL_ARRAY(transport_pdu_data, lower_transport_pdu, transport_pdu_len); 1124 1125 // done 1126 mesh_network_message_processed_by_higher_layer(received_proxy_pdu); 1127 received_proxy_pdu = NULL; 1128 } 1129 1130 1131 TEST(MessageTest, ProxyConfigSend){ 1132 uint16_t netkey_index = 0; 1133 uint8_t ctl = 1; 1134 uint8_t ttl = 0; 1135 uint16_t src = 1; 1136 uint16_t dest = 0; 1137 uint32_t seq = 1; 1138 uint8_t nid = 0x10; 1139 mesh_set_iv_index(0x12345678); 1140 load_network_key_nid_10(); 1141 mesh_network_pdu_t * network_pdu = mesh_network_pdu_get(); 1142 uint8_t data[] = { 0 , 0 }; 1143 mesh_network_setup_pdu(network_pdu, netkey_index, nid, ctl, ttl, seq, src, dest, data, sizeof(data)); 1144 mesh_network_encrypt_proxy_configuration_message(network_pdu); 1145 while (received_proxy_pdu == NULL) { 1146 mock_process_hci_cmd(); 1147 } 1148 uint8_t * proxy_pdu_data = received_proxy_pdu->data; 1149 uint8_t proxy_pdu_len = received_proxy_pdu->len; 1150 1151 int i = 0; 1152 char ** network_pdus = proxy_config_pdus; 1153 transport_pdu_len = strlen(network_pdus[i]) / 2; 1154 btstack_parse_hex(network_pdus[i], transport_pdu_len, transport_pdu_data); 1155 1156 CHECK_EQUAL( transport_pdu_len-1, proxy_pdu_len); 1157 CHECK_EQUAL_ARRAY(transport_pdu_data+1, proxy_pdu_data, transport_pdu_len-1); 1158 1159 received_proxy_pdu = NULL; 1160 1161 mesh_network_pdu_free(network_pdu); 1162 } 1163 1164 static btstack_crypto_aes128_t crypto_request_aes128; 1165 static uint8_t plaintext[16]; 1166 static uint8_t identity_key[16]; 1167 static uint8_t hash[16]; 1168 static uint8_t random_value[8]; 1169 1170 static void mesh_proxy_handle_get_aes128(void * arg){ 1171 UNUSED(arg); 1172 uint8_t expected_hash[8]; 1173 uint8_t expected_random_value[8]; 1174 1175 btstack_parse_hex("00861765aefcc57b", 8, expected_hash); 1176 CHECK_EQUAL_ARRAY(&hash[8], expected_hash, 8); 1177 1178 btstack_parse_hex("34ae608fbbc1f2c6", 8, expected_random_value); 1179 CHECK_EQUAL_ARRAY(random_value, expected_random_value, 8); 1180 } 1181 1182 TEST(MessageTest, ServiceDataUsingNodeIdentityTest){ 1183 btstack_parse_hex("34ae608fbbc1f2c6", 8, random_value); 1184 memset(plaintext, 0, sizeof(plaintext)); 1185 memcpy(&plaintext[6] , random_value, 8); 1186 big_endian_store_16(plaintext, 14, 0x1201); 1187 // 84396c435ac48560b5965385253e210c 1188 btstack_parse_hex("84396c435ac48560b5965385253e210c", 16, identity_key); 1189 btstack_crypto_aes128_encrypt(&crypto_request_aes128, identity_key, plaintext, hash, mesh_proxy_handle_get_aes128, NULL); 1190 } 1191 1192 // Mesh v1.0, 8.2.1 1193 static btstack_crypto_aes128_cmac_t aes_cmac_request; 1194 static uint8_t k4_result[1]; 1195 static void handle_k4_result(void *arg){ 1196 UNUSED(arg); 1197 printf("ApplicationkeyIDTest: %02x\n", k4_result[0]); 1198 CHECK_EQUAL( 0x26, k4_result[0]); 1199 } 1200 TEST(MessageTest, ApplicationkeyIDTest){ 1201 static uint8_t application_key[16]; 1202 btstack_parse_hex("63964771734fbd76e3b40519d1d94a48", 16, application_key); 1203 mesh_k4(&aes_cmac_request, application_key, &k4_result[0], &handle_k4_result, NULL); 1204 } 1205 1206 int main (int argc, const char * argv[]){ 1207 return CommandLineTestRunner::RunAllTests(argc, argv); 1208 } 1209