this->segments->handle_status(this->segments, mask);
}
+/**
+ * Process messages of type RESYNC
+ */
+static void process_resync(private_ha_dispatcher_t *this,
+ ha_message_t *message)
+{
+ ha_message_attribute_t attribute;
+ ha_message_value_t value;
+ enumerator_t *enumerator;
+
+ enumerator = message->create_attribute_enumerator(message);
+ while (enumerator->enumerate(enumerator, &attribute, &value))
+ {
+ switch (attribute)
+ {
+ case HA_SEGMENT:
+ this->segments->resync(this->segments, value.u16);
+ break;
+ default:
+ break;
+ }
+ }
+ enumerator->destroy(enumerator);
+}
+
/**
* Dispatcher job function
*/
case HA_STATUS:
process_status(this, message);
break;
+ case HA_RESYNC:
+ process_resync(this, message);
+ break;
default:
DBG1(DBG_CFG, "received unknown HA message type %d",
message->get_type(message));
enumerator_t *enumerator;
linked_list_t *list;
ike_sa_id_t *id;
- u_int16_t mask = SEGMENTS_BIT(segment);
list = linked_list_create();
this->mutex->lock(this->mutex);
- if (segment > 0 && segment <= this->count && (this->active & mask))
+ if (segment > 0 && segment <= this->count)
{
- this->active &= ~mask;
-
DBG1(DBG_CFG, "resyncing HA segment %d", segment);
/* we do the actual rekeying in a seperate loop to avoid rekeying
return TRUE;
}
+/**
+ * Request a resync of all segments
+ */
+static job_requeue_t request_resync(private_ha_segments_t *this)
+{
+ ha_message_t *message;
+ int i;
+
+ message = ha_message_create(HA_RESYNC);
+ for (i = 1; i <= this->count; i++)
+ {
+ message->add_attribute(message, HA_SEGMENT, i);
+ }
+ this->socket->push(this->socket, message);
+ return JOB_REQUEUE_NONE;
+}
+
/**
* Monitor heartbeat activity of remote node
*/
this->condvar = condvar_create(CONDVAR_TYPE_DEFAULT);
this->count = count;
this->master = strcmp(local, remote) > 0;
+ this->job = NULL;
/* initially all segments are deactivated */
this->active = 0;
start_watchdog(this);
+ /* request a resync as soon as we are up */
+ charon->processor->queue_job(charon->processor, (job_t*)
+ callback_job_create((callback_job_cb_t)request_resync,
+ this, NULL, NULL));
+
return &this->public;
}