8#include <cgreen/cgreen.h>
9#include <cgreen/mocks.h>
10#include <gvm/base/hosts.h>
15 cgreen_mocks_are (loose_mocks);
33bool g_socket_use_real =
true;
44 if (g_socket_use_real)
45 return __real_socket (domain, type,
protocol);
47 return (
int) mock (domain, type,
protocol);
65 return __real_setsockopt (sockfd, level, optname, optval, optlen);
67 return (
int) mock (sockfd, level, optname, optval, optlen);
71Ensure (pcap, routethrough_dst_is_localhost)
74 g_socket_use_real =
false;
75 gchar *
interface = NULL;
76 gchar *ipv4_str =
"127.0.0.1";
77 gvm_host_t *gvm_host = NULL;
79 struct in6_addr *dst6_p = &dst6;
81 struct in_addr *dst4_p = &dst4;
82 assert_that ((gvm_host = gvm_host_from_str (ipv4_str)), is_not_null);
83 assert_that (gvm_host_get_addr6 ((gvm_host_t *) gvm_host, dst6_p),
85 assert_that (dst6_p, is_not_null);
86 dst4.s_addr = dst6_p->s6_addr32[3];
94 g_socket_use_real =
true;
99Ensure (pcap, routethrough_dst_is_not_localhost)
101 g_socket_use_real =
false;
103 gchar *
interface = NULL;
104 gchar *ipv4_str =
"93.184.216.34";
105 gvm_host_t *gvm_host = NULL;
106 struct in6_addr dst6;
107 struct in6_addr *dst6_p = &dst6;
109 struct in_addr *dst4_p = &dst4;
110 assert_that ((gvm_host = gvm_host_from_str (ipv4_str)), is_not_null);
111 assert_that (gvm_host_get_addr6 ((gvm_host_t *) gvm_host, dst6_p),
113 assert_that (dst6_p, is_not_null);
114 dst4.s_addr = dst6_p->s6_addr32[3];
117 assert_that (interface, is_not_equal_to_string (
"lo"));
118 g_socket_use_real =
true;
122Ensure (pcap, routethrough_no_src_dst_given)
124 gchar *
interface = NULL;
125 assert_that ((interface =
routethrough (NULL, NULL)), is_null);
129Ensure (pcap, routethrough_src_globalsource_set)
132 g_socket_use_real =
false;
133 cgreen_mocks_are (learning_mocks);
135 struct in_addr src = {.s_addr = 0};
136 gchar *
interface = NULL;
138 inet_pton (AF_INET,
"93.184.216.34", &(dst.s_addr));
141 gvm_source_iface_init (
"lo");
143 assert_that ((interface =
routethrough (NULL, &src)), is_null);
144 assert_that ((src.s_addr == INADDR_ANY));
151 assert_that (interface, is_not_equal_to_string (
"lo"));
152 assert_that ((src.s_addr != INADDR_ANY));
153 g_socket_use_real =
true;
157Ensure (pcap, routethrough_src_globalsource_not_set)
159 g_socket_use_real =
false;
161 struct in_addr src = {.s_addr = 0};
162 gchar *
interface = NULL;
164 inet_pton (AF_INET,
"127.0.0.1", &(dst.s_addr));
167 gvm_source_iface_init (NULL);
169 assert_that ((interface =
routethrough (NULL, &src)), is_null);
170 assert_that ((src.s_addr == INADDR_ANY));
178 assert_that ((src.s_addr != INADDR_ANY));
179 g_socket_use_real =
true;
186 struct sockaddr_in sin;
187 memset (&sin, 0,
sizeof (
struct sockaddr_in));
188 sin.sin_family = AF_INET;
191 inet_pton (AF_INET,
"93.184.216.34", &(addr.s_addr));
194 struct in6_addr addr_6;
196 inet_pton (AF_INET6,
"::FFFF:127.0.0.1", &(addr_6));
198 inet_pton (AF_INET6,
"::FFFF:0.0.0.0", &(addr_6));
200 inet_pton (AF_INET6,
"::FFFF:127.100.5.99", &(addr_6));
203 inet_pton (AF_INET6,
"0:0:0:0:0:0:0:1", &(addr_6));
211 inet_pton (AF_INET6,
"2606:2800:220:1:248:1893:25c8:1946", &(addr_6));
220 inet_pton (AF_INET,
"127.0.0.1", &(addr.s_addr));
222 inet_pton (AF_INET,
"0.0.0.0", &(addr.s_addr));
224 inet_pton (AF_INET,
"127.100.5.99", &(addr.s_addr));
232 inet_pton (AF_INET,
"93.184.216.34", &(addr.s_addr));
245 struct in6_addr *mask)
247 for (
int i = 0; i < (int)
sizeof (
struct in6_addr); i++)
248 network->s6_addr[i] = dest->s6_addr[i] & mask->s6_addr[i];
253 struct in6_addr dest;
254 struct in6_addr result;
255 struct in6_addr mask;
256 struct in6_addr network;
257 const uint8_t byte_options[9] = {0xFF, 0x00, 0x80, 0xC0, 0xE0,
258 0xF0, 0xF8, 0xFC, 0xFE};
261 const uint8_t addr_in[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
262 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
263 memcpy (dest.s6_addr, addr_in,
sizeof addr_in);
265 const uint8_t result_in[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
266 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
267 0xFF, 0xFF, 0xFF, 0xFF};
268 memcpy (result.s6_addr, result_in,
sizeof result_in);
271 for (
int i = 128; i > 0; i--)
275 int byte_to_modify = i / 8;
276 if (byte_to_modify != 16)
277 result.s6_addr[byte_to_modify] = byte_options[(i % 8) + 1];
279 assert_that (IN6_ARE_ADDR_EQUAL (&network, &result));
286 TestSuite *suite = create_test_suite ();
287 add_test_with_context (suite, pcap, routethrough_dst_is_localhost);
288 add_test_with_context (suite, pcap, routethrough_dst_is_not_localhost);
289 add_test_with_context (suite, pcap, routethrough_no_src_dst_given);
290 add_test_with_context (suite, pcap, routethrough_src_globalsource_set);
291 add_test_with_context (suite, pcap, routethrough_src_globalsource_not_set);
304 suite = create_test_suite ();
308 return run_single_test (suite, argv[1], create_text_reporter ());
310 return run_test_suite (suite, create_text_reporter ());
struct pseudo_udp_hdr __attribute__
int islocalhost(struct in_addr *addr)
Tests whether a packet sent to IP is LIKELY to route through the kernel localhost interface.
char * routethrough(struct in_addr *dest, struct in_addr *source)
An awesome function to determine what interface a packet to a given destination should be routed thro...
int v6_islocalhost(struct in6_addr *addr)
Tests whether a packet sent to IP is LIKELY to route through the kernel localhost interface.
static int ipv6_prefix_to_mask(unsigned prefix, struct in6_addr *mask)
Generate an ipv6 mask from the given ipv6 prefix.
int __wrap_setsockopt(__attribute__((unused)) int sockfd, __attribute__((unused)) int level, __attribute__((unused)) int optname, __attribute__((unused)) const void *optval, __attribute__((unused)) socklen_t optlen)
Ensure(pcap, routethrough_dst_is_localhost)
int main(int argc, char **argv)
bool g_setsockopt_use_real
static void apply_ipv6_mask(struct in6_addr *network, struct in6_addr *dest, struct in6_addr *mask)
Apply mask to dest addr.
static TestSuite * openvas_routethrough()