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 void net_nfc_convert_byte_order(unsigned char *array, int size)
38 unsigned char tmp_char;
40 for ( i = 0; i < size/2; i++)
43 array[i] = array[size-1-i];
44 array[size-1-i] = tmp_char;
49 static int __property_equal_to(gconstpointer key1, gconstpointer key2)
51 const net_nfc_carrier_property_s *arg1 = key1;
52 const net_nfc_carrier_property_s *arg2 = key2;
54 if (arg1->attribute < arg2->attribute)
56 else if (arg1->attribute > arg2->attribute)
62 static net_nfc_carrier_property_s *__find_property_by_attrubute(GList *list,
66 net_nfc_carrier_property_s temp;
68 temp.attribute = attribute;
69 found = g_list_find_custom(list, &temp, __property_equal_to);
74 return (net_nfc_carrier_property_s *)found->data;
77 static void __find_nth_group(gpointer data, gpointer user_data)
79 search_index *nth = user_data;
80 net_nfc_carrier_property_s *info = data;
83 RET_IF(NULL == user_data);
87 if (nth->current == nth->target)
94 static void __free_all_data(gpointer data, gpointer user_data)
96 net_nfc_carrier_property_s *info = data;
102 NFC_DBG("FREE: group is found");
103 net_nfc_util_free_carrier_group(info);
107 NFC_DBG("FREE: element is found ATTRIB:0x%X length:%d",
108 info->attribute, info->length);
109 _net_nfc_util_free_mem(info->data);
110 _net_nfc_util_free_mem(info);
114 static net_nfc_error_e
115 __net_nfc_util_create_connection_handover_collsion_resolution_record(
116 ndef_record_s **record)
121 data_s payload = { 0 };
122 data_s typeName = { 0 };
123 uint8_t rand_buffer[2] = { 0, 0 };
125 RETV_IF(NULL == record, NET_NFC_NULL_PARAMETER);
127 state = (uint32_t)time(NULL);
128 random_num = (unsigned short)rand_r(&state);
130 typeName.buffer = (uint8_t *)COLLISION_DETECT_RECORD_TYPE;
131 typeName.length = strlen(COLLISION_DETECT_RECORD_TYPE);
133 rand_buffer[0] = (random_num & 0xff00) >> 8; // MSB
134 rand_buffer[1] = (random_num & 0x00ff); // LSB
136 payload.buffer = rand_buffer;
139 NFC_DBG("rand number = [0x%x] [0x%x] => [0x%x]",
140 payload.buffer[0], payload.buffer[1], random_num);
142 return net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE,
143 &typeName, NULL, &payload, record);
146 static int __net_nfc_get_size_of_attribute(int attribute)
150 case NET_NFC_BT_ATTRIBUTE_UUID16_PART :
151 case NET_NFC_BT_ATTRIBUTE_UUID16 :
152 case NET_NFC_BT_ATTRIBUTE_UUID32_PART :
153 case NET_NFC_BT_ATTRIBUTE_UUID32 :
154 case NET_NFC_BT_ATTRIBUTE_UUID128_PART :
155 case NET_NFC_BT_ATTRIBUTE_UUID128 :
156 case NET_NFC_BT_ATTRIBUTE_NAME_PART :
157 case NET_NFC_BT_ATTRIBUTE_NAME :
158 case NET_NFC_BT_ATTRIBUTE_TXPOWER :
159 case NET_NFC_BT_ATTRIBUTE_OOB_COD :
160 case NET_NFC_BT_ATTRIBUTE_OOB_HASH_C :
161 case NET_NFC_BT_ATTRIBUTE_OOB_HASH_R :
162 case NET_NFC_BT_ATTRIBUTE_ID :
163 case NET_NFC_BT_ATTRIBUTE_MANUFACTURER :
164 case NET_NFC_BT_ATTRIBUTE_ADDRESS :
165 // case NET_NFC_WIFI_ATTRIBUTE_VERSION2:
173 net_nfc_error_e net_nfc_util_create_carrier_config(
174 net_nfc_carrier_config_s **config, net_nfc_conn_handover_carrier_type_e type)
176 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
177 RETV_IF(type < 0, NET_NFC_OUT_OF_BOUND);
178 RETV_IF(type >= NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN, NET_NFC_OUT_OF_BOUND);
180 _net_nfc_util_alloc_mem(*config, sizeof(net_nfc_carrier_config_s));
182 return NET_NFC_ALLOC_FAIL;
184 (*config)->type = type;
185 (*config)->length = 0;
190 net_nfc_error_e net_nfc_util_add_carrier_config_property(
191 net_nfc_carrier_config_s *config, uint16_t attribute, uint16_t size, uint8_t *data)
193 net_nfc_carrier_property_s *elem = NULL;
195 NFC_DBG("ADD property: [ATTRIB:0x%X, SIZE:%d]", attribute, size);
197 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
198 RETV_IF(NULL == data, NET_NFC_NULL_PARAMETER);
200 if (__find_property_by_attrubute(config->data, attribute) != NULL)
201 return NET_NFC_ALREADY_REGISTERED;
203 _net_nfc_util_alloc_mem(elem, sizeof (net_nfc_carrier_property_s));
205 return NET_NFC_ALLOC_FAIL;
207 elem->attribute = attribute;
209 elem->is_group = false;
211 _net_nfc_util_alloc_mem(elem->data, size);
212 if (NULL == elem->data)
214 _net_nfc_util_free_mem(elem);
215 return NET_NFC_ALLOC_FAIL;
217 memcpy(elem->data, data, size);
219 config->data = g_list_append(config->data, elem);
220 config->length += size + 2 * __net_nfc_get_size_of_attribute(attribute);
222 NFC_DBG("ADD completed total length %d", config->length);
227 net_nfc_error_e net_nfc_util_remove_carrier_config_property(
228 net_nfc_carrier_config_s *config, uint16_t attribute)
230 net_nfc_carrier_property_s *elem = NULL;
232 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
234 elem = __find_property_by_attrubute(config->data, attribute);
236 return NET_NFC_NO_DATA_FOUND;
238 config->data = g_list_remove(config->data, elem);
239 config->length -= (elem->length + 2 * __net_nfc_get_size_of_attribute(attribute));
243 net_nfc_util_free_carrier_group(elem);
247 _net_nfc_util_free_mem(elem->data);
248 _net_nfc_util_free_mem(elem);
254 net_nfc_error_e net_nfc_util_get_carrier_config_property(
255 net_nfc_carrier_config_s *config,
260 net_nfc_carrier_property_s *elem = NULL;
262 RETV_IF(NULL == size, NET_NFC_NULL_PARAMETER);
263 RETV_IF(NULL == data, NET_NFC_NULL_PARAMETER);
264 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
266 elem = __find_property_by_attrubute(config->data, attribute);
271 return NET_NFC_NO_DATA_FOUND;
274 *size = elem->length;
283 net_nfc_error_e net_nfc_util_append_carrier_config_group(
284 net_nfc_carrier_config_s *config, net_nfc_carrier_property_s *group)
286 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
287 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
289 if (g_list_find(config->data, group) != NULL)
290 return NET_NFC_ALREADY_REGISTERED;
292 config->data = g_list_append(config->data, group);
293 config->length += group->length+4;
298 net_nfc_error_e net_nfc_util_remove_carrier_config_group(
299 net_nfc_carrier_config_s *config, net_nfc_carrier_property_s *group)
301 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
302 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
304 if (g_list_find(config->data, group) != NULL)
305 return NET_NFC_NO_DATA_FOUND;
307 config->length -= group->length;
308 config->data = g_list_remove(config->data, group);
310 net_nfc_util_free_carrier_group(group);
315 net_nfc_error_e net_nfc_util_get_carrier_config_group(
316 net_nfc_carrier_config_s *config, int index, net_nfc_carrier_property_s **group)
320 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
321 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
322 RETV_IF(index < 0, NET_NFC_OUT_OF_BOUND);
325 result.target = index;
328 g_list_foreach(config->data, __find_nth_group, &result);
330 if (NULL == result.found)
331 return NET_NFC_NO_DATA_FOUND;
333 *group = (net_nfc_carrier_property_s *)result.found;
338 net_nfc_error_e net_nfc_util_free_carrier_config(net_nfc_carrier_config_s *config)
340 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
342 g_list_foreach(config->data, __free_all_data, NULL);
343 g_list_free(config->data);
345 _net_nfc_util_free_mem(config);
350 net_nfc_error_e net_nfc_util_create_carrier_config_group(
351 net_nfc_carrier_property_s **group, uint16_t attribute)
353 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
355 _net_nfc_util_alloc_mem(*group, sizeof(net_nfc_carrier_property_s));
357 return NET_NFC_ALLOC_FAIL;
359 (*group)->attribute = attribute;
360 (*group)->is_group = true;
365 net_nfc_error_e net_nfc_util_add_carrier_config_group_property(
366 net_nfc_carrier_property_s *group, uint16_t attribute, uint16_t size, uint8_t *data)
368 net_nfc_carrier_property_s *elem = NULL;
370 NFC_DBG("ADD group property: [ATTRIB:0x%X, SIZE:%d]", attribute, size);
372 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
373 RETV_IF(NULL == data, NET_NFC_NULL_PARAMETER);
375 if (__find_property_by_attrubute((GList *)group->data, attribute) != NULL)
376 return NET_NFC_ALREADY_REGISTERED;
378 _net_nfc_util_alloc_mem(elem, sizeof (net_nfc_carrier_property_s));
380 return NET_NFC_ALLOC_FAIL;
382 elem->attribute = attribute;
384 elem->is_group = false;
386 _net_nfc_util_alloc_mem(elem->data, size);
387 if (NULL == elem->data)
389 _net_nfc_util_free_mem(elem);
390 return NET_NFC_ALLOC_FAIL;
392 memcpy(elem->data, data, size);
393 group->length += size + 2 * __net_nfc_get_size_of_attribute(attribute);
394 group->data = g_list_append((GList *)(group->data), elem);
396 NFC_DBG("ADD group completed total length %d", group->length);
401 net_nfc_error_e net_nfc_util_get_carrier_config_group_property(
402 net_nfc_carrier_property_s *group,
407 net_nfc_carrier_property_s *elem = NULL;
409 RETV_IF(NULL == size, NET_NFC_NULL_PARAMETER);
410 RETV_IF(NULL == data, NET_NFC_NULL_PARAMETER);
411 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
413 elem = __find_property_by_attrubute((GList*)(group->data), attribute);
418 return NET_NFC_NO_DATA_FOUND;
421 *size = elem->length;
427 net_nfc_error_e net_nfc_util_remove_carrier_config_group_property(
428 net_nfc_carrier_property_s *group, uint16_t attribute)
430 net_nfc_carrier_property_s *elem = NULL;
432 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
434 elem = __find_property_by_attrubute((GList*)(group->data), attribute);
436 return NET_NFC_NO_DATA_FOUND;
438 group->length -= elem->length;
439 group->data = g_list_remove((GList*)(group->data), elem);
441 _net_nfc_util_free_mem(elem->data);
442 _net_nfc_util_free_mem(elem);
448 net_nfc_error_e net_nfc_util_free_carrier_group(net_nfc_carrier_property_s *group)
450 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
452 g_list_foreach((GList*)(group->data), __free_all_data, NULL);
453 g_list_free((GList*)(group->data));
455 _net_nfc_util_free_mem(group);
460 static void __make_serial_wifi(gpointer data, gpointer user_data)
464 data_s *payload = user_data;
465 net_nfc_carrier_property_s *info = data;
467 RET_IF(NULL == info);
468 RET_IF(NULL == user_data);
470 current = payload->buffer + payload->length;
471 inc = __net_nfc_get_size_of_attribute(info->attribute);
475 NFC_DBG("[WIFI]Found Group make recursive");
476 *(uint16_t *)current = info->attribute;
477 net_nfc_convert_byte_order(current,2);
478 *(uint16_t *)(current + inc) = info->length;
479 net_nfc_convert_byte_order((current + inc),2);
480 payload->length += (inc + inc);
481 g_list_foreach((GList *)info->data, __make_serial_wifi, payload);
485 NFC_DBG("[WIFI]Element is found attrib:0x%X length:%d current:%d",
486 info->attribute, info->length, payload->length);
487 *(uint16_t *)current = info->attribute;
488 net_nfc_convert_byte_order(current,2);
489 *(uint16_t *)(current + inc) = info->length;
490 net_nfc_convert_byte_order((current + inc),2);
491 memcpy(current + inc + inc, info->data, info->length);
492 payload->length += (inc + inc + info->length);
496 static void __make_serial_bt(gpointer data, gpointer user_data)
500 data_s *payload = user_data;
501 net_nfc_carrier_property_s *info = data;
503 RET_IF(NULL == info);
504 RET_IF(NULL == user_data);
506 current = payload->buffer + payload->length; /* payload->length is zero */
510 NFC_DBG("[BT]Found Group. call recursive");
511 g_list_foreach((GList *)info->data, __make_serial_bt, payload);
515 if (info->attribute != NET_NFC_BT_ATTRIBUTE_ADDRESS)
517 NFC_DBG("[BT]Element is found attrib:0x%X length:%d current:%d",
518 info->attribute, info->length, payload->length);
519 inc = __net_nfc_get_size_of_attribute(info->attribute);
520 *current = info->length + 1;
521 *(current + inc) = info->attribute;
522 memcpy(current + inc + inc, info->data, info->length);
523 payload->length += (inc + inc + info->length);
527 NFC_DBG("[BT]BT address is found length:%d", info->length);
528 memcpy(current, info->data, info->length);
529 payload->length += (info->length);
534 net_nfc_error_e net_nfc_util_create_ndef_record_with_carrier_config(
535 ndef_record_s **record, net_nfc_carrier_config_s *config)
537 data_s payload = { NULL, 0 };
538 data_s record_type = { NULL, 0 };
540 RETV_IF(NULL == record, NET_NFC_NULL_PARAMETER);
541 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
543 _net_nfc_util_alloc_mem(payload.buffer, config->length);
544 if (NULL == payload.buffer)
545 return NET_NFC_ALLOC_FAIL;
547 payload.length = 0; /* this should be zero because this will be used as current position of data written */
549 if (NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS == config->type)
551 record_type.buffer = (uint8_t *)CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME;
552 record_type.length = strlen(CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME);
553 g_list_foreach(config->data, __make_serial_wifi, &payload);
555 else if (NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS == config->type)
557 record_type.buffer = (uint8_t *)CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME;
558 record_type.length = strlen(CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME);
559 g_list_foreach(config->data, __make_serial_wifi, &payload);
561 else if (NET_NFC_CONN_HANDOVER_CARRIER_BT == config->type)
563 record_type.buffer = (uint8_t *)CONN_HANDOVER_BT_CARRIER_MIME_NAME;
564 record_type.length = strlen(CONN_HANDOVER_BT_CARRIER_MIME_NAME);
565 payload.buffer += 2; /* OOB total length */
566 g_list_foreach(config->data, __make_serial_bt, &payload);
567 payload.buffer -= 2; /* return to original */
569 payload.buffer[0] = payload.length & 0xFF;
570 payload.buffer[1] = (payload.length >> 8) & 0xFF;
574 return NET_NFC_NOT_SUPPORTED;
577 NFC_DBG("payload length = %d", payload.length);
579 return net_nfc_util_create_record(NET_NFC_RECORD_MIME_TYPE, &record_type, NULL,
583 static net_nfc_error_e __net_nfc_get_list_from_serial_for_wifi(
584 GList **list, uint8_t *data, uint32_t length)
586 uint8_t *current = data;
587 uint8_t *last = current + length;
589 while (current < last)
591 net_nfc_carrier_property_s *elem = NULL;
592 _net_nfc_util_alloc_mem(elem, sizeof(net_nfc_carrier_property_s));
594 return NET_NFC_ALLOC_FAIL;
596 elem->attribute = current[0]<<8|current[1];
597 elem->length = current[2]<<8|current[3];
599 if (elem->attribute == NET_NFC_WIFI_ATTRIBUTE_CREDENTIAL)
601 __net_nfc_get_list_from_serial_for_wifi(list, (current + 4), elem->length);
602 elem->is_group = true;
606 _net_nfc_util_alloc_mem(elem->data, elem->length);
607 if (NULL == elem->data)
609 _net_nfc_util_free_mem(elem);
610 return NET_NFC_ALLOC_FAIL;
612 memcpy(elem->data, (current + 4), elem->length);
613 elem->is_group = false;
615 *list = g_list_append(*list, elem);
616 current += (4 + elem->length);
622 net_nfc_error_e __net_nfc_get_list_from_serial_for_bt(GList **list, uint8_t *data, uint32_t length)
624 uint8_t *last = NULL;
625 uint8_t *current = data;
626 net_nfc_carrier_property_s *elem = NULL;
628 current += 2; /* remove oob data length two bytes length*/
631 _net_nfc_util_alloc_mem(elem, sizeof(net_nfc_carrier_property_s));
633 return NET_NFC_ALLOC_FAIL;
635 elem->attribute = (uint16_t)NET_NFC_BT_ATTRIBUTE_ADDRESS;
636 elem->length = 6; /* BT address length is always 6 */
638 _net_nfc_util_alloc_mem(elem->data, elem->length);
639 if (NULL == elem->data)
641 _net_nfc_util_free_mem(elem);
642 return NET_NFC_ALLOC_FAIL;
644 memcpy(elem->data, current, elem->length);
645 elem->is_group = false;
647 current += 6; /* BT address length is always 6 */
648 length -= 6; /* substracted by 6 (Address length)*/
649 *list = g_list_append(*list, elem);
651 last = current + length;
653 while (current < last)
655 _net_nfc_util_alloc_mem(elem, sizeof(net_nfc_carrier_property_s));
657 return NET_NFC_ALLOC_FAIL;
659 elem->length = *((uint8_t *)current) - 1;
660 elem->attribute = *((uint8_t *)(++current));
662 _net_nfc_util_alloc_mem(elem->data, elem->length);
663 if (NULL == elem->data)
665 _net_nfc_util_free_mem(elem);
666 return NET_NFC_ALLOC_FAIL;
668 memcpy(elem->data, (++current), elem->length);
669 elem->is_group = false;
671 current += elem->length;
672 *list = g_list_append(*list, elem);
678 net_nfc_error_e net_nfc_util_create_carrier_config_from_config_record(
679 net_nfc_carrier_config_s **config, ndef_record_s *record)
681 net_nfc_error_e result = NET_NFC_OK;
682 net_nfc_conn_handover_carrier_type_e type;
684 if (record == NULL || config == NULL)
686 return NET_NFC_NULL_PARAMETER;
689 if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME, record->type_s.length) == 0)
691 type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS;
693 else if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME, record->type_s.length) == 0)
695 type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS;
697 else if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_BT_CARRIER_MIME_NAME, record->type_s.length) == 0)
699 type = NET_NFC_CONN_HANDOVER_CARRIER_BT;
703 NFC_DBG("Record type is not config type");
704 return NET_NFC_INVALID_FORMAT;
707 result = net_nfc_util_create_carrier_config(config, type);
710 return NET_NFC_ALLOC_FAIL;
713 switch ((*config)->type)
715 case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS :
716 case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS :
717 result = __net_nfc_get_list_from_serial_for_wifi((GList **)&((*config)->data), record->payload_s.buffer, record->payload_s.length);
719 case NET_NFC_CONN_HANDOVER_CARRIER_BT :
720 result = __net_nfc_get_list_from_serial_for_bt((GList **)&((*config)->data), record->payload_s.buffer, record->payload_s.length);
722 case NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN :
723 result = NET_NFC_NOT_SUPPORTED;
727 if (result != NET_NFC_OK)
729 net_nfc_util_free_carrier_config((net_nfc_carrier_config_s *)*config);
735 net_nfc_error_e net_nfc_util_create_handover_request_message(ndef_message_s **message)
737 ndef_message_s *inner_message = NULL;
738 net_nfc_error_e error;
739 ndef_record_s *record = NULL;
740 data_s type = { NULL, 0 };
741 data_s payload = { NULL, 0 };
746 return NET_NFC_NULL_PARAMETER;
749 error = net_nfc_util_create_ndef_message(message);
750 if (error != NET_NFC_OK)
755 error = net_nfc_util_create_ndef_message(&inner_message);
756 if (error != NET_NFC_OK)
758 net_nfc_util_free_ndef_message(*message);
764 __net_nfc_util_create_connection_handover_collsion_resolution_record(&record);
765 net_nfc_util_append_record(inner_message, record);
767 size = net_nfc_util_get_ndef_message_length(inner_message) + 1;
768 _net_nfc_util_alloc_mem(payload.buffer, size);
769 if (payload.buffer == NULL)
771 net_nfc_util_free_ndef_message(inner_message);
772 net_nfc_util_free_ndef_message(*message);
775 return NET_NFC_ALLOC_FAIL;
777 payload.length = size;
779 uint8_t version = CH_VERSION;
781 (payload.buffer)[0] = version;
785 error = net_nfc_util_convert_ndef_message_to_rawdata(inner_message, &payload);
786 if (error != NET_NFC_OK)
788 _net_nfc_util_free_mem(payload.buffer);
789 net_nfc_util_free_ndef_message(inner_message);
790 net_nfc_util_free_ndef_message(*message);
796 net_nfc_util_free_ndef_message(inner_message);
800 type.buffer = (uint8_t *)CH_REQ_RECORD_TYPE;
801 type.length = strlen(CH_REQ_RECORD_TYPE);
803 net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, &record);
804 net_nfc_util_append_record(*message, record);
806 _net_nfc_util_free_mem(payload.buffer);
811 net_nfc_error_e net_nfc_util_create_handover_select_message(ndef_message_s **message)
813 net_nfc_error_e error = NET_NFC_OK;
814 ndef_record_s *record = NULL;
815 data_s type = { NULL, 0 };
816 data_s payload = { NULL, 0 };
820 return NET_NFC_NULL_PARAMETER;
823 error = net_nfc_util_create_ndef_message(message);
824 if (error != NET_NFC_OK)
829 _net_nfc_util_alloc_mem(payload.buffer, 1);
830 if (payload.buffer == NULL)
832 net_nfc_util_free_ndef_message(*message);
833 return NET_NFC_ALLOC_FAIL;
835 payload.length = (uint32_t)1;
837 (payload.buffer)[0] = CH_VERSION;
839 type.buffer = (uint8_t*)CH_SEL_RECORD_TYPE;
840 type.length = strlen(CH_SEL_RECORD_TYPE);
842 net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, &record);
843 net_nfc_util_append_record(*message, record);
845 _net_nfc_util_free_mem(payload.buffer);
850 net_nfc_error_e net_nfc_util_create_handover_carrier_record(ndef_record_s ** record)
852 data_s payload = {NULL,0};
854 data_s type = { NULL, 0 };
855 uint8_t *buffer_ptr = NULL;
857 _net_nfc_util_alloc_mem(payload.buffer,26);//hardcoded as of now
858 if (payload.buffer == NULL)
859 return NET_NFC_ALLOC_FAIL;
861 buffer_ptr = payload.buffer;
864 buffer_ptr[0]= NET_NFC_RECORD_MIME_TYPE;
866 //copy the MIME type length
867 buffer_ptr[1] = strlen(CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME);
870 memcpy(&buffer_ptr[2],CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME,(payload.buffer)[1]);
871 payload.buffer[25] = '\0';
874 type.buffer = (uint8_t *)CH_CAR_RECORD_TYPE;
875 type.length = strlen(CH_CAR_RECORD_TYPE);
877 net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE,
881 (ndef_record_s **)record);
883 _net_nfc_util_free_mem(payload.buffer);
887 net_nfc_error_e net_nfc_util_create_handover_error_record(ndef_record_s **record, uint8_t reason, uint32_t data)
906 _net_nfc_util_alloc_mem(payload.buffer, size);
907 if (payload.buffer == NULL)
909 return NET_NFC_ALLOC_FAIL;
911 payload.length = size;
913 type.buffer = (uint8_t *)ERROR_RECORD_TYPE;
914 type.length = strlen(ERROR_RECORD_TYPE);
916 net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, (ndef_record_s **)record);
918 _net_nfc_util_free_mem(payload.buffer);
923 /* inner_msg should be freed after using */
925 static net_nfc_error_e __net_nfc_get_inner_message(ndef_message_s *message, ndef_message_s *inner_msg)
927 net_nfc_error_e error;
928 ndef_record_s *inner_record = NULL;
930 if (message == NULL || inner_msg == NULL)
932 return NET_NFC_NULL_PARAMETER;
935 inner_record = message->records;
936 if (inner_record == NULL)
938 // This message is not connection handover message
939 return NET_NFC_INVALID_FORMAT;
942 if (strncmp((char*)(inner_record->type_s.buffer), CH_REQ_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0
943 && strncmp((char*)(inner_record->type_s.buffer), CH_SEL_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0)
945 // This message is not connection handover message
946 return NET_NFC_INVALID_FORMAT;
949 if (inner_record->payload_s.length > 1)
951 /* There is Alternative Carrier Record or Collision Res. Rec. */
952 (inner_record->payload_s.buffer)++; /* version */
953 (inner_record->payload_s.length)--;
954 error = net_nfc_util_convert_rawdata_to_ndef_message(&(inner_record->payload_s), inner_msg);
955 (inner_record->payload_s.buffer)--;
956 (inner_record->payload_s.length)++;
960 error = NET_NFC_NO_DATA_FOUND;
966 static net_nfc_error_e __net_nfc_replace_inner_message(ndef_message_s *message, ndef_message_s *inner_msg)
968 net_nfc_error_e error;
969 ndef_record_s *inner_record = NULL;
971 if (message == NULL || inner_msg == NULL)
973 return NET_NFC_NULL_PARAMETER;
976 inner_record = message->records;
977 if (inner_record == NULL)
979 // This message is not connection handover message
980 NFC_ERR("inner_record == NULL");
981 return NET_NFC_INVALID_FORMAT;
984 if (strncmp((char *)(inner_record->type_s.buffer), CH_REQ_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0
985 && strncmp((char *)(inner_record->type_s.buffer), CH_SEL_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0)
987 // This message is not connection handover message
988 NFC_ERR("unknown type [%s]", inner_record->type_s.buffer);
989 return NET_NFC_INVALID_FORMAT;
992 if (inner_record->payload_s.length >= 1)
994 /* There is Alternative Carrier Record or Collision Res. Rec. */
995 data_s tdata = { NULL, 0 };
998 inner_length = net_nfc_util_get_ndef_message_length(inner_msg);
1000 _net_nfc_util_alloc_mem(tdata.buffer, inner_length + 1);
1001 if (tdata.buffer == NULL)
1003 return NET_NFC_ALLOC_FAIL;
1007 tdata.length = inner_length;
1008 error = net_nfc_util_convert_ndef_message_to_rawdata(inner_msg, &tdata);
1009 if (error == NET_NFC_OK)
1013 (tdata.buffer)[0] = (inner_record->payload_s.buffer)[0];
1014 _net_nfc_util_free_mem(inner_record->payload_s.buffer);
1015 inner_record->payload_s.buffer = tdata.buffer;
1016 inner_record->payload_s.length = tdata.length;
1020 NFC_ERR("net_nfc_util_convert_ndef_message_to_rawdata failed [%d]", error);
1021 _net_nfc_util_free_mem(tdata.buffer);
1026 NFC_ERR("inner_record->payload_s.length(%d) < 1 ", inner_record->payload_s.length);
1027 error = NET_NFC_INVALID_FORMAT;
1033 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)
1035 ndef_message_s *inner_msg = NULL;
1036 ndef_record_s *carrier_rec = NULL;
1037 data_s payload = { NULL, 0 };
1038 data_s type = { NULL, 0 };
1039 int config_ref_count = 0;
1040 net_nfc_error_e error;
1041 uint8_t buffer[256] = { 0, };
1048 if (message == NULL || record == NULL)
1050 return NET_NFC_NULL_PARAMETER;
1053 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1055 NFC_ERR("net_nfc_util_create_ndef_message failed [%d]", error);
1060 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1063 ndef_record_s *last_rec = inner_msg->records;
1065 for (; idx < inner_msg->recordCount; idx++)
1067 last_rec = last_rec->next;
1070 if (strncmp((char *)last_rec->type_s.buffer, COLLISION_DETECT_RECORD_TYPE, (size_t)last_rec->type_s.length) == 0)
1072 config_ref_count = 0;
1074 else if (strncmp((char *)last_rec->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)last_rec->type_s.length) == 0)
1076 memcpy(buffer, last_rec->payload_s.buffer, last_rec->payload_s.length);
1077 config_ref_count = last_rec->payload_s.buffer[1];
1082 /* selector record type can include empty inner message. so that case, we will continue */
1083 if (message->records != NULL &&
1084 memcmp((char *)message->records->type_s.buffer, CH_SEL_RECORD_TYPE, (size_t)message->records->type_s.length) != 0)
1086 NFC_ERR("ERROR [%d]", error);
1088 net_nfc_util_free_ndef_message(inner_msg);
1094 type.buffer = (uint8_t *)ALTERNATIVE_RECORD_TYPE;
1095 type.length = strlen(ALTERNATIVE_RECORD_TYPE);
1099 // id = '0' + config_ref_count;
1103 buffer[offset++] = (uint8_t)(power_status & 0x3); /* first byte, power status */
1105 /* carrier data ref. len */
1106 buffer[offset++] = config_ref_count;
1108 /* carrier data ref. */
1109 offset += (config_ref_count - 1);
1110 buffer[offset++] = id;
1113 /* aux data ref. len */
1114 buffer[offset++] = 0;
1116 /* carrier data ref. */
1117 for (i = 0; i < 0; i++)
1119 buffer[offset++] = 0;
1122 payload.buffer = buffer;
1123 payload.length = offset;
1125 error = net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, &carrier_rec);
1126 if (error != NET_NFC_OK)
1128 NFC_ERR("net_nfc_util_create_record failed [%d]", error);
1130 net_nfc_util_free_ndef_message(inner_msg);
1135 error = net_nfc_util_append_record(inner_msg, carrier_rec);
1136 if (error != NET_NFC_OK)
1138 NFC_ERR("net_nfc_util_create_record failed [%d]", error);
1140 net_nfc_util_free_record(carrier_rec);
1141 net_nfc_util_free_ndef_message(inner_msg);
1146 error = __net_nfc_replace_inner_message(message, inner_msg);
1147 net_nfc_util_free_ndef_message(inner_msg);
1148 if (error != NET_NFC_OK)
1150 NFC_ERR("__net_nfc_replace_inner_message failed [%d]", error);
1155 /* set record id to record that will be appended to ndef message */
1156 error = net_nfc_util_set_record_id((ndef_record_s *)record, &id, sizeof(id));
1157 if (error != NET_NFC_OK)
1159 NFC_ERR("net_nfc_util_set_record_id failed [%d]", error);
1164 error = net_nfc_util_append_record(message, (ndef_record_s *)record);
1165 if (error != NET_NFC_OK)
1167 NFC_ERR("net_nfc_util_append_record failed [%d]", error);
1175 net_nfc_error_e net_nfc_util_remove_carrier_config_record(ndef_message_s *message, ndef_record_s *record)
1177 ndef_message_s *inner_msg = NULL;
1180 net_nfc_error_e error;
1181 ndef_record_s *current = NULL;
1182 ndef_record_s *record_priv = (ndef_record_s *)record;
1184 if (message == NULL || record == NULL)
1186 return NET_NFC_NULL_PARAMETER;
1189 current = message->records;
1191 for (idx = 0; idx < message->recordCount; idx++)
1193 if (current == record)
1197 current = current->next;
1200 if (current == NULL || idx == message->recordCount)
1202 NFC_DBG("The reference is not found in config records");
1204 return NET_NFC_NO_DATA_FOUND;
1208 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1210 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1215 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1217 current = inner_msg->records;
1219 for (idx = 0; idx < inner_msg->recordCount; idx++, current = current->next)
1221 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1223 if ((uint32_t)(current->payload_s.buffer[1]) == record_priv->id_s.length &&
1224 strncmp((char *)(current->payload_s.buffer + 2), (char*)(record_priv->id_s.buffer), (size_t)current->payload_s.buffer[1]) == 0)
1226 // comparing the instance
1232 if (current == NULL || idx == message->recordCount)
1234 NFC_DBG("The reference is not found in inner message");
1236 error = NET_NFC_NO_DATA_FOUND;
1240 net_nfc_util_remove_record_by_index(inner_msg, idx);
1241 __net_nfc_replace_inner_message(message, inner_msg);
1243 // remove the record only if the inner record is found.
1244 net_nfc_util_remove_record_by_index(message, saved_idx);
1248 net_nfc_util_free_ndef_message(inner_msg);
1253 net_nfc_error_e net_nfc_util_get_carrier_config_record(ndef_message_s *message, int index, ndef_record_s** record)
1255 ndef_message_s *inner_msg = NULL;
1257 net_nfc_error_e error;
1258 ndef_record_s *current = NULL;
1260 int current_idx = 0;
1262 if (message == NULL || record == NULL)
1264 return NET_NFC_NULL_PARAMETER;
1267 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1269 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1274 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1276 current = inner_msg->records;
1277 for (idx = 0; idx < inner_msg->recordCount; idx++)
1279 if (strncmp((char*)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1281 if (current_idx == index)
1285 current = current->next;
1288 if (current == NULL || idx == message->recordCount)
1290 NFC_DBG("The reference is not found in inner message");
1292 error = NET_NFC_NO_DATA_FOUND;
1296 id.buffer = (current->payload_s.buffer) + 2;
1297 id.length = current->payload_s.buffer[1];
1299 error = net_nfc_util_search_record_by_id(message, &id, record);
1303 net_nfc_util_free_ndef_message(inner_msg);
1308 net_nfc_error_e net_nfc_util_get_handover_random_number(ndef_message_s *message, unsigned short *random_number)
1310 net_nfc_error_e error;
1311 ndef_message_s *inner_msg = NULL;
1312 ndef_record_s *cr_record = NULL;
1314 if (message == NULL)
1316 return NET_NFC_NULL_PARAMETER;
1319 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1321 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1326 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1328 cr_record = inner_msg->records;
1329 if (strncmp((char*)cr_record->type_s.buffer, COLLISION_DETECT_RECORD_TYPE, (size_t)cr_record->type_s.length) != 0
1330 || cr_record->payload_s.length < 2)
1332 NFC_DBG("There is no Collision resolution record");
1334 error = NET_NFC_INVALID_FORMAT;
1338 *random_number = ((unsigned short)cr_record->payload_s.buffer[0] << 8) | (unsigned short)(cr_record->payload_s.buffer[1]);
1342 net_nfc_util_free_ndef_message(inner_msg);
1347 net_nfc_error_e net_nfc_util_get_alternative_carrier_record_count(ndef_message_s *message, unsigned int *count)
1349 net_nfc_error_e error;
1350 ndef_message_s *inner_msg = NULL;
1351 ndef_record_s *current = NULL;
1354 if (message == NULL || count == 0)
1356 return NET_NFC_NULL_PARAMETER;
1359 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1361 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1368 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1370 current = inner_msg->records;
1371 for (idx = 0; idx < inner_msg->recordCount; idx++)
1373 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1377 current = current->next;
1381 net_nfc_util_free_ndef_message(inner_msg);
1386 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)
1388 net_nfc_error_e error;
1389 ndef_message_s *inner_msg = NULL;
1390 ndef_record_s *current = NULL;
1394 if (message == NULL)
1396 return NET_NFC_NULL_PARAMETER;
1401 return NET_NFC_OUT_OF_BOUND;
1404 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1406 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1411 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1413 error = NET_NFC_OUT_OF_BOUND;
1414 current = inner_msg->records;
1415 for (idx = 0; idx < inner_msg->recordCount; idx++)
1417 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1419 if (idx_count == index)
1421 *power_state = current->payload_s.buffer[0] & 0x3;
1427 current = current->next;
1431 net_nfc_util_free_ndef_message(inner_msg);
1436 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)
1438 net_nfc_error_e error;
1439 ndef_message_s *inner_msg = NULL;
1441 if (message == NULL)
1443 return NET_NFC_NULL_PARAMETER;
1447 return NET_NFC_OUT_OF_BOUND;
1450 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1452 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1457 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1461 ndef_record_s *current = inner_msg->records;
1463 error = NET_NFC_OUT_OF_BOUND;
1464 for (idx = 0; idx < inner_msg->recordCount; idx++, current = current->next)
1466 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1468 if (idx_count == index)
1470 current->payload_s.buffer[0] = (power_status & 0x3) | (current->payload_s.buffer[0] & 0xFC);
1472 __net_nfc_replace_inner_message(message, inner_msg);
1481 net_nfc_util_free_ndef_message(inner_msg);
1486 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)
1488 if(strncmp((char*)record->type_s.buffer, CH_CAR_RECORD_TYPE, (size_t)record->type_s.length) == 0)
1490 NFC_DBG("CH_CAR_RECORD_TYPE");
1492 char ctf = record->payload_s.buffer[0] & 0x07;
1493 char ctype_length = record->payload_s.buffer[1];
1496 case NET_NFC_RECORD_MIME_TYPE: /* Media Type as defined in [RFC 2046] */
1497 if (strncmp((char *)&record->payload_s.buffer[2],
1498 CONN_HANDOVER_BT_CARRIER_MIME_NAME,
1499 (size_t)ctype_length) == 0)
1501 *type = NET_NFC_CONN_HANDOVER_CARRIER_BT;
1503 else if (strncmp((char *)&record->payload_s.buffer[2],
1504 CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME,
1505 (size_t)ctype_length) == 0)
1507 *type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS;
1509 else if (strncmp((char *)&record->payload_s.buffer[2],
1510 CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME,
1511 (size_t)ctype_length) == 0)
1513 *type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS;
1517 *type = NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
1520 case NET_NFC_RECORD_WELL_KNOWN_TYPE: /* NFC Forum Well-known Type*/
1521 case NET_NFC_RECORD_URI: /* Absolute URIs as defined in [RFC 3986] */
1522 case NET_NFC_RECORD_EXTERNAL_RTD: /* NFC Forum external type */
1524 *type = NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
1531 NFC_DBG("Other record type");
1532 if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_BT_CARRIER_MIME_NAME,
1533 (size_t)record->type_s.length) == 0)
1535 *type = NET_NFC_CONN_HANDOVER_CARRIER_BT;
1537 else if (strncmp((char *)record->type_s.buffer,
1538 CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME,
1539 (size_t)record->type_s.length) == 0)
1541 *type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS;
1543 else if (strncmp((char *)record->type_s.buffer,
1544 CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME,
1545 (size_t)record->type_s.length) == 0)
1547 *type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS;
1551 *type = NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
1557 net_nfc_error_e net_nfc_util_get_alternative_carrier_type(ndef_message_s *message,
1558 int index, net_nfc_conn_handover_carrier_type_e *type)
1560 ndef_record_s *record = NULL;
1561 net_nfc_error_e ret;
1563 ret = net_nfc_util_get_carrier_config_record(message, index, &record);
1564 if (ret != NET_NFC_OK)
1567 return net_nfc_util_get_alternative_carrier_type_from_record(record, type);
1570 net_nfc_error_e net_nfc_util_get_selector_power_status(ndef_message_s *message,
1571 net_nfc_conn_handover_carrier_state_e *power_state)
1573 net_nfc_error_e error;
1574 ndef_message_s *inner_msg = NULL;
1575 ndef_record_s *current = NULL;
1577 net_nfc_conn_handover_carrier_state_e selector_state;
1579 selector_state = NET_NFC_CONN_HANDOVER_CARRIER_INACTIVATE;
1581 if (message == NULL)
1583 return NET_NFC_NULL_PARAMETER;
1586 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) == NET_NFC_OK)
1588 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1590 if (inner_msg->recordCount > 1)
1592 current = inner_msg->records;
1593 for (idx = 0; idx < inner_msg->recordCount; idx++)
1595 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE,
1596 (size_t)current->type_s.length) == 0)
1598 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))
1600 selector_state = NET_NFC_CONN_HANDOVER_CARRIER_ACTIVATE;
1604 current = current->next;
1609 /* always activate when ac is only one */
1610 selector_state = NET_NFC_CONN_HANDOVER_CARRIER_ACTIVATE;
1613 *power_state = selector_state;
1617 NFC_ERR("_net_nfc_util_create_ndef_message failed [%d]", error);
1620 net_nfc_util_free_ndef_message(inner_msg);
1624 NFC_ERR("_net_nfc_util_create_ndef_message failed [%d]", error);
1625 error = NET_NFC_ALLOC_FAIL;