aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/nat
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-03-26 12:14:37 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-03-26 12:14:37 +0100
commit135a45c833d48e7ddcae973ac1d772ad277a56c1 (patch)
tree4a041a6a0511500cf3963cd3b01f2beef231cacf /openbsc/src/nat
parent1a3d9dbabf94f0138b5eee1f5bde8d9fe8a4bf96 (diff)
msc: Create a real interface for BSC MSC and start handling reconnects
Create a BSC<->MSC interface and use it for the BSC MSC IP and the BSC NAT to reduce code duplication on handling reconnects to the MSC and cleaning up the local state. The code is only partially tested and will contain bugs. Currently both the BSC and the NAT will just exit on connection loss and this way have the current behavior.
Diffstat (limited to 'openbsc/src/nat')
-rw-r--r--openbsc/src/nat/bsc_nat.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index f50e47f35..3bf4b998f 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -53,7 +53,7 @@ struct debug_target *stderr_target;
static const char *config_file = "bsc-nat.cfg";
static char *msc_address = "127.0.0.1";
static struct in_addr local_addr;
-static struct write_queue msc_queue;
+static struct bsc_msc_connection *msc_con;
static struct bsc_fd bsc_listen;
@@ -420,6 +420,12 @@ exit:
return 0;
}
+static void msc_connection_was_lost(struct bsc_msc_connection *con)
+{
+ LOGP(DMSC, LOGL_FATAL, "Lost the connection.\n");
+ exit(0);
+}
+
static int ipaccess_msc_read_cb(struct bsc_fd *bfd)
{
int error;
@@ -429,7 +435,8 @@ static int ipaccess_msc_read_cb(struct bsc_fd *bfd)
if (!msg) {
if (error == 0) {
LOGP(DNAT, LOGL_FATAL, "The connection the MSC was lost, exiting\n");
- exit(-2);
+ bsc_msc_lost(msc_con);
+ return -1;
}
LOGP(DNAT, LOGL_ERROR, "Failed to parse ip access message: %d\n", error);
@@ -576,7 +583,7 @@ static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
}
/* send the non-filtered but maybe modified msg */
- if (write_queue_enqueue(&msc_queue, msg) != 0) {
+ if (write_queue_enqueue(&msc_con->write_queue, msg) != 0) {
LOGP(DNAT, LOGL_ERROR, "Can not queue message for the MSC.\n");
msgb_free(msg);
}
@@ -822,8 +829,6 @@ static void signal_handler(int signal)
int main(int argc, char** argv)
{
- int rc;
-
debug_init();
stderr_target = debug_target_create_stderr();
debug_add_target(stderr_target);
@@ -851,15 +856,17 @@ int main(int argc, char** argv)
srand(time(NULL));
/* connect to the MSC */
- write_queue_init(&msc_queue, 100);
- msc_queue.read_cb = ipaccess_msc_read_cb;
- msc_queue.write_cb = ipaccess_msc_write_cb;
- rc = connect_to_msc(&msc_queue.bfd, msc_address, 5000);
- if (rc < 0) {
- fprintf(stderr, "Opening the MSC connection failed.\n");
+ msc_con = bsc_msc_create(msc_address, 5000);
+ if (!msc_con) {
+ fprintf(stderr, "Creating a bsc_msc_connection failed.\n");
exit(1);
}
+ msc_con->connection_loss = msc_connection_was_lost;
+ msc_con->write_queue.read_cb = ipaccess_msc_read_cb;
+ msc_con->write_queue.write_cb = ipaccess_msc_write_cb;;
+ bsc_msc_connect(msc_con);
+
/* wait for the BSC */
if (listen_for_bsc(&bsc_listen, &local_addr, 5000) < 0) {
fprintf(stderr, "Failed to listen for BSC.\n");