vxlan: add missing options
[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 union network_addr {
11 struct {
12 uint8_t network_id[8];
13 uint8_t host_addr[8];
14 };
15 struct in_addr in;
16 struct in6_addr in6;
17 };
18
19 union network_endpoint {
20 struct sockaddr sa;
21 struct sockaddr_in in;
22 struct sockaddr_in6 in6;
23 };
24
25 static inline void *
26 network_endpoint_addr(union network_endpoint *ep, int *addr_len)
27 {
28 if (ep->sa.sa_family == AF_INET6) {
29 *addr_len = sizeof(ep->in6.sin6_addr);
30 return &ep->in6.sin6_addr;
31 }
32
33 *addr_len = sizeof(ep->in.sin_addr);
34 return &ep->in.sin_addr;
35 }
36
37 static inline bool
38 network_endpoint_addr_equal(union network_endpoint *ep1, union network_endpoint *ep2)
39 {
40 const void *a1, *a2;
41 int len;
42
43 if (ep1->sa.sa_family != ep2->sa.sa_family)
44 return false;
45
46 a1 = network_endpoint_addr(ep1, &len);
47 a2 = network_endpoint_addr(ep2, &len);
48
49 return !memcmp(a1, a2, len);
50 }
51
52 int network_get_endpoint(union network_endpoint *dest, const char *str,
53 int default_port, int idx);
54 int network_get_subnet(int af, union network_addr *addr, int *mask,
55 const char *str);
56 int network_get_local_addr(void *local, const union network_endpoint *target);
57
58 #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
59
60 #define bitmask_size(len) (4 * DIV_ROUND_UP(len, 32))
61
62 static inline bool bitmask_test(uint32_t *mask, unsigned int i)
63 {
64 return mask[i / 32] & (1 << (i % 32));
65 }
66
67 static inline void bitmask_set(uint32_t *mask, unsigned int i)
68 {
69 mask[i / 32] |= 1 << (i % 32);
70 }
71
72 static inline void bitmask_clear(uint32_t *mask, unsigned int i)
73 {
74 mask[i / 32] &= ~(1 << (i % 32));
75 }
76
77 static inline void bitmask_set_val(uint32_t *mask, unsigned int i, bool val)
78 {
79 if (val)
80 bitmask_set(mask, i);
81 else
82 bitmask_clear(mask, i);
83 }
84
85 #endif