OSDN Git Service

L2CAP: keep cached peer configuration locally
authorCheney Ni <cheneyni@google.com>
Tue, 3 Nov 2020 07:16:11 +0000 (15:16 +0800)
committerCheney Ni <cheneyni@google.com>
Tue, 3 Nov 2020 07:58:17 +0000 (15:58 +0800)
In order to report currect MTU to upper layer while that channel opened,
this change keeps remote peer configuration locally.

Bug: 171353431
Test: act.py -tc BleCocTest
Test: verify basic functions working
Tag: #refactor
Change-Id: Id4f5f22eb58e6f546278a12b269a700d760b3578

stack/l2cap/l2c_csm.cc
stack/l2cap/l2c_utils.cc

index 0980cb5..044a501 100644 (file)
@@ -1033,12 +1033,6 @@ static void l2c_csm_config(tL2C_CCB* p_ccb, uint16_t event, void* p_data) {
     case L2CEVT_L2CA_CONFIG_RSP: /* Upper layer config rsp   */
       l2cu_process_our_cfg_rsp(p_ccb, p_cfg);
 
-      /* Local config done; clear cached configuration in case reconfig takes
-       * place later */
-      p_ccb->peer_cfg.mtu_present = false;
-      p_ccb->peer_cfg.flush_to_present = false;
-      p_ccb->peer_cfg.qos_present = false;
-
       p_ccb->config_done |= IB_CFG_DONE;
 
       if (p_ccb->config_done & OB_CFG_DONE) {
@@ -1178,6 +1172,10 @@ static void l2c_csm_open(tL2C_CCB* p_ccb, uint16_t event, void* p_data) {
       tempstate = p_ccb->chnl_state;
       tempcfgdone = p_ccb->config_done;
       p_ccb->chnl_state = CST_CONFIG;
+      // clear cached configuration in case reconfig takes place later
+      p_ccb->peer_cfg.mtu_present = false;
+      p_ccb->peer_cfg.flush_to_present = false;
+      p_ccb->peer_cfg.qos_present = false;
       p_ccb->config_done &= ~IB_CFG_DONE;
 
       alarm_set_on_mloop(p_ccb->l2c_ccb_timer, L2CAP_CHNL_CFG_TIMEOUT_MS,
index b7b2bbc..734d3ac 100644 (file)
@@ -1826,7 +1826,7 @@ uint8_t l2cu_process_peer_cfg_req(tL2C_CCB* p_ccb, tL2CAP_CFG_INFO* p_cfg) {
     }
   }
   /* Reload mtu from a previously accepted config request */
-  else if (p_ccb->peer_cfg.mtu_present) {
+  else if (p_ccb->peer_cfg.mtu_present && !(p_ccb->config_done & IB_CFG_DONE)) {
     p_cfg->mtu_present = true;
     p_cfg->mtu = p_ccb->peer_cfg.mtu;
   }
@@ -1843,7 +1843,8 @@ uint8_t l2cu_process_peer_cfg_req(tL2C_CCB* p_ccb, tL2CAP_CFG_INFO* p_cfg) {
     }
   }
   /* Reload flush_to from a previously accepted config request */
-  else if (p_ccb->peer_cfg.flush_to_present) {
+  else if (p_ccb->peer_cfg.flush_to_present &&
+           !(p_ccb->config_done & IB_CFG_DONE)) {
     p_cfg->flush_to_present = true;
     p_cfg->flush_to = p_ccb->peer_cfg.flush_to;
   }
@@ -1863,7 +1864,7 @@ uint8_t l2cu_process_peer_cfg_req(tL2C_CCB* p_ccb, tL2CAP_CFG_INFO* p_cfg) {
     }
   }
   /* Reload QOS from a previously accepted config request */
-  else if (p_ccb->peer_cfg.qos_present) {
+  else if (p_ccb->peer_cfg.qos_present && !(p_ccb->config_done & IB_CFG_DONE)) {
     p_cfg->qos_present = true;
     p_cfg->qos = p_ccb->peer_cfg.qos;
   }