2 * Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include "net_nfc_typedef_internal.h"
21 #include "net_nfc_debug_internal.h"
22 #include "net_nfc_util_defines.h"
23 #include "net_nfc_util_internal.h"
24 #include "net_nfc_util_ndef_record.h"
25 #include "net_nfc_util_ndef_message.h"
26 #include "net_nfc_util_handover.h"
28 typedef struct _search_index
35 static int __property_equal_to(gconstpointer key1, gconstpointer key2)
37 net_nfc_carrier_property_s *arg1 = (net_nfc_carrier_property_s *)key1;
38 net_nfc_carrier_property_s *arg2 = (net_nfc_carrier_property_s *)key2;
40 if (arg1->attribute < arg2->attribute)
44 else if (arg1->attribute > arg2->attribute)
54 static net_nfc_carrier_property_s *__find_property_by_attrubute(GList *list, uint16_t attribute)
57 net_nfc_carrier_property_s temp;
59 temp.attribute = attribute;
60 found = g_list_find_custom(list, &temp, __property_equal_to);
67 return (net_nfc_carrier_property_s *)found->data;
70 static void __find_nth_group(gpointer data, gpointer user_data)
72 net_nfc_carrier_property_s *info = (net_nfc_carrier_property_s *)data;
73 search_index *nth = (search_index *)user_data;
75 if (info == NULL || user_data == NULL)
80 if (nth->current == nth->target)
88 static void __free_all_data(gpointer data, gpointer user_data)
90 net_nfc_carrier_property_s *info = (net_nfc_carrier_property_s *)data;
97 DEBUG_MSG("FREE: group is found");
98 net_nfc_util_free_carrier_group((net_nfc_carrier_property_s *)info);
102 DEBUG_MSG("FREE: element is found ATTRIB:0x%X length:%d", info->attribute, info->length);
103 _net_nfc_util_free_mem(info->data);
104 _net_nfc_util_free_mem(info);
108 static net_nfc_error_e __net_nfc_util_create_connection_handover_collsion_resolution_record(ndef_record_s **record)
111 data_s typeName = { 0 };
112 data_s payload = { 0 };
113 uint8_t rand_buffer[2] = { 0, 0 };
117 return NET_NFC_NULL_PARAMETER;
119 state = (uint32_t)time(NULL);
120 random_num = (unsigned short)rand_r(&state);
122 typeName.buffer = (uint8_t *)COLLISION_DETECT_RECORD_TYPE;
123 typeName.length = strlen(COLLISION_DETECT_RECORD_TYPE);
125 rand_buffer[0] = (random_num & 0xff00) >> 8; // MSB
126 rand_buffer[1] = (random_num & 0x00ff); // LSB
128 payload.buffer = rand_buffer;
131 DEBUG_MSG("rand number = [0x%x] [0x%x] => [0x%x]", payload.buffer[0], payload.buffer[1], random_num);
133 return net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &typeName, NULL, &payload, record);
136 static int __net_nfc_get_size_of_attribute(int attribute)
140 case NET_NFC_BT_ATTRIBUTE_UUID16_PART :
141 case NET_NFC_BT_ATTRIBUTE_UUID16 :
142 case NET_NFC_BT_ATTRIBUTE_UUID32_PART :
143 case NET_NFC_BT_ATTRIBUTE_UUID32 :
144 case NET_NFC_BT_ATTRIBUTE_UUID128_PART :
145 case NET_NFC_BT_ATTRIBUTE_UUID128 :
146 case NET_NFC_BT_ATTRIBUTE_NAME_PART :
147 case NET_NFC_BT_ATTRIBUTE_NAME :
148 case NET_NFC_BT_ATTRIBUTE_TXPOWER :
149 case NET_NFC_BT_ATTRIBUTE_OOB_COD :
150 case NET_NFC_BT_ATTRIBUTE_OOB_HASH_C :
151 case NET_NFC_BT_ATTRIBUTE_OOB_HASH_R :
152 case NET_NFC_BT_ATTRIBUTE_ID :
153 case NET_NFC_BT_ATTRIBUTE_MANUFACTURER :
154 case NET_NFC_BT_ATTRIBUTE_ADDRESS :
155 // case NET_NFC_WIFI_ATTRIBUTE_VERSION2:
163 net_nfc_error_e net_nfc_util_create_carrier_config(net_nfc_carrier_config_s **config, net_nfc_conn_handover_carrier_type_e type)
167 return NET_NFC_NULL_PARAMETER;
170 if (type < 0 || type >= NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN)
172 return NET_NFC_OUT_OF_BOUND;
175 _net_nfc_util_alloc_mem(*config, sizeof(net_nfc_carrier_config_s));
178 return NET_NFC_ALLOC_FAIL;
181 (*config)->type = type;
182 (*config)->length = 0;
187 net_nfc_error_e net_nfc_util_add_carrier_config_property(net_nfc_carrier_config_s *config, uint16_t attribute, uint16_t size, uint8_t * data)
189 net_nfc_carrier_property_s *elem = NULL;
191 DEBUG_MSG("ADD property: [ATTRIB:0x%X, SIZE:%d]", attribute, size);
193 if (config == NULL || data == NULL)
195 return NET_NFC_NULL_PARAMETER;
198 if (__find_property_by_attrubute(config->data, attribute) != NULL)
200 return NET_NFC_ALREADY_REGISTERED;
203 _net_nfc_util_alloc_mem(elem, sizeof (net_nfc_carrier_property_s));
206 return NET_NFC_ALLOC_FAIL;
208 elem->attribute = attribute;
210 elem->is_group = false;
212 _net_nfc_util_alloc_mem(elem->data, size);
213 if (elem->data == NULL)
215 _net_nfc_util_free_mem(elem);
216 return NET_NFC_ALLOC_FAIL;
218 memcpy(elem->data, data, size);
220 config->data = g_list_append(config->data, elem);
221 config->length += size + 2 * __net_nfc_get_size_of_attribute(attribute);
223 DEBUG_MSG("ADD completed total length %d", config->length);
228 net_nfc_error_e net_nfc_util_remove_carrier_config_property(net_nfc_carrier_config_s *config, uint16_t attribute)
230 net_nfc_carrier_property_s *elem = NULL;
234 return NET_NFC_NULL_PARAMETER;
237 elem = __find_property_by_attrubute(config->data, attribute);
240 return NET_NFC_NO_DATA_FOUND;
243 config->data = g_list_remove(config->data, elem);
244 config->length -= (elem->length + 2 * __net_nfc_get_size_of_attribute(attribute));
248 net_nfc_util_free_carrier_group((net_nfc_carrier_property_s *)elem);
252 _net_nfc_util_free_mem(elem->data);
253 _net_nfc_util_free_mem(elem);
259 net_nfc_error_e net_nfc_util_get_carrier_config_property(
260 net_nfc_carrier_config_s *config, uint16_t attribute, uint16_t *size, uint8_t **data)
262 net_nfc_carrier_property_s *elem = NULL;
264 if (config == NULL || size == NULL || data == NULL)
265 return NET_NFC_NULL_PARAMETER;
267 elem = __find_property_by_attrubute(config->data, attribute);
272 return NET_NFC_NO_DATA_FOUND;
275 *size = elem->length;
284 net_nfc_error_e net_nfc_util_append_carrier_config_group(
285 net_nfc_carrier_config_s *config, net_nfc_carrier_property_s *group)
287 if (config == NULL || group == NULL)
288 return NET_NFC_NULL_PARAMETER;
290 if (g_list_find(config->data, group) != NULL)
291 return NET_NFC_ALREADY_REGISTERED;
293 config->data = g_list_append(config->data, group);
294 config->length += group->length;
299 net_nfc_error_e net_nfc_util_remove_carrier_config_group(net_nfc_carrier_config_s *config, net_nfc_carrier_property_s *group)
301 if (config == NULL || group == NULL)
303 return NET_NFC_NULL_PARAMETER;
306 if (g_list_find(config->data, group) != NULL)
308 return NET_NFC_NO_DATA_FOUND;
311 config->length -= group->length;
312 config->data = g_list_remove(config->data, group);
314 net_nfc_util_free_carrier_group((net_nfc_carrier_property_s *)group);
319 net_nfc_error_e net_nfc_util_get_carrier_config_group(net_nfc_carrier_config_s *config, int index, net_nfc_carrier_property_s **group)
323 if (config == NULL || group == NULL)
325 return NET_NFC_NULL_PARAMETER;
330 return NET_NFC_OUT_OF_BOUND;
334 result.target = index;
337 g_list_foreach(config->data, __find_nth_group, &result);
339 if (result.found == NULL)
341 return NET_NFC_NO_DATA_FOUND;
343 *group = (net_nfc_carrier_property_s *)result.found;
348 net_nfc_error_e net_nfc_util_free_carrier_config(net_nfc_carrier_config_s *config)
352 return NET_NFC_NULL_PARAMETER;
355 g_list_foreach(config->data, __free_all_data, NULL);
356 g_list_free(config->data);
358 _net_nfc_util_free_mem(config);
363 net_nfc_error_e net_nfc_util_create_carrier_config_group(net_nfc_carrier_property_s **group, uint16_t attribute)
367 return NET_NFC_NULL_PARAMETER;
370 _net_nfc_util_alloc_mem(*group, sizeof(net_nfc_carrier_property_s));
373 return NET_NFC_ALLOC_FAIL;
376 (*group)->attribute = attribute;
377 (*group)->is_group = true;
382 net_nfc_error_e net_nfc_util_add_carrier_config_group_property(net_nfc_carrier_property_s *group, uint16_t attribute, uint16_t size, uint8_t *data)
384 net_nfc_carrier_property_s *elem = NULL;
386 DEBUG_MSG("ADD group property: [ATTRIB:0x%X, SIZE:%d]", attribute, size);
388 if (group == NULL || data == NULL)
390 return NET_NFC_NULL_PARAMETER;
393 if (__find_property_by_attrubute((GList *)group->data, attribute) != NULL)
395 return NET_NFC_ALREADY_REGISTERED;
398 _net_nfc_util_alloc_mem(elem, sizeof (net_nfc_carrier_property_s));
401 return NET_NFC_ALLOC_FAIL;
403 elem->attribute = attribute;
405 elem->is_group = false;
407 _net_nfc_util_alloc_mem(elem->data, size);
408 if (elem->data == NULL)
410 _net_nfc_util_free_mem(elem);
411 return NET_NFC_ALLOC_FAIL;
413 memcpy(elem->data, data, size);
414 group->length += size + 2 * __net_nfc_get_size_of_attribute(attribute);
415 group->data = g_list_append((GList *)(group->data), elem);
417 DEBUG_MSG("ADD group completed total length %d", group->length);
422 net_nfc_error_e net_nfc_util_get_carrier_config_group_property(net_nfc_carrier_property_s *group, uint16_t attribute, uint16_t *size, uint8_t ** data)
424 net_nfc_carrier_property_s *elem = NULL;
426 if (group == NULL || size == NULL || data == NULL)
428 return NET_NFC_NULL_PARAMETER;
431 elem = __find_property_by_attrubute((GList*)(group->data), attribute);
436 return NET_NFC_NO_DATA_FOUND;
439 *size = elem->length;
445 net_nfc_error_e net_nfc_util_remove_carrier_config_group_property(net_nfc_carrier_property_s *group, uint16_t attribute)
447 net_nfc_carrier_property_s *elem = NULL;
451 return NET_NFC_NULL_PARAMETER;
454 elem = __find_property_by_attrubute((GList*)(group->data), attribute);
457 return NET_NFC_NO_DATA_FOUND;
459 group->length -= elem->length;
460 group->data = g_list_remove((GList*)(group->data), elem);
462 _net_nfc_util_free_mem(elem->data);
463 _net_nfc_util_free_mem(elem);
469 net_nfc_error_e net_nfc_util_free_carrier_group(net_nfc_carrier_property_s *group)
473 return NET_NFC_NULL_PARAMETER;
475 g_list_foreach((GList*)(group->data), __free_all_data, NULL);
476 g_list_free((GList*)(group->data));
478 _net_nfc_util_free_mem(group);
483 static void __make_serial_wifi(gpointer data, gpointer user_data)
485 net_nfc_carrier_property_s *info = (net_nfc_carrier_property_s *)data;
486 data_s *payload = user_data;
490 if (info == NULL || user_data == NULL)
493 current = payload->buffer + payload->length;
494 inc = __net_nfc_get_size_of_attribute(info->attribute);
498 DEBUG_MSG("[WIFI]Found Group make recursive");
499 *(uint16_t *)current = info->attribute;
500 *(uint16_t *)(current + inc) = info->length;
501 payload->length += (inc + inc);
502 g_list_foreach((GList *)info->data, __make_serial_wifi, payload);
506 DEBUG_MSG("[WIFI]Element is found attrib:0x%X length:%d current:%d", info->attribute, info->length, payload->length);
507 *(uint16_t *)current = info->attribute;
508 *(uint16_t *)(current + inc) = info->length;
509 memcpy(current + inc + inc, info->data, info->length);
510 payload->length += (inc + inc + info->length);
514 static void __make_serial_bt(gpointer data, gpointer user_data)
516 net_nfc_carrier_property_s *info = (net_nfc_carrier_property_s *)data;
517 data_s *payload = user_data;
521 if (info == NULL || user_data == NULL)
524 current = payload->buffer + payload->length; /* payload->length is zero */
528 DEBUG_MSG("[BT]Found Group. call recursive");
529 g_list_foreach((GList *)info->data, __make_serial_bt, payload);
533 if (info->attribute != NET_NFC_BT_ATTRIBUTE_ADDRESS)
535 DEBUG_MSG("[BT]Element is found attrib:0x%X length:%d current:%d", info->attribute, info->length, payload->length);
536 inc = __net_nfc_get_size_of_attribute(info->attribute);
537 *current = info->length + 1;
538 *(current + inc) = info->attribute;
539 memcpy(current + inc + inc, info->data, info->length);
540 payload->length += (inc + inc + info->length);
544 DEBUG_MSG("[BT]BT address is found length:%d", info->length);
545 memcpy(current, info->data, info->length);
546 payload->length += (info->length);
551 net_nfc_error_e net_nfc_util_create_ndef_record_with_carrier_config(ndef_record_s **record, net_nfc_carrier_config_s *config)
553 data_s payload = { NULL, 0 };
554 data_s record_type = { NULL, 0 };
556 if (record == NULL || config == NULL)
558 return NET_NFC_NULL_PARAMETER;
561 _net_nfc_util_alloc_mem(payload.buffer, config->length);
562 if (payload.buffer == NULL)
564 return NET_NFC_ALLOC_FAIL;
566 payload.length = 0; /* this should be zero because this will be used as current position of data written */
568 if (config->type == NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS)
570 record_type.buffer = (uint8_t *)CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME;
571 record_type.length = strlen(CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME);
572 g_list_foreach(config->data, __make_serial_wifi, &payload);
574 else if (config->type == NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS)
576 record_type.buffer = (uint8_t *)CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME;
577 record_type.length = strlen(CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME);
578 g_list_foreach(config->data, __make_serial_wifi, &payload);
580 else if (config->type == NET_NFC_CONN_HANDOVER_CARRIER_BT)
582 record_type.buffer = (uint8_t *)CONN_HANDOVER_BT_CARRIER_MIME_NAME;
583 record_type.length = strlen(CONN_HANDOVER_BT_CARRIER_MIME_NAME);
584 payload.buffer += 2; /* OOB total length */
585 g_list_foreach(config->data, __make_serial_bt, &payload);
586 payload.buffer -= 2; /* return to original */
588 payload.buffer[0] = payload.length & 0xFF;
589 payload.buffer[1] = (payload.length >> 8) & 0xFF;
593 return NET_NFC_NOT_SUPPORTED;
596 DEBUG_MSG("payload length = %d", payload.length);
598 return net_nfc_util_create_record(NET_NFC_RECORD_MIME_TYPE, &record_type, NULL, &payload, record);
601 static net_nfc_error_e __net_nfc_get_list_from_serial_for_wifi(GList **list, uint8_t *data, uint32_t length)
603 uint8_t *current = data;
604 uint8_t *last = current + length;
606 while (current < last)
608 net_nfc_carrier_property_s *elem = NULL;
609 _net_nfc_util_alloc_mem(elem, sizeof(net_nfc_carrier_property_s));
612 return NET_NFC_ALLOC_FAIL;
614 elem->attribute = current[0]<<8|current[1];
615 elem->length = current[2]<<8|current[3];
617 if (elem->attribute == NET_NFC_WIFI_ATTRIBUTE_CREDENTIAL)
619 __net_nfc_get_list_from_serial_for_wifi(list, (current + 4), elem->length);
620 elem->is_group = true;
624 _net_nfc_util_alloc_mem(elem->data, elem->length);
625 if (elem->data == NULL)
627 _net_nfc_util_free_mem(elem);
628 return NET_NFC_ALLOC_FAIL;
630 memcpy(elem->data, (current + 4), elem->length);
631 elem->is_group = false;
633 *list = g_list_append(*list, elem);
634 current += (4 + elem->length);
640 net_nfc_error_e __net_nfc_get_list_from_serial_for_bt(GList **list, uint8_t *data, uint32_t length)
642 net_nfc_carrier_property_s *elem = NULL;
643 uint8_t *current = data;
644 uint8_t *last = NULL;
646 current += 2; /* remove oob data length two bytes length*/
649 _net_nfc_util_alloc_mem(elem, sizeof(net_nfc_carrier_property_s));
652 return NET_NFC_ALLOC_FAIL;
654 elem->attribute = (uint16_t)NET_NFC_BT_ATTRIBUTE_ADDRESS;
655 elem->length = 6; /* BT address length is always 6 */
657 _net_nfc_util_alloc_mem(elem->data, elem->length);
658 if (elem->data == NULL)
660 _net_nfc_util_free_mem(elem);
661 return NET_NFC_ALLOC_FAIL;
663 memcpy(elem->data, current, elem->length);
664 elem->is_group = false;
666 current += 6; /* BT address length is always 6 */
667 length -= 6; /* substracted by 6 (Address length)*/
668 *list = g_list_append(*list, elem);
670 last = current + length;
672 while (current < last)
674 _net_nfc_util_alloc_mem(elem, sizeof(net_nfc_carrier_property_s));
677 return NET_NFC_ALLOC_FAIL;
679 elem->length = *((uint8_t *)current) - 1;
680 elem->attribute = *((uint8_t *)(++current));
682 _net_nfc_util_alloc_mem(elem->data, elem->length);
683 if (elem->data == NULL)
685 _net_nfc_util_free_mem(elem);
686 return NET_NFC_ALLOC_FAIL;
688 memcpy(elem->data, (++current), elem->length);
689 elem->is_group = false;
691 current += elem->length;
692 *list = g_list_append(*list, elem);
698 net_nfc_error_e net_nfc_util_create_carrier_config_from_config_record(net_nfc_carrier_config_s **config, ndef_record_s *record)
700 net_nfc_error_e result = NET_NFC_OK;
701 net_nfc_conn_handover_carrier_type_e type;
703 if (record == NULL || config == NULL)
705 return NET_NFC_NULL_PARAMETER;
708 if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME, record->type_s.length) == 0)
710 type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS;
712 else if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME, record->type_s.length) == 0)
714 type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS;
716 else if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_BT_CARRIER_MIME_NAME, record->type_s.length) == 0)
718 type = NET_NFC_CONN_HANDOVER_CARRIER_BT;
722 DEBUG_MSG("Record type is not config type");
723 return NET_NFC_INVALID_FORMAT;
726 result = net_nfc_util_create_carrier_config(config, type);
729 return NET_NFC_ALLOC_FAIL;
732 switch ((*config)->type)
734 case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS :
735 case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS :
736 result = __net_nfc_get_list_from_serial_for_wifi((GList **)&((*config)->data), record->payload_s.buffer, record->payload_s.length);
738 case NET_NFC_CONN_HANDOVER_CARRIER_BT :
739 result = __net_nfc_get_list_from_serial_for_bt((GList **)&((*config)->data), record->payload_s.buffer, record->payload_s.length);
741 case NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN :
742 result = NET_NFC_NOT_SUPPORTED;
746 if (result != NET_NFC_OK)
748 net_nfc_util_free_carrier_config((net_nfc_carrier_config_s *)*config);
754 net_nfc_error_e net_nfc_util_create_handover_request_message(ndef_message_s **message)
756 ndef_message_s *inner_message = NULL;
757 net_nfc_error_e error;
758 ndef_record_s *record = NULL;
759 data_s type = { NULL, 0 };
760 data_s payload = { NULL, 0 };
765 return NET_NFC_NULL_PARAMETER;
768 error = net_nfc_util_create_ndef_message(message);
769 if (error != NET_NFC_OK)
774 error = net_nfc_util_create_ndef_message(&inner_message);
775 if (error != NET_NFC_OK)
777 net_nfc_util_free_ndef_message(*message);
783 __net_nfc_util_create_connection_handover_collsion_resolution_record(&record);
784 net_nfc_util_append_record(inner_message, record);
786 size = net_nfc_util_get_ndef_message_length(inner_message) + 1;
787 _net_nfc_util_alloc_mem(payload.buffer, size);
788 if (payload.buffer == NULL)
790 net_nfc_util_free_ndef_message(inner_message);
791 net_nfc_util_free_ndef_message(*message);
794 return NET_NFC_ALLOC_FAIL;
796 payload.length = size;
798 uint8_t version = CH_VERSION;
800 (payload.buffer)[0] = version;
804 error = net_nfc_util_convert_ndef_message_to_rawdata(inner_message, &payload);
805 if (error != NET_NFC_OK)
807 _net_nfc_util_free_mem(payload.buffer);
808 net_nfc_util_free_ndef_message(inner_message);
809 net_nfc_util_free_ndef_message(*message);
815 net_nfc_util_free_ndef_message(inner_message);
819 type.buffer = (uint8_t *)CH_REQ_RECORD_TYPE;
820 type.length = strlen(CH_REQ_RECORD_TYPE);
822 net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, &record);
823 net_nfc_util_append_record(*message, record);
825 _net_nfc_util_free_mem(payload.buffer);
830 net_nfc_error_e net_nfc_util_create_handover_select_message(ndef_message_s **message)
832 net_nfc_error_e error = NET_NFC_OK;
833 ndef_record_s *record = NULL;
834 data_s type = { NULL, 0 };
835 data_s payload = { NULL, 0 };
839 return NET_NFC_NULL_PARAMETER;
842 error = net_nfc_util_create_ndef_message(message);
843 if (error != NET_NFC_OK)
848 _net_nfc_util_alloc_mem(payload.buffer, 1);
849 if (payload.buffer == NULL)
851 net_nfc_util_free_ndef_message(*message);
852 return NET_NFC_ALLOC_FAIL;
854 payload.length = (uint32_t)1;
856 (payload.buffer)[0] = CH_VERSION;
858 type.buffer = (uint8_t*)CH_SEL_RECORD_TYPE;
859 type.length = strlen(CH_SEL_RECORD_TYPE);
861 net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, &record);
862 net_nfc_util_append_record(*message, record);
864 _net_nfc_util_free_mem(payload.buffer);
869 net_nfc_error_e net_nfc_util_create_handover_error_record(ndef_record_s **record, uint8_t reason, uint32_t data)
888 _net_nfc_util_alloc_mem(payload.buffer, size);
889 if (payload.buffer == NULL)
891 return NET_NFC_ALLOC_FAIL;
893 payload.length = size;
895 type.buffer = (uint8_t *)ERROR_RECORD_TYPE;
896 type.length = strlen(ERROR_RECORD_TYPE);
898 net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, (ndef_record_s **)record);
900 _net_nfc_util_free_mem(payload.buffer);
905 /* inner_msg should be freed after using */
907 static net_nfc_error_e __net_nfc_get_inner_message(ndef_message_s *message, ndef_message_s *inner_msg)
909 net_nfc_error_e error;
910 ndef_record_s *inner_record = NULL;
912 if (message == NULL || inner_msg == NULL)
914 return NET_NFC_NULL_PARAMETER;
917 inner_record = message->records;
918 if (inner_record == NULL)
920 // This message is not connection handover message
921 return NET_NFC_INVALID_FORMAT;
924 if (strncmp((char*)(inner_record->type_s.buffer), CH_REQ_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0
925 && strncmp((char*)(inner_record->type_s.buffer), CH_SEL_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0)
927 // This message is not connection handover message
928 return NET_NFC_INVALID_FORMAT;
931 if (inner_record->payload_s.length > 1)
933 /* There is Alternative Carrier Record or Collision Res. Rec. */
934 (inner_record->payload_s.buffer)++; /* version */
935 (inner_record->payload_s.length)--;
936 error = net_nfc_util_convert_rawdata_to_ndef_message(&(inner_record->payload_s), inner_msg);
937 (inner_record->payload_s.buffer)--;
938 (inner_record->payload_s.length)++;
942 error = NET_NFC_NO_DATA_FOUND;
948 static net_nfc_error_e __net_nfc_replace_inner_message(ndef_message_s *message, ndef_message_s *inner_msg)
950 net_nfc_error_e error;
951 ndef_record_s *inner_record = NULL;
953 if (message == NULL || inner_msg == NULL)
955 return NET_NFC_NULL_PARAMETER;
958 inner_record = message->records;
959 if (inner_record == NULL)
961 // This message is not connection handover message
962 DEBUG_ERR_MSG("inner_record == NULL");
963 return NET_NFC_INVALID_FORMAT;
966 if (strncmp((char *)(inner_record->type_s.buffer), CH_REQ_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0
967 && strncmp((char *)(inner_record->type_s.buffer), CH_SEL_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0)
969 // This message is not connection handover message
970 DEBUG_ERR_MSG("unknown type [%s]", inner_record->type_s.buffer);
971 return NET_NFC_INVALID_FORMAT;
974 if (inner_record->payload_s.length >= 1)
976 /* There is Alternative Carrier Record or Collision Res. Rec. */
977 data_s tdata = { NULL, 0 };
980 inner_length = net_nfc_util_get_ndef_message_length(inner_msg);
982 _net_nfc_util_alloc_mem(tdata.buffer, inner_length + 1);
983 if (tdata.buffer == NULL)
985 return NET_NFC_ALLOC_FAIL;
989 tdata.length = inner_length;
990 error = net_nfc_util_convert_ndef_message_to_rawdata(inner_msg, &tdata);
991 if (error == NET_NFC_OK)
995 (tdata.buffer)[0] = (inner_record->payload_s.buffer)[0];
996 _net_nfc_util_free_mem(inner_record->payload_s.buffer);
997 inner_record->payload_s.buffer = tdata.buffer;
998 inner_record->payload_s.length = tdata.length;
1002 DEBUG_ERR_MSG("net_nfc_util_convert_ndef_message_to_rawdata failed [%d]", error);
1003 _net_nfc_util_free_mem(tdata.buffer);
1008 DEBUG_ERR_MSG("inner_record->payload_s.length(%d) < 1 ", inner_record->payload_s.length);
1009 error = NET_NFC_INVALID_FORMAT;
1015 net_nfc_error_e net_nfc_util_append_carrier_config_record(ndef_message_s *message, ndef_record_s *record, net_nfc_conn_handover_carrier_state_e power_status)
1017 ndef_message_s *inner_msg = NULL;
1018 ndef_record_s *carrier_rec = NULL;
1019 data_s payload = { NULL, 0 };
1020 data_s type = { NULL, 0 };
1021 int config_ref_count = 0;
1022 net_nfc_error_e error;
1023 uint8_t buffer[256] = { 0, };
1030 if (message == NULL || record == NULL)
1032 return NET_NFC_NULL_PARAMETER;
1035 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1037 DEBUG_ERR_MSG("net_nfc_util_create_ndef_message failed [%d]", error);
1042 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1045 ndef_record_s *last_rec = inner_msg->records;
1047 for (; idx < inner_msg->recordCount; idx++)
1049 last_rec = last_rec->next;
1052 if (strncmp((char *)last_rec->type_s.buffer, COLLISION_DETECT_RECORD_TYPE, (size_t)last_rec->type_s.length) == 0)
1054 config_ref_count = 0;
1056 else if (strncmp((char *)last_rec->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)last_rec->type_s.length) == 0)
1058 memcpy(buffer, last_rec->payload_s.buffer, last_rec->payload_s.length);
1059 config_ref_count = last_rec->payload_s.buffer[1];
1064 /* selector record type can include empty inner message. so that case, we will continue */
1065 if (message->records != NULL &&
1066 memcmp((char *)message->records->type_s.buffer, CH_SEL_RECORD_TYPE, (size_t)message->records->type_s.length) != 0)
1068 DEBUG_ERR_MSG("ERROR [%d]", error);
1070 net_nfc_util_free_ndef_message(inner_msg);
1076 type.buffer = (uint8_t *)ALTERNATIVE_RECORD_TYPE;
1077 type.length = strlen(ALTERNATIVE_RECORD_TYPE);
1081 // id = '0' + config_ref_count;
1085 buffer[offset++] = (uint8_t)(power_status & 0x3); /* first byte, power status */
1087 /* carrier data ref. len */
1088 buffer[offset++] = config_ref_count;
1090 /* carrier data ref. */
1091 offset += (config_ref_count - 1);
1092 buffer[offset++] = id;
1095 /* aux data ref. len */
1096 buffer[offset++] = 0;
1098 /* carrier data ref. */
1099 for (i = 0; i < 0; i++)
1101 buffer[offset++] = 0;
1104 payload.buffer = buffer;
1105 payload.length = offset;
1107 error = net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, &carrier_rec);
1108 if (error != NET_NFC_OK)
1110 DEBUG_ERR_MSG("net_nfc_util_create_record failed [%d]", error);
1112 net_nfc_util_free_ndef_message(inner_msg);
1117 error = net_nfc_util_append_record(inner_msg, carrier_rec);
1118 if (error != NET_NFC_OK)
1120 DEBUG_ERR_MSG("net_nfc_util_create_record failed [%d]", error);
1122 net_nfc_util_free_record(carrier_rec);
1123 net_nfc_util_free_ndef_message(inner_msg);
1128 error = __net_nfc_replace_inner_message(message, inner_msg);
1129 net_nfc_util_free_ndef_message(inner_msg);
1130 if (error != NET_NFC_OK)
1132 DEBUG_ERR_MSG("__net_nfc_replace_inner_message failed [%d]", error);
1137 /* set record id to record that will be appended to ndef message */
1138 error = net_nfc_util_set_record_id((ndef_record_s *)record, &id, sizeof(id));
1139 if (error != NET_NFC_OK)
1141 DEBUG_ERR_MSG("net_nfc_util_set_record_id failed [%d]", error);
1146 error = net_nfc_util_append_record(message, (ndef_record_s *)record);
1147 if (error != NET_NFC_OK)
1149 DEBUG_ERR_MSG("net_nfc_util_append_record failed [%d]", error);
1157 net_nfc_error_e net_nfc_util_remove_carrier_config_record(ndef_message_s *message, ndef_record_s *record)
1159 ndef_message_s *inner_msg = NULL;
1162 net_nfc_error_e error;
1163 ndef_record_s *current = NULL;
1164 ndef_record_s *record_priv = (ndef_record_s *)record;
1166 if (message == NULL || record == NULL)
1168 return NET_NFC_NULL_PARAMETER;
1171 current = message->records;
1173 for (idx = 0; idx < message->recordCount; idx++)
1175 if (current == record)
1179 current = current->next;
1182 if (current == NULL || idx == message->recordCount)
1184 DEBUG_MSG("The reference is not found in config records");
1186 return NET_NFC_NO_DATA_FOUND;
1190 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1192 DEBUG_MSG("net_nfc_util_create_ndef_message failed [%d]", error);
1197 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1199 current = inner_msg->records;
1201 for (idx = 0; idx < inner_msg->recordCount; idx++, current = current->next)
1203 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1205 if ((uint32_t)(current->payload_s.buffer[1]) == record_priv->id_s.length &&
1206 strncmp((char *)(current->payload_s.buffer + 2), (char*)(record_priv->id_s.buffer), (size_t)current->payload_s.buffer[1]) == 0)
1208 // comparing the instance
1214 if (current == NULL || idx == message->recordCount)
1216 DEBUG_MSG("The reference is not found in inner message");
1218 error = NET_NFC_NO_DATA_FOUND;
1222 net_nfc_util_remove_record_by_index(inner_msg, idx);
1223 __net_nfc_replace_inner_message(message, inner_msg);
1225 // remove the record only if the inner record is found.
1226 net_nfc_util_remove_record_by_index(message, saved_idx);
1230 net_nfc_util_free_ndef_message(inner_msg);
1235 net_nfc_error_e net_nfc_util_get_carrier_config_record(ndef_message_s *message, int index, ndef_record_s** record)
1237 ndef_message_s *inner_msg = NULL;
1239 net_nfc_error_e error;
1240 ndef_record_s *current = NULL;
1242 int current_idx = 0;
1244 if (message == NULL || record == NULL)
1246 return NET_NFC_NULL_PARAMETER;
1249 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1251 DEBUG_MSG("net_nfc_util_create_ndef_message failed [%d]", error);
1256 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1258 current = inner_msg->records;
1259 for (idx = 0; idx < inner_msg->recordCount; idx++)
1261 if (strncmp((char*)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1263 if (current_idx == index)
1267 current = current->next;
1270 if (current == NULL || idx == message->recordCount)
1272 DEBUG_MSG("The reference is not found in inner message");
1274 error = NET_NFC_NO_DATA_FOUND;
1278 id.buffer = (current->payload_s.buffer) + 2;
1279 id.length = current->payload_s.buffer[1];
1281 error = net_nfc_util_search_record_by_id(message, &id, record);
1285 net_nfc_util_free_ndef_message(inner_msg);
1290 net_nfc_error_e net_nfc_util_get_handover_random_number(ndef_message_s *message, unsigned short *random_number)
1292 net_nfc_error_e error;
1293 ndef_message_s *inner_msg = NULL;
1294 ndef_record_s *cr_record = NULL;
1296 if (message == NULL)
1298 return NET_NFC_NULL_PARAMETER;
1301 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1303 DEBUG_MSG("net_nfc_util_create_ndef_message failed [%d]", error);
1308 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1310 cr_record = inner_msg->records;
1311 if (strncmp((char*)cr_record->type_s.buffer, COLLISION_DETECT_RECORD_TYPE, (size_t)cr_record->type_s.length) != 0
1312 || cr_record->payload_s.length < 2)
1314 DEBUG_MSG("There is no Collision resolution record");
1316 error = NET_NFC_INVALID_FORMAT;
1320 *random_number = ((unsigned short)cr_record->payload_s.buffer[0] << 8) | (unsigned short)(cr_record->payload_s.buffer[1]);
1324 net_nfc_util_free_ndef_message(inner_msg);
1329 net_nfc_error_e net_nfc_util_get_alternative_carrier_record_count(ndef_message_s *message, unsigned int *count)
1331 net_nfc_error_e error;
1332 ndef_message_s *inner_msg = NULL;
1333 ndef_record_s *current = NULL;
1336 if (message == NULL || count == 0)
1338 return NET_NFC_NULL_PARAMETER;
1341 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1343 DEBUG_MSG("net_nfc_util_create_ndef_message failed [%d]", error);
1350 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1352 current = inner_msg->records;
1353 for (idx = 0; idx < inner_msg->recordCount; idx++)
1355 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1359 current = current->next;
1363 net_nfc_util_free_ndef_message(inner_msg);
1368 net_nfc_error_e net_nfc_util_get_alternative_carrier_power_status(ndef_message_s *message, int index, net_nfc_conn_handover_carrier_state_e *power_state)
1370 net_nfc_error_e error;
1371 ndef_message_s *inner_msg = NULL;
1372 ndef_record_s *current = NULL;
1376 if (message == NULL)
1378 return NET_NFC_NULL_PARAMETER;
1383 return NET_NFC_OUT_OF_BOUND;
1386 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1388 DEBUG_MSG("net_nfc_util_create_ndef_message failed [%d]", error);
1393 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1395 error = NET_NFC_OUT_OF_BOUND;
1396 current = inner_msg->records;
1397 for (idx = 0; idx < inner_msg->recordCount; idx++)
1399 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1401 if (idx_count == index)
1403 *power_state = current->payload_s.buffer[0] & 0x3;
1409 current = current->next;
1413 net_nfc_util_free_ndef_message(inner_msg);
1418 net_nfc_error_e net_nfc_util_set_alternative_carrier_power_status(ndef_message_s *message, int index, net_nfc_conn_handover_carrier_state_e power_status)
1420 net_nfc_error_e error;
1421 ndef_message_s *inner_msg = NULL;
1423 if (message == NULL)
1425 return NET_NFC_NULL_PARAMETER;
1429 return NET_NFC_OUT_OF_BOUND;
1432 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1434 DEBUG_MSG("net_nfc_util_create_ndef_message failed [%d]", error);
1439 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1443 ndef_record_s *current = inner_msg->records;
1445 error = NET_NFC_OUT_OF_BOUND;
1446 for (idx = 0; idx < inner_msg->recordCount; idx++, current = current->next)
1448 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1450 if (idx_count == index)
1452 current->payload_s.buffer[0] = (power_status & 0x3) | (current->payload_s.buffer[0] & 0xFC);
1454 __net_nfc_replace_inner_message(message, inner_msg);
1463 net_nfc_util_free_ndef_message(inner_msg);
1468 net_nfc_error_e net_nfc_util_get_alternative_carrier_type_from_record(ndef_record_s *record, net_nfc_conn_handover_carrier_type_e *type)
1470 if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_BT_CARRIER_MIME_NAME, (size_t)record->type_s.length) == 0)
1472 *type = NET_NFC_CONN_HANDOVER_CARRIER_BT;
1474 else if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME, (size_t)record->type_s.length) == 0)
1476 *type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS;
1478 else if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME, (size_t)record->type_s.length) == 0)
1480 *type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS;
1484 *type = NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
1490 net_nfc_error_e net_nfc_util_get_alternative_carrier_type(ndef_message_s *message, int index, net_nfc_conn_handover_carrier_type_e *type)
1492 ndef_record_s *record = NULL;
1493 net_nfc_error_e error;
1495 error = net_nfc_util_get_carrier_config_record(message, index, (ndef_record_s **)&record);
1496 if (error != NET_NFC_OK)
1501 return net_nfc_util_get_alternative_carrier_type_from_record(record, type);
1504 net_nfc_error_e net_nfc_util_get_selector_power_status(ndef_message_s *message, net_nfc_conn_handover_carrier_state_e *power_state)
1506 net_nfc_error_e error;
1507 ndef_message_s *inner_msg = NULL;
1508 ndef_record_s *current = NULL;
1510 net_nfc_conn_handover_carrier_state_e selector_state = NET_NFC_CONN_HANDOVER_CARRIER_INACTIVATE;
1512 if (message == NULL)
1514 return NET_NFC_NULL_PARAMETER;
1517 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) == NET_NFC_OK)
1519 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1521 if (inner_msg->recordCount > 1)
1523 current = inner_msg->records;
1524 for (idx = 0; idx < inner_msg->recordCount; idx++)
1526 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1528 if (((current->payload_s.buffer[0] & 0x3) == NET_NFC_CONN_HANDOVER_CARRIER_ACTIVATE) || ((current->payload_s.buffer[0] & 0x3) == NET_NFC_CONN_HANDOVER_CARRIER_ACTIVATING))
1530 selector_state = NET_NFC_CONN_HANDOVER_CARRIER_ACTIVATE;
1534 current = current->next;
1539 /* always activate when ac is only one */
1540 selector_state = NET_NFC_CONN_HANDOVER_CARRIER_ACTIVATE;
1543 *power_state = selector_state;
1547 DEBUG_ERR_MSG("_net_nfc_util_create_ndef_message failed [%d]", error);
1550 net_nfc_util_free_ndef_message(inner_msg);
1554 DEBUG_ERR_MSG("_net_nfc_util_create_ndef_message failed [%d]", error);
1555 error = NET_NFC_ALLOC_FAIL;