- Fix DTLS-SRTP interop issues

- Use DTLS-SRTP instead of SDES-SRTP when RTCWeb mode is enabled and certificates are present
This commit is contained in:
bossiel 2014-02-14 01:32:49 +00:00
parent 4813b9287c
commit 70f4e36fd3
25 changed files with 217 additions and 32 deletions

View File

@ -537,6 +537,10 @@ bool MediaSessionMgr::defaultsSetAvpfTail(unsigned tail_min, unsigned tail_max){
return (tmedia_defaults_set_avpf_tail(tail_min, tail_max) == 0);
}
bool MediaSessionMgr::defaultsSetUseAvpfEnabled(bool enabled){
return (tmedia_defaults_set_avpf_enabled(enabled ? tsk_true : tsk_false) == 0);
}
bool MediaSessionMgr::defaultsSetOpusMaxCaptureRate(uint32_t opus_maxcapturerate){
return (tmedia_defaults_set_opus_maxcapturerate(opus_maxcapturerate) == 0);
}

View File

@ -155,6 +155,7 @@ public:
static bool defaultsSetRtpBuffSize(unsigned buffSize);
static unsigned defaultsGetRtpBuffSize();
static bool defaultsSetAvpfTail(unsigned tail_min, unsigned tail_max);
static bool defaultsSetUseAvpfEnabled(bool enabled);
static bool defaultsSetOpusMaxCaptureRate(uint32_t opus_maxcapturerate);
static bool defaultsSetOpusMaxPlaybackRate(uint32_t opus_maxplaybackrate);
static bool defaultsSetMaxFds(int32_t max_fds);

View File

