free(this);
}
+/**
+ * Convert segment string to mask
+ */
+static segment_mask_t parse_active(char *active)
+{
+ enumerator_t *enumerator;
+ u_int segment;
+ segment_mask_t mask = 0;
+
+ enumerator = enumerator_create_token(active, ",", " ");
+ while (enumerator->enumerate(enumerator, &active))
+ {
+ segment = atoi(active);
+ if (segment > 0 && segment < SEGMENTS_MAX)
+ {
+ mask |= SEGMENTS_BIT(segment);
+ }
+ }
+ enumerator->destroy(enumerator);
+
+ return mask;
+}
+
/*
* see header file
*/
{
private_ha_sync_plugin_t *this;
char *local, *remote, *secret;
+ segment_mask_t active;
+ u_int count;
bool fifo;
local = lib->settings->get_str(lib->settings,
"charon.plugins.ha_sync.secret", NULL);
fifo = lib->settings->get_bool(lib->settings,
"charon.plugins.ha_sync.fifo_interface", FALSE);
+ count = min(SEGMENTS_MAX, lib->settings->get_int(lib->settings,
+ "charon.plugins.ha_sync.segment_count", 1));
+ active = parse_active(lib->settings->get_str(lib->settings,
+ "charon.plugins.ha_sync.active_segments", "1"));
if (!local || !remote)
{
DBG1(DBG_CFG, "HA sync config misses local/remote address");
free(this);
return NULL;
}
- this->segments = ha_sync_segments_create(this->socket);
+ this->segments = ha_sync_segments_create(this->socket, count, active);
if (secret)
{
this->tunnel = ha_sync_tunnel_create(secret, local, remote);
#include <linux/jhash.h>
-#define MAX_SEGMENTS 16
-
typedef struct private_ha_sync_segments_t private_ha_sync_segments_t;
/**
/**
* mask of active segments
*/
- u_int16_t active;
+ segment_mask_t active;
};
/**
segment, activated ? "" : "de", buf);
}
-/**
- * Get the bit of the segment in the bitmask
- */
-static inline u_int16_t bit_of(u_int segment)
-{
- return 0x01 << (segment - 1);
-}
-
/**
* Enable/Disable an an IKE_SA.
*/
{
if (enable)
{
- this->active |= bit_of(i);
+ this->active |= SEGMENTS_BIT(i);
}
else
{
- this->active &= ~bit_of(i);
+ this->active &= ~SEGMENTS_BIT(i);
}
}
enumerator = charon->ike_sa_manager->create_enumerator(charon->ike_sa_manager);
enumerator_t *enumerator;
linked_list_t *list;
ike_sa_id_t *id;
- u_int16_t mask = bit_of(segment);
+ u_int16_t mask = SEGMENTS_BIT(segment);
list = linked_list_create();
this->lock->read_lock(this->lock);
/**
* See header
*/
-ha_sync_segments_t *ha_sync_segments_create(ha_sync_socket_t *socket)
+ha_sync_segments_t *ha_sync_segments_create(ha_sync_socket_t *socket,
+ u_int count, segment_mask_t active)
{
private_ha_sync_segments_t *this = malloc_thing(private_ha_sync_segments_t);
- enumerator_t *enumerator;
- u_int segment;
- char *str;
this->public.activate = (void(*)(ha_sync_segments_t*, u_int segment,bool))activate;
this->public.deactivate = (void(*)(ha_sync_segments_t*, u_int segment,bool))deactivate;
this->socket = socket;
this->lock = rwlock_create(RWLOCK_TYPE_DEFAULT);
this->initval = 0;
- this->active = 0;
- this->segment_count = lib->settings->get_int(lib->settings,
- "charon.plugins.ha_sync.segment_count", 1);
- this->segment_count = min(this->segment_count, MAX_SEGMENTS);
- str = lib->settings->get_str(lib->settings,
- "charon.plugins.ha_sync.active_segments", "1");
- enumerator = enumerator_create_token(str, ",", " ");
- while (enumerator->enumerate(enumerator, &str))
- {
- segment = atoi(str);
- if (segment > 0 && segment < MAX_SEGMENTS)
- {
- this->active |= bit_of(segment);
- }
- }
- enumerator->destroy(enumerator);
+ this->active = active;
+ this->segment_count = count;
return &this->public;
}
typedef struct ha_sync_segments_t ha_sync_segments_t;
+typedef u_int16_t segment_mask_t;
+
+/**
+ * maximum number of segments
+ */
+#define SEGMENTS_MAX (sizeof(segment_mask_t)*8)
+
+/**
+ * Get the bit in the mask of a segment
+ */
+#define SEGMENTS_BIT(segment) (0x01 << (segment - 1))
+
/**
* Segmentation of peers into active and passive.
*/
* Create a ha_sync_segments instance.
*
* @param socket socket to communicate segment (de-)activation
+ * @param count number of segments the cluster uses
+ * @param active bit mask of initially active segments
* @return segment object
*/
-ha_sync_segments_t *ha_sync_segments_create(ha_sync_socket_t *socket);
+ha_sync_segments_t *ha_sync_segments_create(ha_sync_socket_t *socket,
+ u_int count, segment_mask_t active);
#endif /* HA_SYNC_SEGMENTS_ @}*/