1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "trans_channel_callback.h"
17
18 #include "softbus_adapter_hitrace.h"
19 #include "softbus_def.h"
20 #include "softbus_errcode.h"
21 #include "softbus_hisysevt_transreporter.h"
22 #include "softbus_log.h"
23 #include "trans_client_proxy.h"
24 #include "trans_lane_manager.h"
25 #include "trans_session_manager.h"
26 #include "softbus_qos.h"
27
28 static IServerChannelCallBack g_channelCallBack;
29
TransServerOnChannelOpened(const char * pkgName,int32_t pid,const char * sessionName,const ChannelInfo * channel)30 static int32_t TransServerOnChannelOpened(const char *pkgName, int32_t pid, const char *sessionName,
31 const ChannelInfo *channel)
32 {
33 if (pkgName == NULL || sessionName == NULL || channel == NULL) {
34 return SOFTBUS_INVALID_PARAM;
35 }
36
37 if (!channel->isServer && channel->channelType == CHANNEL_TYPE_UDP &&
38 NotifyQosChannelOpened(channel) != SOFTBUS_OK) {
39 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_WARN, "NotifyQosChannelOpened failed.");
40 return SOFTBUS_ERR;
41 }
42 int64_t timeStart = channel->timeStart;
43 int64_t timediff = GetSoftbusRecordTimeMillis() - timeStart;
44 SoftbusRecordOpenSessionKpi(pkgName, channel->linkType, SOFTBUS_EVT_OPEN_SESSION_SUCC, timediff);
45 SoftbusHitraceStop();
46 return ClientIpcOnChannelOpened(pkgName, sessionName, channel, pid);
47 }
48
TransServerOnChannelClosed(const char * pkgName,int32_t pid,int32_t channelId,int32_t channelType)49 static int32_t TransServerOnChannelClosed(const char *pkgName, int32_t pid, int32_t channelId, int32_t channelType)
50 {
51 if (pkgName == NULL) {
52 return SOFTBUS_INVALID_PARAM;
53 }
54
55 if (TransLaneMgrDelLane(channelId, channelType) != SOFTBUS_OK) {
56 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_WARN, "delete lane object failed.");
57 }
58 NotifyQosChannelClosed(channelId, channelType);
59 if (ClientIpcOnChannelClosed(pkgName, channelId, channelType, pid) != SOFTBUS_OK) {
60 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "notify fail");
61 return SOFTBUS_ERR;
62 }
63 return SOFTBUS_OK;
64 }
65
TransServerOnChannelOpenFailed(const char * pkgName,int32_t pid,int32_t channelId,int32_t channelType,int32_t errCode)66 static int32_t TransServerOnChannelOpenFailed(const char *pkgName, int32_t pid, int32_t channelId,
67 int32_t channelType, int32_t errCode)
68 {
69 if (pkgName == NULL) {
70 return SOFTBUS_INVALID_PARAM;
71 }
72 if (TransLaneMgrDelLane(channelId, channelType) != SOFTBUS_OK) {
73 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_WARN, "delete lane object failed.");
74 }
75 NotifyQosChannelClosed(channelId, channelType);
76 if (ClientIpcOnChannelOpenFailed(pkgName, channelId, channelType, errCode, pid) != SOFTBUS_OK) {
77 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "notify fail");
78 return SOFTBUS_ERR;
79 }
80 SoftbusHitraceStop();
81 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_WARN,
82 "trasn server on channel open failed.[pkgname=%s][channid=%d][type=%d]", pkgName, channelId, channelType);
83 return SOFTBUS_OK;
84 }
85
TransServerOnMsgReceived(const char * pkgName,int32_t pid,int32_t channelId,int32_t channelType,TransReceiveData * receiveData)86 static int32_t TransServerOnMsgReceived(const char *pkgName, int32_t pid, int32_t channelId, int32_t channelType,
87 TransReceiveData* receiveData)
88 {
89 if (pkgName == NULL || receiveData == NULL || receiveData->data == NULL || receiveData->dataLen == 0) {
90 return SOFTBUS_INVALID_PARAM;
91 }
92
93 if (ClientIpcOnChannelMsgReceived(pkgName, channelId, channelType, receiveData, pid) != SOFTBUS_OK) {
94 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get pkg name fail");
95 return SOFTBUS_ERR;
96 }
97 return SOFTBUS_OK;
98 }
99
TransServerOnQosEvent(const char * pkgName,const QosParam * param)100 static int32_t TransServerOnQosEvent(const char *pkgName, const QosParam *param)
101 {
102 if (pkgName == NULL || param == NULL || param->tvCount <= 0) {
103 return SOFTBUS_INVALID_PARAM;
104 }
105
106 if (ClientIpcOnChannelQosEvent(pkgName, param) != SOFTBUS_OK) {
107 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "ClientIpcOnChannelQosEvent fail");
108 return SOFTBUS_ERR;
109 }
110 return SOFTBUS_OK;
111 }
112
TransServerGetChannelCb(void)113 NO_SANITIZE("cfi") IServerChannelCallBack *TransServerGetChannelCb(void)
114 {
115 g_channelCallBack.OnChannelOpened = TransServerOnChannelOpened;
116 g_channelCallBack.OnChannelClosed = TransServerOnChannelClosed;
117 g_channelCallBack.OnChannelOpenFailed = TransServerOnChannelOpenFailed;
118 g_channelCallBack.OnDataReceived = TransServerOnMsgReceived;
119 g_channelCallBack.OnQosEvent = TransServerOnQosEvent;
120 g_channelCallBack.GetPkgNameBySessionName = TransGetPkgNameBySessionName;
121 g_channelCallBack.GetUidAndPidBySessionName = TransGetUidAndPid;
122 return &g_channelCallBack;
123 }
124
TransServerOnChannelLinkDown(const char * pkgName,int32_t pid,const char * uuid,const char * udid,const char * peerIp,const char * networkId,int32_t routeType)125 NO_SANITIZE("cfi") int32_t TransServerOnChannelLinkDown(const char *pkgName, int32_t pid, const char *uuid,
126 const char *udid, const char *peerIp, const char *networkId, int32_t routeType)
127 {
128 if (pkgName == NULL || networkId == NULL) {
129 return SOFTBUS_INVALID_PARAM;
130 }
131 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_WARN, "TransServerOnChannelLinkDown: pkgName=%s", pkgName);
132
133 if (ClientIpcOnChannelLinkDown(pkgName, networkId, uuid, udid, peerIp, routeType, pid) != SOFTBUS_OK) {
134 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "notify fail");
135 return SOFTBUS_ERR;
136 }
137 return SOFTBUS_OK;
138 }
139
140