Use distinct message types for HA message ID updates
This commit is contained in:
@@ -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_CERTREQ_SEEN);
|
||||||
set_condition(ike_sa, value.u32, COND_ORIGINAL_INITIATOR);
|
set_condition(ike_sa, value.u32, COND_ORIGINAL_INITIATOR);
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
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
|
* Process messages of type IKE_DELETE
|
||||||
*/
|
*/
|
||||||
@@ -676,6 +710,12 @@ static job_requeue_t dispatch(private_ha_dispatcher_t *this)
|
|||||||
case HA_IKE_UPDATE:
|
case HA_IKE_UPDATE:
|
||||||
process_ike_update(this, message);
|
process_ike_update(this, message);
|
||||||
break;
|
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:
|
case HA_IKE_DELETE:
|
||||||
process_ike_delete(this, message);
|
process_ike_delete(this, message);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -204,19 +204,17 @@ METHOD(listener_t, message_hook, bool,
|
|||||||
message->get_request(message))
|
message->get_request(message))
|
||||||
{ /* we sync on requests, but skip it on IKE_SA_INIT */
|
{ /* we sync on requests, but skip it on IKE_SA_INIT */
|
||||||
ha_message_t *m;
|
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)
|
if (incoming)
|
||||||
{
|
{
|
||||||
m->add_attribute(m, HA_RESPOND_MID, mid);
|
m = ha_message_create(HA_IKE_MID_RESPONDER);
|
||||||
}
|
}
|
||||||
else
|
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);
|
this->socket->push(this->socket, m);
|
||||||
}
|
}
|
||||||
if (ike_sa->get_state(ike_sa) == IKE_ESTABLISHED &&
|
if (ike_sa->get_state(ike_sa) == IKE_ESTABLISHED &&
|
||||||
|
|||||||
@@ -232,8 +232,7 @@ METHOD(ha_message_t, add_attribute, void,
|
|||||||
case HA_EXTENSIONS:
|
case HA_EXTENSIONS:
|
||||||
case HA_INBOUND_SPI:
|
case HA_INBOUND_SPI:
|
||||||
case HA_OUTBOUND_SPI:
|
case HA_OUTBOUND_SPI:
|
||||||
case HA_INITIATE_MID:
|
case HA_MID:
|
||||||
case HA_RESPOND_MID:
|
|
||||||
{
|
{
|
||||||
u_int32_t val;
|
u_int32_t val;
|
||||||
|
|
||||||
@@ -445,8 +444,7 @@ METHOD(enumerator_t, attribute_enumerate, bool,
|
|||||||
case HA_EXTENSIONS:
|
case HA_EXTENSIONS:
|
||||||
case HA_INBOUND_SPI:
|
case HA_INBOUND_SPI:
|
||||||
case HA_OUTBOUND_SPI:
|
case HA_OUTBOUND_SPI:
|
||||||
case HA_INITIATE_MID:
|
case HA_MID:
|
||||||
case HA_RESPOND_MID:
|
|
||||||
{
|
{
|
||||||
if (this->buf.len < sizeof(u_int32_t))
|
if (this->buf.len < sizeof(u_int32_t))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
/**
|
/**
|
||||||
* Protocol version of this implementation
|
* Protocol version of this implementation
|
||||||
*/
|
*/
|
||||||
#define HA_MESSAGE_VERSION 1
|
#define HA_MESSAGE_VERSION 2
|
||||||
|
|
||||||
typedef struct ha_message_t ha_message_t;
|
typedef struct ha_message_t ha_message_t;
|
||||||
typedef enum ha_message_type_t ha_message_type_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 {
|
enum ha_message_type_t {
|
||||||
/** add a completely new IKE_SA */
|
/** add a completely new IKE_SA */
|
||||||
HA_IKE_ADD = 1,
|
HA_IKE_ADD = 1,
|
||||||
/** update an existing IKE_SA (message IDs, address update, ...) */
|
/** update an existing IKE_SA (identities, address update, ...) */
|
||||||
HA_IKE_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 */
|
/** delete an existing IKE_SA */
|
||||||
HA_IKE_DELETE,
|
HA_IKE_DELETE,
|
||||||
/** add a new CHILD_SA */
|
/** add a new CHILD_SA */
|
||||||
@@ -123,10 +127,8 @@ enum ha_message_attribute_t {
|
|||||||
HA_LOCAL_TS,
|
HA_LOCAL_TS,
|
||||||
/** traffic_selector_t*, remote traffic selector */
|
/** traffic_selector_t*, remote traffic selector */
|
||||||
HA_REMOTE_TS,
|
HA_REMOTE_TS,
|
||||||
/** u_int32_t, initiating message ID */
|
/** u_int32_t, message ID */
|
||||||
HA_INITIATE_MID,
|
HA_MID,
|
||||||
/** u_int32_t, responding message ID */
|
|
||||||
HA_RESPOND_MID,
|
|
||||||
/** u_int16_t, HA segment */
|
/** u_int16_t, HA segment */
|
||||||
HA_SEGMENT,
|
HA_SEGMENT,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user