fixed a bug introduced in [3973]
[strongswan.git] / src / charon / config / ike_cfg.c
index 35f46a6..b92cb98 100644 (file)
@@ -1,10 +1,3 @@
-/**
- * @file ike_cfg.c
- *
- * @brief Implementation of ike_cfg_t.
- *
- */
-
 /*
  * Copyright (C) 2005-2007 Martin Willi
  * Copyright (C) 2005 Jan Hutter
@@ -19,6 +12,8 @@
  * 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.
+ *
+ * $Id$
  */
 
 #include "ike_cfg.h"
@@ -59,6 +54,11 @@ struct private_ike_cfg_t {
        bool certreq;
        
        /**
+        * enforce UDP encapsulation
+        */
+       bool force_encap;
+       
+       /**
         * List of proposals to use
         */
        linked_list_t *proposals;
@@ -71,6 +71,14 @@ static bool send_certreq(private_ike_cfg_t *this)
 {
        return this->certreq;
 }
+       
+/**
+ * Implementation of ike_cfg_t.force_encap.
+ */
+static bool force_encap_meth(private_ike_cfg_t *this)
+{
+       return this->force_encap;
+}
 
 /**
  * Implementation of ike_cfg_t.get_my_host.
@@ -157,30 +165,71 @@ static proposal_t *select_proposal(private_ike_cfg_t *this,
  */
 static diffie_hellman_group_t get_dh_group(private_ike_cfg_t *this)
 {
-       iterator_t *iterator;
+       enumerator_t *enumerator;
        proposal_t *proposal;
-       algorithm_t *algo;
-       diffie_hellman_group_t dh_group = MODP_NONE;
+       u_int16_t dh_group = MODP_NONE;
        
-       iterator = this->proposals->create_iterator(this->proposals, TRUE);
-       while (iterator->iterate(iterator, (void**)&proposal))
+       enumerator = this->proposals->create_enumerator(this->proposals);
+       while (enumerator->enumerate(enumerator, &proposal))
        {
-               if (proposal->get_algorithm(proposal, DIFFIE_HELLMAN_GROUP, &algo))
+               if (proposal->get_algorithm(proposal, DIFFIE_HELLMAN_GROUP, &dh_group, NULL))
                {
-                       dh_group = algo->algorithm;
                        break;
                }
        }
-       iterator->destroy(iterator);
+       enumerator->destroy(enumerator);
        return dh_group;
 }
 
 /**
+ * Implementation of ike_cfg_t.equals.
+ */
+static bool equals(private_ike_cfg_t *this, private_ike_cfg_t *other)
+{
+       enumerator_t *e1, *e2;
+       proposal_t *p1, *p2;
+       bool eq = TRUE;
+       
+       if (this == other)
+       {
+               return TRUE;
+       }
+       if (this->public.equals != other->public.equals)
+       {
+               return FALSE;
+       }
+       if (this->proposals->get_count(this->proposals) !=
+               other->proposals->get_count(other->proposals))
+       {
+               return FALSE;
+       }
+       e1 = this->proposals->create_enumerator(this->proposals);
+       e2 = this->proposals->create_enumerator(this->proposals);
+       while (e1->enumerate(e1, &p1) && e2->enumerate(e2, &p2))
+       {
+               if (!p1->equals(p1, p2))
+               {
+                       eq = FALSE;
+                       break;
+               }
+       }
+       e1->destroy(e1);
+       e2->destroy(e2);
+
+       return (eq &&
+               this->certreq == other->certreq &&
+               this->force_encap == other->force_encap &&
+               this->my_host->equals(this->my_host, other->my_host) &&
+               this->other_host->equals(this->other_host, other->other_host));
+}
+
+/**
  * Implementation of ike_cfg_t.get_ref.
  */
-static void get_ref(private_ike_cfg_t *this)
+static ike_cfg_t* get_ref(private_ike_cfg_t *this)
 {
        ref_get(&this->refcount);
+       return &this->public;
 }
 
 /**
@@ -201,24 +250,28 @@ static void destroy(private_ike_cfg_t *this)
 /**
  * Described in header.
  */
-ike_cfg_t *ike_cfg_create(bool certreq, host_t *my_host, host_t *other_host)
+ike_cfg_t *ike_cfg_create(bool certreq, bool force_encap,
+                                                 host_t *my_host, host_t *other_host)
 {
        private_ike_cfg_t *this = malloc_thing(private_ike_cfg_t);
        
        /* public functions */
        this->public.send_certreq = (bool(*)(ike_cfg_t*))send_certreq;
+       this->public.force_encap = (bool (*) (ike_cfg_t *))force_encap_meth;
        this->public.get_my_host = (host_t*(*)(ike_cfg_t*))get_my_host;
        this->public.get_other_host = (host_t*(*)(ike_cfg_t*))get_other_host;
        this->public.add_proposal = (void(*)(ike_cfg_t*, proposal_t*)) add_proposal;
        this->public.get_proposals = (linked_list_t*(*)(ike_cfg_t*))get_proposals;
        this->public.select_proposal = (proposal_t*(*)(ike_cfg_t*,linked_list_t*))select_proposal;
        this->public.get_dh_group = (diffie_hellman_group_t(*)(ike_cfg_t*)) get_dh_group;
-       this->public.get_ref = (void(*)(ike_cfg_t*))get_ref;
+       this->public.equals = (bool(*)(ike_cfg_t*,ike_cfg_t*)) equals;
+       this->public.get_ref = (ike_cfg_t*(*)(ike_cfg_t*))get_ref;
        this->public.destroy = (void(*)(ike_cfg_t*))destroy;
        
        /* private variables */
        this->refcount = 1;
        this->certreq = certreq;
+       this->force_encap = force_encap;
        this->my_host = my_host;
        this->other_host = other_host;