Moved host_t and host_resolver_t to a new networking subfolder
authorTobias Brunner <tobias@strongswan.org>
Tue, 16 Oct 2012 12:29:18 +0000 (14:29 +0200)
committerTobias Brunner <tobias@strongswan.org>
Wed, 24 Oct 2012 13:06:18 +0000 (15:06 +0200)
52 files changed:
scripts/tls_test.c
src/charon-nm/nm/nm_service.c
src/dumm/iface.h
src/frontends/android/jni/libandroidbridge/kernel/network_manager.h
src/frontends/android/jni/libandroidbridge/vpnservice_builder.h
src/libcharon/config/backend_manager.h
src/libcharon/config/ike_cfg.h
src/libcharon/config/proposal.h
src/libcharon/encoding/payloads/traffic_selector_substructure.h
src/libcharon/network/receiver.h
src/libcharon/plugins/android/android_handler.c
src/libcharon/plugins/dhcp/dhcp_transaction.h
src/libcharon/plugins/farp/farp_listener.h
src/libcharon/plugins/ha/ha_message.h
src/libcharon/plugins/ha/ha_socket.c
src/libcharon/plugins/tnc_ifmap/tnc_ifmap_soap.h
src/libcharon/processing/jobs/migrate_job.h
src/libcharon/processing/jobs/update_sa_job.h
src/libhydra/attributes/attribute_provider.h
src/libhydra/attributes/mem_pool.h
src/libhydra/kernel/kernel_interface.h
src/libhydra/kernel/kernel_ipsec.h
src/libhydra/kernel/kernel_listener.h
src/libhydra/kernel/kernel_net.h
src/libhydra/plugins/attr_sql/pool.c
src/libhydra/plugins/attr_sql/pool_attributes.c
src/libhydra/plugins/kernel_pfkey/kernel_pfkey_ipsec.c
src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c
src/libipsec/esp_packet.h
src/libipsec/ip_packet.h
src/libipsec/ipsec_policy.h
src/libipsec/ipsec_policy_mgr.h
src/libipsec/ipsec_sa.h
src/libipsec/ipsec_sa_mgr.h
src/libradius/radius_client.c
src/libradius/radius_socket.h
src/libstrongswan/Android.mk
src/libstrongswan/Makefile.am
src/libstrongswan/host_resolver.c [deleted file]
src/libstrongswan/host_resolver.h [deleted file]
src/libstrongswan/library.c
src/libstrongswan/library.h
src/libstrongswan/networking/host.c [new file with mode: 0644]
src/libstrongswan/networking/host.h [new file with mode: 0644]
src/libstrongswan/networking/host_resolver.c [new file with mode: 0644]
src/libstrongswan/networking/host_resolver.h [new file with mode: 0644]
src/libstrongswan/selectors/traffic_selector.h
src/libstrongswan/utils/host.c [deleted file]
src/libstrongswan/utils/host.h [deleted file]
src/libstrongswan/utils/packet.h
src/libstrongswan/utils/tun_device.h
src/manager/gateway.h

index 560c4a4..3bdb345 100644 (file)
@@ -24,7 +24,7 @@
 #include <library.h>
 #include <debug.h>
 #include <tls_socket.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <credentials/sets/mem_cred.h>
 
 /**
index 1eeacca..6fa5e51 100644 (file)
@@ -18,7 +18,7 @@
 #include "nm_service.h"
 
 #include <daemon.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/identification.h>
 #include <config/peer_cfg.h>
 #include <credentials/certificates/x509.h>
index e96ee50..c43113a 100644 (file)
@@ -18,7 +18,7 @@
 
 #include <library.h>
 #include <utils/enumerator.h>
-#include <utils/host.h>
+#include <networking/host.h>
 
 #define TAP_DEVICE "/dev/net/tun"
 
index 6348164..a35103b 100644 (file)
@@ -24,7 +24,7 @@
 #include <jni.h>
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 
 typedef struct network_manager_t network_manager_t;
 
index 82efd05..2090908 100644 (file)
@@ -26,7 +26,7 @@
 #include <jni.h>
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 
 typedef struct vpnservice_builder_t vpnservice_builder_t;
 
index 463a57b..cc8ef87 100644 (file)
@@ -24,7 +24,7 @@
 typedef struct backend_manager_t backend_manager_t;
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/identification.h>
 #include <config/ike_cfg.h>
 #include <config/peer_cfg.h>
index 5f48e96..dc58329 100644 (file)
@@ -26,7 +26,7 @@ typedef enum ike_version_t ike_version_t;
 typedef struct ike_cfg_t ike_cfg_t;
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/linked_list.h>
 #include <utils/identification.h>
 #include <config/proposal.h>
index 33abf00..ff6267d 100644 (file)
@@ -28,7 +28,7 @@ typedef struct proposal_t proposal_t;
 #include <library.h>
 #include <utils/identification.h>
 #include <utils/linked_list.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <crypto/transform.h>
 #include <crypto/crypters/crypter.h>
 #include <crypto/signers/signer.h>
index 1ad5fb5..d3fbe84 100644 (file)
@@ -25,7 +25,7 @@
 typedef struct traffic_selector_substructure_t traffic_selector_substructure_t;
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <selectors/traffic_selector.h>
 #include <encoding/payloads/payload.h>
 
index 9e8edee..8215361 100644 (file)
@@ -26,7 +26,7 @@
 typedef struct receiver_t receiver_t;
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/packet.h>
 
 /**
index c5f51ef..c5e98d3 100644 (file)
@@ -16,7 +16,7 @@
 
 #include "android_handler.h"
 
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/linked_list.h>
 
 #include <cutils/properties.h>
index 19c163f..35f08e8 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef DHCP_TRANSACTION_H_
 #define DHCP_TRANSACTION_H_
 
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/identification.h>
 #include <attributes/attributes.h>
 
index 3155f60..c7dc56a 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef FARP_LISTENER_H_
 #define FARP_LISTENER_H_
 
-#include <utils/host.h>
+#include <networking/host.h>
 #include <bus/listeners/listener.h>
 
 typedef struct farp_listener_t farp_listener_t;
index 8cd30f7..2ccb1fc 100644 (file)
@@ -22,7 +22,7 @@
 #define HA_MESSAGE_H_
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/identification.h>
 #include <sa/ike_sa_id.h>
 #include <selectors/traffic_selector.h>
index 5196a5d..e41e78b 100644 (file)
@@ -22,7 +22,7 @@
 #include <unistd.h>
 
 #include <daemon.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <threading/thread.h>
 #include <processing/jobs/callback_job.h>
 
index 4bf421e..4efdc77 100644 (file)
 
 /**
  * @defgroup tnc_ifmap_soap tnc_ifmap_soap
- * @{ @ingroup tnc_ifmap 
+ * @{ @ingroup tnc_ifmap
  */
 
 #ifndef TNC_IFMAP_SOAP_H_
 #define TNC_IFMAP_SOAP_H_
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <sa/ike_sa.h>
 
 typedef struct tnc_ifmap_soap_t tnc_ifmap_soap_t;
