1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2022 Felix Fietkau <nbd@nbd.name>
5 #ifndef __UNETD_UTILS_H
6 #define __UNETD_UTILS_H
9 #include <netinet/in.h>
10 #include <libubox/utils.h>
16 uint8_t network_id
[8];
23 union network_endpoint
{
25 struct sockaddr_in in
;
26 struct sockaddr_in6 in6
;
30 network_endpoint_addr(union network_endpoint
*ep
, int *addr_len
)
32 if (ep
->sa
.sa_family
== AF_INET6
) {
34 *addr_len
= sizeof(ep
->in6
.sin6_addr
);
35 return &ep
->in6
.sin6_addr
;
39 *addr_len
= sizeof(ep
->in
.sin_addr
);
40 return &ep
->in
.sin_addr
;
44 network_endpoint_addr_equal(union network_endpoint
*ep1
, union network_endpoint
*ep2
)
49 if (ep1
->sa
.sa_family
!= ep2
->sa
.sa_family
)
52 a1
= network_endpoint_addr(ep1
, &len
);
53 a2
= network_endpoint_addr(ep2
, &len
);
55 return !memcmp(a1
, a2
, len
);
58 int network_get_endpoint(union network_endpoint
*dest
, int af
, const char *str
,
59 int default_port
, int idx
);
60 int network_get_subnet(int af
, union network_addr
*addr
, int *mask
,
62 int network_get_local_addr(void *local
, const union network_endpoint
*target
);
64 void *unet_read_file(const char *name
, size_t *len
);
66 #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
68 #define bitmask_size(len) (4 * DIV_ROUND_UP(len, 32))
70 static inline bool bitmask_test(uint32_t *mask
, unsigned int i
)
72 return mask
[i
/ 32] & (1 << (i
% 32));
75 static inline void bitmask_set(uint32_t *mask
, unsigned int i
)
77 mask
[i
/ 32] |= 1 << (i
% 32);
80 static inline void bitmask_clear(uint32_t *mask
, unsigned int i
)
82 mask
[i
/ 32] &= ~(1 << (i
% 32));
85 static inline void bitmask_set_val(uint32_t *mask
, unsigned int i
, bool val
)
90 bitmask_clear(mask
, i
);
93 static inline uint16_t get_unaligned_be16(const uint8_t *p
)
95 return p
[1] | p
[0] << 8;
98 static inline uint32_t get_unaligned_be32(const uint8_t *p
)
100 return p
[3] | p
[2] << 8 | p
[1] << 16 | p
[0] << 24;
103 static inline uint64_t get_unaligned_be64(const uint8_t *p
)
105 return (uint64_t)get_unaligned_be32(p
) << 32 |
106 get_unaligned_be32(p
+ 4);
109 static inline uint16_t get_unaligned_le16(const uint8_t *p
)
111 return p
[0] | p
[1] << 8;
114 static inline uint32_t get_unaligned_le32(const uint8_t *p
)
116 return p
[0] | p
[1] << 8 | p
[2] << 16 | p
[3] << 24;
119 static inline uint64_t get_unaligned_le64(const uint8_t *p
)
121 return (uint64_t)get_unaligned_le32(p
+ 4) << 32 |
122 get_unaligned_le32(p
);
126 int rtnl_call(struct nl_msg
*msg
);
128 uint64_t unet_gettime(void);
130 int sendto_rawudp(int fd
, const void *addr
, void *ip_hdr
, size_t ip_hdrlen
,
131 const void *data
, size_t len
);