aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Willmann <daniel@totalueberwachung.de>2011-05-06 16:37:25 +0200
committerDaniel Willmann <daniel@totalueberwachung.de>2011-07-28 19:40:26 +0200
commit145c58df93e0388ba012b55fc4b70123fb706601 (patch)
treeb37a8e2b83babbe85f9ec218861ed42ade0a10b5
parentf997e569450d99fe490d8797d0e0a0d68457e8ee (diff)
libctrl: Keep track of connections in struct ctrl_handle
-rw-r--r--openbsc/src/libctrl/control_if.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/openbsc/src/libctrl/control_if.c b/openbsc/src/libctrl/control_if.c
index 346dd682e..4ab3f3a6c 100644
--- a/openbsc/src/libctrl/control_if.c
+++ b/openbsc/src/libctrl/control_if.c
@@ -63,6 +63,9 @@
struct ctrl_handle {
struct osmo_fd listen_fd;
struct gsm_network *gsmnet;
+
+ /* List of control connections */
+ struct llist_head ccon_list;
};
vector ctrl_node_vec;
@@ -194,6 +197,7 @@ static void control_close_conn(struct ctrl_connection *ccon)
{
close(ccon->write_queue.bfd.fd);
osmo_fd_unregister(&ccon->write_queue.bfd);
+ llist_del(&ccon->list_entry);
if (ccon->closed_cb)
ccon->closed_cb(ccon);
talloc_free(ccon);
@@ -299,6 +303,7 @@ static struct ctrl_connection *ctrl_connection_alloc(void *ctx)
static int listen_fd_cb(struct osmo_fd *listen_bfd, unsigned int what)
{
int ret, fd, on;
+ struct ctrl_handle *ctrl;
struct ctrl_connection *ccon;
struct sockaddr_in sa;
socklen_t sa_len = sizeof(sa);
@@ -329,7 +334,8 @@ static int listen_fd_cb(struct osmo_fd *listen_bfd, unsigned int what)
return -1;
}
- ccon->write_queue.bfd.data = listen_bfd->data;
+ ctrl = listen_bfd->data;
+ ccon->write_queue.bfd.data = ctrl;
ccon->write_queue.bfd.fd = fd;
ccon->write_queue.bfd.when = BSC_FD_READ;
ccon->write_queue.read_cb = handle_control_read;
@@ -342,6 +348,8 @@ static int listen_fd_cb(struct osmo_fd *listen_bfd, unsigned int what)
talloc_free(ccon);
}
+ llist_add(&ccon->list_entry, &ctrl->ccon_list);
+
return ret;
}
@@ -607,6 +615,8 @@ int controlif_setup(struct gsm_network *gsmnet, uint16_t port)
if (!ctrl)
return -ENOMEM;
+ INIT_LLIST_HEAD(&ctrl->ccon_list);
+
ctrl->gsmnet = gsmnet;
ctrl_node_vec = vector_init(5);