From caff6e10892b59680ee091941225427592fa0ad6 Mon Sep 17 00:00:00 2001 From: wangxiaohui Date: Mon, 17 Oct 2022 20:26:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E4=BA=AB=E7=BB=84=E7=BD=91=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BF=AE=E6=94=B9=20Signed-off-by:=20wangxiaohui=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus_center/interface/bus_center_manager.h | 1 + .../lane_hub/lane_manager/src/lnn_lane_link.c | 25 +++++-- .../lnn/net_builder/src/lnn_connection_fsm.c | 4 +- .../lnn/net_builder/src/lnn_p2p_info.c | 2 +- .../src/lnn_distributed_net_ledger.c | 71 +++++++++++++++---- .../standard/init/src/softbus_server_stub.cpp | 2 + 6 files changed, 85 insertions(+), 20 deletions(-) diff --git a/core/bus_center/interface/bus_center_manager.h b/core/bus_center/interface/bus_center_manager.h index 722cb8435c..1c8f2859b5 100644 --- a/core/bus_center/interface/bus_center_manager.h +++ b/core/bus_center/interface/bus_center_manager.h @@ -66,6 +66,7 @@ int32_t LnnSetLocalNum16Info(InfoKey key, int16_t info); int32_t LnnSetLocalByteInfo(InfoKey key, const uint8_t *info, uint32_t len); int32_t LnnGetLocalByteInfo(InfoKey key, uint8_t *info, uint32_t len); int32_t LnnGetAllOnlineNodeInfo(NodeBasicInfo **info, int32_t *infoNum); +int32_t LnnGetAllOnlineAndMetaNodeInfo(NodeBasicInfo **info, int32_t *infoNum); int32_t LnnGetLocalDeviceInfo(NodeBasicInfo *info); int32_t LnnGetNodeKeyInfo(const char *networkId, int key, uint8_t *info, uint32_t infoLen); int32_t LnnSetNodeDataChangeFlag(const char *networkId, uint16_t dataChangeFlag); diff --git a/core/bus_center/lnn/lane_hub/lane_manager/src/lnn_lane_link.c b/core/bus_center/lnn/lane_hub/lane_manager/src/lnn_lane_link.c index 82266ad098..def2b5bb25 100644 --- a/core/bus_center/lnn/lane_hub/lane_manager/src/lnn_lane_link.c +++ b/core/bus_center/lnn/lane_hub/lane_manager/src/lnn_lane_link.c @@ -320,21 +320,33 @@ static void OnConnOpenFailed(uint32_t requestId, int32_t reason) SetConnectDeviceResult(requestId, false, NULL, NULL); } -static int32_t GetPreferAuthConnInfo(const char *networkId, AuthConnInfo *connInfo) +static int32_t GetPreferAuthConnInfo(const char *networkId, AuthConnInfo *connInfo, bool isMetaAuth) { char uuid[UDID_BUF_LEN] = {0}; if (LnnGetRemoteStrInfo(networkId, STRING_KEY_UUID, uuid, sizeof(uuid)) != SOFTBUS_OK) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get peer uuid fail."); return SOFTBUS_ERR; } - return AuthGetPreferConnInfo(uuid, connInfo, false); + return AuthGetPreferConnInfo(uuid, connInfo, isMetaAuth); +} + +static bool GetChannelAuthType(const char *peerNetWorkId) +{ + int32_t value = 0; + int32_t ret = LnnGetRemoteNumInfo(peerNetWorkId, NUM_KEY_META_NODE, &value); + if (ret != SOFTBUS_OK) { + SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "GetChannelAuthType fail ,ret=%d", ret); + } + SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "GetChannelAuthType success ,value=%d", value); + return ((1 << ONLINE_METANODE) == value) ? true : false; } static int32_t OpenAuthConnToConnectP2p(const char *networkId, int32_t pid, LnnLaneP2pInfo *p2pInfo) { AuthConnInfo connInfo; (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo)); - if (GetPreferAuthConnInfo(networkId, &connInfo) != SOFTBUS_OK) { + bool isMetaAuth = GetChannelAuthType(networkId); + if (GetPreferAuthConnInfo(networkId, &connInfo, isMetaAuth) != SOFTBUS_OK) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no auth conn exist."); return SOFTBUS_ERR; } @@ -347,7 +359,7 @@ static int32_t OpenAuthConnToConnectP2p(const char *networkId, int32_t pid, LnnL .onConnOpened = OnConnOpened, .onConnOpenFailed = OnConnOpenFailed }; - if (AuthOpenConn(&connInfo, requestId, &cb, false) != SOFTBUS_OK) { + if (AuthOpenConn(&connInfo, requestId, &cb, isMetaAuth) != SOFTBUS_OK) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "open auth conn fail."); DelConnRequestItem(requestId); return SOFTBUS_ERR; @@ -429,7 +441,8 @@ static int32_t OpenAuthConnToDisconnectP2p(const char *networkId, int32_t pid) } AuthConnInfo connInfo; (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo)); - if (GetPreferAuthConnInfo(networkId, &connInfo) != SOFTBUS_OK) { + bool isMetaAuth = GetChannelAuthType(networkId); + if (GetPreferAuthConnInfo(networkId, &connInfo, isMetaAuth) != SOFTBUS_OK) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no auth conn exist."); return SOFTBUS_ERR; } @@ -442,7 +455,7 @@ static int32_t OpenAuthConnToDisconnectP2p(const char *networkId, int32_t pid) .onConnOpened = OnConnOpenedForDisconnect, .onConnOpenFailed = OnConnOpenFailedForDisconnect }; - if (AuthOpenConn(&connInfo, requestId, &cb, false) != SOFTBUS_OK) { + if (AuthOpenConn(&connInfo, requestId, &cb, isMetaAuth) != SOFTBUS_OK) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "open auth conn fail."); DelConnRequestItem(requestId); return SOFTBUS_ERR; diff --git a/core/bus_center/lnn/net_builder/src/lnn_connection_fsm.c b/core/bus_center/lnn/net_builder/src/lnn_connection_fsm.c index 6957b461e7..32bca9e906 100644 --- a/core/bus_center/lnn/net_builder/src/lnn_connection_fsm.c +++ b/core/bus_center/lnn/net_builder/src/lnn_connection_fsm.c @@ -257,6 +257,7 @@ static bool UpdateLeaveToLedger(const LnnConnectionFsm *connFsm, const char *net NodeInfo *info = NULL; const char *udid = NULL; bool needReportOffline = false; + bool isMetaAuth = false; uint8_t relation[CONNECTION_ADDR_MAX] = {0}; ReportCategory report; @@ -264,6 +265,7 @@ static bool UpdateLeaveToLedger(const LnnConnectionFsm *connFsm, const char *net if (info == NULL) { return needReportOffline; } + isMetaAuth = (info->AuthTypeValue & (1 << ONLINE_METANODE)) != 0; udid = LnnGetDeviceUdid(info); report = LnnSetNodeOffline(udid, connInfo->addr.type, (int32_t)connInfo->authId); LnnGetLnnRelation(udid, CATEGORY_UDID, relation, CONNECTION_ADDR_MAX); @@ -276,7 +278,7 @@ static bool UpdateLeaveToLedger(const LnnConnectionFsm *connFsm, const char *net needReportOffline = false; } // just remove node when peer device is not trusted - if ((connInfo->flag & LNN_CONN_INFO_FLAG_LEAVE_PASSIVE) != 0) { + if ((connInfo->flag & LNN_CONN_INFO_FLAG_LEAVE_PASSIVE) != 0 && !isMetaAuth) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "[id=%u]remove node", connFsm->id); LnnRemoveNode(udid); } diff --git a/core/bus_center/lnn/net_builder/src/lnn_p2p_info.c b/core/bus_center/lnn/net_builder/src/lnn_p2p_info.c index 991532245b..b0dd3ec08e 100644 --- a/core/bus_center/lnn/net_builder/src/lnn_p2p_info.c +++ b/core/bus_center/lnn/net_builder/src/lnn_p2p_info.c @@ -92,7 +92,7 @@ static void ProcessSyncP2pInfo(void *para) int32_t infoNum = 0; uint32_t len; NodeBasicInfo *info = NULL; - if (LnnGetAllOnlineNodeInfo(&info, &infoNum) != SOFTBUS_OK) { + if (LnnGetAllOnlineAndMetaNodeInfo(&info, &infoNum) != SOFTBUS_OK) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get all online node info fail."); return; } diff --git a/core/bus_center/lnn/net_ledger/distributed_ledger/src/lnn_distributed_net_ledger.c b/core/bus_center/lnn/net_ledger/distributed_ledger/src/lnn_distributed_net_ledger.c index 3271ea89ca..f01dfbeca7 100644 --- a/core/bus_center/lnn/net_ledger/distributed_ledger/src/lnn_distributed_net_ledger.c +++ b/core/bus_center/lnn/net_ledger/distributed_ledger/src/lnn_distributed_net_ledger.c @@ -239,7 +239,15 @@ static int32_t ConvertNodeInfoToBasicInfo(const NodeInfo *info, NodeBasicInfo *b return SOFTBUS_OK; } -static int32_t GetDLOnlineNodeNumLocked(int32_t *infoNum) +static bool isMetaNode(NodeInfo *info) +{ + if (info = NULL) { + return false; + } + info->metaInfo.isMetaNode; +} + +static int32_t GetDLOnlineNodeNumLocked(int32_t *infoNum, bool isNeedMeta) { NodeInfo *info = NULL; DoubleHashMap *map = &g_distributedNetLedger.distributedInfo; @@ -255,6 +263,15 @@ static int32_t GetDLOnlineNodeNumLocked(int32_t *infoNum) return SOFTBUS_ERR; } info = (NodeInfo *)it->node->value; + if (!isNeedMeta) { + if (LnnIsNodeOnline(info)) { + (*infoNum)++; + } + } else { + if (LnnIsNodeOnline(info) || isMetaNode(info)) { + (*infoNum)++; + } + } if (LnnIsNodeOnline(info)) { (*infoNum)++; } @@ -263,7 +280,7 @@ static int32_t GetDLOnlineNodeNumLocked(int32_t *infoNum) return SOFTBUS_OK; } -static int32_t FillDLOnlineNodeInfoLocked(NodeBasicInfo *info, int32_t infoNum) +static int32_t FillDLOnlineNodeInfoLocked(NodeBasicInfo *info, int32_t infoNum, bool isNeedMeta) { NodeInfo *nodeInfo = NULL; DoubleHashMap *map = &g_distributedNetLedger.distributedInfo; @@ -281,9 +298,16 @@ static int32_t FillDLOnlineNodeInfoLocked(NodeBasicInfo *info, int32_t infoNum) return SOFTBUS_ERR; } nodeInfo = (NodeInfo *)it->node->value; - if (LnnIsNodeOnline(nodeInfo)) { - ConvertNodeInfoToBasicInfo(nodeInfo, info + i); - ++i; + if (!isNeedMeta) { + if (LnnIsNodeOnline(nodeInfo)) { + ConvertNodeInfoToBasicInfo(nodeInfo, info + i); + ++i; + } + } else { + if (LnnIsNodeOnline(nodeInfo) || isMetaNode(info)) { + ConvertNodeInfoToBasicInfo(nodeInfo, info + i); + ++i; + } } } LnnMapDeinitIterator(it); @@ -392,6 +416,9 @@ bool LnnGetOnlineStateById(const char *id, IdCategory type) return state; } state = (nodeInfo->status == STATUS_ONLINE) ? true : false; + if (!state) { + state = nodeInfo->metaInfo.isMetaNode; + } (void)SoftBusMutexUnlock(&g_distributedNetLedger.lock); return state; } @@ -399,6 +426,7 @@ bool LnnGetOnlineStateById(const char *id, IdCategory type) static int32_t DlGetDeviceUuid(const char *networkId, void *buf, uint32_t len) { NodeInfo *info = NULL; + SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "DlGetDeviceUuid networkId =%S", networkId); RETURN_IF_GET_NODE_VALID(networkId, buf, info); if (strncpy_s(buf, len, info->uuid, strlen(info->uuid)) != EOK) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "STR COPY ERROR!"); @@ -616,7 +644,7 @@ static int32_t DlGetP2pMac(const char *networkId, void *buf, uint32_t len) const char *mac = NULL; RETURN_IF_GET_NODE_VALID(networkId, buf, info); - if (!LnnIsNodeOnline(info)) { + if ((!LnnIsNodeOnline(info)) && (!info->metaInfo.isMetaNode)) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "node is offline"); return SOFTBUS_ERR; } @@ -654,7 +682,7 @@ static int32_t DlGetP2pGoMac(const char *networkId, void *buf, uint32_t len) const char *mac = NULL; RETURN_IF_GET_NODE_VALID(networkId, buf, info); - if (!LnnIsNodeOnline(info)) { + if ((!LnnIsNodeOnline(info)) && (!info->metaInfo.isMetaNode)) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "node is offline"); return SOFTBUS_ERR; } @@ -678,7 +706,7 @@ static int32_t DlGetP2pRole(const char *networkId, void *buf, uint32_t len) return SOFTBUS_INVALID_PARAM; } RETURN_IF_GET_NODE_VALID(networkId, buf, info); - if (!LnnIsNodeOnline(info)) { + if ((!LnnIsNodeOnline(info)) && (!info->metaInfo.isMetaNode)) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "node is offline"); return SOFTBUS_ERR; } @@ -886,6 +914,7 @@ int32_t LnnAddMetaInfo(NodeInfo *info) } LnnSetAuthTypeValue(&info->AuthTypeValue, ONLINE_METANODE); LnnMapSet(&map->udidMap, udid, info, sizeof(NodeInfo)); + SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "LnnAddMetaInfo success"); SoftBusMutexUnlock(&g_distributedNetLedger.lock); return SOFTBUS_OK; } @@ -914,6 +943,8 @@ int32_t LnnDeleteMetaInfo(const char *udid, ConnectionAddrType type) info->metaInfo.isMetaNode = false; } LnnClearAuthTypeValue(&info->AuthTypeValue, ONLINE_METANODE); + LnnMapSet(&map->udidMap, udid, info, sizeof(NodeInfo)); + SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "LnnDeleteMetaInfo success"); SoftBusMutexUnlock(&g_distributedNetLedger.lock); return SOFTBUS_OK; } @@ -921,6 +952,9 @@ int32_t LnnDeleteMetaInfo(const char *udid, ConnectionAddrType type) ReportCategory LnnAddOnlineNode(NodeInfo *info) { // judge map + if (info == NULL) { + return REPORT_NONE; + } const char *udid = NULL; DoubleHashMap *map = NULL; NodeInfo *oldInfo = NULL; @@ -945,6 +979,9 @@ ReportCategory LnnAddOnlineNode(NodeInfo *info) return REPORT_NONE; } oldInfo = (NodeInfo *)LnnMapGet(&map->udidMap, udid); + if (oldInfo != NULL) { + info->metaInfo = oldInfo->metaInfo; + } if (oldInfo != NULL && LnnIsNodeOnline(oldInfo)) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "addOnlineNode find online node"); UpdateAuthSeq(oldInfo, info); @@ -1293,7 +1330,7 @@ int32_t LnnGetRemoteNum16Info(const char *networkId, InfoKey key, int16_t *info) return SOFTBUS_ERR; } -int32_t LnnGetAllOnlineNodeInfo(NodeBasicInfo **info, int32_t *infoNum) +static int32_t GetAllOnlineAndMetaNodeInfo(NodeBasicInfo **info, int32_t *infoNum, bool isNeedMeta) { int ret = SOFTBUS_ERR; @@ -1307,7 +1344,7 @@ int32_t LnnGetAllOnlineNodeInfo(NodeBasicInfo **info, int32_t *infoNum) } do { *info = NULL; - if (GetDLOnlineNodeNumLocked(infoNum) != SOFTBUS_OK) { + if (GetDLOnlineNodeNumLocked(infoNum, isNeedMeta) != SOFTBUS_OK) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get online node num failed"); break; } @@ -1320,7 +1357,7 @@ int32_t LnnGetAllOnlineNodeInfo(NodeBasicInfo **info, int32_t *infoNum) SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc node info buffer failed"); break; } - if (FillDLOnlineNodeInfoLocked(*info, *infoNum) != SOFTBUS_OK) { + if (FillDLOnlineNodeInfoLocked(*info, *infoNum, isNeedMeta) != SOFTBUS_OK) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fill online node num failed"); break; } @@ -1336,6 +1373,16 @@ int32_t LnnGetAllOnlineNodeInfo(NodeBasicInfo **info, int32_t *infoNum) return ret; } +int32_t LnnGetAllOnlineNodeInfo(NodeBasicInfo **info, int32_t *infoNum) +{ + return GetAllOnlineAndMetaNodeInfo(info, infoNum, false); +} + +int32_t LnnGetAllOnlineAndMetaNodeInfo(NodeBasicInfo **info, int32_t *infoNum) +{ + return GetAllOnlineAndMetaNodeInfo(info, infoNum, true); +} + int32_t LnnGetNetworkIdByBtMac(const char *btMac, char *buf, uint32_t len) { if (btMac == NULL || btMac[0] == '\0' || buf == NULL) { @@ -1359,7 +1406,7 @@ int32_t LnnGetNetworkIdByBtMac(const char *btMac, char *buf, uint32_t len) return SOFTBUS_ERR; } NodeInfo *nodeInfo = (NodeInfo *)it->node->value; - if (LnnIsNodeOnline(nodeInfo) && + if ((LnnIsNodeOnline(nodeInfo) || nodeInfo->metaInfo.isMetaNode) && StrCmpIgnoreCase(nodeInfo->connectInfo.macAddr, btMac) == 0) { if (strcpy_s(buf, len, nodeInfo->networkId) != EOK) { SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "strcpy_s networkId fail!"); diff --git a/core/frame/standard/init/src/softbus_server_stub.cpp b/core/frame/standard/init/src/softbus_server_stub.cpp index 2f65d72a34..29be5f5c2e 100644 --- a/core/frame/standard/init/src/softbus_server_stub.cpp +++ b/core/frame/standard/init/src/softbus_server_stub.cpp @@ -165,7 +165,9 @@ void SoftBusServerStub::InitMemberPermissionMap() memberPermissionMap_[SERVER_CLOSE_CHANNEL] = OHOS_PERMISSION_DISTRIBUTED_DATASYNC; memberPermissionMap_[SERVER_SESSION_SENDMSG] = nullptr; memberPermissionMap_[SERVER_JOIN_LNN] = OHOS_PERMISSION_DISTRIBUTED_SOFTBUS_CENTER; + memberPermissionMap_[SERVER_JOIN_METANODE] = OHOS_PERMISSION_DISTRIBUTED_SOFTBUS_CENTER; memberPermissionMap_[SERVER_LEAVE_LNN] = OHOS_PERMISSION_DISTRIBUTED_SOFTBUS_CENTER; + memberPermissionMap_[SERVER_LEAVE_METANODE] = OHOS_PERMISSION_DISTRIBUTED_SOFTBUS_CENTER; memberPermissionMap_[SERVER_GET_ALL_ONLINE_NODE_INFO] = OHOS_PERMISSION_DISTRIBUTED_DATASYNC; memberPermissionMap_[SERVER_GET_LOCAL_DEVICE_INFO] = OHOS_PERMISSION_DISTRIBUTED_DATASYNC; memberPermissionMap_[SERVER_GET_NODE_KEY_INFO] = OHOS_PERMISSION_DISTRIBUTED_DATASYNC; -- Gitee