diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-05-05 22:48:56 +0800 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-06-15 20:24:18 +0800 |
commit | e47a91b86a8ab2bb1dba66f2f3b82290c1234031 (patch) | |
tree | 13f6a20f54668e037afbeb25322e9608de8483bd /openbsc/src/bsc_msc.c | |
parent | 569ee123a240e261c4d5c8b2fe29ff8ccf922d7d (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.
Diffstat (limited to 'openbsc/src/bsc_msc.c')
-rw-r--r-- | openbsc/src/bsc_msc.c | 12 |
1 files changed, 12 insertions, 0 deletions
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); |