Ver código fonte

Merge branch 'bugfix/friend_and_lpn_issues' into 'master'

ble_mesh: stack: Fix friend and lpn issues

See merge request espressif/esp-idf!19378
Island 3 anos atrás
pai
commit
ee10f25b89

+ 18 - 10
components/bt/esp_ble_mesh/mesh_core/friend.c

@@ -64,6 +64,7 @@ enum {
 };
 };
 
 
 static void (*friend_cb)(bool establish, uint16_t lpn_addr, uint8_t reason);
 static void (*friend_cb)(bool establish, uint16_t lpn_addr, uint8_t reason);
+static void enqueue_update(struct bt_mesh_friend *frnd, uint8_t md);
 
 
 static bool friend_init = false;
 static bool friend_init = false;
 
 
@@ -233,7 +234,23 @@ void bt_mesh_friend_sec_update(uint16_t net_idx)
         }
         }
 
 
         if (net_idx == BLE_MESH_KEY_ANY || frnd->net_idx == net_idx) {
         if (net_idx == BLE_MESH_KEY_ANY || frnd->net_idx == net_idx) {
-            frnd->sec_update = 1U;
+            /* For case MESH/NODE/FRND/FN/BV-20-C.
+             * A situation is:
+             * The friend node may receive more than one different secure updates
+             * consecutively. And using the previous approach will cause only the
+             * latest Friend Update message been enqueued.
+             * So we update the implementation here to enqueue the Friend Update
+             * message immediately once a different secure beacon is received.
+             *
+             * A disadvantage of the change is:
+             * A friend node may receive different secure beacons. Then the
+             * beacon_cache mechanism will not work. This will cause the friend
+             * message queue been full of these secure beacons. So before enqueuing
+             * the secure updates, we should check if the currently received one
+             * is already exists in the message queue. Or enhance the beacon cache
+             * filtering mechanism.
+             */
+            enqueue_update(frnd, 1);
         }
         }
     }
     }
 }
 }
@@ -699,7 +716,6 @@ static void enqueue_update(struct bt_mesh_friend *frnd, uint8_t md)
         return;
         return;
     }
     }
 
 
-    frnd->sec_update = 0U;
     enqueue_buf(frnd, buf);
     enqueue_buf(frnd, buf);
 }
 }
 
 