@ -419,6 +419,11 @@ public class MediaSessionMgr : IDisposable {
return ret;
}
public static bool defaultsSetUseAvpfEnabled(bool enabled) {
bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetUseAvpfEnabled(enabled);
return ret;
}
public static bool defaultsSetOpusMaxCaptureRate(uint opus_maxcapturerate) {
bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetOpusMaxCaptureRate(opus_maxcapturerate);
return ret;

View File

@ -516,6 +516,9 @@ class tinyWRAPPINVOKE {
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetAvpfTail")]
public static extern bool MediaSessionMgr_defaultsSetAvpfTail(uint jarg1, uint jarg2);
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetUseAvpfEnabled")]
public static extern bool MediaSessionMgr_defaultsSetUseAvpfEnabled(bool jarg1);
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetOpusMaxCaptureRate")]
public static extern bool MediaSessionMgr_defaultsSetOpusMaxCaptureRate(uint jarg1);

View File

@ -2514,6 +2514,18 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetAvpfTail(u
}
SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetUseAvpfEnabled(unsigned int jarg1) {
unsigned int jresult ;
bool arg1 ;
bool result;
arg1 = jarg1 ? true : false;
result = (bool)MediaSessionMgr::defaultsSetUseAvpfEnabled(arg1);
jresult = result;
return jresult;
}
SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetOpusMaxCaptureRate(unsigned int jarg1) {
unsigned int jresult ;
uint32_t arg1 ;

View File

@ -338,6 +338,10 @@ public class MediaSessionMgr {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetAvpfTail(tail_min, tail_max);
}
public static boolean defaultsSetUseAvpfEnabled(boolean enabled) {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetUseAvpfEnabled(enabled);
}
public static boolean defaultsSetOpusMaxCaptureRate(long opus_maxcapturerate) {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetOpusMaxCaptureRate(opus_maxcapturerate);
}

View File

@ -338,6 +338,10 @@ public class MediaSessionMgr {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetAvpfTail(tail_min, tail_max);
}
public static boolean defaultsSetUseAvpfEnabled(boolean enabled) {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetUseAvpfEnabled(enabled);
}
public static boolean defaultsSetOpusMaxCaptureRate(long opus_maxcapturerate) {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetOpusMaxCaptureRate(opus_maxcapturerate);
}

View File

@ -119,6 +119,7 @@ public class tinyWRAPJNI {
public final static native boolean MediaSessionMgr_defaultsSetRtpBuffSize(long jarg1);
public final static native long MediaSessionMgr_defaultsGetRtpBuffSize();
public final static native boolean MediaSessionMgr_defaultsSetAvpfTail(long jarg1, long jarg2);
public final static native boolean MediaSessionMgr_defaultsSetUseAvpfEnabled(boolean jarg1);
public final static native boolean MediaSessionMgr_defaultsSetOpusMaxCaptureRate(long jarg1);
public final static native boolean MediaSessionMgr_defaultsSetOpusMaxPlaybackRate(long jarg1);
public final static native boolean MediaSessionMgr_defaultsSetMaxFds(int jarg1);

View File

@ -3704,6 +3704,20 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionM
}
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetUseAvpfEnabled(JNIEnv *jenv, jclass jcls, jboolean jarg1) {
jboolean jresult = 0 ;
bool arg1 ;
bool result;
(void)jenv;
(void)jcls;
arg1 = jarg1 ? true : false;
result = (bool)MediaSessionMgr::defaultsSetUseAvpfEnabled(arg1);
jresult = (jboolean)result;
return jresult;
}
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetOpusMaxCaptureRate(JNIEnv *jenv, jclass jcls, jlong jarg1) {
jboolean jresult = 0 ;
uint32_t arg1 ;

View File

@ -119,6 +119,7 @@ public class tinyWRAPJNI {
public final static native boolean MediaSessionMgr_defaultsSetRtpBuffSize(long jarg1);
public final static native long MediaSessionMgr_defaultsGetRtpBuffSize();
public final static native boolean MediaSessionMgr_defaultsSetAvpfTail(long jarg1, long jarg2);
public final static native boolean MediaSessionMgr_defaultsSetUseAvpfEnabled(boolean jarg1);
public final static native boolean MediaSessionMgr_defaultsSetOpusMaxCaptureRate(long jarg1);
public final static native boolean MediaSessionMgr_defaultsSetOpusMaxPlaybackRate(long jarg1);
public final static native boolean MediaSessionMgr_defaultsSetMaxFds(int jarg1);

View File

@ -3704,6 +3704,20 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionM
}
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetUseAvpfEnabled(JNIEnv *jenv, jclass jcls, jboolean jarg1) {
jboolean jresult = 0 ;
bool arg1 ;
bool result;
(void)jenv;
(void)jcls;
arg1 = jarg1 ? true : false;
result = (bool)MediaSessionMgr::defaultsSetUseAvpfEnabled(arg1);
jresult = (jboolean)result;
return jresult;
}
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetOpusMaxCaptureRate(JNIEnv *jenv, jclass jcls, jlong jarg1) {
jboolean jresult = 0 ;
uint32_t arg1 ;

View File

@ -304,6 +304,7 @@ sub DESTROY {
*defaultsSetRtpBuffSize = *tinyWRAPc::MediaSessionMgr_defaultsSetRtpBuffSize;
*defaultsGetRtpBuffSize = *tinyWRAPc::MediaSessionMgr_defaultsGetRtpBuffSize;
*defaultsSetAvpfTail = *tinyWRAPc::MediaSessionMgr_defaultsSetAvpfTail;
*defaultsSetUseAvpfEnabled = *tinyWRAPc::MediaSessionMgr_defaultsSetUseAvpfEnabled;
*defaultsSetOpusMaxCaptureRate = *tinyWRAPc::MediaSessionMgr_defaultsSetOpusMaxCaptureRate;
*defaultsSetOpusMaxPlaybackRate = *tinyWRAPc::MediaSessionMgr_defaultsSetOpusMaxPlaybackRate;
*defaultsSetMaxFds = *tinyWRAPc::MediaSessionMgr_defaultsSetMaxFds;

View File

@ -5739,6 +5739,34 @@ XS(_wrap_MediaSessionMgr_defaultsSetAvpfTail) {
}
XS(_wrap_MediaSessionMgr_defaultsSetUseAvpfEnabled) {
{
bool arg1 ;
bool val1 ;
int ecode1 = 0 ;
int argvi = 0;
bool result;
dXSARGS;
if ((items < 1) || (items > 1)) {
SWIG_croak("Usage: MediaSessionMgr_defaultsSetUseAvpfEnabled(enabled);");
}
ecode1 = SWIG_AsVal_bool SWIG_PERL_CALL_ARGS_2(ST(0), &val1);
if (!SWIG_IsOK(ecode1)) {
SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetUseAvpfEnabled" "', argument " "1"" of type '" "bool""'");
}
arg1 = static_cast< bool >(val1);
result = (bool)MediaSessionMgr::defaultsSetUseAvpfEnabled(arg1);
ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ;
XSRETURN(argvi);
fail:
SWIG_croak_null();
}
}
XS(_wrap_MediaSessionMgr_defaultsSetOpusMaxCaptureRate) {
{
uint32_t arg1 ;
@ -27676,6 +27704,7 @@ static swig_command_info swig_commands[] = {
{"tinyWRAPc::MediaSessionMgr_defaultsSetRtpBuffSize", _wrap_MediaSessionMgr_defaultsSetRtpBuffSize},
{"tinyWRAPc::MediaSessionMgr_defaultsGetRtpBuffSize", _wrap_MediaSessionMgr_defaultsGetRtpBuffSize},
{"tinyWRAPc::MediaSessionMgr_defaultsSetAvpfTail", _wrap_MediaSessionMgr_defaultsSetAvpfTail},
{"tinyWRAPc::MediaSessionMgr_defaultsSetUseAvpfEnabled", _wrap_MediaSessionMgr_defaultsSetUseAvpfEnabled},
{"tinyWRAPc::MediaSessionMgr_defaultsSetOpusMaxCaptureRate", _wrap_MediaSessionMgr_defaultsSetOpusMaxCaptureRate},
{"tinyWRAPc::MediaSessionMgr_defaultsSetOpusMaxPlaybackRate", _wrap_MediaSessionMgr_defaultsSetOpusMaxPlaybackRate},
{"tinyWRAPc::MediaSessionMgr_defaultsSetMaxFds", _wrap_MediaSessionMgr_defaultsSetMaxFds},

View File

@ -315,6 +315,8 @@ class MediaSessionMgr(_object):
if _newclass:defaultsGetRtpBuffSize = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsGetRtpBuffSize)
__swig_getmethods__["defaultsSetAvpfTail"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetAvpfTail
if _newclass:defaultsSetAvpfTail = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetAvpfTail)
__swig_getmethods__["defaultsSetUseAvpfEnabled"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetUseAvpfEnabled
if _newclass:defaultsSetUseAvpfEnabled = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetUseAvpfEnabled)
__swig_getmethods__["defaultsSetOpusMaxCaptureRate"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetOpusMaxCaptureRate
if _newclass:defaultsSetOpusMaxCaptureRate = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetOpusMaxCaptureRate)
__swig_getmethods__["defaultsSetOpusMaxPlaybackRate"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetOpusMaxPlaybackRate
@ -576,6 +578,10 @@ def MediaSessionMgr_defaultsSetAvpfTail(*args):
return _tinyWRAP.MediaSessionMgr_defaultsSetAvpfTail(*args)
MediaSessionMgr_defaultsSetAvpfTail = _tinyWRAP.MediaSessionMgr_defaultsSetAvpfTail
def MediaSessionMgr_defaultsSetUseAvpfEnabled(*args):
return _tinyWRAP.MediaSessionMgr_defaultsSetUseAvpfEnabled(*args)
MediaSessionMgr_defaultsSetUseAvpfEnabled = _tinyWRAP.MediaSessionMgr_defaultsSetUseAvpfEnabled
def MediaSessionMgr_defaultsSetOpusMaxCaptureRate(*args):
return _tinyWRAP.MediaSessionMgr_defaultsSetOpusMaxCaptureRate(*args)
MediaSessionMgr_defaultsSetOpusMaxCaptureRate = _tinyWRAP.MediaSessionMgr_defaultsSetOpusMaxCaptureRate

View File

@ -8355,6 +8355,28 @@ fail:
}
SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetUseAvpfEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
bool arg1 ;
bool val1 ;
int ecode1 = 0 ;
PyObject * obj0 = 0 ;
bool result;
if (!PyArg_ParseTuple(args,(char *)"O:MediaSessionMgr_defaultsSetUseAvpfEnabled",&obj0)) SWIG_fail;
ecode1 = SWIG_AsVal_bool(obj0, &val1);
if (!SWIG_IsOK(ecode1)) {
SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetUseAvpfEnabled" "', argument " "1"" of type '" "bool""'");
}
arg1 = static_cast< bool >(val1);
result = (bool)MediaSessionMgr::defaultsSetUseAvpfEnabled(arg1);
resultobj = SWIG_From_bool(static_cast< bool >(result));
return resultobj;
fail:
return NULL;
}
SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetOpusMaxCaptureRate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
uint32_t arg1 ;
@ -26062,6 +26084,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"MediaSessionMgr_defaultsSetRtpBuffSize", _wrap_MediaSessionMgr_defaultsSetRtpBuffSize, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsGetRtpBuffSize", _wrap_MediaSessionMgr_defaultsGetRtpBuffSize, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsSetAvpfTail", _wrap_MediaSessionMgr_defaultsSetAvpfTail, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsSetUseAvpfEnabled", _wrap_MediaSessionMgr_defaultsSetUseAvpfEnabled, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsSetOpusMaxCaptureRate", _wrap_MediaSessionMgr_defaultsSetOpusMaxCaptureRate, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsSetOpusMaxPlaybackRate", _wrap_MediaSessionMgr_defaultsSetOpusMaxPlaybackRate, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsSetMaxFds", _wrap_MediaSessionMgr_defaultsSetMaxFds, METH_VARARGS, NULL},

Binary file not shown.

View File

@ -49,6 +49,7 @@ typedef struct tdav_session_av_s
tsk_bool_t use_rtcp;
tsk_bool_t use_rtcpmux;
tmedia_type_t media_type;
tmedia_profile_t media_profile;
tsk_bool_t use_avpf;
tsk_bool_t use_srtp;
tsk_bool_t is_webrtc2sip_mode_enabled;

View File

@ -202,8 +202,7 @@ static int _sdp_pcfgs_cat(const sdp_pcfg_xt (*pcfgs_src)[SDP_CAPS_COUNT_MAX], sd
int tdav_session_av_init(tdav_session_av_t* self, tmedia_type_t media_type)
{
uint64_t session_id;
tmedia_profile_t profile = tmedia_defaults_get_profile(); // default profile, will be updated by the SIP session
if(!self){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
@ -212,16 +211,17 @@ int tdav_session_av_init(tdav_session_av_t* self, tmedia_type_t media_type)
/* base::init(): called by tmedia_session_create() */
self->media_type = media_type;
self->media_profile = tmedia_defaults_get_profile();
self->use_rtcp = tmedia_defaults_get_rtcp_enabled();
self->use_rtcpmux = tmedia_defaults_get_rtcpmux_enabled();
self->use_avpf = (profile == tmedia_profile_rtcweb); // negotiate if not RTCWeb profile or RFC5939 is in action
self->use_avpf = (self->media_profile == tmedia_profile_rtcweb) || tmedia_defaults_get_avpf_enabled(); // negotiate if not RTCWeb profile or RFC5939 is in action
self->bandwidth_max_upload_kbps = (media_type == tmedia_video ? tmedia_defaults_get_bandwidth_video_upload_max() : INT_MAX); // INT_MAX or <=0 means undefined
self->bandwidth_max_download_kbps = (media_type == tmedia_video ? tmedia_defaults_get_bandwidth_video_download_max() : INT_MAX); // INT_MAX or <=0 means undefined
self->congestion_ctrl_enabled = tmedia_defaults_get_congestion_ctrl_enabled(); // whether to enable draft-alvestrand-rtcweb-congestion-03 and draft-alvestrand-rmcat-remb-01
#if HAVE_SRTP
// this is the default value and can be updated by the user using "session_set('srtp-mode', mode_e)"
self->srtp_type = (profile == tmedia_profile_rtcweb) ? tmedia_srtp_type_sdes : tmedia_defaults_get_srtp_type();
self->srtp_mode = (profile == tmedia_profile_rtcweb) ? tmedia_srtp_mode_mandatory : tmedia_defaults_get_srtp_mode();
self->srtp_type = (self->media_profile == tmedia_profile_rtcweb) ? (tsk_strnullORempty(TMEDIA_SESSION(self)->dtls.file_pbk) ? tmedia_srtp_type_sdes : tmedia_srtp_type_dtls) : tmedia_defaults_get_srtp_type();
self->srtp_mode = (self->media_profile == tmedia_profile_rtcweb) ? tmedia_srtp_mode_mandatory : tmedia_defaults_get_srtp_mode();
self->use_srtp = (self->srtp_mode == tmedia_srtp_mode_mandatory); // if optional -> negotiate
// remove DTLS-SRTP option if not supported
if((self->srtp_type & tmedia_srtp_type_dtls) && !tnet_dtls_is_srtp_supported()){
@ -407,6 +407,14 @@ int tdav_session_av_prepare(tdav_session_av_t* self)
return -1;
}
/* SRTPType */
#if HAVE_SRTP
// Now that SSL certs are defined update SRTPType before creating the RTP manager
if (self->media_profile == tmedia_profile_rtcweb) {
self->srtp_type = tsk_strnullORempty(TMEDIA_SESSION(self)->dtls.file_pbk) ? tmedia_srtp_type_sdes : tmedia_srtp_type_dtls;
}
#endif
/* set local port */
if(!self->rtp_manager){
self->rtp_manager = self->ice_ctx ? trtp_manager_create_2(self->ice_ctx, self->srtp_type, self->srtp_mode)
@ -429,6 +437,7 @@ int tdav_session_av_prepare(tdav_session_av_t* self)
}
}
}
if((self->srtp_type & tmedia_srtp_type_dtls) && (self->srtp_mode == tmedia_srtp_mode_optional || self->srtp_mode == tmedia_srtp_mode_mandatory)){
if((ret = trtp_manager_set_dtls_certs(self->rtp_manager, TMEDIA_SESSION(self)->dtls.file_ca, TMEDIA_SESSION(self)->dtls.file_pbk, TMEDIA_SESSION(self)->dtls.file_pvk, TMEDIA_SESSION(self)->dtls.verify))){
return ret;
@ -931,14 +940,15 @@ const tsdp_header_M_t* tdav_session_av_get_lo(tdav_session_av_t* self, tsk_bool_
const char* fp_str = trtp_manager_get_dtls_local_fingerprint(self->rtp_manager, TDAV_DFAULT_FP_HASH);
if(fp_str){
tsk_sprintf(&str, "%s %s", TNET_DTLS_HASH_NAMES[TDAV_DFAULT_FP_HASH], fp_str);
//!\ From RFC 5763 (DTLS-SRTP Framework) §5: The endpoint MUST NOT use the connection attribute defined in [RFC4145].
#if TDAV_FIXME_MEDIA_LEVEL_DTLS_ATT
tsdp_header_M_add_headers(base->M.lo, TSDP_HEADER_A_VA_ARGS("fingerprint", str), tsk_null);
tsdp_header_M_add_headers(base->M.lo, TSDP_HEADER_A_VA_ARGS("setup", "active"), tsk_null);
tsdp_header_M_add_headers(base->M.lo, TSDP_HEADER_A_VA_ARGS("connection", "new"), tsk_null);
tsdp_header_M_add_headers(base->M.lo, TSDP_HEADER_A_VA_ARGS("setup", TNET_DTLS_SETUP_NAMES[self->dtls.local.setup]), tsk_null);
// tsdp_header_M_add_headers(base->M.lo, TSDP_HEADER_A_VA_ARGS("connection", self->dtls.local.connection_new ? "new" : "existing"), tsk_null);
#else
_first_media_add_headers(self->local_sdp, TSDP_HEADER_A_VA_ARGS("fingerprint", str), tsk_null);
_first_media_add_headers(self->local_sdp, TSDP_HEADER_A_VA_ARGS("setup", TNET_DTLS_SETUP_NAMES[self->dtls.local.setup]), tsk_null);
_first_media_add_headers(self->local_sdp, TSDP_HEADER_A_VA_ARGS("connection", self->dtls.local.connection_new ? "new" : "existing"), tsk_null);
// _first_media_add_headers(self->local_sdp, TSDP_HEADER_A_VA_ARGS("connection", self->dtls.local.connection_new ? "new" : "existing"), tsk_null);
#endif
}
}

View File

@ -24,16 +24,16 @@
static tipsec_ipproto_t __ipproto = tipsec_ipproto_udp;
static tsk_bool_t __use_ipv6 = tsk_false;
static tipsec_mode_t __mode = tipsec_mode_trans;
static tipsec_ealg_t __ealg = tipsec_ealg_des_ede3_cbc;
static tipsec_ealg_t __ealg = tipsec_ealg_null;
static tipsec_alg_t __alg = tipsec_alg_hmac_md5_96;
static tipsec_proto_t __proto = tipsec_proto_ah;
static tipsec_proto_t __proto = tipsec_proto_esp;
static const char* __addr_local = "0.0.0.0";
static const char* __addr_remote = "192.168.0.34";
static tipsec_port_t __port_local_out = 5062; // PORT_UC
static const char* __addr_local = "192.168.0.37"; // overrided using command line args
static const char* __addr_remote = "192.168.0.31"; // overrided using command line args
static tipsec_port_t __port_local_in = 5064; // PORT_US
static tipsec_port_t __port_remote_out = 5066; // PORT_PC
static tipsec_port_t __port_local_out = 5062; // PORT_UC
static tipsec_port_t __port_remote_in = 5068; // PORT_PS
static tipsec_port_t __port_remote_out = 5066; // PORT_PC
static tipsec_spi_t __spi_remote_out = 3333; // SPI_PC
static tipsec_spi_t __spi_remote_in = 4444; // SPI_PS
static tipsec_lifetime_t __lifetime = 1800; /* always set it to the maximum value. (Not possible to update the value after REGISTER 200OK. ) */
@ -75,10 +75,10 @@ static tsk_bool_t test_ipsec_is_winvista_or_later()
}
#endif
#ifdef _WIN32_WCE
int _tmain(int argc, _TCHAR* argv[])
#if defined(_WIN32_WCE)
int _tmain()
#else
int main()
int main(int argc, const char* argv[])
#endif
{
int err = 0;
@ -93,6 +93,26 @@ int main()
};
static const tsk_size_t __plugins_count = sizeof(__plugins_path)/sizeof(__plugins_path[0]);
#define BUF_SIZE 1024
char buffer[BUF_SIZE];
/* Set debug level to INFO */
tsk_debug_set_level(DEBUG_LEVEL_INFO);
// Command line "local_ip" "local_port_in" "local_port_out" "remote_ip" "remote_port_in" "remote_port_out"
if (argc == (6 + 1)) {
__addr_local = argv[1];
__port_local_in = atoi(argv[2]);
__port_local_out = atoi(argv[3]);
__addr_remote = argv[4];
__port_remote_in = atoi(argv[5]);
__port_remote_out = atoi(argv[6]);
}
TSK_DEBUG_INFO("Local node=%s:%d/%d, remote node=%s:%d/%d",
__addr_local, __port_local_in, __port_local_out,
__addr_remote, __port_remote_in, __port_remote_out);
/* Create the plugin */
for (i = 0; i < __plugins_count; ++i) {
if (tsk_plugin_file_exist(__plugins_path[i])) {
@ -121,6 +141,24 @@ int main()
// Dump SPIs created by the OS after calling set_local()
TSK_DEBUG_INFO("SPI-UC=%u, SPI-US=%u", p_ctx->spi_uc, p_ctx->spi_us);
// Enter Remote SPI in
TSK_DEBUG_INFO("Enter remote SPI in:");
if (fgets(buffer, BUF_SIZE, stdin)) {
if (buffer[0] != 10 && buffer[1] != 0) {
__spi_remote_in = strtoul (buffer, NULL, 0);
}
}
// Enter Remote SPI out
TSK_DEBUG_INFO("Enter remote SPI out:");
if (fgets(buffer, BUF_SIZE, stdin)) {
if (buffer[0] != 10 && buffer[1] != 0) {
__spi_remote_out = strtoul (buffer, NULL, 0);
}
}
TSK_DEBUG_INFO("SPI remote %u/%u", __spi_remote_in, __spi_remote_out);
/* Set remote */
err = tipsec_ctx_set_remote(p_ctx, __spi_remote_out, __spi_remote_in, __port_remote_out, __port_remote_in, __lifetime);
if (err) {

View File

@ -120,7 +120,7 @@
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;&quot;$(SolutionDir)\src&quot;;..\..\tinySAK\src"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
WarningLevel="3"

View File

@ -120,6 +120,8 @@ TINYMEDIA_API tsk_bool_t tmedia_defaults_get_video_zeroartifacts_enabled();
TINYMEDIA_API int tmedia_defaults_set_rtpbuff_size(tsk_size_t rtpbuff_size);
TINYMEDIA_API tsk_size_t tmedia_defaults_get_rtpbuff_size();
TINYMEDIA_API int tmedia_defaults_set_avpf_tail(tsk_size_t tail_min, tsk_size_t tail_max);
TINYMEDIA_API int tmedia_defaults_set_avpf_enabled(tsk_bool_t enabled);
TINYMEDIA_API tsk_bool_t tmedia_defaults_get_avpf_enabled();
TINYMEDIA_API tsk_size_t tmedia_defaults_get_avpf_tail_min();
TINYMEDIA_API tsk_size_t tmedia_defaults_get_avpf_tail_max();
TINYMEDIA_API int tmedia_defaults_set_opus_maxcapturerate(uint32_t opus_maxcapturerate);

View File

@ -80,6 +80,7 @@ static tsk_bool_t __video_zeroartifacts_enabled = tsk_false; // Requires from re
static tsk_size_t __rtpbuff_size = 0x1FFFE; // Network buffer size use for RTP (SO_RCVBUF, SO_SNDBUF)
static tsk_size_t __avpf_tail_min = 20; // Min size for tail used to honor RTCP-NACK requests
static tsk_size_t __avpf_tail_max = 160; // Max size for tail used to honor RTCP-NACK requests
static tsk_bool_t __avpf_enabled = tsk_false; // Whether to use AVPF instead of AVP
static uint32_t __opus_maxcapturerate = 16000; // supported: 8k,12k,16k,24k,48k. IMPORTANT: only 8k and 16k will work with WebRTC AEC
static uint32_t __opus_maxplaybackrate = 48000; // supported: 8k,12k,16k,24k,48k
static char* __ssl_certs_priv_path = tsk_null;
@ -515,6 +516,13 @@ tsk_size_t tmedia_defaults_get_avpf_tail_max(){
return __avpf_tail_max;
}
int tmedia_defaults_set_avpf_enabled(tsk_bool_t enabled){
__avpf_enabled = enabled;
return 0;
}
tsk_bool_t tmedia_defaults_get_avpf_enabled(){
return __avpf_enabled;
}
int tmedia_defaults_set_opus_maxcapturerate(uint32_t opus_maxcapturerate){
switch(opus_maxcapturerate){

View File

@ -40,6 +40,7 @@ typedef struct tnet_dtls_socket_s
tsk_bool_t verify_peer;
tsk_bool_t use_srtp;
tsk_bool_t handshake_completed;
tsk_bool_t handshake_started;
tnet_dtls_setup_t setup;
struct{
@ -460,17 +461,20 @@ int tnet_dtls_socket_do_handshake(tnet_dtls_socket_handle_t* handle, const struc
return 0;
}
if((ret = SSL_do_handshake(socket->ssl)) != 1){
switch((ret = SSL_get_error(socket->ssl, ret))){
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE:
case SSL_ERROR_NONE:
break;
default:
TSK_DEBUG_ERROR("DTLS handshake failed [%s]", ERR_error_string(ERR_get_error(), tsk_null));
_tnet_dtls_socket_raise_event_dataless(socket, tnet_dtls_socket_event_type_handshake_failed);
return -2;
if (!socket->handshake_started) {
if((ret = SSL_do_handshake(socket->ssl)) != 1){
switch((ret = SSL_get_error(socket->ssl, ret))){
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE:
case SSL_ERROR_NONE:
break;
default:
TSK_DEBUG_ERROR("DTLS handshake failed [%s]", ERR_error_string(ERR_get_error(), tsk_null));
_tnet_dtls_socket_raise_event_dataless(socket, tnet_dtls_socket_event_type_handshake_failed);
return -2;
}
}
socket->handshake_started = (ret == SSL_ERROR_NONE); // TODO: reset for renegotiation
}
#if 0

View File

@ -44,7 +44,7 @@
#include <string.h> /* memcpy, ...(<#void * #>, <#const void * #>, <#tsk_size_t #>) */
#ifndef TNET_CIPHER_LIST
# define TNET_CIPHER_LIST "DEFAULT:!LOW:!EXP:!MD5"
# define TNET_CIPHER_LIST "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"
#endif
extern int tnet_transport_prepare(tnet_transport_t *transport);
@ -100,9 +100,9 @@ static int _tnet_transport_ssl_init(tnet_transport_t* transport)
return -5;
}
SSL_CTX_set_read_ahead(transport->dtls.ctx, 1);
SSL_CTX_set_options(transport->dtls.ctx, SSL_OP_ALL);
SSL_CTX_set_mode(transport->dtls.ctx, SSL_MODE_AUTO_RETRY);
SSL_CTX_set_verify(transport->dtls.ctx, SSL_VERIFY_NONE, tsk_null); // to be updated by tnet_transport_tls_set_certs()
// SSL_CTX_set_options(transport->dtls.ctx, SSL_OP_ALL);
// SSL_CTX_set_mode(transport->dtls.ctx, SSL_MODE_AUTO_RETRY);
SSL_CTX_set_verify(transport->dtls.ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, tsk_null); // to be updated by tnet_transport_tls_set_certs()
if(SSL_CTX_set_cipher_list(transport->dtls.ctx, TNET_CIPHER_LIST) <= 0){
TSK_DEBUG_ERROR("SSL_CTX_set_cipher_list failed [%s]", ERR_error_string(ERR_get_error(), tsk_null));
return -6;