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}