xref: /btstack/test/mesh/mesh_message_test.cpp (revision 6f6f8b16b187b6f853cd67c766447d952356c78d)
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