]> granicus.if.org Git - esp-idf/commitdiff
ble_mesh: fix not sending all segments through the Friend Queue
authorlly <lly@espressif.com>
Mon, 2 Sep 2019 06:59:41 +0000 (14:59 +0800)
committerlly <lly@espressif.com>
Mon, 9 Sep 2019 09:15:16 +0000 (17:15 +0800)
components/bt/esp_ble_mesh/mesh_core/transport.c

index cfbfd888cbe489e37df804a98ddbb4cee8c0bb32..552bc653fd04ccd9d3d820eefbc9490c8e9e672c 100644 (file)
@@ -391,8 +391,6 @@ static int send_seg(struct bt_mesh_net_tx *net_tx, struct net_buf_simple *sdu,
         net_buf_add_mem(seg, sdu->data, len);
         net_buf_simple_pull(sdu, len);
 
-        tx->seg[seg_o] = net_buf_ref(seg);
-
         if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_provisioned()) {
         if (IS_ENABLED(CONFIG_BLE_MESH_FRIEND)) {
             enum bt_mesh_friend_pdu_type type;
@@ -411,11 +409,13 @@ static int send_seg(struct bt_mesh_net_tx *net_tx, struct net_buf_simple *sdu,
                  * out through the Friend Queue.
                  */
                 net_buf_unref(seg);
-                return 0;
+                continue;
             }
         }
         }
 
+        tx->seg[seg_o] = net_buf_ref(seg);
+
         BT_DBG("Sending %u/%u", seg_o, tx->seg_n);
 
         err = bt_mesh_net_send(net_tx, seg,
@@ -428,6 +428,23 @@ static int send_seg(struct bt_mesh_net_tx *net_tx, struct net_buf_simple *sdu,
         }
     }
 
+    /* This can happen if segments only went into the Friend Queue */
+    if (IS_ENABLED(CONFIG_BLE_MESH_FRIEND) && !tx->seg[0]) {
+        seg_tx_reset(tx);
+        /* If there was a callback notify sending immediately since
+         * there's no other way to track this (at least currently)
+         * with the Friend Queue.
+         */
+        if (cb) {
+            if (cb->start) {
+                cb->start(0, 0, cb_data);
+            }
+            if (cb->end) {
+                cb->end(0, cb_data);
+            }
+        }
+    }
+
     if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_provisioned()) {
     if (IS_ENABLED(CONFIG_BLE_MESH_LOW_POWER) &&
             bt_mesh_lpn_established()) {