@@ -1116,10 +1132,6 @@ static void enqueue_friend_pdu(struct bt_mesh_friend *frnd,
     BT_DBG("type %u", type);
     BT_DBG("type %u", type);
 
 
     if (type == BLE_MESH_FRIEND_PDU_SINGLE) {
     if (type == BLE_MESH_FRIEND_PDU_SINGLE) {
-        if (frnd->sec_update) {
-            enqueue_update(frnd, 1);
-        }
-
         enqueue_buf(frnd, buf);
         enqueue_buf(frnd, buf);
         return;
         return;
     }
     }
@@ -1136,10 +1148,6 @@ static void enqueue_friend_pdu(struct bt_mesh_friend *frnd,
     net_buf_slist_put(&seg->queue, buf);
     net_buf_slist_put(&seg->queue, buf);
 
 
     if (type == BLE_MESH_FRIEND_PDU_COMPLETE) {
     if (type == BLE_MESH_FRIEND_PDU_COMPLETE) {
-        if (frnd->sec_update) {
-            enqueue_update(frnd, 1);
-        }
-
         sys_slist_merge_slist(&frnd->queue, &seg->queue);
         sys_slist_merge_slist(&frnd->queue, &seg->queue);
 
 
         frnd->queue_size += seg->seg_count;
         frnd->queue_size += seg->seg_count;

+ 1 - 1
components/bt/esp_ble_mesh/mesh_core/mesh.h

@@ -20,7 +20,7 @@ extern "C" {
 #define BLE_MESH_KEY_ANY                0xffff
 #define BLE_MESH_KEY_ANY                0xffff
 
 
 #define BLE_MESH_ADDR_IS_UNICAST(addr)  ((addr) && (addr) < 0x8000)
 #define BLE_MESH_ADDR_IS_UNICAST(addr)  ((addr) && (addr) < 0x8000)
-#define BLE_MESH_ADDR_IS_GROUP(addr)    ((addr) >= 0xc000 && (addr) <= 0xff00)
+#define BLE_MESH_ADDR_IS_GROUP(addr)    ((addr) >= 0xc000 && (addr) < 0xff00)
 #define BLE_MESH_ADDR_IS_VIRTUAL(addr)  ((addr) >= 0x8000 && (addr) < 0xc000)
 #define BLE_MESH_ADDR_IS_VIRTUAL(addr)  ((addr) >= 0x8000 && (addr) < 0xc000)
 #define BLE_MESH_ADDR_IS_RFU(addr)      ((addr) >= 0xff00 && (addr) <= 0xfffb)
 #define BLE_MESH_ADDR_IS_RFU(addr)      ((addr) >= 0xff00 && (addr) <= 0xfffb)
 
 

+ 6 - 3
components/bt/esp_ble_mesh/mesh_core/net.c

@@ -1188,7 +1188,8 @@ static bool relay_to_adv(enum bt_mesh_net_if net_if)
     case BLE_MESH_NET_IF_LOCAL:
     case BLE_MESH_NET_IF_LOCAL:
         return true;
         return true;
     case BLE_MESH_NET_IF_ADV:
     case BLE_MESH_NET_IF_ADV:
-        return (bt_mesh_relay_get() == BLE_MESH_RELAY_ENABLED);
+        return ((bt_mesh_relay_get() == BLE_MESH_RELAY_ENABLED) ||
+                (bt_mesh_friend_get() == BLE_MESH_FRIEND_ENABLED));
     case BLE_MESH_NET_IF_PROXY:
     case BLE_MESH_NET_IF_PROXY:
         return (bt_mesh_gatt_proxy_get() == BLE_MESH_GATT_PROXY_ENABLED);
         return (bt_mesh_gatt_proxy_get() == BLE_MESH_GATT_PROXY_ENABLED);
     default:
     default:
@@ -1221,7 +1222,8 @@ static void bt_mesh_net_relay(struct net_buf_simple *sbuf,
 
 
     if (rx->net_if == BLE_MESH_NET_IF_ADV &&
     if (rx->net_if == BLE_MESH_NET_IF_ADV &&
             bt_mesh_relay_get() != BLE_MESH_RELAY_ENABLED &&
             bt_mesh_relay_get() != BLE_MESH_RELAY_ENABLED &&
-            bt_mesh_gatt_proxy_get() != BLE_MESH_GATT_PROXY_ENABLED) {
+            bt_mesh_gatt_proxy_get() != BLE_MESH_GATT_PROXY_ENABLED &&
+            bt_mesh_friend_get() != BLE_MESH_FRIEND_ENABLED) {
         return;
         return;
     }
     }
 
 
@@ -1378,8 +1380,9 @@ int bt_mesh_net_decode(struct net_buf_simple *data, enum bt_mesh_net_if net_if,
         return -EBADMSG;
         return -EBADMSG;
     }
     }
 
 
+    /* For case MESH/NODE/RLY/BV-01-C, even the DST is RFU, it needs to be forwarded. */
     if (BLE_MESH_ADDR_IS_RFU(rx->ctx.recv_dst)) {
     if (BLE_MESH_ADDR_IS_RFU(rx->ctx.recv_dst)) {
-        BT_ERR("Destination address is RFU; dropping packet");
+        BT_ERR("Destination address is RFU; dropping packet 0x%02x", rx->ctx.recv_dst);
         return -EBADMSG;
         return -EBADMSG;
     }
     }
 
 

+ 0 - 1
components/bt/esp_ble_mesh/mesh_core/net.h

@@ -95,7 +95,6 @@ struct bt_mesh_friend {
     uint8_t  fsn:1,
     uint8_t  fsn:1,
              send_last:1,
              send_last:1,
              pending_req:1,
              pending_req:1,
-             sec_update:1,
              pending_buf:1,
              pending_buf:1,
              valid:1,
              valid:1,
              established:1;
              established:1;