attribute-manager: Pass full IKE_SA to handler methods
This commit is contained in:
@@ -162,13 +162,16 @@ METHOD(attribute_manager_t, remove_provider, void,
|
|||||||
}
|
}
|
||||||
|
|
||||||
METHOD(attribute_manager_t, handle, attribute_handler_t*,
|
METHOD(attribute_manager_t, handle, attribute_handler_t*,
|
||||||
private_attribute_manager_t *this, identification_t *server,
|
private_attribute_manager_t *this, ike_sa_t *ike_sa,
|
||||||
attribute_handler_t *handler, configuration_attribute_type_t type,
|
attribute_handler_t *handler, configuration_attribute_type_t type,
|
||||||
chunk_t data)
|
chunk_t data)
|
||||||
{
|
{
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
|
identification_t *server;
|
||||||
attribute_handler_t *current, *handled = NULL;
|
attribute_handler_t *current, *handled = NULL;
|
||||||
|
|
||||||
|
server = ike_sa->get_other_id(ike_sa);
|
||||||
|
|
||||||
this->lock->read_lock(this->lock);
|
this->lock->read_lock(this->lock);
|
||||||
|
|
||||||
/* try to find the passed handler */
|
/* try to find the passed handler */
|
||||||
@@ -207,10 +210,13 @@ METHOD(attribute_manager_t, handle, attribute_handler_t*,
|
|||||||
|
|
||||||
METHOD(attribute_manager_t, release, void,
|
METHOD(attribute_manager_t, release, void,
|
||||||
private_attribute_manager_t *this, attribute_handler_t *handler,
|
private_attribute_manager_t *this, attribute_handler_t *handler,
|
||||||
identification_t *server, configuration_attribute_type_t type, chunk_t data)
|
ike_sa_t *ike_sa, configuration_attribute_type_t type, chunk_t data)
|
||||||
{
|
{
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
attribute_handler_t *current;
|
attribute_handler_t *current;
|
||||||
|
identification_t *server;
|
||||||
|
|
||||||
|
server = ike_sa->get_other_id(ike_sa);
|
||||||
|
|
||||||
this->lock->read_lock(this->lock);
|
this->lock->read_lock(this->lock);
|
||||||
enumerator = this->handlers->create_enumerator(this->handlers);
|
enumerator = this->handlers->create_enumerator(this->handlers);
|
||||||
@@ -240,8 +246,8 @@ typedef struct {
|
|||||||
enumerator_t *outer;
|
enumerator_t *outer;
|
||||||
/** inner enumerator over current handlers attributes */
|
/** inner enumerator over current handlers attributes */
|
||||||
enumerator_t *inner;
|
enumerator_t *inner;
|
||||||
/** server ID we want attributes for */
|
/** IKE_SA to request attributes for */
|
||||||
identification_t *id;
|
ike_sa_t *ike_sa;
|
||||||
/** virtual IPs we are requesting along with attriubutes */
|
/** virtual IPs we are requesting along with attriubutes */
|
||||||
linked_list_t *vips;
|
linked_list_t *vips;
|
||||||
} initiator_enumerator_t;
|
} initiator_enumerator_t;
|
||||||
@@ -254,6 +260,10 @@ static bool initiator_enumerate(initiator_enumerator_t *this,
|
|||||||
configuration_attribute_type_t *type,
|
configuration_attribute_type_t *type,
|
||||||
chunk_t *value)
|
chunk_t *value)
|
||||||
{
|
{
|
||||||
|
identification_t *id;
|
||||||
|
|
||||||
|
id = this->ike_sa->get_other_id(this->ike_sa);
|
||||||
|
|
||||||
/* enumerate inner attributes using outer handler enumerator */
|
/* enumerate inner attributes using outer handler enumerator */
|
||||||
while (!this->inner || !this->inner->enumerate(this->inner, type, value))
|
while (!this->inner || !this->inner->enumerate(this->inner, type, value))
|
||||||
{
|
{
|
||||||
@@ -263,7 +273,7 @@ static bool initiator_enumerate(initiator_enumerator_t *this,
|
|||||||
}
|
}
|
||||||
DESTROY_IF(this->inner);
|
DESTROY_IF(this->inner);
|
||||||
this->inner = this->handler->create_attribute_enumerator(this->handler,
|
this->inner = this->handler->create_attribute_enumerator(this->handler,
|
||||||
this->id, this->vips);
|
id, this->vips);
|
||||||
}
|
}
|
||||||
/* inject the handler as additional attribute */
|
/* inject the handler as additional attribute */
|
||||||
*handler = this->handler;
|
*handler = this->handler;
|
||||||
@@ -282,7 +292,7 @@ static void initiator_destroy(initiator_enumerator_t *this)
|
|||||||
}
|
}
|
||||||
|
|
||||||
METHOD(attribute_manager_t, create_initiator_enumerator, enumerator_t*,
|
METHOD(attribute_manager_t, create_initiator_enumerator, enumerator_t*,
|
||||||
private_attribute_manager_t *this, identification_t *id, linked_list_t *vips)
|
private_attribute_manager_t *this, ike_sa_t *ike_sa, linked_list_t *vips)
|
||||||
{
|
{
|
||||||
initiator_enumerator_t *enumerator;
|
initiator_enumerator_t *enumerator;
|
||||||
|
|
||||||
@@ -294,7 +304,7 @@ METHOD(attribute_manager_t, create_initiator_enumerator, enumerator_t*,
|
|||||||
.destroy = (void*)initiator_destroy,
|
.destroy = (void*)initiator_destroy,
|
||||||
},
|
},
|
||||||
.this = this,
|
.this = this,
|
||||||
.id = id,
|
.ike_sa = ike_sa,
|
||||||
.vips = vips,
|
.vips = vips,
|
||||||
.outer = this->handlers->create_enumerator(this->handlers),
|
.outer = this->handlers->create_enumerator(this->handlers),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -92,38 +92,37 @@ struct attribute_manager_t {
|
|||||||
/**
|
/**
|
||||||
* Handle a configuration attribute by passing them to the handlers.
|
* Handle a configuration attribute by passing them to the handlers.
|
||||||
*
|
*
|
||||||
* @param server server from which the attribute was received
|
* @param ike_sa associated IKE_SA to handle an attribute for
|
||||||
* @param handler handler we requested the attribute for, if any
|
* @param handler handler we requested the attribute for, if any
|
||||||
* @param type type of configuration attribute
|
* @param type type of configuration attribute
|
||||||
* @param data associated attribute data
|
* @param data associated attribute data
|
||||||
* @return handler which handled this attribute, NULL if none
|
* @return handler which handled this attribute, NULL if none
|
||||||
*/
|
*/
|
||||||
attribute_handler_t* (*handle)(attribute_manager_t *this,
|
attribute_handler_t* (*handle)(attribute_manager_t *this,
|
||||||
identification_t *server, attribute_handler_t *handler,
|
ike_sa_t *ike_sa, attribute_handler_t *handler,
|
||||||
configuration_attribute_type_t type, chunk_t data);
|
configuration_attribute_type_t type, chunk_t data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Release an attribute previously handle()d by a handler.
|
* Release an attribute previously handle()d by a handler.
|
||||||
*
|
*
|
||||||
* @param handler handler returned by handle() for this attribute
|
* @param ike_sa associated IKE_SA to release an attribute for
|
||||||
* @param server server from which the attribute was received
|
* @param server server from which the attribute was received
|
||||||
* @param type type of attribute to release
|
* @param type type of attribute to release
|
||||||
* @param data associated attribute data
|
* @param data associated attribute data
|
||||||
*/
|
*/
|
||||||
void (*release)(attribute_manager_t *this, attribute_handler_t *handler,
|
void (*release)(attribute_manager_t *this, attribute_handler_t *handler,
|
||||||
identification_t *server,
|
ike_sa_t *ike_sa, configuration_attribute_type_t type,
|
||||||
configuration_attribute_type_t type,
|
|
||||||
chunk_t data);
|
chunk_t data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an enumerator over attributes to request from server.
|
* Create an enumerator over attributes to request from server.
|
||||||
*
|
*
|
||||||
* @param id server identity to hand out attributes to
|
* @param ike_sa associated IKE_SA to request attributes for
|
||||||
* @param vip list of virtual IPs (host_t*) going to request
|
* @param vip list of virtual IPs (host_t*) going to request
|
||||||
* @return enumerator (attribute_handler_t, ca_type_t, chunk_t)
|
* @return enumerator (attribute_handler_t, ca_type_t, chunk_t)
|
||||||
*/
|
*/
|
||||||
enumerator_t* (*create_initiator_enumerator)(attribute_manager_t *this,
|
enumerator_t* (*create_initiator_enumerator)(attribute_manager_t *this,
|
||||||
identification_t *id, linked_list_t *vips);
|
ike_sa_t *ike_sa, linked_list_t *vips);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register an attribute handler to the manager.
|
* Register an attribute handler to the manager.
|
||||||
|
|||||||
@@ -2347,7 +2347,7 @@ METHOD(ike_sa_t, destroy, void,
|
|||||||
if (entry.handler)
|
if (entry.handler)
|
||||||
{
|
{
|
||||||
charon->attributes->release(charon->attributes, entry.handler,
|
charon->attributes->release(charon->attributes, entry.handler,
|
||||||
this->other_id, entry.type, entry.data);
|
&this->public, entry.type, entry.data);
|
||||||
}
|
}
|
||||||
free(entry.data.ptr);
|
free(entry.data.ptr);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,8 +136,7 @@ static void handle_attribute(private_mode_config_t *this,
|
|||||||
|
|
||||||
/* and pass it to the handle function */
|
/* and pass it to the handle function */
|
||||||
handler = charon->attributes->handle(charon->attributes,
|
handler = charon->attributes->handle(charon->attributes,
|
||||||
this->ike_sa->get_other_id(this->ike_sa), handler,
|
this->ike_sa, handler, ca->get_type(ca), ca->get_chunk(ca));
|
||||||
ca->get_type(ca), ca->get_chunk(ca));
|
|
||||||
this->ike_sa->add_configuration_attribute(this->ike_sa,
|
this->ike_sa->add_configuration_attribute(this->ike_sa,
|
||||||
handler, ca->get_type(ca), ca->get_chunk(ca));
|
handler, ca->get_type(ca), ca->get_chunk(ca));
|
||||||
}
|
}
|
||||||
@@ -326,8 +325,7 @@ static status_t build_request(private_mode_config_t *this, message_t *message)
|
|||||||
}
|
}
|
||||||
|
|
||||||
enumerator = charon->attributes->create_initiator_enumerator(
|
enumerator = charon->attributes->create_initiator_enumerator(
|
||||||
charon->attributes,
|
charon->attributes, this->ike_sa, vips);
|
||||||
this->ike_sa->get_other_id(this->ike_sa), vips);
|
|
||||||
while (enumerator->enumerate(enumerator, &handler, &type, &data))
|
while (enumerator->enumerate(enumerator, &handler, &type, &data))
|
||||||
{
|
{
|
||||||
add_attribute(this, cp, type, data, handler);
|
add_attribute(this, cp, type, data, handler);
|
||||||
|
|||||||
@@ -127,8 +127,7 @@ static void handle_attribute(private_ike_config_t *this,
|
|||||||
|
|
||||||
/* and pass it to the handle function */
|
/* and pass it to the handle function */
|
||||||
handler = charon->attributes->handle(charon->attributes,
|
handler = charon->attributes->handle(charon->attributes,
|
||||||
this->ike_sa->get_other_id(this->ike_sa), handler,
|
this->ike_sa, handler, ca->get_type(ca), ca->get_chunk(ca));
|
||||||
ca->get_type(ca), ca->get_chunk(ca));
|
|
||||||
this->ike_sa->add_configuration_attribute(this->ike_sa,
|
this->ike_sa->add_configuration_attribute(this->ike_sa,
|
||||||
handler, ca->get_type(ca), ca->get_chunk(ca));
|
handler, ca->get_type(ca), ca->get_chunk(ca));
|
||||||
}
|
}
|
||||||
@@ -274,8 +273,7 @@ METHOD(task_t, build_i, status_t,
|
|||||||
}
|
}
|
||||||
|
|
||||||
enumerator = charon->attributes->create_initiator_enumerator(
|
enumerator = charon->attributes->create_initiator_enumerator(
|
||||||
charon->attributes,
|
charon->attributes, this->ike_sa, vips);
|
||||||
this->ike_sa->get_other_id(this->ike_sa), vips);
|
|
||||||
while (enumerator->enumerate(enumerator, &handler, &type, &data))
|
while (enumerator->enumerate(enumerator, &handler, &type, &data))
|
||||||
{
|
{
|
||||||
configuration_attribute_t *ca;
|
configuration_attribute_t *ca;
|
||||||
|
|||||||
Reference in New Issue
Block a user