• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 2010-2014 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 /******************************************************************************
20  *
21  *  This file contains functions that interface with the NFC NCI transport.
22  *  On the receive side, it routes events to the appropriate handler
23  *  (callback). On the transmit side, it manages the command transmission.
24  *
25  ******************************************************************************/
26 #include <android-base/logging.h>
27 #include <android-base/stringprintf.h>
28 #include <android/hardware/nfc/1.1/types.h>
29 #include <string.h>
30 
31 #include "bt_types.h"
32 #include "ce_int.h"
33 #include "gki.h"
34 #include "nci_hmsgs.h"
35 #include "nfa_sys.h"
36 #include "nfc_api.h"
37 #include "nfc_int.h"
38 #include "nfc_target.h"
39 #include "rw_int.h"
40 
41 #if (NFC_RW_ONLY == FALSE)
42 
43 /* NFC mandates support for at least one logical connection;
44  * Update max_conn to the NFCC capability on InitRsp */
45 #define NFC_SET_MAX_CONN_DEFAULT() \
46   { nfc_cb.max_conn = 1; }
47 
48 #else /* NFC_RW_ONLY */
49 #define ce_init()
50 
51 #define NFC_SET_MAX_CONN_DEFAULT()
52 
53 #endif /* NFC_RW_ONLY */
54 
55 using android::base::StringPrintf;
56 using android::hardware::nfc::V1_1::NfcEvent;
57 
58 extern void delete_stack_non_volatile_store(bool forceDelete);
59 
60 /****************************************************************************
61 ** Declarations
62 ****************************************************************************/
63 tNFC_CB nfc_cb;
64 
65 #if (NFC_RW_ONLY == FALSE)
66 #define NFC_NUM_INTERFACE_MAP 2
67 #else
68 #define NFC_NUM_INTERFACE_MAP 1
69 #endif
70 
71 static const tNCI_DISCOVER_MAPS nfc_interface_mapping[NFC_NUM_INTERFACE_MAP] = {
72     /* Protocols that use Frame Interface do not need to be included in the
73        interface mapping */
74     {NCI_PROTOCOL_ISO_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN,
75      NCI_INTERFACE_ISO_DEP}
76 #if (NFC_RW_ONLY == FALSE)
77     ,
78     /* this can not be set here due to 2079xB0 NFCC issues */
79     {NCI_PROTOCOL_NFC_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN,
80      NCI_INTERFACE_NFC_DEP}
81 #endif
82 };
83 
84 /*******************************************************************************
85 **
86 ** Function         nfc_state_name
87 **
88 ** Description      This function returns the state name.
89 **
90 ** NOTE             conditionally compiled to save memory.
91 **
92 ** Returns          pointer to the name
93 **
94 *******************************************************************************/
nfc_state_name(uint8_t state)95 static std::string nfc_state_name(uint8_t state) {
96   switch (state) {
97     case NFC_STATE_NONE:
98       return "NONE";
99     case NFC_STATE_W4_HAL_OPEN:
100       return "W4_HAL_OPEN";
101     case NFC_STATE_CORE_INIT:
102       return "CORE_INIT";
103     case NFC_STATE_W4_POST_INIT_CPLT:
104       return "W4_POST_INIT_CPLT";
105     case NFC_STATE_IDLE:
106       return "IDLE";
107     case NFC_STATE_OPEN:
108       return "OPEN";
109     case NFC_STATE_CLOSING:
110       return "CLOSING";
111     case NFC_STATE_W4_HAL_CLOSE:
112       return "W4_HAL_CLOSE";
113     case NFC_STATE_NFCC_POWER_OFF_SLEEP:
114       return "NFCC_POWER_OFF_SLEEP";
115     default:
116       return "???? UNKNOWN STATE";
117   }
118 }
119 
120 /*******************************************************************************
121 **
122 ** Function         nfc_hal_event_name
123 **
124 ** Description      This function returns the HAL event name.
125 **
126 ** NOTE             conditionally compiled to save memory.
127 **
128 ** Returns          pointer to the name
129 **
130 *******************************************************************************/
nfc_hal_event_name(uint8_t event)131 static std::string nfc_hal_event_name(uint8_t event) {
132   switch (event) {
133     case HAL_NFC_OPEN_CPLT_EVT:
134       return "HAL_NFC_OPEN_CPLT_EVT";
135     case HAL_NFC_CLOSE_CPLT_EVT:
136       return "HAL_NFC_CLOSE_CPLT_EVT";
137     case HAL_NFC_POST_INIT_CPLT_EVT:
138       return "HAL_NFC_POST_INIT_CPLT_EVT";
139     case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
140       return "HAL_NFC_PRE_DISCOVER_CPLT_EVT";
141     case HAL_NFC_REQUEST_CONTROL_EVT:
142       return "HAL_NFC_REQUEST_CONTROL_EVT";
143     case HAL_NFC_RELEASE_CONTROL_EVT:
144       return "HAL_NFC_RELEASE_CONTROL_EVT";
145     case HAL_NFC_ERROR_EVT:
146       return "HAL_NFC_ERROR_EVT";
147     case HAL_HCI_NETWORK_RESET:
148       return "HCI_NETWORK_RESET";
149     default:
150       return "???? UNKNOWN EVENT";
151   }
152 }
153 
154 /*******************************************************************************
155 **
156 ** Function         nfc_main_notify_enable_status
157 **
158 ** Description      Notify status of Enable/PowerOffSleep/PowerCycle
159 **
160 *******************************************************************************/
nfc_main_notify_enable_status(tNFC_STATUS nfc_status)161 static void nfc_main_notify_enable_status(tNFC_STATUS nfc_status) {
162   tNFC_RESPONSE evt_data;
163 
164   evt_data.status = nfc_status;
165 
166   if (nfc_cb.p_resp_cback) {
167     /* if getting out of PowerOffSleep mode or restarting NFCC */
168     if (nfc_cb.flags & (NFC_FL_RESTARTING | NFC_FL_POWER_CYCLE_NFCC)) {
169       nfc_cb.flags &= ~(NFC_FL_RESTARTING | NFC_FL_POWER_CYCLE_NFCC);
170       if (nfc_status != NFC_STATUS_OK) {
171         nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP;
172       }
173       (*nfc_cb.p_resp_cback)(NFC_NFCC_RESTART_REVT, &evt_data);
174     } else {
175       (*nfc_cb.p_resp_cback)(NFC_ENABLE_REVT, &evt_data);
176     }
177   }
178 }
179 
180 /*******************************************************************************
181 **
182 ** Function         nfc_enabled
183 **
184 ** Description      NFCC enabled, proceed with stack start up.
185 **
186 ** Returns          void
187 **
188 *******************************************************************************/
nfc_enabled(tNFC_STATUS nfc_status,NFC_HDR * p_init_rsp_msg)189 void nfc_enabled(tNFC_STATUS nfc_status, NFC_HDR* p_init_rsp_msg) {
190   tNFC_RESPONSE evt_data;
191   tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
192   int16_t lremain = 0;
193   uint8_t* p;
194   uint8_t num_interfaces = 0, xx;
195   uint8_t num_interface_extensions = 0, zz;
196   uint8_t interface_type;
197   int yy = 0;
198   memset(&evt_data, 0, sizeof(tNFC_RESPONSE));
199 
200   if (nfc_status == NCI_STATUS_OK) {
201     nfc_set_state(NFC_STATE_IDLE);
202 
203     p = (uint8_t*)(p_init_rsp_msg + 1) + p_init_rsp_msg->offset +
204         NCI_MSG_HDR_SIZE + 1;
205 
206     lremain = p_init_rsp_msg->len - NCI_MSG_HDR_SIZE - 1 - sizeof(uint32_t) - 5;
207     if (lremain < 0) {
208       nfc_status = NCI_STATUS_FAILED;
209       goto plen_err;
210     }
211     /* we currently only support NCI of the same version.
212     * We may need to change this, when we support multiple version of NFCC */
213 
214     evt_data.enable.nci_version = nfc_cb.nci_version;
215     STREAM_TO_UINT32(evt_data.enable.nci_features, p);
216     if (nfc_cb.nci_version == NCI_VERSION_1_0) {
217       /* this byte is consumed in the top expression */
218       STREAM_TO_UINT8(num_interfaces, p);
219       lremain -= num_interfaces;
220       if (lremain < 0) {
221         nfc_status = NCI_STATUS_FAILED;
222         goto plen_err;
223       }
224       evt_data.enable.nci_interfaces = 0;
225       for (xx = 0; xx < num_interfaces; xx++) {
226         if ((*p) <= NCI_INTERFACE_MAX)
227           evt_data.enable.nci_interfaces |= (1 << (*p));
228         else if (((*p) >= NCI_INTERFACE_FIRST_VS) &&
229                  (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) {
230           /* save the VS RF interface in control block, if there's still room */
231           nfc_cb.vs_interface[yy++] = *p;
232         }
233         p++;
234       }
235       nfc_cb.nci_interfaces = evt_data.enable.nci_interfaces;
236       memcpy(evt_data.enable.vs_interface, nfc_cb.vs_interface,
237              NFC_NFCC_MAX_NUM_VS_INTERFACE);
238     }
239     /* four bytes below are consumed in the top expression */
240     // Max nb conn = nb static conn + max nb dynamic conn
241     evt_data.enable.max_conn = NCI_MAX_STATIC_CONN_CBS + *p++;
242     STREAM_TO_UINT16(evt_data.enable.max_ce_table, p);
243 #if (NFC_RW_ONLY == FALSE)
244     nfc_cb.max_ce_table = evt_data.enable.max_ce_table;
245     nfc_cb.nci_features = evt_data.enable.nci_features;
246     nfc_cb.max_conn = evt_data.enable.max_conn;
247 #endif
248     nfc_cb.nci_ctrl_size = *p++; /* Max Control Packet Payload Length */
249     p_cb->init_credits = p_cb->num_buff = 0;
250     nfc_set_conn_id(p_cb, NFC_RF_CONN_ID);
251     if (nfc_cb.nci_version >= NCI_VERSION_2_0) {
252       /* one byte is consumed in the top expression and
253        * 3 bytes from uit16+uint8 below */
254       lremain -= 4;
255       if (lremain < 0) {
256         nfc_status = NCI_STATUS_FAILED;
257         goto plen_err;
258       }
259       if (evt_data.enable.nci_features & NCI_FEAT_HCI_NETWORK) {
260         p_cb = &nfc_cb.conn_cb[NFC_HCI_CONN_ID];
261         nfc_set_conn_id(p_cb, NFC_HCI_CONN_ID);
262         p_cb->id = NFC_HCI_CONN_ID;
263         STREAM_TO_UINT8(p_cb->buff_size, p);
264         STREAM_TO_UINT8(p_cb->num_buff, p);
265         p_cb->init_credits = p_cb->num_buff;
266         evt_data.enable.hci_packet_size = p_cb->buff_size;
267         evt_data.enable.hci_conn_credits = p_cb->init_credits;
268         LOG(VERBOSE) << StringPrintf("%s: hci num_buf=%d buf_size=%d", __func__,
269                                      p_cb->num_buff, p_cb->buff_size);
270       } else {
271         /*HCI n/w not enabled skip data buff size and data credit HCI conn */
272         p += 2;
273       }
274       STREAM_TO_UINT16(evt_data.enable.max_nfc_v_size, p);
275       STREAM_TO_UINT8(num_interfaces, p);
276 #if (NFC_RW_ONLY == FALSE)
277       nfc_cb.hci_packet_size = evt_data.enable.hci_packet_size;
278       nfc_cb.hci_conn_credits = evt_data.enable.hci_conn_credits;
279       nfc_cb.nci_max_v_size = evt_data.enable.max_nfc_v_size;
280 #endif
281       evt_data.enable.nci_interfaces = 0;
282 
283       for (xx = 0; xx < num_interfaces; xx++) {
284         lremain -= 2;
285         if (lremain < 0) {
286           nfc_status = NCI_STATUS_FAILED;
287           goto plen_err;
288         }
289         if ((*p) <= NCI_INTERFACE_MAX)
290           evt_data.enable.nci_interfaces |= (1 << (*p));
291         else if (((*p) >= NCI_INTERFACE_FIRST_VS) &&
292                  (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) {
293           /* save the VS RF interface in control block, if there's still room */
294           nfc_cb.vs_interface[yy++] = *p;
295         }
296         interface_type = *p++;
297         num_interface_extensions = *p++;
298         lremain -= num_interface_extensions;
299         if (lremain < 0) {
300           nfc_status = NCI_STATUS_FAILED;
301           goto plen_err;
302         }
303         for (zz = 0; zz < num_interface_extensions; zz++) {
304           if (((*p) < NCI_INTERFACE_EXTENSION_MAX) &&
305               (interface_type <= NCI_INTERFACE_MAX)) {
306             nfc_cb.nci_intf_extensions |= (1 << (*p));
307             nfc_cb.nci_intf_extension_map[*p] = (1 << interface_type);
308           }
309           p++;
310         }
311       }
312 
313       nfc_cb.nci_interfaces = evt_data.enable.nci_interfaces;
314       memcpy(evt_data.enable.vs_interface, nfc_cb.vs_interface,
315              NFC_NFCC_MAX_NUM_VS_INTERFACE);
316     } else {
317       /* For VERSION_UNKNOWN one byte is consumed in the top expression */
318       lremain -= sizeof(uint16_t) + NFC_NFCC_INFO_LEN +
319                  (nfc_cb.nci_version == NCI_VERSION_1_0 ? 1 : 0);
320       if (lremain < 0) {
321         nfc_status = NCI_STATUS_FAILED;
322         goto plen_err;
323       }
324       STREAM_TO_UINT16(evt_data.enable.max_param_size, p);
325       evt_data.enable.manufacture_id = *p++;
326       STREAM_TO_ARRAY(evt_data.enable.nfcc_info, p, NFC_NFCC_INFO_LEN);
327     }
328     NFC_DiscoveryMap(nfc_cb.num_disc_maps,
329                      (tNCI_DISCOVER_MAPS*)nfc_cb.p_disc_maps, nullptr);
330   }
331   /* else not successful. the buffers will be freed in nfc_free_conn_cb () */
332   else {
333   plen_err:
334     if (nfc_cb.flags & NFC_FL_RESTARTING) {
335       nfc_set_state(NFC_STATE_NFCC_POWER_OFF_SLEEP);
336     } else {
337       nfc_free_conn_cb(p_cb);
338 
339       /* if NFCC didn't respond to CORE_RESET or CORE_INIT */
340       if (nfc_cb.nfc_state == NFC_STATE_CORE_INIT) {
341         /* report status after closing HAL */
342         nfc_cb.p_hal->close();
343         return;
344       } else
345         nfc_set_state(NFC_STATE_NONE);
346     }
347   }
348 
349   nfc_main_notify_enable_status(nfc_status);
350 }
351 
352 /*******************************************************************************
353 **
354 ** Function         nfc_set_state
355 **
356 ** Description      Set the state of NFC stack
357 **
358 ** Returns          void
359 **
360 *******************************************************************************/
nfc_set_state(tNFC_STATE nfc_state)361 void nfc_set_state(tNFC_STATE nfc_state) {
362   LOG(VERBOSE) << StringPrintf("%s: nfc_state=%d (%s)->%d (%s)", __func__,
363                                nfc_cb.nfc_state,
364                                nfc_state_name(nfc_cb.nfc_state).c_str(),
365                                nfc_state, nfc_state_name(nfc_state).c_str());
366   nfc_cb.nfc_state = nfc_state;
367 }
368 
369 /*******************************************************************************
370 **
371 ** Function         nfc_gen_cleanup
372 **
373 ** Description      Clean up for both going into low power mode and disabling
374 **                  NFC
375 **
376 *******************************************************************************/
nfc_gen_cleanup(void)377 void nfc_gen_cleanup(void) {
378   nfc_cb.flags &= ~NFC_FL_DEACTIVATING;
379   if (!gki_utils) {
380     gki_utils = new GkiUtils();
381   }
382 
383   /* the HAL pre-discover is still active - clear the pending flag/free the
384    * buffer */
385   if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) {
386     nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
387     gki_utils->freebuf(nfc_cb.p_disc_pending);
388     nfc_cb.p_disc_pending = nullptr;
389   }
390 
391   nfc_cb.flags &= ~(NFC_FL_CONTROL_REQUESTED | NFC_FL_CONTROL_GRANTED |
392                     NFC_FL_HAL_REQUESTED);
393 
394   nfc_stop_timer(&nfc_cb.deactivate_timer);
395 
396   /* Reset the connection control blocks */
397   nfc_reset_all_conn_cbs();
398 
399   if (nfc_cb.p_nci_init_rsp) {
400     gki_utils->freebuf(nfc_cb.p_nci_init_rsp);
401     nfc_cb.p_nci_init_rsp = nullptr;
402   }
403 
404   /* clear any pending CMD/RSP */
405   nfc_main_flush_cmd_queue();
406 }
407 
408 /*******************************************************************************
409 **
410 ** Function         nfc_main_handle_hal_evt
411 **
412 ** Description      Handle BT_EVT_TO_NFC_MSGS
413 **
414 *******************************************************************************/
nfc_main_handle_hal_evt(tNFC_HAL_EVT_MSG * p_msg)415 void nfc_main_handle_hal_evt(tNFC_HAL_EVT_MSG* p_msg) {
416   uint8_t* ps;
417 
418   LOG(VERBOSE) << StringPrintf("%s: event=0x%x", __func__, p_msg->hal_evt);
419 
420   switch (p_msg->hal_evt) {
421     case HAL_NFC_OPEN_CPLT_EVT: /* only for failure case */
422       nfc_enabled(NFC_STATUS_FAILED, nullptr);
423       break;
424 
425     case HAL_NFC_CLOSE_CPLT_EVT:
426       if (nfc_cb.p_resp_cback) {
427         if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE) {
428           if (nfc_cb.flags & NFC_FL_POWER_OFF_SLEEP) {
429             nfc_cb.flags &= ~NFC_FL_POWER_OFF_SLEEP;
430             nfc_set_state(NFC_STATE_NFCC_POWER_OFF_SLEEP);
431             (*nfc_cb.p_resp_cback)(NFC_NFCC_POWER_OFF_REVT, nullptr);
432           } else {
433             nfc_set_state(NFC_STATE_NONE);
434             (*nfc_cb.p_resp_cback)(NFC_DISABLE_REVT, nullptr);
435             nfc_cb.p_resp_cback = nullptr;
436           }
437         } else {
438           /* found error during initialization */
439           nfc_set_state(NFC_STATE_NONE);
440           nfc_main_notify_enable_status(NFC_STATUS_FAILED);
441         }
442       }
443       break;
444 
445     case HAL_NFC_POST_INIT_CPLT_EVT:
446       if (nfc_cb.nfcc_mode == ENABLE_MODE_TRANSPARENT) {
447         nfc_set_state(NFC_STATE_IDLE);
448         nfa_sys_cback_notify_partial_enable_complete(NFA_ID_SYS);
449       } else if (nfc_cb.p_nci_init_rsp) {
450         /*
451         ** if NFC_Disable() is called before receiving
452         ** HAL_NFC_POST_INIT_CPLT_EVT, then wait for HAL_NFC_CLOSE_CPLT_EVT.
453         */
454         if (nfc_cb.nfc_state == NFC_STATE_W4_POST_INIT_CPLT) {
455           if (p_msg->status == HAL_NFC_STATUS_OK) {
456             nfc_enabled(NCI_STATUS_OK, nfc_cb.p_nci_init_rsp);
457           } else /* if post initailization failed */
458           {
459             nfc_enabled(NCI_STATUS_FAILED, nullptr);
460           }
461         }
462 
463         GKI_freebuf(nfc_cb.p_nci_init_rsp);
464         nfc_cb.p_nci_init_rsp = nullptr;
465       }
466       break;
467 
468     case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
469       /* restore the command window, no matter if the discover command is still
470        * pending */
471       nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
472       nfc_cb.flags &= ~NFC_FL_CONTROL_GRANTED;
473       if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) {
474         /* issue the discovery command now, if it is still pending */
475         nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
476         ps = (uint8_t*)nfc_cb.p_disc_pending;
477         nci_snd_discover_cmd(*ps, (tNFC_DISCOVER_PARAMS*)(ps + 1));
478         GKI_freebuf(nfc_cb.p_disc_pending);
479         nfc_cb.p_disc_pending = nullptr;
480       } else {
481         /* check if there's other pending commands */
482         nfc_ncif_check_cmd_queue(nullptr);
483       }
484 
485       if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT)
486         nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
487       break;
488 
489     case HAL_NFC_REQUEST_CONTROL_EVT:
490       nfc_cb.flags |= NFC_FL_CONTROL_REQUESTED;
491       nfc_cb.flags |= NFC_FL_HAL_REQUESTED;
492       nfc_ncif_check_cmd_queue(nullptr);
493       break;
494 
495     case HAL_NFC_RELEASE_CONTROL_EVT:
496       if (nfc_cb.flags & NFC_FL_CONTROL_GRANTED) {
497         nfc_cb.flags &= ~NFC_FL_CONTROL_GRANTED;
498         nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
499         nfc_ncif_check_cmd_queue(nullptr);
500 
501         if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT)
502           nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
503       }
504       break;
505 
506     case HAL_NFC_ERROR_EVT:
507       switch (p_msg->status) {
508         case HAL_NFC_STATUS_ERR_TRANSPORT:
509           /* Notify app of transport error */
510           if (nfc_cb.p_resp_cback) {
511             (*nfc_cb.p_resp_cback)(NFC_NFCC_TRANSPORT_ERR_REVT, nullptr);
512 
513             /* if enabling NFC, notify upper layer of failure after closing HAL
514              */
515             if (nfc_cb.nfc_state < NFC_STATE_IDLE) {
516               nfc_enabled(NFC_STATUS_FAILED, nullptr);
517             }
518           }
519           break;
520 
521         case HAL_NFC_STATUS_ERR_CMD_TIMEOUT:
522           nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
523 
524           /* if enabling NFC, notify upper layer of failure after closing HAL */
525           if (nfc_cb.nfc_state < NFC_STATE_IDLE) {
526             nfc_enabled(NFC_STATUS_FAILED, nullptr);
527             return;
528           }
529           break;
530 
531         default:
532           break;
533       }
534       break;
535 
536     case HAL_HCI_NETWORK_RESET:
537       delete_stack_non_volatile_store(true);
538       break;
539 
540     default:
541       LOG(ERROR) << StringPrintf("%s: unhandled event (0x%x)", __func__,
542                                  p_msg->hal_evt);
543       break;
544   }
545 }
546 
547 /*******************************************************************************
548 **
549 ** Function         nfc_main_flush_cmd_queue
550 **
551 ** Description      This function is called when setting power off sleep state.
552 **
553 ** Returns          void
554 **
555 *******************************************************************************/
nfc_main_flush_cmd_queue(void)556 void nfc_main_flush_cmd_queue(void) {
557   NFC_HDR* p_msg;
558 
559   if (!gki_utils) {
560     gki_utils = new GkiUtils();
561   }
562 
563   LOG(VERBOSE) << __func__;
564 
565   /* initialize command window */
566   nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
567 
568   /* Stop command-pending timer */
569   nfc_stop_timer(&nfc_cb.nci_wait_rsp_timer);
570 
571   /* dequeue and free buffer */
572   while ((p_msg = (NFC_HDR*)gki_utils->dequeue(&nfc_cb.nci_cmd_xmit_q)) !=
573          nullptr) {
574     gki_utils->freebuf(p_msg);
575   }
576 }
577 
578 /*******************************************************************************
579 **
580 ** Function         nfc_main_post_hal_evt
581 **
582 ** Description      This function posts HAL event to NFC_TASK
583 **
584 ** Returns          void
585 **
586 *******************************************************************************/
nfc_main_post_hal_evt(uint8_t hal_evt,tHAL_NFC_STATUS status)587 void nfc_main_post_hal_evt(uint8_t hal_evt, tHAL_NFC_STATUS status) {
588   tNFC_HAL_EVT_MSG* p_msg;
589 
590   p_msg = (tNFC_HAL_EVT_MSG*)GKI_getbuf(sizeof(tNFC_HAL_EVT_MSG));
591   if (p_msg != nullptr) {
592     /* Initialize NFC_HDR */
593     p_msg->hdr.len = 0;
594     p_msg->hdr.event = BT_EVT_TO_NFC_MSGS;
595     p_msg->hdr.offset = 0;
596     p_msg->hdr.layer_specific = 0;
597     p_msg->hal_evt = hal_evt;
598     p_msg->status = status;
599     GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
600   } else {
601     LOG(ERROR) << StringPrintf("%s: No buffer", __func__);
602   }
603 }
604 
605 /*******************************************************************************
606 **
607 ** Function         nfc_main_hal_cback
608 **
609 ** Description      HAL event handler
610 **
611 ** Returns          void
612 **
613 *******************************************************************************/
nfc_main_hal_cback(uint8_t event,tHAL_NFC_STATUS status)614 static void nfc_main_hal_cback(uint8_t event, tHAL_NFC_STATUS status) {
615   LOG(VERBOSE) << StringPrintf("%s: event=%s(0x%x), status=%d", __func__,
616                                nfc_hal_event_name(event).c_str(), event,
617                                status);
618 
619   switch (event) {
620     case HAL_NFC_OPEN_CPLT_EVT:
621       /*
622       ** if NFC_Disable() is called before receiving HAL_NFC_OPEN_CPLT_EVT,
623       ** then wait for HAL_NFC_CLOSE_CPLT_EVT.
624       */
625       if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_OPEN) {
626         if (status == HAL_NFC_STATUS_OK) {
627           /* Notify NFC_TASK that NCI tranport is initialized */
628           GKI_send_event(NFC_TASK, NFC_TASK_EVT_TRANSPORT_READY);
629         } else {
630           nfc_main_post_hal_evt(event, status);
631         }
632       }
633       break;
634 
635     case HAL_NFC_CLOSE_CPLT_EVT:
636     case HAL_NFC_POST_INIT_CPLT_EVT:
637     case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
638     case HAL_NFC_REQUEST_CONTROL_EVT:
639     case HAL_NFC_RELEASE_CONTROL_EVT:
640     case HAL_NFC_ERROR_EVT:
641     case HAL_HCI_NETWORK_RESET:
642       nfc_main_post_hal_evt(event, status);
643       break;
644 
645     default:
646       LOG(VERBOSE) << StringPrintf("%s: unhandled event %x", __func__, event);
647       break;
648   }
649 }
650 
651 /*******************************************************************************
652 **
653 ** Function         nfc_main_hal_data_cback
654 **
655 ** Description      HAL data event handler
656 **
657 ** Returns          void
658 **
659 *******************************************************************************/
nfc_main_hal_data_cback(uint16_t data_len,uint8_t * p_data)660 static void nfc_main_hal_data_cback(uint16_t data_len, uint8_t* p_data) {
661   NFC_HDR* p_msg;
662 
663   /* ignore all data while shutting down NFCC */
664   if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE) {
665     return;
666   }
667 
668   if (p_data) {
669 #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
670     // GKI_getpoolbuf returns a fixed size of memory buffer, which is usually
671     // bigger than NFC packets. This may hide OOB issues.
672     p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR) + NFC_RECEIVE_MSGS_OFFSET +
673                                  data_len);
674 #else
675     p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_NCI_POOL_ID);
676 #endif
677     if (p_msg != nullptr) {
678       /* Initialize NFC_HDR */
679       p_msg->len = data_len;
680       p_msg->event = BT_EVT_TO_NFC_NCI;
681       p_msg->offset = NFC_RECEIVE_MSGS_OFFSET;
682 
683       /* no need to check length, it always less than pool size */
684       memcpy((uint8_t*)(p_msg + 1) + p_msg->offset, p_data, p_msg->len);
685 
686       GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
687     } else {
688       LOG(ERROR) << StringPrintf("%s: No buffer", __func__);
689     }
690   }
691 }
692 
693 /*******************************************************************************
694 **
695 ** Function         NFC_Enable
696 **
697 ** Description      This function enables NFC. Prior to calling NFC_Enable:
698 **                  - the NFCC must be powered up, and ready to receive
699 **                    commands.
700 **                  - GKI must be enabled
701 **                  - NFC_TASK must be started
702 **                  - NCIT_TASK must be started (if using dedicated NCI
703 **                    transport)
704 **
705 **                  This function opens the NCI transport (if applicable),
706 **                  resets the NFC controller, and initializes the NFC
707 **                  subsystems.
708 **
709 **                  When the NFC startup procedure is completed, an
710 **                  NFC_ENABLE_REVT is returned to the application using the
711 **                  tNFC_RESPONSE_CBACK.
712 **
713 ** Returns          tNFC_STATUS
714 **
715 *******************************************************************************/
NFC_Enable(tNFC_RESPONSE_CBACK * p_cback)716 tNFC_STATUS NFC_Enable(tNFC_RESPONSE_CBACK* p_cback) {
717   LOG(VERBOSE) << __func__;
718 
719   /* Validate callback */
720   if (!p_cback) {
721     return (NFC_STATUS_INVALID_PARAM);
722   }
723   nfc_cb.p_resp_cback = p_cback;
724 
725   /* Open HAL transport. */
726   nfc_set_state(NFC_STATE_W4_HAL_OPEN);
727   nfc_cb.p_hal->open(nfc_main_hal_cback, nfc_main_hal_data_cback);
728 
729   return (NFC_STATUS_OK);
730 }
731 
732 /*******************************************************************************
733 **
734 ** Function         NFC_Disable
735 **
736 ** Description      This function performs clean up routines for shutting down
737 **                  NFC and closes the NCI transport (if using dedicated NCI
738 **                  transport).
739 **
740 **                  When the NFC shutdown procedure is completed, an
741 **                  NFC_DISABLED_REVT is returned to the application using the
742 **                  tNFC_RESPONSE_CBACK.
743 **
744 ** Returns          nothing
745 **
746 *******************************************************************************/
NFC_Disable(void)747 void NFC_Disable(void) {
748   LOG(VERBOSE) << StringPrintf("%s: nfc_state = %d", __func__,
749                                nfc_cb.nfc_state);
750 
751   if ((nfc_cb.nfc_state == NFC_STATE_NONE) ||
752       (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) {
753     nfc_set_state(NFC_STATE_NONE);
754     if (nfc_cb.p_resp_cback) {
755       (*nfc_cb.p_resp_cback)(NFC_DISABLE_REVT, nullptr);
756       nfc_cb.p_resp_cback = nullptr;
757     }
758     return;
759   }
760 
761   /* Close transport and clean up */
762   nfc_task_shutdown_nfcc();
763 }
764 
765 /*******************************************************************************
766 **
767 ** Function         NFC_Init
768 **
769 ** Description      This function initializes control block for NFC
770 **
771 ** Returns          nothing
772 **
773 *******************************************************************************/
NFC_Init(tHAL_NFC_ENTRY * p_hal_entry_tbl)774 void NFC_Init(tHAL_NFC_ENTRY* p_hal_entry_tbl) {
775   int xx;
776 
777   /* Clear nfc control block */
778   memset(&nfc_cb, 0, sizeof(tNFC_CB));
779 
780   /* Reset the nfc control block */
781   for (xx = 0; xx < NCI_MAX_CONN_CBS; xx++) {
782     nfc_cb.conn_cb[xx].conn_id = NFC_ILLEGAL_CONN_ID;
783   }
784 
785   /* NCI init */
786   nfc_cb.p_hal = p_hal_entry_tbl;
787   nfc_cb.nfc_state = NFC_STATE_NONE;
788   nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
789   nfc_cb.nci_wait_rsp_tout = NFC_CMD_CMPL_TIMEOUT;
790   nfc_cb.p_disc_maps = nfc_interface_mapping;
791   nfc_cb.num_disc_maps = NFC_NUM_INTERFACE_MAP;
792   nfc_cb.nci_ctrl_size = NCI_CTRL_INIT_SIZE;
793   nfc_cb.reassembly = true;
794   nfc_cb.nci_version = NCI_VERSION_UNKNOWN;
795   GKI_init_timer_list(&nfc_cb.timer_queue);
796   GKI_init_timer_list(&nfc_cb.quick_timer_queue);
797   rw_init();
798   ce_init();
799   NFC_SET_MAX_CONN_DEFAULT();
800 }
801 
802 /*******************************************************************************
803 **
804 ** Function         NFC_GetLmrtSize
805 **
806 ** Description      Called by application wto query the Listen Mode Routing
807 **                  Table size supported by NFCC
808 **
809 ** Returns          Listen Mode Routing Table size
810 **
811 *******************************************************************************/
NFC_GetLmrtSize(void)812 uint16_t NFC_GetLmrtSize(void) {
813   uint16_t size = 0;
814 #if (NFC_RW_ONLY == FALSE)
815   size = nfc_cb.max_ce_table;
816 #endif
817   return size;
818 }
819 
820 /*******************************************************************************
821 **
822 ** Function         NFC_SetConfig
823 **
824 ** Description      This function is called to send the configuration parameter
825 **                  TLV to NFCC. The response from NFCC is reported by
826 **                  tNFC_RESPONSE_CBACK as NFC_SET_CONFIG_REVT.
827 **
828 ** Parameters       tlv_size - the length of p_param_tlvs.
829 **                  p_param_tlvs - the parameter ID/Len/Value list
830 **
831 ** Returns          tNFC_STATUS
832 **
833 *******************************************************************************/
NFC_SetConfig(uint8_t tlv_size,uint8_t * p_param_tlvs)834 tNFC_STATUS NFC_SetConfig(uint8_t tlv_size, uint8_t* p_param_tlvs) {
835   return nci_snd_core_set_config(p_param_tlvs, tlv_size);
836 }
837 
838 /*******************************************************************************
839 **
840 ** Function         NFC_GetConfig
841 **
842 ** Description      This function is called to retrieve the parameter TLV from
843 **                  NFCC. The response from NFCC is reported by
844 **                  tNFC_RESPONSE_CBACK as NFC_GET_CONFIG_REVT.
845 **
846 ** Parameters       num_ids - the number of parameter IDs
847 **                  p_param_ids - the parameter ID list.
848 **
849 ** Returns          tNFC_STATUS
850 **
851 *******************************************************************************/
NFC_GetConfig(uint8_t num_ids,uint8_t * p_param_ids)852 tNFC_STATUS NFC_GetConfig(uint8_t num_ids, uint8_t* p_param_ids) {
853   return nci_snd_core_get_config(p_param_ids, num_ids);
854 }
855 
856 /*******************************************************************************
857 **
858 ** Function         NFC_DiscoveryMap
859 **
860 ** Description      This function is called to set the discovery interface
861 **                  mapping. The response from NFCC is reported by
862 **                  tNFC_DISCOVER_CBACK as NFC_MAP_DEVT.
863 **
864 ** Parameters       num - the number of items in p_params.
865 **                  p_maps - the discovery interface mappings
866 **                  p_cback - the discovery callback function
867 **
868 ** Returns          tNFC_STATUS
869 **
870 *******************************************************************************/
NFC_DiscoveryMap(uint8_t num,tNFC_DISCOVER_MAPS * p_maps,tNFC_DISCOVER_CBACK * p_cback)871 tNFC_STATUS NFC_DiscoveryMap(uint8_t num, tNFC_DISCOVER_MAPS* p_maps,
872                              tNFC_DISCOVER_CBACK* p_cback) {
873   uint8_t num_disc_maps = num;
874   uint8_t xx, yy, num_intf, intf_mask;
875   tNFC_DISCOVER_MAPS
876       max_maps[NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX];
877   bool is_supported;
878 
879   nfc_cb.p_discv_cback = p_cback;
880   num_intf = 0;
881   LOG(VERBOSE) << StringPrintf("%s: nci_interfaces supported by NFCC=0x%x",
882                                __func__, nfc_cb.nci_interfaces);
883 
884   for (xx = 0; xx < NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX; xx++) {
885     memset(&max_maps[xx], 0x00, sizeof(tNFC_DISCOVER_MAPS));
886   }
887 
888   for (xx = 0; xx < num_disc_maps; xx++) {
889     is_supported = false;
890     if (p_maps[xx].intf_type > NCI_INTERFACE_MAX) {
891       for (yy = 0; yy < NFC_NFCC_MAX_NUM_VS_INTERFACE; yy++) {
892         if (nfc_cb.vs_interface[yy] == p_maps[xx].intf_type)
893           is_supported = true;
894       }
895       LOG(VERBOSE) << StringPrintf(
896           "%s: [%d]: vs intf_type=0x%x is_supported=%d", __func__, xx,
897           p_maps[xx].intf_type, is_supported);
898     } else {
899       intf_mask = (1 << (p_maps[xx].intf_type));
900       if (intf_mask & nfc_cb.nci_interfaces) {
901         is_supported = true;
902       }
903       LOG(VERBOSE) << StringPrintf(
904           "%s: [%d]: intf_type=%d intf_mask=0x%x is_supported=%d", __func__, xx,
905           p_maps[xx].intf_type, intf_mask, is_supported);
906     }
907     if (is_supported)
908       memcpy(&max_maps[num_intf++], &p_maps[xx], sizeof(tNFC_DISCOVER_MAPS));
909     else {
910       LOG(WARNING) << StringPrintf(
911           "%s:  interface=0x%x is not supported by NFCC", __func__,
912           p_maps[xx].intf_type);
913     }
914   }
915 
916   return nci_snd_discover_map_cmd(num_intf, (tNCI_DISCOVER_MAPS*)max_maps);
917 }
918 
919 /*******************************************************************************
920 **
921 ** Function         NFC_DiscoveryStart
922 **
923 ** Description      This function is called to start Polling and/or Listening.
924 **                  The response from NFCC is reported by tNFC_DISCOVER_CBACK as
925 **                  NFC_START_DEVT. The notification from NFCC is reported by
926 **                  tNFC_DISCOVER_CBACK as NFC_RESULT_DEVT.
927 **
928 ** Parameters       num_params - the number of items in p_params.
929 **                  p_params - the discovery parameters
930 **                  p_cback - the discovery callback function
931 **
932 ** Returns          tNFC_STATUS
933 **
934 *******************************************************************************/
NFC_DiscoveryStart(uint8_t num_params,tNFC_DISCOVER_PARAMS * p_params,tNFC_DISCOVER_CBACK * p_cback)935 tNFC_STATUS NFC_DiscoveryStart(uint8_t num_params,
936                                tNFC_DISCOVER_PARAMS* p_params,
937                                tNFC_DISCOVER_CBACK* p_cback) {
938   uint8_t* p;
939   int params_size;
940   tNFC_STATUS status = NFC_STATUS_NO_BUFFERS;
941 
942   LOG(VERBOSE) << __func__;
943   if (nfc_cb.p_disc_pending) {
944     LOG(ERROR) << StringPrintf("%s: There's pending NFC_DiscoveryStart",
945                                __func__);
946     status = NFC_STATUS_BUSY;
947   } else {
948     nfc_cb.p_discv_cback = p_cback;
949     nfc_cb.flags |= NFC_FL_DISCOVER_PENDING;
950     nfc_cb.flags |= NFC_FL_CONTROL_REQUESTED;
951     params_size = sizeof(tNFC_DISCOVER_PARAMS) * num_params;
952     nfc_cb.p_disc_pending =
953         GKI_getbuf((uint16_t)(NFC_HDR_SIZE + 1 + params_size));
954     if (nfc_cb.p_disc_pending) {
955       p = (uint8_t*)nfc_cb.p_disc_pending;
956       *p++ = num_params;
957       memcpy(p, p_params, params_size);
958       status = NFC_STATUS_CMD_STARTED;
959       nfc_ncif_check_cmd_queue(nullptr);
960     }
961   }
962 
963   LOG(VERBOSE) << StringPrintf("%s: status=0x%x", __func__, status);
964   return status;
965 }
966 
967 /*******************************************************************************
968 **
969 ** Function         NFC_DiscoverySelect
970 **
971 ** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
972 **                  the application needs to use this function to select the
973 **                  the logical endpoint to continue. The response from NFCC is
974 **                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
975 **
976 ** Parameters       rf_disc_id - The ID identifies the remote device.
977 **                  protocol - the logical endpoint on the remote device
978 **                  rf_interface - the RF interface to communicate with NFCC
979 **
980 ** Returns          tNFC_STATUS
981 **
982 *******************************************************************************/
NFC_DiscoverySelect(uint8_t rf_disc_id,uint8_t protocol,uint8_t rf_interface)983 tNFC_STATUS NFC_DiscoverySelect(uint8_t rf_disc_id, uint8_t protocol,
984                                 uint8_t rf_interface) {
985   return nci_snd_discover_select_cmd(rf_disc_id, protocol, rf_interface);
986 }
987 
988 /*******************************************************************************
989 **
990 ** Function         NFC_StartRfIntfExtension
991 **
992 ** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
993 **                  the application needs to use this function to select the
994 **                  the logical endpoint to continue. The response from NFCC is
995 **                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
996 **
997 ** Parameters       rf_disc_id - The ID identifies the remote device.
998 **                  protocol - the logical endpoint on the remote device
999 **                  rf_interface - the RF interface to communicate with NFCC
1000 **
1001 ** Returns          tNFC_STATUS
1002 **
1003 *******************************************************************************/
NFC_StartRfIntfExtension(uint8_t rf_ext_id,uint8_t * p_data,uint8_t len)1004 tNFC_STATUS NFC_StartRfIntfExtension(uint8_t rf_ext_id, uint8_t* p_data,
1005                                      uint8_t len) {
1006   return nci_snd_rf_extension_control_cmd(NFC_RF_INTF_EXT_START, rf_ext_id,
1007                                           p_data, len);
1008 }
1009 
1010 /*******************************************************************************
1011 **
1012 ** Function         NFC_StopRfIntfExtension
1013 **
1014 ** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
1015 **                  the application needs to use this function to select the
1016 **                  the logical endpoint to continue. The response from NFCC is
1017 **                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
1018 **
1019 ** Parameters       rf_disc_id - The ID identifies the remote device.
1020 **                  protocol - the logical endpoint on the remote device
1021 **                  rf_interface - the RF interface to communicate with NFCC
1022 **
1023 ** Returns          tNFC_STATUS
1024 **
1025 *******************************************************************************/
NFC_StopRfIntfExtension(uint8_t rf_ext_id,uint8_t * p_data,uint8_t len)1026 tNFC_STATUS NFC_StopRfIntfExtension(uint8_t rf_ext_id, uint8_t* p_data,
1027                                     uint8_t len) {
1028   return nci_snd_rf_extension_control_cmd(NFC_RF_INTF_EXT_STOP, rf_ext_id,
1029                                           p_data, len);
1030 }
1031 
1032 /*******************************************************************************
1033 **
1034 ** Function         NFC_StartEPRemovalDetection
1035 **
1036 ** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
1037 **                  the application needs to use this function to select the
1038 **                  the logical endpoint to continue. The response from NFCC is
1039 **                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
1040 **
1041 ** Parameters       rf_disc_id - The ID identifies the remote device.
1042 **                  protocol - the logical endpoint on the remote device
1043 **                  rf_interface - the RF interface to communicate with NFCC
1044 **
1045 ** Returns          tNFC_STATUS
1046 **
1047 *******************************************************************************/
NFC_StartEPRemovalDetection(uint8_t waiting_time)1048 tNFC_STATUS NFC_StartEPRemovalDetection(uint8_t waiting_time) {
1049   return nci_snd_ep_removal_detection_cmd(waiting_time);
1050 }
1051 
1052 /*******************************************************************************
1053 **
1054 ** Function         NFC_StartPowerTransfert
1055 **
1056 ** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
1057 **                  the application needs to use this function to select the
1058 **                  the logical endpoint to continue. The response from NFCC is
1059 **                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
1060 **
1061 ** Parameters       rf_disc_id - The ID identifies the remote device.
1062 **                  protocol - the logical endpoint on the remote device
1063 **                  rf_interface - the RF interface to communicate with NFCC
1064 **
1065 ** Returns          tNFC_STATUS
1066 **
1067 *******************************************************************************/
NFC_StartPowerTransfert(uint8_t * p_param,uint8_t param_len)1068 tNFC_STATUS NFC_StartPowerTransfert(uint8_t* p_param, uint8_t param_len) {
1069   return nci_snd_rf_wpt_control_cmd(p_param, param_len);
1070 }
1071 
1072 /*******************************************************************************
1073 **
1074 ** Function         NFC_ConnCreate
1075 **
1076 ** Description      This function is called to create a logical connection with
1077 **                  NFCC for data exchange.
1078 **
1079 ** Parameters       dest_type - the destination type
1080 **                  id   - the NFCEE ID or RF Discovery ID .
1081 **                  protocol   - the protocol.
1082 **                  p_cback - the connection callback function
1083 **
1084 ** Returns          tNFC_STATUS
1085 **
1086 *******************************************************************************/
NFC_ConnCreate(uint8_t dest_type,uint8_t id,uint8_t protocol,tNFC_CONN_CBACK * p_cback)1087 tNFC_STATUS NFC_ConnCreate(uint8_t dest_type, uint8_t id, uint8_t protocol,
1088                            tNFC_CONN_CBACK* p_cback) {
1089   tNFC_STATUS status = NFC_STATUS_FAILED;
1090   tNFC_CONN_CB* p_cb;
1091   uint8_t num_tlv = 0, tlv_size = 0;
1092   uint8_t param_tlvs[4], *pp;
1093 
1094   LOG(VERBOSE) << StringPrintf("%s", __func__);
1095 
1096   p_cb = nfc_alloc_conn_cb(p_cback);
1097   if (p_cb) {
1098     p_cb->id = id;
1099     pp = param_tlvs;
1100     if (dest_type == NCI_DEST_TYPE_NFCEE) {
1101       num_tlv = 1;
1102       UINT8_TO_STREAM(pp, NCI_CON_CREATE_TAG_NFCEE_VAL);
1103       UINT8_TO_STREAM(pp, 2);
1104       UINT8_TO_STREAM(pp, id);
1105       UINT8_TO_STREAM(pp, protocol);
1106       tlv_size = 4;
1107     } else if (dest_type == NCI_DEST_TYPE_REMOTE) {
1108       num_tlv = 1;
1109       UINT8_TO_STREAM(pp, NCI_CON_CREATE_TAG_RF_DISC_ID);
1110       UINT8_TO_STREAM(pp, 1);
1111       UINT8_TO_STREAM(pp, id);
1112       tlv_size = 3;
1113     } else if (dest_type == NCI_DEST_TYPE_NFCC) {
1114       p_cb->id = NFC_TEST_ID;
1115     }
1116     /* Add handling of NCI_DEST_TYPE_REMOTE when more RF interface definitions
1117      * are added */
1118     p_cb->act_protocol = protocol;
1119     p_cb->p_cback = p_cback;
1120     status = nci_snd_core_conn_create(dest_type, num_tlv, tlv_size, param_tlvs);
1121     if (status == NFC_STATUS_FAILED) nfc_free_conn_cb(p_cb);
1122   }
1123   return status;
1124 }
1125 
1126 /*******************************************************************************
1127 **
1128 ** Function         NFC_ConnClose
1129 **
1130 ** Description      This function is called to close a logical connection with
1131 **                  NFCC.
1132 **
1133 ** Parameters       conn_id - the connection id.
1134 **
1135 ** Returns          tNFC_STATUS
1136 **
1137 *******************************************************************************/
NFC_ConnClose(uint8_t conn_id)1138 tNFC_STATUS NFC_ConnClose(uint8_t conn_id) {
1139   tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id);
1140   tNFC_STATUS status = NFC_STATUS_FAILED;
1141 
1142   if (p_cb) {
1143     status = nci_snd_core_conn_close(conn_id);
1144   }
1145   return status;
1146 }
1147 
1148 /*******************************************************************************
1149 **
1150 ** Function         NFC_SetStaticRfCback
1151 **
1152 ** Description      This function is called to update the data callback function
1153 **                  to receive the data for the given connection id.
1154 **
1155 ** Parameters       p_cback - the connection callback function
1156 **
1157 ** Returns          Nothing
1158 **
1159 *******************************************************************************/
NFC_SetStaticRfCback(tNFC_CONN_CBACK * p_cback)1160 void NFC_SetStaticRfCback(tNFC_CONN_CBACK* p_cback) {
1161   tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
1162 
1163   p_cb->p_cback = p_cback;
1164   /* just in case DH has received NCI data before the data callback is set
1165    * check if there's any data event to report on this connection id */
1166   nfc_data_event(p_cb);
1167 }
1168 
1169 /*******************************************************************************
1170 **
1171 ** Function         NFC_SetStaticT4tNfceeCback
1172 **
1173 ** Description      This function is called to update the data callback function
1174 **                  to receive the data for the given connection id.
1175 **
1176 ** Parameters       p_cback - the connection callback function
1177 **                  connId - connection ID for T4T NFCEE
1178 **
1179 ** Returns          Nothing
1180 **
1181 *******************************************************************************/
NFC_SetStaticT4tNfceeCback(tNFC_CONN_CBACK * p_cback,uint8_t connId)1182 void NFC_SetStaticT4tNfceeCback(tNFC_CONN_CBACK* p_cback, uint8_t connId) {
1183   // tNFC_CONN_CB * p_cb = &nfc_cb.conn_cb[];
1184   tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(connId);
1185   if (p_cb != NULL) {
1186     p_cb->p_cback = p_cback;
1187     /* just in case DH has received NCI data before the data callback is set
1188      * check if there's any data event to report on this connection id */
1189     nfc_data_event(p_cb);
1190     LOG(DEBUG) << StringPrintf("%s: %p, p_cb->p_cback = %p", __func__, p_cb,
1191                                p_cb->p_cback);
1192   }
1193 }
1194 
1195 /*******************************************************************************
1196 **
1197 ** Function         NFC_SetReassemblyFlag
1198 **
1199 ** Description      This function is called to set if nfc will reassemble
1200 **                  nci packet as much as its buffer can hold or it should not
1201 **                  reassemble but forward the fragmented nci packet to layer
1202 **                  above. If nci data pkt is fragmented, nfc may send multiple
1203 **                  NFC_DATA_CEVT with status NFC_STATUS_CONTINUE before sending
1204 **                  NFC_DATA_CEVT with status NFC_STATUS_OK based on reassembly
1205 **                  configuration and reassembly buffer size
1206 **
1207 ** Parameters       reassembly - flag to indicate if nfc may reassemble or not
1208 **
1209 ** Returns          Nothing
1210 **
1211 *******************************************************************************/
NFC_SetReassemblyFlag(bool reassembly)1212 void NFC_SetReassemblyFlag(bool reassembly) { nfc_cb.reassembly = reassembly; }
1213 
1214 /*******************************************************************************
1215 **
1216 ** Function         NFC_SendData
1217 **
1218 ** Description      This function is called to send the given data packet
1219 **                  to the connection identified by the given connection id.
1220 **
1221 ** Parameters       conn_id - the connection id.
1222 **                  p_data - the data packet.
1223 **                  p_data->offset must be >= NCI_MSG_OFFSET_SIZE +
1224 **                  NCI_DATA_HDR_SIZE
1225 **                  The data payload starts at
1226 **                  ((uint8_t *) (p_data + 1) + p_data->offset)
1227 **
1228 ** Returns          tNFC_STATUS
1229 **
1230 *******************************************************************************/
NFC_SendData(uint8_t conn_id,NFC_HDR * p_data)1231 tNFC_STATUS NFC_SendData(uint8_t conn_id, NFC_HDR* p_data) {
1232   if (!gki_utils) {
1233     gki_utils = new GkiUtils();
1234   }
1235   tNFC_STATUS status = NFC_STATUS_FAILED;
1236   tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id);
1237 
1238   if (p_cb && p_data &&
1239       p_data->offset >= NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE) {
1240     status = nfc_ncif_send_data(p_cb, p_data);
1241   }
1242 
1243   if (status != NFC_STATUS_OK) gki_utils->freebuf(p_data);
1244 
1245   return status;
1246 }
1247 
1248 /*******************************************************************************
1249 **
1250 ** Function         NFC_FlushData
1251 **
1252 ** Description      This function is called to discard the tx data queue of
1253 **                  the given connection id.
1254 **
1255 ** Parameters       conn_id - the connection id.
1256 **
1257 ** Returns          tNFC_STATUS
1258 **
1259 *******************************************************************************/
NFC_FlushData(uint8_t conn_id)1260 tNFC_STATUS NFC_FlushData(uint8_t conn_id) {
1261   tNFC_STATUS status = NFC_STATUS_FAILED;
1262   tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id);
1263   void* p_buf;
1264 
1265   if (p_cb) {
1266     status = NFC_STATUS_OK;
1267     if (!gki_utils) {
1268       gki_utils = new GkiUtils();
1269     }
1270     while ((p_buf = gki_utils->dequeue(&p_cb->tx_q)) != nullptr)
1271       gki_utils->freebuf(p_buf);
1272   }
1273 
1274   return status;
1275 }
1276 
1277 /*******************************************************************************
1278 **
1279 ** Function         NFC_Deactivate
1280 **
1281 ** Description      This function is called to stop the discovery process or
1282 **                  put the listen device in sleep mode or terminate the NFC
1283 **                  link.
1284 **
1285 **                  The response from NFCC is reported by tNFC_DISCOVER_CBACK
1286 **                  as NFC_DEACTIVATE_DEVT.
1287 **
1288 ** Parameters       deactivate_type - NFC_DEACTIVATE_TYPE_IDLE, to IDLE mode.
1289 **                                    NFC_DEACTIVATE_TYPE_SLEEP to SLEEP mode.
1290 **                                    NFC_DEACTIVATE_TYPE_SLEEP_AF to SLEEP_AF
1291 **                                    mode.
1292 **
1293 ** Returns          tNFC_STATUS
1294 **
1295 *******************************************************************************/
NFC_Deactivate(tNFC_DEACT_TYPE deactivate_type)1296 tNFC_STATUS NFC_Deactivate(tNFC_DEACT_TYPE deactivate_type) {
1297   tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
1298   tNFC_STATUS status = NFC_STATUS_OK;
1299 
1300   LOG(VERBOSE) << StringPrintf(
1301       "%s: nfc_state=%d (%s) deactivate_type=%d", __func__, nfc_cb.nfc_state,
1302       nfc_state_name(nfc_cb.nfc_state).c_str(), deactivate_type);
1303 
1304   if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) {
1305     /* the HAL pre-discover is still active - clear the pending flag */
1306     nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
1307     if (!(nfc_cb.flags & NFC_FL_HAL_REQUESTED)) {
1308       /* if HAL did not request for control, clear this bit now */
1309       nfc_cb.flags &= ~NFC_FL_CONTROL_REQUESTED;
1310     }
1311     GKI_freebuf(nfc_cb.p_disc_pending);
1312     nfc_cb.p_disc_pending = nullptr;
1313     return NFC_STATUS_OK;
1314   }
1315 
1316   if (nfc_cb.nfc_state == NFC_STATE_OPEN) {
1317     nfc_set_state(NFC_STATE_CLOSING);
1318     LOG(VERBOSE) << StringPrintf("%s: act_protocol=%x credits=%d/%d", __func__,
1319                                  p_cb->act_protocol, p_cb->init_credits,
1320                                  p_cb->num_buff);
1321     if ((p_cb->act_protocol == NCI_PROTOCOL_NFC_DEP) &&
1322         (p_cb->init_credits != p_cb->num_buff)) {
1323       nfc_cb.flags |= NFC_FL_DEACTIVATING;
1324       nfc_cb.deactivate_timer.param = (uintptr_t)deactivate_type;
1325       nfc_start_timer(&nfc_cb.deactivate_timer,
1326                       (uint16_t)(NFC_TTYPE_WAIT_2_DEACTIVATE),
1327                       NFC_DEACTIVATE_TIMEOUT);
1328       return status;
1329     }
1330   }
1331 
1332   status = nci_snd_deactivate_cmd(deactivate_type);
1333   return status;
1334 }
1335 /*******************************************************************************
1336 **
1337 ** Function         NFC_SetPowerSubState
1338 **
1339 ** Description      This function is called to send the power sub state (screen
1340 **                  state) to NFCC. The response from NFCC is reported by
1341 **                  tNFC_RESPONSE_CBACK as NFC_SET_POWER_STATE_REVT.
1342 **
1343 ** Parameters       scree_state
1344 **
1345 ** Returns          tNFC_STATUS
1346 **
1347 *******************************************************************************/
NFC_SetPowerSubState(uint8_t screen_state)1348 tNFC_STATUS NFC_SetPowerSubState(uint8_t screen_state) {
1349   return nci_snd_core_set_power_sub_state(screen_state);
1350 }
1351 /*******************************************************************************
1352 **
1353 ** Function         NFC_UpdateRFCommParams
1354 **
1355 ** Description      This function is called to update RF Communication
1356 **                  parameters once the Frame RF Interface has been activated.
1357 **
1358 **                  The response from NFCC is reported by tNFC_RESPONSE_CBACK
1359 **                  as NFC_RF_COMM_PARAMS_UPDATE_REVT.
1360 **
1361 ** Returns          tNFC_STATUS
1362 **
1363 *******************************************************************************/
NFC_UpdateRFCommParams(tNFC_RF_COMM_PARAMS * p_params)1364 tNFC_STATUS NFC_UpdateRFCommParams(tNFC_RF_COMM_PARAMS* p_params) {
1365   uint8_t tlvs[12];
1366   uint8_t* p = tlvs;
1367   uint8_t data_exch_config;
1368 
1369   /* RF Technology and Mode */
1370   if (p_params->include_rf_tech_mode) {
1371     UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_TECH_N_MODE);
1372     UINT8_TO_STREAM(p, 1);
1373     UINT8_TO_STREAM(p, p_params->rf_tech_n_mode);
1374   }
1375 
1376   /* Transmit Bit Rate */
1377   if (p_params->include_tx_bit_rate) {
1378     UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_TX_BIT_RATE);
1379     UINT8_TO_STREAM(p, 1);
1380     UINT8_TO_STREAM(p, p_params->tx_bit_rate);
1381   }
1382 
1383   /* Receive Bit Rate */
1384   if (p_params->include_tx_bit_rate) {
1385     UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_RX_BIT_RATE);
1386     UINT8_TO_STREAM(p, 1);
1387     UINT8_TO_STREAM(p, p_params->rx_bit_rate);
1388   }
1389 
1390   /* NFC-B Data Exchange Configuration */
1391   if (p_params->include_nfc_b_config) {
1392     UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_B_DATA_EX_PARAM);
1393     UINT8_TO_STREAM(p, 1);
1394 
1395     data_exch_config = (p_params->min_tr0 & 0x03) << 6; /* b7b6 : Mininum TR0 */
1396     data_exch_config |= (p_params->min_tr1 & 0x03)
1397                         << 4; /* b5b4 : Mininum TR1 */
1398     data_exch_config |= (p_params->suppression_eos & 0x01)
1399                         << 3; /* b3 :   Suppression of EoS */
1400     data_exch_config |= (p_params->suppression_sos & 0x01)
1401                         << 2; /* b2 :   Suppression of SoS */
1402     data_exch_config |= (p_params->min_tr2 & 0x03); /* b1b0 : Mininum TR2 */
1403 
1404     UINT8_TO_STREAM(p, data_exch_config);
1405   }
1406 
1407   return nci_snd_parameter_update_cmd(tlvs, (uint8_t)(p - tlvs));
1408 }
1409 
1410 /*******************************************************************************
1411 **
1412 ** Function         NFC_SetPowerOffSleep
1413 **
1414 ** Description      This function closes/opens transport and turns off/on NFCC.
1415 **
1416 ** Returns          tNFC_STATUS
1417 **
1418 *******************************************************************************/
NFC_SetPowerOffSleep(bool enable)1419 tNFC_STATUS NFC_SetPowerOffSleep(bool enable) {
1420   LOG(VERBOSE) << StringPrintf("%s: enable = %d", __func__, enable);
1421 
1422   if ((enable == false) &&
1423       (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) {
1424     nfc_cb.flags |= NFC_FL_RESTARTING;
1425 
1426     /* open transport */
1427     nfc_set_state(NFC_STATE_W4_HAL_OPEN);
1428     nfc_cb.p_hal->open(nfc_main_hal_cback, nfc_main_hal_data_cback);
1429 
1430     return NFC_STATUS_OK;
1431   } else if ((enable == true) && (nfc_cb.nfc_state == NFC_STATE_IDLE)) {
1432     /* close transport to turn off NFCC and clean up */
1433     nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP;
1434     nfc_task_shutdown_nfcc();
1435 
1436     return NFC_STATUS_OK;
1437   }
1438 
1439   LOG(ERROR) << StringPrintf("%s: invalid state = %d", __func__,
1440                              nfc_cb.nfc_state);
1441   return NFC_STATUS_FAILED;
1442 }
1443 
1444 /*******************************************************************************
1445 **
1446 ** Function         NFC_PowerCycleNFCC
1447 **
1448 ** Description      This function turns off and then on NFCC.
1449 **
1450 ** Returns          tNFC_STATUS
1451 **
1452 *******************************************************************************/
NFC_PowerCycleNFCC(void)1453 tNFC_STATUS NFC_PowerCycleNFCC(void) {
1454   LOG(VERBOSE) << __func__;
1455 
1456   if (nfc_cb.nfc_state == NFC_STATE_IDLE) {
1457     /* power cycle NFCC */
1458     nfc_cb.flags |= NFC_FL_POWER_CYCLE_NFCC;
1459     nfc_task_shutdown_nfcc();
1460 
1461     return NFC_STATUS_OK;
1462   }
1463 
1464   LOG(ERROR) << StringPrintf("%s: invalid state = %d", __func__,
1465                              nfc_cb.nfc_state);
1466   return NFC_STATUS_FAILED;
1467 }
1468 
1469 /*******************************************************************************
1470 **
1471 ** Function         NFC_GetNCIVersion
1472 **
1473 ** Description      Called by higher layer to get the current nci
1474 **                  version of nfc.
1475 **
1476 ** Returns          NCI version NCI2.0 / NCI1.0
1477 **
1478 *******************************************************************************/
NFC_GetNCIVersion()1479 uint8_t NFC_GetNCIVersion() { return nfc_cb.nci_version; }
1480 
1481 /*******************************************************************************
1482 **
1483 ** Function         NFC_ISODEPNakPresCheck
1484 **
1485 ** Description      This function is called to send the ISO DEP nak presenc
1486 **                  check cmd to check that the remote end point in RF field.
1487 **
1488 **                  The response from NFCC is reported by call back.The ntf
1489 **                  indicates success if card is present in field or failed
1490 **                  if card is lost.
1491 **
1492 ** Returns          tNFC_STATUS
1493 **
1494 *******************************************************************************/
NFC_ISODEPNakPresCheck()1495 tNFC_STATUS NFC_ISODEPNakPresCheck() {
1496   return nci_snd_iso_dep_nak_presence_check_cmd();
1497 }
1498 
1499 /*******************************************************************************
1500 **
1501 ** Function         NFC_SetStaticHciCback
1502 **
1503 ** Description      This function is called to update the data callback function
1504 **                  to receive the data for the static Hci connection id.
1505 **
1506 ** Parameters       p_cback - the connection callback function
1507 **
1508 ** Returns          Nothing
1509 **
1510 *******************************************************************************/
NFC_SetStaticHciCback(tNFC_CONN_CBACK * p_cback)1511 void NFC_SetStaticHciCback(tNFC_CONN_CBACK* p_cback) {
1512   LOG(VERBOSE) << StringPrintf("%s dest=%d", __func__, NCI_DEST_TYPE_NFCEE);
1513   tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_HCI_CONN_ID];
1514   tNFC_CONN evt_data;
1515 
1516   p_cb->p_cback = p_cback;
1517   if (p_cback && p_cb->buff_size && p_cb->num_buff) {
1518     LOG(VERBOSE) << StringPrintf("%s: dest=%d", __func__, NCI_DEST_TYPE_NFCEE);
1519     evt_data.conn_create.status = NFC_STATUS_OK;
1520     evt_data.conn_create.dest_type = NCI_DEST_TYPE_NFCEE;
1521     evt_data.conn_create.id = p_cb->id;
1522     evt_data.conn_create.buff_size = p_cb->buff_size;
1523     evt_data.conn_create.num_buffs = p_cb->num_buff;
1524     (*p_cback)(NFC_HCI_CONN_ID, NFC_CONN_CREATE_CEVT, &evt_data);
1525   }
1526 }
1527 
1528 /*******************************************************************************
1529 **
1530 ** Function         NFC_IsRfRemovalDetectionSupported
1531 **
1532 ** Description      Indicates if RF Removal Detection mode is supported by NFCC
1533 **
1534 ** Returns          true if supported else false.
1535 **
1536 *******************************************************************************/
NFC_IsRfRemovalDetectionSupported()1537 bool NFC_IsRfRemovalDetectionSupported() {
1538   return (nfc_cb.nci_features & NCI_POLL_REMOVAL_DETECTION);
1539 }
1540 
1541 /*******************************************************************************
1542 **
1543 ** Function         NFC_GetStatusName
1544 **
1545 ** Description      This function returns the status name.
1546 **
1547 ** NOTE             conditionally compiled to save memory.
1548 **
1549 ** Returns          pointer to the name
1550 **
1551 *******************************************************************************/
NFC_GetStatusName(tNFC_STATUS status)1552 std::string NFC_GetStatusName(tNFC_STATUS status) {
1553   switch (status) {
1554     case NFC_STATUS_OK:
1555       return "OK";
1556     case NFC_STATUS_REJECTED:
1557       return "REJECTED";
1558     case NFC_STATUS_MSG_CORRUPTED:
1559       return "CORRUPTED";
1560     case NFC_STATUS_BUFFER_FULL:
1561       return "BUFFER_FULL";
1562     case NFC_STATUS_FAILED:
1563       return "FAILED";
1564     case NFC_STATUS_NOT_INITIALIZED:
1565       return "NOT_INITIALIZED";
1566     case NFC_STATUS_SYNTAX_ERROR:
1567       return "SYNTAX_ERROR";
1568     case NFC_STATUS_SEMANTIC_ERROR:
1569       return "SEMANTIC_ERROR";
1570     case NFC_STATUS_UNKNOWN_GID:
1571       return "UNKNOWN_GID";
1572     case NFC_STATUS_UNKNOWN_OID:
1573       return "UNKNOWN_OID";
1574     case NFC_STATUS_INVALID_PARAM:
1575       return "INVALID_PARAM";
1576     case NFC_STATUS_MSG_SIZE_TOO_BIG:
1577       return "MSG_SIZE_TOO_BIG";
1578     case NFC_STATUS_ALREADY_STARTED:
1579       return "ALREADY_STARTED";
1580     case NFC_STATUS_ACTIVATION_FAILED:
1581       return "ACTIVATION_FAILED";
1582     case NFC_STATUS_TEAR_DOWN:
1583       return "TEAR_DOWN";
1584     case NFC_STATUS_RF_TRANSMISSION_ERR:
1585       return "RF_TRANSMISSION_ERR";
1586     case NFC_STATUS_RF_PROTOCOL_ERR:
1587       return "RF_PROTOCOL_ERR";
1588     case NFC_STATUS_TIMEOUT:
1589       return "TIMEOUT";
1590     case NFC_STATUS_EE_INTF_ACTIVE_FAIL:
1591       return "EE_INTF_ACTIVE_FAIL";
1592     case NFC_STATUS_EE_TRANSMISSION_ERR:
1593       return "EE_TRANSMISSION_ERR";
1594     case NFC_STATUS_EE_PROTOCOL_ERR:
1595       return "EE_PROTOCOL_ERR";
1596     case NFC_STATUS_EE_TIMEOUT:
1597       return "EE_TIMEOUT";
1598     case NFC_STATUS_CMD_STARTED:
1599       return "CMD_STARTED";
1600     case NFC_STATUS_HW_TIMEOUT:
1601       return "HW_TIMEOUT";
1602     case NFC_STATUS_CONTINUE:
1603       return "CONTINUE";
1604     case NFC_STATUS_REFUSED:
1605       return "REFUSED";
1606     case NFC_STATUS_BAD_RESP:
1607       return "BAD_RESP";
1608     case NFC_STATUS_CMD_NOT_CMPLTD:
1609       return "CMD_NOT_CMPLTD";
1610     case NFC_STATUS_NO_BUFFERS:
1611       return "NO_BUFFERS";
1612     case NFC_STATUS_WRONG_PROTOCOL:
1613       return "WRONG_PROTOCOL";
1614     case NFC_STATUS_BUSY:
1615       return "BUSY";
1616     case NFC_STATUS_LINK_LOSS:
1617       return "LINK_LOSS";
1618     case NFC_STATUS_BAD_LENGTH:
1619       return "BAD_LENGTH";
1620     case NFC_STATUS_BAD_HANDLE:
1621       return "BAD_HANDLE";
1622     case NFC_STATUS_CONGESTED:
1623       return "CONGESTED";
1624     default:
1625       return "UNKNOWN";
1626   }
1627 }
1628