@@ -47,7 +47,7 @@ struct tnc_ifmap_soap_t {
        bool (*purgePublisher)(tnc_ifmap_soap_t *this);
 
        /**
-        * Publish metadata about established/deleted IKE_SAs 
+        * Publish metadata about established/deleted IKE_SAs
         *
         * @param ike_sa                IKE_SA for which metadate is published
         * @param up                    TRUE if IKE_SEA is up, FALSE if down
@@ -56,7 +56,7 @@ struct tnc_ifmap_soap_t {
        bool (*publish_ike_sa)(tnc_ifmap_soap_t *this, ike_sa_t *ike_sa, bool up);
 
        /**
-        * Publish PEP device-ip metadata 
+        * Publish PEP device-ip metadata
         *
         * @param host                  IP address of local endpoint
         * @return                              TRUE if command was successful
index 09679c7..30c0ad0 100644 (file)
@@ -24,7 +24,7 @@
 typedef struct migrate_job_t migrate_job_t;
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <selectors/traffic_selector.h>
 #include <kernel/kernel_ipsec.h>
 #include <processing/jobs/job.h>
index e2344fc..55a3df8 100644 (file)
@@ -24,7 +24,7 @@
 typedef struct update_sa_job_t update_sa_job_t;
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <processing/jobs/job.h>
 
 /**
index e5e556f..82d0ee3 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef ATTRIBUTE_PROVIDER_H_
 #define ATTRIBUTE_PROVIDER_H_
 
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/identification.h>
 #include <utils/linked_list.h>
 
index fa4e648..692885e 100644 (file)
@@ -24,7 +24,7 @@
 typedef struct mem_pool_t mem_pool_t;
 typedef enum mem_pool_op_t mem_pool_op_t;
 
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/identification.h>
 
 /**
index 88d4a5b..7058466 100644 (file)
@@ -48,7 +48,7 @@
 
 typedef struct kernel_interface_t kernel_interface_t;
 
-#include <utils/host.h>
+#include <networking/host.h>
 #include <crypto/prf_plus.h>
 
 #include <kernel/kernel_listener.h>
index ee0ade2..1da0805 100644 (file)
@@ -26,7 +26,7 @@
 
 typedef struct kernel_ipsec_t kernel_ipsec_t;
 
-#include <utils/host.h>
+#include <networking/host.h>
 #include <ipsec/ipsec_types.h>
 #include <selectors/traffic_selector.h>
 #include <plugins/plugin.h>
index 5db297b..27ea947 100644 (file)
@@ -25,7 +25,7 @@ typedef struct kernel_listener_t kernel_listener_t;
 
 #include <kernel/kernel_ipsec.h>
 #include <selectors/traffic_selector.h>
-#include <utils/host.h>
+#include <networking/host.h>
 
 /**
  * Interface for components interested in kernel events.
index 10350d6..0de93ea 100644 (file)
@@ -26,7 +26,7 @@ typedef struct kernel_net_t kernel_net_t;
 typedef enum kernel_address_type_t kernel_address_type_t;
 
 #include <utils/enumerator.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <plugins/plugin.h>
 
 /**
index a2000cf..1d5fddb 100644 (file)
@@ -23,7 +23,7 @@
 
 #include <debug.h>
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/identification.h>
 #include <attributes/attributes.h>
 
index d3fc06e..5dcfe85 100644 (file)
@@ -17,7 +17,7 @@
 #include <string.h>
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 
 #include "pool_attributes.h"
 #include "pool_usage.h"
index b099bc7..ed541ad 100644 (file)
@@ -59,7 +59,7 @@
 
 #include <hydra.h>
 #include <debug.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/linked_list.h>
 #include <utils/hashtable.h>
 #include <threading/thread.h>
index 47a8829..0ead657 100644 (file)
@@ -25,7 +25,7 @@
 
 #include <hydra.h>
 #include <debug.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <threading/thread.h>
 #include <threading/mutex.h>
 #include <threading/rwlock.h>
index a1d1602..4586379 100644 (file)
@@ -27,7 +27,7 @@
 #include "esp_context.h"
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/packet.h>
 
 typedef struct esp_packet_t esp_packet_t;
index b4fc298..722662a 100644 (file)
@@ -22,7 +22,7 @@
 #define IP_PACKET_H_
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/packet.h>
 
 typedef struct ip_packet_t ip_packet_t;
index 67ad0b0..23a9ea9 100644 (file)
@@ -26,7 +26,7 @@
 #include "ip_packet.h"
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <ipsec/ipsec_types.h>
 #include <selectors/traffic_selector.h>
 
index d3ee107..ae0a298 100644 (file)
@@ -27,7 +27,7 @@
 #include "ip_packet.h"
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/linked_list.h>
 #include <ipsec/ipsec_types.h>
 #include <selectors/traffic_selector.h>
index 271e012..dec688e 100644 (file)
@@ -26,7 +26,7 @@
 #include "esp_context.h"
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <selectors/traffic_selector.h>
 #include <ipsec/ipsec_types.h>
 
index db30a86..3ff0920 100644 (file)
@@ -28,7 +28,7 @@
 #include <library.h>
 #include <ipsec/ipsec_types.h>
 #include <selectors/traffic_selector.h>
-#include <utils/host.h>
+#include <networking/host.h>
 
 typedef struct ipsec_sa_mgr_t ipsec_sa_mgr_t;
 
index acdac78..143cfa1 100644 (file)
@@ -20,7 +20,7 @@
 #include <errno.h>
 
 #include <debug.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/linked_list.h>
 #include <threading/condvar.h>
 #include <threading/mutex.h>
index 07d642c..eb510ea 100644 (file)
@@ -25,7 +25,7 @@ typedef struct radius_socket_t radius_socket_t;
 
 #include "radius_message.h"
 
-#include <utils/host.h>
+#include <networking/host.h>
 
 /**
  * RADIUS socket to a server.
index 9c7ef1d..fb224a2 100644 (file)
@@ -3,7 +3,7 @@ include $(CLEAR_VARS)
 
 # copy-n-paste from Makefile.am
 LOCAL_SRC_FILES := \
-library.c chunk.c debug.c enum.c host_resolver.c settings.c printf_hook.c \
+library.c chunk.c debug.c enum.c settings.c printf_hook.c \
 asn1/asn1.c asn1/asn1_parser.c asn1/oid.c bio/bio_reader.c bio/bio_writer.c \
 crypto/crypters/crypter.c crypto/hashers/hasher.c crypto/pkcs7.c crypto/pkcs9.c \
 crypto/proposal/proposal_keywords.c crypto/proposal/proposal_keywords_static.c \
@@ -22,11 +22,12 @@ credentials/sets/cert_cache.c credentials/sets/mem_cred.c \
 credentials/sets/callback_cred.c credentials/auth_cfg.c database/database.c \
 database/database_factory.c fetcher/fetcher.c fetcher/fetcher_manager.c eap/eap.c \
 ipsec/ipsec_types.c \
+networking/host.c networking/host_resolver.c \
 pen/pen.c plugins/plugin_loader.c plugins/plugin_feature.c processing/jobs/job.c \
 processing/jobs/callback_job.c processing/processor.c processing/scheduler.c \
 selectors/traffic_selector.c threading/thread.c threading/thread_value.c \
 threading/mutex.c threading/semaphore.c threading/rwlock.c threading/spinlock.c \
-utils.c utils/host.c utils/packet.c utils/identification.c utils/lexparser.c \
+utils.c utils/packet.c utils/identification.c utils/lexparser.c \
 utils/linked_list.c utils/blocking_queue.c utils/hashtable.c utils/enumerator.c \
 utils/optionsfrom.c utils/capabilities.c utils/backtrace.c utils/tun_device.c
 
index 4017bfc..4b8279f 100644 (file)
@@ -1,7 +1,7 @@
 ipseclib_LTLIBRARIES = libstrongswan.la
 
 libstrongswan_la_SOURCES = \
-library.c chunk.c debug.c enum.c host_resolver.c settings.c printf_hook.c \
+library.c chunk.c debug.c enum.c settings.c printf_hook.c \
 asn1/asn1.c asn1/asn1_parser.c asn1/oid.c bio/bio_reader.c bio/bio_writer.c \
 crypto/crypters/crypter.c crypto/hashers/hasher.c crypto/pkcs7.c crypto/pkcs9.c \
 crypto/proposal/proposal_keywords.c crypto/proposal/proposal_keywords_static.c \
@@ -20,18 +20,19 @@ credentials/sets/cert_cache.c credentials/sets/mem_cred.c \
 credentials/sets/callback_cred.c credentials/auth_cfg.c database/database.c \
 database/database_factory.c fetcher/fetcher.c fetcher/fetcher_manager.c eap/eap.c \
 ipsec/ipsec_types.c \
+networking/host.c networking/host_resolver.c \
 pen/pen.c plugins/plugin_loader.c plugins/plugin_feature.c processing/jobs/job.c \
 processing/jobs/callback_job.c processing/processor.c processing/scheduler.c \
 selectors/traffic_selector.c threading/thread.c threading/thread_value.c \
 threading/mutex.c threading/semaphore.c threading/rwlock.c threading/spinlock.c \
-utils.c utils/host.c utils/packet.c utils/identification.c utils/lexparser.c \
+utils.c utils/packet.c utils/identification.c utils/lexparser.c \
 utils/linked_list.c utils/blocking_queue.c utils/hashtable.c utils/enumerator.c \
 utils/optionsfrom.c utils/capabilities.c utils/backtrace.c utils/tun_device.c
 
 if USE_DEV_HEADERS
 strongswan_includedir = ${dev_headers}
 nobase_strongswan_include_HEADERS = \
-library.h chunk.h debug.h enum.h host_resolver.h settings.h printf_hook.h \
+library.h chunk.h debug.h enum.h settings.h printf_hook.h \
 asn1/asn1.h asn1/asn1_parser.h asn1/oid.h bio/bio_reader.h bio/bio_writer.h \
 crypto/crypters/crypter.h crypto/hashers/hasher.h crypto/mac.h \
 crypto/pkcs7.h crypto/pkcs9.h crypto/proposal/proposal_keywords.h \
@@ -55,13 +56,14 @@ credentials/sets/mem_cred.h credentials/sets/callback_cred.h \
 credentials/auth_cfg.h credentials/credential_set.h credentials/cert_validator.h \
 database/database.h database/database_factory.h fetcher/fetcher.h \
 fetcher/fetcher_manager.h eap/eap.h pen/pen.h ipsec/ipsec_types.h \
+networking/host.h networking/host_resolver.h \
 plugins/plugin_loader.h plugins/plugin.h plugins/plugin_feature.h \
 processing/jobs/job.h processing/jobs/callback_job.h processing/processor.h \
 processing/scheduler.h selectors/traffic_selector.h \
 threading/thread.h threading/thread_value.h \
 threading/mutex.h threading/condvar.h threading/spinlock.h threading/semaphore.h \
 threading/rwlock.h threading/rwlock_condvar.h threading/lock_profiler.h \
-utils.h utils/host.h utils/packet.h utils/identification.h utils/lexparser.h \
+utils.h utils/packet.h utils/identification.h utils/lexparser.h \
 utils/linked_list.h utils/blocking_queue.h utils/hashtable.h utils/enumerator.h \
 utils/optionsfrom.h utils/capabilities.h utils/backtrace.h utils/tun_device.h \
 utils/leak_detective.h integrity_checker.h
diff --git a/src/libstrongswan/host_resolver.c b/src/libstrongswan/host_resolver.c
deleted file mode 100644 (file)
index 55b07d3..0000000
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Copyright (C) 2012 Tobias Brunner
- * Hochschule fuer Technik Rapperswil
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * for more details.
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netdb.h>
-
-#include "host_resolver.h"
-
-#include <debug.h>
-#include <library.h>
-#include <threading/condvar.h>
-#include <threading/mutex.h>
-#include <threading/thread.h>
-#include <utils/hashtable.h>
-#include <utils/linked_list.h>
-
-/**
- * Default minimum and maximum number of threads
- */
-#define MIN_THREADS_DEFAULT 0
-#define MAX_THREADS_DEFAULT 3
-
-/**
- * Timeout in seconds to wait for new queries until a thread may be stopped
- */
-#define NEW_QUERY_WAIT_TIMEOUT 30
-
-typedef struct private_host_resolver_t private_host_resolver_t;
-
-/**
- * Private data of host_resolver_t
- */
-struct private_host_resolver_t {
-
-       /**
-        * Public interface
-        */
-       host_resolver_t public;
-
-       /**
-        * Hashtable to check for queued queries, query_t*
-        */
-       hashtable_t *queries;
-
-       /**
-        * Queue for queries, query_t*
-        */
-       linked_list_t *queue;
-
-       /**
-        * Mutex to safely access private data
-        */
-       mutex_t *mutex;
-
-       /**
-        * Condvar to signal arrival of new queries
-        */
-       condvar_t *new_query;
-
-       /**
-        * Minimum number of resolver threads
-        */
-       u_int min_threads;
-
-       /**
-        * Maximum number of resolver threads
-        */
-       u_int max_threads;
-
-       /**
-        * Current number of threads
-        */
-       u_int threads;
-
-       /**
-        * Current number of busy threads
-        */
-       u_int busy_threads;
-
-       /**
-        * Pool of threads, thread_t*
-        */
-       linked_list_t *pool;
-
-       /**
-        * TRUE if no new queries are accepted
-        */
-       bool disabled;
-
-};
-
-typedef struct {
-       /** DNS name we are looking for */
-       char *name;
-       /** address family we request */
-       int family;
-       /** Condvar to signal completion of a query */
-       condvar_t *done;
-       /** refcount */
-       refcount_t refcount;
-       /** the result if successful */
-       host_t *result;
-} query_t;
-
-/**
- * Destroy the given query_t object if refcount is zero
- */
-static void query_destroy(query_t *this)
-{
-       if (ref_put(&this->refcount))
-       {
-               DESTROY_IF(this->result);
-               this->done->destroy(this->done);
-               free(this->name);
-               free(this);
-       }
-}
-
-/**
- * Signals all waiting threads and destroys the query
- */
-static void query_signal_and_destroy(query_t *this)
-{
-       this->done->broadcast(this->done);
-       query_destroy(this);
-}
-
-/**
- * Hash a queued query
- */
-static u_int query_hash(query_t *this)
-{
-       return chunk_hash_inc(chunk_create(this->name, strlen(this->name)),
-                                                 chunk_hash(chunk_from_thing(this->family)));
-}
-
-/**
- * Compare two queued queries
- */
-static bool query_equals(query_t *this, query_t *other)
-{
-       return this->family == other->family && streq(this->name, other->name);
-}
-
-/**
- * Main function of resolver threads
- */
-static void *resolve_hosts(private_host_resolver_t *this)
-{
-       struct addrinfo hints, *result;
-       query_t *query;
-       int error;
-       bool old, timed_out;
-
-       while (TRUE)
-       {
-               this->mutex->lock(this->mutex);
-               thread_cleanup_push((thread_cleanup_t)this->mutex->unlock, this->mutex);
-               while (this->queue->remove_first(this->queue,
-                                                                               (void**)&query) != SUCCESS)
-               {
-                       old = thread_cancelability(TRUE);
-                       timed_out = this->new_query->timed_wait(this->new_query,
-                                                                       this->mutex, NEW_QUERY_WAIT_TIMEOUT * 1000);
-                       thread_cancelability(old);
-                       if (this->disabled)
-                       {
-                               thread_cleanup_pop(TRUE);
-                               return NULL;
-                       }
-                       else if (timed_out && (this->threads > this->min_threads))
-                       {       /* terminate this thread by detaching it */
-                               thread_t *thread = thread_current();
-
-                               this->threads--;
-                               this->pool->remove(this->pool, thread, NULL);
-                               thread_cleanup_pop(TRUE);
-                               thread->detach(thread);
-                               return NULL;
-                       }
-               }
-               this->busy_threads++;
-               thread_cleanup_pop(TRUE);
-
-               memset(&hints, 0, sizeof(hints));
-               hints.ai_family = query->family;
-               hints.ai_socktype = SOCK_DGRAM;
-
-               thread_cleanup_push((thread_cleanup_t)query_signal_and_destroy, query);
-               old = thread_cancelability(TRUE);
-               error = getaddrinfo(query->name, NULL, &hints, &result);
-               thread_cancelability(old);
-               thread_cleanup_pop(FALSE);
-
-               this->mutex->lock(this->mutex);
-               this->busy_threads--;
-               if (error != 0)
-               {
-                       DBG1(DBG_LIB, "resolving '%s' failed: %s", query->name,
-                                gai_strerror(error));
-               }
-               else
-               {       /* result is a linked list, but we use only the first address */
-                       query->result = host_create_from_sockaddr(result->ai_addr);
-                       freeaddrinfo(result);
-               }
-               this->queries->remove(this->queries, query);
-               query->done->broadcast(query->done);
-               this->mutex->unlock(this->mutex);
-               query_destroy(query);
-       }
-       return NULL;
-}
-
-/**
- * Try to convert IP addresses directly
- */
-static host_t *try_numeric_lookup(char *name, int family)
-{
-       struct addrinfo hints, *result;
-       int error;
-       host_t *host;
-
-       memset(&hints, 0, sizeof(hints));
-       hints.ai_family = family;
-       hints.ai_socktype = SOCK_DGRAM;
-       hints.ai_flags = AI_NUMERICHOST;
-
-       error = getaddrinfo(name, NULL, &hints, &result);
-       if (error != 0)
-       {       /* not an IP address */
-               return NULL;
-       }
-       else
-       {       /* result is a linked list, but we use only the first address */
-               host = host_create_from_sockaddr(result->ai_addr);
-               freeaddrinfo(result);
-       }
-       return host;
-}
-
-METHOD(host_resolver_t, resolve, host_t*,
-       private_host_resolver_t *this, char *name, int family)
-{
-       query_t *query, lookup = {
-               .name = name,
-               .family = family,
-       };
-       host_t *result;
-
-       if (streq(name, "%any") || streq(name, "0.0.0.0"))
-       {
-               return host_create_any(family ? family : AF_INET);
-       }
-       if (streq(name, "%any6") || streq(name, "::"))
-       {
-               return host_create_any(family ? family : AF_INET6);
-       }
-       if (family == AF_INET && strchr(name, ':'))
-       {       /* do not try to convert v6 addresses for v4 family */
-               return NULL;
-       }
-       result = try_numeric_lookup(name, family);
-       if (result)
-       {       /* shortcut for numeric IP addresses */
-               return result;
-       }
-       this->mutex->lock(this->mutex);
-       if (this->disabled)
-       {
-               this->mutex->unlock(this->mutex);
-               return NULL;
-       }
-       query = this->queries->get(this->queries, &lookup);
-       if (!query)
-       {
-               INIT(query,
-                       .name = strdup(name),
-                       .family = family,
-                       .done = condvar_create(CONDVAR_TYPE_DEFAULT),
-                       .refcount = 1,
-               );
-               this->queries->put(this->queries, query, query);
-               this->queue->insert_last(this->queue, query);
-               this->new_query->signal(this->new_query);
-       }
-       ref_get(&query->refcount);
-       if (this->busy_threads == this->threads &&
-               this->threads < this->max_threads)
-       {
-               thread_t *thread;
-
-               thread = thread_create((thread_main_t)resolve_hosts, this);
-               if (thread)
-               {
-                       this->threads++;
-                       this->pool->insert_last(this->pool, thread);
-               }
-       }
-       query->done->wait(query->done, this->mutex);
-       this->mutex->unlock(this->mutex);
-
-       result = query->result ? query->result->clone(query->result) : NULL;
-       query_destroy(query);
-       return result;
-}
-
-METHOD(host_resolver_t, flush, void,
-       private_host_resolver_t *this)
-{
-       enumerator_t *enumerator;
-       query_t *query;
-
-       this->mutex->lock(this->mutex);
-       enumerator = this->queries->create_enumerator(this->queries);
-       while (enumerator->enumerate(enumerator, &query, NULL))
-       {       /* use the hashtable here as we also want to signal dequeued queries */
-               this->queries->remove_at(this->queries, enumerator);
-               query->done->broadcast(query->done);
-       }
-       enumerator->destroy(enumerator);
-       this->queue->destroy_function(this->queue, (void*)query_destroy);
-       this->queue = linked_list_create();
-       this->disabled = TRUE;
-       /* this will already terminate most idle threads */
-       this->new_query->broadcast(this->new_query);
-       this->mutex->unlock(this->mutex);
-}
-
-METHOD(host_resolver_t, destroy, void,
-       private_host_resolver_t *this)
-{
-       thread_t *thread;
-
-       flush(this);
-       this->pool->invoke_offset(this->pool, offsetof(thread_t, cancel));
-       while (this->pool->remove_first(this->pool, (void**)&thread) == SUCCESS)
-       {
-               thread->join(thread);
-       }
-       this->pool->destroy(this->pool);
-       this->queue->destroy(this->queue);
-       this->queries->destroy(this->queries);
-       this->new_query->destroy(this->new_query);
-       this->mutex->destroy(this->mutex);
-       free(this);
-}
-
-/*
- * Described in header
- */
-host_resolver_t *host_resolver_create()
-{
-       private_host_resolver_t *this;
-
-       INIT(this,
-               .public = {
-                       .resolve = _resolve,
-                       .flush = _flush,
-                       .destroy = _destroy,
-               },
-               .queries = hashtable_create((hashtable_hash_t)query_hash,
-                                                                       (hashtable_equals_t)query_equals, 8),
-               .queue = linked_list_create(),
-               .pool = linked_list_create(),
-               .mutex = mutex_create(MUTEX_TYPE_DEFAULT),
-               .new_query = condvar_create(CONDVAR_TYPE_DEFAULT),
-       );
-
-       this->min_threads = max(0, lib->settings->get_int(lib->settings,
-                                                                       "libstrongswan.host_resolver.min_threads",
-                                                                        MIN_THREADS_DEFAULT));
-       this->max_threads = max(this->min_threads ?: 1,
-                                                       lib->settings->get_int(lib->settings,
-                                                                       "libstrongswan.host_resolver.max_threads",
-                                                                        MAX_THREADS_DEFAULT));
-       return &this->public;
-}
diff --git a/src/libstrongswan/host_resolver.h b/src/libstrongswan/host_resolver.h
deleted file mode 100644 (file)
index f7b8c7e..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2012 Tobias Brunner
- * Hochschule fuer Technik Rapperswil
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * for more details.
- */
-
-/**
- * @defgroup host_resolver host_resolver
- * @{ @ingroup libstrongswan
- */
-
-#ifndef HOST_RESOLVER_H_
-#define HOST_RESOLVER_H_
-
-#include "utils/host.h"
-
-typedef struct host_resolver_t host_resolver_t;
-
-/**
- * Resolve hosts by DNS name but do so in a separate thread (calling
- * getaddrinfo(3) directly might block indefinitely, or at least a very long
- * time if no DNS servers are reachable).
- */
-struct host_resolver_t {
-
-       /**
-        * Resolve host from the given DNS name.
-        *
-        * @param name          name to lookup
-        * @param family        requested address family
-        * @return                      resolved host or NULL if failed or canceled
-        */
-       host_t *(*resolve)(host_resolver_t *this, char *name, int family);
-
-       /**
-        * Flush the queue of queries. No new queries will be accepted afterwards.
-        */
-       void (*flush)(host_resolver_t *this);
-
-       /**
-        * Destroy a host_resolver_t.
-        */
-       void (*destroy)(host_resolver_t *this);
-};
-
-/**
- * Create a host_resolver_t instance.
- */
-host_resolver_t *host_resolver_create();
-
-#endif /** HOST_RESOLVER_H_ @}*/
index a42d68c..90a865a 100644 (file)
@@ -21,7 +21,7 @@
 #include <debug.h>
 #include <threading/thread.h>
 #include <utils/identification.h>
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/hashtable.h>
 #include <utils/backtrace.h>
 #include <selectors/traffic_selector.h>
index 5bd0d67..a2de749 100644 (file)
@@ -46,6 +46,9 @@
  * @defgroup ipsec ipsec
  * @ingroup libstrongswan
  *
+ * @defgroup networking networking
+ * @ingroup libstrongswan
+ *
  * @defgroup plugins plugins
  * @ingroup libstrongswan
  *
@@ -77,9 +80,9 @@
 #include "printf_hook.h"
 #include "utils.h"
 #include "chunk.h"
-#include "host_resolver.h"
 #include "settings.h"
 #include "integrity_checker.h"
+#include "networking/host_resolver.h"
 #include "processing/processor.h"
 #include "processing/scheduler.h"
 #include "crypto/crypto_factory.h"
diff --git a/src/libstrongswan/networking/host.c b/src/libstrongswan/networking/host.c
new file mode 100644 (file)
index 0000000..1d06140
--- /dev/null
@@ -0,0 +1,578 @@
+/*
+ * Copyright (C) 2006-2012 Tobias Brunner
+ * Copyright (C) 2006 Daniel Roethlisberger
+ * Copyright (C) 2005-2006 Martin Willi
+ * Copyright (C) 2005 Jan Hutter
+ * Hochschule fuer Technik Rapperswil
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ */
+
+#include "host.h"
+
+#include <debug.h>
+#include <library.h>
+
+#define IPV4_LEN        4
+#define IPV6_LEN       16
+
+typedef struct private_host_t private_host_t;
+
+/**
+ * Private Data of a host object.
+ */
+struct private_host_t {
+       /**
+        * Public data
+        */
+       host_t public;
+
+       /**
+        * low-lewel structure, which stores the address
+        */
+       union {
+               /** generic type */
+               struct sockaddr address;
+               /** maximum sockaddr size */
+               struct sockaddr_storage address_max;
+               /** IPv4 address */
+               struct sockaddr_in address4;
+               /** IPv6 address */
+               struct sockaddr_in6 address6;
+       };
+       /**
+        * length of address structure
+        */
+       socklen_t socklen;
+};
+
+
+METHOD(host_t, get_sockaddr, sockaddr_t*,
+       private_host_t *this)
+{
+       return &(this->address);
+}
+
+METHOD(host_t, get_sockaddr_len, socklen_t*,
+       private_host_t *this)
+{
+       return &(this->socklen);
+}
+
+METHOD(host_t, is_anyaddr, bool,
+       private_host_t *this)
+{
+       static const u_int8_t zeroes[IPV6_LEN];
+
+       switch (this->address.sa_family)
+       {
+               case AF_INET:
+               {
+                       return memeq(zeroes, &(this->address4.sin_addr.s_addr), IPV4_LEN);
+               }
+               case AF_INET6:
+               {
+                       return memeq(zeroes, &(this->address6.sin6_addr.s6_addr), IPV6_LEN);
+               }
+               default:
+               {
+                       return FALSE;
+               }
+       }
+}
+
+/**
+ * Described in header.
+ */
+int host_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
+                                        const void *const *args)
+{
+       private_host_t *this = *((private_host_t**)(args[0]));
+       char buffer[INET6_ADDRSTRLEN + 16];
+
+       if (this == NULL)
+       {
+               snprintf(buffer, sizeof(buffer), "(null)");
+       }
+       else if (is_anyaddr(this) && !spec->plus)
+       {
+               snprintf(buffer, sizeof(buffer), "%%any%s",
+                                this->address.sa_family == AF_INET6 ? "6" : "");
+       }
+       else
+       {
+               void *address;
+               u_int16_t port;
+               int len;
+
+               address = &this->address6.sin6_addr;
+               port = this->address6.sin6_port;
+
+               switch (this->address.sa_family)
+               {
+                       case AF_INET:
+                               address = &this->address4.sin_addr;
+                               port = this->address4.sin_port;
+                               /* fall */
+                       case AF_INET6:
+
+                               if (inet_ntop(this->address.sa_family, address,
+                                                         buffer, sizeof(buffer)) == NULL)
+                               {
+                                       snprintf(buffer, sizeof(buffer),
+                                                        "(address conversion failed)");
+                               }
+                               else if (spec->hash)
+                               {
+                                       len = strlen(buffer);
+                                       snprintf(buffer + len, sizeof(buffer) - len,
+                                                        "[%d]", ntohs(port));
+                               }
+                               break;
+                       default:
+                               snprintf(buffer, sizeof(buffer), "(family not supported)");
+                               break;
+               }
+       }
+       if (spec->minus)
+       {
+               return print_in_hook(data, "%-*s", spec->width, buffer);
+       }
+       return print_in_hook(data, "%*s", spec->width, buffer);
+}
+
+METHOD(host_t, get_address, chunk_t,
+       private_host_t *this)
+{
+       chunk_t address = chunk_empty;
+
+       switch (this->address.sa_family)
+       {
+               case AF_INET:
+               {
+                       address.ptr = (char*)&(this->address4.sin_addr.s_addr);
+                       address.len = IPV4_LEN;
+                       return address;
+               }
+               case AF_INET6:
+               {
+                       address.ptr = (char*)&(this->address6.sin6_addr.s6_addr);
+                       address.len = IPV6_LEN;
+                       return address;
+               }
+               default:
+               {
+                       /* return empty chunk */
+                       return address;
+               }
+       }
+}
+
+METHOD(host_t, get_family, int,
+       private_host_t *this)
+{
+       return this->address.sa_family;
+}
+
+METHOD(host_t, get_port, u_int16_t,
+       private_host_t *this)
+{
+       switch (this->address.sa_family)
+       {
+               case AF_INET:
+               {
+                       return ntohs(this->address4.sin_port);
+               }
+               case AF_INET6:
+               {
+                       return ntohs(this->address6.sin6_port);
+               }
+               default:
+               {
+                       return 0;
+               }
+       }
+}
+
+METHOD(host_t, set_port, void,
+       private_host_t *this, u_int16_t port)
+{
+       switch (this->address.sa_family)
+       {
+               case AF_INET:
+               {
+                       this->address4.sin_port = htons(port);
+                       break;
+               }
+               case AF_INET6:
+               {
+                       this->address6.sin6_port = htons(port);
+                       break;
+               }
+               default:
+               {
+                       break;
+               }
+       }
+}
+
+METHOD(host_t, clone_, host_t*,
+       private_host_t *this)
+{
+       private_host_t *new;
+
+       new = malloc_thing(private_host_t);
+       memcpy(new, this, sizeof(private_host_t));
+
+       return &new->public;
+}
+
+/**
+ * Implements host_t.ip_equals
+ */
+static bool ip_equals(private_host_t *this, private_host_t *other)
+{
+       if (this->address.sa_family != other->address.sa_family)
+       {
+               /* 0.0.0.0 and 0::0 are equal */
+               return (is_anyaddr(this) && is_anyaddr(other));
+       }
+
+       switch (this->address.sa_family)
+       {
+               case AF_INET:
+               {
+                       return memeq(&this->address4.sin_addr, &other->address4.sin_addr,
+                                                sizeof(this->address4.sin_addr));
+               }
+               case AF_INET6:
+               {
+                       return memeq(&this->address6.sin6_addr, &other->address6.sin6_addr,
+                                                sizeof(this->address6.sin6_addr));
+               }
+               default:
+                       break;
+       }
+       return FALSE;
+}
+
+/**
+ * Implements host_t.get_differences
+ */
+static host_diff_t get_differences(host_t *this, host_t *other)
+{
+       host_diff_t ret = HOST_DIFF_NONE;
+
+       if (!this->ip_equals(this, other))
+       {
+               ret |= HOST_DIFF_ADDR;
+       }
+
+       if (this->get_port(this) != other->get_port(other))
+       {
+               ret |= HOST_DIFF_PORT;
+       }
+
+       return ret;
+}
+
+/**
+ * Implements host_t.equals
+ */
+static bool equals(private_host_t *this, private_host_t *other)
+{
+       if (!ip_equals(this, other))
+       {
+               return FALSE;
+       }
+
+       switch (this->address.sa_family)
+       {
+               case AF_INET:
+               {
+                       return (this->address4.sin_port == other->address4.sin_port);
+               }
+               case AF_INET6:
+               {
+                       return (this->address6.sin6_port == other->address6.sin6_port);
+               }
+               default:
+                       break;
+       }
+       return FALSE;
+}
+
+METHOD(host_t, destroy, void,
+       private_host_t *this)
+{
+       free(this);
+}
+
+/**
+ * Creates an empty host_t object
+ */
+static private_host_t *host_create_empty(void)
+{
+       private_host_t *this;
+
+       INIT(this,
+               .public = {
+                       .get_sockaddr = _get_sockaddr,
+                       .get_sockaddr_len = _get_sockaddr_len,
+                       .clone = _clone_,
+                       .get_family = _get_family,
+                       .get_address = _get_address,
+                       .get_port = _get_port,
+                       .set_port = _set_port,
+                       .get_differences = get_differences,
+                       .ip_equals = (bool (*)(host_t *,host_t *))ip_equals,
+                       .equals = (bool (*)(host_t *,host_t *)) equals,
+                       .is_anyaddr = _is_anyaddr,
+                       .destroy = _destroy,
+               },
+       );
+
+       return this;
+}
+
+/*
+ * Create a %any host with port
+ */
+static host_t *host_create_any_port(int family, u_int16_t port)
+{
+       host_t *this;
+
+       this = host_create_any(family);
+       this->set_port(this, port);
+       return this;
+}
+
+/*
+ * Described in header.
+ */
+host_t *host_create_from_string(char *string, u_int16_t port)
+{
+       private_host_t *this;
+
+       if (streq(string, "%any"))
+       {
+               return host_create_any_port(AF_INET, port);
+       }
+       if (streq(string, "%any6"))
+       {
+               return host_create_any_port(AF_INET6, port);
+       }
+
+       this = host_create_empty();
+       if (strchr(string, '.'))
+       {
+               this->address.sa_family = AF_INET;
+       }
+       else
+       {
+               this->address.sa_family = AF_INET6;
+       }
+       switch (this->address.sa_family)
+       {
+               case AF_INET:
+               {
+                       if (inet_pton(AF_INET, string, &this->address4.sin_addr) <=0)
+                       {
+                               break;
+                       }
+                       this->address4.sin_port = htons(port);
+                       this->socklen = sizeof(struct sockaddr_in);
+                       return &this->public;
+               }
+               case AF_INET6:
+               {
+                       if (inet_pton(AF_INET6, string, &this->address6.sin6_addr) <=0)
+                       {
+                               break;
+                       }
+                       this->address6.sin6_port = htons(port);
+                       this->socklen = sizeof(struct sockaddr_in6);
+                       return &this->public;
+               }
+               default:
+               {
+                       break;
+               }
+       }
+       free(this);
+       return NULL;
+}
+
+/*
+ * Described in header.
+ */
+host_t *host_create_from_sockaddr(sockaddr_t *sockaddr)
+{
+       private_host_t *this = host_create_empty();
+
+       switch (sockaddr->sa_family)
+       {
+               case AF_INET:
+               {
+                       memcpy(&this->address4, (struct sockaddr_in*)sockaddr,
+                                  sizeof(struct sockaddr_in));
+                       this->socklen = sizeof(struct sockaddr_in);
+                       return &this->public;
+               }
+               case AF_INET6:
+               {
+                       memcpy(&this->address6, (struct sockaddr_in6*)sockaddr,
+                                  sizeof(struct sockaddr_in6));
+                       this->socklen = sizeof(struct sockaddr_in6);
+                       return &this->public;
+               }
+               default:
+                       break;
+       }
+       free(this);
+       return NULL;
+}
+
+/*
+ * Described in header.
+ */
+host_t *host_create_from_dns(char *string, int af, u_int16_t port)
+{
+       host_t *this;
+
+       this = lib->hosts->resolve(lib->hosts, string, af);
+       if (this)
+       {
+               this->set_port(this, port);
+       }
+       return this;
+}
+
+/*
+ * Described in header.
+ */
+host_t *host_create_from_chunk(int family, chunk_t address, u_int16_t port)
+{
+       private_host_t *this;
+
+       switch (family)
+       {
+               case AF_INET:
+                       if (address.len < IPV4_LEN)
+                       {
+                               return NULL;
+                       }
+                       address.len = IPV4_LEN;
+                       break;
+               case AF_INET6:
+                       if (address.len < IPV6_LEN)
+                       {
+                               return NULL;
+                       }
+                       address.len = IPV6_LEN;
+                       break;
+               case AF_UNSPEC:
+                       switch (address.len)
+                       {
+                               case IPV4_LEN:
+                                       family = AF_INET;
+                                       break;
+                               case IPV6_LEN:
+                                       family = AF_INET6;
+                                       break;
+                               default:
+                                       return NULL;
+                       }
+                       break;
+               default:
+                       return NULL;
+       }
+       this = host_create_empty();
+       this->address.sa_family = family;
+       switch (family)
+       {
+               case AF_INET:
+                       memcpy(&this->address4.sin_addr.s_addr, address.ptr, address.len);
+                       this->address4.sin_port = htons(port);
+                       this->socklen = sizeof(struct sockaddr_in);
+                       break;
+               case AF_INET6:
+                       memcpy(&this->address6.sin6_addr.s6_addr, address.ptr, address.len);
+                       this->address6.sin6_port = htons(port);
+                       this->socklen = sizeof(struct sockaddr_in6);
+                       break;
+       }
+       return &this->public;
+}
+
+/*
+ * Described in header.
+ */
+host_t *host_create_from_subnet(char *string, int *bits)
+{
+       char *pos, buf[64];
+       host_t *net;
+
+       pos = strchr(string, '/');
+       if (pos)
+       {
+               if (pos - string >= sizeof(buf))
+               {
+                       return NULL;
+               }
+               strncpy(buf, string, pos - string);
+               buf[pos - string] = '\0';
+               *bits = atoi(pos + 1);
+               return host_create_from_string(buf, 0);
+       }
+       net = host_create_from_string(string, 0);
+       if (net)
+       {
+               if (net->get_family(net) == AF_INET)
+               {
+                       *bits = 32;
+               }
+               else
+               {
+                       *bits = 128;
+               }
+       }
+       return net;
+}
+
+/*
+ * Described in header.
+ */
+host_t *host_create_any(int family)
+{
+       private_host_t *this = host_create_empty();
+
+       memset(&this->address_max, 0, sizeof(struct sockaddr_storage));
+       this->address.sa_family = family;
+
+       switch (family)
+       {
+               case AF_INET:
+               {
+                       this->socklen = sizeof(struct sockaddr_in);
+                       return &(this->public);
+               }
+               case AF_INET6:
+               {
+                       this->socklen = sizeof(struct sockaddr_in6);
+                       return &this->public;
+               }
+               default:
+                       break;
+       }
+       free(this);
+       return NULL;
+}
diff --git a/src/libstrongswan/networking/host.h b/src/libstrongswan/networking/host.h
new file mode 100644 (file)
index 0000000..cae2a4f
--- /dev/null
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2006-2009 Tobias Brunner
+ * Copyright (C) 2006 Daniel Roethlisberger
+ * Copyright (C) 2005-2008 Martin Willi
+ * Copyright (C) 2005 Jan Hutter
+ * Hochschule fuer Technik Rapperswil
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ */
+
+/**
+ * @defgroup host host
+ * @{ @ingroup networking
+ */
+
+#ifndef HOST_H_
+#define HOST_H_
+
+typedef enum host_diff_t host_diff_t;
+typedef struct host_t host_t;
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <chunk.h>
+
+/**
+ * Differences between two hosts. They differ in
+ * address, port, or both.
+ */
+enum host_diff_t {
+       HOST_DIFF_NONE = 0,
+       HOST_DIFF_ADDR = 1,
+       HOST_DIFF_PORT = 2,
+};
+
+/**
+ * Representates a Host
+ *
+ * Host object, identifies a address:port pair and defines some
+ * useful functions on it.
+ */
+struct host_t {
+
+       /**
+        * Build a clone of this host object.
+        *
+        * @return              cloned host
+        */
+       host_t *(*clone) (host_t *this);
+
+       /**
+        * Get a pointer to the internal sockaddr struct.
+        *
+        * This is used for sending and receiving via sockets.
+        *
+        * @return              pointer to the internal sockaddr structure
+        */
+       sockaddr_t  *(*get_sockaddr) (host_t *this);
+
+       /**
+        * Get the length of the sockaddr struct.
+        *
+        * Depending on the family, the length of the sockaddr struct
+        * is different. Use this function to get the length of the sockaddr
+        * struct returned by get_sock_addr.
+        *
+        * This is used for sending and receiving via sockets.
+        *
+        * @return              length of the sockaddr struct
+        */
+       socklen_t *(*get_sockaddr_len) (host_t *this);
+
+       /**
+        * Gets the family of the address
+        *
+        * @return              family
+        */
+       int (*get_family) (host_t *this);
+
+       /**
+        * Checks if the ip address of host is set to default route.
+        *
+        * @return              TRUE if host is 0.0.0.0 or 0::0, FALSE otherwise
+        */
+       bool (*is_anyaddr) (host_t *this);
+
+       /**
+        * Get the address of this host as chunk_t
+        *
+        * Returned chunk points to internal data.
+        *
+        * @return              address string,
+        */
+       chunk_t (*get_address) (host_t *this);
+
+       /**
+        * Get the port of this host
+        *
+        * @return              port number
+        */
+       u_int16_t (*get_port) (host_t *this);
+
+       /**
+        * Set the port of this host
+        *
+        * @param port  port numer
+        */
+       void (*set_port) (host_t *this, u_int16_t port);
+
+       /**
+        * Compare the ips of two hosts hosts.
+        *
+        * @param other the other to compare
+        * @return              TRUE if addresses are equal.
+        */
+       bool (*ip_equals) (host_t *this, host_t *other);
+
+       /**
+        * Compare two hosts, with port.
+        *
+        * @param other the other to compare
+        * @return              TRUE if addresses and ports are equal.
+        */
+       bool (*equals) (host_t *this, host_t *other);
+
+       /**
+        * Compare two hosts and return the differences.
+        *
+        * @param other the other to compare
+        * @return              differences in a combination of host_diff_t's
+        */
+       host_diff_t (*get_differences) (host_t *this, host_t *other);
+
+       /**
+        * Destroy this host object.
+        */
+       void (*destroy) (host_t *this);
+};
+
+/**
+ * Constructor to create a host_t object from an address string.
+ *
+ * @param string               string of an address, such as "152.96.193.130"
+ * @param port                 port number
+ * @return                             host_t, NULL if string not an address.
+ */
+host_t *host_create_from_string(char *string, u_int16_t port);
+
+/**
+ * Constructor to create a host_t from a DNS name.
+ *
+ * @param string               hostname to resolve
+ * @param family               family to prefer, 0 for first match
+ * @param port                 port number
+ * @return                             host_t, NULL lookup failed
+ */
+host_t *host_create_from_dns(char *string, int family, u_int16_t port);
+
+/**
+ * Constructor to create a host_t object from an address chunk.
+ *
+ * If family is AF_UNSPEC, it is guessed using address.len.
+ *
+ * @param family               Address family, such as AF_INET or AF_INET6
+ * @param address              address as chunk_t in network order
+ * @param port                 port number
+ * @return                             host_t, NULL if family not supported/chunk invalid
+ */
+host_t *host_create_from_chunk(int family, chunk_t address, u_int16_t port);
+
+/**
+ * Constructor to create a host_t object from a sockaddr struct
+ *
+ * @param sockaddr             sockaddr struct which contains family, address and port
+ * @return                             host_t, NULL if family not supported
+ */
+host_t *host_create_from_sockaddr(sockaddr_t *sockaddr);
+
+/**
+ * Create a host from a CIDR subnet definition (1.2.3.0/24), return bits.
+ *
+ * @param string               string to parse
+ * @param bits                 gets the number of network bits in CIDR notation
+ * @return                             network start address, NULL on error
+ */
+host_t *host_create_from_subnet(char *string, int *bits);
+
+/**
+ * Create a host without an address, a "any" host.
+ *
+ * @param family               family of the any host
+ * @return                             host_t, NULL if family not supported
+ */
+host_t *host_create_any(int family);
+
+/**
+ * printf hook function for host_t.
+ *
+ * Arguments are:
+ *     host_t *host
+ * Use #-modifier to include port number
+ * Use +-modifier to force numeric representation (instead of e.g. %any)
+ */
+int host_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
+                                        const void *const *args);
+
+#endif /** HOST_H_ @}*/
diff --git a/src/libstrongswan/networking/host_resolver.c b/src/libstrongswan/networking/host_resolver.c
new file mode 100644 (file)
index 0000000..55b07d3
--- /dev/null
@@ -0,0 +1,391 @@
+/*
+ * Copyright (C) 2012 Tobias Brunner
+ * Hochschule fuer Technik Rapperswil
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+
+#include "host_resolver.h"
+
+#include <debug.h>
+#include <library.h>
+#include <threading/condvar.h>
+#include <threading/mutex.h>
+#include <threading/thread.h>
+#include <utils/hashtable.h>
+#include <utils/linked_list.h>
+
+/**
+ * Default minimum and maximum number of threads
+ */
+#define MIN_THREADS_DEFAULT 0
+#define MAX_THREADS_DEFAULT 3
+
+/**
+ * Timeout in seconds to wait for new queries until a thread may be stopped
+ */
+#define NEW_QUERY_WAIT_TIMEOUT 30
+
+typedef struct private_host_resolver_t private_host_resolver_t;
+
+/**
+ * Private data of host_resolver_t
+ */
+struct private_host_resolver_t {
+
+       /**
+        * Public interface
+        */
+       host_resolver_t public;
+
+       /**
+        * Hashtable to check for queued queries, query_t*
+        */
+       hashtable_t *queries;
+
+       /**
+        * Queue for queries, query_t*
+        */
+       linked_list_t *queue;
+
+       /**
+        * Mutex to safely access private data
+        */
+       mutex_t *mutex;
+
+       /**
+        * Condvar to signal arrival of new queries
+        */
+       condvar_t *new_query;
+
+       /**
+        * Minimum number of resolver threads
+        */
+       u_int min_threads;
+
+       /**
+        * Maximum number of resolver threads
+        */
+       u_int max_threads;
+
+       /**
+        * Current number of threads
+        */
+       u_int threads;
+
+       /**
+        * Current number of busy threads
+        */
+       u_int busy_threads;
+
+       /**
+        * Pool of threads, thread_t*
+        */
+       linked_list_t *pool;
+
+       /**
+        * TRUE if no new queries are accepted
+        */
+       bool disabled;
+
+};
+
+typedef struct {
+       /** DNS name we are looking for */
+       char *name;
+       /** address family we request */
+       int family;
+       /** Condvar to signal completion of a query */
+       condvar_t *done;
+       /** refcount */
+       refcount_t refcount;
+       /** the result if successful */
+       host_t *result;
+} query_t;
+
+/**
+ * Destroy the given query_t object if refcount is zero
+ */
+static void query_destroy(query_t *this)
+{
+       if (ref_put(&this->refcount))
+       {
+               DESTROY_IF(this->result);
+               this->done->destroy(this->done);
+               free(this->name);
+               free(this);
+       }
+}
+
+/**
+ * Signals all waiting threads and destroys the query
+ */
+static void query_signal_and_destroy(query_t *this)
+{
+       this->done->broadcast(this->done);
+       query_destroy(this);
+}
+
+/**
+ * Hash a queued query
+ */
+static u_int query_hash(query_t *this)
+{
+       return chunk_hash_inc(chunk_create(this->name, strlen(this->name)),
+                                                 chunk_hash(chunk_from_thing(this->family)));
+}
+
+/**
+ * Compare two queued queries
+ */
+static bool query_equals(query_t *this, query_t *other)
+{
+       return this->family == other->family && streq(this->name, other->name);
+}
+
+/**
+ * Main function of resolver threads
+ */
+static void *resolve_hosts(private_host_resolver_t *this)
+{
+       struct addrinfo hints, *result;
+       query_t *query;
+       int error;
+       bool old, timed_out;
+
+       while (TRUE)
+       {
+               this->mutex->lock(this->mutex);
+               thread_cleanup_push((thread_cleanup_t)this->mutex->unlock, this->mutex);
+               while (this->queue->remove_first(this->queue,
+                                                                               (void**)&query) != SUCCESS)
+               {
+                       old = thread_cancelability(TRUE);
+                       timed_out = this->new_query->timed_wait(this->new_query,
+                                                                       this->mutex, NEW_QUERY_WAIT_TIMEOUT * 1000);
+                       thread_cancelability(old);
+                       if (this->disabled)
+                       {
+                               thread_cleanup_pop(TRUE);
+                               return NULL;
+                       }
+                       else if (timed_out && (this->threads > this->min_threads))
+                       {       /* terminate this thread by detaching it */
+                               thread_t *thread = thread_current();
+
+                               this->threads--;
+                               this->pool->remove(this->pool, thread, NULL);
+                               thread_cleanup_pop(TRUE);
+                               thread->detach(thread);
+                               return NULL;
+                       }
+               }
+               this->busy_threads++;
+               thread_cleanup_pop(TRUE);
+
+               memset(&hints, 0, sizeof(hints));
+               hints.ai_family = query->family;
+               hints.ai_socktype = SOCK_DGRAM;
+
+               thread_cleanup_push((thread_cleanup_t)query_signal_and_destroy, query);
+               old = thread_cancelability(TRUE);
+               error = getaddrinfo(query->name, NULL, &hints, &result);
+               thread_cancelability(old);
+               thread_cleanup_pop(FALSE);
+
+               this->mutex->lock(this->mutex);
+               this->busy_threads--;
+               if (error != 0)
+               {
+                       DBG1(DBG_LIB, "resolving '%s' failed: %s", query->name,
+                                gai_strerror(error));
+               }
+               else
+               {       /* result is a linked list, but we use only the first address */
+                       query->result = host_create_from_sockaddr(result->ai_addr);
+                       freeaddrinfo(result);
+               }
+               this->queries->remove(this->queries, query);
+               query->done->broadcast(query->done);
+               this->mutex->unlock(this->mutex);
+               query_destroy(query);
+       }
+       return NULL;
+}
+
+/**
+ * Try to convert IP addresses directly
+ */
+static host_t *try_numeric_lookup(char *name, int family)
+{
+       struct addrinfo hints, *result;
+       int error;
+       host_t *host;
+
+       memset(&hints, 0, sizeof(hints));
+       hints.ai_family = family;
+       hints.ai_socktype = SOCK_DGRAM;
+       hints.ai_flags = AI_NUMERICHOST;
+
+       error = getaddrinfo(name, NULL, &hints, &result);
+       if (error != 0)
+       {       /* not an IP address */
+               return NULL;
+       }
+       else
+       {       /* result is a linked list, but we use only the first address */
+               host = host_create_from_sockaddr(result->ai_addr);
+               freeaddrinfo(result);
+       }
+       return host;
+}
+
+METHOD(host_resolver_t, resolve, host_t*,
+       private_host_resolver_t *this, char *name, int family)
+{
+       query_t *query, lookup = {
+               .name = name,
+               .family = family,
+       };
+       host_t *result;
+
+       if (streq(name, "%any") || streq(name, "0.0.0.0"))
+       {
+               return host_create_any(family ? family : AF_INET);
+       }
+       if (streq(name, "%any6") || streq(name, "::"))
+       {
+               return host_create_any(family ? family : AF_INET6);
+       }
+       if (family == AF_INET && strchr(name, ':'))
+       {       /* do not try to convert v6 addresses for v4 family */
+               return NULL;
+       }
+       result = try_numeric_lookup(name, family);
+       if (result)
+       {       /* shortcut for numeric IP addresses */
+               return result;
+       }
+       this->mutex->lock(this->mutex);
+       if (this->disabled)
+       {
+               this->mutex->unlock(this->mutex);
+               return NULL;
+       }
+       query = this->queries->get(this->queries, &lookup);
+       if (!query)
+       {
+               INIT(query,
+                       .name = strdup(name),
+                       .family = family,
+                       .done = condvar_create(CONDVAR_TYPE_DEFAULT),
+                       .refcount = 1,
+               );
+               this->queries->put(this->queries, query, query);
+               this->queue->insert_last(this->queue, query);
+               this->new_query->signal(this->new_query);
+       }
+       ref_get(&query->refcount);
+       if (this->busy_threads == this->threads &&
+               this->threads < this->max_threads)
+       {
+               thread_t *thread;
+
+               thread = thread_create((thread_main_t)resolve_hosts, this);
+               if (thread)
+               {
+                       this->threads++;
+                       this->pool->insert_last(this->pool, thread);
+               }
+       }
+       query->done->wait(query->done, this->mutex);
+       this->mutex->unlock(this->mutex);
+
+       result = query->result ? query->result->clone(query->result) : NULL;
+       query_destroy(query);
+       return result;
+}
+
+METHOD(host_resolver_t, flush, void,
+       private_host_resolver_t *this)
+{
+       enumerator_t *enumerator;
+       query_t *query;
+
+       this->mutex->lock(this->mutex);
+       enumerator = this->queries->create_enumerator(this->queries);
+       while (enumerator->enumerate(enumerator, &query, NULL))
+       {       /* use the hashtable here as we also want to signal dequeued queries */
+               this->queries->remove_at(this->queries, enumerator);
+               query->done->broadcast(query->done);
+       }
+       enumerator->destroy(enumerator);
+       this->queue->destroy_function(this->queue, (void*)query_destroy);
+       this->queue = linked_list_create();
+       this->disabled = TRUE;
+       /* this will already terminate most idle threads */
+       this->new_query->broadcast(this->new_query);
+       this->mutex->unlock(this->mutex);
+}
+
+METHOD(host_resolver_t, destroy, void,
+       private_host_resolver_t *this)
+{
+       thread_t *thread;
+
+       flush(this);
+       this->pool->invoke_offset(this->pool, offsetof(thread_t, cancel));
+       while (this->pool->remove_first(this->pool, (void**)&thread) == SUCCESS)
+       {
+               thread->join(thread);
+       }
+       this->pool->destroy(this->pool);
+       this->queue->destroy(this->queue);
+       this->queries->destroy(this->queries);
+       this->new_query->destroy(this->new_query);
+       this->mutex->destroy(this->mutex);
+       free(this);
+}
+
+/*
+ * Described in header
+ */
+host_resolver_t *host_resolver_create()
+{
+       private_host_resolver_t *this;
+
+       INIT(this,
+               .public = {
+                       .resolve = _resolve,
+                       .flush = _flush,
+                       .destroy = _destroy,
+               },
+               .queries = hashtable_create((hashtable_hash_t)query_hash,
+                                                                       (hashtable_equals_t)query_equals, 8),
+               .queue = linked_list_create(),
+               .pool = linked_list_create(),
+               .mutex = mutex_create(MUTEX_TYPE_DEFAULT),
+               .new_query = condvar_create(CONDVAR_TYPE_DEFAULT),
+       );
+
+       this->min_threads = max(0, lib->settings->get_int(lib->settings,
+                                                                       "libstrongswan.host_resolver.min_threads",
+                                                                        MIN_THREADS_DEFAULT));
+       this->max_threads = max(this->min_threads ?: 1,
+                                                       lib->settings->get_int(lib->settings,
+                                                                       "libstrongswan.host_resolver.max_threads",
+                                                                        MAX_THREADS_DEFAULT));
+       return &this->public;
+}
diff --git a/src/libstrongswan/networking/host_resolver.h b/src/libstrongswan/networking/host_resolver.h
new file mode 100644 (file)
index 0000000..f944a9c
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2012 Tobias Brunner
+ * Hochschule fuer Technik Rapperswil
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ */
+
+/**
+ * @defgroup host_resolver host_resolver
+ * @{ @ingroup networking
+ */
+
+#ifndef HOST_RESOLVER_H_
+#define HOST_RESOLVER_H_
+
+#include "host.h"
+
+typedef struct host_resolver_t host_resolver_t;
+
+/**
+ * Resolve hosts by DNS name but do so in a separate thread (calling
+ * getaddrinfo(3) directly might block indefinitely, or at least a very long
+ * time if no DNS servers are reachable).
+ */
+struct host_resolver_t {
+
+       /**
+        * Resolve host from the given DNS name.
+        *
+        * @param name          name to lookup
+        * @param family        requested address family
+        * @return                      resolved host or NULL if failed or canceled
+        */
+       host_t *(*resolve)(host_resolver_t *this, char *name, int family);
+
+       /**
+        * Flush the queue of queries. No new queries will be accepted afterwards.
+        */
+       void (*flush)(host_resolver_t *this);
+
+       /**
+        * Destroy a host_resolver_t.
+        */
+       void (*destroy)(host_resolver_t *this);
+};
+
+/**
+ * Create a host_resolver_t instance.
+ */
+host_resolver_t *host_resolver_create();
+
+#endif /** HOST_RESOLVER_H_ @}*/
index 39b8879..b6da391 100644 (file)
@@ -27,7 +27,7 @@ typedef enum ts_type_t ts_type_t;
 typedef struct traffic_selector_t traffic_selector_t;
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 
 /**
  * Traffic selector types.
diff --git a/src/libstrongswan/utils/host.c b/src/libstrongswan/utils/host.c
deleted file mode 100644 (file)
index 1d06140..0000000
+++ /dev/null
@@ -1,578 +0,0 @@
-/*
- * Copyright (C) 2006-2012 Tobias Brunner
- * Copyright (C) 2006 Daniel Roethlisberger
- * Copyright (C) 2005-2006 Martin Willi
- * Copyright (C) 2005 Jan Hutter
- * Hochschule fuer Technik Rapperswil
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * for more details.
- */
-
-#include "host.h"
-
-#include <debug.h>
-#include <library.h>
-
-#define IPV4_LEN        4
-#define IPV6_LEN       16
-
-typedef struct private_host_t private_host_t;
-
-/**
- * Private Data of a host object.
- */
-struct private_host_t {
-       /**
-        * Public data
-        */
-       host_t public;
-
-       /**
-        * low-lewel structure, which stores the address
-        */
-       union {
-               /** generic type */
-               struct sockaddr address;
-               /** maximum sockaddr size */
-               struct sockaddr_storage address_max;
-               /** IPv4 address */
-               struct sockaddr_in address4;
-               /** IPv6 address */
-               struct sockaddr_in6 address6;
-       };
-       /**
-        * length of address structure
-        */
-       socklen_t socklen;
-};
-
-
-METHOD(host_t, get_sockaddr, sockaddr_t*,
-       private_host_t *this)
-{
-       return &(this->address);
-}
-
-METHOD(host_t, get_sockaddr_len, socklen_t*,
-       private_host_t *this)
-{
-       return &(this->socklen);
-}
-
-METHOD(host_t, is_anyaddr, bool,
-       private_host_t *this)
-{
-       static const u_int8_t zeroes[IPV6_LEN];
-
-       switch (this->address.sa_family)
-       {
-               case AF_INET:
-               {
-                       return memeq(zeroes, &(this->address4.sin_addr.s_addr), IPV4_LEN);
-               }
-               case AF_INET6:
-               {
-                       return memeq(zeroes, &(this->address6.sin6_addr.s6_addr), IPV6_LEN);
-               }
-               default:
-               {
-                       return FALSE;
-               }
-       }
-}
-
-/**
- * Described in header.
- */
-int host_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
-                                        const void *const *args)
-{
-       private_host_t *this = *((private_host_t**)(args[0]));
-       char buffer[INET6_ADDRSTRLEN + 16];
-
-       if (this == NULL)
-       {
-               snprintf(buffer, sizeof(buffer), "(null)");
-       }
-       else if (is_anyaddr(this) && !spec->plus)
-       {
-               snprintf(buffer, sizeof(buffer), "%%any%s",
-                                this->address.sa_family == AF_INET6 ? "6" : "");
-       }
-       else
-       {
-               void *address;
-               u_int16_t port;
-               int len;
-
-               address = &this->address6.sin6_addr;
-               port = this->address6.sin6_port;
-
-               switch (this->address.sa_family)
-               {
-                       case AF_INET:
-                               address = &this->address4.sin_addr;
-                               port = this->address4.sin_port;
-                               /* fall */
-                       case AF_INET6:
-
-                               if (inet_ntop(this->address.sa_family, address,
-                                                         buffer, sizeof(buffer)) == NULL)
-                               {
-                                       snprintf(buffer, sizeof(buffer),
-                                                        "(address conversion failed)");
-                               }
-                               else if (spec->hash)
-                               {
-                                       len = strlen(buffer);
-                                       snprintf(buffer + len, sizeof(buffer) - len,
-                                                        "[%d]", ntohs(port));
-                               }
-                               break;
-                       default:
-                               snprintf(buffer, sizeof(buffer), "(family not supported)");
-                               break;
-               }
-       }
-       if (spec->minus)
-       {
-               return print_in_hook(data, "%-*s", spec->width, buffer);
-       }
-       return print_in_hook(data, "%*s", spec->width, buffer);
-}
-
-METHOD(host_t, get_address, chunk_t,
-       private_host_t *this)
-{
-       chunk_t address = chunk_empty;
-
-       switch (this->address.sa_family)
-       {
-               case AF_INET:
-               {
-                       address.ptr = (char*)&(this->address4.sin_addr.s_addr);
-                       address.len = IPV4_LEN;
-                       return address;
-               }
-               case AF_INET6:
-               {
-                       address.ptr = (char*)&(this->address6.sin6_addr.s6_addr);
-                       address.len = IPV6_LEN;
-                       return address;
-               }
-               default:
-               {
-                       /* return empty chunk */
-                       return address;
-               }
-       }
-}
-
-METHOD(host_t, get_family, int,
-       private_host_t *this)
-{
-       return this->address.sa_family;
-}
-
-METHOD(host_t, get_port, u_int16_t,
-       private_host_t *this)
-{
-       switch (this->address.sa_family)
-       {
-               case AF_INET:
-               {
-                       return ntohs(this->address4.sin_port);
-               }
-               case AF_INET6:
-               {
-                       return ntohs(this->address6.sin6_port);
-               }
-               default:
-               {
-                       return 0;
-               }
-       }
-}
-
-METHOD(host_t, set_port, void,
-       private_host_t *this, u_int16_t port)
-{
-       switch (this->address.sa_family)
-       {
-               case AF_INET:
-               {
-                       this->address4.sin_port = htons(port);
-                       break;
-               }
-               case AF_INET6:
-               {
-                       this->address6.sin6_port = htons(port);
-                       break;
-               }
-               default:
-               {
-                       break;
-               }
-       }
-}
-
-METHOD(host_t, clone_, host_t*,
-       private_host_t *this)
-{
-       private_host_t *new;
-
-       new = malloc_thing(private_host_t);
-       memcpy(new, this, sizeof(private_host_t));
-
-       return &new->public;
-}
-
-/**
- * Implements host_t.ip_equals
- */
-static bool ip_equals(private_host_t *this, private_host_t *other)
-{
-       if (this->address.sa_family != other->address.sa_family)
-       {
-               /* 0.0.0.0 and 0::0 are equal */
-               return (is_anyaddr(this) && is_anyaddr(other));
-       }
-
-       switch (this->address.sa_family)
-       {
-               case AF_INET:
-               {
-                       return memeq(&this->address4.sin_addr, &other->address4.sin_addr,
-                                                sizeof(this->address4.sin_addr));
-               }
-               case AF_INET6:
-               {
-                       return memeq(&this->address6.sin6_addr, &other->address6.sin6_addr,
-                                                sizeof(this->address6.sin6_addr));
-               }
-               default:
-                       break;
-       }
-       return FALSE;
-}
-
-/**
- * Implements host_t.get_differences
- */
-static host_diff_t get_differences(host_t *this, host_t *other)
-{
-       host_diff_t ret = HOST_DIFF_NONE;
-
-       if (!this->ip_equals(this, other))
-       {
-               ret |= HOST_DIFF_ADDR;
-       }
-
-       if (this->get_port(this) != other->get_port(other))
-       {
-               ret |= HOST_DIFF_PORT;
-       }
-
-       return ret;
-}
-
-/**
- * Implements host_t.equals
- */
-static bool equals(private_host_t *this, private_host_t *other)
-{
-       if (!ip_equals(this, other))
-       {
-               return FALSE;
-       }
-
-       switch (this->address.sa_family)
-       {
-               case AF_INET:
-               {
-                       return (this->address4.sin_port == other->address4.sin_port);
-               }
-               case AF_INET6:
-               {
-                       return (this->address6.sin6_port == other->address6.sin6_port);
-               }
-               default:
-                       break;
-       }
-       return FALSE;
-}
-
-METHOD(host_t, destroy, void,
-       private_host_t *this)
-{
-       free(this);
-}
-
-/**
- * Creates an empty host_t object
- */
-static private_host_t *host_create_empty(void)
-{
-       private_host_t *this;
-
-       INIT(this,
-               .public = {
-                       .get_sockaddr = _get_sockaddr,
-                       .get_sockaddr_len = _get_sockaddr_len,
-                       .clone = _clone_,
-                       .get_family = _get_family,
-                       .get_address = _get_address,
-                       .get_port = _get_port,
-                       .set_port = _set_port,
-                       .get_differences = get_differences,
-                       .ip_equals = (bool (*)(host_t *,host_t *))ip_equals,
-                       .equals = (bool (*)(host_t *,host_t *)) equals,
-                       .is_anyaddr = _is_anyaddr,
-                       .destroy = _destroy,
-               },
-       );
-
-       return this;
-}
-
-/*
- * Create a %any host with port
- */
-static host_t *host_create_any_port(int family, u_int16_t port)
-{
-       host_t *this;
-
-       this = host_create_any(family);
-       this->set_port(this, port);
-       return this;
-}
-
-/*
- * Described in header.
- */
-host_t *host_create_from_string(char *string, u_int16_t port)
-{
-       private_host_t *this;
-
-       if (streq(string, "%any"))
-       {
-               return host_create_any_port(AF_INET, port);
-       }
-       if (streq(string, "%any6"))
-       {
-               return host_create_any_port(AF_INET6, port);
-       }
-
-       this = host_create_empty();
-       if (strchr(string, '.'))
-       {
-               this->address.sa_family = AF_INET;
-       }
-       else
-       {
-               this->address.sa_family = AF_INET6;
-       }
-       switch (this->address.sa_family)
-       {
-               case AF_INET:
-               {
-                       if (inet_pton(AF_INET, string, &this->address4.sin_addr) <=0)
-                       {
-                               break;
-                       }
-                       this->address4.sin_port = htons(port);
-                       this->socklen = sizeof(struct sockaddr_in);
-                       return &this->public;
-               }
-               case AF_INET6:
-               {
-                       if (inet_pton(AF_INET6, string, &this->address6.sin6_addr) <=0)
-                       {
-                               break;
-                       }
-                       this->address6.sin6_port = htons(port);
-                       this->socklen = sizeof(struct sockaddr_in6);
-                       return &this->public;
-               }
-               default:
-               {
-                       break;
-               }
-       }
-       free(this);
-       return NULL;
-}
-
-/*
- * Described in header.
- */
-host_t *host_create_from_sockaddr(sockaddr_t *sockaddr)
-{
-       private_host_t *this = host_create_empty();
-
-       switch (sockaddr->sa_family)
-       {
-               case AF_INET:
-               {
-                       memcpy(&this->address4, (struct sockaddr_in*)sockaddr,
-                                  sizeof(struct sockaddr_in));
-                       this->socklen = sizeof(struct sockaddr_in);
-                       return &this->public;
-               }
-               case AF_INET6:
-               {
-                       memcpy(&this->address6, (struct sockaddr_in6*)sockaddr,
-                                  sizeof(struct sockaddr_in6));
-                       this->socklen = sizeof(struct sockaddr_in6);
-                       return &this->public;
-               }
-               default:
-                       break;
-       }
-       free(this);
-       return NULL;
-}
-
-/*
- * Described in header.
- */
-host_t *host_create_from_dns(char *string, int af, u_int16_t port)
-{
-       host_t *this;
-
-       this = lib->hosts->resolve(lib->hosts, string, af);
-       if (this)
-       {
-               this->set_port(this, port);
-       }
-       return this;
-}
-
-/*
- * Described in header.
- */
-host_t *host_create_from_chunk(int family, chunk_t address, u_int16_t port)
-{
-       private_host_t *this;
-
-       switch (family)
-       {
-               case AF_INET:
-                       if (address.len < IPV4_LEN)
-                       {
-                               return NULL;
-                       }
-                       address.len = IPV4_LEN;
-                       break;
-               case AF_INET6:
-                       if (address.len < IPV6_LEN)
-                       {
-                               return NULL;
-                       }
-                       address.len = IPV6_LEN;
-                       break;
-               case AF_UNSPEC:
-                       switch (address.len)
-                       {
-                               case IPV4_LEN:
-                                       family = AF_INET;
-                                       break;
-                               case IPV6_LEN:
-                                       family = AF_INET6;
-                                       break;
-                               default:
-                                       return NULL;
-                       }
-                       break;
-               default:
-                       return NULL;
-       }
-       this = host_create_empty();
-       this->address.sa_family = family;
-       switch (family)
-       {
-               case AF_INET:
-                       memcpy(&this->address4.sin_addr.s_addr, address.ptr, address.len);
-                       this->address4.sin_port = htons(port);
-                       this->socklen = sizeof(struct sockaddr_in);
-                       break;
-               case AF_INET6:
-                       memcpy(&this->address6.sin6_addr.s6_addr, address.ptr, address.len);
-                       this->address6.sin6_port = htons(port);
-                       this->socklen = sizeof(struct sockaddr_in6);
-                       break;
-       }
-       return &this->public;
-}
-
-/*
- * Described in header.
- */
-host_t *host_create_from_subnet(char *string, int *bits)
-{
-       char *pos, buf[64];
-       host_t *net;
-
-       pos = strchr(string, '/');
-       if (pos)
-       {
-               if (pos - string >= sizeof(buf))
-               {
-                       return NULL;
-               }
-               strncpy(buf, string, pos - string);
-               buf[pos - string] = '\0';
-               *bits = atoi(pos + 1);
-               return host_create_from_string(buf, 0);
-       }
-       net = host_create_from_string(string, 0);
-       if (net)
-       {
-               if (net->get_family(net) == AF_INET)
-               {
-                       *bits = 32;
-               }
-               else
-               {
-                       *bits = 128;
-               }
-       }
-       return net;
-}
-
-/*
- * Described in header.
- */
-host_t *host_create_any(int family)
-{
-       private_host_t *this = host_create_empty();
-
-       memset(&this->address_max, 0, sizeof(struct sockaddr_storage));
-       this->address.sa_family = family;
-
-       switch (family)
-       {
-               case AF_INET:
-               {
-                       this->socklen = sizeof(struct sockaddr_in);
-                       return &(this->public);
-               }
-               case AF_INET6:
-               {
-                       this->socklen = sizeof(struct sockaddr_in6);
-                       return &this->public;
-               }
-               default:
-                       break;
-       }
-       free(this);
-       return NULL;
-}
diff --git a/src/libstrongswan/utils/host.h b/src/libstrongswan/utils/host.h
deleted file mode 100644 (file)
index a8b0105..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (C) 2006-2009 Tobias Brunner
- * Copyright (C) 2006 Daniel Roethlisberger
- * Copyright (C) 2005-2008 Martin Willi
- * Copyright (C) 2005 Jan Hutter
- * Hochschule fuer Technik Rapperswil
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * for more details.
- */
-
-/**
- * @defgroup host host
- * @{ @ingroup utils
- */
-
-#ifndef HOST_H_
-#define HOST_H_
-
-typedef enum host_diff_t host_diff_t;
-typedef struct host_t host_t;
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include <chunk.h>
-
-/**
- * Differences between two hosts. They differ in
- * address, port, or both.
- */
-enum host_diff_t {
-       HOST_DIFF_NONE = 0,
-       HOST_DIFF_ADDR = 1,
-       HOST_DIFF_PORT = 2,
-};
-
-/**
- * Representates a Host
- *
- * Host object, identifies a address:port pair and defines some
- * useful functions on it.
- */
-struct host_t {
-
-       /**
-        * Build a clone of this host object.
-        *
-        * @return              cloned host
-        */
-       host_t *(*clone) (host_t *this);
-
-       /**
-        * Get a pointer to the internal sockaddr struct.
-        *
-        * This is used for sending and receiving via sockets.
-        *
-        * @return              pointer to the internal sockaddr structure
-        */
-       sockaddr_t  *(*get_sockaddr) (host_t *this);
-
-       /**
-        * Get the length of the sockaddr struct.
-        *
-        * Depending on the family, the length of the sockaddr struct
-        * is different. Use this function to get the length of the sockaddr
-        * struct returned by get_sock_addr.
-        *
-        * This is used for sending and receiving via sockets.
-        *
-        * @return              length of the sockaddr struct
-        */
-       socklen_t *(*get_sockaddr_len) (host_t *this);
-
-       /**
-        * Gets the family of the address
-        *
-        * @return              family
-        */
-       int (*get_family) (host_t *this);
-
-       /**
-        * Checks if the ip address of host is set to default route.
-        *
-        * @return              TRUE if host is 0.0.0.0 or 0::0, FALSE otherwise
-        */
-       bool (*is_anyaddr) (host_t *this);
-
-       /**
-        * Get the address of this host as chunk_t
-        *
-        * Returned chunk points to internal data.
-        *
-        * @return              address string,
-        */
-       chunk_t (*get_address) (host_t *this);
-
-       /**
-        * Get the port of this host
-        *
-        * @return              port number
-        */
-       u_int16_t (*get_port) (host_t *this);
-
-       /**
-        * Set the port of this host
-        *
-        * @param port  port numer
-        */
-       void (*set_port) (host_t *this, u_int16_t port);
-
-       /**
-        * Compare the ips of two hosts hosts.
-        *
-        * @param other the other to compare
-        * @return              TRUE if addresses are equal.
-        */
-       bool (*ip_equals) (host_t *this, host_t *other);
-
-       /**
-        * Compare two hosts, with port.
-        *
-        * @param other the other to compare
-        * @return              TRUE if addresses and ports are equal.
-        */
-       bool (*equals) (host_t *this, host_t *other);
-
-       /**
-        * Compare two hosts and return the differences.
-        *
-        * @param other the other to compare
-        * @return              differences in a combination of host_diff_t's
-        */
-       host_diff_t (*get_differences) (host_t *this, host_t *other);
-
-       /**
-        * Destroy this host object.
-        */
-       void (*destroy) (host_t *this);
-};
-
-/**
- * Constructor to create a host_t object from an address string.
- *
- * @param string               string of an address, such as "152.96.193.130"
- * @param port                 port number
- * @return                             host_t, NULL if string not an address.
- */
-host_t *host_create_from_string(char *string, u_int16_t port);
-
-/**
- * Constructor to create a host_t from a DNS name.
- *
- * @param string               hostname to resolve
- * @param family               family to prefer, 0 for first match
- * @param port                 port number
- * @return                             host_t, NULL lookup failed
- */
-host_t *host_create_from_dns(char *string, int family, u_int16_t port);
-
-/**
- * Constructor to create a host_t object from an address chunk.
- *
- * If family is AF_UNSPEC, it is guessed using address.len.
- *
- * @param family               Address family, such as AF_INET or AF_INET6
- * @param address              address as chunk_t in network order
- * @param port                 port number
- * @return                             host_t, NULL if family not supported/chunk invalid
- */
-host_t *host_create_from_chunk(int family, chunk_t address, u_int16_t port);
-
-/**
- * Constructor to create a host_t object from a sockaddr struct
- *
- * @param sockaddr             sockaddr struct which contains family, address and port
- * @return                             host_t, NULL if family not supported
- */
-host_t *host_create_from_sockaddr(sockaddr_t *sockaddr);
-
-/**
- * Create a host from a CIDR subnet definition (1.2.3.0/24), return bits.
- *
- * @param string               string to parse
- * @param bits                 gets the number of network bits in CIDR notation
- * @return                             network start address, NULL on error
- */
-host_t *host_create_from_subnet(char *string, int *bits);
-
-/**
- * Create a host without an address, a "any" host.
- *
- * @param family               family of the any host
- * @return                             host_t, NULL if family not supported
- */
-host_t *host_create_any(int family);
-
-/**
- * printf hook function for host_t.
- *
- * Arguments are:
- *     host_t *host
- * Use #-modifier to include port number
- * Use +-modifier to force numeric representation (instead of e.g. %any)
- */
-int host_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
-                                        const void *const *args);
-
-#endif /** HOST_H_ @}*/
index 5c44401..b6e2819 100644 (file)
@@ -26,7 +26,7 @@
 typedef struct packet_t packet_t;
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 
 /**
  * Abstraction of an IP/UDP-Packet, contains data, sender and receiver.
index 71af038..be97432 100644 (file)
@@ -24,7 +24,7 @@
 #define TUN_DEVICE_H_
 
 #include <library.h>
-#include <utils/host.h>
+#include <networking/host.h>
 
 typedef struct tun_device_t tun_device_t;
 
index db44a2f..99e79ee 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef GATEWAY_H_
 #define GATEWAY_H_
 
-#include <utils/host.h>
+#include <networking/host.h>
 #include <utils/enumerator.h>
 
 typedef struct gateway_t gateway_t;