From 9d12a7c34cd02880bb5dd228aaf0ff831d2ab6c6 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Mon, 21 Mar 2016 16:42:43 +0100 Subject: [PATCH] mncc: Add code to manage the mncc connection for CC Connect, re-connect and read messages from the MNCC socket. Dispatch the event in case the system got disconnected. Move the app definition to app.h and use it everywhere. Begin with a new call for mncc. --- src/Makefile.am | 4 +++ src/app.h | 22 +++++++++++++ src/main.c | 5 ++- src/mncc.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++ src/mncc.h | 20 ++++++++++++ src/vty.c | 1 + src/vty.h | 16 ---------- 7 files changed, 135 insertions(+), 17 deletions(-) create mode 100644 src/app.h create mode 100644 src/mncc.c create mode 100644 src/mncc.h diff --git a/src/Makefile.am b/src/Makefile.am index bdb8d74..42cdca5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,7 +2,11 @@ bin_PROGRAMS = osmo-sip-connector AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(SOFIASIP_CFLAGS) +noinst_HEADERS = \ + evpoll.h vty.h mncc_protocol.h app.h mncc.h + osmo_sip_connector_SOURCES = \ + mncc.c \ evpoll.c \ vty.c \ main.c diff --git a/src/app.h b/src/app.h new file mode 100644 index 0000000..26a4188 --- /dev/null +++ b/src/app.h @@ -0,0 +1,22 @@ +#pragma once + +#include "mncc.h" + +struct app_config { + struct { + const char *local_addr; + int local_port; + + const char *remote_addr; + int remote_port; + } sip; + + struct { + const char *path; + struct mncc_connection conn; + } mncc; + + //int use_imsi_as_id; +}; + +extern struct app_config g_app; diff --git a/src/main.c b/src/main.c index 4513718..efe2301 100644 --- a/src/main.c +++ b/src/main.c @@ -23,6 +23,8 @@ #include "evpoll.h" #include "vty.h" #include "logging.h" +#include "mncc.h" +#include "app.h" #include #include @@ -139,7 +141,8 @@ int main(int argc, char **argv) if (rc < 0) exit(1); - + mncc_connection_init(&g_app.mncc.conn, &g_app); + mncc_connection_start(&g_app.mncc.conn); /* marry sofia-sip to glib and glib to libosmocore */ loop = g_main_loop_new(NULL, FALSE); diff --git a/src/mncc.c b/src/mncc.c new file mode 100644 index 0000000..7539334 --- /dev/null +++ b/src/mncc.c @@ -0,0 +1,84 @@ +/* + * (C) 2016 by Holger Hans Peter Freyther + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +#include "mncc.h" +#include "app.h" +#include "logging.h" + +#include + +#include +#include + +#include +#include + +static void mncc_reconnect(void *data) +{ + int rc; + struct mncc_connection *conn = data; + + rc = osmo_sock_unix_init_ofd(&conn->fd, SOCK_SEQPACKET, 0, + conn->app->mncc.path, OSMO_SOCK_F_CONNECT); + if (rc < 0) { + LOGP(DMNCC, LOGL_ERROR, "Failed to connect(%s). Retrying\n", + conn->app->mncc.path); + osmo_timer_schedule(&conn->reconnect, 5, 0); + return; + } + + LOGP(DMNCC, LOGL_NOTICE, "Reconnected to %s\n", conn->app->mncc.path); +} + +static int mncc_data(struct osmo_fd *fd, unsigned int what) +{ + char buf[4096]; + int rc; + struct mncc_connection *conn = fd->data; + + rc = read(fd->fd, buf, sizeof(buf)); + if (rc <= 0) { + LOGP(DMNCC, LOGL_ERROR, "Failed to read %d/%s. Re-connecting.\n", + rc, strerror(errno)); + osmo_fd_unregister(fd); + close(fd->fd); + osmo_timer_schedule(&conn->reconnect, 5, 0); + if (conn->on_disconnect) + conn->on_disconnect(conn); + return 0; + } + + return 0; +} + +void mncc_connection_init(struct mncc_connection *conn, struct app_config *cfg) +{ + conn->reconnect.cb = mncc_reconnect; + conn->reconnect.data = conn; + conn->fd.cb = mncc_data; + conn->fd.data = conn; + conn->app = cfg; +} + +void mncc_connection_start(struct mncc_connection *conn) +{ + LOGP(DMNCC, LOGL_NOTICE, "Scheduling MNCC connect\n"); + osmo_timer_schedule(&conn->reconnect, 0, 0); +} diff --git a/src/mncc.h b/src/mncc.h new file mode 100644 index 0000000..d6afadc --- /dev/null +++ b/src/mncc.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +struct app_config; + +struct mncc_connection { + struct app_config *app; + struct osmo_fd fd; + + struct osmo_timer_list reconnect; + + + /* callback for application logic */ + void (*on_disconnect)(struct mncc_connection *); +}; + +void mncc_connection_init(struct mncc_connection *conn, struct app_config *cfg); +void mncc_connection_start(struct mncc_connection *conn); diff --git a/src/vty.c b/src/vty.c index 9a2562e..7783cf0 100644 --- a/src/vty.c +++ b/src/vty.c @@ -19,6 +19,7 @@ */ #include "vty.h" +#include "app.h" #include diff --git a/src/vty.h b/src/vty.h index cf6aa55..dcb5b29 100644 --- a/src/vty.h +++ b/src/vty.h @@ -9,20 +9,4 @@ enum { APP_NODE, }; -struct app_config { - struct { - const char *local_addr; - int local_port; - - const char *remote_addr; - int remote_port; - } sip; - - struct { - const char *path; - } mncc; - - //int use_imsi_as_id; -}; - void mncc_sip_vty_init();