]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
Use distinct message types for HA message ID updates
authorMartin Willi <martin@revosec.ch>
Thu, 22 Jul 2010 11:20:18 +0000 (13:20 +0200)
committerMartin Willi <martin@revosec.ch>
Mon, 26 Jul 2010 08:15:17 +0000 (10:15 +0200)
src/libcharon/plugins/ha/ha_dispatcher.c
src/libcharon/plugins/ha/ha_ike.c
src/libcharon/plugins/ha/ha_message.c
src/libcharon/plugins/ha/ha_message.h

index b52a3a1f59e13fb78099a18e3f59c56185f7bef0..4f688c73a8346fae2517449d72c5f05a8b60ec26 100644 (file)
@@ -265,12 +265,6 @@ static void process_ike_update(private_ha_dispatcher_t *this,
                                set_condition(ike_sa, value.u32, COND_CERTREQ_SEEN);
                                set_condition(ike_sa, value.u32, COND_ORIGINAL_INITIATOR);
                                break;
-                       case HA_INITIATE_MID:
-                               ike_sa->set_message_id(ike_sa, TRUE, value.u32);
-                               break;
-                       case HA_RESPOND_MID:
-                               ike_sa->set_message_id(ike_sa, FALSE, value.u32);
-                               break;
                        default:
                                break;
                }
@@ -288,6 +282,46 @@ static void process_ike_update(private_ha_dispatcher_t *this,
        }
 }
 
+/**
+ * Process messages of type IKE_MID_INITIATOR/RESPONDER
+ */
+static void process_ike_mid(private_ha_dispatcher_t *this,
+                                                          ha_message_t *message, bool initiator)
+{
+       ha_message_attribute_t attribute;
+       ha_message_value_t value;
+       enumerator_t *enumerator;
+       ike_sa_t *ike_sa = NULL;
+       u_int32_t mid = 0;
+
+       enumerator = message->create_attribute_enumerator(message);
+       while (enumerator->enumerate(enumerator, &attribute, &value))
+       {
+               switch (attribute)
+               {
+                       case HA_IKE_ID:
+                               ike_sa = charon->ike_sa_manager->checkout(charon->ike_sa_manager,
+                                                                                                                 value.ike_sa_id);
+                               break;
+                       case HA_MID:
+                               mid = value.u32;
+                               break;
+                       default:
+                               break;
+               }
+       }
+       enumerator->destroy(enumerator);
+
+       if (ike_sa)
+       {
+               if (mid)
+               {
+                       ike_sa->set_message_id(ike_sa, initiator, mid);
+               }
+               charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
+       }
+}
+
 /**
  * Process messages of type IKE_DELETE
  */
@@ -676,6 +710,12 @@ static job_requeue_t dispatch(private_ha_dispatcher_t *this)
                case HA_IKE_UPDATE:
                        process_ike_update(this, message);
                        break;
+               case HA_IKE_MID_INITIATOR:
+                       process_ike_mid(this, message, TRUE);
+                       break;
+               case HA_IKE_MID_RESPONDER:
+                       process_ike_mid(this, message, FALSE);
+                       break;
                case HA_IKE_DELETE:
                        process_ike_delete(this, message);
                        break;
index 18b2f080775d610b566a29ba787732e5eba751d9..9c0919ac718a92991796e541457acd66d14a6e8f 100644 (file)
@@ -204,19 +204,17 @@ METHOD(listener_t, message_hook, bool,
                message->get_request(message))
        {       /* we sync on requests, but skip it on IKE_SA_INIT */
                ha_message_t *m;
-               u_int32_t mid;
 
-               m = ha_message_create(HA_IKE_UPDATE);
-               m->add_attribute(m, HA_IKE_ID, ike_sa->get_id(ike_sa));
-               mid = message->get_message_id(message) + 1;
                if (incoming)
                {
-                       m->add_attribute(m, HA_RESPOND_MID, mid);
+                       m = ha_message_create(HA_IKE_MID_RESPONDER);
                }
                else
                {
-                       m->add_attribute(m, HA_INITIATE_MID, mid);
+                       m = ha_message_create(HA_IKE_MID_INITIATOR);
                }
+               m->add_attribute(m, HA_IKE_ID, ike_sa->get_id(ike_sa));
+               m->add_attribute(m, HA_MID, message->get_message_id(message) + 1);
                this->socket->push(this->socket, m);
        }
        if (ike_sa->get_state(ike_sa) == IKE_ESTABLISHED &&
index ad431c75f4c1c4dee609a6f8bcd07b554f692e58..95380903c5d120764f60125e819e25bc3c95a86f 100644 (file)
@@ -232,8 +232,7 @@ METHOD(ha_message_t, add_attribute, void,
                case HA_EXTENSIONS:
                case HA_INBOUND_SPI:
                case HA_OUTBOUND_SPI:
-               case HA_INITIATE_MID:
-               case HA_RESPOND_MID:
+               case HA_MID:
                {
                        u_int32_t val;
 
@@ -445,8 +444,7 @@ METHOD(enumerator_t, attribute_enumerate, bool,
                case HA_EXTENSIONS:
                case HA_INBOUND_SPI:
                case HA_OUTBOUND_SPI:
-               case HA_INITIATE_MID:
-               case HA_RESPOND_MID:
+               case HA_MID:
                {
                        if (this->buf.len < sizeof(u_int32_t))
                        {
index 23d654946f3c9ad7ad21b39bd4eeb77b8614c1f6..6c92e1217be1cf85846875388c2ba5eb1229cabc 100644 (file)
@@ -30,7 +30,7 @@
 /**
  * Protocol version of this implementation
  */
-#define HA_MESSAGE_VERSION 1
+#define HA_MESSAGE_VERSION 2
 
 typedef struct ha_message_t ha_message_t;
 typedef enum ha_message_type_t ha_message_type_t;
@@ -43,8 +43,12 @@ typedef union ha_message_value_t ha_message_value_t;
 enum ha_message_type_t {
        /** add a completely new IKE_SA */
        HA_IKE_ADD = 1,
-       /** update an existing IKE_SA (message IDs, address update, ...) */
+       /** update an existing IKE_SA (identities, address update, ...) */
        HA_IKE_UPDATE,
+       /** update initiator message id */
+       HA_IKE_MID_INITIATOR,
+       /** update responder message id */
+       HA_IKE_MID_RESPONDER,
        /** delete an existing IKE_SA */
        HA_IKE_DELETE,
        /** add a new CHILD_SA */
@@ -123,10 +127,8 @@ enum ha_message_attribute_t {
        HA_LOCAL_TS,
        /** traffic_selector_t*, remote traffic selector */
        HA_REMOTE_TS,
-       /** u_int32_t, initiating message ID */
-       HA_INITIATE_MID,
-       /** u_int32_t, responding message ID */
-       HA_RESPOND_MID,
+       /** u_int32_t, message ID */
+       HA_MID,
        /** u_int16_t, HA segment */
        HA_SEGMENT,
 };