From 36aeef6edae1d4f8697a0608a0404a78427bf7be Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Mon, 29 Mar 2010 09:40:46 +0000 Subject: Added code to test gnunet's dns resolver service. The test code compares gnunet's results to the system's own forward and reverse name resolution. Using dns root server as a targets to get a static 1:1 mapping --- src/util/test_resolver_api.c | 169 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) (limited to 'src/util/test_resolver_api.c') diff --git a/src/util/test_resolver_api.c b/src/util/test_resolver_api.c index 194ed2f8f..b8a0eb29a 100644 --- a/src/util/test_resolver_api.c +++ b/src/util/test_resolver_api.c @@ -32,6 +32,11 @@ #define VERBOSE GNUNET_NO +// Using dns rootservers to check gnunet's resolver service +// a.root-servers.net <-> 198.41.0.4 is a fix 1:1 mapping that should not change over years +// For more information have a look at IANA's website http://www.root-servers.org/ +#define ROOTSERVER_NAME "a.root-servers.net" +#define ROOTSERVER_IP "198.41.0.4" static void check_hostname (void *cls, const struct sockaddr *sa, socklen_t salen) @@ -122,6 +127,57 @@ check_127 (void *cls, const struct sockaddr *sa, socklen_t salen) } } +static void +check_rootserver_ip (void *cls, const struct sockaddr *sa, socklen_t salen) +{ + int *ok = cls; + const struct sockaddr_in *sai = (const struct sockaddr_in *) sa; + + if (sa == NULL) + return; + GNUNET_assert (sizeof (struct sockaddr_in) == salen); + + if ( 0 == strcmp(inet_ntoa(sai->sin_addr),ROOTSERVER_IP)) + { +#if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received correct rootserver ip address.\n"); +#endif + (*ok) &= ~1; + } + else + { +#if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received incorrect rootserver ip address.\n"); +#endif + GNUNET_break (0); + } +} + +static void +check_rootserver_name (void *cls, const char *hostname) +{ + int *ok = cls; + if (hostname == NULL) + return; + + if (0 == strcmp (hostname, ROOTSERVER_NAME)) + { +#if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Received correct rootserver hostname `%s'.\n", hostname); +#endif + (*ok) &= ~2; + } + else + { +#if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Received invalid rootserver hostname `%s'.\n", hostname); +#endif + GNUNET_break (0); + } +} + static void run (void *cls, struct GNUNET_SCHEDULER_Handle *sched, @@ -152,6 +208,119 @@ run (void *cls, GNUNET_RESOLVER_hostname_resolve (sched, cfg, AF_UNSPEC, timeout, &check_hostname, cls); + // Testing non-local dns resolution + // DNS Rootserver to test: a.root-servers.net - 198.41.0.4 + + char const * rootserver_name = ROOTSERVER_NAME; + + struct hostent *rootserver; + + rootserver = gethostbyname(rootserver_name); + if (rootserver == NULL) + { + // Error: resolving ip addresses does not work + #if DEBUG_RESOLVER + switch (h_errno) + { + + case HOST_NOT_FOUND: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "gethostbyname() could not lookup ip address: HOST_NOT_FOUND\n");break; + case NO_ADDRESS: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "gethostbyname() could not lookup ip address: NO_ADDRESS\n");break; + case NO_RECOVERY: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "gethostbyname() could not lookup ip address: NO_RECOVERY\n");break; + case TRY_AGAIN: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "gethostbyname() could not lookup ip address: TRY_AGAIN\n");break; + } + #endif + GNUNET_break (0); + } + else + { + // Counting returned ip addresses + int count_ips =0 ; + while (rootserver->h_addr_list[count_ips]!=NULL) + { + count_ips++; + } + if ( count_ips > 1) + { + #if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received ip range for root name server, but a root nameserver has only 1 ip\n"); + #endif + GNUNET_break (0); + } + + // Comparing to resolved address to the address the root nameserver should have + if ( strcmp(inet_ntoa( *(struct in_addr *) rootserver->h_addr_list[0]),ROOTSERVER_IP) !=0) + { + #if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received ip and ip for root name server differ\n"); + #endif + GNUNET_break (0); + } + + #if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "System's own forward name resolution is working\n"); + #endif + + // Resolve the same using GNUNET + GNUNET_RESOLVER_ip_get (sched, cfg, ROOTSERVER_NAME, AF_INET, timeout, &check_rootserver_ip, cls); + + // Success: forward lookups work as exptected + + + // Next step: reverse lookups + + struct in_addr rootserver_addr; + rootserver->h_name=""; + if ( 1 != inet_pton(AF_INET, ROOTSERVER_IP, &rootserver_addr)) + { + #if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Could not transform root nameserver ip addressr\n"); + #endif + GNUNET_break (0); + } + + rootserver = gethostbyaddr(&rootserver_addr, sizeof(rootserver_addr), AF_INET); + if (rootserver == NULL) + { + // Error: resolving ip addresses does not work + #if DEBUG_RESOLVER + switch (h_errno) + { + + case HOST_NOT_FOUND: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "gethostbyaddr() could not lookup ip address: HOST_NOT_FOUND\n");break; + case NO_ADDRESS: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "gethostbyaddr() could not lookup ip address: NO_ADDRESS\n");break; + case NO_RECOVERY: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "gethostbyaddr() could not lookup ip address: NO_RECOVERY\n");break; + case TRY_AGAIN: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "gethostbyaddr() could not lookup ip address: TRY_AGAIN\n");break; + } + #endif + GNUNET_break (0); + } + + if ( 0 != strcmp( rootserver->h_name,ROOTSERVER_NAME)) + { + #if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received hostname and hostname for root name server differ\n"); + #endif + GNUNET_break (0); + } + + #if DEBUG_RESOLVER + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "System's own reverse name resolution is working\n"); + #endif + // Resolve the same using GNUNET + + memset (&sa, 0, sizeof (sa)); + sa.sin_family = AF_INET; + inet_aton(ROOTSERVER_IP, &sa.sin_addr.s_addr); + + GNUNET_RESOLVER_hostname_get (sched, + cfg, + (const struct sockaddr *) &sa, + sizeof (struct sockaddr), + GNUNET_YES, + timeout, &check_rootserver_name, cls); + + // Success: reverse lookups work as exptected + } } static int -- cgit v1.2.3