instanciate first registered kernel interface immediately
authorMartin Willi <martin@strongswan.org>
Tue, 2 Jun 2009 07:59:40 +0000 (09:59 +0200)
committerMartin Willi <martin@strongswan.org>
Tue, 16 Jun 2009 15:27:24 +0000 (17:27 +0200)
src/charon/daemon.c
src/charon/kernel/kernel_interface.c
src/charon/kernel/kernel_interface.h

index e278360..1f96c24 100644 (file)
@@ -487,9 +487,6 @@ static bool initialize(private_daemon_t *this, bool syslog, level_t levels[])
        
        print_plugins();
        
-       /* create the kernel interfaces */
-       this->public.kernel_interface->create_interfaces(this->public.kernel_interface);
-       
 #ifdef INTEGRITY_TEST
        DBG1(DBG_DMN, "integrity test of libstrongswan code");
        if (fips_verify_hmac_signature(hmac_key, hmac_signature))
index 9ac7708..5188b79 100644 (file)
@@ -18,8 +18,6 @@
 #include <pthread.h>
 
 #include <daemon.h>
-#include <utils/linked_list.h>
-#include <utils/mutex.h>
 
 typedef struct private_kernel_interface_t private_kernel_interface_t;
 
@@ -34,16 +32,6 @@ struct private_kernel_interface_t {
        kernel_interface_t public;
        
        /**
-        * list of registered ipsec kernel interfaces
-        */
-       linked_list_t *ipsec_interfaces;
-       
-       /**
-        * list of registered network kernel interfaces
-        */
-       linked_list_t *net_interfaces;
-       
-       /**
         * ipsec interface
         */
        kernel_ipsec_t *ipsec;
@@ -52,11 +40,6 @@ struct private_kernel_interface_t {
         * network interface
         */
        kernel_net_t *net;
-       
-       /**
-        * locking mutex
-        */
-       mutex_t *mutex;
 };
 
 /**
@@ -65,6 +48,10 @@ struct private_kernel_interface_t {
 static status_t get_spi(private_kernel_interface_t *this, host_t *src, host_t *dst, 
                                 protocol_id_t protocol, u_int32_t reqid, u_int32_t *spi)
 {
+       if (!this->ipsec)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->ipsec->get_spi(this->ipsec, src, dst, protocol, reqid, spi);
 }
 
@@ -74,6 +61,10 @@ static status_t get_spi(private_kernel_interface_t *this, host_t *src, host_t *d
 static status_t get_cpi(private_kernel_interface_t *this, host_t *src, host_t *dst, 
                                        u_int32_t reqid, u_int16_t *cpi)
 {
+       if (!this->ipsec)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->ipsec->get_cpi(this->ipsec, src, dst, reqid, cpi);
 }
 
@@ -88,6 +79,10 @@ static status_t add_sa(private_kernel_interface_t *this, host_t *src, host_t *ds
                                ipsec_mode_t mode, u_int16_t ipcomp, u_int16_t cpi, bool encap,
                                bool inbound)
 {
+       if (!this->ipsec)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->ipsec->add_sa(this->ipsec, src, dst, spi, protocol, reqid,
                        expire_soft, expire_hard, enc_alg, enc_key, int_alg, int_key,
                        mode, ipcomp, cpi, encap, inbound);
@@ -100,6 +95,10 @@ static status_t update_sa(private_kernel_interface_t *this, u_int32_t spi,
                                   protocol_id_t protocol, u_int16_t cpi, host_t *src, host_t *dst, 
                                   host_t *new_src, host_t *new_dst, bool encap, bool new_encap)
 {
+       if (!this->ipsec)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->ipsec->update_sa(this->ipsec, spi, protocol, cpi, src, dst,
                        new_src, new_dst, encap, new_encap);
 }
@@ -110,6 +109,10 @@ static status_t update_sa(private_kernel_interface_t *this, u_int32_t spi,
 static status_t del_sa(private_kernel_interface_t *this, host_t *src, host_t *dst,
                                u_int32_t spi, protocol_id_t protocol, u_int16_t cpi)
 {
+       if (!this->ipsec)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->ipsec->del_sa(this->ipsec, src, dst, spi, protocol, cpi);
 }
 
@@ -122,6 +125,10 @@ static status_t add_policy(private_kernel_interface_t *this, host_t *src, host_t
                                        u_int32_t reqid, ipsec_mode_t mode, u_int16_t ipcomp, u_int16_t cpi,
                                        bool routed)
 {
+       if (!this->ipsec)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->ipsec->add_policy(this->ipsec, src, dst, src_ts, dst_ts,
                        direction, spi, protocol, reqid, mode, ipcomp, cpi, routed);
 }
@@ -133,6 +140,10 @@ static status_t query_policy(private_kernel_interface_t *this,
                                          traffic_selector_t *src_ts, traffic_selector_t *dst_ts,
                                          policy_dir_t direction, u_int32_t *use_time)
 {
+       if (!this->ipsec)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->ipsec->query_policy(this->ipsec, src_ts, dst_ts, direction, use_time);
 }
 
@@ -143,6 +154,10 @@ static status_t del_policy(private_kernel_interface_t *this,
                                        traffic_selector_t *src_ts, traffic_selector_t *dst_ts,
                                        policy_dir_t direction, bool unrouted)
 {
+       if (!this->ipsec)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->ipsec->del_policy(this->ipsec, src_ts, dst_ts, direction, unrouted);
 }
 
@@ -152,6 +167,10 @@ static status_t del_policy(private_kernel_interface_t *this,
 static host_t *get_source_addr(private_kernel_interface_t *this,
                                                           host_t *dest, host_t *src)
 {
+       if (!this->net)
+       {
+               return NULL;
+       }
        return this->net->get_source_addr(this->net, dest, src);
 }
 
@@ -160,6 +179,10 @@ static host_t *get_source_addr(private_kernel_interface_t *this,
  */
 static host_t *get_nexthop(private_kernel_interface_t *this, host_t *dest)
 {
+       if (!this->net)
+       {
+               return NULL;
+       }
        return this->net->get_nexthop(this->net, dest);
 }
 
@@ -168,6 +191,10 @@ static host_t *get_nexthop(private_kernel_interface_t *this, host_t *dest)
  */
 static char* get_interface(private_kernel_interface_t *this, host_t *host)
 {
+       if (!this->net)
+       {
+               return NULL;
+       }
        return this->net->get_interface(this->net, host);
 }
 
@@ -177,6 +204,10 @@ static char* get_interface(private_kernel_interface_t *this, host_t *host)
 static enumerator_t *create_address_enumerator(private_kernel_interface_t *this,
                bool include_down_ifaces, bool include_virtual_ips)
 {
+       if (!this->net)
+       {
+               return enumerator_create_empty();
+       }
        return this->net->create_address_enumerator(this->net, include_down_ifaces,
                        include_virtual_ips);
 }
@@ -187,6 +218,10 @@ static enumerator_t *create_address_enumerator(private_kernel_interface_t *this,
 static status_t add_ip(private_kernel_interface_t *this, host_t *virtual_ip,
                                host_t *iface_ip)
 {
+       if (!this->net)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->net->add_ip(this->net, virtual_ip, iface_ip);
 }
 
@@ -195,6 +230,10 @@ static status_t add_ip(private_kernel_interface_t *this, host_t *virtual_ip,
  */
 static status_t del_ip(private_kernel_interface_t *this, host_t *virtual_ip)
 {
+       if (!this->net)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->net->del_ip(this->net, virtual_ip);
 }
 
@@ -204,6 +243,10 @@ static status_t del_ip(private_kernel_interface_t *this, host_t *virtual_ip)
 static status_t add_route(private_kernel_interface_t *this, chunk_t dst_net,
                u_int8_t prefixlen, host_t *gateway, host_t *src_ip, char *if_name)
 {
+       if (!this->net)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->net->add_route(this->net, dst_net, prefixlen, gateway, src_ip,
                        if_name);
 }
@@ -214,6 +257,10 @@ static status_t add_route(private_kernel_interface_t *this, chunk_t dst_net,
 static status_t del_route(private_kernel_interface_t *this, chunk_t dst_net,
                u_int8_t prefixlen, host_t *gateway, host_t *src_ip, char *if_name)
 {
+       if (!this->net)
+       {
+               return NOT_SUPPORTED;
+       }
        return this->net->del_route(this->net, dst_net, prefixlen, gateway, src_ip,
                        if_name);
 }
@@ -281,70 +328,42 @@ static status_t get_address_by_ts(private_kernel_interface_t *this,
  * Implementation of kernel_interface_t.add_ipsec_interface.
  */
 static void add_ipsec_interface(private_kernel_interface_t *this,
-               kernel_ipsec_constructor_t *create)
+               kernel_ipsec_constructor_t constructor)
 {
-       this->mutex->lock(this->mutex);
-       this->ipsec_interfaces->insert_last(this->ipsec_interfaces, create);
-       this->mutex->unlock(this->mutex);
+       if (!this->ipsec)
+       {
+               this->ipsec = constructor();
+       }
 }
 
 /**
  * Implementation of kernel_interface_t.remove_ipsec_interface.
  */
 static void remove_ipsec_interface(private_kernel_interface_t *this,
-               kernel_ipsec_constructor_t *create)
+               kernel_ipsec_constructor_t constructor)
 {
-       this->mutex->lock(this->mutex);
-       this->ipsec_interfaces->remove(this->ipsec_interfaces, create, NULL);
-       this->mutex->unlock(this->mutex);
+       /* TODO: replace if interface currently in use */
 }
 
 /**
  * Implementation of kernel_interface_t.add_net_interface.
  */
 static void add_net_interface(private_kernel_interface_t *this,
-               kernel_net_constructor_t *create)
+               kernel_net_constructor_t constructor)
 {
-       this->mutex->lock(this->mutex);
-       this->net_interfaces->insert_last(this->net_interfaces, create);
-       this->mutex->unlock(this->mutex);
+       if (!this->net)
+       {
+               this->net = constructor();
+       }
 }
 
 /**
  * Implementation of kernel_interface_t.remove_net_interface.
  */
 static void remove_net_interface(private_kernel_interface_t *this,
-               kernel_net_constructor_t *create)
-{
-       this->mutex->lock(this->mutex);
-       this->net_interfaces->remove(this->net_interfaces, create, NULL);
-       this->mutex->unlock(this->mutex);
-}
-
-/**
- * Implementation of kernel_interface_t.create_interfaces.
- */
-static void create_interfaces(private_kernel_interface_t *this)
+               kernel_net_constructor_t constructor)
 {
-       kernel_ipsec_constructor_t create_ipsec;
-       kernel_net_constructor_t create_net;
-       
-       this->mutex->lock(this->mutex);
-       if (this->ipsec_interfaces->get_first(this->ipsec_interfaces, (void**)&create_ipsec) != SUCCESS)
-       {
-               this->mutex->unlock(this->mutex);
-               charon->kill(charon, "no ipsec kernel interface loaded");
-       }
-       
-       if (this->net_interfaces->get_first(this->net_interfaces, (void**)&create_net) != SUCCESS)
-       {
-               this->mutex->unlock(this->mutex);
-               charon->kill(charon, "no network kernel interface loaded");
-       }
-       this->mutex->unlock(this->mutex);
-       
-       this->ipsec = create_ipsec();
-       this->net = create_net();
+       /* TODO: replace if interface currently in use */
 }
 
 /**
@@ -354,9 +373,6 @@ static void destroy(private_kernel_interface_t *this)
 {
        DESTROY_IF(this->ipsec);
        DESTROY_IF(this->net);
-       this->ipsec_interfaces->destroy(this->ipsec_interfaces);
-       this->net_interfaces->destroy(this->net_interfaces);
-       this->mutex->destroy(this->mutex);
        free(this);
 }
 
@@ -392,12 +408,8 @@ kernel_interface_t *kernel_interface_create()
        this->public.add_net_interface = (void(*)(kernel_interface_t*, kernel_net_constructor_t))add_net_interface;
        this->public.remove_net_interface = (void(*)(kernel_interface_t*, kernel_net_constructor_t))remove_net_interface;
        
-       this->public.create_interfaces = (void (*)(kernel_interface_t*))create_interfaces;
        this->public.destroy = (void (*)(kernel_interface_t*))destroy;
        
-       this->ipsec_interfaces = linked_list_create();
-       this->net_interfaces = linked_list_create();
-       this->mutex = mutex_create(MUTEX_RECURSIVE);
        this->ipsec = NULL;
        this->net = NULL;
        
index 93c89f6..8c58c95 100644 (file)
@@ -363,11 +363,6 @@ struct kernel_interface_t {
        void (*remove_net_interface)(kernel_interface_t *this, kernel_net_constructor_t create);
        
        /**
-        * Create the kernel interfaces classes.
-        */
-       void (*create_interfaces)(kernel_interface_t *this);
-       
-       /**
         * Destroys a kernel_interface_manager_t object.
         */
        void (*destroy) (kernel_interface_t *this);