aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/charon/charon/network/socket.c3
-rw-r--r--src/charon/charon/sa/ike_sa_manager.c31
-rw-r--r--src/charon/charon/sa/ike_sa_manager.h9
-rwxr-xr-xsrc/charon/charon/threads/stroke_interface.c48
-rw-r--r--src/charon/doc/Known-bugs.txt1
5 files changed, 58 insertions, 34 deletions
diff --git a/src/charon/charon/network/socket.c b/src/charon/charon/network/socket.c
index 32ff84538..4193e6fd8 100644
--- a/src/charon/charon/network/socket.c
+++ b/src/charon/charon/network/socket.c
@@ -367,8 +367,7 @@ static status_t build_interface_list(private_socket_t *this, u_int16_t port)
/* add socket with interface name to list */
interface = malloc_thing(interface_t);
- memcpy(interface->name, buf[i].ifr_name, IFNAMSIZ);
- interface->name[IFNAMSIZ-1] = '\0';
+ strncpy(interface->name, buf[i].ifr_name, IFNAMSIZ);
interface->socket_fd = skt;
interface->address = host_create_from_sockaddr((struct sockaddr*)current);
this->logger->log(this->logger, CONTROL, "listening on %s (%s)",
diff --git a/src/charon/charon/sa/ike_sa_manager.c b/src/charon/charon/sa/ike_sa_manager.c
index 01f3f5ad2..38e9ba3a0 100644
--- a/src/charon/charon/sa/ike_sa_manager.c
+++ b/src/charon/charon/sa/ike_sa_manager.c
@@ -574,6 +574,36 @@ linked_list_t *get_ike_sa_list(private_ike_sa_manager_t* this)
}
/**
+ * Implementation of ike_sa_manager_t.get_ike_sa_list_by_name.
+ */
+linked_list_t *get_ike_sa_list_by_name(private_ike_sa_manager_t* this, const char *name)
+{
+ linked_list_t *list;
+ iterator_t *iterator;
+
+ pthread_mutex_lock(&(this->mutex));
+
+ list = linked_list_create();
+ iterator = this->ike_sa_list->create_iterator(this->ike_sa_list, TRUE);
+ while (iterator->has_next(iterator))
+ {
+ ike_sa_entry_t *entry;
+ connection_t *connection;
+
+ iterator->current(iterator, (void**)&entry);
+ connection = entry->ike_sa->get_connection(entry->ike_sa);
+ if (strcmp(name, connection->get_name(connection)) == 0)
+ {
+ list->insert_last(list, (void*)entry->ike_sa_id->clone(entry->ike_sa_id));
+ }
+ }
+ iterator->destroy(iterator);
+
+ pthread_mutex_unlock(&(this->mutex));
+ return list;
+}
+
+/**
* Implementation of ike_sa_manager_t.log_status.
*/
static void log_status(private_ike_sa_manager_t* this, logger_t* logger, char* name)
@@ -788,6 +818,7 @@ ike_sa_manager_t *ike_sa_manager_create()
this->public.checkout = (status_t(*)(ike_sa_manager_t*, ike_sa_id_t*,ike_sa_t**))checkout;
this->public.checkout_by_hosts = (status_t(*)(ike_sa_manager_t*,host_t*,host_t*,ike_sa_t**))checkout_by_hosts;
this->public.get_ike_sa_list = (linked_list_t*(*)(ike_sa_manager_t*))get_ike_sa_list;
+ this->public.get_ike_sa_list_by_name = (linked_list_t*(*)(ike_sa_manager_t*,const char*))get_ike_sa_list_by_name;
this->public.log_status = (void(*)(ike_sa_manager_t*,logger_t*,char*))log_status;
this->public.checkin = (status_t(*)(ike_sa_manager_t*,ike_sa_t*))checkin;
this->public.delete = (status_t(*)(ike_sa_manager_t*,ike_sa_id_t*))delete;
diff --git a/src/charon/charon/sa/ike_sa_manager.h b/src/charon/charon/sa/ike_sa_manager.h
index e2235b4b6..822400a6a 100644
--- a/src/charon/charon/sa/ike_sa_manager.h
+++ b/src/charon/charon/sa/ike_sa_manager.h
@@ -111,6 +111,15 @@ struct ike_sa_manager_t {
linked_list_t *(*get_ike_sa_list) (ike_sa_manager_t* this);
/**
+ * @brief Get a list of all IKE_SA SAs currently set up specified
+ * by the connections name.
+ *
+ * @param this the manager object
+ * @return a list with ike_sa_id_t s
+ */
+ linked_list_t *(*get_ike_sa_list_by_name) (ike_sa_manager_t* this, const char *name);
+
+ /**
* @brief Log the status of the IKE_SA's in the manager.
*
* A informational log is done to the supplied logger. If logger is
diff --git a/src/charon/charon/threads/stroke_interface.c b/src/charon/charon/threads/stroke_interface.c
index d1ad2eda6..eeb14cd94 100755
--- a/src/charon/charon/threads/stroke_interface.c
+++ b/src/charon/charon/threads/stroke_interface.c
@@ -322,43 +322,27 @@ static void stroke_initiate(private_stroke_t *this, stroke_msg_t *msg)
*/
static void stroke_terminate(private_stroke_t *this, stroke_msg_t *msg)
{
- connection_t *connection;
- ike_sa_t *ike_sa;
- host_t *my_host, *other_host;
- status_t status;
+ linked_list_t *ike_sas;
+ iterator_t *iterator;
+ int instances = 0;
pop_string(msg, &(msg->terminate.name));
this->logger->log(this->logger, CONTROL, "received stroke: terminate \"%s\"", msg->terminate.name);
- connection = charon->connections->get_connection_by_name(charon->connections, msg->terminate.name);
- if (connection)
- {
- my_host = connection->get_my_host(connection);
- other_host = connection->get_other_host(connection);
-
- /* TODO: Do this directly by name now */
- /* TODO: terminate any instance of the name */
- status = charon->ike_sa_manager->checkout_by_hosts(charon->ike_sa_manager,
- my_host, other_host, &ike_sa);
-
- if (status == SUCCESS)
- {
- this->stroke_logger->log(this->stroke_logger, CONTROL, "deleting IKE SA between %s - %s",
- my_host->get_address(my_host), other_host->get_address(other_host));
-
- charon->ike_sa_manager->checkin_and_delete(charon->ike_sa_manager, ike_sa);
- }
- else
- {
- this->stroke_logger->log(this->stroke_logger, ERROR, "no active connection found between %s - %s",
- my_host->get_address(my_host), other_host->get_address(other_host));
- }
- }
- else
- {
- this->stroke_logger->log(this->stroke_logger, ERROR, "could not find a connection named \"%s\"", msg->terminate.name);
- }
+ ike_sas = charon->ike_sa_manager->get_ike_sa_list_by_name(charon->ike_sa_manager, msg->terminate.name);
+ iterator = ike_sas->create_iterator(ike_sas, TRUE);
+ while (iterator->has_next(iterator))
+ {
+ ike_sa_id_t *ike_sa_id;
+ iterator->current(iterator, (void**)&ike_sa_id);
+ charon->ike_sa_manager->delete(charon->ike_sa_manager, ike_sa_id);
+ ike_sa_id->destroy(ike_sa_id);
+ instances++;
+ }
+ iterator->destroy(iterator);
+ ike_sas->destroy(ike_sas);
+ this->stroke_logger->log(this->stroke_logger, CONTROL, "terminated %d instances of %s", instances, msg->terminate.name);
}
/**
diff --git a/src/charon/doc/Known-bugs.txt b/src/charon/doc/Known-bugs.txt
index 3f594ad79..7fdf258e3 100644
--- a/src/charon/doc/Known-bugs.txt
+++ b/src/charon/doc/Known-bugs.txt
@@ -4,3 +4,4 @@
- intiating the same connection twice makes trouble
- leak_detective gets confused from libpthread (invalid frees)
- installing to many SAs in the kernel at the same time causes troubles. Threading issue?
+