OSDN Git Service

SDP: Move L2cap error handling to one place
authorHansong Zhang <hsz@google.com>
Fri, 25 Sep 2020 23:24:52 +0000 (16:24 -0700)
committerHansong Zhang <hsz@google.com>
Sat, 26 Sep 2020 01:06:40 +0000 (18:06 -0700)
Bug: 159815595
Tag: #refactor
Test: compile & verify basic functions working
Change-Id: I903127f07ae97349d1fa7625d20835b46dbe9063

stack/sdp/sdp_main.cc

index f706d53..011fbc5 100644 (file)
@@ -127,6 +127,38 @@ static void sdp_connect_ind(const RawAddress& bd_addr, uint16_t l2cap_cid,
   L2CA_ConnectRsp(bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_OK, L2CAP_CONN_OK);
 }
 
+static void sdp_on_l2cap_error(uint16_t l2cap_cid, uint16_t result) {
+  tCONN_CB* p_ccb = sdpu_find_ccb_by_cid(l2cap_cid);
+  if (p_ccb->con_state == SDP_STATE_CONN_SETUP) {
+    // If we see an error while waiting for connection response
+    SDP_TRACE_WARNING("SDP - Rcvd conn cnf with error: 0x%x  CID 0x%x", result,
+                      p_ccb->connection_id);
+
+    /* Tell the user if there is a callback */
+    if (p_ccb->p_cb || p_ccb->p_cb2) {
+      uint16_t err = -1;
+      if ((result == HCI_ERR_HOST_REJECT_SECURITY) ||
+          (result == HCI_ERR_AUTH_FAILURE) ||
+          (result == HCI_ERR_PAIRING_NOT_ALLOWED) ||
+          (result == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) ||
+          (result == HCI_ERR_KEY_MISSING))
+        err = SDP_SECURITY_ERR;
+      else if (result == HCI_ERR_HOST_REJECT_DEVICE)
+        err = SDP_CONN_REJECTED;
+      else
+        err = SDP_CONN_FAILED;
+      if (p_ccb->p_cb)
+        (*p_ccb->p_cb)(err);
+      else if (p_ccb->p_cb2)
+        (*p_ccb->p_cb2)(err, p_ccb->user_data);
+    }
+    sdpu_release_ccb(p_ccb);
+  } else if (p_ccb->con_state == SDP_STATE_CFG_SETUP) {
+    // If we see an error while waiting for configure response
+    sdp_disconnect(p_ccb, SDP_CFG_FAILED);
+  }
+}
+
 /*******************************************************************************
  *
  * Function         sdp_connect_cfm
@@ -153,28 +185,7 @@ static void sdp_connect_cfm(uint16_t l2cap_cid, uint16_t result) {
   if ((result == L2CAP_CONN_OK) && (p_ccb->con_state == SDP_STATE_CONN_SETUP)) {
     p_ccb->con_state = SDP_STATE_CFG_SETUP;
   } else {
-    SDP_TRACE_WARNING("SDP - Rcvd conn cnf with error: 0x%x  CID 0x%x", result,
-                      p_ccb->connection_id);
-
-    /* Tell the user if there is a callback */
-    if (p_ccb->p_cb || p_ccb->p_cb2) {
-      uint16_t err = -1;
-      if ((result == HCI_ERR_HOST_REJECT_SECURITY) ||
-          (result == HCI_ERR_AUTH_FAILURE) ||
-          (result == HCI_ERR_PAIRING_NOT_ALLOWED) ||
-          (result == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) ||
-          (result == HCI_ERR_KEY_MISSING))
-        err = SDP_SECURITY_ERR;
-      else if (result == HCI_ERR_HOST_REJECT_DEVICE)
-        err = SDP_CONN_REJECTED;
-      else
-        err = SDP_CONN_FAILED;
-      if (p_ccb->p_cb)
-        (*p_ccb->p_cb)(err);
-      else if (p_ccb->p_cb2)
-        (*p_ccb->p_cb2)(err, p_ccb->user_data);
-    }
-    sdpu_release_ccb(p_ccb);
+    sdp_on_l2cap_error(l2cap_cid, result);
   }
 }
 
@@ -248,7 +259,7 @@ static void sdp_config_cfm(uint16_t l2cap_cid, uint16_t result) {
                          sdp_conn_timer_timeout, p_ccb);
     }
   } else {
-    sdp_disconnect(p_ccb, SDP_CFG_FAILED);
+    sdp_on_l2cap_error(l2cap_cid, result);
   }
 }