2 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include "net_nfc_typedef_internal.h"
22 #include "net_nfc_debug_internal.h"
23 #include "net_nfc_util_defines.h"
24 #include "net_nfc_util_internal.h"
25 #include "net_nfc_util_ndef_record.h"
26 #include "net_nfc_util_ndef_message.h"
27 #include "net_nfc_util_handover.h"
29 typedef struct _search_index
36 void net_nfc_convert_byte_order(unsigned char *array, int size)
39 unsigned char tmp_char;
41 for ( i = 0; i < size/2; i++)
44 array[i] = array[size-1-i];
45 array[size-1-i] = tmp_char;
50 static int __property_equal_to(gconstpointer key1, gconstpointer key2)
52 const net_nfc_carrier_property_s *arg1 = key1;
53 const net_nfc_carrier_property_s *arg2 = key2;
55 if (arg1->attribute < arg2->attribute)
57 else if (arg1->attribute > arg2->attribute)
63 static net_nfc_carrier_property_s *__find_property_by_attrubute(GList *list,
67 net_nfc_carrier_property_s temp;
69 temp.attribute = attribute;
70 found = g_list_find_custom(list, &temp, __property_equal_to);
75 return (net_nfc_carrier_property_s *)found->data;
78 static void __find_nth_group(gpointer data, gpointer user_data)
80 search_index *nth = user_data;
81 net_nfc_carrier_property_s *info = data;
84 RET_IF(NULL == user_data);
88 if (nth->current == nth->target)
95 static void __free_all_data(gpointer data, gpointer user_data)
97 net_nfc_carrier_property_s *info = data;
103 NFC_DBG("FREE: group is found");
104 net_nfc_util_free_carrier_group(info);
108 NFC_DBG("FREE: element is found ATTRIB:0x%X length:%d",
109 info->attribute, info->length);
110 _net_nfc_util_free_mem(info->data);
111 _net_nfc_util_free_mem(info);
115 static net_nfc_error_e
116 __net_nfc_util_create_connection_handover_collsion_resolution_record(
117 ndef_record_s **record)
122 data_s payload = { 0 };
123 data_s typeName = { 0 };
124 uint8_t rand_buffer[2] = { 0, 0 };
126 RETV_IF(NULL == record, NET_NFC_NULL_PARAMETER);
128 state = (uint32_t)time(NULL);
129 random_num = (unsigned short)rand_r(&state);
131 typeName.buffer = (uint8_t *)COLLISION_DETECT_RECORD_TYPE;
132 typeName.length = strlen(COLLISION_DETECT_RECORD_TYPE);
134 rand_buffer[0] = (random_num & 0xff00) >> 8; // MSB
135 rand_buffer[1] = (random_num & 0x00ff); // LSB
137 payload.buffer = rand_buffer;
140 NFC_DBG("rand number = [0x%x] [0x%x] => [0x%x]",
141 payload.buffer[0], payload.buffer[1], random_num);
143 return net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE,
144 &typeName, NULL, &payload, record);
147 static int __net_nfc_get_size_of_attribute(int attribute)
151 case NET_NFC_BT_ATTRIBUTE_UUID16_PART :
152 case NET_NFC_BT_ATTRIBUTE_UUID16 :
153 case NET_NFC_BT_ATTRIBUTE_UUID32_PART :
154 case NET_NFC_BT_ATTRIBUTE_UUID32 :
155 case NET_NFC_BT_ATTRIBUTE_UUID128_PART :
156 case NET_NFC_BT_ATTRIBUTE_UUID128 :
157 case NET_NFC_BT_ATTRIBUTE_NAME_PART :
158 case NET_NFC_BT_ATTRIBUTE_NAME :
159 case NET_NFC_BT_ATTRIBUTE_TXPOWER :
160 case NET_NFC_BT_ATTRIBUTE_OOB_COD :
161 case NET_NFC_BT_ATTRIBUTE_OOB_HASH_C :
162 case NET_NFC_BT_ATTRIBUTE_OOB_HASH_R :
163 case NET_NFC_BT_ATTRIBUTE_ID :
164 case NET_NFC_BT_ATTRIBUTE_MANUFACTURER :
165 case NET_NFC_BT_ATTRIBUTE_ADDRESS :
166 // case NET_NFC_WIFI_ATTRIBUTE_VERSION2:
174 net_nfc_error_e net_nfc_util_create_carrier_config(
175 net_nfc_carrier_config_s **config, net_nfc_conn_handover_carrier_type_e type)
177 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
178 RETV_IF(type < 0, NET_NFC_OUT_OF_BOUND);
179 RETV_IF(type >= NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN, NET_NFC_OUT_OF_BOUND);
181 _net_nfc_util_alloc_mem(*config, sizeof(net_nfc_carrier_config_s));
183 return NET_NFC_ALLOC_FAIL;
185 (*config)->type = type;
186 (*config)->length = 0;
191 net_nfc_error_e net_nfc_util_add_carrier_config_property(
192 net_nfc_carrier_config_s *config, uint16_t attribute, uint16_t size, uint8_t *data)
194 net_nfc_carrier_property_s *elem = NULL;
196 NFC_DBG("ADD property: [ATTRIB:0x%X, SIZE:%d]", attribute, size);
198 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
199 RETV_IF(NULL == data, NET_NFC_NULL_PARAMETER);
201 if (__find_property_by_attrubute(config->data, attribute) != NULL)
202 return NET_NFC_ALREADY_REGISTERED;
204 _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 (NULL == elem->data)
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 NFC_DBG("ADD completed total length %d", config->length);
228 net_nfc_error_e net_nfc_util_remove_carrier_config_property(
229 net_nfc_carrier_config_s *config, uint16_t attribute)
231 net_nfc_carrier_property_s *elem = NULL;
233 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
235 elem = __find_property_by_attrubute(config->data, attribute);
237 return NET_NFC_NO_DATA_FOUND;
239 config->data = g_list_remove(config->data, elem);
240 config->length -= (elem->length + 2 * __net_nfc_get_size_of_attribute(attribute));
244 net_nfc_util_free_carrier_group(elem);
248 _net_nfc_util_free_mem(elem->data);
249 _net_nfc_util_free_mem(elem);
255 net_nfc_error_e net_nfc_util_get_carrier_config_property(
256 net_nfc_carrier_config_s *config,
261 net_nfc_carrier_property_s *elem = NULL;
263 RETV_IF(NULL == size, NET_NFC_NULL_PARAMETER);
264 RETV_IF(NULL == data, NET_NFC_NULL_PARAMETER);
265 RETV_IF(NULL == config, 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 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
288 RETV_IF(NULL == config, 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+4;
299 net_nfc_error_e net_nfc_util_remove_carrier_config_group(
300 net_nfc_carrier_config_s *config, net_nfc_carrier_property_s *group)
302 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
303 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
305 if (g_list_find(config->data, group) != NULL)
306 return NET_NFC_NO_DATA_FOUND;
308 config->length -= group->length;
309 config->data = g_list_remove(config->data, group);
311 net_nfc_util_free_carrier_group(group);
316 net_nfc_error_e net_nfc_util_get_carrier_config_group(
317 net_nfc_carrier_config_s *config, int index, net_nfc_carrier_property_s **group)
321 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
322 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
323 RETV_IF(index < 0, NET_NFC_OUT_OF_BOUND);
326 result.target = index;
329 g_list_foreach(config->data, __find_nth_group, &result);
331 if (NULL == result.found)
332 return NET_NFC_NO_DATA_FOUND;
334 *group = (net_nfc_carrier_property_s *)result.found;
339 net_nfc_error_e net_nfc_util_free_carrier_config(net_nfc_carrier_config_s *config)
341 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
343 g_list_foreach(config->data, __free_all_data, NULL);
344 g_list_free(config->data);
346 _net_nfc_util_free_mem(config);
351 net_nfc_error_e net_nfc_util_create_carrier_config_group(
352 net_nfc_carrier_property_s **group, uint16_t attribute)
354 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
356 _net_nfc_util_alloc_mem(*group, sizeof(net_nfc_carrier_property_s));
358 return NET_NFC_ALLOC_FAIL;
360 (*group)->attribute = attribute;
361 (*group)->is_group = true;
366 net_nfc_error_e net_nfc_util_add_carrier_config_group_property(
367 net_nfc_carrier_property_s *group, uint16_t attribute, uint16_t size, uint8_t *data)
369 net_nfc_carrier_property_s *elem = NULL;
371 NFC_DBG("ADD group property: [ATTRIB:0x%X, SIZE:%d]", attribute, size);
373 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
374 RETV_IF(NULL == data, NET_NFC_NULL_PARAMETER);
376 if (__find_property_by_attrubute((GList *)group->data, attribute) != NULL)
377 return NET_NFC_ALREADY_REGISTERED;
379 _net_nfc_util_alloc_mem(elem, sizeof (net_nfc_carrier_property_s));
381 return NET_NFC_ALLOC_FAIL;
383 elem->attribute = attribute;
385 elem->is_group = false;
387 _net_nfc_util_alloc_mem(elem->data, size);
388 if (NULL == elem->data)
390 _net_nfc_util_free_mem(elem);
391 return NET_NFC_ALLOC_FAIL;
393 memcpy(elem->data, data, size);
394 group->length += size + 2 * __net_nfc_get_size_of_attribute(attribute);
395 group->data = g_list_append((GList *)(group->data), elem);
397 NFC_DBG("ADD group completed total length %d", group->length);
402 net_nfc_error_e net_nfc_util_get_carrier_config_group_property(
403 net_nfc_carrier_property_s *group,
408 net_nfc_carrier_property_s *elem = NULL;
410 RETV_IF(NULL == size, NET_NFC_NULL_PARAMETER);
411 RETV_IF(NULL == data, NET_NFC_NULL_PARAMETER);
412 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
414 elem = __find_property_by_attrubute((GList*)(group->data), attribute);
419 return NET_NFC_NO_DATA_FOUND;
422 *size = elem->length;
428 net_nfc_error_e net_nfc_util_remove_carrier_config_group_property(
429 net_nfc_carrier_property_s *group, uint16_t attribute)
431 net_nfc_carrier_property_s *elem = NULL;
433 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
435 elem = __find_property_by_attrubute((GList*)(group->data), attribute);
437 return NET_NFC_NO_DATA_FOUND;
439 group->length -= elem->length;
440 group->data = g_list_remove((GList*)(group->data), elem);
442 _net_nfc_util_free_mem(elem->data);
443 _net_nfc_util_free_mem(elem);
449 net_nfc_error_e net_nfc_util_free_carrier_group(net_nfc_carrier_property_s *group)
451 RETV_IF(NULL == group, NET_NFC_NULL_PARAMETER);
453 g_list_foreach((GList*)(group->data), __free_all_data, NULL);
454 g_list_free((GList*)(group->data));
456 _net_nfc_util_free_mem(group);
461 static void __make_serial_wifi(gpointer data, gpointer user_data)
465 data_s *payload = user_data;
466 net_nfc_carrier_property_s *info = data;
468 RET_IF(NULL == info);
469 RET_IF(NULL == user_data);
471 current = payload->buffer + payload->length;
472 inc = __net_nfc_get_size_of_attribute(info->attribute);
476 NFC_DBG("[WIFI]Found Group make recursive");
477 *(uint16_t *)current = info->attribute;
478 net_nfc_convert_byte_order(current,2);
479 *(uint16_t *)(current + inc) = info->length;
480 net_nfc_convert_byte_order((current + inc),2);
481 payload->length += (inc + inc);
482 g_list_foreach((GList *)info->data, __make_serial_wifi, payload);
486 NFC_DBG("[WIFI]Element is found attrib:0x%X length:%d current:%d",
487 info->attribute, info->length, payload->length);
488 *(uint16_t *)current = info->attribute;
489 net_nfc_convert_byte_order(current,2);
490 *(uint16_t *)(current + inc) = info->length;
491 net_nfc_convert_byte_order((current + inc),2);
492 memcpy(current + inc + inc, info->data, info->length);
493 payload->length += (inc + inc + info->length);
497 static void __make_serial_bt(gpointer data, gpointer user_data)
501 data_s *payload = user_data;
502 net_nfc_carrier_property_s *info = data;
504 RET_IF(NULL == info);
505 RET_IF(NULL == user_data);
507 current = payload->buffer + payload->length; /* payload->length is zero */
511 NFC_DBG("[BT]Found Group. call recursive");
512 g_list_foreach((GList *)info->data, __make_serial_bt, payload);
516 if (info->attribute != NET_NFC_BT_ATTRIBUTE_ADDRESS)
518 NFC_DBG("[BT]Element is found attrib:0x%X length:%d current:%d",
519 info->attribute, info->length, payload->length);
520 inc = __net_nfc_get_size_of_attribute(info->attribute);
521 *current = info->length + 1;
522 *(current + inc) = info->attribute;
523 memcpy(current + inc + inc, info->data, info->length);
524 payload->length += (inc + inc + info->length);
528 NFC_DBG("[BT]BT address is found length:%d", info->length);
529 memcpy(current, info->data, info->length);
530 payload->length += (info->length);
535 net_nfc_error_e net_nfc_util_create_ndef_record_with_carrier_config(
536 ndef_record_s **record, net_nfc_carrier_config_s *config)
538 data_s payload = { NULL, 0 };
539 data_s record_type = { NULL, 0 };
541 RETV_IF(NULL == record, NET_NFC_NULL_PARAMETER);
542 RETV_IF(NULL == config, NET_NFC_NULL_PARAMETER);
544 _net_nfc_util_alloc_mem(payload.buffer, config->length);
545 if (NULL == payload.buffer)
546 return NET_NFC_ALLOC_FAIL;
548 payload.length = 0; /* this should be zero because this will be used as current position of data written */
550 if (NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS == config->type)
552 record_type.buffer = (uint8_t *)CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME;
553 record_type.length = strlen(CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME);
554 g_list_foreach(config->data, __make_serial_wifi, &payload);
556 else if (NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS == config->type)
558 record_type.buffer = (uint8_t *)CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME;
559 record_type.length = strlen(CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME);
560 g_list_foreach(config->data, __make_serial_wifi, &payload);
562 else if (NET_NFC_CONN_HANDOVER_CARRIER_BT == config->type)
564 record_type.buffer = (uint8_t *)CONN_HANDOVER_BT_CARRIER_MIME_NAME;
565 record_type.length = strlen(CONN_HANDOVER_BT_CARRIER_MIME_NAME);
566 payload.buffer += 2; /* OOB total length */
567 g_list_foreach(config->data, __make_serial_bt, &payload);
568 payload.buffer -= 2; /* return to original */
570 payload.buffer[0] = payload.length & 0xFF;
571 payload.buffer[1] = (payload.length >> 8) & 0xFF;
575 return NET_NFC_NOT_SUPPORTED;
578 NFC_DBG("payload length = %d", payload.length);
580 return net_nfc_util_create_record(NET_NFC_RECORD_MIME_TYPE, &record_type, NULL,
584 static net_nfc_error_e __net_nfc_get_list_from_serial_for_wifi(
585 GList **list, uint8_t *data, uint32_t length)
587 uint8_t *current = data;
588 uint8_t *last = current + length;
590 while (current < last)
592 net_nfc_carrier_property_s *elem = NULL;
593 _net_nfc_util_alloc_mem(elem, sizeof(net_nfc_carrier_property_s));
595 return NET_NFC_ALLOC_FAIL;
597 elem->attribute = current[0]<<8|current[1];
598 elem->length = current[2]<<8|current[3];
600 if (elem->attribute == NET_NFC_WIFI_ATTRIBUTE_CREDENTIAL)
602 __net_nfc_get_list_from_serial_for_wifi(list, (current + 4), elem->length);
603 elem->is_group = true;
607 _net_nfc_util_alloc_mem(elem->data, elem->length);
608 if (NULL == elem->data)
610 _net_nfc_util_free_mem(elem);
611 return NET_NFC_ALLOC_FAIL;
613 memcpy(elem->data, (current + 4), elem->length);
614 elem->is_group = false;
616 *list = g_list_append(*list, elem);
617 current += (4 + elem->length);
623 net_nfc_error_e __net_nfc_get_list_from_serial_for_bt(GList **list, uint8_t *data, uint32_t length)
625 uint8_t *last = NULL;
626 uint8_t *current = data;
627 net_nfc_carrier_property_s *elem = NULL;
629 current += 2; /* remove oob data length two bytes length*/
632 _net_nfc_util_alloc_mem(elem, sizeof(net_nfc_carrier_property_s));
634 return NET_NFC_ALLOC_FAIL;
636 elem->attribute = (uint16_t)NET_NFC_BT_ATTRIBUTE_ADDRESS;
637 elem->length = 6; /* BT address length is always 6 */
639 _net_nfc_util_alloc_mem(elem->data, elem->length);
640 if (NULL == elem->data)
642 _net_nfc_util_free_mem(elem);
643 return NET_NFC_ALLOC_FAIL;
645 memcpy(elem->data, current, elem->length);
646 elem->is_group = false;
648 current += 6; /* BT address length is always 6 */
649 length -= 6; /* substracted by 6 (Address length)*/
650 *list = g_list_append(*list, elem);
652 last = current + length;
654 while (current < last)
656 _net_nfc_util_alloc_mem(elem, sizeof(net_nfc_carrier_property_s));
658 return NET_NFC_ALLOC_FAIL;
660 elem->length = *((uint8_t *)current) - 1;
661 elem->attribute = *((uint8_t *)(++current));
663 _net_nfc_util_alloc_mem(elem->data, elem->length);
664 if (NULL == elem->data)
666 _net_nfc_util_free_mem(elem);
667 return NET_NFC_ALLOC_FAIL;
669 memcpy(elem->data, (++current), elem->length);
670 elem->is_group = false;
672 current += elem->length;
673 *list = g_list_append(*list, elem);
679 net_nfc_error_e net_nfc_util_create_carrier_config_from_config_record(
680 net_nfc_carrier_config_s **config, ndef_record_s *record)
682 net_nfc_error_e result = NET_NFC_OK;
683 net_nfc_conn_handover_carrier_type_e type;
685 if (record == NULL || config == NULL)
687 return NET_NFC_NULL_PARAMETER;
690 if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME, record->type_s.length) == 0)
692 type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS;
694 else if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME, record->type_s.length) == 0)
696 type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS;
698 else if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_BT_CARRIER_MIME_NAME, record->type_s.length) == 0)
700 type = NET_NFC_CONN_HANDOVER_CARRIER_BT;
704 NFC_DBG("Record type is not config type");
705 return NET_NFC_INVALID_FORMAT;
708 result = net_nfc_util_create_carrier_config(config, type);
711 return NET_NFC_ALLOC_FAIL;
714 switch ((*config)->type)
716 case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS :
717 case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS :
718 result = __net_nfc_get_list_from_serial_for_wifi((GList **)&((*config)->data), record->payload_s.buffer, record->payload_s.length);
720 case NET_NFC_CONN_HANDOVER_CARRIER_BT :
721 result = __net_nfc_get_list_from_serial_for_bt((GList **)&((*config)->data), record->payload_s.buffer, record->payload_s.length);
723 case NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN :
724 result = NET_NFC_NOT_SUPPORTED;
728 if (result != NET_NFC_OK)
730 net_nfc_util_free_carrier_config((net_nfc_carrier_config_s *)*config);
736 net_nfc_error_e net_nfc_util_create_handover_request_message(ndef_message_s **message)
738 ndef_message_s *inner_message = NULL;
739 net_nfc_error_e error;
740 ndef_record_s *record = NULL;
741 data_s type = { NULL, 0 };
742 data_s payload = { NULL, 0 };
747 return NET_NFC_NULL_PARAMETER;
750 error = net_nfc_util_create_ndef_message(message);
751 if (error != NET_NFC_OK)
756 error = net_nfc_util_create_ndef_message(&inner_message);
757 if (error != NET_NFC_OK)
759 net_nfc_util_free_ndef_message(*message);
765 __net_nfc_util_create_connection_handover_collsion_resolution_record(&record);
766 net_nfc_util_append_record(inner_message, record);
768 size = net_nfc_util_get_ndef_message_length(inner_message) + 1;
769 _net_nfc_util_alloc_mem(payload.buffer, size);
770 if (payload.buffer == NULL)
772 net_nfc_util_free_ndef_message(inner_message);
773 net_nfc_util_free_ndef_message(*message);
776 return NET_NFC_ALLOC_FAIL;
778 payload.length = size;
780 uint8_t version = CH_VERSION;
782 (payload.buffer)[0] = version;
786 error = net_nfc_util_convert_ndef_message_to_rawdata(inner_message, &payload);
787 if (error != NET_NFC_OK)
789 _net_nfc_util_free_mem(payload.buffer);
790 net_nfc_util_free_ndef_message(inner_message);
791 net_nfc_util_free_ndef_message(*message);
797 net_nfc_util_free_ndef_message(inner_message);
801 type.buffer = (uint8_t *)CH_REQ_RECORD_TYPE;
802 type.length = strlen(CH_REQ_RECORD_TYPE);
804 net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, &record);
805 net_nfc_util_append_record(*message, record);
807 _net_nfc_util_free_mem(payload.buffer);
812 net_nfc_error_e net_nfc_util_create_handover_select_message(ndef_message_s **message)
814 net_nfc_error_e error = NET_NFC_OK;
815 ndef_record_s *record = NULL;
816 data_s type = { NULL, 0 };
817 data_s payload = { NULL, 0 };
821 return NET_NFC_NULL_PARAMETER;
824 error = net_nfc_util_create_ndef_message(message);
825 if (error != NET_NFC_OK)
830 _net_nfc_util_alloc_mem(payload.buffer, 1);
831 if (payload.buffer == NULL)
833 net_nfc_util_free_ndef_message(*message);
834 return NET_NFC_ALLOC_FAIL;
836 payload.length = (uint32_t)1;
838 (payload.buffer)[0] = CH_VERSION;
840 type.buffer = (uint8_t*)CH_SEL_RECORD_TYPE;
841 type.length = strlen(CH_SEL_RECORD_TYPE);
843 net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, &record);
844 net_nfc_util_append_record(*message, record);
846 _net_nfc_util_free_mem(payload.buffer);
851 net_nfc_error_e net_nfc_util_create_handover_carrier_record(ndef_record_s ** record)
853 data_s payload = {NULL,0};
855 data_s type = { NULL, 0 };
856 uint8_t *buffer_ptr = NULL;
858 _net_nfc_util_alloc_mem(payload.buffer,26);//hardcoded as of now
859 if (payload.buffer == NULL)
860 return NET_NFC_ALLOC_FAIL;
862 buffer_ptr = payload.buffer;
865 buffer_ptr[0]= NET_NFC_RECORD_MIME_TYPE;
867 //copy the MIME type length
868 buffer_ptr[1] = strlen(CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME);
871 memcpy(&buffer_ptr[2],CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME,(payload.buffer)[1]);
872 payload.buffer[25] = '\0';
875 type.buffer = (uint8_t *)CH_CAR_RECORD_TYPE;
876 type.length = strlen(CH_CAR_RECORD_TYPE);
878 net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE,
882 (ndef_record_s **)record);
884 _net_nfc_util_free_mem(payload.buffer);
888 net_nfc_error_e net_nfc_util_create_handover_error_record(ndef_record_s **record, uint8_t reason, uint32_t data)
907 _net_nfc_util_alloc_mem(payload.buffer, size);
908 if (payload.buffer == NULL)
910 return NET_NFC_ALLOC_FAIL;
912 payload.length = size;
914 type.buffer = (uint8_t *)ERROR_RECORD_TYPE;
915 type.length = strlen(ERROR_RECORD_TYPE);
917 net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, (ndef_record_s **)record);
919 _net_nfc_util_free_mem(payload.buffer);
924 /* inner_msg should be freed after using */
926 static net_nfc_error_e __net_nfc_get_inner_message(ndef_message_s *message, ndef_message_s *inner_msg)
928 net_nfc_error_e error;
929 ndef_record_s *inner_record = NULL;
931 if (message == NULL || inner_msg == NULL)
933 return NET_NFC_NULL_PARAMETER;
936 inner_record = message->records;
937 if (inner_record == NULL)
939 // This message is not connection handover message
940 return NET_NFC_INVALID_FORMAT;
943 if (strncmp((char*)(inner_record->type_s.buffer), CH_REQ_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0
944 && strncmp((char*)(inner_record->type_s.buffer), CH_SEL_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0)
946 // This message is not connection handover message
947 return NET_NFC_INVALID_FORMAT;
950 if (inner_record->payload_s.length > 1)
952 /* There is Alternative Carrier Record or Collision Res. Rec. */
953 (inner_record->payload_s.buffer)++; /* version */
954 (inner_record->payload_s.length)--;
955 error = net_nfc_util_convert_rawdata_to_ndef_message(&(inner_record->payload_s), inner_msg);
956 (inner_record->payload_s.buffer)--;
957 (inner_record->payload_s.length)++;
961 error = NET_NFC_NO_DATA_FOUND;
967 static net_nfc_error_e __net_nfc_replace_inner_message(ndef_message_s *message, ndef_message_s *inner_msg)
969 net_nfc_error_e error;
970 ndef_record_s *inner_record = NULL;
972 if (message == NULL || inner_msg == NULL)
974 return NET_NFC_NULL_PARAMETER;
977 inner_record = message->records;
978 if (inner_record == NULL)
980 // This message is not connection handover message
981 NFC_ERR("inner_record == NULL");
982 return NET_NFC_INVALID_FORMAT;
985 if (strncmp((char *)(inner_record->type_s.buffer), CH_REQ_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0
986 && strncmp((char *)(inner_record->type_s.buffer), CH_SEL_RECORD_TYPE, (size_t)(inner_record->type_s.length)) != 0)
988 // This message is not connection handover message
989 NFC_ERR("unknown type [%s]", inner_record->type_s.buffer);
990 return NET_NFC_INVALID_FORMAT;
993 if (inner_record->payload_s.length >= 1)
995 /* There is Alternative Carrier Record or Collision Res. Rec. */
996 data_s tdata = { NULL, 0 };
999 inner_length = net_nfc_util_get_ndef_message_length(inner_msg);
1001 _net_nfc_util_alloc_mem(tdata.buffer, inner_length + 1);
1002 if (tdata.buffer == NULL)
1004 return NET_NFC_ALLOC_FAIL;
1008 tdata.length = inner_length;
1009 error = net_nfc_util_convert_ndef_message_to_rawdata(inner_msg, &tdata);
1010 if (error == NET_NFC_OK)
1014 (tdata.buffer)[0] = (inner_record->payload_s.buffer)[0];
1015 _net_nfc_util_free_mem(inner_record->payload_s.buffer);
1016 inner_record->payload_s.buffer = tdata.buffer;
1017 inner_record->payload_s.length = tdata.length;
1021 NFC_ERR("net_nfc_util_convert_ndef_message_to_rawdata failed [%d]", error);
1022 _net_nfc_util_free_mem(tdata.buffer);
1027 NFC_ERR("inner_record->payload_s.length(%d) < 1 ", inner_record->payload_s.length);
1028 error = NET_NFC_INVALID_FORMAT;
1034 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)
1036 ndef_message_s *inner_msg = NULL;
1037 ndef_record_s *carrier_rec = NULL;
1038 data_s payload = { NULL, 0 };
1039 data_s type = { NULL, 0 };
1040 int config_ref_count = 0;
1041 net_nfc_error_e error;
1042 uint8_t buffer[256] = { 0, };
1049 if (message == NULL || record == NULL)
1051 return NET_NFC_NULL_PARAMETER;
1054 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1056 NFC_ERR("net_nfc_util_create_ndef_message failed [%d]", error);
1061 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1064 ndef_record_s *last_rec = inner_msg->records;
1066 for (; idx < inner_msg->recordCount; idx++)
1068 last_rec = last_rec->next;
1071 if (strncmp((char *)last_rec->type_s.buffer, COLLISION_DETECT_RECORD_TYPE, (size_t)last_rec->type_s.length) == 0)
1073 config_ref_count = 0;
1075 else if (strncmp((char *)last_rec->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)last_rec->type_s.length) == 0)
1077 memcpy(buffer, last_rec->payload_s.buffer, last_rec->payload_s.length);
1078 config_ref_count = last_rec->payload_s.buffer[1];
1083 /* selector record type can include empty inner message. so that case, we will continue */
1084 if (message->records != NULL &&
1085 memcmp((char *)message->records->type_s.buffer, CH_SEL_RECORD_TYPE, (size_t)message->records->type_s.length) != 0)
1087 NFC_ERR("ERROR [%d]", error);
1089 net_nfc_util_free_ndef_message(inner_msg);
1095 type.buffer = (uint8_t *)ALTERNATIVE_RECORD_TYPE;
1096 type.length = strlen(ALTERNATIVE_RECORD_TYPE);
1100 // id = '0' + config_ref_count;
1104 buffer[offset++] = (uint8_t)(power_status & 0x3); /* first byte, power status */
1106 /* carrier data ref. len */
1107 buffer[offset++] = config_ref_count;
1109 /* carrier data ref. */
1110 offset += (config_ref_count - 1);
1111 buffer[offset++] = id;
1114 /* aux data ref. len */
1115 buffer[offset++] = 0;
1117 /* carrier data ref. */
1118 for (i = 0; i < 0; i++)
1120 buffer[offset++] = 0;
1123 payload.buffer = buffer;
1124 payload.length = offset;
1126 error = net_nfc_util_create_record(NET_NFC_RECORD_WELL_KNOWN_TYPE, &type, NULL, &payload, &carrier_rec);
1127 if (error != NET_NFC_OK)
1129 NFC_ERR("net_nfc_util_create_record failed [%d]", error);
1131 net_nfc_util_free_ndef_message(inner_msg);
1136 error = net_nfc_util_append_record(inner_msg, carrier_rec);
1137 if (error != NET_NFC_OK)
1139 NFC_ERR("net_nfc_util_create_record failed [%d]", error);
1141 net_nfc_util_free_record(carrier_rec);
1142 net_nfc_util_free_ndef_message(inner_msg);
1147 error = __net_nfc_replace_inner_message(message, inner_msg);
1148 net_nfc_util_free_ndef_message(inner_msg);
1149 if (error != NET_NFC_OK)
1151 NFC_ERR("__net_nfc_replace_inner_message failed [%d]", error);
1156 /* set record id to record that will be appended to ndef message */
1157 error = net_nfc_util_set_record_id((ndef_record_s *)record, &id, sizeof(id));
1158 if (error != NET_NFC_OK)
1160 NFC_ERR("net_nfc_util_set_record_id failed [%d]", error);
1165 error = net_nfc_util_append_record(message, (ndef_record_s *)record);
1166 if (error != NET_NFC_OK)
1168 NFC_ERR("net_nfc_util_append_record failed [%d]", error);
1176 net_nfc_error_e net_nfc_util_remove_carrier_config_record(ndef_message_s *message, ndef_record_s *record)
1178 ndef_message_s *inner_msg = NULL;
1181 net_nfc_error_e error;
1182 ndef_record_s *current = NULL;
1183 ndef_record_s *record_priv = (ndef_record_s *)record;
1185 if (message == NULL || record == NULL)
1187 return NET_NFC_NULL_PARAMETER;
1190 current = message->records;
1192 for (idx = 0; idx < message->recordCount; idx++)
1194 if (current == record)
1198 current = current->next;
1201 if (current == NULL || idx == message->recordCount)
1203 NFC_DBG("The reference is not found in config records");
1205 return NET_NFC_NO_DATA_FOUND;
1209 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1211 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1216 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1218 current = inner_msg->records;
1220 for (idx = 0; idx < inner_msg->recordCount; idx++, current = current->next)
1222 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1224 if ((uint32_t)(current->payload_s.buffer[1]) == record_priv->id_s.length &&
1225 strncmp((char *)(current->payload_s.buffer + 2), (char*)(record_priv->id_s.buffer), (size_t)current->payload_s.buffer[1]) == 0)
1227 // comparing the instance
1233 if (current == NULL || idx == message->recordCount)
1235 NFC_DBG("The reference is not found in inner message");
1237 error = NET_NFC_NO_DATA_FOUND;
1241 net_nfc_util_remove_record_by_index(inner_msg, idx);
1242 __net_nfc_replace_inner_message(message, inner_msg);
1244 // remove the record only if the inner record is found.
1245 net_nfc_util_remove_record_by_index(message, saved_idx);
1249 net_nfc_util_free_ndef_message(inner_msg);
1254 net_nfc_error_e net_nfc_util_get_carrier_config_record(ndef_message_s *message, int index, ndef_record_s** record)
1256 ndef_message_s *inner_msg = NULL;
1258 net_nfc_error_e error;
1259 ndef_record_s *current = NULL;
1261 int current_idx = 0;
1263 if (message == NULL || record == NULL)
1265 return NET_NFC_NULL_PARAMETER;
1268 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1270 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1275 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1277 current = inner_msg->records;
1278 for (idx = 0; idx < inner_msg->recordCount; idx++)
1280 if (strncmp((char*)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1282 if (current_idx == index)
1286 current = current->next;
1289 if (current == NULL || idx == message->recordCount)
1291 NFC_DBG("The reference is not found in inner message");
1293 error = NET_NFC_NO_DATA_FOUND;
1297 id.buffer = (current->payload_s.buffer) + 2;
1298 id.length = current->payload_s.buffer[1];
1300 error = net_nfc_util_search_record_by_id(message, &id, record);
1304 net_nfc_util_free_ndef_message(inner_msg);
1309 net_nfc_error_e net_nfc_util_get_handover_random_number(ndef_message_s *message, unsigned short *random_number)
1311 net_nfc_error_e error;
1312 ndef_message_s *inner_msg = NULL;
1313 ndef_record_s *cr_record = NULL;
1315 if (message == NULL)
1317 return NET_NFC_NULL_PARAMETER;
1320 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1322 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1327 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1329 cr_record = inner_msg->records;
1330 if (strncmp((char*)cr_record->type_s.buffer, COLLISION_DETECT_RECORD_TYPE, (size_t)cr_record->type_s.length) != 0
1331 || cr_record->payload_s.length < 2)
1333 NFC_DBG("There is no Collision resolution record");
1335 error = NET_NFC_INVALID_FORMAT;
1339 *random_number = ((unsigned short)cr_record->payload_s.buffer[0] << 8) | (unsigned short)(cr_record->payload_s.buffer[1]);
1343 net_nfc_util_free_ndef_message(inner_msg);
1348 net_nfc_error_e net_nfc_util_get_alternative_carrier_record_count(ndef_message_s *message, unsigned int *count)
1350 net_nfc_error_e error;
1351 ndef_message_s *inner_msg = NULL;
1352 ndef_record_s *current = NULL;
1355 if (message == NULL || count == 0)
1357 return NET_NFC_NULL_PARAMETER;
1360 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1362 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1369 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1371 current = inner_msg->records;
1372 for (idx = 0; idx < inner_msg->recordCount; idx++)
1374 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1378 current = current->next;
1382 net_nfc_util_free_ndef_message(inner_msg);
1387 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)
1389 net_nfc_error_e error;
1390 ndef_message_s *inner_msg = NULL;
1391 ndef_record_s *current = NULL;
1395 if (message == NULL)
1397 return NET_NFC_NULL_PARAMETER;
1402 return NET_NFC_OUT_OF_BOUND;
1405 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1407 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1412 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1414 error = NET_NFC_OUT_OF_BOUND;
1415 current = inner_msg->records;
1416 for (idx = 0; idx < inner_msg->recordCount; idx++)
1418 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1420 if (idx_count == index)
1422 *power_state = current->payload_s.buffer[0] & 0x3;
1428 current = current->next;
1432 net_nfc_util_free_ndef_message(inner_msg);
1437 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)
1439 net_nfc_error_e error;
1440 ndef_message_s *inner_msg = NULL;
1442 if (message == NULL)
1444 return NET_NFC_NULL_PARAMETER;
1448 return NET_NFC_OUT_OF_BOUND;
1451 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) != NET_NFC_OK)
1453 NFC_DBG("net_nfc_util_create_ndef_message failed [%d]", error);
1458 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1462 ndef_record_s *current = inner_msg->records;
1464 error = NET_NFC_OUT_OF_BOUND;
1465 for (idx = 0; idx < inner_msg->recordCount; idx++, current = current->next)
1467 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE, (size_t)current->type_s.length) == 0)
1469 if (idx_count == index)
1471 current->payload_s.buffer[0] = (power_status & 0x3) | (current->payload_s.buffer[0] & 0xFC);
1473 __net_nfc_replace_inner_message(message, inner_msg);
1482 net_nfc_util_free_ndef_message(inner_msg);
1487 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)
1489 if(strncmp((char*)record->type_s.buffer, CH_CAR_RECORD_TYPE, (size_t)record->type_s.length) == 0)
1491 NFC_DBG("CH_CAR_RECORD_TYPE");
1493 char ctf = record->payload_s.buffer[0] & 0x07;
1494 char ctype_length = record->payload_s.buffer[1];
1497 case NET_NFC_RECORD_MIME_TYPE: /* Media Type as defined in [RFC 2046] */
1498 if (strncmp((char *)&record->payload_s.buffer[2],
1499 CONN_HANDOVER_BT_CARRIER_MIME_NAME,
1500 (size_t)ctype_length) == 0)
1502 *type = NET_NFC_CONN_HANDOVER_CARRIER_BT;
1504 else if (strncmp((char *)&record->payload_s.buffer[2],
1505 CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME,
1506 (size_t)ctype_length) == 0)
1508 *type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS;
1510 else if (strncmp((char *)&record->payload_s.buffer[2],
1511 CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME,
1512 (size_t)ctype_length) == 0)
1514 *type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS;
1518 *type = NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
1521 case NET_NFC_RECORD_WELL_KNOWN_TYPE: /* NFC Forum Well-known Type*/
1522 case NET_NFC_RECORD_URI: /* Absolute URIs as defined in [RFC 3986] */
1523 case NET_NFC_RECORD_EXTERNAL_RTD: /* NFC Forum external type */
1525 *type = NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
1532 NFC_DBG("Other record type");
1533 if (strncmp((char *)record->type_s.buffer, CONN_HANDOVER_BT_CARRIER_MIME_NAME,
1534 (size_t)record->type_s.length) == 0)
1536 *type = NET_NFC_CONN_HANDOVER_CARRIER_BT;
1538 else if (strncmp((char *)record->type_s.buffer,
1539 CONN_HANDOVER_WIFI_BSS_CARRIER_MIME_NAME,
1540 (size_t)record->type_s.length) == 0)
1542 *type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS;
1544 else if (strncmp((char *)record->type_s.buffer,
1545 CONN_HANDOVER_WIFI_IBSS_CARRIER_MIME_NAME,
1546 (size_t)record->type_s.length) == 0)
1548 *type = NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS;
1552 *type = NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
1558 net_nfc_error_e net_nfc_util_get_alternative_carrier_type(ndef_message_s *message,
1559 int index, net_nfc_conn_handover_carrier_type_e *type)
1561 ndef_record_s *record = NULL;
1562 net_nfc_error_e ret;
1564 ret = net_nfc_util_get_carrier_config_record(message, index, &record);
1565 if (ret != NET_NFC_OK)
1568 return net_nfc_util_get_alternative_carrier_type_from_record(record, type);
1571 net_nfc_error_e net_nfc_util_get_selector_power_status(ndef_message_s *message,
1572 net_nfc_conn_handover_carrier_state_e *power_state)
1574 net_nfc_error_e error;
1575 ndef_message_s *inner_msg = NULL;
1576 ndef_record_s *current = NULL;
1578 net_nfc_conn_handover_carrier_state_e selector_state;
1580 selector_state = NET_NFC_CONN_HANDOVER_CARRIER_INACTIVATE;
1582 if (message == NULL)
1584 return NET_NFC_NULL_PARAMETER;
1587 if ((error = net_nfc_util_create_ndef_message(&inner_msg)) == NET_NFC_OK)
1589 if ((error = __net_nfc_get_inner_message(message, inner_msg)) == NET_NFC_OK)
1591 if (inner_msg->recordCount > 1)
1593 current = inner_msg->records;
1594 for (idx = 0; idx < inner_msg->recordCount; idx++)
1596 if (strncmp((char *)current->type_s.buffer, ALTERNATIVE_RECORD_TYPE,
1597 (size_t)current->type_s.length) == 0)
1599 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))
1601 selector_state = NET_NFC_CONN_HANDOVER_CARRIER_ACTIVATE;
1605 current = current->next;
1610 /* always activate when ac is only one */
1611 selector_state = NET_NFC_CONN_HANDOVER_CARRIER_ACTIVATE;
1614 *power_state = selector_state;
1618 NFC_ERR("_net_nfc_util_create_ndef_message failed [%d]", error);
1621 net_nfc_util_free_ndef_message(inner_msg);
1625 NFC_ERR("_net_nfc_util_create_ndef_message failed [%d]", error);
1626 error = NET_NFC_ALLOC_FAIL;