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.
17 #include "bluetooth-api.h"
18 #include "net_nfc_server_handover.h"
19 #include "net_nfc_debug_internal.h"
20 #include "net_nfc_util_internal.h"
21 #include "net_nfc_util_ndef_message.h"
22 #include "net_nfc_util_ndef_record.h"
23 #include "net_nfc_util_handover.h"
24 #include "net_nfc_server_controller.h"
25 #include "net_nfc_server_llcp.h"
26 #include "net_nfc_server_process_handover.h"
27 #include "net_nfc_server_process_snep.h"
28 #include "net_nfc_util_gdbus_internal.h"
29 #include "net_nfc_server_handover_bss.h"
30 #include "net_nfc_server_handover_bt.h"
32 typedef void (*_net_nfc_server_handover_create_carrier_msg_cb)(
33 net_nfc_error_e result,
34 ndef_message_s *selector,
37 typedef struct _net_nfc_handover_context_t
39 net_nfc_target_handle_s *handle;
40 net_nfc_error_e result;
41 net_nfc_llcp_socket_t socket;
43 net_nfc_conn_handover_carrier_type_e type;
45 ndef_record_s *record;
48 net_nfc_handover_context_t;
50 #define NET_NFC_CH_CONTEXT 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
61 _net_nfc_server_handover_create_carrier_msg_cb cb;
62 net_nfc_conn_handover_carrier_type_e current_type;
63 ndef_message_s *ndef_message;
64 ndef_message_s *requester; /* for low power selector */
66 ndef_record_s *record;
68 net_nfc_server_handover_create_config_context_t;
70 typedef struct _net_nfc_server_handover_process_config_context_t
74 net_nfc_server_handover_process_carrier_record_cb cb;
75 }net_nfc_server_handover_process_config_context_t;
79 static void _net_nfc_server_handover_send_response(
80 net_nfc_error_e result,
81 net_nfc_conn_handover_carrier_type_e carrier,
85 static void _net_nfc_server_handover_client_process(
86 net_nfc_handover_context_t *context);
88 static void _net_nfc_server_handover_client_error_cb(
89 net_nfc_error_e result,
90 net_nfc_target_handle_s *handle,
91 net_nfc_llcp_socket_t socket,
95 static void _net_nfc_server_handover_client_connected_cb(
96 net_nfc_error_e result,
97 net_nfc_target_handle_s *handle,
98 net_nfc_llcp_socket_t socket,
102 static void _net_nfc_server_handover_bss_get_carrier_record_cb(
103 net_nfc_error_e result,
104 net_nfc_conn_handover_carrier_state_e cps,
105 ndef_record_s *carrier,
106 uint32_t aux_data_count,
107 ndef_record_s *aux_data,
110 static void _net_nfc_server_handover_bss_process_carrier_record_cb(
111 net_nfc_error_e result,
112 net_nfc_conn_handover_carrier_type_e type,
115 static void _net_nfc_server_handover_get_response_process(
116 net_nfc_handover_context_t *context);
118 static net_nfc_error_e
119 _net_nfc_server_handover_create_requester_from_rawdata(
120 ndef_message_s **requestor,
123 static net_nfc_error_e
124 _net_nfc_server_handover_create_requester_carrier_configs(
125 net_nfc_conn_handover_carrier_type_e type,
129 static bool _net_nfc_server_handover_check_hr_record_validation(
130 ndef_message_s *message);
132 static bool _net_nfc_server_handover_check_hs_record_validation(
133 ndef_message_s *message);
135 static net_nfc_error_e
136 _net_nfc_server_handover_create_selector_carrier_configs(
137 net_nfc_conn_handover_carrier_type_e type,
141 static int _net_nfc_server_handover_iterate_create_carrier_configs(
142 net_nfc_server_handover_create_config_context_t *context);
144 static int _net_nfc_server_handover_iterate_carrier_configs_to_next(
145 net_nfc_server_handover_create_config_context_t *context);
147 static int _net_nfc_server_handover_iterate_carrier_configs_step(
148 net_nfc_server_handover_create_config_context_t *context);
150 static void _net_nfc_server_handover_server_process(
151 net_nfc_handover_context_t *context);
153 ////////////////////////////////////////////////////////////////////////////
155 static void _net_nfc_server_handover_send_response(
156 net_nfc_error_e result,
157 net_nfc_conn_handover_carrier_type_e carrier,
161 HandoverRequestData *handover_data = (HandoverRequestData *)user_param;
163 g_assert(handover_data != NULL);
164 g_assert(handover_data->invocation != NULL);
165 g_assert(handover_data->handoverobj != NULL);
167 net_nfc_gdbus_handover_complete_request(
168 handover_data->handoverobj,
169 handover_data->invocation,
172 net_nfc_util_gdbus_data_to_variant(ac_data));
174 if (handover_data->data)
176 g_free(handover_data->data->buffer);
177 g_free(handover_data->data);
180 g_object_unref(handover_data->invocation);
181 g_object_unref(handover_data->handoverobj);
183 g_free(handover_data);
186 static net_nfc_error_e _net_nfc_server_handover_convert_ndef_message_to_data(
190 net_nfc_error_e result;
193 if (msg == NULL || data == NULL)
195 return NET_NFC_INVALID_PARAM;
198 length = net_nfc_util_get_ndef_message_length(msg);
201 net_nfc_util_alloc_data(data, length);
202 result = net_nfc_util_convert_ndef_message_to_rawdata(msg, data);
206 result = NET_NFC_INVALID_PARAM;
212 static void _net_nfc_server_handover_bt_get_carrier_record_cb(
213 net_nfc_error_e result,
214 net_nfc_conn_handover_carrier_state_e cps,
215 ndef_record_s *carrier,
216 uint32_t aux_data_count,
217 ndef_record_s *aux_data,
220 net_nfc_server_handover_create_config_context_t *context =
221 (net_nfc_server_handover_create_config_context_t *)user_param;
223 /* append record to ndef message */
224 if (result == NET_NFC_OK)
226 ndef_record_s *record;
228 /* FIXME : copy record and append */
229 net_nfc_util_create_record(carrier->TNF,
235 if ((result = net_nfc_util_append_carrier_config_record(
236 context->ndef_message,
240 DEBUG_SERVER_MSG("net_nfc_util_append_carrier"
241 "_config_record success");
245 DEBUG_ERR_MSG("net_nfc_util_append_carrier"
246 "_config_record failed [%d]",
248 net_nfc_util_free_record(record);
252 (GSourceFunc)_net_nfc_server_handover_iterate_carrier_configs_to_next,
256 /* don't free context */
258 static void _net_nfc_server_handover_bss_get_carrier_record_cb(
259 net_nfc_error_e result,
260 net_nfc_conn_handover_carrier_state_e cps,
261 ndef_record_s *carrier,
262 uint32_t aux_data_count,
263 ndef_record_s *aux_data,
266 net_nfc_server_handover_create_config_context_t *context =
267 (net_nfc_server_handover_create_config_context_t *)user_param;
269 /* append record to ndef message */
270 if (result == NET_NFC_OK)
272 ndef_record_s *record;
274 net_nfc_util_create_record(carrier->TNF,
280 if ((result = net_nfc_util_append_carrier_config_record(
281 context->ndef_message,
285 DEBUG_SERVER_MSG("net_nfc_util_append_carrier"
286 "_config_record success");
290 DEBUG_ERR_MSG("net_nfc_util_append_carrier"
291 "_config_record failed [%d]",
293 net_nfc_util_free_record(record);
297 (GSourceFunc)_net_nfc_server_handover_iterate_carrier_configs_to_next,
301 /* don't free context */
303 static void _net_nfc_server_handover_bt_process_carrier_record_cb(
304 net_nfc_error_e result,
305 net_nfc_conn_handover_carrier_type_e type,
309 net_nfc_server_handover_process_config_context_t *context =
310 (net_nfc_server_handover_process_config_context_t *)user_param;
312 if (result == NET_NFC_OK)
314 if (context->cb != NULL)
316 context->cb(result, type, data, context->user_param);
321 DEBUG_ERR_MSG("_handover_bt_process_carrier_record failed [%d]",
325 _net_nfc_util_free_mem(context);
328 static void _net_nfc_server_handover_bss_process_carrier_record_cb(
329 net_nfc_error_e result,
330 net_nfc_conn_handover_carrier_type_e type,
335 net_nfc_server_handover_process_config_context_t *context =
336 (net_nfc_server_handover_process_config_context_t *)user_param;
340 if (context->cb != NULL)
342 context->cb(result, type, data, context->user_param);
345 DEBUG_ERR_MSG("Invalid Callback");
347 _net_nfc_util_free_mem(context);
351 net_nfc_server_handover_get_carrier_record_by_priority_order(
352 ndef_message_s *request,
353 ndef_record_s **record)
355 net_nfc_error_e result;
356 unsigned int carrier_count = 0;
358 LOGD("[%s] START", __func__);
360 if (request == NULL || record == NULL)
362 return NET_NFC_NULL_PARAMETER;
367 if ((result = net_nfc_util_get_alternative_carrier_record_count(
369 &carrier_count)) == NET_NFC_OK)
372 net_nfc_conn_handover_carrier_type_e carrier_type =
373 NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
375 for (priority = NET_NFC_CONN_HANDOVER_CARRIER_BT;*record == NULL
376 && priority < NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;priority++)
378 /* check each carrier record and create matched record */
379 for (idx = 0; idx < carrier_count; idx++)
381 if ((net_nfc_util_get_alternative_carrier_type(
384 &carrier_type)== NET_NFC_OK)
385 && (carrier_type == priority))
387 DEBUG_SERVER_MSG("selected carrier type"
388 " = [%d]", carrier_type);
389 net_nfc_util_get_carrier_config_record(
401 DEBUG_ERR_MSG("net_nfc_util_get_alternative_carrier"
402 "_record_count failed");
405 LOGD("[%s] END", __func__);
410 static net_nfc_error_e _net_nfc_server_handover_create_requester_from_rawdata(
411 ndef_message_s **requestor,
414 net_nfc_error_e result;
416 if (requestor == NULL)
417 return NET_NFC_NULL_PARAMETER;
421 result = net_nfc_util_create_ndef_message(requestor);
422 if (result == NET_NFC_OK)
424 result = net_nfc_util_convert_rawdata_to_ndef_message(data,
427 if (result == NET_NFC_OK)
429 if (_net_nfc_server_handover_check_hr_record_validation(
436 DEBUG_ERR_MSG("record is not valid or"
437 " is not available");
438 net_nfc_util_free_ndef_message(*requestor);
439 result = NET_NFC_INVALID_PARAM;
444 DEBUG_ERR_MSG("_net_nfc_ndef_rawdata_to_ndef"
445 "failed [%d]",result);
448 DEBUG_ERR_MSG("net_nfc_util_create_ndef_message failed [%d]",
455 net_nfc_error_e net_nfc_server_handover_create_selector_from_rawdata(
456 ndef_message_s **selector, data_s *data)
458 net_nfc_error_e result;
460 if (selector == NULL)
461 return NET_NFC_NULL_PARAMETER;
465 if ((result = net_nfc_util_create_ndef_message(selector))
468 if ((result = net_nfc_util_convert_rawdata_to_ndef_message(data,
469 *selector)) == NET_NFC_OK)
472 /* if record is not Hs record, then */
473 if (_net_nfc_server_handover_check_hs_record_validation(
480 DEBUG_ERR_MSG("record is not valid or is "
482 net_nfc_util_free_ndef_message(*selector);
483 result = NET_NFC_INVALID_PARAM;
488 DEBUG_ERR_MSG("_net_nfc_ndef_rawdata_to_ndef"
489 " failed [%d]",result);
494 DEBUG_ERR_MSG("_net_nfc_util_create_ndef_message"
495 " failed [%d]",result);
501 static bool _net_nfc_server_handover_check_hr_record_validation(
502 ndef_message_s *message)
507 LOGD("[%s] START", __func__);
512 rec = (ndef_record_s *)message->records;
514 if (memcmp(rec->type_s.buffer, CH_REQ_RECORD_TYPE,
515 rec->type_s.length) != 0)
517 DEBUG_ERR_MSG("This is not connection handover"
522 if (rec->payload_s.buffer[0] != CH_VERSION)
524 DEBUG_ERR_MSG("connection handover version is not matched");
528 if (net_nfc_util_get_alternative_carrier_record_count(message, &count)
529 != NET_NFC_OK || count == 0)
531 DEBUG_ERR_MSG("there is no carrier reference");
535 LOGD("[%s] END", __func__);
540 LOGD("[%s] END", __func__);
545 static bool _net_nfc_server_handover_check_hs_record_validation(
546 ndef_message_s *message)
551 LOGD("[%s] START", __func__);
556 rec = (ndef_record_s *)message->records;
558 if (memcmp(rec->type_s.buffer, CH_SEL_RECORD_TYPE,
559 rec->type_s.length) != 0)
561 DEBUG_ERR_MSG("This is not connection handover"
566 if (net_nfc_util_get_alternative_carrier_record_count(
567 message,&count)!= NET_NFC_OK || count == 0)
569 DEBUG_ERR_MSG("there is no carrrier reference");
574 if (rec->payload_s.buffer[0] != CH_VERSION)
576 DEBUG_ERR_MSG("connection handover version"
581 LOGD("[%s] END", __func__);
586 LOGD("[%s] END", __func__);
591 static int _net_nfc_server_handover_iterate_carrier_configs_step(
592 net_nfc_server_handover_create_config_context_t *context)
594 LOGD("[%s:%d] START", __func__, __LINE__);
601 if (context->cb != NULL)
603 context->cb(NET_NFC_OK, context->ndef_message,
604 context->user_param);
607 if (context->ndef_message != NULL)
609 net_nfc_util_free_ndef_message(context->ndef_message);
612 _net_nfc_util_free_mem(context);
614 LOGD("[%s:%d] END", __func__, __LINE__);
619 static int _net_nfc_server_handover_iterate_carrier_configs_to_next(
620 net_nfc_server_handover_create_config_context_t *context)
622 if (context->result == NET_NFC_OK || context->result == NET_NFC_BUSY)
624 if (context->type == NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN)
626 if (context->current_type <
627 NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN)
629 context->current_type++;
634 context->current_type =
635 NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
639 (GSourceFunc)_net_nfc_server_handover_iterate_create_carrier_configs,
644 DEBUG_ERR_MSG("context->result is error [%d]", context->result);
647 (GSourceFunc)_net_nfc_server_handover_iterate_carrier_configs_step,
654 static int _net_nfc_server_handover_iterate_create_carrier_configs(
655 net_nfc_server_handover_create_config_context_t *context)
657 LOGD("[%s:%d] START", __func__, __LINE__);
658 net_nfc_error_e result = NET_NFC_OK;
660 switch (context->current_type)
662 case NET_NFC_CONN_HANDOVER_CARRIER_BT :
663 DEBUG_MSG("[NET_NFC_CONN_HANDOVER_CARRIER_BT]");
664 net_nfc_server_handover_bt_get_carrier_record(
665 _net_nfc_server_handover_bt_get_carrier_record_cb,
669 case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS :
670 DEBUG_MSG("[NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS]");
673 if(memcmp(context->ndef_message->records->type_s.buffer ,CH_SEL_RECORD_TYPE,
674 context->ndef_message->records->type_s.length)==0)
676 result = net_nfc_server_handover_bss_wfd_get_carrier_record(
677 _net_nfc_server_handover_bss_get_carrier_record_cb,
683 result = net_nfc_server_handover_bss_get_carrier_record(
684 _net_nfc_server_handover_bss_get_carrier_record_cb,
687 DEBUG_MSG("[%d]",result);
690 // case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_IBSS :
691 // DEBUG_MSG("[NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS]");
693 // (GSourceFunc)_net_nfc_server_handover_append_wifi_carrier_config,
697 case NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN :
698 DEBUG_MSG("[NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN]");
700 (GSourceFunc)_net_nfc_server_handover_iterate_carrier_configs_step,
705 DEBUG_MSG("[unknown : %d]", context->current_type);
707 (GSourceFunc)_net_nfc_server_handover_iterate_carrier_configs_step,
712 LOGD("[%s:%d] END", __func__, __LINE__);
717 static net_nfc_error_e
718 _net_nfc_server_handover_create_requester_carrier_configs(
719 net_nfc_conn_handover_carrier_type_e type,
723 net_nfc_error_e result = NET_NFC_OK;
724 net_nfc_server_handover_create_config_context_t *context = NULL;
726 LOGD("[%s:%d] START", __func__, __LINE__);
728 _net_nfc_util_alloc_mem(context, sizeof(*context));
731 context->type = type;
732 if (type == NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN)
734 context->current_type =
735 NET_NFC_CONN_HANDOVER_CARRIER_BT;
738 context->current_type = context->type;
741 context->user_param = user_param;
742 net_nfc_util_create_handover_request_message(
743 &context->ndef_message);
745 /* append carrier record */
747 (GSourceFunc)_net_nfc_server_handover_iterate_create_carrier_configs,
752 DEBUG_ERR_MSG("alloc failed");
753 result = NET_NFC_ALLOC_FAIL;
756 LOGD("[%s:%d] END", __func__, __LINE__);
761 static net_nfc_error_e
762 _net_nfc_server_handover_create_selector_carrier_configs(
763 net_nfc_conn_handover_carrier_type_e type,
767 net_nfc_error_e result = NET_NFC_OK;
768 net_nfc_server_handover_create_config_context_t *context = NULL;
770 LOGD("[%s:%d] START", __func__, __LINE__);
772 _net_nfc_util_alloc_mem(context, sizeof(net_nfc_server_handover_create_config_context_t));
775 context->type = type;
776 if (type == NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN)
778 context->current_type = NET_NFC_CONN_HANDOVER_CARRIER_BT;
781 context->current_type = context->type;
784 context->user_param = user_param;
785 net_nfc_util_create_handover_select_message(
786 &context->ndef_message);
788 /* append carrier record */
790 (GSourceFunc)_net_nfc_server_handover_iterate_create_carrier_configs,
795 DEBUG_ERR_MSG("alloc failed");
796 result = NET_NFC_ALLOC_FAIL;
799 LOGD("[%s:%d] END", __func__, __LINE__);
804 net_nfc_error_e net_nfc_server_handover_process_carrier_record(
805 ndef_record_s *carrier, void *cb, void *user_param)
807 net_nfc_error_e result = NET_NFC_OK;
808 net_nfc_server_handover_process_config_context_t *context = NULL;
810 LOGD("[%s:%d] START", __func__, __LINE__);
812 _net_nfc_util_alloc_mem(context, sizeof(*context));
815 net_nfc_conn_handover_carrier_type_e type;
817 net_nfc_util_get_alternative_carrier_type_from_record(
821 context->type = type;
822 context->user_param = user_param;
824 context->step = NET_NFC_LLCP_STEP_01;
826 /* process carrier record */
829 case NET_NFC_CONN_HANDOVER_CARRIER_BT :
830 DEBUG_MSG("[NET_NFC_CONN_HANDOVER_CARRIER_BT]");
831 net_nfc_server_handover_bt_process_carrier_record(
833 _net_nfc_server_handover_bt_process_carrier_record_cb,
837 case NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS :
838 DEBUG_MSG("[NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS]");
839 net_nfc_server_handover_bss_process_carrier_record(
841 _net_nfc_server_handover_bss_process_carrier_record_cb,
845 case NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN :
846 DEBUG_MSG("[NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN]");
847 _net_nfc_util_free_mem(context);
851 DEBUG_MSG("[unknown]");
852 _net_nfc_util_free_mem(context);
858 DEBUG_ERR_MSG("alloc failed");
859 result = NET_NFC_ALLOC_FAIL;
862 LOGD("[%s:%d] END", __func__, __LINE__);
867 static net_nfc_error_e _net_nfc_server_handover_select_carrier_record(
868 ndef_message_s *request,
869 net_nfc_conn_handover_carrier_type_e *type,
870 ndef_record_s **record)
872 net_nfc_error_e result;
876 *type = NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN;
878 /* get requester message */
879 if ((result = net_nfc_util_get_alternative_carrier_record_count(request,
880 &count)) == NET_NFC_OK)
882 if (1/* power state */ || count == 1)
886 /* fill alternative carrier information */
888 net_nfc_server_handover_get_carrier_record_by_priority_order(
890 &temp)) == NET_NFC_OK)
893 net_nfc_util_get_alternative_carrier_type_from_record(
895 type)) == NET_NFC_OK)
897 net_nfc_util_create_record(temp->TNF,
898 &temp->type_s, &temp->id_s,
904 DEBUG_ERR_MSG("net_nfc_util_get_alternative"
905 "_carrier_type_from_record failed [%d]", result);
910 DEBUG_ERR_MSG("_handover_get_carrier_record"
911 "_by_priority_order failed [%d]", result);
914 else /* low power && count > 1 */
916 result = NET_NFC_INVALID_STATE;
921 DEBUG_ERR_MSG("net_nfc_util_get_alternative_carrier_record_count "
922 "failed [%d]", result);
928 static void _net_nfc_server_handover_create_carrier_configs_2_cb(
929 net_nfc_error_e result,
930 ndef_message_s *selector,
933 net_nfc_handover_context_t *context =
934 (net_nfc_handover_context_t *)user_param;
936 DEBUG_SERVER_MSG("_net_nfc_server_handover_server_create_carrier_config_cb"
937 "result [%d]",result);
944 context->result = result;
946 if (result == NET_NFC_OK) {
947 result = _net_nfc_server_handover_convert_ndef_message_to_data(
951 DEBUG_SERVER_MSG("selector message created, length [%d]",
952 context->data.length);
954 context->state = NET_NFC_LLCP_STEP_03;
958 DEBUG_ERR_MSG("_net_nfc_server_handover_create_selector_msg failed [%d]",
960 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
963 _net_nfc_server_handover_get_response_process(context);
966 static void _net_nfc_server_handover_process_carrier_record_2_cb(
967 net_nfc_error_e result,
968 net_nfc_conn_handover_carrier_type_e type,
972 net_nfc_handover_context_t *context =
973 (net_nfc_handover_context_t *)user_param;
975 DEBUG_SERVER_MSG("_net_nfc_server_handover_server_process_carrier_record_cb"
976 "result [%d]",result);
978 context->result = result;
979 if (result == NET_NFC_OK)
981 context->state = NET_NFC_LLCP_STEP_04;
985 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
988 context->data.length = data->length;
989 _net_nfc_util_alloc_mem(context->data.buffer, context->data.length);
990 memcpy(context->data.buffer, data->buffer, context->data.length);
993 _net_nfc_server_handover_server_process(context);
996 static void _net_nfc_server_handover_get_response_process(
997 net_nfc_handover_context_t *context)
999 net_nfc_error_e result;
1001 if (context == NULL)
1006 switch (context->state)
1008 case NET_NFC_LLCP_STEP_02 :
1009 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_02");
1011 result = _net_nfc_server_handover_create_selector_carrier_configs(
1013 _net_nfc_server_handover_create_carrier_configs_2_cb,
1016 if (result != NET_NFC_OK)
1018 DEBUG_ERR_MSG("_net_nfc_server_handover_create_"
1019 "selector_carrier_config failed [%d]",result);
1023 case NET_NFC_LLCP_STEP_03 :
1024 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_03");
1026 result = net_nfc_server_handover_process_carrier_record(
1028 _net_nfc_server_handover_process_carrier_record_2_cb,
1031 if (result != NET_NFC_OK)
1033 DEBUG_ERR_MSG("net_nfc_server_handover_process_carrier_record"
1034 "failed [%d]",result);
1038 case NET_NFC_LLCP_STEP_04 :
1039 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_04");
1041 /* response select message */
1042 result = net_nfc_server_snep_server_send_get_response(
1043 (net_nfc_snep_handle_h)context->handle,
1047 case NET_NFC_STATE_ERROR :
1048 DEBUG_SERVER_MSG("NET_NFC_STATE_ERROR");
1052 DEBUG_ERR_MSG("NET_NFC_LLCP_STEP_??");
1058 static bool _net_nfc_server_handover_get_response_cb(
1059 net_nfc_snep_handle_h handle,
1065 net_nfc_error_e result;
1066 ndef_message_s *request;
1068 DEBUG_SERVER_MSG("type [%d], data [%p], user_param [%p]",
1069 type, data, user_param);
1071 if (data == NULL || data->buffer == NULL)
1077 /* TODO : send select response to requester */
1078 result = _net_nfc_server_handover_create_requester_from_rawdata(
1082 if (result == NET_NFC_OK)
1084 net_nfc_conn_handover_carrier_type_e type;
1085 ndef_record_s *record;
1087 if (_net_nfc_server_handover_select_carrier_record(
1090 &record) == NET_NFC_OK)
1092 net_nfc_handover_context_t *context = NULL;
1094 _net_nfc_util_alloc_mem(context, sizeof(*context));
1096 if (context != NULL)
1098 context->handle = (void *)handle;
1099 context->type = type;
1100 context->user_param = user_param;
1101 context->state = NET_NFC_LLCP_STEP_02;
1103 net_nfc_util_create_record(record->TNF,
1109 _net_nfc_server_handover_get_response_process(context);
1113 DEBUG_ERR_MSG("_net_nfc_util_alloc_mem failed");
1114 result = NET_NFC_ALLOC_FAIL;
1122 net_nfc_util_free_ndef_message(request);
1126 DEBUG_SERVER_MSG("it is not handover requester message, [%d]",
1130 return (result == NET_NFC_OK);
1133 ////////////////////////////////////////////////////////////////////////////////
1134 static void _net_nfc_server_handover_server_process_carrier_record_cb(
1135 net_nfc_error_e result,
1136 net_nfc_conn_handover_carrier_type_e type,
1140 net_nfc_handover_context_t *context =
1141 (net_nfc_handover_context_t *)user_param;
1143 DEBUG_SERVER_MSG("_net_nfc_server_handover_server_process"
1144 "_carrier_record_cb result [%d]",result);
1146 context->result = result;
1148 if (result == NET_NFC_OK)
1149 context->state = NET_NFC_LLCP_STEP_04;
1151 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
1153 _net_nfc_server_handover_server_process(context);
1156 static void _net_nfc_server_handover_server_create_carrier_config_cb(
1157 net_nfc_error_e result,
1158 ndef_message_s *selector,
1161 net_nfc_handover_context_t *context =
1162 (net_nfc_handover_context_t *)user_param;
1164 DEBUG_SERVER_MSG("_net_nfc_server_handover_server_create"
1165 "_carrier_config_cb,result [%d]",result);
1167 if (context == NULL)
1172 context->result = result;
1174 net_nfc_conn_handover_carrier_type_e type;
1176 net_nfc_util_get_alternative_carrier_type_from_record(
1179 if (result == NET_NFC_OK)
1181 result = _net_nfc_server_handover_convert_ndef_message_to_data(
1184 DEBUG_SERVER_MSG("selector message created, length [%d]",
1185 context->data.length);
1186 if(type == NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS)
1187 context->state = NET_NFC_LLCP_STEP_04;
1189 context->state = NET_NFC_LLCP_STEP_03;
1193 DEBUG_ERR_MSG("_net_nfc_server_handover_create_selector_msg"
1194 " failed [%d]", result);
1195 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
1198 _net_nfc_server_handover_server_process(context);
1201 static void _net_nfc_server_handover_server_recv_cb(
1202 net_nfc_error_e result,
1203 net_nfc_target_handle_s *handle,
1204 net_nfc_llcp_socket_t socket,
1208 net_nfc_handover_context_t *context =
1209 (net_nfc_handover_context_t *)user_param;
1210 ndef_message_s *request;
1212 DEBUG_SERVER_MSG("_net_nfc_server_handover_server_recv_cb,"
1213 " socket [%x], result [%d]", socket, result);
1215 context->result = result;
1217 if (result == NET_NFC_OK)
1219 result = _net_nfc_server_handover_create_requester_from_rawdata(
1223 if (result == NET_NFC_OK)
1225 ndef_record_s *record;
1227 if (_net_nfc_server_handover_select_carrier_record(
1230 &record) == NET_NFC_OK)
1232 net_nfc_util_create_record(record->TNF,
1233 &record->type_s, &record->id_s,
1237 context->state = NET_NFC_LLCP_STEP_02;
1242 context->state = NET_NFC_LLCP_STEP_06;
1245 net_nfc_util_free_ndef_message(request);
1249 DEBUG_ERR_MSG("_net_nfc_server_handover_create"
1250 "_requester_from_rawdata failed [%d]",result);
1251 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
1256 DEBUG_ERR_MSG("net_nfc_server_llcp_simple_receive failed [%d]",
1258 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
1261 _net_nfc_server_handover_server_process(context);
1264 static void _net_nfc_server_handover_server_send_cb(net_nfc_error_e result,
1265 net_nfc_target_handle_s *handle,
1266 net_nfc_llcp_socket_t socket,
1270 net_nfc_handover_context_t *context =
1271 (net_nfc_handover_context_t *)user_param;
1273 DEBUG_SERVER_MSG("_net_nfc_server_handover_server_send_cb"
1274 " socket [%x], result [%d]", socket, result);
1276 context->result = result;
1278 if (result == NET_NFC_OK)
1280 context->state = NET_NFC_LLCP_STEP_01;
1281 net_nfc_util_free_data(&context->data);
1282 net_nfc_util_free_record(context->record);
1283 context->record = NULL;
1287 DEBUG_ERR_MSG("net_nfc_server_llcp_simple_send failed [%d]",
1289 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
1292 _net_nfc_server_handover_server_process(context);
1295 static void _net_nfc_server_handover_server_process(
1296 net_nfc_handover_context_t *context)
1298 if (context == NULL)
1303 switch (context->state)
1305 case NET_NFC_LLCP_STEP_01 :
1306 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_01");
1308 /* receive request message */
1309 net_nfc_server_llcp_simple_receive(context->handle,
1311 _net_nfc_server_handover_server_recv_cb,
1315 case NET_NFC_LLCP_STEP_02 :
1316 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_02");
1318 context->result = _net_nfc_server_handover_create_selector_carrier_configs(
1320 _net_nfc_server_handover_server_create_carrier_config_cb,
1323 if (context->result != NET_NFC_OK)
1325 DEBUG_ERR_MSG("_net_nfc_server_handover_create_selector"
1326 "_carrier_configs failed [%d]", context->result);
1330 case NET_NFC_LLCP_STEP_03 :
1331 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_03");
1333 context->result = net_nfc_server_handover_process_carrier_record(
1335 _net_nfc_server_handover_server_process_carrier_record_cb,
1337 if (context->result != NET_NFC_OK)
1339 DEBUG_ERR_MSG("_net_nfc_server_handover_process_carrier_"
1340 "record failed [%d]",context->result);
1344 case NET_NFC_LLCP_STEP_04 :
1345 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_04");
1347 /* send select message */
1348 net_nfc_server_llcp_simple_send(
1352 _net_nfc_server_handover_server_send_cb,
1356 case NET_NFC_STATE_ERROR :
1357 DEBUG_SERVER_MSG("NET_NFC_STATE_ERROR");
1359 /* error, invoke callback */
1360 DEBUG_ERR_MSG("handover_server failed, [%d]",
1367 DEBUG_ERR_MSG("NET_NFC_LLCP_STEP_??");
1373 static void _net_nfc_server_handover_server_error_cb(
1374 net_nfc_error_e result,
1375 net_nfc_target_handle_s *handle,
1376 net_nfc_llcp_socket_t socket,
1380 net_nfc_handover_context_t *context =
1381 (net_nfc_handover_context_t *)user_param;
1383 DEBUG_ERR_MSG("result [%d], socket [%x], user_param [%p]",
1384 result, socket, user_param);
1386 if (context == NULL)
1391 net_nfc_controller_llcp_socket_close(socket, &result);
1393 net_nfc_util_free_record(context->record);
1394 net_nfc_util_free_data(&context->data);
1395 _net_nfc_util_free_mem(user_param);
1398 static void _net_nfc_server_handover_server_incomming_cb(
1399 net_nfc_error_e result,
1400 net_nfc_target_handle_s *handle,
1401 net_nfc_llcp_socket_t socket,
1405 DEBUG_SERVER_MSG("result [%d], socket [%x], user_param [%p]",
1406 result, socket, user_param);
1408 net_nfc_handover_context_t *accept_context = NULL;
1410 _net_nfc_util_alloc_mem(accept_context, sizeof(*accept_context));
1411 if (accept_context == NULL)
1413 DEBUG_ERR_MSG("_net_nfc_util_alloc_mem failed");
1415 result = NET_NFC_ALLOC_FAIL;
1419 accept_context->handle = handle;
1420 accept_context->socket = socket;
1421 accept_context->state = NET_NFC_LLCP_STEP_01;
1423 result = net_nfc_server_llcp_simple_accept(
1426 _net_nfc_server_handover_server_error_cb,
1429 if (result != NET_NFC_OK)
1431 DEBUG_ERR_MSG("net_nfc_server_llcp_simple_accept failed, [%d]",
1437 _net_nfc_server_handover_server_process(accept_context);
1442 if (accept_context != NULL)
1444 _net_nfc_util_free_mem(accept_context);
1447 net_nfc_controller_llcp_socket_close(socket, &result);
1449 /* TODO : restart ?? */
1452 net_nfc_error_e net_nfc_server_handover_default_server_start(
1453 net_nfc_target_handle_s *handle)
1455 net_nfc_error_e result;
1457 /* start default handover server using snep */
1459 net_nfc_server_snep_default_server_register_get_response_cb(
1460 _net_nfc_server_handover_get_response_cb,
1463 /* start default handover server */
1464 result = net_nfc_server_llcp_simple_server(
1468 _net_nfc_server_handover_server_incomming_cb,
1469 _net_nfc_server_handover_server_error_cb,
1472 if (result == NET_NFC_OK)
1474 DEBUG_SERVER_MSG("start handover server, san [%s], sap [%d]",
1479 DEBUG_ERR_MSG("net_nfc_server_llcp_simple_server failed, [%d]",
1486 static void _handover_default_activate_cb(int event,
1487 net_nfc_target_handle_s *handle,uint32_t sap, const char *san, void *user_param)
1489 net_nfc_error_e result;
1491 DEBUG_SERVER_MSG("event [%d], handle [%p], sap [%d], san [%s]",
1492 event, handle, sap, san);
1494 if (event == NET_NFC_LLCP_START) {
1495 /* start default handover server using snep */
1496 result = net_nfc_server_snep_default_server_register_get_response_cb(
1497 _net_nfc_server_handover_get_response_cb, NULL);
1499 /* start default handover server */
1500 result = net_nfc_server_llcp_simple_server(handle,
1502 _net_nfc_server_handover_server_incomming_cb,
1503 _net_nfc_server_handover_server_error_cb, NULL);
1505 if (result == NET_NFC_OK) {
1506 DEBUG_SERVER_MSG("start handover server, san [%s], sap [%d]",
1509 DEBUG_ERR_MSG("net_nfc_service_llcp_server failed, [%d]",
1512 } else if (event == NET_NFC_LLCP_UNREGISTERED) {
1513 /* unregister server, do nothing */
1517 net_nfc_error_e net_nfc_server_handover_default_server_register()
1521 /* TODO : make id, */
1522 snprintf(id, sizeof(id), "%d", getpid());
1524 /* start default snep server */
1525 return net_nfc_server_llcp_register_service(id,
1528 _handover_default_activate_cb,
1532 net_nfc_error_e net_nfc_server_handover_default_server_unregister()
1536 /* TODO : make id, */
1537 snprintf(id, sizeof(id), "%d", getpid());
1539 /* start default snep server */
1540 return net_nfc_server_llcp_unregister_service(id,
1545 ////////////////////////////////////////////////////////////////////////////////
1547 static void _net_nfc_server_handover_client_post_process_cb(
1548 net_nfc_error_e result,
1549 net_nfc_conn_handover_carrier_type_e type,
1553 net_nfc_handover_context_t *context =
1554 (net_nfc_handover_context_t *)user_param;
1556 if (context == NULL)
1561 context->state = NET_NFC_LLCP_STEP_RETURN;
1563 _net_nfc_server_handover_client_process(context);
1566 static void _net_nfc_server_handover_client_process_carrier_record_cb(
1567 net_nfc_error_e result,
1568 net_nfc_conn_handover_carrier_type_e type,
1572 net_nfc_handover_context_t *context =
1573 (net_nfc_handover_context_t *)user_param;
1575 DEBUG_SERVER_MSG("_net_nfc_server_handover_server_process"
1576 "_carrier_record_cb,result [%d]",result);
1578 context->result = result;
1580 net_nfc_util_free_data(&context->data);
1582 if (result == NET_NFC_OK)
1584 if(context->type == NET_NFC_CONN_HANDOVER_CARRIER_WIFI_BSS)
1585 context->state = NET_NFC_LLCP_STEP_RETURN;
1588 net_nfc_util_alloc_data(&context->data, data->length);
1589 memcpy(context->data.buffer, data->buffer, data->length);
1591 context->state = NET_NFC_LLCP_STEP_05;
1596 context->state = NET_NFC_MESSAGE_LLCP_ERROR;
1599 _net_nfc_server_handover_client_process(context);
1602 static void _net_nfc_server_handover_client_recv_cb(
1603 net_nfc_error_e result,
1604 net_nfc_target_handle_s *handle,
1605 net_nfc_llcp_socket_t socket,
1609 net_nfc_handover_context_t *context =
1610 (net_nfc_handover_context_t *)user_param;
1612 if (context == NULL)
1617 context->result = result;
1619 if (result == NET_NFC_OK)
1621 ndef_message_s *selector;
1622 ndef_record_s *record;
1624 result = net_nfc_server_handover_create_selector_from_rawdata(
1628 if (result == NET_NFC_OK)
1631 net_nfc_server_handover_get_carrier_record_by_priority_order(
1635 if (result == NET_NFC_OK)
1637 net_nfc_util_create_record(
1639 &record->type_s, &record->id_s,
1643 context->state = NET_NFC_LLCP_STEP_04;
1647 DEBUG_ERR_MSG("_get_carrier_record_by_priority_order"
1648 " failed, [%d]",result);
1649 context->state = NET_NFC_STATE_ERROR;
1654 DEBUG_ERR_MSG("_net_nfc_server_handover_create"
1655 "_selector_from_rawdata failed, [%d]",result);
1656 context->state = NET_NFC_STATE_ERROR;
1661 DEBUG_ERR_MSG("net_nfc_server_llcp_simple_receive failed, [%d]",
1663 context->state = NET_NFC_STATE_ERROR;
1666 _net_nfc_server_handover_client_process(context);
1669 static void _net_nfc_server_handover_client_send_cb(
1670 net_nfc_error_e result,
1671 net_nfc_target_handle_s *handle,
1672 net_nfc_llcp_socket_t socket,
1676 net_nfc_handover_context_t *context =
1677 (net_nfc_handover_context_t *)user_param;
1679 if (context == NULL)
1684 context->result = result;
1686 net_nfc_util_free_data(&context->data);
1688 if (result == NET_NFC_OK)
1690 context->state = NET_NFC_LLCP_STEP_03;
1694 DEBUG_ERR_MSG("net_nfc_server_llcp_simple_client failed, [%d]",
1696 context->state = NET_NFC_STATE_ERROR;
1699 _net_nfc_server_handover_client_process(context);
1702 static void _net_nfc_server_handover_client_create_carrier_configs_cb(
1703 net_nfc_error_e result,
1704 ndef_message_s *msg,
1707 net_nfc_handover_context_t *context =
1708 (net_nfc_handover_context_t *)user_param;
1710 if (context == NULL) {
1714 context->result = result;
1719 _net_nfc_server_handover_convert_ndef_message_to_data(
1721 &context->data)) == NET_NFC_OK)
1723 context->state = NET_NFC_LLCP_STEP_02;
1727 DEBUG_ERR_MSG("_net_nfc_server_handover_convert_ndef_"
1728 "message_to_data failed [%d]",result);
1729 context->state = NET_NFC_STATE_ERROR;
1730 context->result = result;
1735 DEBUG_ERR_MSG("null param, [%d]", result);
1736 context->state = NET_NFC_STATE_ERROR;
1737 context->result = result;
1740 _net_nfc_server_handover_client_process(context);
1744 ////////////////////////////////////////////////////////////////////////////////
1745 static void _net_nfc_server_handover_client_process(
1746 net_nfc_handover_context_t *context)
1748 net_nfc_error_e result;
1750 if (context == NULL)
1755 switch (context->state)
1757 case NET_NFC_LLCP_STEP_01 :
1758 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_01");
1760 if ((result = _net_nfc_server_handover_create_requester_carrier_configs(
1762 _net_nfc_server_handover_client_create_carrier_configs_cb,
1763 context)) != NET_NFC_OK)
1765 DEBUG_ERR_MSG("_net_nfc_server_handover_create_requester"
1766 "_carrier_configs failed [%d]",result);
1770 case NET_NFC_LLCP_STEP_02 :
1771 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_02");
1774 net_nfc_server_llcp_simple_send(
1778 _net_nfc_server_handover_client_send_cb,
1782 case NET_NFC_LLCP_STEP_03 :
1783 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_03");
1785 /* receive response */
1786 net_nfc_server_llcp_simple_receive(context->handle,
1788 _net_nfc_server_handover_client_recv_cb,
1792 case NET_NFC_LLCP_STEP_04 :
1793 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_04");
1795 result = net_nfc_server_handover_process_carrier_record(
1797 _net_nfc_server_handover_client_process_carrier_record_cb,
1800 if (result != NET_NFC_OK)
1802 DEBUG_ERR_MSG("net_nfc_server_handover_process_carrier_record"
1803 "failed [%d]",result);
1807 case NET_NFC_LLCP_STEP_05 :
1808 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_05");
1810 /* start post process */
1811 if (context->type == NET_NFC_CONN_HANDOVER_CARRIER_BT)
1813 net_nfc_server_handover_bt_post_process(
1815 _net_nfc_server_handover_client_post_process_cb,
1820 DEBUG_ERR_MSG("not supported...");
1824 case NET_NFC_LLCP_STEP_RETURN :
1825 DEBUG_SERVER_MSG("NET_NFC_LLCP_STEP_RETURN");
1827 /* complete and invoke callback */
1828 _net_nfc_server_handover_send_response(
1832 context->user_param);
1834 net_nfc_util_free_data(&context->data);
1835 net_nfc_util_free_record(context->record);
1836 _net_nfc_util_free_mem(context);
1839 case NET_NFC_STATE_ERROR :
1841 DEBUG_ERR_MSG("NET_NFC_STATE_ERROR");
1843 _net_nfc_server_handover_send_response(
1847 context->user_param);
1854 static void _net_nfc_server_handover_client_connected_cb(
1855 net_nfc_error_e result,
1856 net_nfc_target_handle_s *handle,
1857 net_nfc_llcp_socket_t socket,
1861 DEBUG_SERVER_MSG("result [%d], socket [%x], user_param [%p]",
1862 result, socket, user_param);
1864 HandoverRequestData *handover_data = NULL;
1865 handover_data = (HandoverRequestData *)user_param;
1866 if (result == NET_NFC_OK)
1868 net_nfc_handover_context_t *context = NULL;
1869 _net_nfc_util_alloc_mem(context, sizeof(*context));
1871 if (context != NULL)
1873 context->handle = handle;
1874 context->socket = socket;
1875 context->state = NET_NFC_LLCP_STEP_01;
1876 context->type = handover_data->type;
1877 context->user_param = user_param;
1878 _net_nfc_server_handover_client_process(context);
1882 DEBUG_ERR_MSG("_net_nfc_util_alloc_mem failed");
1883 result = NET_NFC_ALLOC_FAIL;
1888 DEBUG_ERR_MSG("net_nfc_server_llcp_simple_client"
1889 " failed, [%d]", result);
1893 static void _net_nfc_server_handover_client_error_cb(
1894 net_nfc_error_e result,
1895 net_nfc_target_handle_s *handle,
1896 net_nfc_llcp_socket_t socket,
1901 DEBUG_ERR_MSG("result [%d], socket [%x], user_param [%p]",
1902 result, socket, user_param);
1906 _net_nfc_server_handover_send_response(
1908 NET_NFC_CONN_HANDOVER_CARRIER_UNKNOWN,
1913 net_nfc_controller_llcp_socket_close(socket, &result);
1917 net_nfc_error_e net_nfc_server_handover_default_client_start(
1918 net_nfc_target_handle_s *handle, void *user_data)
1920 net_nfc_error_e result;
1922 result = net_nfc_server_llcp_simple_client(
1926 _net_nfc_server_handover_client_connected_cb,
1927 _net_nfc_server_handover_client_error_cb,
1930 if (result != NET_NFC_OK)
1932 DEBUG_ERR_MSG("net_nfc_server_llcp_simple_client"
1933 " failed, [%d]",result);