1518678f8Sopenharmony_ci/* 2518678f8Sopenharmony_ci * Copyright (C) 2024 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 16518678f8Sopenharmony_ci#include "dhcp_common_utils.h" 17518678f8Sopenharmony_ci#include <arpa/inet.h> 18518678f8Sopenharmony_ci#include <netinet/if_ether.h> 19518678f8Sopenharmony_ci#include <regex> 20518678f8Sopenharmony_ci#include "securec.h" 21518678f8Sopenharmony_ci#include "dhcp_logger.h" 22518678f8Sopenharmony_ci 23518678f8Sopenharmony_cinamespace OHOS { 24518678f8Sopenharmony_cinamespace DHCP { 25518678f8Sopenharmony_ciDEFINE_DHCPLOG_DHCP_LABEL("DhcpCommonUtils"); 26518678f8Sopenharmony_ci 27518678f8Sopenharmony_ciconstexpr int32_t GATEWAY_MAC_LENTH = 18; 28518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_0 = 0; 29518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_1 = 1; 30518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_2 = 2; 31518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_3 = 3; 32518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_4 = 4; 33518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_5 = 5; 34518678f8Sopenharmony_ci 35518678f8Sopenharmony_cistd::string Ipv4Anonymize(const std::string str) 36518678f8Sopenharmony_ci{ 37518678f8Sopenharmony_ci std::string strTemp = str; 38518678f8Sopenharmony_ci std::string::size_type begin = strTemp.find_last_of('.'); 39518678f8Sopenharmony_ci while (begin < strTemp.length()) { 40518678f8Sopenharmony_ci if (strTemp[begin] != '.') { 41518678f8Sopenharmony_ci strTemp[begin] = '*'; 42518678f8Sopenharmony_ci } 43518678f8Sopenharmony_ci begin++; 44518678f8Sopenharmony_ci } 45518678f8Sopenharmony_ci return strTemp; 46518678f8Sopenharmony_ci} 47518678f8Sopenharmony_ci 48518678f8Sopenharmony_cichar *UintIp4ToStr(uint32_t uIp, bool bHost) 49518678f8Sopenharmony_ci{ 50518678f8Sopenharmony_ci char bufIp4[INET_ADDRSTRLEN] = {0}; 51518678f8Sopenharmony_ci struct in_addr addr4; 52518678f8Sopenharmony_ci if (bHost) { 53518678f8Sopenharmony_ci addr4.s_addr = htonl(uIp); 54518678f8Sopenharmony_ci } else { 55518678f8Sopenharmony_ci addr4.s_addr = uIp; 56518678f8Sopenharmony_ci } 57518678f8Sopenharmony_ci const char *p = inet_ntop(AF_INET, &addr4, bufIp4, INET_ADDRSTRLEN); 58518678f8Sopenharmony_ci if (p == nullptr) { 59518678f8Sopenharmony_ci DHCP_LOGE("UintIp4ToStr inet_ntop p == nullptr!"); 60518678f8Sopenharmony_ci return nullptr; 61518678f8Sopenharmony_ci } 62518678f8Sopenharmony_ci char *strIp = static_cast<char *>(malloc(INET_ADDRSTRLEN)); 63518678f8Sopenharmony_ci if (strIp == nullptr) { 64518678f8Sopenharmony_ci DHCP_LOGE("UintIp4ToStr strIp malloc failed!"); 65518678f8Sopenharmony_ci return nullptr; 66518678f8Sopenharmony_ci } 67518678f8Sopenharmony_ci if (strncpy_s(strIp, INET_ADDRSTRLEN, bufIp4, strlen(bufIp4)) != EOK) { 68518678f8Sopenharmony_ci DHCP_LOGE("UintIp4ToStr strIp strncpy_s failed!"); 69518678f8Sopenharmony_ci free(strIp); 70518678f8Sopenharmony_ci strIp = nullptr; 71518678f8Sopenharmony_ci return nullptr; 72518678f8Sopenharmony_ci } 73518678f8Sopenharmony_ci return strIp; 74518678f8Sopenharmony_ci} 75518678f8Sopenharmony_ci 76518678f8Sopenharmony_cistd::string IntIpv4ToAnonymizeStr(uint32_t ip) 77518678f8Sopenharmony_ci{ 78518678f8Sopenharmony_ci std::string strTemp = ""; 79518678f8Sopenharmony_ci char *pIp = UintIp4ToStr(ip, false); 80518678f8Sopenharmony_ci if (pIp != nullptr) { 81518678f8Sopenharmony_ci strTemp = Ipv4Anonymize(pIp); 82518678f8Sopenharmony_ci free(pIp); 83518678f8Sopenharmony_ci pIp = nullptr; 84518678f8Sopenharmony_ci } 85518678f8Sopenharmony_ci return strTemp; 86518678f8Sopenharmony_ci} 87518678f8Sopenharmony_ci 88518678f8Sopenharmony_cistd::string MacArray2Str(uint8_t *macArray, int32_t len) 89518678f8Sopenharmony_ci{ 90518678f8Sopenharmony_ci if ((macArray == nullptr) || (len != ETH_ALEN)) { 91518678f8Sopenharmony_ci DHCP_LOGE("MacArray2Str arg is invalid!"); 92518678f8Sopenharmony_ci return ""; 93518678f8Sopenharmony_ci } 94518678f8Sopenharmony_ci 95518678f8Sopenharmony_ci char gwMacAddr[GATEWAY_MAC_LENTH] = {0}; 96518678f8Sopenharmony_ci if (sprintf_s(gwMacAddr, sizeof(gwMacAddr), "%02x:%02x:%02x:%02x:%02x:%02x", macArray[MAC_INDEX_0], 97518678f8Sopenharmony_ci macArray[MAC_INDEX_1], macArray[MAC_INDEX_2], macArray[MAC_INDEX_3], macArray[MAC_INDEX_4], 98518678f8Sopenharmony_ci macArray[MAC_INDEX_5]) < 0) { 99518678f8Sopenharmony_ci DHCP_LOGE("MacArray2Str sprintf_s err"); 100518678f8Sopenharmony_ci return ""; 101518678f8Sopenharmony_ci } 102518678f8Sopenharmony_ci std::string ret = gwMacAddr; 103518678f8Sopenharmony_ci return ret; 104518678f8Sopenharmony_ci} 105518678f8Sopenharmony_ci 106518678f8Sopenharmony_ciint CheckDataLegal(std::string &data, int base) 107518678f8Sopenharmony_ci{ 108518678f8Sopenharmony_ci std::regex pattern("\\d+"); 109518678f8Sopenharmony_ci if (!std::regex_search(data, pattern)) { 110518678f8Sopenharmony_ci return 0; 111518678f8Sopenharmony_ci } 112518678f8Sopenharmony_ci errno = 0; 113518678f8Sopenharmony_ci char *endptr = nullptr; 114518678f8Sopenharmony_ci long int num = std::strtol(data.c_str(), &endptr, base); 115518678f8Sopenharmony_ci if (errno == ERANGE) { 116518678f8Sopenharmony_ci DHCP_LOGE("CheckDataLegal errno == ERANGE, data:%{private}s", data.c_str()); 117518678f8Sopenharmony_ci return 0; 118518678f8Sopenharmony_ci } 119518678f8Sopenharmony_ci return static_cast<int>(num); 120518678f8Sopenharmony_ci} 121518678f8Sopenharmony_ci 122518678f8Sopenharmony_ciunsigned int CheckDataToUint(std::string &data, int base) 123518678f8Sopenharmony_ci{ 124518678f8Sopenharmony_ci std::regex pattern("\\d+"); 125518678f8Sopenharmony_ci std::regex patternTmp("-\\d+"); 126518678f8Sopenharmony_ci if (!std::regex_search(data, pattern) || std::regex_search(data, patternTmp)) { 127518678f8Sopenharmony_ci DHCP_LOGE("CheckDataToUint regex unsigned int value fail, data:%{private}s", data.c_str()); 128518678f8Sopenharmony_ci return 0; 129518678f8Sopenharmony_ci } 130518678f8Sopenharmony_ci errno = 0; 131518678f8Sopenharmony_ci char *endptr = nullptr; 132518678f8Sopenharmony_ci unsigned long int num = std::strtoul(data.c_str(), &endptr, base); 133518678f8Sopenharmony_ci if (errno == ERANGE) { 134518678f8Sopenharmony_ci DHCP_LOGE("CheckDataToUint errno == ERANGE, data:%{private}s", data.c_str()); 135518678f8Sopenharmony_ci return 0; 136518678f8Sopenharmony_ci } 137518678f8Sopenharmony_ci return static_cast<unsigned int>(num); 138518678f8Sopenharmony_ci} 139518678f8Sopenharmony_ci 140518678f8Sopenharmony_cilong long CheckDataTolonglong(std::string &data, int base) 141518678f8Sopenharmony_ci{ 142518678f8Sopenharmony_ci std::regex pattern("\\d+"); 143518678f8Sopenharmony_ci if (!std::regex_search(data, pattern)) { 144518678f8Sopenharmony_ci return 0; 145518678f8Sopenharmony_ci } 146518678f8Sopenharmony_ci errno = 0; 147518678f8Sopenharmony_ci char *endptr = nullptr; 148518678f8Sopenharmony_ci long long int num = std::strtoll(data.c_str(), &endptr, base); 149518678f8Sopenharmony_ci if (errno == ERANGE) { 150518678f8Sopenharmony_ci DHCP_LOGE("CheckDataTolonglong errno == ERANGE, data:%{private}s", data.c_str()); 151518678f8Sopenharmony_ci return 0; 152518678f8Sopenharmony_ci } 153518678f8Sopenharmony_ci return num; 154518678f8Sopenharmony_ci} 155518678f8Sopenharmony_ci 156518678f8Sopenharmony_ciint64_t GetElapsedSecondsSinceBoot() 157518678f8Sopenharmony_ci{ 158518678f8Sopenharmony_ci struct timespec times = {0, 0}; 159518678f8Sopenharmony_ci clock_gettime(CLOCK_BOOTTIME, ×); 160518678f8Sopenharmony_ci return static_cast<int64_t>(times.tv_sec); 161518678f8Sopenharmony_ci} 162518678f8Sopenharmony_ci} 163518678f8Sopenharmony_ci} 164