summaryrefslogtreecommitdiffstats
path: root/src/libosmocc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libosmocc')
-rw-r--r--src/libosmocc/helper.c50
-rw-r--r--src/libosmocc/message.c54
-rw-r--r--src/libosmocc/message.h3
-rw-r--r--src/libosmocc/session.c3
4 files changed, 94 insertions, 16 deletions
diff --git a/src/libosmocc/helper.c b/src/libosmocc/helper.c
index cde8b27..6317ed3 100644
--- a/src/libosmocc/helper.c
+++ b/src/libosmocc/helper.c
@@ -56,10 +56,10 @@ const char *osmo_cc_helper_audio_accept(void *priv, struct osmo_cc_helper_audio_
{
char offer_sdp[65536];
const char *accept_sdp;
- osmo_cc_session_media_t *media, *selected_media = NULL;
- osmo_cc_session_codec_t *codec, *selected_codec = NULL;
+ osmo_cc_session_media_t *media, *selected_media;
+ osmo_cc_session_codec_t *codec, *selected_codec, *telephone_event;
int rc;
- int i, selected_i;
+ int i, selected_codec_i, telephone_event_i;
if (*session_p) {
PDEBUG(DCC, DEBUG_ERROR, "Session already set, please fix!\n");
@@ -83,33 +83,53 @@ const char *osmo_cc_helper_audio_accept(void *priv, struct osmo_cc_helper_audio_
return NULL;
}
- selected_i = -1;
+ selected_media = NULL;
osmo_cc_session_for_each_media((*session_p)->media_list, media) {
/* only audio */
if (media->description.type != osmo_cc_session_media_type_audio)
continue;
+ selected_codec_i = -1;
+ selected_codec = NULL;
+ telephone_event_i = -1;
+ telephone_event = NULL;
osmo_cc_session_for_each_codec(media->codec_list, codec) {
- for (i = 0; codecs[i].payload_name; i++) {
- if (osmo_cc_session_if_codec(codec, codecs[i].payload_name, codecs[i].payload_rate, codecs[i].payload_channels)) {
- /* select the first matchting codec or the one we prefer */
- if (selected_i < 0 || i < selected_i) {
- selected_codec = codec;
- selected_media = media;
- selected_i = i;
+ if (!!strcasecmp(codec->payload_name, "telephone-event")) {
+ for (i = 0; codecs[i].payload_name; i++) {
+ if (osmo_cc_session_if_codec(codec, codecs[i].payload_name, codecs[i].payload_rate, codecs[i].payload_channels)) {
+ /* select the first matchting codec or the one we prefer */
+ if (selected_codec_i < 0 || i < selected_codec_i) {
+ selected_codec = codec;
+ selected_codec_i = i;
+ selected_media = media;
+ }
+ /* if we don't force our preferred codec, use the preferred one from the remote */
+ if (!force_our_codec)
+ break;
}
- /* if we don't force our preferred codec, use the preferred one from the remote */
- if (!force_our_codec)
- break;
+ }
+ } else {
+ /* special case: add telephone-event, if supported */
+ for (i = 0; codecs[i].payload_name; i++) {
+ if (!!strcasecmp(codecs[i].payload_name, "telephone-event"))
+ continue;
+ telephone_event = codec;
+ telephone_event_i = i;
+ break;
}
}
}
+ /* codec is selected within this media, we are done */
+ if (selected_codec)
+ break;
}
if (!selected_codec) {
PDEBUG(DCC, DEBUG_ERROR, "No codec found in setup message that we support.\n");
osmo_cc_free_session(*session_p);
return NULL;
}
- osmo_cc_session_accept_codec(selected_codec, codecs[selected_i].encoder, codecs[selected_i].decoder);
+ osmo_cc_session_accept_codec(selected_codec, codecs[selected_codec_i].encoder, codecs[selected_codec_i].decoder);
+ if (telephone_event)
+ osmo_cc_session_accept_codec(telephone_event, codecs[telephone_event_i].encoder, codecs[telephone_event_i].decoder);
osmo_cc_session_accept_media(selected_media, 0, 0, NULL, 1, 1, receiver);
osmo_cc_rtp_open(selected_media);
osmo_cc_rtp_connect(selected_media);
diff --git a/src/libosmocc/message.c b/src/libosmocc/message.c
index 0eb25ac..afee718 100644
--- a/src/libosmocc/message.c
+++ b/src/libosmocc/message.c
@@ -98,6 +98,60 @@ const char *osmo_cc_msg_name(uint8_t msg_type)
}
}
+const char *osmo_cc_network_type_name(uint8_t type)
+{
+ switch (type) {
+ case OSMO_CC_NETWORK_UNDEFINED:
+ return "";
+ case OSMO_CC_NETWORK_ALSA_NONE:
+ return "alsa";
+ case OSMO_CC_NETWORK_POTS_NONE:
+ return "pots";
+ case OSMO_CC_NETWORK_ISDN_NONE:
+ return "isdn";
+ case OSMO_CC_NETWORK_SIP_NONE:
+ return "sip";
+ case OSMO_CC_NETWORK_GSM_IMSI:
+ return "gsm-imsi";
+ case OSMO_CC_NETWORK_GSM_IMEI:
+ return "gsm-imei";
+ case OSMO_CC_NETWORK_WEB_NONE:
+ return "web";
+ case OSMO_CC_NETWORK_DECT_NONE:
+ return "decs";
+ case OSMO_CC_NETWORK_BLUETOOTH_NONE:
+ return "bluetooth";
+ case OSMO_CC_NETWORK_SS5_NONE:
+ return "ss5";
+ case OSMO_CC_NETWORK_ANETZ_NONE:
+ return "anetz";
+ case OSMO_CC_NETWORK_BNETZ_MUENZ:
+ return "bnetz";
+ case OSMO_CC_NETWORK_CNETZ_NONE:
+ return "cnetz";
+ case OSMO_CC_NETWORK_NMT_NONE:
+ return "nmt";
+ case OSMO_CC_NETWORK_R2000_NONE:
+ return "radiocom2000";
+ case OSMO_CC_NETWORK_AMPS_ESN:
+ return "amps";
+ case OSMO_CC_NETWORK_MTS_NONE:
+ return "mts";
+ case OSMO_CC_NETWORK_IMTS_NONE:
+ return "imts";
+ case OSMO_CC_NETWORK_EUROSIGNAL_NONE:
+ return "eurosignal";
+ case OSMO_CC_NETWORK_JOLLYCOM_NONE:
+ return "jollycom";
+ case OSMO_CC_NETWORK_MPT1327_PSTN:
+ return "mpt1327-pstn";
+ case OSMO_CC_NETWORK_MPT1327_PBX:
+ return "mpt1327-pbx";
+ default:
+ return "<unknown>";
+ }
+}
+
/* create message with maximum size */
osmo_cc_msg_t *osmo_cc_new_msg(uint8_t msg_type)
{
diff --git a/src/libosmocc/message.h b/src/libosmocc/message.h
index 7821988..7f0b228 100644
--- a/src/libosmocc/message.h
+++ b/src/libosmocc/message.h
@@ -251,6 +251,8 @@ enum osmo_cc_ie_type {
#define OSMO_CC_NETWORK_IMTS_NONE 0x87
#define OSMO_CC_NETWORK_EUROSIGNAL_NONE 0x88
#define OSMO_CC_NETWORK_JOLLYCOM_NONE 0x89 /* call from JollyCom... */
+#define OSMO_CC_NETWORK_MPT1327_PSTN 0x8a /* call from MPT1327 */
+#define OSMO_CC_NETWORK_MPT1327_PBX 0x8b /* id is selected PBX number */
typedef struct osmo_cc_msg {
uint8_t type;
@@ -379,6 +381,7 @@ struct osmo_cc_ie_private {
uint32_t osmo_cc_new_callref(void);
const char *osmo_cc_msg_name(uint8_t msg_type);
+const char *osmo_cc_network_type_name(uint8_t type);
osmo_cc_msg_t *osmo_cc_new_msg(uint8_t msg_type);
osmo_cc_msg_t *osmo_cc_clone_msg(osmo_cc_msg_t *msg);
osmo_cc_msg_t *osmo_cc_msg_list_dequeue(osmo_cc_msg_list_t **mlp, uint32_t *callref_p);
diff --git a/src/libosmocc/session.c b/src/libosmocc/session.c
index 9751845..1438ae2 100644
--- a/src/libosmocc/session.c
+++ b/src/libosmocc/session.c
@@ -26,6 +26,7 @@
#include <inttypes.h>
#include "../libtimer/timer.h"
#include "../libdebug/debug.h"
+#include "../liboptions/options.h"
#include "endpoint.h"
#define NTP_OFFSET 2208988800
@@ -38,7 +39,7 @@ void osmo_cc_set_local_peer(enum osmo_cc_session_nettype nettype, enum osmo_cc_s
{
default_nettype = nettype;
default_addrtype = addrtype;
- default_unicast_address = strdup(address);
+ 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)