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.
This commit is contained in:
Holger Hans Peter Freyther 2016-03-22 14:15:17 +01:00
parent 9d12a7c34c
commit 90881b6a5a
5 changed files with 103 additions and 8 deletions

View File

@ -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 \

View File

@ -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 {

View File

@ -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),

67
src/sip.c Normal file
View File

@ -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;
}

21
src/sip.h Normal file
View File

@ -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);