summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-03-22 14:15:17 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-03-22 16:32:48 +0100
commit90881b6a5a908f8c1b9745ca7b4eea299d8cacdc (patch)
tree5a77dbda927d8407c8850b1aeaad71d8d54e45a2
parent9d12a7c34cd02880bb5dd228aaf0ff831d2ab6c6 (diff)
sip: Introduce source file to setup sofia sip
This code is capable of creating an agent that will bind on the configured local address. The next steps are to configure the library in terms of allowed features and prepare call handling.
-rw-r--r--src/Makefile.am3
-rw-r--r--src/app.h2
-rw-r--r--src/main.c18
-rw-r--r--src/sip.c67
-rw-r--r--src/sip.h21
5 files changed, 103 insertions, 8 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 42cdca5..4052dea 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,9 +3,10 @@ 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
+ evpoll.h vty.h mncc_protocol.h app.h mncc.h sip.h
osmo_sip_connector_SOURCES = \
+ sip.c \
mncc.c \
evpoll.c \
vty.c \
diff --git a/src/app.h b/src/app.h
index 26a4188..c6305c0 100644
--- a/src/app.h
+++ b/src/app.h
@@ -1,6 +1,7 @@
#pragma once
#include "mncc.h"
+#include "sip.h"
struct app_config {
struct {
@@ -9,6 +10,7 @@ struct app_config {
const char *remote_addr;
int remote_port;
+ struct sip_agent agent;
} sip;
struct {
diff --git a/src/main.c b/src/main.c
index efe2301..d62e652 100644
--- a/src/main.c
+++ b/src/main.c
@@ -106,7 +106,6 @@ static void handle_options(int argc, char **argv)
int main(int argc, char **argv)
{
int rc;
- su_root_t *sip_root;
GMainLoop *loop;
/* initialize osmocom */
@@ -120,10 +119,6 @@ int main(int argc, char **argv)
osmo_stats_vty_add_cmds(&mncc_sip_info);
- /* sofia sip */
- su_init();
- sip_root = su_glib_root_create(NULL);
-
/* parsing and setup */
handle_options(argc, argv);
@@ -144,10 +139,19 @@ int main(int argc, char **argv)
mncc_connection_init(&g_app.mncc.conn, &g_app);
mncc_connection_start(&g_app.mncc.conn);
+ /* sofia sip */
+ sip_agent_init(&g_app.sip.agent, &g_app);
+ rc = sip_agent_start(&g_app.sip.agent);
+ if (rc < 0) {
+ LOGP(DSIP, LOGL_ERROR, "Failed to initialize SIP.\n");
+ exit(1);
+ }
+
+
/* marry sofia-sip to glib and glib to libosmocore */
loop = g_main_loop_new(NULL, FALSE);
- g_source_attach(su_glib_root_gsource(sip_root), g_main_loop_get_context(loop));
- su_root_threading(sip_root, 0);
+ g_source_attach(su_glib_root_gsource(g_app.sip.agent.root),
+ g_main_loop_get_context(loop));
/* prepare integration with osmocom */
g_main_context_set_poll_func(g_main_loop_get_context(loop),
diff --git a/src/sip.c b/src/sip.c
new file mode 100644
index 0000000..4e4d569
--- /dev/null
+++ b/src/sip.c
@@ -0,0 +1,67 @@
+/*
+ * (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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "sip.h"
+#include "app.h"
+
+#include <talloc.h>
+
+#include <string.h>
+
+extern void *tall_mncc_ctx;
+
+void nua_callback(nua_event_t event, int status, char const *phrase, nua_t *nua, nua_magic_t *magic, nua_handle_t *nh, nua_hmagic_t *hmagic, sip_t const *sip, tagi_t tags[])
+{
+}
+
+char *make_sip_uri(struct sip_agent *agent)
+{
+ const char *hostname = agent->app->sip.local_addr;
+
+ /* We need to map 0.0.0.0 to '*' to bind everywhere */
+ if (strcmp(hostname, "0.0.0.0") == 0)
+ hostname = "*";
+
+ return talloc_asprintf(tall_mncc_ctx, "sip:%s:%d",
+ agent->app->sip.local_addr,
+ agent->app->sip.local_port);
+}
+
+void sip_agent_init(struct sip_agent *agent, struct app_config *app)
+{
+ agent->app = app;
+
+ su_init();
+ su_home_init(&agent->home);
+ agent->root = su_glib_root_create(NULL);
+ su_root_threading(agent->root, 0);
+}
+
+int sip_agent_start(struct sip_agent *agent)
+{
+ char *sip_uri = make_sip_uri(agent);
+
+ agent->nua = nua_create(agent->root,
+ nua_callback, agent,
+ NUTAG_URL(sip_uri),
+ TAG_END());
+ talloc_free(sip_uri);
+ return agent->nua ? 0 : -1;
+}
diff --git a/src/sip.h b/src/sip.h
new file mode 100644
index 0000000..14ec8dc
--- /dev/null
+++ b/src/sip.h
@@ -0,0 +1,21 @@
+#pragma once
+
+#include <sofia-sip/su_wait.h>
+#include <sofia-sip/url.h>
+#include <sofia-sip/sip.h>
+#include <sofia-sip/nua_tag.h>
+#include <sofia-sip/su_glib.h>
+#include <sofia-sip/nua.h>
+
+struct app_config;
+
+struct sip_agent {
+ struct app_config *app;
+ su_home_t home;
+ su_root_t *root;
+
+ nua_t *nua;
+};
+
+void sip_agent_init(struct sip_agent *agent, struct app_config *app);
+int sip_agent_start(struct sip_agent *agent);