From 4750c4fd9bfda1515c720d6b62e406f46e7c4394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E5=AE=9D=E5=AE=9D?= Date: Wed, 10 Sep 2025 17:43:05 +0800 Subject: [PATCH] Business uses coc configurable timeout. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 霍宝宝 --- .../ble/src/softbus_conn_ble_manager.c | 17 ++++++++++++--- .../connection/br/src/softbus_conn_br_trans.c | 21 +++++++++---------- .../connect/softbus_conn_ble_manager_struct.h | 5 ++++- .../connect/softbus_conn_interface_struct.h | 1 + 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/core/connection/ble/src/softbus_conn_ble_manager.c b/core/connection/ble/src/softbus_conn_ble_manager.c index da98d1bb12..facd94fc16 100644 --- a/core/connection/ble/src/softbus_conn_ble_manager.c +++ b/core/connection/ble/src/softbus_conn_ble_manager.c @@ -291,6 +291,7 @@ static int32_t ConvertCtxToDevice(ConnBleDevice **outDevice, const ConnBleConnec SoftBusFree(request); return status; } + device->connectTimeoutMs = ctx->connectTimeoutMs; ListAdd(&device->requests, &request->node); *outDevice = device; return SOFTBUS_OK; @@ -491,8 +492,9 @@ static int32_t BleConnectDeviceDirectly(ConnBleDevice *device, const char *anomi break; } g_bleManager.connecting = device; + uint32_t timeoutMs = device->connectTimeoutMs == 0 ? BLE_CONNECT_TIMEOUT_MAX_MILLIS : device->connectTimeoutMs; status = ConnPostMsgToLooper(&g_bleManagerSyncHandler, BLE_MGR_MSG_CONNECT_TIMEOUT, - connection->connectionId, 0, address, BLE_CONNECT_TIMEOUT_MILLIS); + connection->connectionId, 0, address, timeoutMs); if (status != SOFTBUS_OK) { CONN_LOGE(CONN_BLE, "post msg fail, requestAddress=%{public}s, udid=%{public}s, error=%{public}d", anomizeAddress, anomizeUdid, status); @@ -1770,12 +1772,21 @@ static int32_t BleConnectDevice(const ConnectOption *option, uint32_t requestId, ctx->psm = option->bleOption.psm; } ctx->challengeCode = option->bleOption.challengeCode; + uint32_t connectTimeoutMs = 0; + if (option->bleOption.connectTimeoutMs < BLE_CONNECT_TIMEOUT_MIN_MILLIS) { + connectTimeoutMs = BLE_CONNECT_TIMEOUT_MIN_MILLIS; + } else if (option->bleOption.connectTimeoutMs > BLE_CONNECT_TIMEOUT_MAX_MILLIS) { + connectTimeoutMs = BLE_CONNECT_TIMEOUT_MAX_MILLIS; + } else { + connectTimeoutMs = option->bleOption.connectTimeoutMs; + } + ctx->connectTimeoutMs = ctx->protocol == BLE_GATT ? 0 : connectTimeoutMs; CONN_LOGI(CONN_BLE, "ble connect device: receive connect request, " "reqId=%{public}u, addr=%{public}s, protocol=%{public}d, udid=%{public}s, " - "fastestConnectEnable=%{public}d, connectTraceId=%{public}u", + "fastestConnectEnable=%{public}d, connectTraceId=%{public}u, connectTimeoutMs=%{public}u", requestId, anomizeAddress, ctx->protocol, anomizeUdid, ctx->fastestConnectEnable, - ctx->statistics.connectTraceId); + ctx->statistics.connectTraceId, ctx->connectTimeoutMs); status = ConnPostMsgToLooper(&g_bleManagerSyncHandler, BLE_MGR_MSG_CONNECT_REQUEST, 0, 0, ctx, 0); if (status != SOFTBUS_OK) { CONN_LOGE(CONN_BLE, diff --git a/core/connection/br/src/softbus_conn_br_trans.c b/core/connection/br/src/softbus_conn_br_trans.c index df31b7a882..71aa970c5a 100644 --- a/core/connection/br/src/softbus_conn_br_trans.c +++ b/core/connection/br/src/softbus_conn_br_trans.c @@ -38,7 +38,6 @@ static ConnBrTransEventListener g_transEventListener = { 0 }; static struct ConnSlideWindowController *g_flowController = NULL; static void *SendHandlerLoop(void *arg); static StartBrSendLPInfo g_startBrSendLPInfo = { 0 }; -static int32_t g_trySendCount = 0; static uint8_t *BrRecvDataParse(uint32_t connectionId, LimitedBuffer *buffer, int32_t *outLen) { @@ -133,12 +132,12 @@ int32_t ConnBrTransReadOneFrame(uint32_t connectionId, int32_t socketHandle, Lim } } -static bool IsNeedRetrySend(int32_t writeLen) +static bool IsNeedRetrySend(int32_t writeLen, int32_t trySendCount) { bool isNeedRetrySend = false; if ((writeLen == CONN_BR_SEND_DATA_FAIL_UNDERLAYER_ERR_QUEUE_FULL || writeLen == CONN_BR_SEND_DATA_FAIL_UNDERLAYER_ERR_INTERRUPTION) - && g_trySendCount < CONN_BR_SEND_DATA_FAIL_TRY_SEND_COUNT_MAX) { + && trySendCount < CONN_BR_SEND_DATA_FAIL_TRY_SEND_COUNT_MAX) { isNeedRetrySend = true; } return isNeedRetrySend; @@ -147,7 +146,7 @@ static bool IsNeedRetrySend(int32_t writeLen) int32_t BrTransSend(uint32_t connectionId, int32_t socketHandle, uint32_t mtu, const uint8_t *data, uint32_t dataLen) { uint32_t waitWriteLen = dataLen; - g_trySendCount = 0; + int32_t trySendCount = 0; while (waitWriteLen > 0) { uint32_t expect = waitWriteLen > mtu ? mtu : waitWriteLen; int32_t amount = g_flowController->apply(g_flowController, (int32_t)expect); @@ -156,9 +155,9 @@ int32_t BrTransSend(uint32_t connectionId, int32_t socketHandle, uint32_t mtu, c CONN_LOGE(CONN_BR, "underlayer br send data fail, connId=%{public}u, " "socketHandle=%{public}d, mtu=%{public}d, totalLen=%{public}d, waitWriteLen=%{public}d, " "alreadyWriteLen=%{public}d, error=%{public}d, trySendCount=%{public}d", connectionId, - socketHandle, mtu, dataLen, waitWriteLen, dataLen - waitWriteLen, writeLen, g_trySendCount); - if (IsNeedRetrySend(writeLen)) { - g_trySendCount++; + socketHandle, mtu, dataLen, waitWriteLen, dataLen - waitWriteLen, writeLen, trySendCount); + if (IsNeedRetrySend(writeLen, trySendCount)) { + trySendCount++; SoftBusSleepMs(CONN_BR_SEND_DATA_FAIL_WAIT_TIME_MS); continue; } @@ -166,7 +165,7 @@ int32_t BrTransSend(uint32_t connectionId, int32_t socketHandle, uint32_t mtu, c } data += writeLen; waitWriteLen -= (uint32_t)writeLen; - g_trySendCount = 0; + trySendCount = 0; } return SOFTBUS_OK; } @@ -408,13 +407,13 @@ static int32_t SendAck(const ConnBrConnection *connection, int32_t socketHandle) SoftBusFree(data); return status; } + CONN_LOGI(CONN_BR, + "br send ack, connectionId=%{public}u, Len=%{public}u, Flg=%{public}d, Module=%{public}d, Seq=%{public}" PRId64 + ", error=%{public}d", connection->connectionId, dataLen, flag, MODULE_CONNECTION, ctrlMsgSeq, status); status = BrTransSend(connection->connectionId, socketHandle, connection->mtu, data, dataLen); if (status != SOFTBUS_OK) { ConnBrDelBrPendingPacket(connection->connectionId, connection->sequence); } - CONN_LOGI(CONN_BR, - "br send ack, connectionId=%{public}u, Len=%{public}u, Flg=%{public}d, Module=%{public}d, Seq=%{public}" PRId64 - ", error=%{public}d", connection->connectionId, dataLen, flag, MODULE_CONNECTION, ctrlMsgSeq, status); SoftBusFree(data); return status; } diff --git a/interfaces/kits/connect/softbus_conn_ble_manager_struct.h b/interfaces/kits/connect/softbus_conn_ble_manager_struct.h index af2aafac0a..8f2fb0a9fe 100644 --- a/interfaces/kits/connect/softbus_conn_ble_manager_struct.h +++ b/interfaces/kits/connect/softbus_conn_ble_manager_struct.h @@ -28,7 +28,8 @@ extern "C" { #endif -#define BLE_CONNECT_TIMEOUT_MILLIS (10 * 1000) +#define BLE_CONNECT_TIMEOUT_MIN_MILLIS (4 * 1000) +#define BLE_CONNECT_TIMEOUT_MAX_MILLIS (10 * 1000) #define BLE_CONNECT_KEEP_ALIVE_TIMEOUT_MILLIS (10 * 1000) #define BLE_GATT_CONNECT_MAX_RETRY_COUNT (2) @@ -53,6 +54,7 @@ typedef struct { ListNode requests; // The ble connection failed to scan the broadcast due to a timeout of 3.1 seconds and was retried uint32_t retryCount; + uint32_t connectTimeoutMs; } ConnBleDevice; typedef struct { @@ -75,6 +77,7 @@ typedef struct { uint16_t challengeCode; /* for ble direct */ ConnectResult result; ConnectStatistics statistics; + uint32_t connectTimeoutMs; } ConnBleConnectRequestContext; typedef struct { diff --git a/interfaces/kits/connect/softbus_conn_interface_struct.h b/interfaces/kits/connect/softbus_conn_interface_struct.h index 87386812a4..5a5ca8db9f 100644 --- a/interfaces/kits/connect/softbus_conn_interface_struct.h +++ b/interfaces/kits/connect/softbus_conn_interface_struct.h @@ -206,6 +206,7 @@ struct BleOption { uint16_t challengeCode; uint32_t psm; BleProtocolType protocol; + uint32_t connectTimeoutMs; }; struct BleDirectOption { -- Gitee