1518678f8Sopenharmony_ci/* 2518678f8Sopenharmony_ci * Copyright (C) 2021-2022 Huawei Device Co., Ltd. 3518678f8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4518678f8Sopenharmony_ci * you may not use this file except in compliance with the License. 5518678f8Sopenharmony_ci * You may obtain a copy of the License at 6518678f8Sopenharmony_ci * 7518678f8Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8518678f8Sopenharmony_ci * 9518678f8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10518678f8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11518678f8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12518678f8Sopenharmony_ci * See the License for the specific language governing permissions and 13518678f8Sopenharmony_ci * limitations under the License. 14518678f8Sopenharmony_ci */ 15518678f8Sopenharmony_ci#include "dhcp_server_callback_proxy.h" 16518678f8Sopenharmony_ci#include "dhcp_server_stub.h" 17518678f8Sopenharmony_ci#include "dhcp_logger.h" 18518678f8Sopenharmony_ci#include "dhcp_manager_service_ipc_interface_code.h" 19518678f8Sopenharmony_ci#include "dhcp_server_death_recipient.h" 20518678f8Sopenharmony_ci 21518678f8Sopenharmony_ciDEFINE_DHCPLOG_DHCP_LABEL("DhcpServerStub"); 22518678f8Sopenharmony_ci 23518678f8Sopenharmony_cinamespace OHOS { 24518678f8Sopenharmony_cinamespace DHCP { 25518678f8Sopenharmony_ciDhcpServerStub::DhcpServerStub() : mSingleCallback(false), callback_(nullptr) 26518678f8Sopenharmony_ci{ 27518678f8Sopenharmony_ci InitHandleMap(); 28518678f8Sopenharmony_ci} 29518678f8Sopenharmony_ci 30518678f8Sopenharmony_ciDhcpServerStub::~DhcpServerStub() 31518678f8Sopenharmony_ci{} 32518678f8Sopenharmony_ci 33518678f8Sopenharmony_civoid DhcpServerStub::InitHandleMap() 34518678f8Sopenharmony_ci{ 35518678f8Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_REG_CALL_BACK)] = 36518678f8Sopenharmony_ci [this](uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { 37518678f8Sopenharmony_ci return OnRegisterCallBack(code, data, reply, option); 38518678f8Sopenharmony_ci }; 39518678f8Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_START_DHCP_SERVER)] = 40518678f8Sopenharmony_ci [this](uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { 41518678f8Sopenharmony_ci return OnStartDhcpServer(code, data, reply, option); 42518678f8Sopenharmony_ci }; 43518678f8Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_STOP_DHCP_SERVER)] = 44518678f8Sopenharmony_ci [this](uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { 45518678f8Sopenharmony_ci return OnStopDhcpServer(code, data, reply, option); 46518678f8Sopenharmony_ci }; 47518678f8Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_SET_DHCP_RANGE)] = 48518678f8Sopenharmony_ci [this](uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { 49518678f8Sopenharmony_ci return OnSetDhcpRange(code, data, reply, option); 50518678f8Sopenharmony_ci }; 51518678f8Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_SET_DHCP_NAME)] = 52518678f8Sopenharmony_ci [this](uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { 53518678f8Sopenharmony_ci return OnSetDhcpName(code, data, reply, option); 54518678f8Sopenharmony_ci }; 55518678f8Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_PUT_DHCP_RANGE)] = 56518678f8Sopenharmony_ci [this](uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { 57518678f8Sopenharmony_ci return OnPutDhcpRange(code, data, reply, option); 58518678f8Sopenharmony_ci }; 59518678f8Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_REMOVE_ALL_DHCP_RANGE)] = 60518678f8Sopenharmony_ci [this](uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { 61518678f8Sopenharmony_ci return OnRemoveAllDhcpRange(code, data, reply, option); 62518678f8Sopenharmony_ci }; 63518678f8Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_REMOVE_DHCP_RANGE)] = 64518678f8Sopenharmony_ci [this](uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { 65518678f8Sopenharmony_ci return OnRemoveDhcpRange(code, data, reply, option); 66518678f8Sopenharmony_ci }; 67518678f8Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_UPDATE_RENEW_TIME)] = 68518678f8Sopenharmony_ci [this](uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { 69518678f8Sopenharmony_ci return OnUpdateLeasesTime(code, data, reply, option); 70518678f8Sopenharmony_ci }; 71518678f8Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_GET_DHCP_CLIENT_INFO)] = 72518678f8Sopenharmony_ci [this](uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { 73518678f8Sopenharmony_ci return OnGetDhcpClientInfos(code, data, reply, option); 74518678f8Sopenharmony_ci }; 75518678f8Sopenharmony_ci} 76518678f8Sopenharmony_ci 77518678f8Sopenharmony_ciint DhcpServerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) 78518678f8Sopenharmony_ci{ 79518678f8Sopenharmony_ci DHCP_LOGI("DhcpServerStub::OnRemoteRequest,code:%{public}u", code); 80518678f8Sopenharmony_ci if (data.ReadInterfaceToken() != GetDescriptor()) { 81518678f8Sopenharmony_ci DHCP_LOGE("dhcp server stub token verification error: %{public}d", code); 82518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 83518678f8Sopenharmony_ci } 84518678f8Sopenharmony_ci HandleFuncMap::iterator iter = handleFuncMap.find(code); 85518678f8Sopenharmony_ci if (iter == handleFuncMap.end()) { 86518678f8Sopenharmony_ci DHCP_LOGI("not find function to deal, code %{public}u", code); 87518678f8Sopenharmony_ci return IPCObjectStub::OnRemoteRequest(code, data, reply, option); 88518678f8Sopenharmony_ci } else { 89518678f8Sopenharmony_ci int exception = data.ReadInt32(); 90518678f8Sopenharmony_ci DHCP_LOGI("server rec, exception:%{public}d", exception); 91518678f8Sopenharmony_ci if (exception) { 92518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 93518678f8Sopenharmony_ci } 94518678f8Sopenharmony_ci return (iter->second)(code, data, reply, option); 95518678f8Sopenharmony_ci } 96518678f8Sopenharmony_ci} 97518678f8Sopenharmony_ci 98518678f8Sopenharmony_cibool DhcpServerStub::IsSingleCallback() const 99518678f8Sopenharmony_ci{ 100518678f8Sopenharmony_ci return mSingleCallback; 101518678f8Sopenharmony_ci} 102518678f8Sopenharmony_ci 103518678f8Sopenharmony_civoid DhcpServerStub::SetSingleCallback(const bool isSingleCallback) 104518678f8Sopenharmony_ci{ 105518678f8Sopenharmony_ci mSingleCallback = true; 106518678f8Sopenharmony_ci} 107518678f8Sopenharmony_ci 108518678f8Sopenharmony_ciint DhcpServerStub::OnRegisterCallBack(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) 109518678f8Sopenharmony_ci{ 110518678f8Sopenharmony_ci DHCP_LOGI("run %{public}s code %{public}u, datasize %{public}zu", __func__, code, data.GetRawDataSize()); 111518678f8Sopenharmony_ci sptr<IRemoteObject> remote = data.ReadRemoteObject(); 112518678f8Sopenharmony_ci if (remote == nullptr) { 113518678f8Sopenharmony_ci DHCP_LOGE("Failed to ReadRemoteObject!"); 114518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 115518678f8Sopenharmony_ci } 116518678f8Sopenharmony_ci callback_ = iface_cast<IDhcpServerCallBack>(remote); 117518678f8Sopenharmony_ci if (callback_ == nullptr) { 118518678f8Sopenharmony_ci callback_ = new (std::nothrow) DhcpServerCallbackProxy(remote); 119518678f8Sopenharmony_ci DHCP_LOGI("create new DhcpServerCallbackProxy!"); 120518678f8Sopenharmony_ci } 121518678f8Sopenharmony_ci DHCP_LOGI("send OnStartDhcpClient data start"); 122518678f8Sopenharmony_ci int pid = data.ReadInt32(); 123518678f8Sopenharmony_ci int tokenId = data.ReadInt32(); 124518678f8Sopenharmony_ci std::string ifName = data.ReadString(); 125518678f8Sopenharmony_ci DHCP_LOGD("%{public}s, get pid: %{public}d, tokenId: %{private}d", __func__, pid, tokenId); 126518678f8Sopenharmony_ci 127518678f8Sopenharmony_ci ErrCode ret = RegisterDhcpServerCallBack(ifName, callback_); 128518678f8Sopenharmony_ci reply.WriteInt32(0); 129518678f8Sopenharmony_ci reply.WriteInt32(ret); 130518678f8Sopenharmony_ci return 0; 131518678f8Sopenharmony_ci} 132518678f8Sopenharmony_ci 133518678f8Sopenharmony_ciint DhcpServerStub::OnStartDhcpServer(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) 134518678f8Sopenharmony_ci{ 135518678f8Sopenharmony_ci DHCP_LOGI("OnStartDhcpServer\n"); 136518678f8Sopenharmony_ci int pid = data.ReadInt32(); 137518678f8Sopenharmony_ci int tokenId = data.ReadInt32(); 138518678f8Sopenharmony_ci std::string ifName = data.ReadString(); 139518678f8Sopenharmony_ci DHCP_LOGD("%{public}s, get pid: %{public}d, tokenId: %{private}d", __func__, pid, tokenId); 140518678f8Sopenharmony_ci 141518678f8Sopenharmony_ci ErrCode ret = StartDhcpServer(ifName); 142518678f8Sopenharmony_ci reply.WriteInt32(0); 143518678f8Sopenharmony_ci reply.WriteInt32(ret); 144518678f8Sopenharmony_ci 145518678f8Sopenharmony_ci return 0; 146518678f8Sopenharmony_ci} 147518678f8Sopenharmony_ci 148518678f8Sopenharmony_ciint DhcpServerStub::OnStopDhcpServer(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) 149518678f8Sopenharmony_ci{ 150518678f8Sopenharmony_ci DHCP_LOGI("OnStopDhcpServer\n"); 151518678f8Sopenharmony_ci std::string ifName = data.ReadString(); 152518678f8Sopenharmony_ci ErrCode ret = StopDhcpServer(ifName); 153518678f8Sopenharmony_ci reply.WriteInt32(0); 154518678f8Sopenharmony_ci reply.WriteInt32(ret); 155518678f8Sopenharmony_ci 156518678f8Sopenharmony_ci return 0; 157518678f8Sopenharmony_ci} 158518678f8Sopenharmony_ci 159518678f8Sopenharmony_ciint DhcpServerStub::OnSetDhcpName(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) 160518678f8Sopenharmony_ci{ 161518678f8Sopenharmony_ci std::string tagName = data.ReadString(); 162518678f8Sopenharmony_ci std::string ifname = data.ReadString(); 163518678f8Sopenharmony_ci DHCP_LOGI("OnSetDhcpName ifname = %{public}s\n", ifname.c_str()); 164518678f8Sopenharmony_ci ErrCode ret = SetDhcpName(ifname, tagName); 165518678f8Sopenharmony_ci reply.WriteInt32(0); 166518678f8Sopenharmony_ci reply.WriteInt32(ret); 167518678f8Sopenharmony_ci 168518678f8Sopenharmony_ci return 0; 169518678f8Sopenharmony_ci} 170518678f8Sopenharmony_ciint DhcpServerStub::OnSetDhcpRange(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) 171518678f8Sopenharmony_ci{ 172518678f8Sopenharmony_ci DHCP_LOGI("OnSetDhcpRange\n"); 173518678f8Sopenharmony_ci DhcpRange range; 174518678f8Sopenharmony_ci range.iptype = data.ReadInt32(); 175518678f8Sopenharmony_ci range.leaseHours = data.ReadInt32(); 176518678f8Sopenharmony_ci range.strTagName = data.ReadString(); 177518678f8Sopenharmony_ci range.strStartip = data.ReadString(); 178518678f8Sopenharmony_ci range.strEndip = data.ReadString(); 179518678f8Sopenharmony_ci range.strSubnet = data.ReadString(); 180518678f8Sopenharmony_ci std::string ifname = data.ReadString(); 181518678f8Sopenharmony_ci ErrCode ret = SetDhcpRange(ifname, range); 182518678f8Sopenharmony_ci reply.WriteInt32(0); 183518678f8Sopenharmony_ci reply.WriteInt32(ret); 184518678f8Sopenharmony_ci 185518678f8Sopenharmony_ci return 0; 186518678f8Sopenharmony_ci} 187518678f8Sopenharmony_ciint DhcpServerStub::OnRemoveAllDhcpRange(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) 188518678f8Sopenharmony_ci{ 189518678f8Sopenharmony_ci DHCP_LOGI("OnRemoveAllDhcpRange\n"); 190518678f8Sopenharmony_ci std::string tagName = data.ReadString(); 191518678f8Sopenharmony_ci ErrCode ret = RemoveAllDhcpRange(tagName); 192518678f8Sopenharmony_ci reply.WriteInt32(0); 193518678f8Sopenharmony_ci reply.WriteInt32(ret); 194518678f8Sopenharmony_ci 195518678f8Sopenharmony_ci return 0; 196518678f8Sopenharmony_ci} 197518678f8Sopenharmony_ciint DhcpServerStub::OnRemoveDhcpRange(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) 198518678f8Sopenharmony_ci{ 199518678f8Sopenharmony_ci DHCP_LOGI("OnRemoveDhcpRange\n"); 200518678f8Sopenharmony_ci DhcpRange range; 201518678f8Sopenharmony_ci range.iptype = data.ReadInt32(); 202518678f8Sopenharmony_ci range.leaseHours = data.ReadInt32(); 203518678f8Sopenharmony_ci range.strTagName = data.ReadString(); 204518678f8Sopenharmony_ci range.strStartip = data.ReadString(); 205518678f8Sopenharmony_ci range.strEndip = data.ReadString(); 206518678f8Sopenharmony_ci range.strSubnet = data.ReadString(); 207518678f8Sopenharmony_ci std::string tagName = data.ReadString(); 208518678f8Sopenharmony_ci ErrCode ret = RemoveDhcpRange(tagName, range); 209518678f8Sopenharmony_ci reply.WriteInt32(0); 210518678f8Sopenharmony_ci reply.WriteInt32(ret); 211518678f8Sopenharmony_ci 212518678f8Sopenharmony_ci return 0; 213518678f8Sopenharmony_ci} 214518678f8Sopenharmony_ciint DhcpServerStub::OnGetDhcpClientInfos(uint32_t code, MessageParcel &data, MessageParcel &reply, 215518678f8Sopenharmony_ci MessageOption &option) 216518678f8Sopenharmony_ci{ 217518678f8Sopenharmony_ci DHCP_LOGI("OnGetDhcpClientInfos\n"); 218518678f8Sopenharmony_ci std::vector<std::string> leases; 219518678f8Sopenharmony_ci std::string ifname = data.ReadString(); 220518678f8Sopenharmony_ci ErrCode ret = GetDhcpClientInfos(ifname, leases); 221518678f8Sopenharmony_ci reply.WriteInt32(0); 222518678f8Sopenharmony_ci reply.WriteInt32(ret); 223518678f8Sopenharmony_ci if (ret != DHCP_E_SUCCESS) { 224518678f8Sopenharmony_ci return ret; 225518678f8Sopenharmony_ci } 226518678f8Sopenharmony_ci int size = leases.size(); 227518678f8Sopenharmony_ci DHCP_LOGI("OnGetDhcpClientInfos, reply message size:%{public}d\n", size); 228518678f8Sopenharmony_ci reply.WriteInt32(size); 229518678f8Sopenharmony_ci for (auto str : leases) { 230518678f8Sopenharmony_ci reply.WriteString(str); 231518678f8Sopenharmony_ci } 232518678f8Sopenharmony_ci 233518678f8Sopenharmony_ci return 0; 234518678f8Sopenharmony_ci} 235518678f8Sopenharmony_ci 236518678f8Sopenharmony_ciint DhcpServerStub::OnUpdateLeasesTime(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) 237518678f8Sopenharmony_ci{ 238518678f8Sopenharmony_ci DHCP_LOGI("OnUpdateLeasesTime\n"); 239518678f8Sopenharmony_ci std::string leaseTime = data.ReadString(); 240518678f8Sopenharmony_ci ErrCode ret = UpdateLeasesTime(leaseTime); 241518678f8Sopenharmony_ci reply.WriteInt32(0); 242518678f8Sopenharmony_ci reply.WriteInt32(ret); 243518678f8Sopenharmony_ci 244518678f8Sopenharmony_ci return 0; 245518678f8Sopenharmony_ci} 246518678f8Sopenharmony_ci 247518678f8Sopenharmony_ciint DhcpServerStub::OnPutDhcpRange(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) 248518678f8Sopenharmony_ci{ 249518678f8Sopenharmony_ci DHCP_LOGI("OnPutDhcpRange\n"); 250518678f8Sopenharmony_ci DhcpRange range; 251518678f8Sopenharmony_ci range.iptype = data.ReadInt32(); 252518678f8Sopenharmony_ci range.leaseHours = data.ReadInt32(); 253518678f8Sopenharmony_ci range.strTagName = data.ReadString(); 254518678f8Sopenharmony_ci range.strStartip = data.ReadString(); 255518678f8Sopenharmony_ci range.strEndip = data.ReadString(); 256518678f8Sopenharmony_ci range.strSubnet = data.ReadString(); 257518678f8Sopenharmony_ci std::string tagName = data.ReadString(); 258518678f8Sopenharmony_ci ErrCode ret = PutDhcpRange(tagName, range); 259518678f8Sopenharmony_ci reply.WriteInt32(0); 260518678f8Sopenharmony_ci reply.WriteInt32(ret); 261518678f8Sopenharmony_ci 262518678f8Sopenharmony_ci return 0; 263518678f8Sopenharmony_ci} 264518678f8Sopenharmony_ci} 265518678f8Sopenharmony_ci}