aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-05-05 22:48:56 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-06-15 20:24:18 +0800
commite47a91b86a8ab2bb1dba66f2f3b82290c1234031 (patch)
tree13f6a20f54668e037afbeb25322e9608de8483bd
parent569ee123a240e261c4d5c8b2fe29ff8ccf922d7d (diff)
bsc_msc: Add a connection timeout for the MSC.
When no one is listening our connection would get stuck in the SYN_SENT state and we would be there forever.
-rw-r--r--openbsc/include/openbsc/bsc_msc.h1
-rw-r--r--openbsc/src/bsc_msc.c12
2 files changed, 13 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/bsc_msc.h b/openbsc/include/openbsc/bsc_msc.h
index ce21bfe43..041de256e 100644
--- a/openbsc/include/openbsc/bsc_msc.h
+++ b/openbsc/include/openbsc/bsc_msc.h
@@ -36,6 +36,7 @@ struct bsc_msc_connection {
void (*connection_loss) (struct bsc_msc_connection *);
void (*connected) (struct bsc_msc_connection *);
struct timer_list reconnect_timer;
+ struct timer_list timeout_timer;
};
struct bsc_msc_connection *bsc_msc_create(const char *ip, int port);
diff --git a/openbsc/src/bsc_msc.c b/openbsc/src/bsc_msc.c
index 69da7c30f..2902f2903 100644
--- a/openbsc/src/bsc_msc.c
+++ b/openbsc/src/bsc_msc.c
@@ -49,6 +49,14 @@ static void connection_loss(struct bsc_msc_connection *con)
con->connection_loss(con);
}
+static void msc_con_timeout(void *_con)
+{
+ struct bsc_msc_connection *con = _con;
+
+ LOGP(DMSC, LOGL_ERROR, "MSC Connection timeout.\n");
+ bsc_msc_lost(con);
+}
+
static int bsc_msc_except(struct bsc_fd *bfd)
{
struct write_queue *wrt;
@@ -98,6 +106,7 @@ static int msc_connection_connect(struct bsc_fd *fd, unsigned int what)
fd->when = BSC_FD_READ | BSC_FD_EXCEPT;
con->is_connected = 1;
+ bsc_del_timer(&con->timeout_timer);
LOGP(DMSC, LOGL_NOTICE, "(Re)Connected to the MSC.\n");
if (con->connected)
con->connected(con);
@@ -165,6 +174,9 @@ int bsc_msc_connect(struct bsc_msc_connection *con)
LOGP(DMSC, LOGL_ERROR, "MSC Connection in progress\n");
fd->when = BSC_FD_WRITE;
fd->cb = msc_connection_connect;
+ con->timeout_timer.cb = msc_con_timeout;
+ con->timeout_timer.data = con;
+ bsc_schedule_timer(&con->timeout_timer, 20, 0);
} else if (ret < 0) {
perror("Connection failed");
connection_loss(con);