Skip to content

Commit 081e7aa

Browse files
committed
[Driver/C] Use aeron_interface_parse_and_resolve to resolve aeron.driver.resolver.interface parameter, i.e. skip the aeron_find_interface checks. This aligns the implementation with the DriverNameResolver in Java. Fix filtering out of self entries, i.e. use full name matching instead of a prefix match.
It is now possible to use any address in the localhost range `127.x.x.x` as resolver interface. Previously only `127.0.0.1` would work, because this address has an explicit interface (e.g. `lo`) and thus would pass `aeron_find_interface` checks. (cherry picked from commit b045d84)
1 parent 1827a29 commit 081e7aa

3 files changed

Lines changed: 82 additions & 11 deletions

File tree

aeron-driver/src/main/c/aeron_driver_conductor.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1002,7 +1002,7 @@ int aeron_driver_conductor_init(aeron_driver_conductor_t *conductor, aeron_drive
10021002
context->name_resolver_init_args,
10031003
context) < 0)
10041004
{
1005-
AERON_APPEND_ERR("%s", "Failed to init name resolver");
1005+
AERON_APPEND_ERR("%s", "failed to init name resolver");
10061006
aeron_free(time_tracking_name_resolver);
10071007
goto error;
10081008
}

aeron-driver/src/main/c/aeron_driver_name_resolver.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ typedef struct aeron_driver_name_resolver_stct
7474
size_t bootstrap_neighbors_length;
7575
char **bootstrap_neighbors;
7676
struct sockaddr_storage bootstrap_neighbor_addr;
77-
unsigned int interface_index;
7877
aeron_udp_channel_transport_bindings_t *transport_bindings;
7978
aeron_name_resolver_t bootstrap_resolver;
8079
aeron_udp_channel_data_paths_t data_paths;
@@ -208,15 +207,17 @@ int aeron_driver_name_resolver_init(
208207
_driver_resolver->name = name;
209208
_driver_resolver->name_length = strlen(name);
210209

211-
if (aeron_find_unicast_interface(
212-
AF_INET, interface_name, &_driver_resolver->local_socket_addr, &_driver_resolver->interface_index) < 0)
210+
size_t prefixlen = 0;
211+
if (aeron_interface_parse_and_resolve(interface_name, &_driver_resolver->local_socket_addr, &prefixlen) < 0)
213212
{
213+
AERON_APPEND_ERR("failed to parse interface: %s", interface_name);
214214
goto error_cleanup;
215215
}
216216

217217
if (aeron_driver_name_resolver_from_sockaddr(
218218
&_driver_resolver->local_socket_addr, &_driver_resolver->local_cache_addr) < 0)
219219
{
220+
AERON_APPEND_ERR("%s", "");
220221
goto error_cleanup;
221222
}
222223

@@ -226,6 +227,7 @@ int aeron_driver_name_resolver_init(
226227
aeron_default_name_resolver_supplier;
227228
if (bootstrap_resolver_supplier_func(&_driver_resolver->bootstrap_resolver, NULL, context) < 0)
228229
{
230+
AERON_APPEND_ERR("%s", "");
229231
goto error_cleanup;
230232
}
231233

@@ -239,7 +241,7 @@ int aeron_driver_name_resolver_init(
239241
_driver_resolver->saved_bootstrap_neighbor = strdup(bootstrap_neighbor);
240242
if (NULL == _driver_resolver->saved_bootstrap_neighbor)
241243
{
242-
AERON_SET_ERR(EINVAL, "Failed to duplicate bootstrap neighbors string: %s", bootstrap_neighbor);
244+
AERON_SET_ERR(EINVAL, "failed to duplicate bootstrap neighbors string: %s", bootstrap_neighbor);
243245
goto error_cleanup;
244246
}
245247
char *bootstrap_neighbors[AERON_NAME_RESOLVER_DRIVER_MAX_BOOTSTRAP_NEIGHBORS];
@@ -252,15 +254,15 @@ int aeron_driver_name_resolver_init(
252254

253255
if (num_neighbors < 0)
254256
{
255-
AERON_SET_ERR(EINVAL, "Failed to parse bootstrap neighbors list: %s", bootstrap_neighbor);
257+
AERON_SET_ERR(EINVAL, "failed to parse bootstrap neighbors list: %s", bootstrap_neighbor);
256258
goto error_cleanup;
257259
}
258260

259261
if (aeron_alloc(
260262
(void **)&_driver_resolver->bootstrap_neighbors,
261263
(strlen(bootstrap_neighbor) + num_neighbors) * sizeof(char)) < 0)
262264
{
263-
AERON_APPEND_ERR("%s", "Allocating bootstrap neighbors array");
265+
AERON_APPEND_ERR("%s", "failed to allocate bootstrap neighbors array");
264266
goto error_cleanup;
265267
}
266268

@@ -272,6 +274,7 @@ int aeron_driver_name_resolver_init(
272274

273275
if (aeron_driver_name_resolver_resolve_bootstrap_neighbor(_driver_resolver) < 0)
274276
{
277+
AERON_APPEND_ERR("failed to bootstrap neighbor from: %s", bootstrap_neighbor);
275278
goto error_cleanup;
276279
}
277280
}
@@ -286,15 +289,15 @@ int aeron_driver_name_resolver_init(
286289
context,
287290
AERON_UDP_CHANNEL_TRANSPORT_AFFINITY_CONDUCTOR) < 0)
288291
{
292+
AERON_APPEND_ERR("%s", "");
289293
goto error_cleanup;
290294
}
291295

292-
293296
aeron_udp_channel_transport_params_t transport_params = {
294297
context->socket_rcvbuf,
295298
context->socket_sndbuf,
296299
context->mtu_length,
297-
_driver_resolver->interface_index,
300+
0,
298301
0,
299302
false,
300303
};
@@ -321,12 +324,14 @@ int aeron_driver_name_resolver_init(
321324
if (_driver_resolver->transport_bindings->poller_init_func(
322325
&_driver_resolver->poller, context, AERON_UDP_CHANNEL_TRANSPORT_AFFINITY_CONDUCTOR) < 0)
323326
{
327+
AERON_APPEND_ERR("%s", "");
324328
goto error_cleanup;
325329
}
326330

327331
if (_driver_resolver->transport_bindings->poller_add_func(
328332
&_driver_resolver->poller, &_driver_resolver->transport) < 0)
329333
{
334+
AERON_APPEND_ERR("%s", "");
330335
goto error_cleanup;
331336
}
332337

@@ -350,6 +355,7 @@ int aeron_driver_name_resolver_init(
350355
neighbor_counter_label, strlen(neighbor_counter_label));
351356
if (_driver_resolver->neighbor_counter.counter_id < 0)
352357
{
358+
AERON_APPEND_ERR("%s", "");
353359
goto error_cleanup;
354360
}
355361

@@ -365,6 +371,7 @@ int aeron_driver_name_resolver_init(
365371
cache_entries_label, strlen(cache_entries_label));
366372
if (_driver_resolver->cache_size_counter.counter_id < 0)
367373
{
374+
AERON_APPEND_ERR("%s", "");
368375
goto error_cleanup;
369376
}
370377
_driver_resolver->counters_manager = context->counters_manager;
@@ -536,9 +543,9 @@ static int aeron_driver_name_resolver_on_resolution_entry(
536543
bool is_self,
537544
int64_t now_ms)
538545
{
539-
// Ignore own records that match me...
546+
// ignore self record
540547
if (cache_addr->port == aeron_driver_name_resolver_get_port(resolver) &&
541-
name_length && resolver->name_length &&
548+
name_length == resolver->name_length &&
542549
0 == strncmp(resolver->name, name, name_length))
543550
{
544551
return 0;

aeron-driver/src/test/c/aeron_driver_uri_test.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,45 @@ TEST_F(UriResolverTest, shouldResolveIpv4Interface)
592592
EXPECT_EQ(m_addr.ss_family, AF_INET);
593593
EXPECT_EQ(addr_in->sin_family, AF_INET);
594594
EXPECT_STREQ(inet_ntop(AF_INET, &addr_in->sin_addr, buffer, sizeof(buffer)), "0.0.0.0");
595+
596+
ASSERT_EQ(aeron_interface_parse_and_resolve("127.0.0.1", &m_addr, &m_prefixlen), 0) << aeron_errmsg();
597+
EXPECT_EQ(m_prefixlen, 32u);
598+
EXPECT_EQ(m_addr.ss_family, AF_INET);
599+
EXPECT_EQ(addr_in->sin_family, AF_INET);
600+
EXPECT_STREQ(inet_ntop(AF_INET, &addr_in->sin_addr, buffer, sizeof(buffer)), "127.0.0.1");
601+
602+
ASSERT_EQ(aeron_interface_parse_and_resolve("127.0.0.3/8", &m_addr, &m_prefixlen), 0) << aeron_errmsg();
603+
EXPECT_EQ(m_prefixlen, 8u);
604+
EXPECT_EQ(m_addr.ss_family, AF_INET);
605+
EXPECT_EQ(addr_in->sin_family, AF_INET);
606+
EXPECT_STREQ(inet_ntop(AF_INET, &addr_in->sin_addr, buffer, sizeof(buffer)), "127.0.0.3");
607+
}
608+
609+
TEST_F(UriResolverTest, shouldResolveHostNameInTheInterfaceSpecification)
610+
{
611+
char buffer[AERON_URI_MAX_LENGTH];
612+
613+
ASSERT_EQ(aeron_interface_parse_and_resolve("localhost:5551", &m_addr, &m_prefixlen), 0) << aeron_errmsg();
614+
EXPECT_EQ(m_prefixlen, 32u);
615+
EXPECT_EQ(m_addr.ss_family, AF_INET);
616+
EXPECT_EQ(addr_in->sin_family, AF_INET);
617+
EXPECT_EQ(addr_in->sin_port, htons(5551));
618+
EXPECT_STREQ(inet_ntop(AF_INET, &addr_in->sin_addr, buffer, sizeof(buffer)), "127.0.0.1");
619+
620+
ASSERT_EQ(aeron_interface_parse_and_resolve("localhost:0/24", &m_addr, &m_prefixlen), 0) << aeron_errmsg();
621+
EXPECT_EQ(m_prefixlen, 24u);
622+
EXPECT_EQ(m_addr.ss_family, AF_INET);
623+
EXPECT_EQ(addr_in->sin_family, AF_INET);
624+
EXPECT_EQ(addr_in->sin_port, htons(0));
625+
EXPECT_STREQ(inet_ntop(AF_INET, &addr_in->sin_addr, buffer, sizeof(buffer)), "127.0.0.1");
626+
627+
EXPECT_EQ(0, gethostname(buffer, sizeof(buffer)));
628+
std::string host_name = std::string(buffer).append(":8989/16");
629+
ASSERT_EQ(aeron_interface_parse_and_resolve(host_name.c_str(), &m_addr, &m_prefixlen), 0) << aeron_errmsg();
630+
EXPECT_EQ(m_prefixlen, 16u);
631+
EXPECT_EQ(m_addr.ss_family, AF_INET);
632+
EXPECT_EQ(addr_in->sin_family, AF_INET);
633+
EXPECT_EQ(addr_in->sin_port, htons(8989));
595634
}
596635

597636
TEST_F(UriResolverTest, shouldResolveIpv6Interface)
@@ -614,13 +653,38 @@ TEST_F(UriResolverTest, shouldResolveIpv6Interface)
614653
ASSERT_EQ(aeron_interface_parse_and_resolve("[::1]:1234/48", &m_addr, &m_prefixlen), 0) << aeron_errmsg();
615654
EXPECT_EQ(m_prefixlen, 48u);
616655
EXPECT_EQ(addr_in6->sin6_port, htons(1234));
656+
657+
ASSERT_EQ(aeron_interface_parse_and_resolve("[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:1111", &m_addr, &m_prefixlen), 0) << aeron_errmsg();
658+
EXPECT_EQ(m_prefixlen, 128u);
659+
EXPECT_EQ(addr_in6->sin6_port, htons(1111));
660+
EXPECT_STREQ(inet_ntop(AF_INET6, &addr_in6->sin6_addr, buffer, sizeof(buffer)), "2001:db8:85a3::8a2e:370:7334");
661+
662+
ASSERT_EQ(aeron_interface_parse_and_resolve("[fe80:3::1ff:fe23:4567:890a]/24", &m_addr, &m_prefixlen), 0) << aeron_errmsg();
663+
EXPECT_EQ(m_prefixlen, 24u);
664+
EXPECT_EQ(addr_in6->sin6_port, htons(0));
665+
EXPECT_STREQ(inet_ntop(AF_INET6, &addr_in6->sin6_addr, buffer, sizeof(buffer)), "fe80:3::1ff:fe23:4567:890a");
666+
667+
ASSERT_EQ(aeron_interface_parse_and_resolve("[64:ff9b::]/96", &m_addr, &m_prefixlen), 0) << aeron_errmsg();
668+
EXPECT_EQ(m_prefixlen, 96u);
669+
EXPECT_EQ(addr_in6->sin6_port, htons(0));
670+
EXPECT_STREQ(inet_ntop(AF_INET6, &addr_in6->sin6_addr, buffer, sizeof(buffer)), "64:ff9b::");
671+
672+
ASSERT_EQ(aeron_interface_parse_and_resolve("[ff01::1]:22222", &m_addr, &m_prefixlen), 0) << aeron_errmsg();
673+
EXPECT_EQ(m_prefixlen, 128u);
674+
EXPECT_EQ(addr_in6->sin6_port, htons(22222));
675+
EXPECT_STREQ(inet_ntop(AF_INET6, &addr_in6->sin6_addr, buffer, sizeof(buffer)), "ff01::1");
676+
EXPECT_TRUE(aeron_is_addr_multicast(&m_addr));
617677
}
618678

619679
TEST_F(UriResolverTest, shouldMatchIpv4)
620680
{
621681
EXPECT_TRUE(ipv4_match("127.0.0.0", "127.0.0.0", 24));
622682
EXPECT_TRUE(ipv4_match("127.0.0.0", "127.0.0.1", 24));
623683
EXPECT_TRUE(ipv4_match("127.0.0.0", "127.0.0.255", 24));
684+
EXPECT_TRUE(ipv4_match("127.1.1.1", "127.0.0.0", 8));
685+
EXPECT_TRUE(ipv4_match("127.255.1.1", "127.255.255.255", 16));
686+
EXPECT_TRUE(ipv4_match("127.255.254.1", "127.255.254.255", 24));
687+
EXPECT_TRUE(ipv4_match("127.255.254.16", "127.255.254.16", 32));
624688
}
625689

626690
TEST_F(UriResolverTest, shouldNotMatchIpv4)

0 commit comments

Comments
 (0)