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.
17 #include "net_nfc_server_handover.h"
18 #include "net_nfc_debug_internal.h"
19 #include "net_nfc_util_internal.h"
20 #include "net_nfc_util_ndef_message.h"
21 #include "net_nfc_util_ndef_record.h"
22 #include "net_nfc_util_handover.h"
23 #include "net_nfc_server_controller.h"
24 #include "net_nfc_server_llcp.h"
25 #include "net_nfc_server_process_handover.h"
26 #include "net_nfc_server_process_snep.h"
27 #include "net_nfc_util_gdbus_internal.h"
28 #include "net_nfc_server_handover_bss.h"
29 //#include "net_nfc_server_handover_bt.h"
31 typedef void (*_net_nfc_server_handover_create_carrier_msg_cb)(
32 net_nfc_error_e result,
33 ndef_message_s *selector,
36 typedef struct _net_nfc_handover_context_t
38 net_nfc_target_handle_s *handle;
39 net_nfc_error_e result;
40 net_nfc_llcp_socket_t socket;
42 net_nfc_conn_handover_carrier_type_e type;
44 ndef_record_s *record;
47 net_nfc_handover_context_t;
49 #define NET_NFC_CH_CONTEXT \
50 net_nfc_target_handle_s *handle;\
51 net_nfc_llcp_socket_t socket;\
52 net_nfc_error_e result;\
54 net_nfc_conn_handover_carrier_type_e type;\
57 typedef struct _net_nfc_server_handover_create_config_context_t
59 net_nfc_target_handle_s *handle;
60 net_nfc_llcp_socket_t socket;
61 net_nfc_error_e result;
63 net_nfc_conn_handover_carrier_type_e type;
65 // TODO: above value MUST be same with NET_NFC_CH_CONTEXT
67 _net_nfc_server_handover_create_carrier_msg_cb cb;
68 net_nfc_conn_handover_carrier_type_e current_type;
69 ndef_message_s *ndef_message;
70 ndef_message_s *requester; /* for low power selector */
72 ndef_record_s *record;
74 net_nfc_server_handover_create_config_context_t;
76 typedef struct _net_nfc_server_handover_process_config_context_t
78 net_nfc_target_handle_s *handle;
79 net_nfc_llcp_socket_t socket;
80 net_nfc_error_e result;
82 net_nfc_conn_handover_carrier_type_e type;
84 // TODO: above value MUST be same with NET_NFC_CH_CONTEXT */
86 net_nfc_server_handover_process_carrier_record_cb cb;
87 }net_nfc_server_handover_process_config_context_t;
90 static void _net_nfc_server_handover_send_response(net_nfc_error_e result,
91 net_nfc_conn_handover_carrier_type_e carrier,
95 static void _net_nfc_server_handover_client_process(
96 net_nfc_handover_context_t *context);
98 static void _net_nfc_server_handover_client_error_cb(
99 net_nfc_error_e result,
100 net_nfc_target_handle_s *handle,
101 net_nfc_llcp_socket_t socket,
105 static void _net_nfc_server_handover_client_connected_cb(
106 net_nfc_error_e result,
107 net_nfc_target_handle_s *handle,
108 net_nfc_llcp_socket_t socket,
112 static void _net_nfc_server_handover_bss_get_carrier_record_cb(
113 net_nfc_error_e result,
114 net_nfc_conn_handover_carrier_state_e cps,
115 ndef_record_s *carrier,
116 uint32_t aux_data_count,
117 ndef_record_s *aux_data,
120 static void _net_nfc_server_handover_bss_process_carrier_record_cb(
121 net_nfc_error_e result,
122 net_nfc_conn_handover_carrier_type_e type,
125 static void _net_nfc_server_handover_get_response_process(
126 net_nfc_handover_context_t *context);
128 static net_nfc_error_e
129 _net_nfc_server_handover_create_requester_from_rawdata(
130 ndef_message_s **requestor,
133 static net_nfc_error_e
134 _net_nfc_server_handover_create_requester_carrier_configs(
135 net_nfc_conn_handover_carrier_type_e type,
139 static bool _net_nfc_server_handover_check_hr_record_validation(
140 ndef_message_s *message);
142 static bool _net_nfc_server_handover_check_hs_record_validation(
143 ndef_message_s *message);
145 static net_nfc_error_e
146 _net_nfc_server_handover_create_selector_carrier_configs(
147 net_nfc_conn_handover_carrier_type_e type,
151 static int _net_nfc_server_handover_iterate_create_carrier_configs(
152 net_nfc_server_handover_create_config_context_t *context);
154 static int _net_nfc_server_handover_iterate_carrier_configs_to_next(
155 net_nfc_server_handover_create_config_context_t *context);
157 static int _net_nfc_server_handover_iterate_carrier_configs_step(
158 net_nfc_server_handover_create_config_context_t *context);
160 static void _net_nfc_server_handover_server_process(
161 net_nfc_handover_context_t *context);
163 ////////////////////////////////////////////////////////////////////////////
165 static void _net_nfc_server_handover_send_response(
166 net_nfc_error_e result,
167 net_nfc_conn_handover_carrier_type_e carrier,
171 HandoverRequestData *handover_data = user_param;
173 g_assert(handover_data != NULL);
174 g_assert(handover_data->invocation != NULL);
175 g_assert(handover_data->handoverobj != NULL);
177 net_nfc_gdbus_handover_complete_request(
178 handover_data->handoverobj,
179 handover_data->invocation,
182 net_nfc_util_gdbus_data_to_variant(ac_data));
184 if (handover_data->data)
186 g_free(handover_data->data->buffer);
187 g_free(handover_data->data);
190 g_object_unref(handover_data->invocation);
191 g_object_unref(handover_data->handoverobj);
193 g_free(handover_data);
196 static net_nfc_error_e _net_nfc_server_handover_convert_ndef_message_to_data(
197 ndef_message_s *msg, data_s *data)
200 net_nfc_error_e result;
202 RETV_IF(NULL == msg, NET_NFC_INVALID_PARAM);
203 RETV_IF(NULL == data, NET_NFC_INVALID_PARAM);
205 length = net_nfc_util_get_ndef_message_length(msg);
208 net_nfc_util_alloc_data(data, length);
209 result = net_nfc_util_convert_ndef_message_to_rawdata(msg, data);
213 result = NET_NFC_INVALID_PARAM;
219 static void _net_nfc_server_handover_bss_get_carrier_record_cb(
220 net_nfc_error_e result,
221 net_nfc_conn_handover_carrier_state_e cps,
222 ndef_record_s *carrier,
223 uint32_t aux_data_count,
224 ndef_record_s *aux_data,
227 net_nfc_server_handover_create_config_context_t *context = user_param;
229 /* append record to ndef message */
230 if (NET_NFC_OK == result)
232 ndef_record_s *record;
234 net_nfc_util_create_record(carrier->TNF, &carrier->type_s, &carrier->id_s,
235 &carrier->payload_s, &record);
237 result = net_nfc_util_append_carrier_config_record(context->ndef_message,
239 if (NET_NFC_OK == result)
241 NFC_DBG("net_nfc_util_append_carrier_config_record success");
245 NFC_ERR("net_nfc_util_append_carrier_config_record failed [%d]", result);
246 net_nfc_util_free_record(record);
249 g_idle_add((GSourceFunc)_net_nfc_server_handover_iterate_carrier_configs_to_next,
253 /* don't free context */
256 static void _net_nfc_server_handover_bss_process_carrier_record_cb(
257 net_nfc_error_e result,
258 net_nfc_conn_handover_carrier_type_e type,
262 net_nfc_server_handover_process_config_context_t *context = user_param;
266 if (context->cb != NULL)
267 context->cb(result, type, data, context->user_param);
269 NFC_ERR("Invalid Callback");
271 _net_nfc_util_free_mem(context);
276 net_nfc_server_handover_get_carrier_record_by_priority_order(
277 ndef_message_s *request,
278 ndef_record_s **record)
280 net_nfc_error_e result;
281 unsigned int carrier_count = 0;
283 LOGD("[%s] START", __func__);
285 RETV_IF(NULL == request, NET_NFC_NULL_PARAMETER);
286 RETV_IF(NULL == record, NET_NFC_NULL_PARAMETER);
290 result = net_nfc_util_get_alternative_carrier_record_count(request, &carrier_count);
291 if (NET_NFC_OK == result)
294 net_nfc_conn_handover_carrier_type_e carrier_type =
295 NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
297 for (priority = NET_NFC_CONN_HANDOVER_CARRIER_BT;*record == NULL
298 && priority < NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;priority++)
300 /* check each carrier record and create matched record */
301 for (idx = 0; idx < carrier_count; idx++)
303 result = net_nfc_util_get_alternative_carrier_type(request, idx,
306 if ((NET_NFC_OK == result) && (carrier_type == priority))
308 NFC_DBG("selected carrier type = [%d]", carrier_type);
309 net_nfc_util_get_carrier_config_record(request, idx, record);
318 NFC_ERR("net_nfc_util_get_alternative_carrier_record_count failed");
321 LOGD("[%s] END", __func__);
326 static net_nfc_error_e _net_nfc_server_handover_create_requester_from_rawdata(
327 ndef_message_s **requestor, data_s *data)
329 net_nfc_error_e result;
331 if (NULL == requestor)
332 return NET_NFC_NULL_PARAMETER;
336 result = net_nfc_util_create_ndef_message(requestor);
337 if (result == NET_NFC_OK)
339 result = net_nfc_util_convert_rawdata_to_ndef_message(data, *requestor);
341 if (result == NET_NFC_OK)
343 if (_net_nfc_server_handover_check_hr_record_validation(*requestor) == true)
349 NFC_ERR("record is not valid or is not available");
350 net_nfc_util_free_ndef_message(*requestor);
351 result = NET_NFC_INVALID_PARAM;
356 NFC_ERR("_net_nfc_ndef_rawdata_to_ndef failed [%d]",result);
359 NFC_ERR("net_nfc_util_create_ndef_message failed [%d]", result);
365 net_nfc_error_e net_nfc_server_handover_create_selector_from_rawdata(
366 ndef_message_s **selector, data_s *data)
368 net_nfc_error_e result;
370 if (NULL == selector)
371 return NET_NFC_NULL_PARAMETER;
375 if ((result = net_nfc_util_create_ndef_message(selector)) == NET_NFC_OK)
377 result = net_nfc_util_convert_rawdata_to_ndef_message(data, *selector);
378 if (NET_NFC_OK == result)
380 /* if record is not Hs record, then */
381 if (_net_nfc_server_handover_check_hs_record_validation(*selector) == true)
387 NFC_ERR("record is not valid or is not available");
388 net_nfc_util_free_ndef_message(*selector);
389 result = NET_NFC_INVALID_PARAM;
394 NFC_ERR("_net_nfc_ndef_rawdata_to_ndef failed [%d]",result);
399 NFC_ERR("_net_nfc_util_create_ndef_message failed [%d]",result);
405 static bool _net_nfc_server_handover_check_hr_record_validation(
406 ndef_message_s *message)
412 LOGD("[%s] START", __func__);
417 rec = (ndef_record_s *)message->records;
419 if (memcmp(rec->type_s.buffer, CH_REQ_RECORD_TYPE, rec->type_s.length) != 0)
421 NFC_ERR("This is not connection handover request message");
425 if (rec->payload_s.buffer[0] != CH_VERSION)
427 NFC_ERR("connection handover version is not matched");
431 ret = net_nfc_util_get_alternative_carrier_record_count(message, &count);
432 if (ret != NET_NFC_OK || 0 == count)
434 NFC_ERR("there is no carrier reference");
438 LOGD("[%s] END", __func__);
443 LOGD("[%s] END", __func__);
448 static bool _net_nfc_server_handover_check_hs_record_validation(
449 ndef_message_s *message)
455 LOGD("[%s] START", __func__);
460 rec = (ndef_record_s *)message->records;
462 if (memcmp(rec->type_s.buffer, CH_SEL_RECORD_TYPE, rec->type_s.length) != 0)
464 NFC_ERR("This is not connection handover request message");
468 ret = net_nfc_util_get_alternative_carrier_record_count(message,&count);
469 if (ret != NET_NFC_OK || 0 == count)
471 NFC_ERR("there is no carrrier reference");
476 if (rec->payload_s.buffer[0] != CH_VERSION)
478 NFC_ERR("connection handover version is not matched");
482 LOGD("[%s] END", __func__);
487 LOGD("[%s] END", __func__);
492 static int _net_nfc_server_handover_iterate_carrier_configs_step(
493 net_nfc_server_handover_create_config_context_t *context)
495 LOGD("[%s:%d] START", __func__, __LINE__);
497 RETV_IF(NULL == context, 0);
499 if (context->cb != NULL)
500 context->cb(NET_NFC_OK, context->ndef_message, context->user_param);
502 if (context->ndef_message != NULL)
503 net_nfc_util_free_ndef_message(context->ndef_message);
505 _net_nfc_util_free_mem(context);
507 LOGD("[%s:%d] END", __func__, __LINE__);
512 static int _net_nfc_server_handover_iterate_carrier_configs_to_next(
513 net_nfc_server_handover_create_config_context_t *context)
515 if (context->result == NET_NFC_OK || context->result == NET_NFC_BUSY)
517 if (context->type == NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN)
519 if (context->current_type < NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN)
520 context->current_type++;
524 context->current_type = NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
527 g_idle_add((GSourceFunc)_net_nfc_server_handover_iterate_create_carrier_configs,
532 NFC_ERR("context->result is error [%d]", context->result);
534 g_idle_add((GSourceFunc)_net_nfc_server_handover_iterate_carrier_configs_step,
541 static int _net_nfc_server_handover_iterate_create_carrier_configs(
542 net_nfc_server_handover_create_config_context_t *context)
544 LOGD("[%s:%d] START", __func__, __LINE__);
545 net_nfc_error_e result = NET_NFC_OK;
547 switch (context->current_type)
550 case NET_NFC_CONN_HANDOVER_CARRIER_BT :
551 NFC_DBG("[NET_NFC_CONN_HANDOVER_CARRIER_BT]");
552 net_nfc_server_handover_bt_get_carrier_record(
553 _net_nfc_server_handover_bt_get_carrier_record_cb, context);
556 case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS :
557 NFC_DBG("[NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS]");
560 if(memcmp(context->ndef_message->records->type_s.buffer ,CH_SEL_RECORD_TYPE,
561 context->ndef_message->records->type_s.length)==0)
563 result = net_nfc_server_handover_bss_wfd_get_carrier_record(
564 _net_nfc_server_handover_bss_get_carrier_record_cb, context);
569 result = net_nfc_server_handover_bss_get_carrier_record(
570 _net_nfc_server_handover_bss_get_carrier_record_cb, context);
572 NFC_DBG("[%d]",result);
575 // case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS :
576 // NFC_DBG("[NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS]");
578 // (GSourceFunc)_net_nfc_server_handover_append_wifi_carrier_config,
582 case NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN :
583 NFC_DBG("[NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN]");
584 g_idle_add((GSourceFunc)_net_nfc_server_handover_iterate_carrier_configs_step,
589 NFC_DBG("[unknown : %d]", context->current_type);
590 g_idle_add((GSourceFunc)_net_nfc_server_handover_iterate_carrier_configs_step,
595 LOGD("[%s:%d] END", __func__, __LINE__);
600 static net_nfc_error_e
601 _net_nfc_server_handover_create_requester_carrier_configs(
602 net_nfc_conn_handover_carrier_type_e type, void *cb, void *user_param)
604 net_nfc_error_e result = NET_NFC_OK;
605 net_nfc_server_handover_create_config_context_t *context = NULL;
607 LOGD("[%s:%d] START", __func__, __LINE__);
609 _net_nfc_util_alloc_mem(context, sizeof(*context));
612 context->type = type;
613 if (type == NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN)
614 context->current_type = NET_NFC_CONN_HANDOVER_CARRIER_BT;
616 context->current_type = context->type;
619 context->user_param = user_param;
620 net_nfc_util_create_handover_request_message(&context->ndef_message);
622 /* append carrier record */
623 g_idle_add((GSourceFunc)_net_nfc_server_handover_iterate_create_carrier_configs,
628 NFC_ERR("alloc failed");
629 result = NET_NFC_ALLOC_FAIL;
632 LOGD("[%s:%d] END", __func__, __LINE__);
637 static net_nfc_error_e
638 _net_nfc_server_handover_create_selector_carrier_configs(
639 net_nfc_conn_handover_carrier_type_e type, void *cb, void *user_param)
641 net_nfc_error_e result = NET_NFC_OK;
642 net_nfc_server_handover_create_config_context_t *context = NULL;
644 LOGD("[%s:%d] START", __func__, __LINE__);
646 _net_nfc_util_alloc_mem(context, sizeof(*context));
649 context->type = type;
650 if (type == NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN)
651 context->current_type = NET_NFC_CONN_HANDOVER_CARRIER_BT;
653 context->current_type = context->type;
656 context->user_param = user_param;
657 net_nfc_util_create_handover_select_message(&context->ndef_message);
659 /* append carrier record */
660 g_idle_add((GSourceFunc)_net_nfc_server_handover_iterate_create_carrier_configs,
665 NFC_ERR("alloc failed");
666 result = NET_NFC_ALLOC_FAIL;
669 LOGD("[%s:%d] END", __func__, __LINE__);
674 net_nfc_error_e net_nfc_server_handover_process_carrier_record(
675 ndef_record_s *carrier, void *cb, void *user_param)
677 net_nfc_error_e result = NET_NFC_OK;
678 net_nfc_server_handover_process_config_context_t *context = NULL;
680 LOGD("[%s:%d] START", __func__, __LINE__);
682 _net_nfc_util_alloc_mem(context, sizeof(*context));
685 net_nfc_conn_handover_carrier_type_e type;
687 net_nfc_util_get_alternative_carrier_type_from_record(carrier, &type);
689 context->type = type;
690 context->user_param = user_param;
692 context->step = NET_NFC_LLCP_STEP_01;
694 /* process carrier record */
698 case NET_NFC_CONN_HANDOVER_CARRIER_BT :
699 NFC_DBG("[NET_NFC_CONN_HANDOVER_CARRIER_BT]");
700 net_nfc_server_handover_bt_process_carrier_record(carrier,
701 _net_nfc_server_handover_bt_process_carrier_record_cb, context);
705 case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS :
706 NFC_DBG("[NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS]");
707 net_nfc_server_handover_bss_process_carrier_record(carrier,
708 _net_nfc_server_handover_bss_process_carrier_record_cb, context);
711 case NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN :
712 NFC_DBG("[NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN]");
713 _net_nfc_util_free_mem(context);
717 NFC_DBG("[unknown]");
718 _net_nfc_util_free_mem(context);
724 NFC_ERR("alloc failed");
725 result = NET_NFC_ALLOC_FAIL;
728 LOGD("[%s:%d] END", __func__, __LINE__);
733 static net_nfc_error_e _net_nfc_server_handover_select_carrier_record(
734 ndef_message_s *request,
735 net_nfc_conn_handover_carrier_type_e *type,
736 ndef_record_s **record)
739 net_nfc_error_e result;
742 *type = NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
744 /* get requester message */
745 result = net_nfc_util_get_alternative_carrier_record_count(request, &count);
746 if (NET_NFC_OK == result)
748 if (1/* power state */ || 1 == count)
752 /* fill alternative carrier information */
753 result = net_nfc_server_handover_get_carrier_record_by_priority_order(
755 if (NET_NFC_OK == result)
757 result = net_nfc_util_get_alternative_carrier_type_from_record(temp, type);
758 if (NET_NFC_OK == result)
760 net_nfc_util_create_record(temp->TNF, &temp->type_s, &temp->id_s,
761 &temp->payload_s, record);
765 NFC_ERR("net_nfc_util_get_alternative"
766 "_carrier_type_from_record failed [%d]", result);
771 NFC_ERR("_handover_get_carrier_record_by_priority_order failed [%d]", result);
774 else /* low power && count > 1 */
776 result = NET_NFC_INVALID_STATE;
781 NFC_ERR("net_nfc_util_get_alternative_carrier_record_count failed [%d]", result);
787 static void _net_nfc_server_handover_create_carrier_configs_2_cb(
788 net_nfc_error_e result, ndef_message_s *selector, void *user_param)
790 net_nfc_handover_context_t *context = user_param;
792 RET_IF(NULL == context);
794 NFC_DBG("_net_nfc_server_handover_server_create_carrier_config_cb result [%d]",
797 context->result = result;
799 if (NET_NFC_OK == result)
801 result = _net_nfc_server_handover_convert_ndef_message_to_data(
802 selector, &context->data);
804 NFC_DBG("selector message created, length [%d]", context->data.length);
806 context->state = NET_NFC_LLCP_STEP_03;
810 NFC_ERR("_net_nfc_server_handover_create_selector_msg failed [%d]", result);
811 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
814 _net_nfc_server_handover_get_response_process(context);
817 static void _net_nfc_server_handover_process_carrier_record_2_cb(
818 net_nfc_error_e result,
819 net_nfc_conn_handover_carrier_type_e type,
823 net_nfc_handover_context_t *context = (net_nfc_handover_context_t *)user_param;
825 NFC_DBG("_net_nfc_server_handover_server_process_carrier_record_cb result [%d]",
828 context->result = result;
829 if (NET_NFC_OK == result)
830 context->state = NET_NFC_LLCP_STEP_04;
832 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
834 context->data.length = data->length;
835 _net_nfc_util_alloc_mem(context->data.buffer, context->data.length);
836 memcpy(context->data.buffer, data->buffer, context->data.length);
839 _net_nfc_server_handover_server_process(context);
842 static void _net_nfc_server_handover_get_response_process(
843 net_nfc_handover_context_t *context)
845 net_nfc_error_e result;
847 RET_IF(NULL == context);
849 switch (context->state)
851 case NET_NFC_LLCP_STEP_02 :
852 NFC_DBG("NET_NFC_LLCP_STEP_02");
854 result = _net_nfc_server_handover_create_selector_carrier_configs(
855 context->type, _net_nfc_server_handover_create_carrier_configs_2_cb, context);
857 if (result != NET_NFC_OK)
859 NFC_ERR("_net_nfc_server_handover_create_"
860 "selector_carrier_config failed [%d]",result);
864 case NET_NFC_LLCP_STEP_03 :
865 NFC_DBG("NET_NFC_LLCP_STEP_03");
867 result = net_nfc_server_handover_process_carrier_record(
869 _net_nfc_server_handover_process_carrier_record_2_cb,
872 if (result != NET_NFC_OK)
874 NFC_ERR("net_nfc_server_handover_process_carrier_record failed [%d]",result);
878 case NET_NFC_LLCP_STEP_04 :
879 NFC_DBG("NET_NFC_LLCP_STEP_04");
881 /* response select message */
882 // TODO: context->handle may is not valid type. we should find a right function or parameter
883 result = net_nfc_server_snep_server_send_get_response(
884 (net_nfc_snep_handle_h)context->handle, &context->data);
887 case NET_NFC_STATE_ERROR :
888 NFC_DBG("NET_NFC_STATE_ERROR");
892 NFC_ERR("NET_NFC_LLCP_STEP_??");
898 static bool _net_nfc_server_handover_get_response_cb(
899 net_nfc_snep_handle_h handle,
905 net_nfc_error_e result;
906 ndef_message_s *request;
908 RETV_IF(NULL == data, false);
909 RETV_IF(NULL == data->buffer, false);
911 NFC_DBG("type [%d], data [%p], user_param [%p]", type, data, user_param);
913 /* TODO : send select response to requester */
914 result = _net_nfc_server_handover_create_requester_from_rawdata(&request, data);
916 if (NET_NFC_OK == result)
918 ndef_record_s *record;
919 net_nfc_conn_handover_carrier_type_e type;
921 result = _net_nfc_server_handover_select_carrier_record(request, &type, &record);
922 if (NET_NFC_OK == result)
924 net_nfc_handover_context_t *context = NULL;
926 _net_nfc_util_alloc_mem(context, sizeof(*context));
930 context->handle = (void *)handle;
931 context->type = type;
932 context->user_param = user_param;
933 context->state = NET_NFC_LLCP_STEP_02;
935 net_nfc_util_create_record(record->TNF, &record->type_s, &record->id_s,
936 &record->payload_s, &context->record);
938 _net_nfc_server_handover_get_response_process(context);
942 NFC_ERR("_net_nfc_util_alloc_mem failed");
943 result = NET_NFC_ALLOC_FAIL;
951 net_nfc_util_free_ndef_message(request);
955 NFC_ERR("it is not handover requester message, [%d]", result);
958 return (NET_NFC_OK == result);
961 ////////////////////////////////////////////////////////////////////////////////
962 static void _net_nfc_server_handover_server_process_carrier_record_cb(
963 net_nfc_error_e result,
964 net_nfc_conn_handover_carrier_type_e type,
968 net_nfc_handover_context_t *context = user_param;
970 NFC_DBG("_net_nfc_server_handover_server_process_carrier_record_cb result [%d]",
973 context->result = result;
975 if (NET_NFC_OK == result)
976 context->state = NET_NFC_LLCP_STEP_04;
978 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
980 _net_nfc_server_handover_server_process(context);
983 static void _net_nfc_server_handover_server_create_carrier_config_cb(
984 net_nfc_error_e result, ndef_message_s *selector, void *user_param)
986 net_nfc_conn_handover_carrier_type_e type;
987 net_nfc_handover_context_t *context = user_param;
989 RET_IF(NULL == context);
991 NFC_DBG("_net_nfc_server_handover_server_create_carrier_config_cb,result [%d]",
994 context->result = result;
996 net_nfc_util_get_alternative_carrier_type_from_record(context->record, &type);
997 if (NET_NFC_OK == result)
999 result = _net_nfc_server_handover_convert_ndef_message_to_data(
1000 selector, &context->data);
1001 NFC_DBG("selector message created, length [%d]", context->data.length);
1002 if(type == NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS)
1003 context->state = NET_NFC_LLCP_STEP_04;
1005 context->state = NET_NFC_LLCP_STEP_03;
1009 NFC_ERR("_net_nfc_server_handover_create_selector_msg failed [%d]", result);
1010 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
1013 _net_nfc_server_handover_server_process(context);
1016 static void _net_nfc_server_handover_server_recv_cb(
1017 net_nfc_error_e result,
1018 net_nfc_target_handle_s *handle,
1019 net_nfc_llcp_socket_t socket,
1023 net_nfc_error_e ret;
1024 ndef_message_s *request;
1025 net_nfc_handover_context_t *context = user_param;
1027 NFC_DBG("_net_nfc_server_handover_server_recv_cb, socket [%x], result [%d]",
1030 context->result = result;
1032 if (NET_NFC_OK == result)
1034 result = _net_nfc_server_handover_create_requester_from_rawdata(&request, data);
1036 if (NET_NFC_OK == result)
1038 ndef_record_s *record;
1040 ret = _net_nfc_server_handover_select_carrier_record(request,
1041 &context->type, &record);
1043 if (NET_NFC_OK == ret)
1045 net_nfc_util_create_record(record->TNF, &record->type_s, &record->id_s,
1046 &record->payload_s, &context->record);
1048 context->state = NET_NFC_LLCP_STEP_02;
1053 context->state = NET_NFC_LLCP_STEP_06;
1056 net_nfc_util_free_ndef_message(request);
1060 NFC_ERR("_net_nfc_server_handover_create"
1061 "_requester_from_rawdata failed [%d]",result);
1062 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
1067 NFC_ERR("net_nfc_server_llcp_simple_receive failed [%d]", result);
1068 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
1071 _net_nfc_server_handover_server_process(context);
1074 static void _net_nfc_server_handover_server_send_cb(net_nfc_error_e result,
1075 net_nfc_target_handle_s *handle,
1076 net_nfc_llcp_socket_t socket,
1080 net_nfc_handover_context_t *context = user_param;
1082 NFC_DBG("_net_nfc_server_handover_server_send_cb socket[%x], result[%d]",
1085 context->result = result;
1087 if (NET_NFC_OK == result)
1089 context->state = NET_NFC_LLCP_STEP_01;
1090 net_nfc_util_free_data(&context->data);
1091 net_nfc_util_free_record(context->record);
1092 context->record = NULL;
1096 NFC_ERR("net_nfc_server_llcp_simple_send failed [%d]", result);
1097 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
1100 _net_nfc_server_handover_server_process(context);
1103 static void _net_nfc_server_handover_server_process(
1104 net_nfc_handover_context_t *context)
1106 RET_IF(NULL == context);
1108 switch (context->state)
1110 case NET_NFC_LLCP_STEP_01 :
1111 NFC_DBG("NET_NFC_LLCP_STEP_01");
1113 /* receive request message */
1114 net_nfc_server_llcp_simple_receive(context->handle, context->socket,
1115 _net_nfc_server_handover_server_recv_cb, context);
1118 case NET_NFC_LLCP_STEP_02 :
1119 NFC_DBG("NET_NFC_LLCP_STEP_02");
1121 context->result = _net_nfc_server_handover_create_selector_carrier_configs(
1123 _net_nfc_server_handover_server_create_carrier_config_cb,
1126 if (context->result != NET_NFC_OK)
1128 NFC_ERR("_net_nfc_server_handover_create_selector"
1129 "_carrier_configs failed [%d]", context->result);
1133 case NET_NFC_LLCP_STEP_03 :
1134 NFC_DBG("NET_NFC_LLCP_STEP_03");
1136 context->result = net_nfc_server_handover_process_carrier_record(
1138 _net_nfc_server_handover_server_process_carrier_record_cb,
1141 if (context->result != NET_NFC_OK)
1143 NFC_ERR("_net_nfc_server_handover_process_carrier_"
1144 "record failed [%d]",context->result);
1148 case NET_NFC_LLCP_STEP_04 :
1149 NFC_DBG("NET_NFC_LLCP_STEP_04");
1151 /* send select message */
1152 net_nfc_server_llcp_simple_send(context->handle, context->socket, &context->data,
1153 _net_nfc_server_handover_server_send_cb, context);
1156 case NET_NFC_STATE_ERROR :
1157 NFC_DBG("NET_NFC_STATE_ERROR");
1159 /* error, invoke callback */
1160 NFC_ERR("handover_server failed, [%d]", context->result);
1166 NFC_ERR("NET_NFC_LLCP_STEP_??");
1172 static void _net_nfc_server_handover_server_error_cb(
1173 net_nfc_error_e result,
1174 net_nfc_target_handle_s *handle,
1175 net_nfc_llcp_socket_t socket,
1179 net_nfc_handover_context_t *context = user_param;
1181 NFC_ERR("result [%d], socket [%x], user_param [%p]", result, socket, user_param);
1183 RET_IF(NULL == context);
1185 net_nfc_controller_llcp_socket_close(socket, &result);
1187 net_nfc_util_free_record(context->record);
1188 net_nfc_util_free_data(&context->data);
1189 _net_nfc_util_free_mem(user_param);
1192 static void _net_nfc_server_handover_server_incomming_cb(
1193 net_nfc_error_e result,
1194 net_nfc_target_handle_s *handle,
1195 net_nfc_llcp_socket_t socket,
1199 net_nfc_handover_context_t *accept_context = NULL;
1201 NFC_DBG("result[%d], socket[%x], user_param[%p]", result, socket, user_param);
1203 _net_nfc_util_alloc_mem(accept_context, sizeof(*accept_context));
1204 if (NULL == accept_context)
1206 NFC_ERR("_net_nfc_util_alloc_mem failed");
1208 result = NET_NFC_ALLOC_FAIL;
1212 accept_context->handle = handle;
1213 accept_context->socket = socket;
1214 accept_context->state = NET_NFC_LLCP_STEP_01;
1216 result = net_nfc_server_llcp_simple_accept(handle, socket,
1217 _net_nfc_server_handover_server_error_cb, accept_context);
1219 if (result != NET_NFC_OK)
1221 NFC_ERR("net_nfc_server_llcp_simple_accept failed, [%d]", result);
1226 _net_nfc_server_handover_server_process(accept_context);
1231 if (accept_context != NULL)
1232 _net_nfc_util_free_mem(accept_context);
1234 net_nfc_controller_llcp_socket_close(socket, &result);
1236 /* TODO : restart ?? */
1239 net_nfc_error_e net_nfc_server_handover_default_server_start(
1240 net_nfc_target_handle_s *handle)
1242 net_nfc_error_e result;
1244 /* start default handover server using snep */
1245 result = net_nfc_server_snep_default_server_register_get_response_cb(
1246 _net_nfc_server_handover_get_response_cb, NULL);
1248 /* start default handover server */
1249 result = net_nfc_server_llcp_simple_server(
1253 _net_nfc_server_handover_server_incomming_cb,
1254 _net_nfc_server_handover_server_error_cb,
1257 if (NET_NFC_OK == result)
1258 NFC_DBG("start handover server, san[%s], sap[%d]", CH_SAN, CH_SAP);
1260 NFC_ERR("net_nfc_server_llcp_simple_server failed, [%d]", result);
1265 static void _handover_default_activate_cb(int event,
1266 net_nfc_target_handle_s *handle,uint32_t sap, const char *san, void *user_param)
1268 net_nfc_error_e result;
1270 NFC_DBG("event [%d], handle [%p], sap [%d], san [%s]", event, handle, sap, san);
1272 if (NET_NFC_LLCP_START == event)
1274 /* start default handover server using snep */
1275 result = net_nfc_server_snep_default_server_register_get_response_cb(
1276 _net_nfc_server_handover_get_response_cb, NULL);
1278 /* start default handover server */
1279 result = net_nfc_server_llcp_simple_server(handle,
1281 _net_nfc_server_handover_server_incomming_cb,
1282 _net_nfc_server_handover_server_error_cb, NULL);
1284 if (NET_NFC_OK == result)
1285 NFC_DBG("start handover server, san [%s], sap [%d]", CH_SAN, CH_SAP);
1287 NFC_ERR("net_nfc_service_llcp_server failed, [%d]", result);
1290 else if (NET_NFC_LLCP_UNREGISTERED == event)
1292 /* unregister server, do nothing */
1296 net_nfc_error_e net_nfc_server_handover_default_server_register()
1300 /* TODO : make id, */
1301 snprintf(id, sizeof(id), "%d", getpid());
1303 /* start default snep server */
1304 return net_nfc_server_llcp_register_service(id, CH_SAP, CH_SAN,
1305 _handover_default_activate_cb, NULL);
1308 net_nfc_error_e net_nfc_server_handover_default_server_unregister()
1312 /* TODO : make id, */
1313 snprintf(id, sizeof(id), "%d", getpid());
1315 /* start default snep server */
1316 return net_nfc_server_llcp_unregister_service(id, CH_SAP, CH_SAN);
1319 ////////////////////////////////////////////////////////////////////////////////
1321 static void _net_nfc_server_handover_client_process_carrier_record_cb(
1322 net_nfc_error_e result,
1323 net_nfc_conn_handover_carrier_type_e type,
1327 net_nfc_handover_context_t *context = user_param;
1329 NFC_DBG("_net_nfc_server_handover_server_process_carrier_record_cb, result[%d]",
1332 context->result = result;
1334 net_nfc_util_free_data(&context->data);
1336 if (NET_NFC_OK == result)
1338 if(context->type == NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS)
1340 context->state = NET_NFC_LLCP_STEP_RETURN;
1344 net_nfc_util_alloc_data(&context->data, data->length);
1345 memcpy(context->data.buffer, data->buffer, data->length);
1347 context->state = NET_NFC_LLCP_STEP_05;
1352 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
1355 _net_nfc_server_handover_client_process(context);
1358 static void _net_nfc_server_handover_client_recv_cb(net_nfc_error_e result,
1359 net_nfc_target_handle_s *handle,
1360 net_nfc_llcp_socket_t socket,
1364 net_nfc_handover_context_t *context = user_param;
1366 RET_IF(NULL == context);
1368 context->result = result;
1370 if (NET_NFC_OK == result)
1372 ndef_record_s *record;
1373 ndef_message_s *selector;
1375 result = net_nfc_server_handover_create_selector_from_rawdata(&selector, data);
1377 if (NET_NFC_OK == result)
1379 result = net_nfc_server_handover_get_carrier_record_by_priority_order(
1382 if (NET_NFC_OK == result)
1384 net_nfc_util_create_record(record->TNF, &record->type_s, &record->id_s,
1385 &record->payload_s, &context->record);
1387 context->state = NET_NFC_LLCP_STEP_04;
1391 NFC_ERR("_get_carrier_record_by_priority_order failed, [%d]",result);
1392 context->state = NET_NFC_STATE_ERROR;
1397 NFC_ERR("_net_nfc_server_handover_create"
1398 "_selector_from_rawdata failed, [%d]",result);
1399 context->state = NET_NFC_STATE_ERROR;
1404 NFC_ERR("net_nfc_server_llcp_simple_receive failed, [%d]", result);
1405 context->state = NET_NFC_STATE_ERROR;
1408 _net_nfc_server_handover_client_process(context);
1411 static void _net_nfc_server_handover_client_send_cb(net_nfc_error_e result,
1412 net_nfc_target_handle_s *handle,
1413 net_nfc_llcp_socket_t socket,
1417 net_nfc_handover_context_t *context = user_param;
1419 RET_IF(NULL == context);
1421 context->result = result;
1423 net_nfc_util_free_data(&context->data);
1425 if (NET_NFC_OK == result)
1427 context->state = NET_NFC_LLCP_STEP_03;
1431 NFC_ERR("net_nfc_server_llcp_simple_client failed, [%d]", result);
1432 context->state = NET_NFC_STATE_ERROR;
1435 _net_nfc_server_handover_client_process(context);
1438 static void _net_nfc_server_handover_client_create_carrier_configs_cb(
1439 net_nfc_error_e result, ndef_message_s *msg, void *user_param)
1441 net_nfc_handover_context_t *context = user_param;
1443 RET_IF(NULL == context);
1445 context->result = result;
1449 result = _net_nfc_server_handover_convert_ndef_message_to_data(msg, &context->data);
1450 if (NET_NFC_OK == result)
1452 context->state = NET_NFC_LLCP_STEP_02;
1456 NFC_ERR("_net_nfc_server_handover_convert_ndef_"
1457 "message_to_data failed [%d]",result);
1458 context->state = NET_NFC_STATE_ERROR;
1459 context->result = result;
1464 NFC_ERR("null param, [%d]", result);
1465 context->state = NET_NFC_STATE_ERROR;
1466 context->result = result;
1469 _net_nfc_server_handover_client_process(context);
1473 ////////////////////////////////////////////////////////////////////////////////
1474 static void _net_nfc_server_handover_client_process(
1475 net_nfc_handover_context_t *context)
1477 net_nfc_error_e result;
1479 RET_IF(NULL == context);
1481 switch (context->state)
1483 case NET_NFC_LLCP_STEP_01 :
1484 NFC_DBG("NET_NFC_LLCP_STEP_01");
1486 result = _net_nfc_server_handover_create_requester_carrier_configs(
1488 _net_nfc_server_handover_client_create_carrier_configs_cb,
1490 if (result != NET_NFC_OK)
1492 NFC_ERR("_net_nfc_server_handover_create_requester"
1493 "_carrier_configs failed [%d]",result);
1497 case NET_NFC_LLCP_STEP_02 :
1498 NFC_DBG("NET_NFC_LLCP_STEP_02");
1501 net_nfc_server_llcp_simple_send(context->handle, context->socket, &context->data,
1502 _net_nfc_server_handover_client_send_cb, context);
1505 case NET_NFC_LLCP_STEP_03 :
1506 NFC_DBG("NET_NFC_LLCP_STEP_03");
1508 /* receive response */
1509 net_nfc_server_llcp_simple_receive(context->handle, context->socket,
1510 _net_nfc_server_handover_client_recv_cb, context);
1513 case NET_NFC_LLCP_STEP_04 :
1514 NFC_DBG("NET_NFC_LLCP_STEP_04");
1516 result = net_nfc_server_handover_process_carrier_record(context->record,
1517 _net_nfc_server_handover_client_process_carrier_record_cb, context);
1519 if (result != NET_NFC_OK)
1520 NFC_ERR("net_nfc_server_handover_process_carrier_record failed [%d]",result);
1523 case NET_NFC_LLCP_STEP_05 :
1524 NFC_DBG("NET_NFC_LLCP_STEP_05");
1526 /* start post process */
1527 if (NET_NFC_CONN_HANDOVER_CARRIER_BT == context->type)
1530 net_nfc_server_handover_bt_post_process(&context->data,
1531 _net_nfc_server_handover_client_post_process_cb, context);
1536 NFC_ERR("not supported...");
1540 case NET_NFC_LLCP_STEP_RETURN :
1541 NFC_DBG("NET_NFC_LLCP_STEP_RETURN");
1543 /* complete and invoke callback */
1544 _net_nfc_server_handover_send_response(context->result, context->type,
1545 &context->data, context->user_param);
1547 net_nfc_util_free_data(&context->data);
1548 net_nfc_util_free_record(context->record);
1549 _net_nfc_util_free_mem(context);
1552 case NET_NFC_STATE_ERROR :
1554 NFC_ERR("NET_NFC_STATE_ERROR");
1556 _net_nfc_server_handover_send_response(context->result, context->type,
1557 NULL, context->user_param);
1564 static void _net_nfc_server_handover_client_connected_cb(
1565 net_nfc_error_e result,
1566 net_nfc_target_handle_s *handle,
1567 net_nfc_llcp_socket_t socket,
1571 NFC_DBG("result [%d], socket [%x], user_param [%p]", result, socket, user_param);
1573 HandoverRequestData *handover_data = NULL;
1574 handover_data = (HandoverRequestData *)user_param;
1575 if (NET_NFC_OK == result)
1577 net_nfc_handover_context_t *context = NULL;
1578 _net_nfc_util_alloc_mem(context, sizeof(*context));
1580 if (context != NULL)
1582 context->handle = handle;
1583 context->socket = socket;
1584 context->state = NET_NFC_LLCP_STEP_01;
1585 context->type = handover_data->type;
1586 context->user_param = user_param;
1587 _net_nfc_server_handover_client_process(context);
1591 NFC_ERR("_net_nfc_util_alloc_mem failed");
1592 result = NET_NFC_ALLOC_FAIL;
1597 NFC_ERR("net_nfc_server_llcp_simple_client"
1598 " failed, [%d]", result);
1602 static void _net_nfc_server_handover_client_error_cb(
1603 net_nfc_error_e result,
1604 net_nfc_target_handle_s *handle,
1605 net_nfc_llcp_socket_t socket,
1609 NFC_ERR("result [%d], socket [%x], user_param [%p]", result, socket, user_param);
1613 _net_nfc_server_handover_send_response(result,
1614 NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN, NULL, user_param);
1617 net_nfc_controller_llcp_socket_close(socket, &result);
1621 net_nfc_error_e net_nfc_server_handover_default_client_start(
1622 net_nfc_target_handle_s *handle, void *user_data)
1624 net_nfc_error_e result;
1626 result = net_nfc_server_llcp_simple_client(
1630 _net_nfc_server_handover_client_connected_cb,
1631 _net_nfc_server_handover_client_error_cb,
1634 if (result != NET_NFC_OK)
1635 NFC_ERR("net_nfc_server_llcp_simple_client failed, [%d]",result);