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 .
+ *
+ */
+
+#include "sip.h"
+#include "app.h"
+
+#include
+
+#include
+
+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
+#include
+#include
+#include
+#include
+#include
+
+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);