summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte2010-12-23 16:46:54 +0100
committerAndreas Eversberg2011-02-20 11:33:28 +0100
commit0345a55ca7308efdcebee25ec90ef0f11f78810e (patch)
treef2118158f7cb4e547542e3360e409e9b7f95c873
parentGSM BS: Release all calls in case the connection to OpenBSC disappears (diff)
downloadlcr-0345a55ca7308efdcebee25ec90ef0f11f78810e.tar.gz
lcr-0345a55ca7308efdcebee25ec90ef0f11f78810e.tar.xz
lcr-0345a55ca7308efdcebee25ec90ef0f11f78810e.zip
MNCC: Re-connect to the MNCC socket if connection was lost
-rw-r--r--gsm.h5
-rw-r--r--gsm_bs.cpp61
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 <sys/un.h>
+
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 <openbsc/trau_frame.h>
}
+#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;
}