mss-bpf: remove unused-but-set variable
[project/unetd.git] / utils.h
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (C) 2022 Felix Fietkau <nbd@nbd.name>
4 */
5 #ifndef __UNETD_UTILS_H
6 #define __UNETD_UTILS_H
7
8 #include <netinet/in.h>
9
10 struct nl_msg;
11
12 union network_addr {
13 struct {
14 uint8_t network_id[8];
15 uint8_t host_addr[8];
16 };
17 struct in_addr in;
18 struct in6_addr in6;
19 };
20
21 union network_endpoint {
22 struct sockaddr sa;
23 struct sockaddr_in in;
24 struct sockaddr_in6 in6;
25 };
26
27 static inline void *
28 network_endpoint_addr(union network_endpoint *ep, int *addr_len)
29 {
30 if (ep->sa.sa_family == AF_INET6) {
31 *addr_len = sizeof(ep->in6.sin6_addr);
32 return &ep->in6.sin6_addr;
33 }
34
35 *addr_len = sizeof(ep->in.sin_addr);
36 return &ep->in.sin_addr;
37 }
38
39 static inline bool
40 network_endpoint_addr_equal(union network_endpoint *ep1, union network_endpoint *ep2)
41 {
42 const void *a1, *a2;
43 int len;
44
45 if (ep1->sa.sa_family != ep2->sa.sa_family)
46 return false;
47
48 a1 = network_endpoint_addr(ep1, &len);
49 a2 = network_endpoint_addr(ep2, &len);
50
51 return !memcmp(a1, a2, len);
52 }
53
54 int network_get_endpoint(union network_endpoint *dest, const char *str,
55 int default_port, int idx);
56 int network_get_subnet(int af, union network_addr *addr, int *mask,
57 const char *str);
58 int network_get_local_addr(void *local, const union network_endpoint *target);
59
60 #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
61
62 #define bitmask_size(len) (4 * DIV_ROUND_UP(len, 32))
63
64 static inline bool bitmask_test(uint32_t *mask, unsigned int i)
65 {
66 return mask[i / 32] & (1 << (i % 32));
67 }
68
69 static inline void bitmask_set(uint32_t *mask, unsigned int i)
70 {
71 mask[i / 32] |= 1 << (i % 32);
72 }
73
74 static inline void bitmask_clear(uint32_t *mask, unsigned int i)
75 {
76 mask[i / 32] &= ~(1 << (i % 32));
77 }
78
79 static inline void bitmask_set_val(uint32_t *mask, unsigned int i, bool val)
80 {
81 if (val)
82 bitmask_set(mask, i);
83 else
84 bitmask_clear(mask, i);
85 }
86
87 int rtnl_init(void);
88 int rtnl_call(struct nl_msg *msg);
89
90 #endif