Files
Esko DijkandJonathan Hui 6677bdd762 [ble] improve BLE link handling, related to TLS session closing, and callbacks (#13240)
This fixes issues where the closing of the TLS session or sudden closing of the BLE link
did not always lead to the required behavior. Changes:

 - detail the API for the callback otHandleBleSecureConnect() including valid state
   combinations and expected moments of calling.
 - introduce a new internal state kClosing for the BLE link. Tracking the "is closing" state
   avoids making duplicate platform function calls or duplicate callbacks.
 - if a TLS handshake is ongoing and the BLE link goes down, mTls state is now also properly
   cleaned up.
 - if the TLS session closes (for whatever reason), the BLE link is now also torn down.
   The 'Disconnect()' call is used to achieve this. When needed, guard time is used
   to properly close TLS - e.g. sending the Alert and let the BLE link transmit that
   beforing closing the link.
 - the simulation BLE platform had an issue that the closing handshake caused the simulated
   BLE link to be immediately 'connected' again. This is fixed by introducing a state var
   sIsAdvertising, draining any pending UDP data of the simulated BLE link, and checking
   sIsAdvertising before accepting a new BLE connection.
 - avoid calling platform BLE advertisement-enable function while the BleSecure link is
   still active/closing up. Request BLE advertising again after final disconnect.
 - code readability improvements.

Unit tests are expanded to test more details of the flow.
2026-07-16 10:39:15 -07:00

75 lines
2.9 KiB
C

/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef OT_UNIT_TEST_PLATFORM_H_
#define OT_UNIT_TEST_PLATFORM_H_
#include <string.h>
#include <openthread/config.h>
#include <openthread/platform/alarm-milli.h>
#include <openthread/platform/diag.h>
#include <openthread/platform/dns.h>
#include <openthread/platform/dnssd.h>
#include <openthread/platform/dso_transport.h>
#include <openthread/platform/entropy.h>
#include <openthread/platform/logging.h>
#include <openthread/platform/mdns_socket.h>
#include <openthread/platform/misc.h>
#include <openthread/platform/multipan.h>
#include <openthread/platform/radio.h>
#include <openthread/platform/tcp.h>
#include <openthread/platform/trel.h>
#include "common/code_utils.hpp"
#include "instance/instance.hpp"
#include "test_util.h"
ot::Instance *testInitInstance(void);
ot::Instance *testResetInstance(ot::Instance *aInstance);
#if OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE && OPENTHREAD_CONFIG_MULTIPLE_STATIC_INSTANCE_ENABLE
ot::Instance *testInitAdditionalInstance(uint8_t id);
#endif
void testFreeInstance(otInstance *aInstance);
#if OPENTHREAD_CONFIG_BLE_TCAT_ENABLE
#include <openthread/tcat.h>
#ifdef __cplusplus
extern "C" {
#endif
extern uint8_t sPlatBleLastAdvSetData[OT_TCAT_ADVERTISEMENT_MAX_LEN];
extern uint16_t sPlatBleLastAdvSetDataLen;
extern bool sPlatBleAdvertising;
#ifdef __cplusplus
}
#endif
#endif
#endif // OT_UNIT_TEST_PLATFORM_H_