summaryrefslogtreecommitdiffstats
path: root/tinyDAV/src/bfcp/tdav_session_bfcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'tinyDAV/src/bfcp/tdav_session_bfcp.c')
-rwxr-xr-xtinyDAV/src/bfcp/tdav_session_bfcp.c1187
1 files changed, 591 insertions, 596 deletions
diff --git a/tinyDAV/src/bfcp/tdav_session_bfcp.c b/tinyDAV/src/bfcp/tdav_session_bfcp.c
index 07e770b..c69babc 100755
--- a/tinyDAV/src/bfcp/tdav_session_bfcp.c
+++ b/tinyDAV/src/bfcp/tdav_session_bfcp.c
@@ -1,17 +1,17 @@
/* Copyright (C) 2014 Mamadou DIOP.
-*
+*
* This file is part of Open Source Doubango Framework.
*
* DOUBANGO is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
-*
+*
* DOUBANGO 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 General Public License
* along with DOUBANGO.
*
@@ -40,37 +40,36 @@
* https://tools.ietf.org/html/draft-ietf-bfcpbis-rfc4582bis-1
*/
-typedef struct tdav_session_bfcp_s
-{
- TMEDIA_DECLARE_SESSION_BFCP;
-
- struct tbfcp_session_s* p_bfcp_s;
- struct tbfcp_pkt_s* p_pkt_FloorRequest;
- struct tbfcp_pkt_s* p_pkt_FloorRelease;
- struct tbfcp_pkt_s* p_pkt_Hello;
-
- tsk_bool_t b_started;
- tsk_bool_t b_use_ipv6;
- tsk_bool_t b_revoked_handled;
- tsk_bool_t b_conf_idf_changed;
- tsk_bool_t b_stop_to_reconf;
-
- char* p_local_ip;
- //uint16_t local_port;
-
- /* NAT Traversal context */
- struct tnet_nat_ctx_s* p_natt_ctx;
-
- char* p_remote_ip;
- uint16_t u_remote_port;
-
- // https://tools.ietf.org/html/rfc4583 attributes
- struct {
- char* confid;
- char* floorid;
- char* mstrm;
- char* userid;
- } rfc4583;
+typedef struct tdav_session_bfcp_s {
+ TMEDIA_DECLARE_SESSION_BFCP;
+
+ struct tbfcp_session_s* p_bfcp_s;
+ struct tbfcp_pkt_s* p_pkt_FloorRequest;
+ struct tbfcp_pkt_s* p_pkt_FloorRelease;
+ struct tbfcp_pkt_s* p_pkt_Hello;
+
+ tsk_bool_t b_started;
+ tsk_bool_t b_use_ipv6;
+ tsk_bool_t b_revoked_handled;
+ tsk_bool_t b_conf_idf_changed;
+ tsk_bool_t b_stop_to_reconf;
+
+ char* p_local_ip;
+ //uint16_t local_port;
+
+ /* NAT Traversal context */
+ struct tnet_nat_ctx_s* p_natt_ctx;
+
+ char* p_remote_ip;
+ uint16_t u_remote_port;
+
+ // https://tools.ietf.org/html/rfc4583 attributes
+ struct {
+ char* confid;
+ char* floorid;
+ char* mstrm;
+ char* userid;
+ } rfc4583;
}
tdav_session_bfcp_t;
@@ -81,402 +80,402 @@ static int _tdav_session_bfcp_send_Hello(tdav_session_bfcp_t* p_bfcp);
static int _tdav_session_bfcp_set(tmedia_session_t* p_self, const tmedia_param_t* param)
{
- int ret = 0;
- tdav_session_bfcp_t* p_bfcp;
-
- if (!p_self) {
- TSK_DEBUG_ERROR("Invalid parameter");
- return -1;
- }
-
- TSK_DEBUG_INFO("tdav_session_bfcp_set");
-
- p_bfcp = (tdav_session_bfcp_t*)p_self;
-
- if (param->value_type == tmedia_pvt_pchar) {
- if (tsk_striequals(param->key, "remote-ip")) {
- // only if no ip associated to the "m=" line
- if (param->value && !p_bfcp->p_remote_ip) {
- p_bfcp->p_remote_ip = tsk_strdup(param->value);
- }
- }
- else if (tsk_striequals(param->key, "local-ip")) {
- tsk_strupdate(&p_bfcp->p_local_ip, param->value);
- }
- else if (tsk_striequals(param->key, "local-ipver")) {
- p_bfcp->b_use_ipv6 = tsk_striequals(param->value, "ipv6");
- }
- }
- else if (param->value_type == tmedia_pvt_pobject) {
- if (tsk_striequals(param->key, "natt-ctx")) {
- TSK_OBJECT_SAFE_FREE(p_bfcp->p_natt_ctx);
- p_bfcp->p_natt_ctx = tsk_object_ref(param->value);
- }
- }
- else if (param->value_type == tmedia_pvt_int32) {
- if (tsk_striequals(param->key, "stop-to-reconf")) {
- p_bfcp->b_stop_to_reconf = TSK_TO_INT32((uint8_t*)param->value) ? tsk_true : tsk_false;
- }
- }
-
-
- return ret;
+ int ret = 0;
+ tdav_session_bfcp_t* p_bfcp;
+
+ if (!p_self) {
+ TSK_DEBUG_ERROR("Invalid parameter");
+ return -1;
+ }
+
+ TSK_DEBUG_INFO("tdav_session_bfcp_set");
+
+ p_bfcp = (tdav_session_bfcp_t*)p_self;
+
+ if (param->value_type == tmedia_pvt_pchar) {
+ if (tsk_striequals(param->key, "remote-ip")) {
+ // only if no ip associated to the "m=" line
+ if (param->value && !p_bfcp->p_remote_ip) {
+ p_bfcp->p_remote_ip = tsk_strdup(param->value);
+ }
+ }
+ else if (tsk_striequals(param->key, "local-ip")) {
+ tsk_strupdate(&p_bfcp->p_local_ip, param->value);
+ }
+ else if (tsk_striequals(param->key, "local-ipver")) {
+ p_bfcp->b_use_ipv6 = tsk_striequals(param->value, "ipv6");
+ }
+ }
+ else if (param->value_type == tmedia_pvt_pobject) {
+ if (tsk_striequals(param->key, "natt-ctx")) {
+ TSK_OBJECT_SAFE_FREE(p_bfcp->p_natt_ctx);
+ p_bfcp->p_natt_ctx = tsk_object_ref(param->value);
+ }
+ }
+ else if (param->value_type == tmedia_pvt_int32) {
+ if (tsk_striequals(param->key, "stop-to-reconf")) {
+ p_bfcp->b_stop_to_reconf = TSK_TO_INT32((uint8_t*)param->value) ? tsk_true : tsk_false;
+ }
+ }
+
+
+ return ret;
}
static int _tdav_session_bfcp_get(tmedia_session_t* p_self, tmedia_param_t* param)
{
- int ret = 0;
- tdav_session_bfcp_t* p_bfcp;
+ int ret = 0;
+ tdav_session_bfcp_t* p_bfcp;
- if (!p_self) {
- TSK_DEBUG_ERROR("Invalid parameter");
- return -1;
- }
+ if (!p_self) {
+ TSK_DEBUG_ERROR("Invalid parameter");
+ return -1;
+ }
- TSK_DEBUG_INFO("_tdav_session_bfcp_get");
+ TSK_DEBUG_INFO("_tdav_session_bfcp_get");
- p_bfcp = (tdav_session_bfcp_t*)p_self;
+ p_bfcp = (tdav_session_bfcp_t*)p_self;
- return ret;
+ return ret;
}
static int _tdav_session_bfcp_prepare(tmedia_session_t* p_self)
{
- int ret = 0;
- tdav_session_bfcp_t* p_bfcp;
-
- if (!p_self) {
- TSK_DEBUG_ERROR("Invalid parameter");
- return -1;
- }
-
- TSK_DEBUG_INFO("_tdav_session_bfcp_prepare");
-
- p_bfcp = (tdav_session_bfcp_t*)p_self;
-
- if (!p_bfcp->p_bfcp_s) {
- enum tnet_socket_type_e e_socket_type = kBfcpTransportDefault;
- if ((ret = tbfcp_session_create(e_socket_type, p_bfcp->p_local_ip, &p_bfcp->p_bfcp_s))) {
- return ret;
- }
- }
- if ((ret = tbfcp_session_set_natt_ctx(p_bfcp->p_bfcp_s, p_bfcp->p_natt_ctx))) {
- return ret;
- }
- if ((ret = tbfcp_session_prepare(p_bfcp->p_bfcp_s))) {
- return ret;
- }
- if ((ret = tbfcp_session_set_callback(p_bfcp->p_bfcp_s, _tdav_session_bfcp_notif, p_bfcp))) {
- return ret;
- }
- TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_Hello);
- TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_FloorRequest);
- TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_FloorRelease);
- p_bfcp->b_revoked_handled = tsk_false;
-
- return ret;
+ int ret = 0;
+ tdav_session_bfcp_t* p_bfcp;
+
+ if (!p_self) {
+ TSK_DEBUG_ERROR("Invalid parameter");
+ return -1;
+ }
+
+ TSK_DEBUG_INFO("_tdav_session_bfcp_prepare");
+
+ p_bfcp = (tdav_session_bfcp_t*)p_self;
+
+ if (!p_bfcp->p_bfcp_s) {
+ enum tnet_socket_type_e e_socket_type = kBfcpTransportDefault;
+ if ((ret = tbfcp_session_create(e_socket_type, p_bfcp->p_local_ip, &p_bfcp->p_bfcp_s))) {
+ return ret;
+ }
+ }
+ if ((ret = tbfcp_session_set_natt_ctx(p_bfcp->p_bfcp_s, p_bfcp->p_natt_ctx))) {
+ return ret;
+ }
+ if ((ret = tbfcp_session_prepare(p_bfcp->p_bfcp_s))) {
+ return ret;
+ }
+ if ((ret = tbfcp_session_set_callback(p_bfcp->p_bfcp_s, _tdav_session_bfcp_notif, p_bfcp))) {
+ return ret;
+ }
+ TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_Hello);
+ TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_FloorRequest);
+ TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_FloorRelease);
+ p_bfcp->b_revoked_handled = tsk_false;
+
+ return ret;
}
static int _tdav_session_bfcp_start(tmedia_session_t* p_self)
{
- int ret = 0;
- tdav_session_bfcp_t* p_bfcp;
+ int ret = 0;
+ tdav_session_bfcp_t* p_bfcp;
- if (!p_self) {
- TSK_DEBUG_ERROR("Invalid parameter");
- return -1;
- }
+ if (!p_self) {
+ TSK_DEBUG_ERROR("Invalid parameter");
+ return -1;
+ }
- TSK_DEBUG_INFO("_tdav_session_bfcp_start");
+ TSK_DEBUG_INFO("_tdav_session_bfcp_start");
- p_bfcp = (tdav_session_bfcp_t*)p_self;
+ p_bfcp = (tdav_session_bfcp_t*)p_self;
- if ((ret = tbfcp_session_set_remote_address(p_bfcp->p_bfcp_s, p_bfcp->p_remote_ip, p_bfcp->u_remote_port))) {
- return ret;
- }
- if ((ret = tbfcp_session_start(p_bfcp->p_bfcp_s))) {
- return ret;
- }
- if ((ret = _tdav_session_bfcp_send_Hello(p_bfcp))) {
- return ret;
- }
+ if ((ret = tbfcp_session_set_remote_address(p_bfcp->p_bfcp_s, p_bfcp->p_remote_ip, p_bfcp->u_remote_port))) {
+ return ret;
+ }
+ if ((ret = tbfcp_session_start(p_bfcp->p_bfcp_s))) {
+ return ret;
+ }
+ if ((ret = _tdav_session_bfcp_send_Hello(p_bfcp))) {
+ return ret;
+ }
- p_bfcp->b_started = tsk_true;
+ p_bfcp->b_started = tsk_true;
- return ret;
+ return ret;
}
static int _tdav_session_bfcp_pause(tmedia_session_t* p_self)
{
- int ret = 0;
- tdav_session_bfcp_t* p_bfcp;
+ int ret = 0;
+ tdav_session_bfcp_t* p_bfcp;
- if (!p_self) {
- TSK_DEBUG_ERROR("Invalid parameter");
- return -1;
- }
+ if (!p_self) {
+ TSK_DEBUG_ERROR("Invalid parameter");
+ return -1;
+ }
- TSK_DEBUG_INFO("_tdav_session_bfcp_pause");
+ TSK_DEBUG_INFO("_tdav_session_bfcp_pause");
- p_bfcp = (tdav_session_bfcp_t*)p_self;
+ p_bfcp = (tdav_session_bfcp_t*)p_self;
- if (p_bfcp->p_bfcp_s && (ret = tbfcp_session_pause(p_bfcp->p_bfcp_s))) {
- return ret;
- }
+ if (p_bfcp->p_bfcp_s && (ret = tbfcp_session_pause(p_bfcp->p_bfcp_s))) {
+ return ret;
+ }
- return ret;
+ return ret;
}
static int _tdav_session_bfcp_stop(tmedia_session_t* p_self)
{
- int ret = 0;
- tdav_session_bfcp_t* p_bfcp;
-
- if (!p_self) {
- TSK_DEBUG_ERROR("Invalid parameter");
- return -1;
- }
-
- TSK_DEBUG_INFO("_tdav_session_bfcp_stop");
-
- p_bfcp = (tdav_session_bfcp_t*)p_self;
-
- if (!p_bfcp->b_stop_to_reconf) { // If stop-to-reconf then do not release the FloorRequest but reuse it
- if (p_bfcp->b_started) {
- /*if (p_bfcp->p_bfcp_s)*/ {
- /*if (!p_bfcp->p_pkt_FloorRelease) {
- ret = tbfcp_session_create_pkt_FloorRelease(p_bfcp->p_bfcp_s, &p_bfcp->p_pkt_FloorRelease);
- }
- if (ret == 0 && p_bfcp->p_pkt_FloorRelease && (ret = tbfcp_session_send_pkt(p_bfcp->p_bfcp_s, p_bfcp->p_pkt_FloorRelease))) {
- //!\ do not exit
- }*/
- }
- }
- tsk_strupdate(&p_bfcp->rfc4583.confid, "");
- }
-
- if (p_bfcp->p_bfcp_s) {
- ret = tbfcp_session_stop(p_bfcp->p_bfcp_s);
- }
-
- p_bfcp->b_started = tsk_false;
- p_bfcp->b_stop_to_reconf = tsk_false; // reset
-
- return ret;
+ int ret = 0;
+ tdav_session_bfcp_t* p_bfcp;
+
+ if (!p_self) {
+ TSK_DEBUG_ERROR("Invalid parameter");
+ return -1;
+ }
+
+ TSK_DEBUG_INFO("_tdav_session_bfcp_stop");
+
+ p_bfcp = (tdav_session_bfcp_t*)p_self;
+
+ if (!p_bfcp->b_stop_to_reconf) { // If stop-to-reconf then do not release the FloorRequest but reuse it
+ if (p_bfcp->b_started) {
+ /*if (p_bfcp->p_bfcp_s)*/ {
+ /*if (!p_bfcp->p_pkt_FloorRelease) {
+ ret = tbfcp_session_create_pkt_FloorRelease(p_bfcp->p_bfcp_s, &p_bfcp->p_pkt_FloorRelease);
+ }
+ if (ret == 0 && p_bfcp->p_pkt_FloorRelease && (ret = tbfcp_session_send_pkt(p_bfcp->p_bfcp_s, p_bfcp->p_pkt_FloorRelease))) {
+ //!\ do not exit
+ }*/
+ }
+ }
+ tsk_strupdate(&p_bfcp->rfc4583.confid, "");
+ }
+
+ if (p_bfcp->p_bfcp_s) {
+ ret = tbfcp_session_stop(p_bfcp->p_bfcp_s);
+ }
+
+ p_bfcp->b_started = tsk_false;
+ p_bfcp->b_stop_to_reconf = tsk_false; // reset
+
+ return ret;
}
static const tsdp_header_M_t* _tdav_session_bfcp_get_lo(tmedia_session_t* p_self)
{
- tdav_session_bfcp_t* p_bfcp;
- tsk_bool_t b_changed = tsk_false;
- const char *pc_local_ip, *pc_local_profile, *pc_local_role, *pc_local_setup;
- tnet_port_t u_local_port;
- enum tbfcp_role_e e_local_role;
- enum tbfcp_setup_e e_local_setup;
- int ret;
-
- TSK_DEBUG_INFO("_tdav_session_bfcp_get_lo");
-
- if (!p_self || !p_self->plugin) {
- TSK_DEBUG_ERROR("Invalid parameter");
- return tsk_null;
- }
-
- p_bfcp = (tdav_session_bfcp_t*)p_self;
-
- b_changed = (p_self->ro_changed || !p_self->M.lo);
-
- if (!b_changed) {
- TSK_DEBUG_INFO("No changes to the BFCP session...skip SDP update");
- return p_self->M.lo;
- }
-
- if (b_changed && p_self->M.lo) {
- static const char* __fields[] = { "floorctrl", "setup", "connection", "curr", "des", "conf" };
- // remove media-level attributes
- tsdp_header_A_removeAll_by_fields(p_self->M.lo->Attributes, __fields, sizeof(__fields)/sizeof(__fields[0]));
- // Codec list never change and FMTs always a single star (*) value. Radvision TelePresence System reject a BFCP session whithout the single FMT (*)
- // The Codecs and formats are never rebuilt which means we must not clear them
+ tdav_session_bfcp_t* p_bfcp;
+ tsk_bool_t b_changed = tsk_false;
+ const char *pc_local_ip, *pc_local_profile, *pc_local_role, *pc_local_setup;
+ tnet_port_t u_local_port;
+ enum tbfcp_role_e e_local_role;
+ enum tbfcp_setup_e e_local_setup;
+ int ret;
+
+ TSK_DEBUG_INFO("_tdav_session_bfcp_get_lo");
+
+ if (!p_self || !p_self->plugin) {
+ TSK_DEBUG_ERROR("Invalid parameter");
+ return tsk_null;
+ }
+
+ p_bfcp = (tdav_session_bfcp_t*)p_self;
+
+ b_changed = (p_self->ro_changed || !p_self->M.lo);
+
+ if (!b_changed) {
+ TSK_DEBUG_INFO("No changes to the BFCP session...skip SDP update");
+ return p_self->M.lo;
+ }
+
+ if (b_changed && p_self->M.lo) {
+ static const char* __fields[] = { "floorctrl", "setup", "connection", "curr", "des", "conf" };
+ // remove media-level attributes
+ tsdp_header_A_removeAll_by_fields(p_self->M.lo->Attributes, __fields, sizeof(__fields)/sizeof(__fields[0]));
+ // Codec list never change and FMTs always a single star (*) value. Radvision TelePresence System reject a BFCP session whithout the single FMT (*)
+ // The Codecs and formats are never rebuilt which means we must not clear them
#if 0
- tsk_list_clear_items(p_self->M.lo->FMTs);
+ tsk_list_clear_items(p_self->M.lo->FMTs);
#endif
- }
-
- // get local address
- if ((ret = tbfcp_session_get_local_address(p_bfcp->p_bfcp_s, &pc_local_ip, &u_local_port))) {
- TSK_DEBUG_ERROR("Failed to get local address from BFCP session");
- return tsk_null;
- }
- // get local profile
- if ((ret = tbfcp_session_get_profile(p_bfcp->p_bfcp_s, &pc_local_profile))) {
- TSK_DEBUG_ERROR("Failed to get local profile from BFCP session");
- return tsk_null;
- }
- // get local role
- if ((ret = tbfcp_session_get_local_role(p_bfcp->p_bfcp_s, &e_local_role))) {
- TSK_DEBUG_ERROR("Failed to get local role from BFCP session");
- return tsk_null;
- }
- if ((ret = tbfcp_utils_get_role(e_local_role, &pc_local_role))) {
- return tsk_null;
- }
- // get local setup
- if ((ret = tbfcp_session_get_local_setup(p_bfcp->p_bfcp_s, &e_local_setup))) {
- TSK_DEBUG_ERROR("Failed to get local setup from BFCP session");
- return tsk_null;
- }
- if ((ret = tbfcp_utils_get_setup(e_local_role, &pc_local_setup))) {
- return tsk_null;
- }
-
- if (!p_self->M.lo){
- if (!(p_self->M.lo = tsdp_header_M_create(p_self->plugin->media, u_local_port, pc_local_profile))) {
- TSK_DEBUG_ERROR("Failed to create BFCP SDP media header");
- return tsk_null;
- }
- tsdp_header_M_add_headers(p_self->M.lo,
- TSDP_FMT_VA_ARGS("*"),
- TSDP_HEADER_A_VA_ARGS("connection", "new"),
- TSDP_HEADER_A_VA_ARGS("lib", "tinyBFCP"),
- tsk_null);
- // If NATT is active, do not rely on the global IP address Connection line
- if (p_bfcp->p_natt_ctx) {
- tsdp_header_M_add_headers(p_self->M.lo,
- TSDP_HEADER_C_VA_ARGS("IN", p_bfcp->b_use_ipv6 ? "IP6" : "IP4", pc_local_ip),
- tsk_null);
- }
- }
- else {
- p_self->M.lo->port = u_local_port;
- tsk_strupdate(&p_self->M.lo->proto, pc_local_profile);
- }
-
- // add "floorctrl" and "setup" attributes
- tsdp_header_M_add_headers(p_self->M.lo,
- TSDP_HEADER_A_VA_ARGS("connection", "new"),
- TSDP_HEADER_A_VA_ARGS("floorctrl", pc_local_role),
- TSDP_HEADER_A_VA_ARGS("setup", pc_local_setup),
- tsk_null);
-
- return p_self->M.lo;
+ }
+
+ // get local address
+ if ((ret = tbfcp_session_get_local_address(p_bfcp->p_bfcp_s, &pc_local_ip, &u_local_port))) {
+ TSK_DEBUG_ERROR("Failed to get local address from BFCP session");
+ return tsk_null;
+ }
+ // get local profile
+ if ((ret = tbfcp_session_get_profile(p_bfcp->p_bfcp_s, &pc_local_profile))) {
+ TSK_DEBUG_ERROR("Failed to get local profile from BFCP session");
+ return tsk_null;
+ }
+ // get local role
+ if ((ret = tbfcp_session_get_local_role(p_bfcp->p_bfcp_s, &e_local_role))) {
+ TSK_DEBUG_ERROR("Failed to get local role from BFCP session");
+ return tsk_null;
+ }
+ if ((ret = tbfcp_utils_get_role(e_local_role, &pc_local_role))) {
+ return tsk_null;
+ }
+ // get local setup
+ if ((ret = tbfcp_session_get_local_setup(p_bfcp->p_bfcp_s, &e_local_setup))) {
+ TSK_DEBUG_ERROR("Failed to get local setup from BFCP session");
+ return tsk_null;
+ }
+ if ((ret = tbfcp_utils_get_setup(e_local_role, &pc_local_setup))) {
+ return tsk_null;
+ }
+
+ if (!p_self->M.lo) {
+ if (!(p_self->M.lo = tsdp_header_M_create(p_self->plugin->media, u_local_port, pc_local_profile))) {
+ TSK_DEBUG_ERROR("Failed to create BFCP SDP media header");
+ return tsk_null;
+ }
+ tsdp_header_M_add_headers(p_self->M.lo,
+ TSDP_FMT_VA_ARGS("*"),
+ TSDP_HEADER_A_VA_ARGS("connection", "new"),
+ TSDP_HEADER_A_VA_ARGS("lib", "tinyBFCP"),
+ tsk_null);
+ // If NATT is active, do not rely on the global IP address Connection line
+ if (p_bfcp->p_natt_ctx) {
+ tsdp_header_M_add_headers(p_self->M.lo,
+ TSDP_HEADER_C_VA_ARGS("IN", p_bfcp->b_use_ipv6 ? "IP6" : "IP4", pc_local_ip),
+ tsk_null);
+ }
+ }
+ else {
+ p_self->M.lo->port = u_local_port;
+ tsk_strupdate(&p_self->M.lo->proto, pc_local_profile);
+ }
+
+ // add "floorctrl" and "setup" attributes
+ tsdp_header_M_add_headers(p_self->M.lo,
+ TSDP_HEADER_A_VA_ARGS("connection", "new"),
+ TSDP_HEADER_A_VA_ARGS("floorctrl", pc_local_role),
+ TSDP_HEADER_A_VA_ARGS("setup", pc_local_setup),
+ tsk_null);
+
+ return p_self->M.lo;
}
static int _tdav_session_bfcp_set_ro(tmedia_session_t* p_self, const tsdp_header_M_t* m)
{
- int ret = 0;
- const tsdp_header_A_t* A;
- tdav_session_bfcp_t* p_bfcp;
- enum tbfcp_role_e e_remote_role = tbfcp_role_c_s;
- uint32_t u_remote_conf_id = 0xFFFF;
- uint16_t u_remote_user_id = 0xFFFF, u_remote_floor_id = 0xFFFF;
-
- if (!p_self || !m) {
- TSK_DEBUG_ERROR("Invalid parameter");
- return -1;
- }
-
- TSK_DEBUG_INFO("_tdav_session_bfcp_set_ro");
-
- p_bfcp = (tdav_session_bfcp_t*)p_self;
-
- /* update remote offer */
- TSK_OBJECT_SAFE_FREE(p_self->M.ro);
- p_self->M.ro = tsk_object_ref(TSK_OBJECT(m));
-
-
- // https://tools.ietf.org/html/rfc4583
- {
- p_bfcp->b_conf_idf_changed = tsk_false;
- if ((A = tsdp_header_M_findA(m, "floorctrl"))) {
- if ((ret = tbfcp_utils_parse_role(A->value, &e_remote_role))) {
- return ret;
- }
- }
- if ((A = tsdp_header_M_findA(m, "confid"))) {
- p_bfcp->b_conf_idf_changed |= !tsk_striequals(p_bfcp->rfc4583.confid, A->value);
- tsk_strupdate(&p_bfcp->rfc4583.confid, A->value);
- u_remote_conf_id = (uint32_t)tsk_atoi64(p_bfcp->rfc4583.confid);
- }
- if ((A = tsdp_header_M_findA(m, "userid"))) {
- p_bfcp->b_conf_idf_changed |= !tsk_striequals(p_bfcp->rfc4583.userid, A->value);
- tsk_strupdate(&p_bfcp->rfc4583.userid, A->value);
- u_remote_user_id = (uint16_t)tsk_atoi64(p_bfcp->rfc4583.userid);
- }
- if ((A = tsdp_header_M_findA(m, "floorid"))) {
- char tmp_str[256];
- if (sscanf(A->value, "%255s %*s", tmp_str) != EOF) {
- char *pch, *saveptr;
- p_bfcp->b_conf_idf_changed |= !tsk_striequals(p_bfcp->rfc4583.floorid, tmp_str);
- tsk_strupdate(&p_bfcp->rfc4583.floorid, tmp_str);
- u_remote_floor_id = (uint16_t)tsk_atoi64(p_bfcp->rfc4583.floorid);
- pch = tsk_strtok_r(&A->value[tsk_strlen(tmp_str) + 1], " ", &saveptr);
- while (pch) {
- if (sscanf(pch, "mstrm: %255s", tmp_str) != EOF) {
- p_bfcp->b_conf_idf_changed |= !tsk_striequals(p_bfcp->rfc4583.mstrm, tmp_str);
- tsk_strupdate(&p_bfcp->rfc4583.mstrm, tmp_str);
- break;
- }
- pch = tsk_strtok_r(tsk_null, " ", &saveptr);
- }
- }
- }
- // set remote role
- if ((ret = tbfcp_session_set_remote_role(p_bfcp->p_bfcp_s, e_remote_role))) {
- return ret;
- }
- if ((e_remote_role & tbfcp_role_s_only)) {
- // local = client
- if ((ret = tbfcp_session_set_conf_ids(p_bfcp->p_bfcp_s, u_remote_conf_id, u_remote_user_id, u_remote_floor_id))) {
- return ret;
- }
- }
- else {
- // local = remote: Not supported yet and will never happen
- }
- }//end-of-rfc4583
-
- /* get connection associated to this media line
- * If the connnection is global, then the manager will call tdav_session_audio_set() */
- if (m->C && m->C->addr) {
- tsk_strupdate(&p_bfcp->p_remote_ip, m->C->addr);
- p_bfcp->b_use_ipv6 = tsk_striequals(m->C->addrtype, "IP6");
- }
- /* set remote port */
- p_bfcp->u_remote_port = m->port;
-
- return ret;
+ int ret = 0;
+ const tsdp_header_A_t* A;
+ tdav_session_bfcp_t* p_bfcp;
+ enum tbfcp_role_e e_remote_role = tbfcp_role_c_s;
+ uint32_t u_remote_conf_id = 0xFFFF;
+ uint16_t u_remote_user_id = 0xFFFF, u_remote_floor_id = 0xFFFF;
+
+ if (!p_self || !m) {
+ TSK_DEBUG_ERROR("Invalid parameter");
+ return -1;
+ }
+
+ TSK_DEBUG_INFO("_tdav_session_bfcp_set_ro");
+
+ p_bfcp = (tdav_session_bfcp_t*)p_self;
+
+ /* update remote offer */
+ TSK_OBJECT_SAFE_FREE(p_self->M.ro);
+ p_self->M.ro = tsk_object_ref(TSK_OBJECT(m));
+
+
+ // https://tools.ietf.org/html/rfc4583
+ {
+ p_bfcp->b_conf_idf_changed = tsk_false;
+ if ((A = tsdp_header_M_findA(m, "floorctrl"))) {
+ if ((ret = tbfcp_utils_parse_role(A->value, &e_remote_role))) {
+ return ret;
+ }
+ }
+ if ((A = tsdp_header_M_findA(m, "confid"))) {
+ p_bfcp->b_conf_idf_changed |= !tsk_striequals(p_bfcp->rfc4583.confid, A->value);
+ tsk_strupdate(&p_bfcp->rfc4583.confid, A->value);
+ u_remote_conf_id = (uint32_t)tsk_atoi64(p_bfcp->rfc4583.confid);
+ }
+ if ((A = tsdp_header_M_findA(m, "userid"))) {
+ p_bfcp->b_conf_idf_changed |= !tsk_striequals(p_bfcp->rfc4583.userid, A->value);
+ tsk_strupdate(&p_bfcp->rfc4583.userid, A->value);
+ u_remote_user_id = (uint16_t)tsk_atoi64(p_bfcp->rfc4583.userid);
+ }
+ if ((A = tsdp_header_M_findA(m, "floorid"))) {
+ char tmp_str[256];
+ if (sscanf(A->value, "%255s %*s", tmp_str) != EOF) {
+ char *pch, *saveptr;
+ p_bfcp->b_conf_idf_changed |= !tsk_striequals(p_bfcp->rfc4583.floorid, tmp_str);
+ tsk_strupdate(&p_bfcp->rfc4583.floorid, tmp_str);
+ u_remote_floor_id = (uint16_t)tsk_atoi64(p_bfcp->rfc4583.floorid);
+ pch = tsk_strtok_r(&A->value[tsk_strlen(tmp_str) + 1], " ", &saveptr);
+ while (pch) {
+ if (sscanf(pch, "mstrm: %255s", tmp_str) != EOF) {
+ p_bfcp->b_conf_idf_changed |= !tsk_striequals(p_bfcp->rfc4583.mstrm, tmp_str);
+ tsk_strupdate(&p_bfcp->rfc4583.mstrm, tmp_str);
+ break;
+ }
+ pch = tsk_strtok_r(tsk_null, " ", &saveptr);
+ }
+ }
+ }
+ // set remote role
+ if ((ret = tbfcp_session_set_remote_role(p_bfcp->p_bfcp_s, e_remote_role))) {
+ return ret;
+ }
+ if ((e_remote_role & tbfcp_role_s_only)) {
+ // local = client
+ if ((ret = tbfcp_session_set_conf_ids(p_bfcp->p_bfcp_s, u_remote_conf_id, u_remote_user_id, u_remote_floor_id))) {
+ return ret;
+ }
+ }
+ else {
+ // local = remote: Not supported yet and will never happen
+ }
+ }//end-of-rfc4583
+
+ /* get connection associated to this media line
+ * If the connnection is global, then the manager will call tdav_session_audio_set() */
+ if (m->C && m->C->addr) {
+ tsk_strupdate(&p_bfcp->p_remote_ip, m->C->addr);
+ p_bfcp->b_use_ipv6 = tsk_striequals(m->C->addrtype, "IP6");
+ }
+ /* set remote port */
+ p_bfcp->u_remote_port = m->port;
+
+ return ret;
}
static int _tdav_session_bfcp_send_Hello(tdav_session_bfcp_t* p_bfcp)
{
- int ret = 0;
- if (!p_bfcp) {
- TSK_DEBUG_ERROR("Invalid parameter");
- return -1;
- }
-
- if (!p_bfcp->p_pkt_Hello && (ret = tbfcp_session_create_pkt_Hello(p_bfcp->p_bfcp_s, &p_bfcp->p_pkt_Hello))) {
- return ret;
- }
- if ((ret = tbfcp_session_send_pkt(p_bfcp->p_bfcp_s, p_bfcp->p_pkt_Hello))) {
- return ret;
- }
- return ret;
+ int ret = 0;
+ if (!p_bfcp) {
+ TSK_DEBUG_ERROR("Invalid parameter");
+ return -1;
+ }
+
+ if (!p_bfcp->p_pkt_Hello && (ret = tbfcp_session_create_pkt_Hello(p_bfcp->p_bfcp_s, &p_bfcp->p_pkt_Hello))) {
+ return ret;
+ }
+ if ((ret = tbfcp_session_send_pkt(p_bfcp->p_bfcp_s, p_bfcp->p_pkt_Hello))) {
+ return ret;
+ }
+ return ret;
}
static int _tdav_session_bfcp_notif(const struct tbfcp_session_event_xs *e)
{
- tdav_session_bfcp_t* p_bfcp = tsk_object_ref(TSK_OBJECT(e->pc_usr_data));
- int ret = 0;
- static const char* kErrTextGlobalError = "Global error";
- static const int kErrCodeGlobalError = -56;
- static const char* kErrTextTimeout = "Timeout";
- static const int kErrCodeTimeout = -57;
- static const char* kErrTextUnExpectedIncomingMsg = "Unexpected incoming BFCP message";
- static const int kErrCodeUnExpectedIncomingMsg = -58;
- static const char* kErrTextBadRequest = "Bad Request";
- static const int kErrCodeBadRequest = -59;
- static const char* kInfoTextFloorReqStatus = "FloorRequestStatus";
+ tdav_session_bfcp_t* p_bfcp = tsk_object_ref(TSK_OBJECT(e->pc_usr_data));
+ int ret = 0;
+ static const char* kErrTextGlobalError = "Global error";
+ static const int kErrCodeGlobalError = -56;
+ static const char* kErrTextTimeout = "Timeout";
+ static const int kErrCodeTimeout = -57;
+ static const char* kErrTextUnExpectedIncomingMsg = "Unexpected incoming BFCP message";
+ static const int kErrCodeUnExpectedIncomingMsg = -58;
+ static const char* kErrTextBadRequest = "Bad Request";
+ static const int kErrCodeBadRequest = -59;
+ static const char* kInfoTextFloorReqStatus = "FloorRequestStatus";
#define _RAISE_ERR_AND_GOTO_BAIL(_code, _reason) \
if (TMEDIA_SESSION(p_bfcp)->bfcp_cb.fun) { \
@@ -491,162 +490,160 @@ static int _tdav_session_bfcp_notif(const struct tbfcp_session_event_xs *e)
e.type = tmedia_session_bfcp_evt_type_flreq_status; e.flreq.status = _status; e.reason = _reason; \
TMEDIA_SESSION(p_bfcp)->bfcp_cb.fun(TMEDIA_SESSION(p_bfcp)->bfcp_cb.usrdata, TMEDIA_SESSION(p_bfcp), &e); \
} \
-
- switch (e->e_type) {
- case tbfcp_session_event_type_inf_inc_msg:
- {
- if (p_bfcp->p_pkt_Hello && p_bfcp->p_pkt_Hello->hdr.transac_id == e->pc_pkt->hdr.transac_id && p_bfcp->p_pkt_Hello->hdr.user_id == e->pc_pkt->hdr.user_id && p_bfcp->p_pkt_Hello->hdr.conf_id == e->pc_pkt->hdr.conf_id) {
- TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_Hello);
- if (e->pc_pkt->hdr.primitive == tbfcp_primitive_HelloAck) {
- if (!p_bfcp->p_pkt_FloorRequest) {
- if (p_bfcp->b_conf_idf_changed || 0) {
- // Create the "FloorRelease" for this "FloorRequest"
- TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_FloorRelease);
- if ((ret = tbfcp_session_create_pkt_FloorRelease(p_bfcp->p_bfcp_s, &p_bfcp->p_pkt_FloorRelease))) {
- goto raise_err;
- }
- if ((ret = tbfcp_session_create_pkt_FloorRequest(p_bfcp->p_bfcp_s, &p_bfcp->p_pkt_FloorRequest))) {
- goto raise_err;
- }
- if ((ret = tbfcp_session_send_pkt(p_bfcp->p_bfcp_s, p_bfcp->p_pkt_FloorRequest))) {
- goto raise_err;
- }
- }
- else {
- TSK_DEBUG_INFO("No change to BFCP session... do not send FloorRequest");
- }
- }
- }
- else {
- TSK_DEBUG_ERROR("%s", kErrTextUnExpectedIncomingMsg);
- _RAISE_ERR_AND_GOTO_BAIL(kErrCodeUnExpectedIncomingMsg, kErrTextUnExpectedIncomingMsg);
- }
- }
- else if(p_bfcp->p_pkt_FloorRequest /*&& p_bfcp->p_pkt_FloorRequest->hdr.transac_id == e->pc_pkt->hdr.transac_id*/ && p_bfcp->p_pkt_FloorRequest->hdr.user_id == e->pc_pkt->hdr.user_id && p_bfcp->p_pkt_FloorRequest->hdr.conf_id == e->pc_pkt->hdr.conf_id) {
- tsk_bool_t transac_id_matched = (p_bfcp->p_pkt_FloorRequest->hdr.transac_id == e->pc_pkt->hdr.transac_id);
- if (e->pc_pkt->hdr.primitive == tbfcp_primitive_FloorRequestStatus || e->pc_pkt->hdr.primitive == tbfcp_primitive_FloorStatus) {
- tsk_size_t u_index0, u_index1, u_index2, u_index3;
- const tbfcp_attr_grouped_t *pc_attr_FloorRequestInformation = tsk_null,
- *pc_attr_FloorRequestStatus = tsk_null,
- *pc_attr_OverallRequestStatus = tsk_null;
- const tbfcp_attr_octetstring16_t *pc_attr_RequestStatus = tsk_null;
-
- u_index0 = 0;
- // Find "FloorRequestInformation"
- while ((ret = tbfcp_pkt_attr_find_at(e->pc_pkt, tbfcp_attribute_format_Grouped, u_index0++, (const tbfcp_attr_t **)&pc_attr_FloorRequestInformation)) == 0 && pc_attr_FloorRequestInformation) {
- if (TBFCP_ATTR(pc_attr_FloorRequestInformation)->hdr.type != tbfcp_attribute_type_FLOOR_REQUEST_INFORMATION) {
- continue;
- }
- // Find "FloorRequestStatus"
- u_index1 = 0;
- while ((ret = tbfcp_attr_grouped_find_at(pc_attr_FloorRequestInformation, tbfcp_attribute_format_Grouped, u_index1++, (const tbfcp_attr_t **)&pc_attr_FloorRequestStatus)) == 0 && pc_attr_FloorRequestStatus) {
- if (TBFCP_ATTR(pc_attr_FloorRequestStatus)->hdr.type != tbfcp_attribute_type_FLOOR_REQUEST_STATUS) {
- continue;
- }
- if (pc_attr_FloorRequestStatus->extra_hdr.FloorID != atoi(p_bfcp->rfc4583.floorid)) {
- continue;
- }
- break;
- }
- if (!pc_attr_FloorRequestStatus) {
- continue;
- }
- // Find "OverallRequestStatus"
- u_index2 = 0;
- while ((ret = tbfcp_attr_grouped_find_at(pc_attr_FloorRequestInformation, tbfcp_attribute_format_Grouped, u_index2++, (const tbfcp_attr_t **)&pc_attr_OverallRequestStatus)) == 0 && pc_attr_OverallRequestStatus) {
- if (TBFCP_ATTR(pc_attr_OverallRequestStatus)->hdr.type != tbfcp_attribute_type_OVERALL_REQUEST_STATUS) {
- continue;
- }
-
- // Find "RequestStatus"
- u_index3 = 0;
- while ((ret = tbfcp_attr_grouped_find_at(pc_attr_OverallRequestStatus, tbfcp_attribute_format_OctetString16, u_index3++, (const tbfcp_attr_t **)&pc_attr_RequestStatus)) == 0 && pc_attr_RequestStatus) {
- if (TBFCP_ATTR(pc_attr_RequestStatus)->hdr.type != tbfcp_attribute_type_REQUEST_STATUS) {
- continue;
- }
- break;
- }
- }
- if (pc_attr_RequestStatus) {
- break;
- }
- }
-
- if (pc_attr_RequestStatus) {
- // https://tools.ietf.org/html/rfc4582#section-5.2.5
- uint16_t u_status = pc_attr_RequestStatus->OctetString16[0] + (pc_attr_RequestStatus->OctetString16[1] << 8);
- if (transac_id_matched) {
- if (u_status == tbfcp_reqstatus_Revoked && !p_bfcp->b_revoked_handled) { // revoked
- TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_FloorRequest); // free the FloorRequest and ask new one once HelloAck is received
- // Radvision sends a Revoke after a reINVITE to ask for new negotiation.
- if (p_bfcp->p_pkt_FloorRelease) {
- if ((ret = tbfcp_session_send_pkt(p_bfcp->p_bfcp_s, p_bfcp->p_pkt_FloorRelease))) {
- goto raise_err;
- }
- }
- if ((ret = _tdav_session_bfcp_send_Hello(p_bfcp))) {
- goto raise_err;
- }
- p_bfcp->b_revoked_handled = tsk_true;
- }
- else {
- _RAISE_FLREQ(u_status, kInfoTextFloorReqStatus);
- }
- }
- else { //!transac_id_matched
- // Status from old FloorRequest
- tbfcp_pkt_t* p_pkt = tsk_null;
- TSK_DEBUG_INFO("Status from old Request");
- if (u_status == tbfcp_reqstatus_Pending || u_status == tbfcp_reqstatus_Accepted || u_status == tbfcp_reqstatus_Granted) {
- if ((ret = tbfcp_pkt_create_FloorRelease_2(e->pc_pkt->hdr.conf_id, e->pc_pkt->hdr.transac_id, e->pc_pkt->hdr.user_id, pc_attr_FloorRequestStatus->extra_hdr.FloorID, &p_pkt))) {
- goto raise_err;
- }
- ret = tbfcp_session_send_pkt(p_bfcp->p_bfcp_s, p_pkt);
- TSK_OBJECT_SAFE_FREE(p_pkt);
- if (ret) {
- goto raise_err;
- }
- }
- }
- }
- else {
- /* /!\ No RequestStatus attribute in FloorRequestStatus */
- TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_FloorRequest);
- TSK_DEBUG_ERROR("%s", kErrTextBadRequest);
- _RAISE_ERR_AND_GOTO_BAIL(kErrCodeBadRequest, kErrTextBadRequest);
- }
- }
- else {
- switch (e->pc_pkt->hdr.primitive) {
- case tbfcp_primitive_Hello: break; // already handled in "_tbfcp_session_process_incoming_pkt()"
- default:
- {
- TSK_DEBUG_ERROR("%s", kErrTextUnExpectedIncomingMsg);
- _RAISE_ERR_AND_GOTO_BAIL(kErrCodeUnExpectedIncomingMsg, kErrTextUnExpectedIncomingMsg);
- break;
- }
- }
- }
- }
- break;
- }
- case tbfcp_session_event_type_err_send_timedout:
- {
- /* /!\ Sending BFCP message timedout */
- TSK_DEBUG_ERROR("%s", kErrTextTimeout);
- _RAISE_ERR_AND_GOTO_BAIL(kErrCodeTimeout, kErrTextTimeout);
- break;
- }
- }
+
+ switch (e->e_type) {
+ case tbfcp_session_event_type_inf_inc_msg: {
+ if (p_bfcp->p_pkt_Hello && p_bfcp->p_pkt_Hello->hdr.transac_id == e->pc_pkt->hdr.transac_id && p_bfcp->p_pkt_Hello->hdr.user_id == e->pc_pkt->hdr.user_id && p_bfcp->p_pkt_Hello->hdr.conf_id == e->pc_pkt->hdr.conf_id) {
+ TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_Hello);
+ if (e->pc_pkt->hdr.primitive == tbfcp_primitive_HelloAck) {
+ if (!p_bfcp->p_pkt_FloorRequest) {
+ if (p_bfcp->b_conf_idf_changed || 0) {
+ // Create the "FloorRelease" for this "FloorRequest"
+ TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_FloorRelease);
+ if ((ret = tbfcp_session_create_pkt_FloorRelease(p_bfcp->p_bfcp_s, &p_bfcp->p_pkt_FloorRelease))) {
+ goto raise_err;
+ }
+ if ((ret = tbfcp_session_create_pkt_FloorRequest(p_bfcp->p_bfcp_s, &p_bfcp->p_pkt_FloorRequest))) {
+ goto raise_err;
+ }
+ if ((ret = tbfcp_session_send_pkt(p_bfcp->p_bfcp_s, p_bfcp->p_pkt_FloorRequest))) {
+ goto raise_err;
+ }
+ }
+ else {
+ TSK_DEBUG_INFO("No change to BFCP session... do not send FloorRequest");
+ }
+ }
+ }
+ else {
+ TSK_DEBUG_ERROR("%s", kErrTextUnExpectedIncomingMsg);
+ _RAISE_ERR_AND_GOTO_BAIL(kErrCodeUnExpectedIncomingMsg, kErrTextUnExpectedIncomingMsg);
+ }
+ }
+ else if(p_bfcp->p_pkt_FloorRequest /*&& p_bfcp->p_pkt_FloorRequest->hdr.transac_id == e->pc_pkt->hdr.transac_id*/ && p_bfcp->p_pkt_FloorRequest->hdr.user_id == e->pc_pkt->hdr.user_id && p_bfcp->p_pkt_FloorRequest->hdr.conf_id == e->pc_pkt->hdr.conf_id) {
+ tsk_bool_t transac_id_matched = (p_bfcp->p_pkt_FloorRequest->hdr.transac_id == e->pc_pkt->hdr.transac_id);
+ if (e->pc_pkt->hdr.primitive == tbfcp_primitive_FloorRequestStatus || e->pc_pkt->hdr.primitive == tbfcp_primitive_FloorStatus) {
+ tsk_size_t u_index0, u_index1, u_index2, u_index3;
+ const tbfcp_attr_grouped_t *pc_attr_FloorRequestInformation = tsk_null,
+ *pc_attr_FloorRequestStatus = tsk_null,
+ *pc_attr_OverallRequestStatus = tsk_null;
+ const tbfcp_attr_octetstring16_t *pc_attr_RequestStatus = tsk_null;
+
+ u_index0 = 0;
+ // Find "FloorRequestInformation"
+ while ((ret = tbfcp_pkt_attr_find_at(e->pc_pkt, tbfcp_attribute_format_Grouped, u_index0++, (const tbfcp_attr_t **)&pc_attr_FloorRequestInformation)) == 0 && pc_attr_FloorRequestInformation) {
+ if (TBFCP_ATTR(pc_attr_FloorRequestInformation)->hdr.type != tbfcp_attribute_type_FLOOR_REQUEST_INFORMATION) {
+ continue;
+ }
+ // Find "FloorRequestStatus"
+ u_index1 = 0;
+ while ((ret = tbfcp_attr_grouped_find_at(pc_attr_FloorRequestInformation, tbfcp_attribute_format_Grouped, u_index1++, (const tbfcp_attr_t **)&pc_attr_FloorRequestStatus)) == 0 && pc_attr_FloorRequestStatus) {
+ if (TBFCP_ATTR(pc_attr_FloorRequestStatus)->hdr.type != tbfcp_attribute_type_FLOOR_REQUEST_STATUS) {
+ continue;
+ }
+ if (pc_attr_FloorRequestStatus->extra_hdr.FloorID != atoi(p_bfcp->rfc4583.floorid)) {
+ continue;
+ }
+ break;
+ }
+ if (!pc_attr_FloorRequestStatus) {
+ continue;
+ }
+ // Find "OverallRequestStatus"
+ u_index2 = 0;
+ while ((ret = tbfcp_attr_grouped_find_at(pc_attr_FloorRequestInformation, tbfcp_attribute_format_Grouped, u_index2++, (const tbfcp_attr_t **)&pc_attr_OverallRequestStatus)) == 0 && pc_attr_OverallRequestStatus) {
+ if (TBFCP_ATTR(pc_attr_OverallRequestStatus)->hdr.type != tbfcp_attribute_type_OVERALL_REQUEST_STATUS) {
+ continue;
+ }
+
+ // Find "RequestStatus"
+ u_index3 = 0;
+ while ((ret = tbfcp_attr_grouped_find_at(pc_attr_OverallRequestStatus, tbfcp_attribute_format_OctetString16, u_index3++, (const tbfcp_attr_t **)&pc_attr_RequestStatus)) == 0 && pc_attr_RequestStatus) {
+ if (TBFCP_ATTR(pc_attr_RequestStatus)->hdr.type != tbfcp_attribute_type_REQUEST_STATUS) {
+ continue;
+ }
+ break;
+ }
+ }
+ if (pc_attr_RequestStatus) {
+ break;
+ }
+ }
+
+ if (pc_attr_RequestStatus) {
+ // https://tools.ietf.org/html/rfc4582#section-5.2.5
+ uint16_t u_status = pc_attr_RequestStatus->OctetString16[0] + (pc_attr_RequestStatus->OctetString16[1] << 8);
+ if (transac_id_matched) {
+ if (u_status == tbfcp_reqstatus_Revoked && !p_bfcp->b_revoked_handled) { // revoked
+ TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_FloorRequest); // free the FloorRequest and ask new one once HelloAck is received
+ // Radvision sends a Revoke after a reINVITE to ask for new negotiation.
+ if (p_bfcp->p_pkt_FloorRelease) {
+ if ((ret = tbfcp_session_send_pkt(p_bfcp->p_bfcp_s, p_bfcp->p_pkt_FloorRelease))) {
+ goto raise_err;
+ }
+ }
+ if ((ret = _tdav_session_bfcp_send_Hello(p_bfcp))) {
+ goto raise_err;
+ }
+ p_bfcp->b_revoked_handled = tsk_true;
+ }
+ else {
+ _RAISE_FLREQ(u_status, kInfoTextFloorReqStatus);
+ }
+ }
+ else { //!transac_id_matched
+ // Status from old FloorRequest
+ tbfcp_pkt_t* p_pkt = tsk_null;
+ TSK_DEBUG_INFO("Status from old Request");
+ if (u_status == tbfcp_reqstatus_Pending || u_status == tbfcp_reqstatus_Accepted || u_status == tbfcp_reqstatus_Granted) {
+ if ((ret = tbfcp_pkt_create_FloorRelease_2(e->pc_pkt->hdr.conf_id, e->pc_pkt->hdr.transac_id, e->pc_pkt->hdr.user_id, pc_attr_FloorRequestStatus->extra_hdr.FloorID, &p_pkt))) {
+ goto raise_err;
+ }
+ ret = tbfcp_session_send_pkt(p_bfcp->p_bfcp_s, p_pkt);
+ TSK_OBJECT_SAFE_FREE(p_pkt);
+ if (ret) {
+ goto raise_err;
+ }
+ }
+ }
+ }
+ else {
+ /* /!\ No RequestStatus attribute in FloorRequestStatus */
+ TSK_OBJECT_SAFE_FREE(p_bfcp->p_pkt_FloorRequest);
+ TSK_DEBUG_ERROR("%s", kErrTextBadRequest);
+ _RAISE_ERR_AND_GOTO_BAIL(kErrCodeBadRequest, kErrTextBadRequest);
+ }
+ }
+ else {
+ switch (e->pc_pkt->hdr.primitive) {
+ case tbfcp_primitive_Hello:
+ break; // already handled in "_tbfcp_session_process_incoming_pkt()"
+ default: {
+ TSK_DEBUG_ERROR("%s", kErrTextUnExpectedIncomingMsg);
+ _RAISE_ERR_AND_GOTO_BAIL(kErrCodeUnExpectedIncomingMsg, kErrTextUnExpectedIncomingMsg);
+ break;
+ }
+ }
+ }
+ }
+ break;
+ }
+ case tbfcp_session_event_type_err_send_timedout: {
+ /* /!\ Sending BFCP message timedout */
+ TSK_DEBUG_ERROR("%s", kErrTextTimeout);
+ _RAISE_ERR_AND_GOTO_BAIL(kErrCodeTimeout, kErrTextTimeout);
+ break;
+ }
+ }
raise_err:
- if (ret) {
- TSK_DEBUG_ERROR("%s", kErrTextGlobalError);
- _RAISE_ERR_AND_GOTO_BAIL(kErrCodeGlobalError, kErrTextGlobalError);
- }
+ if (ret) {
+ TSK_DEBUG_ERROR("%s", kErrTextGlobalError);
+ _RAISE_ERR_AND_GOTO_BAIL(kErrCodeGlobalError, kErrTextGlobalError);
+ }
bail:
- TSK_OBJECT_SAFE_FREE(p_bfcp);
- return ret;
+ TSK_OBJECT_SAFE_FREE(p_bfcp);
+ return ret;
}
@@ -662,79 +659,77 @@ bail:
/* constructor */
static tsk_object_t* _tdav_session_bfcp_ctor(tsk_object_t * p_self, va_list * app)
{
- tdav_session_bfcp_t *p_session = (tdav_session_bfcp_t *)p_self;
- if (p_session) {
- /* init base: called by tmedia_session_create() */
- /* init self */
- // TMEDIA_SESSION_BFCP(session)->send_file = tdav_session_bfcp_send_file;
- // TMEDIA_SESSION_BFCP(session)->send_message = tdav_session_bfcp_send_message;
-
- // session->config = tbfcp_config_create();
- // session->setup = bfcp_setup_actpass;
- // session->dir = tdav_bfcp_dir_none;
- }
- return p_self;
+ tdav_session_bfcp_t *p_session = (tdav_session_bfcp_t *)p_self;
+ if (p_session) {
+ /* init base: called by tmedia_session_create() */
+ /* init self */
+ // TMEDIA_SESSION_BFCP(session)->send_file = tdav_session_bfcp_send_file;
+ // TMEDIA_SESSION_BFCP(session)->send_message = tdav_session_bfcp_send_message;
+
+ // session->config = tbfcp_config_create();
+ // session->setup = bfcp_setup_actpass;
+ // session->dir = tdav_bfcp_dir_none;
+ }
+ return p_self;
}
/* destructor */
static tsk_object_t* _tdav_session_bfcp_dtor(tsk_object_t * p_self)
-{
- tdav_session_bfcp_t *p_session = (tdav_session_bfcp_t *)p_self;
- if (p_session) {
- /* deinit self */
-
- TSK_OBJECT_SAFE_FREE(p_session->p_bfcp_s);
- TSK_OBJECT_SAFE_FREE(p_session->p_pkt_FloorRequest);
- TSK_OBJECT_SAFE_FREE(p_session->p_pkt_FloorRelease);
- TSK_OBJECT_SAFE_FREE(p_session->p_pkt_Hello);
-
- TSK_FREE(p_session->p_local_ip);
- TSK_FREE(p_session->p_remote_ip);
-
- /* rfc4583 */
- TSK_FREE(p_session->rfc4583.confid);
- TSK_FREE(p_session->rfc4583.floorid);
- TSK_FREE(p_session->rfc4583.mstrm);
- TSK_FREE(p_session->rfc4583.userid);
-
- /* NAT Traversal context */
- TSK_OBJECT_SAFE_FREE(p_session->p_natt_ctx);
-
- /* deinit base */
- tmedia_session_deinit(p_self);
-
- TSK_DEBUG_INFO("*** tdav_session_bfcp_t destroyed ***");
- }
-
- return p_self;
+{
+ tdav_session_bfcp_t *p_session = (tdav_session_bfcp_t *)p_self;
+ if (p_session) {
+ /* deinit self */
+
+ TSK_OBJECT_SAFE_FREE(p_session->p_bfcp_s);
+ TSK_OBJECT_SAFE_FREE(p_session->p_pkt_FloorRequest);
+ TSK_OBJECT_SAFE_FREE(p_session->p_pkt_FloorRelease);
+ TSK_OBJECT_SAFE_FREE(p_session->p_pkt_Hello);
+
+ TSK_FREE(p_session->p_local_ip);
+ TSK_FREE(p_session->p_remote_ip);
+
+ /* rfc4583 */
+ TSK_FREE(p_session->rfc4583.confid);
+ TSK_FREE(p_session->rfc4583.floorid);
+ TSK_FREE(p_session->rfc4583.mstrm);
+ TSK_FREE(p_session->rfc4583.userid);
+
+ /* NAT Traversal context */
+ TSK_OBJECT_SAFE_FREE(p_session->p_natt_ctx);
+
+ /* deinit base */
+ tmedia_session_deinit(p_self);
+
+ TSK_DEBUG_INFO("*** tdav_session_bfcp_t destroyed ***");
+ }
+
+ return p_self;
}
/* object definition */
-static const tsk_object_def_t tdav_session_bfcp_def_s =
-{
- sizeof(tdav_session_bfcp_t),
- _tdav_session_bfcp_ctor,
- _tdav_session_bfcp_dtor,
- tmedia_session_cmp,
+static const tsk_object_def_t tdav_session_bfcp_def_s = {
+ sizeof(tdav_session_bfcp_t),
+ _tdav_session_bfcp_ctor,
+ _tdav_session_bfcp_dtor,
+ tmedia_session_cmp,
};
/* plugin definition*/
-static const tmedia_session_plugin_def_t tdav_session_bfcp_plugin_def_s =
-{
- &tdav_session_bfcp_def_s,
-
- tmedia_bfcp,
- "application",
-
- _tdav_session_bfcp_set,
- _tdav_session_bfcp_get,
- _tdav_session_bfcp_prepare,
- _tdav_session_bfcp_start,
- _tdav_session_bfcp_pause,
- _tdav_session_bfcp_stop,
-
- /* Audio part */
- { tsk_null },
-
- _tdav_session_bfcp_get_lo,
- _tdav_session_bfcp_set_ro
+static const tmedia_session_plugin_def_t tdav_session_bfcp_plugin_def_s = {
+ &tdav_session_bfcp_def_s,
+
+ tmedia_bfcp,
+ "application",
+
+ _tdav_session_bfcp_set,
+ _tdav_session_bfcp_get,
+ _tdav_session_bfcp_prepare,
+ _tdav_session_bfcp_start,
+ _tdav_session_bfcp_pause,
+ _tdav_session_bfcp_stop,
+
+ /* Audio part */
+ { tsk_null },
+
+ _tdav_session_bfcp_get_lo,
+ _tdav_session_bfcp_set_ro
};
const tmedia_session_plugin_def_t *tdav_session_bfcp_plugin_def_t = &tdav_session_bfcp_plugin_def_s;
OpenPOWER on IntegriCloud