From 0345a55ca7308efdcebee25ec90ef0f11f78810e Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 23 Dec 2010 16:46:54 +0100 Subject: [PATCH] MNCC: Re-connect to the MNCC socket if connection was lost --- gsm.h | 5 +++++ gsm_bs.cpp | 61 +++++++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/gsm.h b/gsm.h index 5080a8a..5d12646 100644 --- a/gsm.h +++ b/gsm.h @@ -1,3 +1,6 @@ + +#include + extern int new_callref; struct gsm_conf { @@ -27,6 +30,8 @@ struct lcr_gsm { struct lcr_fd mncc_lfd; /* Unix domain socket to OpenBSC MNCC */ struct mncc_q_entry *mncc_q_hd; struct mncc_q_entry *mncc_q_tail; + struct lcr_timer socket_retry; /* Timer to re-try connecting to BSC socket */ + struct sockaddr_un sun; /* Socket address of MNCC socket */ }; extern struct lcr_gsm *gsm; diff --git a/gsm_bs.cpp b/gsm_bs.cpp index 829d58a..259e8a9 100644 --- a/gsm_bs.cpp +++ b/gsm_bs.cpp @@ -26,6 +26,8 @@ extern "C" { #include } +#define SOCKET_RETRY_TIMER 5 + /* * DTMF stuff */ @@ -866,15 +868,11 @@ static int mncc_fd_close(struct lcr_fd *lfd) class Pgsm_bs *pgsm_bs = NULL; struct lcr_msg *message; - printf("mncc_sock: closing\n"); + PERROR("Lost MNCC socket, retrying in %u seconds\n", SOCKET_RETRY_TIMER); close(lfd->fd); unregister_fd(lfd); lfd->fd = -1; - /* flush the queue */ - while (mncc_q_dequeue()) - ; - /* free all the calls that were running through the MNCC interface */ port = port_first; while(port) { @@ -890,7 +888,12 @@ static int mncc_fd_close(struct lcr_fd *lfd) port = port->next; } - /* FIXME: start a re-connect timer */ + /* flush the queue */ + while (mncc_q_dequeue()) + ; + + /* start the re-connect timer */ + schedule_timer(&gsm->socket_retry, SOCKET_RETRY_TIMER, 0); generate_dtmf(); @@ -958,24 +961,42 @@ static int mncc_fd_cb(struct lcr_fd *lfd, unsigned int what, void *instance, int return rc; } -int gsm_bs_init(void) +static int socket_retry_cb(struct lcr_timer *timer, void *instance, int index) { - struct sockaddr_un sun; - int rc; + int fd, rc; - rc = socket(PF_UNIX, SOCK_SEQPACKET, 0); - if (rc < 0) - return rc; + fd = socket(PF_UNIX, SOCK_SEQPACKET, 0); + if (fd < 0) { + PERROR("Cannot create SEQPACKET socket, giving up!\n"); + return fd; + } - gsm->mncc_lfd.fd = rc; + rc = connect(fd, (struct sockaddr *) &gsm->sun, + sizeof(gsm->sun)); + if (rc < 0) { + PERROR("Could not connect to MNCC socket, " + "retrying in %u seconds\n", SOCKET_RETRY_TIMER); + close(fd); + schedule_timer(&gsm->socket_retry, SOCKET_RETRY_TIMER, 0); + } else { + PDEBUG(DEBUG_GSM, "Connected to MNCC socket!\n"); + gsm->mncc_lfd.fd = fd; + register_fd(&gsm->mncc_lfd, LCR_FD_READ, &mncc_fd_cb, NULL, 0); + } - sun.sun_family = AF_UNIX; - strcpy(sun.sun_path, "/tmp/bsc_mncc"); - rc = connect(rc, (struct sockaddr *)&sun, sizeof(sun)); - if (rc < 0) - return rc; + return 0; +} - rc = register_fd(&gsm->mncc_lfd, LCR_FD_READ, &mncc_fd_cb, NULL, 0); +int gsm_bs_init(void) +{ + gsm->sun.sun_family = AF_UNIX; + strcpy(gsm->sun.sun_path, "/tmp/bsc_mncc"); - return rc; + memset(&gsm->socket_retry, 0, sizeof(gsm->socket_retry)); + add_timer(&gsm->socket_retry, socket_retry_cb, NULL, 0); + + /* do the initial connect */ + socket_retry_cb(&gsm->socket_retry, NULL, 0); + + return 0; } -- 2.13.6