diff options
author | Benny Prijono <bennylp@teluu.com> | 2010-06-24 12:33:18 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2010-06-24 12:33:18 +0000 |
commit | 6bcce59a3e476310963c78b6ce1f3efa6d7ea510 (patch) | |
tree | f9f9193ac9603562e79acc75631debc4d31c33a4 | |
parent | 70d7dcc89eba4bfa7dedd9a187bb2bb15e07ba5a (diff) |
Fixed #1081: Implement ICE option tag (RFC 5678)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3222 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjsip/include/pjsip-ua/sip_inv.h | 12 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 12 | ||||
-rw-r--r-- | pjsip/src/pjsip-ua/sip_inv.c | 12 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_acc.c | 16 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_call.c | 2 |
5 files changed, 52 insertions, 2 deletions
diff --git a/pjsip/include/pjsip-ua/sip_inv.h b/pjsip/include/pjsip-ua/sip_inv.h index a2281e47..122a148a 100644 --- a/pjsip/include/pjsip-ua/sip_inv.h +++ b/pjsip/include/pjsip-ua/sip_inv.h @@ -295,6 +295,16 @@ enum pjsip_inv_option */ PJSIP_INV_SUPPORT_UPDATE = 4, + /** + * Indicate support for ICE + */ + PJSIP_INV_SUPPORT_ICE = 8, + + /** + * Require ICE support. + */ + PJSIP_INV_REQUIRE_ICE = 16, + /** * Require reliable provisional response extension. */ @@ -309,7 +319,7 @@ enum pjsip_inv_option * Session timer extension will always be used even when peer doesn't * support/want session timer. */ - PJSIP_INV_ALWAYS_USE_TIMER = 128, + PJSIP_INV_ALWAYS_USE_TIMER = 128 }; diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index 36a11489..add306b9 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -306,6 +306,18 @@ typedef struct pjsua_msg_data pjsua_msg_data; #endif /** + * Controls whether PJSUA-LIB should add ICE media feature tag + * parameter (the ";+sip.ice" parameter) to Contact header if ICE + * is enabled in the config. + * + * Default: 1 + */ +#ifndef PJSUA_ADD_ICE_TAGS +# define PJSUA_ADD_ICE_TAGS 1 +#endif + + +/** * Logging configuration, which can be (optionally) specified when calling * #pjsua_init(). Application must call #pjsua_logging_config_default() to * initialize this structure with the default values. diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c index dab68d4c..b522b3bd 100644 --- a/pjsip/src/pjsip-ua/sip_inv.c +++ b/pjsip/src/pjsip-ua/sip_inv.c @@ -777,6 +777,8 @@ PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, *options |= PJSIP_INV_SUPPORT_100REL; if (*options & PJSIP_INV_REQUIRE_TIMER) *options |= PJSIP_INV_SUPPORT_TIMER; + if (*options & PJSIP_INV_REQUIRE_ICE) + *options |= PJSIP_INV_SUPPORT_ICE; /* Get the message in rdata */ msg = rdata->msg_info.msg; @@ -948,12 +950,15 @@ PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, unsigned i; const pj_str_t STR_100REL = { "100rel", 6}; const pj_str_t STR_TIMER = { "timer", 5}; + const pj_str_t STR_ICE = { "ice", 3 }; for (i=0; i<sup_hdr->count; ++i) { if (pj_stricmp(&sup_hdr->values[i], &STR_100REL)==0) rem_option |= PJSIP_INV_SUPPORT_100REL; - if (pj_stricmp(&sup_hdr->values[i], &STR_TIMER)==0) + else if (pj_stricmp(&sup_hdr->values[i], &STR_TIMER)==0) rem_option |= PJSIP_INV_SUPPORT_TIMER; + else if (pj_stricmp(&sup_hdr->values[i], &STR_ICE)==0) + rem_option |= PJSIP_INV_SUPPORT_ICE; } } @@ -965,6 +970,7 @@ PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, const pj_str_t STR_100REL = { "100rel", 6}; const pj_str_t STR_REPLACES = { "replaces", 8 }; const pj_str_t STR_TIMER = { "timer", 5 }; + const pj_str_t STR_ICE = { "ice", 3 }; unsigned unsupp_cnt = 0; pj_str_t unsupp_tags[PJSIP_GENERIC_ARRAY_MAX_COUNT]; @@ -986,6 +992,10 @@ PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, NULL, &STR_REPLACES); if (!supp) unsupp_tags[unsupp_cnt++] = req_hdr->values[i]; + } else if ((*options & PJSIP_INV_SUPPORT_ICE) && + pj_stricmp(&req_hdr->values[i], &STR_ICE)==0) + { + rem_option |= PJSIP_INV_REQUIRE_ICE; } else if (!pjsip_endpt_has_capability(endpt, PJSIP_H_SUPPORTED, NULL, &req_hdr->values[i])) diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index 9bd3020b..62c2451a 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -237,6 +237,22 @@ static pj_status_t initialize_acc(unsigned acc_id) acc->cred[acc->cred_cnt++] = pjsua_var.ua_cfg.cred_info[i]; } + /* If ICE is enabled, add "+sip.ice" media feature tag in account's + * contact params. + */ +#if PJSUA_ADD_ICE_TAGS + if (pjsua_var.media_cfg.enable_ice) { + unsigned new_len; + pj_str_t new_prm; + + new_len = acc_cfg->contact_params.slen + 10; + new_prm.ptr = (char*)pj_pool_alloc(acc->pool, new_len); + pj_strcpy(&new_prm, &acc_cfg->contact_params); + pj_strcat2(&new_prm, ";+sip.ice"); + acc_cfg->contact_params = new_prm; + } +#endif + status = pjsua_pres_init_acc(acc_id); if (status != PJ_SUCCESS) return status; diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index 8cd8ce56..7fce1e44 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -840,6 +840,8 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata) options |= PJSIP_INV_REQUIRE_100REL; if (pjsua_var.acc[acc_id].cfg.require_timer) options |= PJSIP_INV_REQUIRE_TIMER; + if (pjsua_var.media_cfg.enable_ice) + options |= PJSIP_INV_SUPPORT_ICE; status = pjsip_inv_verify_request2(rdata, &options, offer, answer, NULL, pjsua_var.endpt, &response); |