1060ff233Sopenharmony_ci/* 2060ff233Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3060ff233Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4060ff233Sopenharmony_ci * you may not use this file except in compliance with the License. 5060ff233Sopenharmony_ci * You may obtain a copy of the License at 6060ff233Sopenharmony_ci * 7060ff233Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8060ff233Sopenharmony_ci * 9060ff233Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10060ff233Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11060ff233Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12060ff233Sopenharmony_ci * See the License for the specific language governing permissions and 13060ff233Sopenharmony_ci * limitations under the License. 14060ff233Sopenharmony_ci */ 15060ff233Sopenharmony_ci 16060ff233Sopenharmony_ci#ifndef FILLP_UTILS_H 17060ff233Sopenharmony_ci#define FILLP_UTILS_H 18060ff233Sopenharmony_ci#include <time.h> 19060ff233Sopenharmony_ci#include "fillp_os.h" 20060ff233Sopenharmony_ci#include "opt.h" 21060ff233Sopenharmony_ci#include "fillp_function.h" 22060ff233Sopenharmony_ci#include "log.h" 23060ff233Sopenharmony_ci#include "securec.h" 24060ff233Sopenharmony_ci 25060ff233Sopenharmony_ci#ifdef __cplusplus 26060ff233Sopenharmony_ciextern "C" { 27060ff233Sopenharmony_ci#endif 28060ff233Sopenharmony_ci 29060ff233Sopenharmony_ci#define UTILS_FLAGS_SET(_flag, _f) ((_flag) |= (_f)) 30060ff233Sopenharmony_ci#define UTILS_FLAGS_GET(_flag, _f) ((_flag) & (_f)) 31060ff233Sopenharmony_ci#define UTILS_FLAGS_CLEAN(_flag, _f) ((_flag) &= ~(_f)) 32060ff233Sopenharmony_ci#define UTILS_FLAGS_RESET(_flag) ((_flag) &= 0u) 33060ff233Sopenharmony_ci#define UTILS_FLAGS_CHECK(_flag, _f) (((_flag) & (_f)) == (_f)) 34060ff233Sopenharmony_ci 35060ff233Sopenharmony_ci#define UTILS_ARRAY_LEN(_a) (sizeof(_a) / sizeof((_a)[0])) 36060ff233Sopenharmony_ci 37060ff233Sopenharmony_ci#define UTILS_MIN(a, b) ((a) < (b) ? (a) : (b)) 38060ff233Sopenharmony_ci#define UTILS_MAX(a, b) ((a) > (b) ? (a) : (b)) 39060ff233Sopenharmony_ci 40060ff233Sopenharmony_ci#define FILLP_UTILS_MS2US(ms) ((ms) * 1000) 41060ff233Sopenharmony_ci#define FILLP_UTILS_US2MS(us) ((us) / 1000) 42060ff233Sopenharmony_ci#define FILLP_UTILS_US2S(us) ((us) / 1000000) 43060ff233Sopenharmony_ci#define FILLP_UTILS_S2US(s) ((s) * 1000000) 44060ff233Sopenharmony_ci 45060ff233Sopenharmony_ci#define FILLP_UTILS_KBPS2BPS(kbps) ((kbps) * 1000) 46060ff233Sopenharmony_ci#define FILLP_UTILS_BPS2KBPS(bps) ((bps) / 1000) 47060ff233Sopenharmony_ci#define FILLP_UTILS_BIT2BYTE(bit) ((bit) >> 3) 48060ff233Sopenharmony_ci 49060ff233Sopenharmony_ci#define UTILS_GET_ADDRPORT(addr) ((struct sockaddr_in*) (addr))->sin_port 50060ff233Sopenharmony_ci#define IPV6_ADDR_LEN 16 51060ff233Sopenharmony_ci 52060ff233Sopenharmony_ci__inline static FILLP_UINT32 UtilsIpv4AddrPortKey(FILLP_UINT16 port, struct sockaddr_in *remoteAddr) 53060ff233Sopenharmony_ci{ 54060ff233Sopenharmony_ci return (port ^ (remoteAddr)->sin_addr.s_addr); 55060ff233Sopenharmony_ci} 56060ff233Sopenharmony_ci 57060ff233Sopenharmony_ci__inline static FILLP_UINT32 UtilsIpv6AddrPortKey(FILLP_UINT16 port, struct sockaddr_in6 *remoteAddr) 58060ff233Sopenharmony_ci{ 59060ff233Sopenharmony_ci FILLP_INT i; 60060ff233Sopenharmony_ci for (i = 0; i < IPV6_ADDR_LEN; i++) { 61060ff233Sopenharmony_ci port ^= ((remoteAddr)->sin6_addr.s6_addr[i]); 62060ff233Sopenharmony_ci } 63060ff233Sopenharmony_ci return (FILLP_UINT32)port; 64060ff233Sopenharmony_ci} 65060ff233Sopenharmony_ci 66060ff233Sopenharmony_ci__inline static FILLP_UINT32 UtilsAddrHashKey(struct sockaddr_in *addr) 67060ff233Sopenharmony_ci{ 68060ff233Sopenharmony_ci FILLP_INT port = UTILS_GET_ADDRPORT(addr); 69060ff233Sopenharmony_ci socklen_t addrLen = sizeof(struct sockaddr); 70060ff233Sopenharmony_ci 71060ff233Sopenharmony_ci if (((struct sockaddr_in *)(void *)addr)->sin_family == AF_INET6) { 72060ff233Sopenharmony_ci addrLen = sizeof(struct sockaddr_in6); 73060ff233Sopenharmony_ci } 74060ff233Sopenharmony_ci 75060ff233Sopenharmony_ci if (addrLen == sizeof(struct sockaddr)) { 76060ff233Sopenharmony_ci return UtilsIpv4AddrPortKey((FILLP_UINT16)port, addr); 77060ff233Sopenharmony_ci } else { 78060ff233Sopenharmony_ci return UtilsIpv6AddrPortKey((FILLP_UINT16)port, (struct sockaddr_in6 *)addr); 79060ff233Sopenharmony_ci } 80060ff233Sopenharmony_ci} 81060ff233Sopenharmony_ci 82060ff233Sopenharmony_ci__inline static FILLP_BOOL UtilsIpv6AddrMatch(FILLP_CONST struct sockaddr_in6 *a, FILLP_CONST struct sockaddr_in6 *b) 83060ff233Sopenharmony_ci{ 84060ff233Sopenharmony_ci FILLP_INT i; 85060ff233Sopenharmony_ci for (i = 0; i < IPV6_ADDR_LEN; i++) { 86060ff233Sopenharmony_ci if ((a)->sin6_addr.s6_addr[i] != (b)->sin6_addr.s6_addr[i]) { 87060ff233Sopenharmony_ci return FILLP_FALSE; 88060ff233Sopenharmony_ci } 89060ff233Sopenharmony_ci } 90060ff233Sopenharmony_ci return FILLP_TRUE; 91060ff233Sopenharmony_ci} 92060ff233Sopenharmony_ci 93060ff233Sopenharmony_ci#define UTILS_ADDR_FAMILY_MATCH(a, b) (((struct sockaddr_in *)(void *)(a))->sin_family == \ 94060ff233Sopenharmony_ci ((struct sockaddr_in *)(void *)(b))->sin_family) 95060ff233Sopenharmony_ci 96060ff233Sopenharmony_ci#define UTILS_ADDR_PORT_MATCH(a, b) (((struct sockaddr_in *)(void *)(a))->sin_port == \ 97060ff233Sopenharmony_ci ((struct sockaddr_in *)(void *)(b))->sin_port) 98060ff233Sopenharmony_ci 99060ff233Sopenharmony_ci#define UTILS_IPV4_ADDR_MATCH(a, b) ((a)->sin_addr.s_addr == (b)->sin_addr.s_addr && \ 100060ff233Sopenharmony_ci UTILS_ADDR_PORT_MATCH((a), (b))) 101060ff233Sopenharmony_ci 102060ff233Sopenharmony_ci#define UTILS_IPV6_ADDR_MATCH(a, b) (UTILS_ADDR_PORT_MATCH((a), (b)) && \ 103060ff233Sopenharmony_ci UtilsIpv6AddrMatch((a), (b))) 104060ff233Sopenharmony_ci 105060ff233Sopenharmony_cistatic __inline FILLP_BOOL UtilsAddrMatch(FILLP_CONST struct sockaddr_in *addrA, FILLP_CONST struct sockaddr_in *addrB) 106060ff233Sopenharmony_ci{ 107060ff233Sopenharmony_ci if (!UTILS_ADDR_FAMILY_MATCH(addrA, addrB)) { 108060ff233Sopenharmony_ci return FILLP_FALSE; 109060ff233Sopenharmony_ci } 110060ff233Sopenharmony_ci 111060ff233Sopenharmony_ci if (addrA->sin_family == AF_INET) { 112060ff233Sopenharmony_ci return (FILLP_BOOL)UTILS_IPV4_ADDR_MATCH(addrA, addrB); 113060ff233Sopenharmony_ci } else { 114060ff233Sopenharmony_ci return (FILLP_BOOL)UTILS_IPV6_ADDR_MATCH((struct sockaddr_in6 *)addrA, (struct sockaddr_in6 *)addrB); 115060ff233Sopenharmony_ci } 116060ff233Sopenharmony_ci} 117060ff233Sopenharmony_ci 118060ff233Sopenharmony_cistatic __inline void UtilsAddrCopy(struct sockaddr *dest, struct sockaddr *src) 119060ff233Sopenharmony_ci{ 120060ff233Sopenharmony_ci FillpErrorType err; 121060ff233Sopenharmony_ci if (((struct sockaddr_in *)(void *)src)->sin_family == AF_INET) { 122060ff233Sopenharmony_ci err = memcpy_s(dest, sizeof(struct sockaddr_in), src, sizeof(struct sockaddr_in)); 123060ff233Sopenharmony_ci } else { 124060ff233Sopenharmony_ci err = memcpy_s(dest, sizeof(struct sockaddr_in6), src, sizeof(struct sockaddr_in6)); 125060ff233Sopenharmony_ci } 126060ff233Sopenharmony_ci if (err != EOK) { 127060ff233Sopenharmony_ci FILLP_LOGERR("utils_addr_copy memcpy_s failed : %d", err); 128060ff233Sopenharmony_ci } 129060ff233Sopenharmony_ci} 130060ff233Sopenharmony_ci 131060ff233Sopenharmony_cistatic __inline size_t UtilsAddrValidLength(struct sockaddr_in *addr) 132060ff233Sopenharmony_ci{ 133060ff233Sopenharmony_ci if (((struct sockaddr_in *)(void *)addr)->sin_family == AF_INET) { 134060ff233Sopenharmony_ci return sizeof(struct sockaddr_in); 135060ff233Sopenharmony_ci } 136060ff233Sopenharmony_ci 137060ff233Sopenharmony_ci return sizeof(struct sockaddr_in6); 138060ff233Sopenharmony_ci} 139060ff233Sopenharmony_ci 140060ff233Sopenharmony_ci#ifdef __cplusplus 141060ff233Sopenharmony_ci} 142060ff233Sopenharmony_ci#endif 143060ff233Sopenharmony_ci 144060ff233Sopenharmony_ci#endif /* FILLP_UTILS_H */