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 */