attribute-manager: Pass full IKE_SA to handler methods

This commit is contained in:
Martin Willi
2015-02-20 13:34:56 +01:00
parent a16058a491
commit a12f357b40
5 changed files with 28 additions and 23 deletions
+17 -7
View File
@@ -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),
); );
+6 -7
View File
@@ -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.
+1 -1
View File
@@ -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);
} }
+2 -4
View File
@@ -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);
+2 -4
View File
@@ -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;