forked from cc/osmo-cc-sip-endpoint
Updated libs
This commit is contained in:
parent
603b437a80
commit
4801128069
|
@ -172,6 +172,27 @@ static int split_address(const char *address, const char **host_p, uint16_t *por
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
osmo_cc_call_t *osmo_cc_get_attached_interface(osmo_cc_endpoint_t *ep, const char *interface)
|
||||
{
|
||||
osmo_cc_call_t *att;
|
||||
|
||||
for (att = ep->call_list; att; att = att->next) {
|
||||
if (att->state != OSMO_CC_STATE_ATTACH_IN)
|
||||
continue;
|
||||
/* no interface given, just use the attached peer */
|
||||
if (!interface[0])
|
||||
break;
|
||||
/* no interface name given on attached peer, ignore it */
|
||||
if (!att->attached_name || !att->attached_name[0])
|
||||
continue;
|
||||
/* interface given, use the attached peer with the same interface name */
|
||||
if (!strcmp(interface, att->attached_name))
|
||||
break;
|
||||
}
|
||||
|
||||
return att;
|
||||
}
|
||||
/* helper to forward message to upper layer */
|
||||
static void forward_to_ul(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
|
||||
{
|
||||
|
@ -233,19 +254,7 @@ reject:
|
|||
if (rc < 0)
|
||||
interface[0] = '\0';
|
||||
/* check for incoming attachment */
|
||||
for (att = call->ep->call_list; att; att = att->next) {
|
||||
if (att->state != OSMO_CC_STATE_ATTACH_IN)
|
||||
continue;
|
||||
/* no interface given, just use the attached peer */
|
||||
if (!interface[0])
|
||||
break;
|
||||
/* no interface name given on attached peer, ignore it */
|
||||
if (!att->attached_name || !att->attached_name[0])
|
||||
continue;
|
||||
/* interface given, use the attached peer with the same interface name */
|
||||
if (!strcmp(interface, att->attached_name))
|
||||
break;
|
||||
}
|
||||
att = osmo_cc_get_attached_interface(call->ep, interface);
|
||||
if (!att && !interface[0]) {
|
||||
PDEBUG(DCC, DEBUG_ERROR, "No remote peer attached, rejecting call.\n");
|
||||
goto reject;
|
||||
|
@ -1146,7 +1155,7 @@ static int osmo_cc_set_address(osmo_cc_endpoint_t *ep, const char *text)
|
|||
PDEBUG(DCC, DEBUG_ERROR, "Given local address '%s' is invalid.\n", *host_p);
|
||||
return -EINVAL;
|
||||
}
|
||||
osmo_cc_set_local_peer(osmo_cc_session_nettype_inet, addrtype, *host_p);
|
||||
osmo_cc_set_local_peer(&ep->session_config, osmo_cc_session_nettype_inet, addrtype, *host_p);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1166,7 +1175,7 @@ static void osmo_cc_help_rtp(void)
|
|||
printf("interfaces, between machines, local machine's IP must be given.\n\n");
|
||||
}
|
||||
|
||||
static int osmo_cc_set_rtp(const char *text)
|
||||
static int osmo_cc_set_rtp(osmo_cc_endpoint_t *ep, const char *text)
|
||||
{
|
||||
int peer = 0, ports = 0;
|
||||
|
||||
|
@ -1195,7 +1204,7 @@ static int osmo_cc_set_rtp(const char *text)
|
|||
PDEBUG(DCC, DEBUG_ERROR, "Given RTP address '%s' is invalid.\n", text);
|
||||
return -EINVAL;
|
||||
}
|
||||
osmo_cc_set_local_peer(osmo_cc_session_nettype_inet, addrtype, text);
|
||||
osmo_cc_set_local_peer(&ep->session_config, osmo_cc_session_nettype_inet, addrtype, text);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1227,7 +1236,7 @@ static int osmo_cc_set_rtp(const char *text)
|
|||
from = from * 10 + *text - '0';
|
||||
}
|
||||
|
||||
osmo_cc_set_rtp_ports(from, to);
|
||||
osmo_cc_set_rtp_ports(&ep->session_config, from, to);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1270,6 +1279,9 @@ int osmo_cc_new(osmo_cc_endpoint_t *ep, const char *version, const char *name, u
|
|||
ep->serving_location = serving_location;
|
||||
ep->priv = priv;
|
||||
|
||||
osmo_cc_set_local_peer(&ep->session_config, osmo_cc_session_nettype_inet, osmo_cc_session_addrtype_ipv4, "127.0.0.1");
|
||||
osmo_cc_set_rtp_ports(&ep->session_config, 16384, 32767);
|
||||
|
||||
/* apply args */
|
||||
for (i = 0; i < argc; i++) {
|
||||
if (!strncasecmp(argv[i], "local", 5)) {
|
||||
|
@ -1285,7 +1297,7 @@ int osmo_cc_new(osmo_cc_endpoint_t *ep, const char *version, const char *name, u
|
|||
}
|
||||
} else
|
||||
if (!strncasecmp(argv[i], "rtp", 3)) {
|
||||
rc = osmo_cc_set_rtp(argv[i]);
|
||||
rc = osmo_cc_set_rtp(ep, argv[i]);
|
||||
if (rc < 0) {
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -45,6 +45,8 @@ typedef int16_t osmo_cc_sample_t;
|
|||
#define OSMO_CC_SAMPLE_MIN -32768 /* lowest level */
|
||||
#define OSMO_CC_SAMPLE_MAX 32767 /* highest level */
|
||||
|
||||
#include "session.h"
|
||||
|
||||
struct osmo_cc_call;
|
||||
|
||||
typedef struct osmo_cc_screen_list {
|
||||
|
@ -84,6 +86,7 @@ typedef struct osmo_cc_endpoint {
|
|||
osmo_cc_screen_list_t *screen_called_out;
|
||||
int remote_auto; /* automatic remote address */
|
||||
struct timer attach_timer; /* timer to retry attachment */
|
||||
osmo_cc_session_config_t session_config; /* SDP/RTP default configuration */
|
||||
} osmo_cc_endpoint_t;
|
||||
|
||||
extern osmo_cc_endpoint_t *osmo_cc_endpoint_list;
|
||||
|
@ -112,6 +115,7 @@ int osmo_cc_new(osmo_cc_endpoint_t *ep, const char *version, const char *name, u
|
|||
void osmo_cc_delete(struct osmo_cc_endpoint *ep);
|
||||
int osmo_cc_handle(void);
|
||||
osmo_cc_call_t *osmo_cc_call_by_callref(osmo_cc_endpoint_t *ep, uint32_t callref);
|
||||
osmo_cc_call_t *osmo_cc_get_attached_interface(osmo_cc_endpoint_t *ep, const char *interface);
|
||||
void osmo_cc_ll_msg(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg);
|
||||
void osmo_cc_ul_msg(void *priv, uint32_t callref, osmo_cc_msg_t *msg);
|
||||
osmo_cc_call_t *osmo_cc_call_new(osmo_cc_endpoint_t *ep);
|
||||
|
@ -120,7 +124,6 @@ enum osmo_cc_session_addrtype osmo_cc_address_type(const char *address);
|
|||
const char *osmo_cc_host_of_address(const char *address);
|
||||
const char *osmo_cc_port_of_address(const char *address);
|
||||
|
||||
#include "session.h"
|
||||
#include "rtp.h"
|
||||
#include "sdp.h"
|
||||
#include "screen.h"
|
||||
|
|
|
@ -29,14 +29,14 @@
|
|||
#include "endpoint.h"
|
||||
#include "helper.h"
|
||||
|
||||
osmo_cc_session_t *osmo_cc_helper_audio_offer(void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len), osmo_cc_msg_t *msg, int debug)
|
||||
osmo_cc_session_t *osmo_cc_helper_audio_offer(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len), osmo_cc_msg_t *msg, int debug)
|
||||
{
|
||||
osmo_cc_session_t *session;
|
||||
osmo_cc_session_media_t *media;
|
||||
const char *sdp;
|
||||
int i;
|
||||
|
||||
session = osmo_cc_new_session(priv, NULL, NULL, NULL, 0, 0, NULL, NULL, debug);
|
||||
session = osmo_cc_new_session(conf, priv, NULL, NULL, NULL, 0, 0, NULL, NULL, debug);
|
||||
if (!session)
|
||||
return NULL;
|
||||
|
||||
|
@ -52,7 +52,7 @@ osmo_cc_session_t *osmo_cc_helper_audio_offer(void *priv, struct osmo_cc_helper_
|
|||
return session;
|
||||
}
|
||||
|
||||
const char *osmo_cc_helper_audio_accept(void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len), osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p, int force_our_codec)
|
||||
const char *osmo_cc_helper_audio_accept(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len), osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p, int force_our_codec)
|
||||
{
|
||||
char offer_sdp[65536];
|
||||
const char *accept_sdp;
|
||||
|
@ -77,7 +77,7 @@ const char *osmo_cc_helper_audio_accept(void *priv, struct osmo_cc_helper_audio_
|
|||
return NULL;
|
||||
}
|
||||
|
||||
*session_p = osmo_cc_session_receive_offer(priv, offer_sdp);
|
||||
*session_p = osmo_cc_session_receive_offer(conf, priv, offer_sdp);
|
||||
if (!*session_p) {
|
||||
PDEBUG(DCC, DEBUG_ERROR, "Failed to parse SDP.\n");
|
||||
return NULL;
|
||||
|
|
|
@ -7,7 +7,7 @@ struct osmo_cc_helper_audio_codecs {
|
|||
void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len);
|
||||
};
|
||||
|
||||
osmo_cc_session_t *osmo_cc_helper_audio_offer(void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len), osmo_cc_msg_t *msg, int debug);
|
||||
const char *osmo_cc_helper_audio_accept(void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len), osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p, int force_our_codec);
|
||||
osmo_cc_session_t *osmo_cc_helper_audio_offer(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len), osmo_cc_msg_t *msg, int debug);
|
||||
const char *osmo_cc_helper_audio_accept(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len), osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p, int force_our_codec);
|
||||
int osmo_cc_helper_audio_negotiate(osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p);
|
||||
|
||||
|
|
|
@ -32,15 +32,11 @@
|
|||
|
||||
#define RTP_VERSION 2
|
||||
|
||||
static uint16_t rtp_port_next = 16384;
|
||||
static uint16_t rtp_port_from = 16384;
|
||||
static uint16_t rtp_port_to = 32767;
|
||||
|
||||
void osmo_cc_set_rtp_ports(uint16_t from, uint16_t to)
|
||||
void osmo_cc_set_rtp_ports(osmo_cc_session_config_t *conf, uint16_t from, uint16_t to)
|
||||
{
|
||||
rtp_port_next = from;
|
||||
rtp_port_from = from;
|
||||
rtp_port_to = to;
|
||||
conf->rtp_port_next = from;
|
||||
conf->rtp_port_from = from;
|
||||
conf->rtp_port_to = to;
|
||||
}
|
||||
|
||||
struct rtp_hdr {
|
||||
|
@ -165,6 +161,7 @@ static void rtp_send(int sock, uint8_t *payload, int payload_len, uint8_t pt, ui
|
|||
*/
|
||||
int osmo_cc_rtp_open(osmo_cc_session_media_t *media)
|
||||
{
|
||||
osmo_cc_session_config_t *conf = media->session->config;
|
||||
int domain = 0; // make GCC happy
|
||||
uint16_t start_port;
|
||||
struct sockaddr_storage sa;
|
||||
|
@ -204,9 +201,9 @@ int osmo_cc_rtp_open(osmo_cc_session_media_t *media)
|
|||
}
|
||||
|
||||
/* rtp_port_from/rtp_port_to may be changed at run time, so rtp_port_next can become out of range. */
|
||||
if (rtp_port_next < rtp_port_from || rtp_port_next > rtp_port_to)
|
||||
rtp_port_next = rtp_port_from;
|
||||
start_port = rtp_port_next;
|
||||
if (conf->rtp_port_next < conf->rtp_port_from || conf->rtp_port_next > conf->rtp_port_to)
|
||||
conf->rtp_port_next = conf->rtp_port_from;
|
||||
start_port = conf->rtp_port_next;
|
||||
while (1) {
|
||||
/* open sockets */
|
||||
rc = socket(domain, SOCK_DGRAM, IPPROTO_UDP);
|
||||
|
@ -223,24 +220,24 @@ socket_error:
|
|||
media->rtcp_socket = rc;
|
||||
|
||||
/* bind sockets */
|
||||
*sport = htons(rtp_port_next);
|
||||
*sport = htons(conf->rtp_port_next);
|
||||
rc = bind(media->rtp_socket, (struct sockaddr *)&sa, slen);
|
||||
if (rc < 0) {
|
||||
bind_error:
|
||||
osmo_cc_rtp_close(media);
|
||||
rtp_port_next = (rtp_port_next + 2 > rtp_port_to) ? rtp_port_from : rtp_port_next + 2;
|
||||
if (rtp_port_next == start_port) {
|
||||
conf->rtp_port_next = (conf->rtp_port_next + 2 > conf->rtp_port_to) ? conf->rtp_port_from : conf->rtp_port_next + 2;
|
||||
if (conf->rtp_port_next == start_port) {
|
||||
PDEBUG(DCC, DEBUG_ERROR, "Cannot bind socket (errno=%d(%s))\n", errno, strerror(errno));
|
||||
return -EIO;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
*sport = htons(rtp_port_next + 1);
|
||||
*sport = htons(conf->rtp_port_next + 1);
|
||||
rc = bind(media->rtcp_socket, (struct sockaddr *)&sa, slen);
|
||||
if (rc < 0)
|
||||
goto bind_error;
|
||||
media->description.port_local = rtp_port_next;
|
||||
rtp_port_next = (rtp_port_next + 2 > rtp_port_to) ? rtp_port_from : rtp_port_next + 2;
|
||||
media->description.port_local = conf->rtp_port_next;
|
||||
conf->rtp_port_next = (conf->rtp_port_next + 2 > conf->rtp_port_to) ? conf->rtp_port_from : conf->rtp_port_next + 2;
|
||||
/* set nonblocking io */
|
||||
flags = fcntl(media->rtp_socket, F_GETFL);
|
||||
flags |= O_NONBLOCK;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
void osmo_cc_set_rtp_ports(uint16_t from, uint16_t to);
|
||||
void osmo_cc_set_rtp_ports(osmo_cc_session_config_t *conf, uint16_t from, uint16_t to);
|
||||
int osmo_cc_rtp_open(osmo_cc_session_media_t *media);
|
||||
int osmo_cc_rtp_connect(osmo_cc_session_media_t *media);
|
||||
void osmo_cc_rtp_send(osmo_cc_session_codec_t *codec, uint8_t *data, int len, int inc_sequence, int inc_timestamp);
|
||||
|
|
|
@ -578,7 +578,7 @@ osmo_cc_msg_t *osmo_cc_screen_msg(osmo_cc_endpoint_t *ep, osmo_cc_msg_t *old_msg
|
|||
}
|
||||
rc = osmo_cc_get_ie_redir(old_msg, 0, &redir_type, &redir_plan, &redir_present, &redir_screen, &redir_reason, id, sizeof(id));
|
||||
if (rc >= 0) {
|
||||
rc = osmo_cc_screen("incoming redirecting number", ep->screen_calling_in, &redir_type, &redir_present, redir, sizeof(redir), id, routing_p);
|
||||
rc = osmo_cc_screen("incoming redirecting number", ep->screen_calling_in, &redir_type, &redir_present, redir, sizeof(redir), id, NULL);
|
||||
if (rc >= 0)
|
||||
redir_status = 1;
|
||||
}
|
||||
|
|
|
@ -244,7 +244,7 @@ int osmo_cc_payload_type_by_attrs(uint8_t *fmt, const char *name, uint32_t *rate
|
|||
*
|
||||
* sdp = given SDP text
|
||||
* return: SDP session description structure */
|
||||
struct osmo_cc_session *osmo_cc_session_parsesdp(void *priv, const char *_sdp)
|
||||
struct osmo_cc_session *osmo_cc_session_parsesdp(osmo_cc_session_config_t *conf, void *priv, const char *_sdp)
|
||||
{
|
||||
char buffer[strlen(_sdp) + 1], *sdp = buffer;
|
||||
char *line, *p, *word, *next_word;
|
||||
|
@ -260,7 +260,7 @@ struct osmo_cc_session *osmo_cc_session_parsesdp(void *priv, const char *_sdp)
|
|||
memset(&ccd, 0, sizeof(ccd));
|
||||
|
||||
/* create SDP session description */
|
||||
session = osmo_cc_new_session(priv, NULL, NULL, NULL, osmo_cc_session_nettype_inet, osmo_cc_session_addrtype_ipv4, "127.0.0.1", NULL, 0); // values will be replaced by local definitions during negotiation
|
||||
session = osmo_cc_new_session(conf, priv, NULL, NULL, NULL, osmo_cc_session_nettype_inet, osmo_cc_session_addrtype_ipv4, "127.0.0.1", NULL, 0); // values will be replaced by local definitions during negotiation
|
||||
|
||||
/* check every line of SDP and parse its data */
|
||||
while(*sdp) {
|
||||
|
@ -486,14 +486,14 @@ struct osmo_cc_session *osmo_cc_session_parsesdp(void *priv, const char *_sdp)
|
|||
}
|
||||
PDEBUG(DCC, DEBUG_DEBUG, " -> (rtpmap) payload type = %d\n", codec->payload_type_remote);
|
||||
if (!(word = wordsep(&next_word)))
|
||||
break;
|
||||
goto rtpmap_done;
|
||||
if ((p = strchr(word, '/')))
|
||||
*p++ = '\0';
|
||||
free((char *)codec->payload_name); // in case it is already set above
|
||||
codec->payload_name = strdup(word);
|
||||
PDEBUG(DCC, DEBUG_DEBUG, " -> (rtpmap) payload name = %s\n", codec->payload_name);
|
||||
if (!(word = p))
|
||||
break;
|
||||
goto rtpmap_done;
|
||||
if ((p = strchr(word, '/')))
|
||||
*p++ = '\0';
|
||||
codec->payload_rate = atoi(word);
|
||||
|
@ -502,10 +502,15 @@ struct osmo_cc_session *osmo_cc_session_parsesdp(void *priv, const char *_sdp)
|
|||
/* if no channel is given and no default was specified, we must set 1 channel */
|
||||
if (!codec->payload_channels)
|
||||
codec->payload_channels = 1;
|
||||
break;
|
||||
goto rtpmap_done;
|
||||
}
|
||||
codec->payload_channels = atoi(word);
|
||||
PDEBUG(DCC, DEBUG_DEBUG, " -> (rtpmap) payload channels = %d\n", codec->payload_channels);
|
||||
rtpmap_done:
|
||||
if (!codec->payload_name || !codec->payload_rate || !codec->payload_channels) {
|
||||
PDEBUG(DCC, DEBUG_NOTICE, "Broken 'rtpmap' definition in SDP line %d = '%s' Skipping codec!\n", line_no, line);
|
||||
osmo_cc_free_codec(codec);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
char *osmo_cc_session_gensdp(struct osmo_cc_session *session);
|
||||
struct osmo_cc_session *osmo_cc_session_parsesdp(void *priv, const char *_sdp);
|
||||
struct osmo_cc_session *osmo_cc_session_parsesdp(osmo_cc_session_config_t *conf, void *priv, const char *_sdp);
|
||||
int osmo_cc_payload_type_by_attrs(uint8_t *fmt, const char *name, uint32_t *rate, int *channels);
|
||||
void osmo_cc_debug_sdp(const char *sdp);
|
||||
|
||||
|
|
|
@ -31,18 +31,14 @@
|
|||
|
||||
#define NTP_OFFSET 2208988800
|
||||
|
||||
enum osmo_cc_session_nettype default_nettype = osmo_cc_session_nettype_inet;
|
||||
enum osmo_cc_session_addrtype default_addrtype = osmo_cc_session_addrtype_ipv4;
|
||||
const char *default_unicast_address = "127.0.0.1";
|
||||
|
||||
void osmo_cc_set_local_peer(enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address)
|
||||
void osmo_cc_set_local_peer(osmo_cc_session_config_t *conf, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address)
|
||||
{
|
||||
default_nettype = nettype;
|
||||
default_addrtype = addrtype;
|
||||
default_unicast_address = options_strdup(address);
|
||||
conf->default_nettype = nettype;
|
||||
conf->default_addrtype = addrtype;
|
||||
conf->default_unicast_address = options_strdup(address);
|
||||
}
|
||||
|
||||
osmo_cc_session_t *osmo_cc_new_session(void *priv, const char *username, const char *sess_id, const char *sess_version, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *unicast_address, const char *session_name, int debug)
|
||||
osmo_cc_session_t *osmo_cc_new_session(osmo_cc_session_config_t *conf, void *priv, const char *username, const char *sess_id, const char *sess_version, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *unicast_address, const char *session_name, int debug)
|
||||
{
|
||||
osmo_cc_session_t *session;
|
||||
|
||||
|
@ -53,6 +49,7 @@ osmo_cc_session_t *osmo_cc_new_session(void *priv, const char *username, const c
|
|||
PDEBUG(DCC, DEBUG_ERROR, "No mem!\n");
|
||||
abort();
|
||||
}
|
||||
session->config = conf;
|
||||
session->priv = priv;
|
||||
if (username) {
|
||||
int i;
|
||||
|
@ -87,17 +84,17 @@ osmo_cc_session_t *osmo_cc_new_session(void *priv, const char *username, const c
|
|||
if (nettype)
|
||||
session->origin_local.nettype = strdup(osmo_cc_session_nettype2string(nettype));
|
||||
else
|
||||
session->origin_local.nettype = strdup(osmo_cc_session_nettype2string(default_nettype));
|
||||
session->origin_local.nettype = strdup(osmo_cc_session_nettype2string(conf->default_nettype));
|
||||
if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> network type = %s\n", session->origin_local.nettype);
|
||||
if (addrtype)
|
||||
session->origin_local.addrtype = strdup(osmo_cc_session_addrtype2string(addrtype));
|
||||
else
|
||||
session->origin_local.addrtype = strdup(osmo_cc_session_addrtype2string(default_addrtype));
|
||||
session->origin_local.addrtype = strdup(osmo_cc_session_addrtype2string(conf->default_addrtype));
|
||||
if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> address type = %s\n", session->origin_local.addrtype);
|
||||
if (unicast_address)
|
||||
session->origin_local.unicast_address = strdup(unicast_address);
|
||||
else
|
||||
session->origin_local.unicast_address = strdup(default_unicast_address);
|
||||
session->origin_local.unicast_address = strdup(conf->default_unicast_address);
|
||||
if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> unicast address = %s\n", session->origin_local.unicast_address);
|
||||
if (session_name)
|
||||
session->name = strdup(session_name);
|
||||
|
@ -132,6 +129,7 @@ void osmo_cc_free_session(osmo_cc_session_t *session)
|
|||
|
||||
osmo_cc_session_media_t *osmo_cc_add_media(osmo_cc_session_t *session, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, enum osmo_cc_session_media_type type, uint16_t port, enum osmo_cc_session_media_proto proto, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len), int debug)
|
||||
{
|
||||
osmo_cc_session_config_t *conf = session->config;
|
||||
osmo_cc_session_media_t *media, **mediap;
|
||||
|
||||
media = calloc(1, sizeof(*media));
|
||||
|
@ -143,15 +141,15 @@ osmo_cc_session_media_t *osmo_cc_add_media(osmo_cc_session_t *session, enum osmo
|
|||
if (nettype)
|
||||
media->connection_data_local.nettype = nettype;
|
||||
else
|
||||
media->connection_data_local.nettype = default_nettype;
|
||||
media->connection_data_local.nettype = conf->default_nettype;
|
||||
if (addrtype)
|
||||
media->connection_data_local.addrtype = addrtype;
|
||||
else
|
||||
media->connection_data_local.addrtype = default_addrtype;
|
||||
media->connection_data_local.addrtype = conf->default_addrtype;
|
||||
if (address)
|
||||
media->connection_data_local.address = strdup(address);
|
||||
else
|
||||
media->connection_data_local.address = strdup(default_unicast_address);
|
||||
media->connection_data_local.address = strdup(conf->default_unicast_address);
|
||||
media->description.type = type;
|
||||
media->description.port_local = port;
|
||||
media->description.proto = proto;
|
||||
|
@ -355,7 +353,7 @@ const char *osmo_cc_session_send_offer(osmo_cc_session_t *session)
|
|||
return sdp;
|
||||
}
|
||||
|
||||
osmo_cc_session_t *osmo_cc_session_receive_offer(void *priv, const char *sdp)
|
||||
osmo_cc_session_t *osmo_cc_session_receive_offer(osmo_cc_session_config_t *conf, void *priv, const char *sdp)
|
||||
{
|
||||
osmo_cc_session_t *session;
|
||||
int rc;
|
||||
|
@ -363,7 +361,7 @@ osmo_cc_session_t *osmo_cc_session_receive_offer(void *priv, const char *sdp)
|
|||
PDEBUG(DCC, DEBUG_DEBUG, "Parsing session offer.\n");
|
||||
|
||||
osmo_cc_debug_sdp(sdp);
|
||||
session = osmo_cc_session_parsesdp(priv, sdp);
|
||||
session = osmo_cc_session_parsesdp(conf, priv, sdp);
|
||||
if (!session)
|
||||
return NULL;
|
||||
|
||||
|
@ -378,20 +376,22 @@ osmo_cc_session_t *osmo_cc_session_receive_offer(void *priv, const char *sdp)
|
|||
|
||||
void osmo_cc_session_accept_media(osmo_cc_session_media_t *media, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len))
|
||||
{
|
||||
osmo_cc_session_config_t *conf = media->session->config;
|
||||
|
||||
media->accepted = 1;
|
||||
if (nettype)
|
||||
media->connection_data_local.nettype = nettype;
|
||||
else
|
||||
media->connection_data_local.nettype = default_nettype;
|
||||
media->connection_data_local.nettype = conf->default_nettype;
|
||||
if (addrtype)
|
||||
media->connection_data_local.addrtype = addrtype;
|
||||
else
|
||||
media->connection_data_local.addrtype = default_addrtype;
|
||||
media->connection_data_local.addrtype = conf->default_addrtype;
|
||||
free((char *)media->connection_data_local.address);
|
||||
if (address)
|
||||
media->connection_data_local.address = strdup(address);
|
||||
else
|
||||
media->connection_data_local.address = strdup(default_unicast_address);
|
||||
media->connection_data_local.address = strdup(conf->default_unicast_address);
|
||||
media->send = send;
|
||||
media->receive = receive;
|
||||
media->receiver = receiver;
|
||||
|
@ -552,7 +552,7 @@ int osmo_cc_session_receive_answer(osmo_cc_session_t *session, const char *sdp)
|
|||
PDEBUG(DCC, DEBUG_DEBUG, "Parsing session answer.\n");
|
||||
|
||||
osmo_cc_debug_sdp(sdp);
|
||||
session_remote = osmo_cc_session_parsesdp(NULL, sdp);
|
||||
session_remote = osmo_cc_session_parsesdp(session->config, NULL, sdp);
|
||||
if (!session_remote)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -1,3 +1,24 @@
|
|||
/* configuration */
|
||||
|
||||
enum osmo_cc_session_nettype {
|
||||
osmo_cc_session_nettype_unknown = 0,
|
||||
osmo_cc_session_nettype_inet,
|
||||
};
|
||||
|
||||
enum osmo_cc_session_addrtype {
|
||||
osmo_cc_session_addrtype_unknown = 0,
|
||||
osmo_cc_session_addrtype_ipv4,
|
||||
osmo_cc_session_addrtype_ipv6,
|
||||
};
|
||||
|
||||
typedef struct osmo_cc_session_config {
|
||||
enum osmo_cc_session_nettype default_nettype;
|
||||
enum osmo_cc_session_addrtype default_addrtype;
|
||||
const char *default_unicast_address;
|
||||
uint16_t rtp_port_next;
|
||||
uint16_t rtp_port_from;
|
||||
uint16_t rtp_port_to;
|
||||
} osmo_cc_session_config_t;
|
||||
|
||||
/* session description, global part: */
|
||||
|
||||
|
@ -12,6 +33,7 @@ typedef struct osmo_cc_session_origin {
|
|||
|
||||
/* session instance */
|
||||
typedef struct osmo_cc_session {
|
||||
osmo_cc_session_config_t *config;
|
||||
void *priv;
|
||||
osmo_cc_session_origin_t origin_local, origin_remote;
|
||||
const char *name;
|
||||
|
@ -20,17 +42,6 @@ typedef struct osmo_cc_session {
|
|||
|
||||
/* connection description: */
|
||||
|
||||
enum osmo_cc_session_nettype {
|
||||
osmo_cc_session_nettype_unknown = 0,
|
||||
osmo_cc_session_nettype_inet,
|
||||
};
|
||||
|
||||
enum osmo_cc_session_addrtype {
|
||||
osmo_cc_session_addrtype_unknown = 0,
|
||||
osmo_cc_session_addrtype_ipv4,
|
||||
osmo_cc_session_addrtype_ipv6,
|
||||
};
|
||||
|
||||
typedef struct osmo_cc_session_connection_data {
|
||||
enum osmo_cc_session_nettype nettype;
|
||||
const char *nettype_name;
|
||||
|
@ -96,8 +107,8 @@ typedef struct osmo_cc_session_codec {
|
|||
#define osmo_cc_session_for_each_codec(head, c) \
|
||||
for (c = (head); c; c = c->next)
|
||||
|
||||
void osmo_cc_set_local_peer(enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address);
|
||||
osmo_cc_session_t *osmo_cc_new_session(void *priv, const char *username, const char *sess_id, const char *sess_version, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *unicast_address, const char *session_name, int debug);
|
||||
void osmo_cc_set_local_peer(osmo_cc_session_config_t *conf, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address);
|
||||
osmo_cc_session_t *osmo_cc_new_session(osmo_cc_session_config_t *conf, void *priv, const char *username, const char *sess_id, const char *sess_version, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *unicast_address, const char *session_name, int debug);
|
||||
void osmo_cc_free_session(osmo_cc_session_t *session);
|
||||
osmo_cc_session_media_t *osmo_cc_add_media(osmo_cc_session_t *session, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, enum osmo_cc_session_media_type type, uint16_t port, enum osmo_cc_session_media_proto proto, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len), int debug);
|
||||
void osmo_cc_free_media(osmo_cc_session_media_t *media);
|
||||
|
@ -105,7 +116,7 @@ osmo_cc_session_codec_t *osmo_cc_add_codec(osmo_cc_session_media_t *media, const
|
|||
void osmo_cc_free_codec(osmo_cc_session_codec_t *codec);
|
||||
int osmo_cc_session_check(struct osmo_cc_session *session, int remote);
|
||||
const char *osmo_cc_session_send_offer(osmo_cc_session_t *session);
|
||||
osmo_cc_session_t *osmo_cc_session_receive_offer(void *priv, const char *sdp);
|
||||
osmo_cc_session_t *osmo_cc_session_receive_offer(osmo_cc_session_config_t *conf, void *priv, const char *sdp);
|
||||
void osmo_cc_session_accept_media(osmo_cc_session_media_t *media, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len));
|
||||
void osmo_cc_session_accept_codec(osmo_cc_session_codec_t *codec, void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len), void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len));
|
||||
const char *osmo_cc_session_send_answer(osmo_cc_session_t *session);
|
||||
|
|
Loading…
Reference in New Issue