18e745fdaSopenharmony_ci/*
28e745fdaSopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd.
38e745fdaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
48e745fdaSopenharmony_ci * you may not use this file except in compliance with the License.
58e745fdaSopenharmony_ci * You may obtain a copy of the License at
68e745fdaSopenharmony_ci *
78e745fdaSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
88e745fdaSopenharmony_ci *
98e745fdaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
108e745fdaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
118e745fdaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128e745fdaSopenharmony_ci * See the License for the specific language governing permissions and
138e745fdaSopenharmony_ci * limitations under the License.
148e745fdaSopenharmony_ci */
158e745fdaSopenharmony_ci
168e745fdaSopenharmony_ci#include <arpa/inet.h>
178e745fdaSopenharmony_ci#include "net_interface_callback.h"
188e745fdaSopenharmony_ci#include "mdns_manager.h"
198e745fdaSopenharmony_ci#include "netmgr_ext_log_wrapper.h"
208e745fdaSopenharmony_ci
218e745fdaSopenharmony_ci#include <algorithm>
228e745fdaSopenharmony_ci#include <sys/types.h>
238e745fdaSopenharmony_ci#include <unistd.h>
248e745fdaSopenharmony_ci#include <thread>
258e745fdaSopenharmony_ci
268e745fdaSopenharmony_cinamespace OHOS {
278e745fdaSopenharmony_cinamespace NetManagerStandard {
288e745fdaSopenharmony_ciconstexpr int WAITING_TIME_MS = 1000;
298e745fdaSopenharmony_ci
308e745fdaSopenharmony_ciNetInterfaceStateCallback::NetInterfaceStateCallback() {}
318e745fdaSopenharmony_ci
328e745fdaSopenharmony_ciint32_t NetInterfaceStateCallback::OnInterfaceAddressUpdated(const std::string &addr, const std::string &ifName,
338e745fdaSopenharmony_ci                                                             int32_t flags, int32_t scope)
348e745fdaSopenharmony_ci{
358e745fdaSopenharmony_ci    NETMGR_EXT_LOG_I("OnInterfaceAddressUpdated, iface:[%{public}s], scope:[%{public}d]",
368e745fdaSopenharmony_ci                     ifName.c_str(), scope);
378e745fdaSopenharmony_ci    if (ifName.empty()) {
388e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("mdns_log Invalid interface name");
398e745fdaSopenharmony_ci        return NETMANAGER_SUCCESS;
408e745fdaSopenharmony_ci    }
418e745fdaSopenharmony_ci
428e745fdaSopenharmony_ci    std::string ifrName = ifName;
438e745fdaSopenharmony_ci    std::transform(ifrName.begin(), ifrName.end(), ifrName.begin(), ::tolower);
448e745fdaSopenharmony_ci    if (ifrName.find("p2p") != std::string::npos) {
458e745fdaSopenharmony_ci        NETMGR_EXT_LOG_D("mdns_log Not p2p netcard handle");
468e745fdaSopenharmony_ci        return NETMANAGER_SUCCESS;
478e745fdaSopenharmony_ci    }
488e745fdaSopenharmony_ci
498e745fdaSopenharmony_ci    size_t pos = addr.find("/");
508e745fdaSopenharmony_ci    if (pos == std::string::npos) {
518e745fdaSopenharmony_ci        pos = addr.length();
528e745fdaSopenharmony_ci    }
538e745fdaSopenharmony_ci    std::string tmpAddr = addr.substr(0, pos);
548e745fdaSopenharmony_ci    if (tmpAddr.empty()) {
558e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("mdns_log Invalid IP address");
568e745fdaSopenharmony_ci        return NETMANAGER_SUCCESS;
578e745fdaSopenharmony_ci    }
588e745fdaSopenharmony_ci    in6_addr ipAddr;
598e745fdaSopenharmony_ci    int32_t ret = inet_pton(AF_INET6, tmpAddr.c_str(), &ipAddr);
608e745fdaSopenharmony_ci    if (ret > 0 && !MDnsManager::GetInstance().IsSupportIpV6()) {
618e745fdaSopenharmony_ci        NETMGR_EXT_LOG_D("mdns_log Not support IpV6");
628e745fdaSopenharmony_ci        return NETMANAGER_SUCCESS;
638e745fdaSopenharmony_ci    }
648e745fdaSopenharmony_ci
658e745fdaSopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(WAITING_TIME_MS));
668e745fdaSopenharmony_ci    MDnsManager::GetInstance().RestartMDnsProtocolImpl();
678e745fdaSopenharmony_ci    return NETMANAGER_SUCCESS;
688e745fdaSopenharmony_ci}
698e745fdaSopenharmony_ci
708e745fdaSopenharmony_ciint32_t NetInterfaceStateCallback::OnInterfaceAddressRemoved(const std::string &addr, const std::string &ifName,
718e745fdaSopenharmony_ci                                                             int32_t flags, int32_t scope)
728e745fdaSopenharmony_ci{
738e745fdaSopenharmony_ci    NETMGR_EXT_LOG_D("OnInterfaceAddressRemoved, iface:[%{public}s], scope:[%{public}d]",
748e745fdaSopenharmony_ci                     ifName.c_str(), scope);
758e745fdaSopenharmony_ci    return NETMANAGER_SUCCESS;
768e745fdaSopenharmony_ci}
778e745fdaSopenharmony_ci
788e745fdaSopenharmony_ciint32_t NetInterfaceStateCallback::OnInterfaceAdded(const std::string &ifName)
798e745fdaSopenharmony_ci{
808e745fdaSopenharmony_ci    NETMGR_EXT_LOG_D("OnInterfaceAdded, iface:[%{public}s]", ifName.c_str());
818e745fdaSopenharmony_ci    return NETMANAGER_SUCCESS;
828e745fdaSopenharmony_ci}
838e745fdaSopenharmony_ci
848e745fdaSopenharmony_ciint32_t NetInterfaceStateCallback::OnInterfaceRemoved(const std::string &ifName)
858e745fdaSopenharmony_ci{
868e745fdaSopenharmony_ci    NETMGR_EXT_LOG_D("OnInterfaceRemoved, iface:[%{public}s]", ifName.c_str());
878e745fdaSopenharmony_ci    return NETMANAGER_SUCCESS;
888e745fdaSopenharmony_ci}
898e745fdaSopenharmony_ci
908e745fdaSopenharmony_ciint32_t NetInterfaceStateCallback::OnInterfaceChanged(const std::string &ifName, bool up)
918e745fdaSopenharmony_ci{
928e745fdaSopenharmony_ci    NETMGR_EXT_LOG_D("OnInterfaceChanged, iface:[%{public}s]->Up:[%{public}d]", ifName.c_str(), up);
938e745fdaSopenharmony_ci    return NETMANAGER_SUCCESS;
948e745fdaSopenharmony_ci}
958e745fdaSopenharmony_ci
968e745fdaSopenharmony_ciint32_t NetInterfaceStateCallback::OnInterfaceLinkStateChanged(const std::string &ifName, bool up)
978e745fdaSopenharmony_ci{
988e745fdaSopenharmony_ci    NETMGR_EXT_LOG_D("OnInterfaceLinkStateChanged, iface:[%{public}s]->Up:[%{public}d]", ifName.c_str(), up);
998e745fdaSopenharmony_ci    return NETMANAGER_SUCCESS;
1008e745fdaSopenharmony_ci}
1018e745fdaSopenharmony_ci} // namespace NetManagerStandard
1028e745fdaSopenharmony_ci} // namespace OHOS
103